
Every change, dated.
The corpus grows in the open. New data, new sources, methodology, API and app releases — logged in reverse chronological order. The notes are written by hand; the ship log beneath them is read straight from git on every deploy, so it cannot quietly fall behind.
Release notes
26 notesWritten by hand, so they cover the releases worth a paragraph — not every change. The newest note is dated 2026-08-06; 156 commits have shipped since. The complete record is the ship log below.
- APPchangelog
This page stopped being written from memory
Measured on the live site: the newest note here was dated 2026-08-03 while 55 commits had shipped since — a page headed "every change, dated" that had quietly skipped three days of releases. The release log below is now generated from git history on every build, so no one has to remember to write it. These notes stay hand-written, and the page now says out loud how far behind them the log has run.
- APIsemantic
Semantic search answers again — over part of the corpus
Meaning-based retrieval had been dead since the vector index was dropped. It is back on an IVFFlat index over 634k embedded dossiers, and a query that took 42 seconds now returns in about 1.5. That is a partial layer, not the whole corpus, so /developers and the machine catalogue now say "partial coverage" rather than claiming the feature covers everything.
- SOURCEScorrections
Three claims we could not defend came off the site
The homepage led with a jurisdiction figure it could not support and credited HM Land Registry as a source we do not hold; it now leads with the 170 countries that carry real coverage. A dossier stopped shouting "directly sanctioned" when only a cluster sibling was designated, and cites each ownership hop instead.
- APPperf
The Supabase SDK left the critical path
221 KB of client SDK was welded into the entry chunk and downloaded on every route, including pages that never talk to the database. It is now loaded only where it is used.
- APPbrand
A real labyrinth, and a serpent that threads it
The hero mark is now a generated maze with a snake that actually solves it, on the logo, the SnitchScore badge and the homepage. It shipped twice before it rendered on production — a lazy-loaded component wedged hydration and the first two builds served an empty frame.
- DATAidentifiers
UK and Polish company-number lookups resolved to nothing
Searching by a Companies House number or a KRS number returned no match, every time, for both people and agents. The identifier resolvers were querying a shape the corpus never stored.
- DATA171.2M
Countries and jurisdiction codes are now two different numbers
The homepage said "342+ jurisdictions, worldwide coverage". Measured: the corpus carries 246 ISO-3166-1 country codes — of ~249 assigned — plus 93 subdivisions. Those 93 include every US state, Canadian provinces and UAE emirates, which are real incorporation jurisdictions, but also the USSR and Yugoslavia. Delaware belongs in a jurisdiction count; the USSR does not belong under "worldwide coverage". Headline stats now read countries; the code total stays available as the technical figure.
- SOURCESlicences
Corrected four licence statements, including one on the trust page
We described OpenSanctions as open and commercial to redistribute. It is CC-BY-NC 4.0 and we hold no commercial redistribution licence — our own source-of-truth file said so plainly while the marketing pages said the opposite. OpenOwnership was listed as CC0 and UK-only; it is ODbL share-alike and global. We also claimed to gate restricted data behind its licence, and no such gate exists in the code. All four now say what we can defend.
- DATAsitemap
The pages that carry ownership data were hidden from search
A sample of entities holding an ownership edge found 96.5% of them excluded from the sitemap, while millions of name-and-jurisdiction stubs were advertised in their place. The scoring pass only ever demoted; nothing promoted an entity that had gained an edge. It now walks the relationship graph in both directions and promotes what it finds — measured at 97% promotion rate on the first 57,000 scanned.
- APPsearch
A failed search now says so instead of reporting no results
When the corpus read failed, the API returned HTTP 200 with an empty hit list — indistinguishable from "this company is not in our records". A real outage read as a confident negative, to people and to the agents that consume the same endpoint. It now returns a transient error when nothing else can answer, and marks the result partial when the live registry carried the request alone.
- DATA97.7M
Corpus re-baselined to 97.7M entities
20.6M ownership and control links across 29 fused sources. The published figures had drifted ~11M behind the live graph; every count is re-derived from one live snapshot again — including the agent-facing surfaces (llms.txt, ai-plugin.json), which are synced by the same pass so a human page and a machine page can never disagree.
- APPpulse
Pulse rebuilt around what the feed actually carries
Two registries publish movements today — GLEIF (ownership and control) and Companies House (UK accounts). The feed now offers exactly those views instead of filters that would return an empty screen, folds the duplicated parent/ultimate-parent rows into one, and says plainly which movement types are wired but not yet publishing.
- DATA59.6M
Corpus re-baselined to 59.6M entities
18.74M ownership and control links across 27 fused sources. Every count on the site derives from one live snapshot, so the honesty figures never drift.
- APPhubs
Source & jurisdiction directories
New /sources and /jurisdictions hubs document every fused registry, leak and sanctions list — licence and coverage on each — and cross-link into every entity dossier.
- APImcp v0.7.0
Semantic search over the corpus
The MCP server gains meaning-based retrieval — semantic_search and find_similar over BGE-M3 dossier embeddings — alongside the lexical tools. Eighteen tools in all.
- APPv0.1.3
Biometric sign-in & refreshed apps
Desktop, mobile and MCP builds refreshed to v0.1.3; device biometric (passkey) sign-in in beta; cross-browser magic-link sign-in fixed.
- DATA58.6M
Corpus grown to 58.6M entities
Fresh registry loads lift the graph to 58.6M entities and 18.74M ownership links across 26 fused sources. Every count on the site derives from one live snapshot, so the honesty figures never drift.
- APPIA
Rebuilt footer, nav and workspace
The footer is now four grouped columns with every page and policy reachable; Directory and Pricing joined the primary nav; the dashboard is a personal workspace (account, credits, watched movements) rather than a second search page.
- APPv0.1.2
Desktop & mobile apps, with auto-update
Signed Electron desktop build ships with background auto-update on Windows and Linux; a Capacitor mobile shell now runs alongside the web app.
- DATA54.2M
Corpus re-baselined to 54.2M entities
18.74M ownership links across 26 fused registries. Every count on the site now derives from one snapshot, so the honesty figures never drift.
- SOURCESOFAC · OFSI
Sanctioned-asset owner-linking
Sanctioned vessels, aircraft and crypto wallets from OFAC and UK OFSI now bridge to their beneficial owners, so a designation surfaces the network behind it.
- APPpricing v2
Pay-per-report dossiers — €39 / €99
Buy a single resolved dossier without a subscription. A free preview sits above the fold; the frosted-glass paywall gates only the assembled depth.
- APImcp v0.5.0
MCP server v0.5 — agent-native corpus
Twelve consistent tools for search, ownership traversal and cited dossiers, callable from any MCP client and published on npm.
- DATAchb-fin
Companies House financials
Turnover, profit, net assets, cash and headcount parsed from UK iXBRL accounts and shown as year-on-year figures on company dossiers.
- APPpoxi
POXI engineering-paper rebrand
A charcoal-and-green editorial design system: hard corners, mono section labels, and a plate for every claim with its source on the frame.
- METHODOLOGYresolve
Cross-source resolution, three passes
An identifier join, name-and-jurisdiction blocking, and a sanctions name-bridge collapse the same entity across registries into a single cluster.
Ship log
665 commitsRead from git log at build time, not typed by hand. Every line is a commit that reached main, and main deploys to production on push. Subjects are printed as they were written. Work belonging to other brands, and anything naming a credential, is left out.
5dbcf55featradio.pl podcast official-site discovery (creator miner)29bcdaffixthrottle DDG discovery (sleep on failure, 2 workers) to avoid IP banff28edffeatadd creator contact miners (podcasts, linktree, DDG domains)47d7815—Harden Resend import idempotency and close NIW/OPP repair9ca457ffixpreserve contact evidence in delta source URLe3d13abfixreject creator contact extraction artifactsfcbeb77fixalign recovered contacts with delta provenance0af295e—Harden Resend repair execution gates3f65f45featadd official club and creator recovery auditc55bc06—Add official media and Resend audit tooling
1bfdf6afixpricing: kafle 'Coverage math' porownuja darmowe z platnym, nie dwa razy ten sam produktb98228cfeatpricing: wdrozenie cennika v3 z 24.08 — jedno dossier 29 EUR, Pro 99, Scale 4994d423befixmenu: panel na desktopie przestaje byc ciezki — kompaktowy pasek zamiast trzech pelnoszerokosciowych bandf2addfafeatnav: /ask wchodzi do nawigacji zalogowanego — po domknieciu sufitu wydatku8fe351bfixmenu: panel poziomo na cala szerokosc, plasko, bez kratownicy — uklad z Claude Design88ad8ffchoredesign-sync: konfiguracja + zapis DLACZEGO synchronizacja z Claude Design nie przeszlaef3b307fixdevelopers: JEDNA strona deweloperska — /mcp scalone i przekierowane18833a6fixnav: JEDNO wejscie „Developers" + koniec pustych kolek w menu
86b60cafeatescrow: Escrow Inbox przestaje byc makieta — polowa PRZYCHODZACA, firma sama sie weryfikuje650fff5revertui: przywroc interfejs do stanu z 25.08 (394d585) — decyzja wlascicielab362ccbperfhero: sztych maluje sie z HTML — koniec pustego pudelka na elemencie LCPd0a6e0efixbrand: to multiply zjadal ryciny — zdjety, wszystkie plyty na alfebe4c592perfbrand: cofnij regresje wagi, ktora sam wprowadzilem — 1145 kB -> 551 kB3a151dafixbrand: napraw plyty u zrodla zamiast je podmieniac — obie grafiki wracajab27e921choreshiplog: dopisz commity z 2026-09-01 (generowane przez prebuild)4876bb9fixhome: jedna zepsuta plyta + ryciny nieprzygotowane do ciemnego motywue106c3dfixcss: remove invalid tailwind arbitrary class that crashed compilerf36c836fixui: restore frameless EngravingVideo on homepage and typographic mobile menuf725eb2fixtypes: align JurisdictionCoverage fields in EntityControla09a915fixbuild: remove BOM from mega-menu and update features gridbaf1b67featui: add 12-language i18n switcher and Newscorp-style Mega Menuad85ff5stylenav: consolidate developers link, remove circle masks from menu emblems81c207efeatpdp,pricing,nav: promote People roster with ValueWall, overhaul Snitch AI pricing, clean header & hero badge1ee3ba0refactorlogin: redesign authentication workspace with modern UI, mode switcher, dynamic OAuth detection, and password toggle11da2cffeatpricing: connect Investigator (\) and Business (\,900) directly to Stripe subscription checkoutea670d1fixpricing: ensure all included features render in crisp foreground text instead of greyed-out muted style9e99121stylemenu: remove kratownica grid background for clean sleek theme-honest drawer4e23986fixnav: simplify mobile drawer and navigation to core product routes8004343choreshiplog: update shiplogf2b4a24featdevelopers,mcp: complete 24 tools reference, client configs for Claude/Cursor/Windsurf/Cline, and autonomous purchase flowa8fca45featapp: modernize pricing, restore Pulse and SnitchBoard, add UBO transparency, and refine analyst search
453f7dcfixhome: enforce strict sequential section indexing and build verification
394d585fixpdp: a person gets no dubious SnitchScore dial — verdict leads, not "34/100"
e2731c4fixpdp: the page opens with WHO + verdict, not a dubious score dial (mobile)bc7a5c5featmcp: purchase_dossier on the hosted agent surface — the wallet-buy loop, live to agents8d50278featagent-channel: POST /api/public/dossier/{id}/buy — agent buys a dossier from the wallet47a5f3ffeatpdp+aeo: render the FAQ visibly, not just as JSON-LD64a8198featpdp+aeo: visible definition sentence under H1 — the answer-engine atom on 171M pagesc212ce9fixpdp: score panel stops being a second store — kill the competing unlock CTA + embede21a3bcfixpdp: thin entity gets ONE action, not a scatter of off-page exits1c5e24efeatpdp: wire chapter seams + section rhythm — fix "wszystko sie zlewa"
30fe8dcfixpdp+facts: a wall needs a door, and the corpus numbers match the live API33b936fperfcost: starve the anonymous corpus scraper — /dossier was 97% of the Vercel bill
1c3f340featdatasets: /datasets — the machine face of the corpus, as a schema.org DataCatalog90956a3feataipref: affirmative usage grant (Content-Usage: ai=y) — robots.txt + HTTP headerfdfb432fixpdp: naprawa rozwalonej ściany-frost na mobile — seal band ściskał tekst do pionu
How to read this
guaranteesDated
Every entry carries the day it shipped. Data snapshots note the corpus size they baselined.
Sourced
New sources name their registry or leak. Coverage claims map to the provenance table on /trust.
Derived, not remembered
Corrections are appended as their own dated line, never edited over the original. The ship log is re-read from git on every deploy — nobody has to remember to update it.
See what shipped.
Search the corpus these releases built, or read how it is sourced and resolved.