Everything I write is for all skill levels, from complete beginner to expert. The guides run from your very first container through to zero-trust networking, infrastructure as code and Kubernetes.
New to self-hosting? The Docker series takes you from nothing installed to a running stack, one part at a time. No prior experience needed.
Weekly, on where tech is heading. Written by someone who has been pulling technology apart since he was a kid, and still is.
The Corporate Creep of Plex: Why It May Be Time to Move to Jellyfin Ad-supported tiers, centralised auth and a $750 lifetime pass. What you give up when the media server you run at home starts answering to someone else.
New piece every Thursday.
- Get Started with Docker, Part 7: Real-Time Container Log Monitoring with Dozzle
- Get Started with Docker, Part 6b: Clientless Remote Desktop with Apache Guacamole
- Get Started with Docker, Part 6a: Secure Remote Access with Cloudflare Tunnel
LGTV-Firmware-Downgrade Downgrading webOS firmware on LG TVs so you can root them. The guide the rooting community forks.
Capo2Keys Converts guitar chord charts to piano keys and keeps the lyrics lined up. Built with Python and Flask.
PowerCSR A GUI for generating certificate signing requests, so you don’t have to remember the OpenSSL flags. Built with PowerShell.
Exchange-ToolboxV2 Menu-driven mailbox administration for Microsoft Exchange.
More tools
- GIPHY-Linker generates HTML embed code for GIFs.
- DevToEmbedder generates embed markup for blogging platforms.
A home data centre that runs itself. Every machine is configured from code, so nothing is set up by hand and then forgotten about.
flowchart TB
NET["Internet"] --> CF["Cloudflare Tunnel<br/>HA pair"]
NET -. admin VPN .-> TS["Tailscale"]
CF --> PVE["Proxmox VE"]
TS --> PVE
ANS["Ansible · GitOps"] -. declarative state .-> PVE
PVE --> DOCK["Docker stacks"]
PVE --> PI["Bare-metal control node"]
DOCK --> OBS["Grafana · Prometheus"]
DOCK --> SVC["DNS · Vaults · Media"]
- Nothing is exposed to the internet. Traffic arrives through a redundant pair of Cloudflare tunnels, and I get in over a private Tailscale network. No ports open on the router.
- Two layers of hardware. A Proxmox hypervisor runs the virtual machines, and a Raspberry Pi (
pibuster4) sits alongside it on bare metal as the control node. - Configured from a git repo. Ansible pushes the same declared state to every machine, so rebuilding one is a command rather than an afternoon.
- DNS that survives a reboot. Two Pi-hole resolvers kept in sync, so ad-blocking and name resolution don’t die with one box.
- The monitoring lives somewhere else. The main status monitor runs on its own separate hardware, so when a machine goes down the thing watching it is still up to tell me.
- CI checks the infrastructure hasn’t drifted. A nightly pipeline compares what Terraform says should exist against what actually does, and flags the difference.
Virtualisation and compute
Containers and orchestration
Automation and infrastructure as code
Networking and zero trust
Full stack including observability, security, storage, Microsoft, media and web
CI/CD and DevSecOps
Observability
Storage, backup and security
Microsoft and enterprise
Media and self-hosting
Dev and web
Currently migrating core services from Docker to Kubernetes (K3s).
Twelve small web portals I wrote to run the place: restore verification, DNS failover health, container-to-Kubernetes resource sizing and hardware allocation. They run on the control node and aren’t public, but they are the reason the fleet is manageable by one person.
Service Desk Sim, a game about the job. servicedesksim.com
Away from the terminal I make music at allcloudsrun.com.



