01 · Receipts
Tamper-evident by construction.
sha256(previous hash + event), head countersigned by an RFC 3161 timestamp authority
Every view, download, and share in a delivered gallery is written to an append-only audit chain. Each event's hash is the SHA-256 of the previous event's hash plus the event itself, so the log can't be quietly edited after the fact - alter or remove one row and the chain breaks at exactly that row. Verification re-walks the whole chain and re-computes every hash.
The same chain carries account-level security events - password changes, 2FA on or off, recovery-code rotation, new devices - so "tamper-evident receipts" covers the account, not just the gallery. Even platform-level trust and safety review of a studio's content is written to a chain; cross-tenant access is never silent.
A chain on its own proves the rows are consistent with each other. It cannot prove when they were written, because every input to it is ours, and in a real dispute the objection is never "your hashes don't match" - it is "that is your own database, you could have typed anything into it". So the chain head, which is one hash covering every event behind it, is sent to an independent RFC 3161 timestamp authority nightly and on demand. What comes back is a token that authority signed with its own key, attesting that this exact hash existed at that instant. We keep it verbatim.
You can hand the whole thing to someone who has no reason to trust either of us. The evidence bundle is one file carrying every hashed field plus the timestamp tokens, and /verify re-hashes it in the reader's own browser with no account and no request to our servers. The authority's signature is checkable separately with stock openssl against its published certificate, which is the point: we are not asking anyone to take our word for the part that matters.