Tamper-evident audit chain

Don't trust us. Verify it yourself.

Below is our real audit-chain verifier, compiled to WebAssembly and running entirely in this browser tab — nothing is uploaded. A sample audit log is loaded and verified. Now tamper one byte and watch the chain catch exactly where it was altered.

Loading verifier…
Nothing phoned homeOpen DevTools → Network, then click Verify. Zero requests. The log never leaves this tab.
Works offlineDisconnect your wifi and click Verify again. It still works — the verifier is already here.
Read the codeThe verifier is source-available under BSL 1.1 (it converts to Apache 2.0 four years after each release). Build it yourself and check.

How far should you trust this?

This runs the real verifier in your browser — proof the chain is tamper-evident. But we serve this page, so for a check that doesn’t rely on us at all, build the source-available kvmfleet-verify binary from source and run it offline against your own export. The in-browser demo is the convenience version; the offline binary is the independent one.

How the chain works

Every audit event is sealed to the one before it: its row_hash is SHA‑256(previous row_hash + the canonical JSON of this event). Change anything in any event — an actor, a timestamp, a justification — and that event’s hash no longer matches, and every event after it is broken too. There is no way to edit the log so it still verifies; that is what “tamper-evident” means. The verifier re-walks the chain from the org’s anchor and stops at the first link that doesn’t add up.

This is the same verifier your auditor runs offline against an export from /v1/audit/events.ndjson — identical code, source-available under BSL‑1.1.