← all posts
// smart-home · privacy

Design a smart camera that stays private

A Raspberry Pi zip-tied under the porch light runs a local detection model, spots a parcel on the mat, and fires a push notification with a thumbnail attached. No frame left the house to make that call. Except the photo is now sitting in your phone's notification history, and possibly in a cloud backup you switched on once and never thought about again.

That's the trap with most private-camera builds: solve the easy part, running inference on the board instead of a vendor's server, and call the job done. The image still travels. It just ends up somewhere less obvious than before.

There are two common ways to misjudge a Raspberry Pi or Orange Pi for this kind of work: treat it like a shrunk-down desktop and expect a full vision pipeline to just work, or decide nothing short of a data-center GPU can be trusted with a real decision and pipe everything to the cloud instead, which defeats the entire point. The board is fine for a bounded job. What breaks projects is skipping the questions around it: storage, power, cooling, the operating system, and what happens to the picture after the model has made its call.

Four lines that decide what you actually need

Before you buy anything, write the job down in four lines: the event, the input, the output, and the deadline. Add AI to the camera is not a job, it's a mood. When a parcel sits in the porch zone for a fixed window, generate one local notification with a thumbnail, no cloud round trip is a job you can test, and one that tells you which parts don't need a model at all. A motion zone and a timer will get you most of the way there without any inference running.

Then test with your own footage, not a demo clip: your porch light, your camera angle, your network, your walls. Edge deployments punish small variation. Evening glare, a passing headlight, a Home Assistant database grown heavier than anyone expected, a flaky USB cable: any of those will move your results more than a newer model ever will.

Keep a short log while you test, and keep it boring:

board, OS, power supply, cooling
model file and runtime version
real footage sample and the expected action
cold-start latency, warm latency, sustained rate
memory use, board temperature, wall power draw
false trigger, missed trigger, and how it recovers

None of that is glamorous. All of it is the difference between a demo and a fixture your household actually relies on.

Accuracy is the least of it once this thing runs unattended for weeks. Does it send the same notification twice? Does it come back on its own after a reboot, without an SSH session from your desk at work? Does it reconnect cleanly once the router hiccups, which it will? And when the inference container is down, does the porch light still work, or did you wire the switch through a model that can silently stop answering? Nobody else in the house should need to know which container crashed to turn on a light.

What happens after the model says yes

Once detection fires, two questions come up, and it's easy to blur them together. First: is this model allowed to be the only thing standing between a stranger and your front door lock? It shouldn't be. Generative or vision output is good at interpreting a frame, ranking options, summarizing a day's events, but it makes a bad sole gatekeeper for a lock, a valve, a heater, an alarm, or a battery charge circuit. Keep ranges, permissions, timeouts, and confirmations in plain deterministic code, and treat anything that arrived as a camera caption, an MQTT payload, a calendar entry, or a voice transcript as data to check, never as an instruction to obey.

Second question, the one people skip: where does the frame go once the model has made its call. Local inference stops one upload. It says nothing about the recording buffer, the event log, the thumbnail cache, the backup job, or the dashboard you can open from a coffee shop. Decide these before you install anything, not after:

  • what actually gets captured and stored, versus discarded the instant a decision is made
  • how long anything kept actually stays, and who chose that number
  • who can pull a frame later, and through which interface
  • what a support session or a stray debug log exposes if you ever ask someone for help

The most private frame is the one the camera never keeps. The next best is the one thrown away the moment the bounded decision is made.

Running this as a household fixture rather than a weekend demo means treating it like an appliance, not a script you SSH into when something breaks. Use a service manager or a small, pinned container, keep configuration separate from the model file so you can swap one without touching the other, and write a health check that proves the actual function, not just that a process holds a port open. Keep a known-good storage image, because the node that fails is always the one bolted somewhere inconvenient to reach. Run it until the enclosure reaches a steady temperature and measure power at the wall with everything plugged in the way it will actually sit. If it throttles, swaps, corrupts storage, or drags down the rest of your home-automation host, it isn't ready, whatever the detection accuracy looked like in a short test.

The rule that holds up: collect less, and make every copy on purpose. I hit the identical lifecycle argument writing about privacy in meeting notetakers: local processing is not the same claim as local storage, and plenty of vendors are happy to let you conflate the two. A camera like this is a narrow layer sitting above sensors you trust and below a household policy someone actually wrote down. When the model goes offline, the automation should get dumber, not stop.

None of this is free, and I'll admit the field log is the first thing I skip when I'm just trying to get the porch light working before dinner. Get away with it once, probably. Skip it on the third project and you're debugging a flaky notification pipeline at eleven at night, a worse way to spend an evening than writing four lines down first.

#privacy#cameras#smart-home