My homelab is a Dell Precision T5820 workstation with a couple of GPUs, a handful of Raspberry Pis, and a Docker host, all stitched together over a Tailscale mesh so I can reach any of it from anywhere without opening a port to the public internet. It runs local language models, Home Assistant, a stack of monitoring dashboards, and whatever else I happen to be testing that week. This hub collects the write-ups on how those pieces are built, how they broke, and what I changed to keep them running.
Remote access & networking
How do you reach a machine at home without exposing it to the internet? I self-host RustDesk behind a Tailscale mesh for remote desktop, which keeps the whole thing on a private network. The other half of remote access is not locking yourself out: here is how I hardened a server so an out-of-memory event does not kill the SSH session you need to fix it.
Home Assistant & Zigbee
Zigbee sensors are cheap and dependable until the firmware on the coordinator is older than the devices you are trying to pair. This one is about genuine hardware shipping with stale firmware, how I traced the flaky pairing back to it, and what it took to get the mesh stable in Home Assistant.
Monitoring & dashboards
How do you know a card is overheating or a service is quietly failing before it takes something down? These cover reading GPU thermals correctly, where the obvious sensor reading actually runs backwards against load, and building Grafana observability for a local LLM router so you can see traffic and failures as they happen.
Server & Docker ops
Docker fills a disk quietly, and the usual prune commands do not always reclaim the space you expect. Here is what actually cleared a full disk when containerd was hoarding the layers that a plain image prune left behind.
Radio & SDR
I run a software-defined radio setup that captures and logs local RF activity across a small fleet of receivers. The write-ups on that build (SDR-Watch) are still being written and will land here as they go live.
All homelab posts
Every homelab write-up, newest first. This list updates itself as new posts go live.
-

Linux OOM Killer vs SSH: How to Stop Getting Locked Out of Your Own Server
When the Linux OOM killer fires, ‘sshd is running’ stops meaning ‘you can log in.’ Four systemd and sysctl fixes that keep your login path alive through a memory storm.
-

I Strapped a $15 Sensor to My GPU. It Read the Load Backwards. Here’s How to Calibrate It.
A $15 Zigbee sensor on an open-air GPU reads load backwards in the fan airflow. An LLM falls for the same trick. Calibrate against nvidia-smi to fix both.
-

My brand-new SLZB-07 Zigbee coordinator shipped too old: fixing “EZSP protocol version 12 is not supported by host”
The SMLIGHT SLZB-07 connected, spoke the right protocol, then quit: EZSP version 12 not supported. Here’s the flash fix and how to pick the right channel.
-

Why docker image prune Won’t Fix a Full Root Disk: The Containerd Snapshotter Trap
docker image prune skips tagged images, and the real hog hides in /var/lib/containerd. How I traced a 99% root disk to the containerd snapshotter and fixed it.
-

Self-Hosting RustDesk on Tailscale Without Opening a Single Public Port
Run rustdesk-server-oss behind Tailscale with zero public ports, plus the macOS root-daemon config fight that ate an hour and nobody has documented.
-

Three Green Lies: Debugging a Self-Hosted LLM Observability Dashboard
Within a week of standing up the dashboard, three panels were showing bad data. None of them was a Grafana bug. I had built a Grafana dashboard to watch my…