Posts
All the articles I've posted.

How Claude Code Ended My Out-of-Hours Waiting Game
Updated:Deploying to sites on the other side of the globe meant staying up out of hours, waiting for a late engineer and an unpredictable Cloudflare tunnel before I could rerun a playbook. Claude Code's first answer was a working cron job. It took two more rounds of pushback before the answer actually fit the problem.

Two Claude Code Tools Worth Keeping: Serena and Ponytail
Most of my days now are spent reviewing code an AI wrote rather than writing it. Two tools have changed how I do that: Serena, which navigates code by symbol rather than by file, and Ponytail, which pushes toward the smallest correct change. I audited whether each one earned its place, and what I found.

Fixing the Lights on My Wisper 806 eBike (and Bypassing a Blown Controller)
A non-waterproof connector finally gave up on my folding eBike's front light, and fixing it properly turned into a much bigger job: a blown controller, a bypass switch wired into a tight compartment, and a rear light with the wrong connector gender. Three bad design decisions, one afternoon of soldering.

The Day Claude Code Got Creative With Legacy Python
My code is modern Python with strict typing that needs 3.10+. The targets were a fleet of field devices stuck on Python 3.6, no internet access, and a main application that depends on that 3.6 staying exactly as it is. Here's how Claude Code talked its way out of that corner - and how it proved the plan worked before I let it near a real device.

Git and apt via SSH Reverse Tunnel
Updated:Some customer sites block outbound SSH, and sometimes HTTP/HTTPS too, which breaks git, apt and pip on the remote machine even when everything is otherwise configured correctly. A reverse SSH tunnel piggybacks on the inbound connection you already have to route that traffic back out through your own machine instead…

Running Python 3.12 on Ubuntu 18.04 without touching apt
A fleet of field devices stuck on Ubuntu 18.04 and Python 3.6.9 needed a business application requiring Python 3.10+. No OS upgrade, no apt, no compiler, no internet access from the device, and no changes to the system Python - built on the Ansible controller and pushed over the SSH connection already in place.

Naming Bluetooth Devices with bluetoothctl
I have the same keyboard at home and at work, and telling them apart in the Bluetooth menu was impossible - worse still with three remembered connections for what should only be two devices. BlueZ supports a per-device alias, and bluetoothctl makes it easy to set from the terminal.

LVM Volume Still Showing After Removing the Disk
A 54GB LVM volume kept showing up in Nautilus as mountable, weeks after I'd unmounted it and physically removed the disk it lived on. pvs, vgs and lvs all said there was nothing there. The real answer was one level lower, in device-mapper.

NFS Hang Troubleshooting Guide
Updated:I've been struggling with a docker container that accesses my NAS using NFS mounts, it hangs and refusing to restart on demand. Turns out it's related to NFS mounts. I've been struggling to kill the process as it just sits there as a zombie. Symptoms ps aux command hangs and never completes Process stuck in…

Installing Windows 11 Home: A Rant
Installing Windows 11 Home for my nephew turned into a fight over a mandatory Microsoft account, a fake choice about advertising, a desktop full of promotional junk, and an idle system already burning through RAM before I'd opened a single app. The Linux install it wasn't.