Event clips, not a wall of tape
Recording is motion-gated. Each clip is preroll, then the episode, then postroll — written contiguously, so the seconds before the thing you care about are in the file.
100% contiguousA car parked in the driveway is visible for nine hours. It is not nine hours of events. A novelty tracker decides what is new, so the record stays something a person can read at the end of a day.
Recording is motion-gated. Each clip is preroll, then the episode, then postroll — written contiguously, so the seconds before the thing you care about are in the file.
100% contiguousEvery event is a line in events.jsonl — camera, class, time, confidence, clip. The app reads it; so can grep.
Once a day: purge, then compact, then archive, across two storage tiers. Retention is a number you set, not a plan you buy.
Purge → compact → archiveObject detection — person, vehicle, animal — over ONNX Runtime, with a provider ladder that takes the best accelerator present and falls back without a config change. No frame is uploaded anywhere to be classified.
Measured on our dev box, not the NAS. Ratios travel; absolutes do not.
Silence is the failure mode every recorder shares: nothing arrives, and nothing says so. Here, a camera that stops reporting raises an event like any other, the watchdog has rules about it, and the app shows it on the same screen as the footage.