Blog
Deep dives into technical challenges I've tackled, from teaching an AI dog new tricks to wrestling with WebSockets. These posts explore the reality of software development - accidental rabbit holes and JSON-induced existential crisis.

Building a Live London Underground Tracker: Learning Go From Scratch
How I learned Go by building a real-time London Underground tracker, featuring concurrent polling, WebSockets, and lots of debugging.

Express Error Handling: Because Things Will Go Wrong
From try-catch hell to elegant error handling: A deep dive into implementing robust error handling in Express with TypeScript, custom error types, and global middleware.

Making Wooster Talk: A Deep Dive into Structured Logging
From chaotic console.logs to structured logging: How Wooster learned to communicate clearly using Pino, environment-aware configuration, and proper log levels.

From Fetch Mocks to MSW: A Testing Journey
How a simple Axios refactor led me down the path of modernizing my test mocks with Mock Service Worker, and the valuable lessons learned along the way.

Refactoring Wooster's API Layer: A Simple Approach with Axios
Moving from fetch to Axios: simplifying API calls, adding interceptors for authentication, and improving error handling - all while following the official documentation patterns.

Deploying Wooster: A Tale of Memory Limits and Nginx Configs
Adventures in deploying an AI travel planner: memory limits, OAuth drama, and rate limits.

State Management: Teaching Wooster to Remember Things
Building a clean, efficient state management system for Wooster using React, Supabase, and TypeScript: a look into reducer patterns, data fetching, caching strategies, and lessons learned from minimizing useEffect usage.

Structuring the Front End: Building Wooster's User Interface
Creating a well-structured front end for Wooster with a feature-driven component architecture, engaging UI, and a balance of simplicity and interactivity.

Building a Scalable Express Backend for Wooster
From MVC architecture to endpoint design: Building a scalable Express backend that even a golden retriever could understand.

Teaching an AI Dog New Tricks (The Gemini Integration)
Integrating Google's Gemini API to give Wooster its personality: prompt engineering, response parsing, and teaching an AI to think like a golden retriever.

Building Wooster's Backend Brain
Teaching an AI dog new tricks: database design, Express endpoints, and why I'm probably overthinking this.

Full Stack in a Week: Building an AI Trip Planner
Building a full-stack AI trip planner in one week - featuring a golden retriever named Wooster

State Management Archaeology: Untangling a React Codebase
From 30 state variables to 9: A deep dive into refactoring React state management, eliminating unnecessary effects, and building a maintainable architecture through testing.
Hugo with the flow
How I used Hugo to automate my blog static site generation, and how to set up Hugo with an existing website

Dancing in the Dark (Designing A Portfolio Site)
My first ever article! My design philosophy for this portfolio.