Back to News & Insights
Artificial Intelligence August 15, 2026 · 9 min read

I built a security scanner that checks if you are a dog

A live-video scanner that barks when it sees a dog, built by a self-paced AI loop over one weekend. Every green checkmark in this project was, at some point, green over something broken.

I built a security scanner that checks if you are a dog

I went looking for a dog in the GPU family tree. I found fish, dead physicists, and a bridge in Florence.

NVIDIA names its architectures after scientists — Tesla, Kepler, Hopper, Blackwell. AMD names its GPUs after fish: Sienna Cichlid, Navy Flounder, Hotpink Bonefish. Intel uses Italian bridges. There is exactly one dog in the entire lineage: Husky, the CPU cores in AMD's 2011 Llano APU. And because Llano was an APU, those Husky cores shared a die with an integrated Radeon — codenamed Sumo. The closest a dog has ever gotten to a GPU is sitting next to one, and even then the graphics half got named after a wrestler.

Dog or Not is a live-video security scanner with one job. You hold something up to the camera, say "scan", and it tells you whether it is a dog. If it is, it barks.

It is deliberately not charming about it. The scanner is a cold threat-assessment system that happens to have been pointed at dogs, and the entire joke is that it does not know it is making one. Hold up a golden retriever and it says, in the flattest voice available:

Hold up a wolf and it says "Negative. Grey wolf." Hold up a cat and it suffers a fatal system error. Get three dogs in frame and it declares a containment breach — in whichever of nine languages you picked.

The classification line is where it gets interesting. A wolf is not a dog. Neither is a coyote, a fox, a plush toy, a bronze statue, a cartoon, or a person in a costume. That is a choice rather than a fact, and it is the choice that makes the thing measurable — "is this a dog" is otherwise solved zero-shot and there is nothing to find out.

Grant camera access, press INITIATE, then hold something up and say "scan". Chrome or Edge for the voice command — everywhere else, use the SCAN button, which does exactly the same thing.

The dependency script exists because pip install -r requirements.txt hard-fails here with ResolutionImpossible. requirements.txt pins websockets==17.0.1, deliberately above the caps google-adk ( "A visual identification scan reveals a clear image of a Golden Retriever. The subject is verified as a real dog with 95% confidence, as isdog is true... I'm executing the reportverdict tool with the dog's details, then I will say 'Woof.'"

It sees the dog. It narrates the call. Zero tool calls, ever. Meanwhile the fallback model inherited from the earlier build could not open a Live session at all, under a comment claiming it could — because until the first real session, nothing had ever opened one.

The eval set came from Wikimedia Commons, sourced by search term. One of them — "Dog with Goofy plush toy" — is a real dog chewing a toy, filed as not-a-dog. It would have scored every correct answer as a failure.

There is no test for that. The only way to catch it is to look at it. The project's own older documentation already says so: generate the input, never the expectation.

One dog fixture came back SILENT twice, consistently. It is a Halloween dog park — beagle, cavalier, retriever in the background — and the model had called triggerheavymetalmode(). The containment breach fired unprompted, on an unposed real-world photograph.

The harness only scored reportverdict. But the instruction gives the easter eggs absolute priority over reportverdict — so the harness was marking the model doing exactly as it was told as a failure.

There is exactly one thing in this repo that measures the model rather than the plumbing, and it needs no human in front of the camera:

It drives the real deployed endpoint with fixture images at 640×480 JPEG q60 — the exact format the browser sends — puts a {"type":"text"} frame in where you would say "scan", and scores every reportverdict against a count verified by eye before it was committed. One billed session per run. --blur-prob and --jitter approximate a real webcam; --min-rate turns it into a gate that can fail a build.

What it cannot see: it holds one static fixture per trial, so it is structurally incapable of catching a sampling miss — a pose held for less than a second at 1 FPS that lands in no frame at all. That blind spot is how "1 FPS and 2 FPS score identically" got measured, believed, and written down.

| outcome | n | | |---|---|---| | correct verdict | 17 | six breeds, wolves, coyotes, foxes, two bronze statues | | containment breach | 1 | correct — three dogs in frame | | cat alarm | 2 | both cats triggered the system error | | called a non-dog a dog | 0 | | | refused a real dog | 0 | |

Latency 0.68–1.56s, mostly around 0.7. It correctly said "bronze statue" for a sculpture of a man with a bronze dog beside him.

Want to discuss this further?

Book a free strategy call with our team to see how these insights apply to your specific business goals.

Book a consultation