The world's law in one git history. Every word traced to the law that wrote it for any country and any date.
An expansion of the same for the US Code, #1 on Hacker News (28/10/26). Semantic, searchable law on a global scale.
us-code-tools-film-v3.mp4
Free to use: CC0. Fork it, build on it, ship it in a product: no permission or credit needed. The law text sits in each country's repository, under that repository's own terms.
Each jurisdiction's law is its own repository, lexifina/<country>-law, where every commit is one law taking effect,
written by that law. This repository holds them all as submodules, arranged by jurisdiction, and moves each one forward
to its latest commit. The tools read the In-force date of every commit, so they give the law of any country on any
date.
global-law/
├── manifest.json every corpus: path, repository, coverage and dates
├── jurisdiction.json the world, and the jurisdictions in it
├── germany/bund/acts/ a country's law (submodule)
├── brazil/bahia/acts/ a state's
├── brazil/bahia/salvador/acts/ a city's
└── …
git clone --depth 1 https://github.com/lexifina/global-law && cd global-law
python3 tools/countries.py add united-states/federal/usc # one corpus; every country is several GB
python3 tools/law.py show 2022-05-01 united-states/federal/usc/title-11/1182.mdOn Windows, type py or python where these say python3.
--depth 1 downloads the index without its whole history, a fraction of the size. The tools never read that
history, so they work the same. To have it without its file contents, clone with --filter=blob:none instead. For
every country, add --recurse-submodules. Don't clone a country's repository with --depth: its dates are read from
its whole history, and countries.py add fetches all of it.
tools/mcp_server.py is a Model Context Protocol server with 18 read-only tools: find a provision, read it on a date,
who wrote each word, compare dates, a provision's history, search the text and the changes, and check a case or a
brief against the law in force. It needs only Python 3.9+ and git, runs on your machine and makes no network calls.
The clone carries the setup for Claude Code, Cursor, VS Code and Codex, so the server starts when you open the folder. For another client:
{ "mcpServers": { "global-law": { "command": "git", "args": ["-C", "/path/to/global-law", "-c", "alias.global-law-mcp=!sh tools/mcp.sh", "global-law-mcp"] } } }Then ask, for example, "What did 11 U.S.C. §1182(1) say on 1 May 2022, and which law last changed it?" MCP.md has every tool and the details.
python tools/law.py world 2022-05-01 every corpus on that day
python tools/law.py show 2022-05-01 <path> a provision on a date
python tools/law.py blame 2022-07-01 <path> the law behind each line
python tools/law.py words 2022-07-01 <path> the law behind each word
python tools/law.py diff 2022-05-01 2022-07-01 <path> what changed between two dates
python tools/law.py laws 1990-01-01 1990-12-31 germany the laws that took effect
Dates are YYYY-MM-DD. The first read of a corpus indexes its history once and keeps the index in
.git/global-law-cache.
- A corpus moved to a new folder still answers under its old path (
data/moved-paths.tsv). After a pull that moves corpora, rungit submodule syncandgit submodule update --init. manifest.jsonand thejurisdiction.jsonfiles are written bytools/describe.py.
Court decisions sit beside the law in <country>/<court>/caselaw, one file and one commit per published decision,
dated the day it was decided. manifest.json gives each corpus's court, coverage and gaps; where a source's licence
asks for credit, the tools show it as a Credit: line.
A decision is a ruling, not a law (Kind: court), so the tools leave case law out of everything about law (laws,
searches, change lists) unless you name it. Each corpus also files, under the law's own paths, the decisions that cite
each article, with the version of the law in force on the day decided.
python tools/countries.py add netherlands/caselaw a country's case law (not added with the country)
python tools/law.py laws 2024-01-01 2024-01-31 netherlands/caselaw decisions given in a window
python tools/law.py caselaw-index after a pull: index the case law checked out
From an assistant, check_precedent lists the decisions that applied a provision and says whether the text each one
applied is still in force, and what_else_changes counts them. find_provision and law_details take a court's own
references (an ECLI, a docket or case number, a reporter citation), and resolve_citations reads citations of law in
each country's usual form (Art. 336 OR, § 823 Abs. 1 BGB, article 1240 du code civil).
- FEATURES.md: every feature, and what every corpus here must support (
git blame,law.py, the MCP tools) - FAQ.md: questions and answers · CONTRIBUTING.md: proposing changes · MCP.md: the MCP server · REPRODUCE.md: how it was built · CHANGELOG.md
- FRESHNESS.md: how current each corpus is · MONITORING.md: whether updates are running · WATCHING.md: how each official source is watched for changes
- performance/: how fast the tools are, measured
- visualisations/: charts and bridges across the world's law
- Vulnerabilities: Mistakes in legislation as published
- Tests:
python -m unittest discover -s tests
global-law-film-3-showcase-v3-readme.mp4
global-law-film-2-country-readers-v2-readme.mp4
This repository is CC0. The law text is in each country's repository, under that repository's own terms.