Molao — Sotho and Tswana for law

The law,
held in common.

A free, decentralized commons of case law — for any jurisdiction. No accounts, no billing, no hosted service. Universities, firms and individuals run nodes. Nobody bills anybody.

One binary, one SQLite file, works fully offline. Judgments are identified by the hash of their text, and releases are signed by a quorum of independent organisations — not published by any single party, including this project.

Honest status · 0.1.0 — decentralisation-ready, not decentralisation-running

The trust model is real, built and tested today: hash-identified judgments, threshold-signed releases, a citation graph verifiable by recomputation, and a node that runs standalone and fully offline. Court and law-report registries are loadable region profiles: ZA ships populated, GENERIC works anywhere, and adding a jurisdiction means writing a TOML file, not changing code.

There is no bundled corpus and no live peer-to-peer network yet. A node starts empty; molao demo seeds a synthetic corpus so you can see the software work, and releases still move as plain files today. Three crates are landing this session to close that: molao-ingest (a robots-respecting, collectively-witnessed corpus), molao-dist (content-addressed releases over iroh, torrent export and HTTP mirror), and molao-index (a local, rebuildable, unsigned search cache). None has run against real data yet. Treatment attestations remain designed, not built. Semantic search over a release is deliberately excludedhere is why — a local rebuildable cache is a different thing and does not reopen that question.

A commons, not a product

There is nothing to sign up for and nothing to buy. There is no hosted Molao service, so there is nothing to be a customer of, and the release mechanism means this project could not take control of the corpus even if it later wanted to.

⚖️

Free, forever

No accounts, no telemetry, no licence check, no subscription tiers, no "free for individuals" asterisk. A node makes no outbound requests of its own.

🏛️

Hosted by institutions

Law faculties, law societies, legal-aid organisations and individuals run nodes. This is what the LII network — AustLII, CanLII, SAFLII, the AfricanLII members — has done for decades under the Free Access to Law Movement.

📴

Offline by default

A node with a corpus on disk needs no peers, no relay and no internet. Pull the plug and it keeps serving the law. This is a hard guarantee, not a degraded mode.

Regions are data, not code

Molao is jurisdiction-neutral. No country is hardcoded. Court codes, court names, hierarchy tiers, authority weights and law-report series ship as region profiles — data a node picks, never an assumption baked into the parser.

One grammar, many jurisdictions

The free-access-to-law world already converged on one citation convention: [2020] UKSC 1 (BAILII), [2020] HCA 1 (AustLII), [2020] NZSC 1 (NZLII), [1995] ZACC 3 (SAFLII).

Year, court code, number. Same grammar, different codes — which is exactly why the codes belong in data and the grammar belongs in code.

Generic on day one, ZA first

A generic profile parses neutral citations anywhere before a dedicated profile exists, flagging every court code as unknown rather than dropping it. South Africa is the first fully-populated profile, never a special case.

Adding a jurisdiction means supplying a profile — court registry, tiers, weights, report series — and touching no core logic. Infrastructure any LII, law faculty or bar can stand up for its own corpus.

Verifiable by recomputation

Nothing enters a release that cannot be rebuilt and compared. That single rule decides most of the architecture — including what is left out.

Judgment ids are hashes

A judgment's id is the BLAKE3 hash of its canonical text. Alter a paragraph and the id no longer matches, which is what makes a judgment received from an untrusted peer safe to keep.

Canonicalisation is aggressive on purpose: judgments arrive as RTF, PDF and HTML, and every converter disagrees about whitespace. Without it, two honest nodes would compute different ids and the network would silently fork.

The citation graph can be rebuilt

Citations are extracted by a pinned, versioned, deterministic extractor. Any node can re-run that exact version over the same corpus and must get a byte-identical graph.

So a graph can be contributed by anyone and checked by everyone, with no trust in the contributor at all.

Embeddings are excluded from releases

Float inference is not reproducible across hardware, so a contributed vector index could never be verified — only trusted.

And a poisoned index is worse than a poisoned document: a tampered judgment fails its hash check immediately, while a tampered index leaves every judgment byte-perfect and simply never returns the case that would have lost you the argument. The text stays correct while retrieval quietly steers.

That doesn't rule out semantic search — a node may build its own local index and share it as an unsigned, rebuildable cache, never inside a release. The corpus stays the only signed truth. molao-index is landing this session.

Provenance is plural

Contributed documents are corroborated by k-of-n independent re-fetch: witnesses fetch from the canonical source and sign the bytes they saw. One person's upload is not evidence.

Every judgment shows its class — Corroborated, Single source, or Manually entered — because lawyers already reason in reported versus unreported terms and will not accept a system that flattens the distinction.

No single publisher — including us

"No central server" is achievable, and Molao achieves it. "No central authority" is not, and saying otherwise would be dishonest.

Somebody has to attest that a particular hash is the real judgment. Content addressing proves bytes have not changed; it cannot prove the bytes were ever the judgment in the first place.

So the trust root is a quorum plus a public append-only log, not one operator. A release is valid only when at least threshold distinct independent organisations have signed its manifest, and threshold < 2 is refused in code — a threshold of 1 is a single point of authority wearing a quorum's clothes.

Releases chain by hash, so a fork is detectable against any known head. What this buys is that capturing the corpus means capturing several institutions across several jurisdictions and going undetected, rather than compromising one server. That is a large improvement, and it is not the same thing as trustlessness.

