Reference

Usage

Seal once, emit a seal and one inclusion proof per member, then verify later — fully offline and pinned to the public key. Signing and verification run locally against node:crypto.

Install

install
# one-line install (installs the `waxseal` binary)$ curl -fsSL https://raw.githubusercontent.com/srivtx/waxseal/main/install.sh | sh # or run once, without installing$ bunx github:srivtx/waxseal#main seal capture.wacz # add to a project as a dev dependency$ bun add -d github:srivtx/waxseal # install globally$ bun add -g github:srivtx/waxseal$ waxseal --version

Options

Every option waxseal accepts. Text in angle brackets is a placeholder.
OptionDescription
--out <file>Output file (keygen base name; seal output path)
--key <pem>Private key to sign with (seal)
-s, --seal <file>Seal file (verify, proof-verify)
--proofs <file>Proofs file (seal, proof-verify)
--path <member>Only verify this proof (proof-verify)
--public-key <pem|base64>Pin the expected SPKI public key (verify)
--root <hex>Pin the expected Merkle root (verify, proof-verify)
--sha256 <hex>Member content hash for offline proof-verify
--created-at <iso>Fixed ISO-8601 timestamp; the same archive, key, and timestamp produce a byte-identical seal (seal)
--write-keyWith seal and no --key, save the generated key pair next to the archive (private key mode 0600); without it the generated key is ephemeral and not saved
--member-onlyAllow a re-zip instead of strict byte-for-byte verification (verify)
--force, --yesOverwrite existing key files (keygen)
--jsonMachine-readable output (seal, verify, proof-verify, inspect)
-h, --helpShow this help
-v, --versionShow the version

Examples

examples
# 1. create a key pair$ waxseal keygen --out archive-key # 2. seal once, emit a seal and one inclusion proof per member$ waxseal seal capture.wacz --key archive-key.pem --out capture.seal.json --proofs capture.proofs.json # 3. verify later, fully offline, pinned to the public key$ waxseal verify capture.wacz -s capture.seal.json --public-key archive-key.pub.pem # 4. prove one member against the signed root, without the archive$ waxseal proof-verify --proofs capture.proofs.json --path archive/data.warc.gz --root <hex-root> --sha256 <hex-content-hash>

Exit codes

The exit code is the CI gate.
CodeMeaning
0success
1findings or verification failure (e.g. a tampered archive, a mismatched pin, a failed proof; verify prints FAILED)
2usage or argument error (unknown option, missing required argument, invalid flag value)
3I/O failure (a missing or unreadable archive, seal, key, or proofs file)

JSON output

With --json, seal, verify, proof-verify, and inspect print one machine-readable object instead of text. For example, a successful verification of a self-signed seal:

{
  "ok": true,
  "root": "7ce7902d6dc6619e28496d7c717bacfbfb36bc7982b6d424d8d1f11c9218fcf7",
  "reasons": [],
  "added": [],
  "removed": [],
  "modified": [],
  "signatureOk": true,
  "expectedRootOk": true,
  "expectedPublicKeyOk": true,
  "trusted": false,
  "fingerprint": "8b3e7cbe526fdb46b70f4f3a8b2a3992475febd3f02f94a27a3b9395b2d3825c"
}

trusted is false until a matching --public-key or --root is supplied; reasons explains a failure and added, removed, and modified list any member mismatches.