
Proof-Lens
Media provenance you can verify without trusting the person who sent it.
- Year
- 2026
- Role
- Design and engineering
- Stack
- TypeScript · WebCrypto · RFC 3161 · Node
The problem
Everything here circles one question: how do you know a record is true? This is that question with the most at stake, because the record is a photograph and the answer has to hold up in front of someone who has no reason to trust you.
A photograph proves nothing on its own. Any image can be edited, re-encoded, or generated outright, and the metadata that might tell you so is trivially rewritten. The usual answer is to trust the platform that hosts it — which just moves the question rather than answering it.
The approach
Proof-Lens binds a capture to the device that made it and to the moment it happened, then packages both into evidence that survives leaving the app.
- Device signatures. The capture is signed at source using hardware-backed keys, so the signature attests to the device rather than to a server.
- RFC 3161 timestamping. An independent timestamping authority countersigns the hash, establishing that the content existed no later than a given moment.
- Offline-verifiable bundles. Everything needed to check the claim travels with the file. Verification needs no network call and no account.
What was hard
The interesting constraint is that verification has to work for someone who does not trust you, does not have your app, and may be offline. That rules out any design where the proof is a lookup against a service you control.
What I'd change
The signature proves which key signed a capture. It does not prove that the key was in a phone rather than an emulator, and hardware attestation is exactly the part that varies most across devices — it is strongest where you need it least. The honest framing is the one already on the page: it verifies provenance, not reality. Someone can still point a genuine, attested camera at a convincing fake.
The RFC 3161 dependency is the part I would change first. Anchoring against a single timestamping authority means every bundle ever issued inherits that authority's lifespan. Countersigning with two, from different jurisdictions, costs almost nothing at capture time and removes a single point of failure that only becomes visible years later, when it is far too late to re-issue anything.
The bundle format was cut to what a verifier needs offline, which meant leaving out most of the capture context. I would revisit that trade — the difference between "this file is unaltered" and "this file is unaltered and here is what was around it" is most of the difference between evidence and a checksum.