Skip to content
← All work
ProofLens dashboard — "Preserve the proof behind the file", with integrity, device-linked and trusted-time checks

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.

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.