Kolaboro / Verify evidence / Evidence bundle
A court-ready evidence bundle, built in your browser
One PDF with a cover, an index of exhibits, the SHA-256 and Bitcoin timestamp of each one, a chain-of-custody table, the proof that it sits in our public log, and a page that tells an independent expert how to check all of it offline with our open-source verifiers. It is designed to make an expert's job easy. It does not decide whether a court admits it.
Build one for any tracked project
Type an anonymous project id. Your browser fetches the signed project record, the page fingerprint with its Merkle proof, the change history, the open dataset file and the hazards file, checks every signature and proof itself, and writes the PDF and a machine-readable manifest. Nothing is built on our servers. The only thing sent back is the PDF's SHA-256, which is timestamped with OpenTimestamps so the exact file can be checked later.
For a buyer's own case
In the client portal, the case page has a button Court-ready evidence bundle. It does the same in your browser with your case: every photo and document is downloaded from your case and hashed again on your device, every signed evidence receipt is checked, the fingerprint chain is recomputed, and the custody table shows who added each item, when, from which device and with which GPS fix, exactly as stored when it was added. Your files and personal details never leave your device; only the PDF's SHA-256 is registered, the same way as the case-file PDF, so it can be checked at /verify. Try it on the demo case.
What is inside
Case or project id, creation time, the manifest's SHA-256 and every check the browser ran: signatures, log chain, checkpoint, inclusion proof, Merkle proof or case chain.
One line per exhibit: SHA-256, OpenTimestamps status (and Bitcoin block when confirmed), capture time and source.
What each one is, who produced it, where it was fetched, its signature and what it says, in plain words.
Who added each item, when, from which device, GPS and passkey signature, and whether its link in the fingerprint chain holds. Only what was stored at the time: nothing is filled in later.
The daily log line that names the data, how it recomputes, its inclusion path to the signed checkpoint, its Bitcoin timestamp and Sigstore Rekor entry.
Step by step for an expert with no network: the verifiers, the checker script, the public key, and how to check the Bitcoin proofs against their own node.
Check a bundle PDF
Drop a bundle PDF. Your browser computes its SHA-256 (the file is not uploaded) and asks whether that exact file was registered for a case or timestamped when it was built. One changed byte gives a different fingerprint.
Check it offline
The manifest downloaded with the PDF holds the exact signed answers, proofs and log lines. The checker below re-runs every check with kolaboro-verify.js from github.com/calory89/kolaboro-open (MIT), without any network call. Read it first: it is about 100 lines.
It prints PASS or FAIL for each SHA-256, Ed25519 signature, Merkle proof, log head, checkpoint and inclusion proof, names the exhibit each original file matches, and writes the OpenTimestamps proofs as .ots files for ots verify against your own Bitcoin node. check-bundle.mjs.
What it does not claim
- It is not legal advice and not a statement that any court will admit it. Rules of evidence differ by country; a lawyer decides how to use it.
- It is PDF/A in style (no scripts, no external content, document metadata set) but not a validated PDF/A file: the standard PDF fonts are not embedded.
- A fingerprint proves a file has not changed since it was recorded, and a Bitcoin timestamp proves it existed by that time. Neither proves that what a document says is true.
- For a buyer's case, each daily evidence root in the log covers the evidence of every case. Other cases are private, so a single case can be shown to be inside a root only when it is the only case that day; otherwise the bundle relies on the case's own fingerprint chain and its Bitcoin timestamp, and says so.
- The dataset and hazards files are not copied into the manifest (they are large). Their fingerprints are, and past versions of a project record stay available at
/api/open/projects/{id}/at/{day}.