You don't have to trust us. That's the whole point.
Every camera company promises to protect your privacy. The Canary is built so the promise isn't something you have to believe — it's math you can check yourself. This page shows what the device's kernel actually does, and how its cryptography really works — with the same real code that runs on the device, running right here in your browser. No servers. No accounts. Nothing leaves this page.
Three ideas do all the work
Start with the kernelA normal camera records everything. This one is built to refuse.
At the center of every Canary is a small piece of software the project calls the witness kernel. It's the gatekeeper every detection has to pass through before anything can be stored or sent. But it isn't a camera app that tries to be private — it's a constraint engine whose job is to make the invasive things impossible, not optional.
In plain terms: think of the kernel as a one-way mail slot bolted onto a locked room. The camera and its raw video live inside the room. The kernel is the only slot out — and it's shaped so only a short, hand-written sentence can fit through it (“someone is at the front door”), never the picture itself. There's no bigger slot, because a bigger slot was never built.
The path a moment takes through the kernel
watch itThe raw frame is marked private — it physically stays in the room. Only a signed, coarse claim is allowed to leave.
Why that's different — and useful to you: on an ordinary camera, “don't record faces” is a setting, and settings can be flipped — by an update, an admin, a breach, or a subpoena. Here, the face-recognition and video-export code was never written. There is no switch to flip, because there is nothing to switch off.
The one sentence that leaves is signed. Try to fake it.
When the kernel lets a claim out, it stamps it with a digital signature. Below is a real one — generated in your browser, this second, using the exact same method (Ed25519) the device uses. Watch it verify. Then rewrite the record by hand and watch the stamp catch you.
In plain terms: a signature is a wax seal that only one secret ring can press, but that anyone can recognize. The device keeps the ring (its private key) locked on its own chip and never shares it. It hands out only a picture of the seal (its public key) so the whole world can check its stamps — without ever being able to forge one. Not even we can.
A live claim, signed on this page
real Ed25519This device's public key fingerprint — the thing you'd check a stamp against:
- public key
- generating…
- signature
- —
The claim the witness is making. Drag to rewrite what it says — as an attacker would:
These are the real bytes generated on this page — not a picture of bytes. Forge the record above and the signature can't follow it.
// build the same message the device signs, then sign + verify it
function canonical(c, hash) {
return "securacv-canary-sig|v1|presence|" + id +
"|occupants=" + c.occupants +
"|range_m=" + c.range_m + "|" + hash;
}
sig = await crypto.subtle.sign("Ed25519", privKey, msg);
ok = await crypto.subtle.verify("Ed25519", pubKey, sig, msg);
// firmware/projects/canary-display/src/trust.cpp
// rebuild the locked canonical, then verify the stamp
snprintf(canonical, sizeof(canonical),
"%s|v%d|chain|%s|%lu|%s",
SIG_PREFIX, SCHEMA_V, device_id, length, latest_hash_hex);
const bool ok = Ed25519::verify(sig, pubkey,
(const uint8_t*)canonical, n);
These aren't two demos — they're the same handshake. The browser above and the chip in the
device build the byte-for-byte identical message before they sign or check it
(securacv-canary-sig|v1|…). That's why a
claim signed by a real Canary can be re-checked by anyone, anywhere, with no help from us — and why
the moment you changed a number above, the stamp stopped matching.
What “Ed25519” actually is — no math degree required
The wax-seal picture is nice, but here's the real thing, because the details are what make it trustworthy. Ed25519 is just a specific, well-tested recipe for that seal.
- 1It's a one-way street. Going from the secret private key to the public key is easy; going back is, as far as anyone knows, impossible — you'd have to guess a number with more possibilities than there are atoms in the sky. That gap is the entire foundation.
- 2A signature is welded to the exact message. It's not a sticker — it's a number computed from the secret and every byte of the claim. Flip one character and the only valid signature changes completely. (That's what you just did to break it.)
- 3Checking needs only the public half. Anyone with the public key can confirm a signature could only have come from the matching private key, over that exact message — without ever learning the secret. The world can verify; no one can forge.
- 4Why this recipe, specifically. Ed25519 is fast enough to verify in under a millisecond on the Canary's cheap chip, its keys and signatures are small, and it's deterministic — it doesn't gamble on fresh randomness each time it signs, a footgun that has leaked real keys elsewhere. It's the same modern standard behind SSH logins, Signal, and TLS.
The one-character avalanche — why there's no “almost right”
Before it's signed, every claim is boiled down to a 32-byte fingerprint (a SHA-256 hash). Edit the record below by a single character and watch its fingerprint — a real hash, recomputed as you type. The blue tiles are the bytes that changed.
Why that's different — and useful to you: the secret that makes the stamp never leaves the device. We can't sign a fake “nobody was home” in your camera's name, and neither can a hacker who breaks into a server we don't have. You can trust the record without trusting us.
Every record remembers the one before it. Break one, break the rest.
A single signed claim is good. A whole history you can't secretly edit is better. The kernel writes each event into a hash chain: every new record carries a fingerprint of the record before it. Change any past record — even one character — and every record after it stops adding up. Try it.
In plain terms: imagine a ledger where each new page begins by copying a summary of the previous page. Tear out or edit page 3, and pages 4, 5 and 6 no longer match the summaries they promised to carry. You can't quietly fix the past — the math tattles.
A real hash chain — edit any record
real SHA-256Each fingerprint below is a genuine SHA-256, computed in your browser as you type. Change a payload and watch the breakage cascade downstream.
/// Hashes a log entry with the previous chain hash.
pub fn hash_entry(prev_hash: &[u8; 32], payload: &[u8]) -> [u8; 32] {
let mut hasher = Sha256::new();
hasher.update(prev_hash); // ← the fold: last hash…
hasher.update(payload); // …mixed with this record
hasher.finalize().into()
}
let prev_hash = store.last_event_hash_or_checkpoint_head()?;
let entry_hash = hash_entry(&prev_hash, payload_json.as_bytes());
let signature = sign_entry(keys, &entry_hash, DOMAIN_SEALED_LOG_ENTRY)?;
// the new record is now both chained AND signed — three lines.
That's the entire trick, and it's tiny. Because each hash is folded from the one before it,
the records form a chain where the newest fingerprint silently vouches for the whole history behind it.
The demo above runs the same SHA-256(previous + record)
the kernel does — which is why editing an early block turns everything downstream red.
Why that's different — and useful to you: nobody can quietly delete the event where they walked past your door, or backdate one that never happened — not an intruder, not us, not even you. Anyone can re-run the check and see the chain is whole. That's what “tamper-evident” actually means.
We emulate a lot. Here's exactly what's real.
Much of what we show you — in the Playground, the Lab, the Scenes — runs in a browser, so it's fair to ask what's genuine. The honest answer: the cryptography is completely real. What a web page can't have is the physical radar, the chip's actual secret key, or the sealed storage — so those parts are simulated. We never fake a green checkmark.
Real, byte-for-byte
- The Ed25519 signing & verifying you did above
- The SHA-256 hash chain you just broke
- The exact
securacv-canary-sig|v1|…message format - The actual device firmware — compiled to run in the browser (WebAssembly)
Simulated (can't exist in a browser)
- The 60 GHz radar and camera sensors
- The device's real private key, fused into its chip
- Power, the network, and other Canaries nearby
- The encrypted vault where sealed footage would rest
The emulator's own README says it plainly: it “talks to the firmware only through the same boundaries silicon would.” Where your browser can do the real math, it does — so a “verified ✓” in a demo is cryptographic truth, end to end, not decoration.
Three ways to check, from “click a button” to “audit the source.”
The whole promise of this page is that trust should be optional. Here's the ladder, from the easiest check to the most thorough — pick whichever rung matches how much you want to dig.
Play with it here
You already did the real thing: you signed a claim and forged it, and you broke a hash chain. That was genuine cryptography, not a video of it.
Read the actual code
Every snippet on this page is quoted from the open-source repo. Read the real thing — the device signer, the kernel's chain, the browser demos.
Run the verifier yourself
Point the open-source verifier at a real device's log. If a single event was edited or reordered, it fails — loudly. No trust in us required.
Not “trust our privacy policy.” Trust the math.
A promise can be changed the day after you buy the camera. A signature and a hash chain can't be — and you can check them yourself, whenever you like. That's the difference, and it's the whole product.