October 8, 2026
The Database Remembered Root
Building Audiobookshelf through GitOps with a ConfigMap, retained storage, a non-root runtime and a Cloudflare Tunnel credential protected by SOPS.
October 8, 2026
Building Audiobookshelf through GitOps with a ConfigMap, retained storage, a non-root runtime and a Cloudflare Tunnel credential protected by SOPS.
September 28, 2026
Renaming the homelab repository was straightforward. Moving two live Grafana Secrets between Flux Kustomizations meant handing over ownership without letting pruning delete them.
September 15, 2026
Renovate's first run offered a Flux upgrade and three overlapping PRs. An hourly job, an encrypted token, and a useful reminder to read what the bot proposes.
September 9, 2026
I wanted to stop port-forwarding Grafana. Along the way: an overdue chart upgrade, encrypted credentials, and a certificate my browser quite reasonably refused to trust.
September 4, 2026
Deploying kube-prometheus-stack through Flux and Helm, then tracing a pruning cascade through Git and recovering the cluster from desired state.
September 1, 2026
Using SOPS, age and Flux to make Kubernetes Secrets encrypted in Git, recoverable by the cluster and useful only where they are needed.
August 29, 2026
Publishing Linkding through a locally managed Cloudflare Tunnel while keeping the Kubernetes Service private and the tunnel credential out of Git.
August 23, 2026
Using Flux, K3s local-path storage and Kubernetes security contexts to make Linkding survive pod replacement without leaving its container running as root.
August 18, 2026
Bootstrapping Flux into my K3s homelab and turning a GitHub repository into the declared source of cluster state.
August 17, 2026
Installing K3s on the ZBook, investigating two deceptively similar Helm flags and securely managing the cluster from my MacBook.