feat: content hashes on document versions + signed project export manifest

↗ view on GitHub · Andy · 2026-07-31 · 562a8139

Stores a SHA-256 of every document version's bytes at write time and adds a
per-project export manifest listing them alongside the accept/reject trail, so
an exported file set can be checked against what the workspace held.

The manifest carries a SHA-256 digest over a canonical form of its body,
Ed25519-signed when MANIFEST_SIGNING_KEY is set. Signing is optional so a
self-hosted deployment without key custody can still export; a malformed key
throws rather than silently downgrading to unsigned. The signature covers a
versioned context string and a NUL byte before the digest bytes, so it cannot
be replayed as a signature over another object, and it verifies with any
Ed25519 library. The public key is served at GET /manifest-signing-key.

Rebase of #181 onto current main, plus the signing requested on that PR.
Repository open-legal-products/mike
Author Andy <102524336+b1rdmania@users.noreply.github.com>
Authored
Committed
Parents 14de1509
Stats 16 files changed , +892 , -5
Part of Add tamper-evident project exports

Capture this commit into my fork

Download a Markdown prompt that tells Claude how to port this exact commit into your working tree. Run it via claude -p < capture-commit-562a8139.md from inside the repo you want the change in.

⬇ Download capture-commit-562a8139.md