Tag: Build
The Recovery Runbook You Should Have Written Six Months Ago
Halfway through writing the recovery procedure for a stack you've been running for two years, you realize you don't know where the .env file actually lives, whether the named volume is app_data or app-data, or what network_mode: host is doing on that one service
Building the Home Assistant Docker Stack: MariaDB, Z-Wave JS UI, and the One USB Path That Survives a Reboot
The Z-Wave USB stick is invisible inside the container. Every setup guide tells you to add a devices: entry to your compose file and pass the path /dev/ttyUSB0. On first boot it works. After a reboot, the path has rotated to /dev/ttyACM0, or shifted to /dev/ttyUSB1 because
Deploying the Arr Stack: Getting Path Mapping Right Before Anything Else
The most common arr stack failure mode doesn't surface an error. Sonarr reports the download complete. NZBGet has moved the file. The import job finishes without complaint. Nothing appears in your media server. The problem is path mapping — and it was misconfigured before the first container started. This
OPNsense DHCP — Handing Out the Right DNS Servers
DHCP is the part of the DNS stack nobody thinks about until clients are resolving through the wrong server. The filtering is configured, the resolver is running, the host overrides are in place — and clients are still querying 8.8.8.8 because the DHCP server never got updated. This
Unbound DNS on OPNsense — Local Resolver and Host Overrides
OPNsense ships with Unbound DNS enabled but barely configured. Out of the box it forwards to whatever system DNS is set, registers no local hostnames, and returns public IPs for services you're running locally. If you're pointing AdGuard — or any other DNS filter — upstream at your
AdGuard Home on Docker — Bridge Mode and Upstream DNS
The default AdGuard Home documentation puts it on host networking and walks you through disabling systemd-resolved to free port 53. That's one way to do it. If you're already running a layered DNS stack — an upstream resolver handling local overrides, a reverse proxy managing your internal
Rocky Linux 9 Fresh Install: Every Anaconda Decision That Matters
The Anaconda installer presents everything at once — a summary screen full of spokes, each hiding a decision. Some have safe defaults. Several don't. The ones that don't are the ones that break quietly: a root partition that fills in three weeks, SELinux that gets disabled on
Using Claude to Write a Claude Skill, Start to Finish
The first time you try to get Claude to write a skill, you describe what you want, receive a file that looks completely correct, drop it into your skills folder, and discover two sessions later that it doesn't do what you thought it did. Not dramatically — nothing breaks.
Writing SKILL.md Files With Claude: The Session Sequence That Produces a Working Skill
Skills written from scratch drift. The first run looks right, the third run produces something different, and you cannot tell whether Claude changed its interpretation or the inputs were subtly different. The fix — more explicit instruction — costs context. The fix for that — prune the instruction — reintroduces the variance. The iteration
Matrix, Matrix Admin, and Maubot on Docker: The Lean Homelab Stack
Every Matrix homelab guide assumes you want PostgreSQL. The official docs say SQLite is testing-only. Community write-ups default to five containers before you've sent a single message. For a personal server running a handful of users without federation into large public rooms, that's a lot of