RoleDoes whatOngoing effort
MirrorHolds a release and serves it. Reading the law.Nearly none. Fetch new releases.
WitnessFetches judgments from canonical sources and signs the bytes it saw.Low. Key custody, and noticing if it stops.
BuilderAssembles a release: canonicalises, extracts, computes roots.Per release. Requires no trust — anyone can rebuild and compare.
AttestorHolds a key in the signer set and signs manifests.Per release, plus judgement — and a willingness to refuse.

The citator is the real prize

A corpus that does not know case A was overruled by case B will hand a lawyer dead authority.

Mechanical edges — built

Who cited whom, from which paragraph, pointing at which pinpoint. Deterministic, verifiable, and rebuildable by anyone.

Unresolved citations are shown as written, never hidden. A citator that quietly drops what it cannot resolve tells a lawyer the case cites less than it does.

Designed, not built Treatment

Whether a case was followed, distinguished or overruled is interpretation. It cannot be verified by recomputation, so it will be modelled as signed attestations that may conflict — showing the disagreement rather than resolving it.

Two scholars can read the same judgments and differ. A system that picks a winner and hides the argument is lying about how law works. Until this lands, check currency yourself.

Where the corpus comes from

Judgments are public documents and are not copyrightable. That settles the judgments. It does not settle everything.

Courts and gazettes, directly

The court that handed down the judgment is the canonical source, in any jurisdiction. Going direct means the provenance record points where it should. Where a court only self-publishes, the way in is a polite, identified crawl — a named agent, robots.txt honoured without exception, a fetch rate like a careful clerk, not a data hoover.

Licensed bulk, where it exists

In Africa that is Laws.Africa / AfricanLII: machine-readable Akoma Ntoso under CC-BY-NC-SA, with a commercial licence available. Elsewhere, the national LII or the courts’ own publisher. An agreed relationship, not a workaround.

SAFLII is not a scrape target

Where an LII declines bulk supply, that settles it. SAFLII made South African case law publicly accessible for two decades, largely unfunded, and says plainly that it is not a bulk re-supplier — so Molao treats it as a citation-resolution target, somewhere to send a reader. A bulk SAFLII scraper will not be accepted into the repository.

None of this depends on trusting whoever submits a document. The corpus is built collectively: independent witnesses fetch from these sources and sign the raw bytes they saw, and a document is corroborated only once k-of-n independent witnesses agree. One person's upload is never evidence on its own.

Status: the sourcing rules are settled policy. The software that enacts them — a robots-respecting crawler, a licensed-bulk importer, and the witness-signing daemon — is molao-ingest, being written this session. It has not ingested a real document yet.

Content-addressed, so the transport doesn't have to be trusted

A release is a content-addressed file set plus a signed manifest. What it is doesn't depend on how it travels — so it can travel over anything, including a channel nobody has a reason to trust.

iroh — primary transport

Direct node-to-node, content-addressed by design: asking a peer for a release is just asking for known hashes, which is the vocabulary Molao already speaks.

Torrent export — archival

A release exported as a .torrent plus its files, so libraries and universities can seed it with tools they already run. The corpus can outlive this project whether or not the software does.

Plain HTTP mirror — fallback

The simplest option, and the only one moving real bytes today: a directory of content-addressed files on any static host.

None of these transports has to be trusted, because verification isn't asking where the bytes came from — it's recomputing hashes from what actually arrived and checking a quorum's signatures over the manifest naming them. A torrent seeder or a stray iroh peer can waste your time by refusing to serve; it cannot make your node accept altered content.

Content addressing does not, on its own, catch split view — a transport showing two peers two different valid releases. That is what release chaining and a public append-only log are for, and the log is still designed, not built.

Status: the model is settled. iroh and the torrent export are landing this session as molao-dist. Neither has carried a real release yet, because there is no public release yet — today a release is still a directory of files on a plain host, mirrored by hand. Full story.

Run it

Rust 1.85+ and Node 20+. SQLite is bundled, so there is no database to install and no connection string to configure.

git clone https://github.com/vul-os/molao
cd molao

cargo build --workspace
cargo test --workspace

npm ci
npm run build

cargo run -p molao-node

What you get, honestly

A working node: serve, ingest, demo, verify and stats, with full-text search, a citation graph and a web UI in one binary. Run cargo run -p molao-node -- --help to see what your clone offers.

A node starts empty. There is no bundled corpus and no public signed release yet. molao demo seeds a synthetic corpus so search, judgments, citations and the graph have something to show.

The hard parts, stated plainly

A project that only lists its wins is marketing. These are the limits.

  • A quorum can still collude. If k of n signers agree to publish something false, every check passes. The defence is institutional independence and jurisdictional spread — not cryptography.
  • Federations decay when the person running the node leaves. Every distributed academic network has watched nodes go dark because a postgraduate graduated. Hence a zero-maintenance single binary with nothing to rotate, and network health exposed publicly.
  • Molao attests to what the source served, not to what the court meant. If a court publishes the wrong file, witnesses will faithfully corroborate the wrong file.
  • The node verifies bytes and signatures — never legal correctness. Nothing here will ever be presented as "verified law".
  • Reader privacy has a limit. A node's operator can see what its users search for. Molao makes no anonymity claim. If your research is sensitive, run your own node — it is free and works offline.
  • Decentralisation-ready, not decentralisation-running. The trust model — hashes, quorums, a recomputable graph — is built and tested. Peer-to-peer distribution (molao-dist: iroh plus a torrent export) is landing this session, but there is no public corpus yet for it to carry, and releases are still plain files mirrored by hand. P2P will never be required to read the law — a node with a corpus on disk needs no peers at all.