How it works

Everything is a stream. Every consumer is a subscriber.

That is not a slogan, it is the architecture — and it is why the same product is an appliance for a house, a platform for an installer and a target for a camera vendor.

Cameras
RTSP in, two streams each
driveway
terrace
pergola  3.33:1
… 8 declared, 2 planned
cctv_hub — the event bus
one epoll thread · no libc · ~2.4% of a core for 16 streams

The hub ingests every camera once and publishes it. Facts, commands and outcomes all travel the same documented line protocol, which is why adding a consumer never means touching the ingest path.

Recorder

Motion-gated event clips: preroll, episode, postroll, contiguous.

Detector

Object detection on your own hardware, with a novelty tracker — so presence is not an event.

Camera control

One vendor-neutral vocabulary, with vendor shapes isolated in a driver.

Watchdog

A camera going dark is a first-class event with alarm rules, not a gap you find next week.

Subscribers, not integrations

The browser wall, the Android app, the exporter and the console are the same kind of thing: a process that subscribed. The phone app does not speak RTSP to your cameras — it speaks the bus.

What is kept, and for how long

A daily lifecycle pass purges, compacts and archives across two storage tiers. You keep event clips and the event record rather than an undifferentiated month of video.

Export you can hand over

Frame-exact clip export with time and camera burn-in, queued as a job on the bus. The artifact is a file, and it is yours to give to an insurer or the police.

Timeline screen · real frame · either theme
The timeline: motion episodes, detections and clip boundaries on one axis.