Attest pack verifier
This page verifies an exported Attest pack in your browser. Nothing is
uploaded — all hashing and signature checks run locally, offline. Drop the
.zip pack itself, select every extracted file, just bundle.json for a
single-visit pack, or a signed receipt JSON (e.g. a verify-live --sign report).
To pin the pack to a deployment, drop its
attest.issuer/1
document too (from /.well-known/attest-issuer.json or
attest issuer --out) — the pin arms for the pack, and the doc's
signed lifecycle bridges pre-rotation exports.Drop two packs at once to compare them: each is verified on its own merits, then their signed membership is diffed — the copy the agency produced vs the copy you kept ("both verify" and "both identical" are different claims).
New here? The story of one contested visit — told entirely from signed data — explains why the record exists, and the site shows the rest. New to the math? Anatomy of a signed receipt decomposes one field-by-field, the seven gates show which check kills which attack, the battery page renders all 23 live verdicts — or take the two-minute tour of the headline features.
the oracle is the verdict each artifact was built to
produce — agreement means the verifier and the published spec say the same
thing about all nine.
"the copy the agency produced" vs "the copy I kept" — two
packs that both verify can still carry different records. Or drop any two
exported zips at once for the same compare.
What it looks like written down.
the shape a real dispute takes: "the pack my family kept"
vs "the pack the agency just produced" — provably the same log, only longer.
What it looks like written down.
Or pick an attack — each is caught by a different layer:
Proves the hosted copy is the exact pinned tool — a swapped verifier is
caught, not trusted. (A hostile page could rewrite this check too; for a real
dispute, the pack's own verify_case.py stays the stronger path.)
Extends the self-check to the whole deployment: the manifest's own
signature verifies first, then every listed file is fetched and hashed.
Tamper lab — commit the attack yourself
Pick a visit's signed bundle, a field in it, and a new value. This page rebuilds a real pack around your edit — same members, same signatures, different bytes — then verifies it. Change the value and the signed hash refuses it; write the exact signed value back and it verifies — the math checks bytes, not intentions. Download your doctored pack and the clean twin and diff them yourself; nothing here is simulated.
fields worth forging: observed_span_minutes (how long
cameras observed, in minutes — the contested visit signed 65.25; the shipped
twin sets 135.25), state, duration_minutes. A field
the bundle lacks gets injected — and still fails.
Is this still the log the deployment serves?
The pack proves membership in a signed log — a hostile deployment could keep a second, forked log it shows only to you, and every proof above would still close. Cross-check the pack's signed tree head against the head the deployment serves everyone right now:
This reads /.well-known/attest-issuer.json,
/api/log/head, and /api/log/consistency — the only
network step this page takes; everything else ran fully offline.
What this does and does not establish
A green result proves the signed records are intact and were issued under the pinned issuer key — integrity, not physical truth. It does not prove anyone was present, absent, or honest; it proves the evidence chain was not altered after signing. Media reported as "withheld" was deliberately redacted, not lost.
Trust note: this verifier file traveled inside the pack it is
checking. For a dispute that matters, re-verify with a verifier obtained independently —
the deployment's /verify-pack page, verify_case.py pinned from
the issuing deployment, or the operator's hosted verifier — never trust only the copy a
pack carries about itself.