Blog

Kubernetes, GitOps, homelab, observability — and the occasional planted aquarium.

Dozzle: When You Don't Need an Observability Stack

I spent two posts shaping telemetry with OTTL and profiling the fourth signal. My homelab runs a log viewer that starts in ten seconds. Both are correct - and knowing which problem you have is the entire skill.

Eighteen Days of Silence: How a Zero-Byte File Stopped My Blog

A stale .git/index.lock froze every write in my working copy for nine days. Nothing alerted, because the error was only ever visible to the process that tried to write. A postmortem, and the five assertions I am adding.

The CI That Lives in Your Cluster: Argo Events and Workflows

Part two of the series: how a Codeberg webhook becomes a running pipeline with no CI vendor in between. Argo Events catches it, Argo Workflows runs it, one generic pipeline serves every tenant - and a deadman cron makes silence impossible.

From Git Push to Production Without a CI Vendor

My deployments have no GitHub Actions and no Jenkins. A webhook, Argo Events, Argo Workflows, Kargo and k6 take a git push all the way to a blue/green production rollout - and the whole control plane lives in one repo.

The Agent Doesn't Fail by Being Wrong. It Fails by Passing Your Test.

The dangerous failure mode of AI coding agents isn't hallucination - it's a correct answer to the wrong question. On minimalism vs features, agents as reviewers, and optimising the signal you show them.

zoxide: The cd Command That Learns Where You Work

zoxide replaces cd with frecency-based jumps: type a fragment, land in the right directory. How it works, how it pairs with wt worktrees, and the cold-start caveat the README won't lead with.

OpenTelemetry Profiling: The Fourth Signal, and Why It's Not Quite Ready

Profiling is OpenTelemetry's fourth signal - which function eats your CPU, at cluster scale, continuously. The data model, the eBPF two-collector setup, and an honest look at what OTTL still can't do with it.

Shaping Telemetry Before It Costs You: OTTL in the OpenTelemetry Collector

The OpenTelemetry Collector lets you enrich, redact, and cut cardinality without touching application code - using OTTL. Pipeline order, the cache trick, and the silent failure modes that make it feel broken.

pass: Your Terminal Is Already a Secrets Manager

pass is a password manager that's really just GPG plus git. Per-repo secret stores that replace .env - and an honest look at what that does and doesn't buy an AI agent.

Five Container-Image Corrections DevOps Keeps Getting Wrong

Alpine vs slim is a libc decision, not a size one. Five container-build corrections, the caveats the confident version leaves out, and my own Dockerfile audited against them.

The Shortest Stave: What Liebig's Law of the Minimum Teaches About Distributed Systems

A 19th-century plant-nutrition principle is the same idea as the bottleneck in a distributed system: one limiting factor caps the whole.

I Let an AI Re-Platform My CI Pipeline. Here's What Broke.

I handed a CI migration from GitHub Actions to Argo Workflows to an AI agent. It passed lint and left six latent bugs. This is the debugging saga.

When Your Homelab Grows Up: How SQLite Took Down My k3s Control Plane

A postmortem from my Hetzner k3s cluster: how the default SQLite/kine datastore hit a compaction death-spiral, and why I moved to embedded etcd.

Branches as Directories: wt Worktree Manager in My Daily Workflow

How I replaced git checkout with wt, a worktree manager giving every branch its own directory, with shell auto-navigation for parallel work.

Zero-Friction Terminal Sessions: sesh and tmux in My Daily Workflow

How I turned tmux into a self-organizing workspace with sesh: named sessions, auto-launched tools, and one-keystroke switching across projects.

Terminal-First GitHub: gh CLI and gh-dash in My Daily Workflow

How I replaced the GitHub web UI with gh CLI and gh-dash, a TUI dashboard putting PRs, issues and AI code review one keypress away.

KWOK: Simulate a 1000-Node Kubernetes Cluster on Your Laptop

A deep dive into KWOK (Kubernetes WithOut Kubelet): how it simulates thousands of nodes in seconds, when to use it, and how to wire it into CI.

My Note-Taking System: From Chaos to Second Brain

A guide to building a robust, scalable, and future-proof note-taking system using Obsidian, Neovim, and Markdown, optimized for thinking over time.

Unifying My Smart Home and Homelab: Bridging Home Assistant MQTT to a Kubernetes Data Platform

Integrating Home Assistant's MQTT data with EMQX, InfluxDB and Grafana on a k3d Kubernetes cluster for long-term storage and analytics.

Configuration as Code: My NixOS and macOS Setup

How I use Nix, Nix Flakes, and Home Manager to create fully reproducible and declarative configurations for my NixOS and macOS systems.

GitOps Foundation: ArgoCD and Enterprise Secrets Management

How to bootstrap a GitOps workflow with ArgoCD, Sealed Secrets and External Secrets Operator, including Azure Key Vault integration.

Podman vs Docker Desktop: Choose Your Runtime

Based on community feedback, the homelab project now supports both Podman and Docker Desktop. Here's how to choose and switch between them.

Building a Production-Grade Kubernetes Homelab on macOS: The Complete Guide

Build a portable, cloud-native Kubernetes environment on macOS with Podman and k3d: NFS storage, Tailscale networking, and the architecture decisions.

The Aquarium Hobby: It's Not a Philosophy, It's a Survival Strategy (DIY Edition). 😅

The aquarium hobby as a DIY survival strategy: building HydroSense, an open-source IoT system for smart aquarium control, starting from old hardware.

Balance - the Heartbeat of a Planted Aquarium

Exploring the balance in planted aquariums, from the Redfield Ratio to modern monitoring, and what this microcosm teaches about nature and technology.

When Work and Passion Start Speaking the Same Language

A reflection on connecting DevOps and Kubernetes work with a passion for aquariums: the shared ground of monitoring, automation and stability.