◂ michaelz.dev // writeups

Writeups

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.

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
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
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
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
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
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
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
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
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
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
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
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
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
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
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