For a while my setup was split across two machines. Home Assistant lived on my Synology NAS, alongside the Mosquitto MQTT broker and ring-mqtt, while Frigate ran on a separate custom rackmount PC. It worked, but two things kept nagging at me.

The first was access. Running Home Assistant on the Synology meant living inside the Synology walled garden, with limited Docker and no room to poke at the OS underneath. I keep SSH disabled on the NAS on purpose, for security, since that box holds all my data, so it was never going to be the place I tinkered freely. I wanted full control of the machine my house runs on, without having to loosen anything on the NAS to get it.

So I consolidated. Home Assistant moved off the NAS and onto the Frigate box, which finally gave it the Docker, SSH, and OS access I wanted. I pulled the 4x10TB Toshibas that had been a storage volume on the Synology and moved them into a RAID10 array for recordings. The box earned a name, Alfred (as in Pennyworth), and now it runs the whole house: Home Assistant, Frigate, the MQTT broker, and everything that glues them together.

A few things were non-negotiable going in. It had to stay up, it could never drop a recording, alerts had to be fast enough to actually be useful, and one person had to be able to keep the whole thing running. Almost every decision below traces back to one of those. I get asked about this setup often enough that it felt like time to write the whole thing down.

Here is what Alfred looks like in mid 2026.

The Hardware

The core is nothing exotic, it’s basically a normal PC: ASUS ROG STRIX B550-F GAMING WIFI II Motherboard, Ryzen 9 5900X, 64GB DDR4 RAM, RTX 3050 6GB GPU, Hailo-8 PCIe accelerator, 2.5GbE networking

Detection did not start on the Hailo. It used to run on a Google Coral Dual TPU, which is a great little chip for the most part. Mine was throwing a ton of false positives, especially at night, and the cause came down to the model and the resolution. The Coral was stuck on an older detector running at 320×320, which is just not enough pixels to tell a swaying branch from a person in the dark. Moving to the Hailo-8 unlocked what I actually wanted, YOLOv9 running at a higher detection resolution, and it hands back a result in ~15 milliseconds. The false positives went away.

That one card doing one job is what makes the rest of the design work. With detection handled, the RTX 3050 is free for everything else in the video pipeline: hardware ffmpeg decoding for about 29 streams at once, the embeddings behind Frigate’s semantic search, and bird classification. Outside of embeddings, the GPU sits almost idle, but at about 4.8 of its 6GB of VRAM, decoding is earning its keep. If I hadn’t been re-using a CPU I had on hand, I would have gone with a CPU with an iGPU instead of the 3050.

With detection offloaded to the Hailo and decode on the GPU, the 12-core CPU barely participates. Load average sits around 2.3 on 24 threads.

Storage in Tiers

Video uses storage in a very particular way, so it is tiered to match:

  • Samsung 990 EVO 1TB NVMe for the OS
  • Kingston 256GB NVMe just for Frigate clips and snapshots
  • 4x Toshiba 10TB HDWG11A drives in RAID10 for continuous recordings, about 18TB usable
  • An NFS share on the Synology for nightly Docker backups

The small NVMe just for clips is one of my best decisions. Snapshots and short event clips are a constant stream of small writes, and keeping them off both the OS drive and the spinning array means nothing fights over IO.

The recording array is those four 10TB Toshibas, and it is RAID10 rather than RAID5 or 6. That was a deliberate trade. Parity RAID would have squeezed more usable space out of the same four drives, but continuous recording from twenty-nine cameras is a heavy, sustained write, and parity gets in the way of that. It also reads back fast, which matters more than it sounds, because pulling up a detection clip and scrubbing through history should be instant, not a loading screen. Coming from a cramped two-drive RAID 0 that was gasping under the camera load, the jump to a roomy, redundant, fast array was the single biggest quality-of-life change in the whole move. It still sits under half full, with room for the cameras I have not added yet.

The Software Stack

Ubuntu 24.04 LTS and Docker Compose. Six containers total: Frigate, Home Assistant, Mosquitto for MQTT, ring-mqtt to pull the Ring gear into the fold, plus a metrics agent and a Portainer agent so I can check on things without SSHing in.

