Data Salon·← everything behind the talk
Data Salon · field notes

Building a Home Control Plane From Parts

How a message relay grew, one part at a time, into the control plane for a whole home lab.

“Complex systems that work tend to grow from simple systems that work.”

I set out to build one small thing: a way to detach a work session from my desk, so I could close my laptop, walk away, and keep working from my phone through a secure chat interface. What it became, by accident, was the control plane for my entire home lab, running on a single salvaged ThinkPad.

Chat clientsTelegram · Discord relaydgate · auth · budget RODIN · THINKPAD T480 — THE VESSEL Claude Codeone live session Schedulercron · self-wake ObservabilityPrometheus · Loki · Grafana k3s clustermost services SensorsBLE · network · router Tailscale — single controlled egress · WireGuard
The whole system at a glance: chat in through the relay, one live model session at the center, scheduler, observability, k3s and sensors around it, everything behind a single controlled egress.

The method was the point. I don't design big systems up front. I define the smallest version that solves the task, decompose it into components with clean boundaries, and build interfaces between them. That makes each piece extensible, and it means the next problem can usually be solved by adding one more part rather than rebuilding.

The first part was a Telegram bot wired to a running Claude Code session through its channels feature, a relay I called relayd. Almost immediately it forced a security question: with no real way to authenticate a chat user, I had to gate every message at the relay before it reached the model, and split admins from regular users. The moment I drew that line, the thing became multi-tenanted. I invited a few friends to test it, and suddenly several people were holding separate conversations with the same model at once.

A necessary caveat

This is only safe among people I trust. You should never rely on a model as your security boundary. Gate a stochastic system behind a deterministic one.

Next it needed a pulse. I gave the model a scheduler so it could run tasks at set times and even schedule itself, waking up later to finish something. That one addition turned a chat bot into something much closer to an assistant.

Then I made it captain of its own ship: a bare Linux box it fully administers, reachable only over a Tailscale tunnel. Once it could touch the machine and the network, it needed senses, so I added an observability stack. Routing those alerts back through the relay gave it a nervous system: it notices when it's low on memory or disk, investigates, and tells me. It can begin to self-heal.

From there the surface kept widening on its own. A port scan turned up an open port on my TV, so I built a phone remote for it. A Bluetooth thermometer became an "open your windows" alert.

None of this was on a roadmap. I built the parts, each with a clean edge, and the platform emerged from setting them next to each other. That's the whole point: complex systems that work tend to grow from simple systems that work.