◂ michaelz.dev WAR STORIES rss

War Stories

War stories, build logs and debugging tales from a homelab that runs my whole apartment — two Proxmox nodes, ~24 services, and a cat named Pixel who is not allowed to trigger automations.

26stories
123minutes of reading
Jun–Oct2026
angle = when · ring = what about · size = reading time
hover a story · click to read

OCTOBER 2026

2026-10-14
Deaf for Four Days: a healthy connection is not a live subscription

The listener that wakes my AI agent was running, connected and error-free for four days, and it had not received a single event. Every health signal was green because every health signal was about the connection, not the subscription.

orchestratorwebsocketmonitoringdebugging
platform
5 min read
2026-10-14
The Second Resolver Had Never Answered

Two false alarms one quiet morning led to a DNS fallback that every container listed and none had ever reached. It looked redundant for months because two nameservers were written down.

dnsmonitoringnetworkingdebugging
network
4 min read
2026-10-07
The Device on Port 8 Was My Router

I made every box on my network map clickable, and before it shipped it sent me looking for a mystery device on switch port 8. Port 8 is my router. Two false alarms about the observer that is never in its own picture, and a TV port that dropped its link four times a day.

networkingopenwrtmonitoring
network
4 min read
2026-10-07
Two Drives in a Drawer: an encrypted, offline copy of everything

Two old laptop drives now hold a full, encrypted, add-only copy of my homelab: one plugged in, one in a drawer. Getting there crashed the backup VM once, ate a chunk store, and ended with a monitor that honestly said 'never' for 81 seconds.

backupproxmoxpbsstorage
storage & media
5 min read
2026-10-07
A Tear in the Painting: a rift in the guard's hood

The front page of michaelz.dev is a painting with a hooded guard, and the hood is the login. Now there's a starry rift in his face that opens into the live solar system, without breaking the sign-in and on a GPU budget written by a broken phone.

frontendcanvascssperformance
platform
4 min read
2026-10-01
Enabled, and Dead for Three Weeks

Two orchestrator self-checks, every five minutes and every six hours, had not run for 21 days, and systemctl said they were enabled the whole time. One Requires= line on a timer turned an ordinary restart into a silent off switch.

systemdmonitoringdebugging
platform
3 min read
2026-10-01
The Watchdog That Couldn't See the Fall

My main server has no remote console, so I armed a reboot watchdog to rescue a hung restart. During a kernel update it hung for six minutes and the watchdog did nothing. It never could have: it lives inside the kernel that had already gone.

proxmoxkernelhardware
platform
3 min read
2026-10-01
The 4 a.m. Intruder Was the Cat

A 4:52 alert said a person was in the flat while we were both away. It was the cat, and my own vision model had already said so. A cautious fallback sentence turned "I can't confirm" into "someone was detected". Plus: deciding which failure direction is the dangerous one.

home-assistantcatsautomationdebugging
home
5 min read
2026-10-01
The Frame That Poisoned the Model

Everything Was Green, part III. My camera narrator kept going blind for half an hour at a time. Four days of theories rested on a benchmark that was never a control. The cause was one frame in seventy, and a retry that faithfully re-sent the poison.

aigpudebuggingstatistics
AI & agents
4 min read
2026-10-01
Thirteen Healthy Services, All Reported Sick

A new Diagnose button called a container I'd just used "unhealthy". Nine more agreed. The health check and the restart had different ideas of what each service is called, and the map itself named three programs that weren't there.

orchestratormonitoringdebugging
platform
3 min read

AUGUST 2026

2026-08-16
The Word That Broke My Assistant

I asked my house assistant about a script and it answered fluently, with correct sources, about something else entirely — because my question contained the word "before". Auditing the neighbouring words found worse, including one hiding inside "keep-alive".

airagnlpdebugging
AI & agents
6 min read
2026-08-16
Everything Was Green, Part II: six weeks of all quiet

My camera's away-alert had been switched off since July, and every health check was green. Worse: the house briefing had been confidently reporting "all quiet" the whole time — because the only thing that writes that data was the thing that was off.

monitoringautomationhome-assistantdebugging
home
5 min read
2026-08-16
Everything Was Green: a memory bug wearing a parsing bug's clothes

My camera's AI narrator started failing with a parsing error. Six health checks, six green lights, and a feature that plainly didn't work. The cause was three programs quietly fighting over one graphics card — and 70x slower output getting truncated mid-sentence.

aigpudebuggingmonitoring
AI & agents
6 min read

JULY 2026

