Don't trust us. Check the work.
A security product that asks for trust has already lost the argument. Below: what you can check in your browser today, what our test suite prints, and what we have not done yet.
Last updated 24 September 2026
Check a real receipt in your browser
The in-browser verifier carries a real signed receipt. Verification runs entirely on your machine against the published key, with no call to us, so it gives the same answer whether or not we are still here.
The same check from a terminal will look like this. The @manav/verify package is not on npm or PyPI yet; the published key set is live at /.well-known/manav-keys.
$ curl -s https://manav.id/.well-known/manav-keys > jwks.json $ curl -s https://manav.id/v2/revocations > revocations.json $ npx @manav/verify --receipt receipt.json --jwks jwks.json --revocations revocations.json ok
Conformance vectors
Our vectors are adversarial by design: most of them are supposed to fail, and a verifier that accepts them is broken. These run from the repository, which evaluating customers receive. Output below was captured on 24 September 2026.
$ node packages/verify-ts/test/run.js 20/20 receipt vectors pass $ node tests/jcs-vectors.mjs jcs vectors (js): 43 pass, 0 fail $ php tests/jcs-vectors.php 43 pass, 0 fail
The receipt vectors are named for what they attack: stripped-mldsa, corrupt-ed25519, truncated-mldsa, unknown-kid, revoked-nonce, no-revocation-list, tampered-render, render-differs-from-statement, stale, tier-policy-too-low, cross-type-replay-as-v1.
The canonicalisation vectors include manav-bom-rejected, manav-bidi-rejected and manav-control-rejected — the inputs that break naive JSON canonicalisers.
The post-quantum half is real
ML-DSA-87 parameter sizes are fixed by FIPS 204. A library returning different sizes is not ML-DSA-87, so we check them on every call.
$ echo '{"op":"selftest"}' | node core/pq/mldsa-cli.mjs
{"ok":true,"pkLen":2592,"skLen":4896,"sigLen":4627,"good":true,"bad":false}good:true is a valid signature accepted. bad:false is a tampered signature rejected. There is no mock implementation anywhere in the tree, and our own test suite greps for one on every run.
We test for our own footguns
One test group exists purely to catch us cheating. It greps the entire source tree for the mistakes that would quietly turn this product into theatre.
- No simulated post-quantum verifier anywhere in the tree.
- No HMAC presented as a signature.
- No tracked key material.
- No signing outside
core/.
Read the spec
The constructions are published, not described. If you disagree with a design decision you can point at the line.
- draft-manav-receipt — the seen-and-signed receipt.
- draft-manav-statement — statement rules R1–R6 and
stmt_hash. - draft-manav-lease — host leases.
- Action schemas — nine published JSON schemas.
What we have not done
Found something wrong?
That is the point of publishing it. Tell us.