All builds

Local-first infrastructure

A smart home system with no cloud, no subscription, no vendor

I replaced a commercial home controller with a system I built myself. It runs entirely on my own hardware and nothing it does leaves the house.

Commercial smart home platforms want your data and a monthly fee, and they break when their servers do. So I built a replacement.

The architecture, deliberately boring

A single Python process. No microservices, no cloud dependency, no build step on the server. A FastAPI backend talks to devices over MQTT and HTTP polling. State lives in SQLite. That is the whole backend.

A YAML rules engine handles automations and hot-reloads when I edit it, so changing behaviour means editing a text file, not redeploying anything.

The dashboard is React, mobile-first, organised by room with scenes and device groups, because the real test of a home system is whether it works one-handed in the dark.

Production hardening

Structured JSON logging. Environment validation on startup so a missing variable fails loudly instead of silently. Docker Compose for deployment. Automated backups. A self-contained installer that sets the dashboard up in a single command.

The bug that justified the whole audit

During hardening I pushed for a deeper pass than the first review offered. That second pass found the entire outbound command path had been silently dead: the system accepted every command, logged it, and did nothing. Every test that checked “did the API respond” passed. No test checked “did the light turn on”.

Lesson: test the outcome, not the acknowledgement.

Newsletter · weekly

The Build Log

One system teardown a week. What I built, what it cost, what broke, and the exact prompts that did the heavy lifting. No tool listicles.

  • A full build teardown with architecture
  • The prompt or config that unlocked it
  • The failures, with root causes

Weekly. Unsubscribe in one click. Read by subscriber count people.