2026-07-25
The four systems that run my house

A deterministic engine with no AI in it, an AI agent that watches, a HUD where I get to say no, and a folder of markdown that remembers everything. How they fit together — and why the interesting part is how they refuse to trust each other.

orchestratoragentsragarchitecture
AI & agents
10 min read
2026-07-20
It Was the ISP (and I Could Prove It): diagnosing an outage from the inside

The internet vanished from the whole apartment, with everything on my side healthy. A WAN capture showed my requests leaving and nothing answering — while the ISP's own gateway was alive on the wire. The proof it was upstream came from the one workaround that didn't work.

networkingispdhcp
network
5 min read
2026-07-20
The Dishwasher That Wouldn't Move: two sessions to change one VLAN

Moving one Siemens dishwasher onto an IoT VLAN took two sessions and a fight with Home Connect's idea of "home". The isolation I built to protect the network turned around and blocked me from managing the very device it was isolating.

vlaniothome-connect
network
5 min read
2026-07-20
The Outage That Wasn't: when my own tools lied to me

I built DNS failover, tested it, watched it "fail", panicked, and made a real mess — before discovering my own diagnostic tools had been lying the entire time. The DNS never actually broke.

dnsdnsmasqdebugging
network
4 min read
2026-07-12
Bricked by Someone Else's Outage: when a CDN wouldn't let my house boot

I clicked "Update" on Home Assistant and the whole apartment went dumb — stuck NOT_RUNNING. The cause wasn't my config. A download server three time zones away was returning 522, and the twist is that rollback couldn't have saved me either.

home-assistantdependenciesoutage
home
5 min read
2026-07-12
Connected, and Completely Dead: the TV that lied about its WiFi

Full signal bars, right network, strong connection — and 100% packet loss. My living-room TV was a WiFi zombie, and the culprit was a radar-avoidance rule baked into the 5 GHz band I never should have been sitting on.

wifiopenwrtdfs
network
4 min read
2026-07-11
Everyone Looks Local: the reverse proxy that lied about my friends

My friends' streams kept buffering, and the remote bitrate cap I set did absolutely nothing. Because behind a reverse proxy, every client on earth looks like it's sitting on my couch — until you teach the app who the proxy is.

jellyfinreverse-proxynetworking
storage & media
4 min read
2026-07-11
Half a Terabyte of Déjà Vu: the torrent client that cloned my library

My media pool was filling up with nothing new. Every movie existed twice — once seeding, once in the library — and the fix was one line of filesystem theory I'd drawn a boundary straight through.

qbittorrentstoragezfs
storage & media
4 min read

JUNE 2026

2026-06-14
Ghosts in the Machine, Part II: the WiFi that wouldn't roam

A sequel. The network was always there — my laptop just refused to roam properly. Three ghosts (an amnesiac daemon, a phantom radio, a port poltergeist), one watchdog, and the one bug I chose to live with.

openwrtnetworkingdebugging
network
4 min read
2026-06-14
The cat is not allowed to trigger automations

Her name is Pixel, she's four kilograms, and she's the single most important constraint in my entire home-automation design. Why every scene in my apartment is a manual button.

home-assistantautomationcats
home
3 min read
2026-06-14
My homelab fixes itself

A disk filled up, and by the time I reached for my phone it had already been investigated and reported. Building an autonomous ops brain — and the layers of paranoia that make it safe to run.

orchestratorsrefastapi
platform
4 min read
2026-06-14
No Docker. On purpose.

I run ~24 services and not one Docker container. Native systemd in unprivileged LXC instead — the reasoning, the real tradeoffs, and who should (and shouldn't) copy it.

proxmoxlxcopinion
platform
3 min read
2026-06-13
Photo Memories: phone → cloud → living-room TV

Building the loop I actually wanted from a homelab: photos leave my phone, land in my own cloud, and play on the TV — without my 400 screenshots of parking signs tagging along.

nextcloudjellyfinhome-assistant
storage & media
3 min read
2026-06-13
The Calendar Saga: a war story against FullCalendar

All I wanted was a Google-style month view in Home Assistant with events that span days as bars. What I got was a multi-hour fight with a shadow DOM and the word "+more". Here's how it ended.

home-assistantcssfrontend
home
3 min read
2026-06-13
The Ghost in the NIC: chasing an e1000e hardware hang

My backup node kept vanishing from the network at random. No panic, no logs that mattered — just silence. The culprit turned out to be a 15-year-old Intel driver bug, and the fix was three words long.

proxmoxhardwaredebugging
platform
3 min read