What actually happened.
Decisions, trade-offs, and the occasional postmortem — filed close to when they happened, not smoothed over after the fact.
Isolating the Management Plane
Why the network that can reboot the hypervisor is kept off the network that serves requests, and what that buys when something gets compromised.
A Backup Gap We Haven't Closed Yet
Production data currently has no verified off-node restore path. This is a tracked, open risk, not a resolved incident: here's the honest risk model.
Six Categories, Chosen Before the First Post
Why this blog launched as an empty collection with a fixed six-category enum decided in advance, instead of open-ended tags growing organically.
Back to Deploying Everything, Every Run
A path-detection optimization that only redeployed what changed produced silent false negatives on fresh checkouts. We reverted to deploying everything, every run.
One VPN Would Have Been Simpler, and Wrong
Why privileged admin access and general access run over two separate WireGuard-style tunnels, and why every peer is a device, not a person.
Placing Workloads by Bottleneck, Not by Convenience
On a small cluster, every node has a different bottleneck. Placement decisions should follow that, not a uniform template applied to all three.
Adding a New Service
What adding a new service to a personal infrastructure platform actually requires beyond starting a container: network placement, ingress, observability wiring, secrets, and backup.
Every Page Is Its Own File
A documented convention in this codebase: route files contain the page's markup directly instead of re-exporting a single component, and the one honest trade-off it accepts.
Metrics, Logs, and Uptime Are Not the Same Signal
Metrics, logs, and uptime checks are different signal types answering different questions, not one generic monitoring bucket, even on tiny personal infrastructure.