Nothing clever here, on purpose. Boring, separate compose stacks are easy to update, easy to back up, and easy to reason about at 11pm when something breaks. That last one is the whole point: the constraint was that one person has to be able to keep this running, so I optimized for the 11pm version of me, not the version that enjoys a clever setup on a good day.

Frigate

Frigate is the heavy hitter. Twenty-nine cameras, mostly Amcrest and Dahua with a couple of Reolinks, each restreamed through go2rtc. Detection runs on the low-resolution sub-streams at 704×480 and 5fps, while the full-resolution main streams go straight to disk. Per-camera zones and motion masks keep the alerts meaningful, and the object filters cover the usual suspects around here: person, car, dog, deer, bird, package, cat.

Retention is 10 days for alerts and detections and 7 days of continuous recording, which lands the RAID array at about 42% full. Semantic search and bird classification are on. Face recognition, license plate recognition, and GenAI object descriptions are all off, and that is on purpose. Each one is a real feature I could switch on this afternoon. I have left them off because none has cleared the bar of being worth the compute, the storage, or in the case of face recognition the privacy cost, at least not yet. The GenAI descriptions are already wired to a local Ollama model and commented out, waiting for a reason to earn the slot. That is a future post on its own.

Home Assistant

Home Assistant is the hub for everything, and it has grown into a mature install: 2,679 entities across 240 devices, organized into 31 areas over four floors, counting the shop and the garden as their own. The biggest device footprints are Ring at 75, bridged in through ring-mqtt, then Frigate and TP-Link Kasa at 48 each, followed by a long tail: Ecobee, Carrier HVAC, Reolink, Ecowitt and WeatherFlow for weather, Matter and Thread, Shelly, Mealie for recipes, and yes, integrations for the chicken coop.

A handful of custom HACS integrations fill the gaps for things the core project does not cover, like the Dyson fans, the Generac generator, and the Kwikset locks.

Two architecture choices worth calling out. The container runs with host networking so mDNS and Matter discovery just work. And the recorder is offloaded to PostgreSQL via TimescaleDB on a separate box, with a full year of history retention, so Alfred’s drives never see the database churn. That last one is not just tidiness, and it pays off later.

Seven dashboards sit on top of all of it, from the main overview down to dedicated boards for the birds, the printers, and a daily news page.

The Automations

Fifty-two automations do the actual work, and most of them exist so we stop having to think about the house. Security is the backbone: every door locks itself at 9:30 each night, presence handles unlocking when we get home and locking up when we leave, and the garage doors close themselves, built as template covers from contact sensors and relay switches.

Lighting is the biggest suite, motion and sunset schedules across the porch, entries, driveway, shop, and office. That includes the dog lights, which turn on the outdoor lights when we are out after dark.

The best ones are Frigate-driven. Because Frigate reports the object type and not just motion, the notifications can be specific: a package on the porch, a bird at the pond, the cat wandering the lower driveway. Those go straight to our phones.

The rest is quality of life and safety: a coop high-temperature alert with a daily reset gate, leak sensors under the HVAC, a pond temperature warning, and hot tub light schedules.

Voice and Agents

Here is the honest version: almost none of the AI lives in Home Assistant itself. I tried the built-in Assist features and they are fine, but they are not what I reach for. Basic voice control runs through Alexa, which is perfectly good at turning things on and off. The interesting part runs on a separate box called Nova, a fully local voice assistant I built to replace the Echo without shipping my house off to someone else’s cloud. Nova is the brain behind voice now: it answers questions about the house and can act on it, controlling a specific allowlist of Home Assistant entities so it can never toggle the wrong thing. I wrote up how Nova came together in its own post.

This is where that recorder decision pays off. Because a full year of history lives in PostgreSQL instead of on Alfred’s drives, I can point agents at it. Some answer questions about trends and past events, when something last happened, how often it runs, what counts as normal for this time of year. Others watch for the opposite and flag when a reading drifts off its historical baseline. A few skip the history entirely and read entities directly when all they need is the current state of the house.

Parting Thoughts

The commented-out GenAI config is the obvious next experiment, and the Hailo-8 install deserves a write-up of its own since it was the fiddliest part of the build. For a while, every Ubuntu update broke Frigate by installing an incompatible driver version.

If there is a specific piece of this you want the details on, let me know and I will dig into it.