← all writing

The homelab, version 3 — from a Docker box to a rack I 3D-printed

Every homelab is a diary. Mine has three chapters, and each one exists because the previous one taught me something the hard way.

Chapter 1: Unraid and the Docker sprawl

It started the way it starts for everyone: one box, Unraid, a growing pile of Docker containers. It was genuinely great for media — Unraid’s array is friendly, and Docker meant everything was one docker run away.

The failure mode was invisible coupling. Everything shared one kernel, one network namespace, one pile of volumes. When two containers fought over a port, or an update broke a shared library, the blast radius was “the box.” I couldn’t answer basic questions like “what depends on this?” or “can I reboot this safely?” — because the honest answer was always “probably, let’s find out.”

Chapter 2: Proxmox and the LXC discipline

The rebuild moved to Proxmox, and the single most valuable change wasn’t virtualization itself — it was the one service, one container rule. Every service lives in its own LXC container, running as a systemd service, with its own resources and its own failure domain. Now “can I reboot this safely?” has an actual answer, and a broken update is a five-minute container restore from backup instead of an evening.

The current shape:

  • Proxmox host — virtualization, backups, and the resource budget for everything below.
  • A GPU node — dual GPUs for local LLM inference (a 27B-class model serving my own AI tooling) and media processing.
  • The app fleet — home automation, the chore system, the host-family pairing app, a study platform, a recipe manager, music, audiobooks, photos, calendars — each in its own container, each restartable independently.
  • Cloudflare Tunnels — every public hostname routes through an outbound-only tunnel. No open ports anywhere: the edge handles DNS, TLS, and WAF, and the LAN never sees unsolicited traffic.

And the physical layer is DIY down to the rack: the server rack and the PC test bench are both 3D-printed, because when you build the furniture your infrastructure lives in, you stop being afraid of it.

The services that earn their keep

A fleet is only as good as what it does daily. The ones with real users (me, my family, sometimes my students’ families):

Music: Jellyfin → Navidrome + AudioMuse

Music started inside Jellyfin, along with everything else media-shaped. But music wanted different things than movies: lightweight clients, gapless playback, and — for a household with kids’ devices — simple, fast apps on every screen. Navidrome is a single binary that serves a Subsonic-compatible API, which means every music app ever written just works with it.

The interesting half is AudioMuse in front of it: automated analysis that builds playlists by mood and similarity from audio features, so “play something calm” works without anyone hand-curating playlists. The pipeline — analyze on the GPU node, write back to Navidrome — runs on its own schedule and asks nothing of anyone.

Home Assistant: the automation snowball

This one deserves its own post, because what started as “escape Apple and Google’s smart-home silos” became the nervous system of the house — presence-based lighting, temperature, whole-house audio, a wall-mounted dashboard, and the API backbone that the chore system plugs into.

Read the full Home Assistant breakdown

Mealie: digesting 4,500+ recipes

My family cooks from a library of recipe books accumulated over years. The paper versions were getting cooked to death (literally — stained pages are a usage signal), so the library went into Mealie, the self-hosted recipe manager. The interesting engineering wasn’t the hosting; it was the ingestion: 4,500+ recipes parsed out of ebook files, structured, deduplicated, and imported with their images — a batch pipeline that ran nightly on the GPU node, with a local LLM extracting structured recipe data where the ebooks’ formatting was messy.

Now the answer to “what’s for dinner” is a search box, and the shopping list builds itself from whatever we pick.

The rest of the fleet

Immich for photos (because family photos don’t belong in someone else’s training data), Audiobookshelf for the kids’ bedtime listening, Radicale as the CalDAV server that keeps the family calendar ours, and a handful of small apps I built for the house — the chore system, the study platform — that live here because this is where the users are.

Home Assistant: the automation hub at the center of the fleet.

What three generations taught me

  1. Isolation is a feature you buy with mild inconvenience. One service per container costs a little setup and buys everything.
  2. The best infrastructure is boring. Nothing in the fleet is exotic; the value is that it all just runs.
  3. Build for the users in your house. The services that survived are the ones my family uses without knowing or caring what a container is.