A neon with GO word

A Practical guide to building a parser in Go

A developer’s journey of building a recursive descent parser in Go, from basic concepts to tackling left recursion with Packrat memoization.

2026-01-04 · 11 min · Tom
Screenshot of Transmission error and denial messages

Transmission: Permission Denied to Downloads directory

Transmission on Ubuntu may be denied access to localized Downloads directories due to AppArmor profiles expecting English folder names. Here’s how to fix it.

2025-12-26 · 4 min · Tom
A photo of sandwitch with many layers, symbolizing Docker layers

Squashing Docker images with Buildx

Learn how to squash Docker images using Buildx to create smaller, more efficient images by consolidating layers.

2025-12-24 · 4 min · Tom
A terminal window showing a git commit command with a Conventional Commits 'bang' causing an error.

Zsh 'illegal modifier' with Git Conventional Commits

Fix ZSH ‘illegal modifier’ errors with Git Conventional Commits by disabling the NO_BANG_HIST option.

2025-12-19 · 2 min · Tom
Photo of 4 clocks in different timezones

I made Windows use UTC with Linux dual boot

Configure Windows to use UTC for the hardware clock when dual-booting with Linux, avoiding time synchronization issues and maintaining Linux defaults.

2025-12-14 · 2 min · Tom
A WD Elements 20TB hard drive box

Shucking WD Elements 20TB

A detailed guide on shucking WD Elements 20TB drives, including testing, performance benchmarks, and stress testing.

2025-11-30 · 3 min · Tom
Digital Photo Frame

Generating Miniatures for my Frameo Digital Photo Frame

A story of how I bought a digital photo frame, and how I created a tool to generate miniatures of my photo collection to fit them all on the device.

2025-11-28 · 7 min · Tom
Marp logo

Create Markdown presentations with Marp

Learn how to create beautiful slide decks with Markdown and Marp, a simple and powerful tool for presentations.

2025-11-06 · 4 min · Tom
screenshot from Gemini CLI

Running Gemini CLI in a Docker container

Learn how to run Google’s Gemini CLI in a Docker container to avoid installing Node.js and its dependencies directly on your system. This guide provides a simple setup, a recommended shell function for seamless integration, and usage examples.

2025-10-31 · 2 min · Tom
Photo of hands between human and robot as reference to the creation of Adam painting

How to add llms.txt to a Hugo Blog

Learn how to add an llms.txt file to your Hugo blog to make it more visible to AI agents and improve Generative Engine Optimization (GEO).

2025-10-16 · 4 min · Tom