Signed records for agents, APIs, and MCP tools.
Ed25519-signed. I-JSON validated. Verify offline, in the browser, or across runtime boundaries.
Pick a path. Each is copy-paste.
Three entry points based on how much time you have. All three end with a verified signed record.
60 seconds to a local proof.
Generate real signed records and verify one offline. Requires Node 22.13.0+. No account.
npx @peac/[email protected] samples generate -o ./samplesnpx @peac/[email protected] verify ./samples/valid/basic-record.jws --public-key ./samples/bundles/sandbox-jwks.jsonexpected output — Signature valid (offline)
- jti
- 019ecfcc…bdd8
- type
- org.peacprotocol/access
- kind
- evidence
- iss
- sandbox.peacprotocol.org
- iat
- 2026-06-16
- alg
- EdDSA · Ed25519
- kid
- sandbox-2026-06
- signing input
- header.payload ✓
- public key
- sandbox-2026-06 ✓
- checked by
- web crypto · offline ✓
The same sandbox record used in the terminal above and the browser verifier. Each field is verifiable — type, issuer, timestamp, and the Ed25519 signature.
Attach a record to an MCP tool call.
The carrier pattern is transport-neutral. Two keys in _meta — the JWS and its digest reference.
{
"_meta": {
"org.peacprotocol/receipt_jws": "<compact-JWS>",
"org.peacprotocol/receipt_ref": "sha256:<digest>"
}
}The consumer extracts the JWS, confirms receipt_ref == sha256(jws), and verifies the signature against the issuer JWKS. Tampering anywhere in the chain fails closed.
peac verify <record.jws> --public-key <issuer-jwks.json>Deterministic verification at every layer.
PEAC v0.16 ships a complete verification stack. Tamper at any layer — raw bytes, signature, or replay — and the verifier rejects it.
Strict Ed25519 verification
Cofactorless verification, 11-encoding small-order denylist, fixed-width little-endian S comparison. Web Crypto (TS) and stdlib (Go). Fails closed on unsupported runtimes — no noble fallback.
Raw-bytes input validation
JWS header and payload scanned at byte level before any parse. Rejects duplicate member names, numbers outside ±2⁵³−1, lone surrogates, and invalid UTF-8 — before your code sees the data.
Composable bounded dedup
Optional createReplayGuard classifies verified records as fresh, replayed, or outside-window. Bounded by maxEntries and TTL. Not wired into stateless verifyLocal — compose it only when you need it.
Every command in one screen.
Type any of these in the hero terminal above. The terminal is real — commands execute in your browser.
Getting-started questions.
>how do I verify a signed record?
Run the terminal above (type verify), use the browser verifier at /verify, or run the CLI: npx @peac/cli verify <record.jws> --public-key <jwks.json>. Verification runs the PEAC Ed25519 profile (cofactorless, small-order denylist) and validates I-JSON compliance before any parse.
>does verification need a network connection?
No. Records verify offline with a local public key file. The in-browser verifier at /verify can also resolve the issuer key from the record iss field over HTTPS when you want convenience.
>what does v0.16 add?
A complete verification stack: cofactorless Ed25519 profile (TS + Go), raw-bytes I-JSON gate that rejects duplicate members, out-of-range numbers, and invalid strings before any parse, and an optional composable createReplayGuard. Wire format and record types are unchanged (wire 0.2, 61 types, 290 conformance checks).
>where are the full docs and specification?
The canonical PEAC Protocol specification, schemas, error codes, and documentation live at peacprotocol.org. peac.dev is the developer front door for getting started fast — every link here points back to the canonical source.
Verify a real signed record now.
Apache-2.0 · 36 packages · wire 0.2 · 61 record types · 290 conformance checks