Verify a receipt — in your browser.
No server-side check · Ed25519 runs locally · your bytes never leave this tab
Paste a signed egress receipt or witness anchor, paste the install pubkey it claims to come from, and this page will re-run the same 4-check pass the station’s /api/receipts/verify runs — but here in your browser via @noble/ed25519. You don’t have to trust anything RailCall operates for this verdict to mean something. That’s the whole point.
Get it from the station: curl http://127.0.0.1:8799/api/signing/pubkey → take the public_key_hex field.
What each check proves
No trailing commas, no smart-quote pastes. A copy-paste that JSON-parses will always parse; a broken paste fails HERE, not in the sig check.
Exactly 64 lowercase hex characters (32 bytes of Ed25519 public key). Anything else and there's no key to verify against.
This validator handles railcall_egress_receipt.v1 and railcall_witness_anchor.v1. Anything else and we don't know the canonicalization rules — an unknown schema is not a fail of the receipt, it's a limitation here.
Every schema has a fixed set of required fields (destination.provider, decision, timestamp_utc, …). Missing any one = the receipt is malformed and cannot verify.
The critical one. We canonicalize the receipt (deep-sorted JSON, minimal separators, UTF-8), sha256 it, then Ed25519-verify the signature over the UTF-8 hex string of that digest. If this passes, the exact bytes you pasted came from the install that owns that pubkey — not a bit was altered since.
Full threat model: /trust/threat-model. The auditor cheatsheet on that page maps every receipt field to what it proves. The witness API (GET /witness/anchors?pubkey=…) returns the anchor history for a given install — use it to check tail-truncation and policy-doc rewrites between anchors.