TRUST
Verify the data and the code
The sanctions bundle is signed and content-addressed, and the browser refuses a bad one. Here is exactly what is checked, how to inspect the live version, and what none of it proves.
No account. Nothing you type is uploaded. The first visit downloads the matcher and the signed list (up to about 80 MB); repeat visits reuse the cached copy.
What is signed
The app does not fetch a CSV from a web server and hope for the best. It fetches a signed pointer that names a content-addressed manifest. The pointer carries an Ed25519 signature and a monotonic sequence number; the manifest lists every file and the SHA-256 of every chunk. The browser checks the signature against a pinned public key, checks every chunk hash, and refuses a bundle whose sequence moves backwards.
The same checks run over cached bytes on a repeat visit, so a poisoned cache is refused rather than silently used. The verifier is in the open source: verifyPublishedOrigin.ts and the browser bundle loader.
Check the published version yourself
The live pointer is public JSON:
curl -s https://aml-filter.com/bundle/origin/latest
It returns the manifest_hash, version, sequence and signature. The version identifies the list data; the sequence is the anti-rollback counter. The app shows the same values on screen.
The pinned key is a raw 32-byte Ed25519 public key:
curl -s https://aml-filter.com/public.key | od -An -tx1
It should match the key in the repository at frontend/app/public/public.key. The key is served same-origin; it is not taken from the bundle.
Privacy, concretely
- No account, no email, no server-side screening endpoint.
- No third-party scripts, fonts, analytics or error beacons. The content security policy allows same-origin code and data only.
- Names, dates of birth and results stay in the tab; the KYC workstation stores its records in OPFS SQLite on your device.
- The list download is inbound public data; it reveals nothing about who you are screening.
Security history, including the mistake
One production signing seed was committed to this public repository on 2026-06-20 and rotated on 2026-07-21. The old key is burned and revoked; the live key was replaced and the demo key was decoupled. The full record — fingerprints, exposure window, impact and the do-not-roll-back rule — is in SECURITY.md. We publish the mistake because a trust page that only lists successes is not a trust page.
What this does not prove
- It proves the bundle is the one the key holder signed. It does not prove the upstream government list was correct or complete.
- It proves the code that ran is the code in the repository only if you trust the deployment; the source and the reproducible build path are public.
- It does not make you compliant. Screening is one control in an AML program, and a no-hit result is not a legal safe harbour.
Found a problem? Report verification or supply-chain issues privately using the security policy, not a public issue.