I design systems, both technical and human.
CTO at Agility CMS, exploring software, third spaces, football 🏈, theatre, and modern life.

The libretto for Mamma Mia

Back to the Stage - and It’s a New Stage

For the first time since 2019, I’m rehearsing a show as an actor. I’ve been cast as β€œSam” in Mamma Mia with the Northumberland Players!

Read more→

Using MCP to Bulk Upload Blog Posts: The Final Step

The final piece of the puzzle: using Claude Code and the Agility CMS MCP server to bulk upload 18 blog posts documenting this entire journey. What took minutes would have taken hours manually - and it demonstrates the power of AI-assisted content management.

Read more→

Switching from Cursor to Claude Code: A New Development Partner

I started building this personal website using Cursor as my primary AI coding assistant. But here's the thing about AI development tools - they're evolving rapidly, and it's worth experimenting. Today I switched to Claude Code to see how it handles project handoff and continuation.

Read more→

Refactoring Markdown Gallery Processing: A Deep Dive

The blog system supports seven different gallery types that can be embedded in markdown. We refactored the gallery processing into a proper Remark plugin that follows the unified/remark ecosystem patterns.

Read more→

Series Feature Implementation

The Series feature allows grouping blog posts into series with dedicated landing pages. Each series has a title and slug, a markdown summary that displays at the top of the landing page, and a filtered list of blog posts that belong to the series.

Read more→

Upgrading the Career Timeline with 8star Labs

I decided to upgrade the career timeline component to use a more polished, professional timeline from 8star Labs. The original custom timeline was functional, but I wanted something with better visual hierarchy and a more refined look.

Read more→

Blog Details Component: The dynamicPageItem Discovery

After fixing the content loading issue in all Agility components, I was still getting 'Page Not Found' errors on blog post detail pages. The issue was in the BlogDetails component - it was trying to find the blog post using complex logic when Agility CMS was already providing the blog post directly.

Read more→

The Agility Component Content Loading Mistake

When building the Agility CMS components for this site, I ran into a consistent issue where components weren't loading their content properly. The problem? The AI agent was trying to access module.fields directly, assuming the fields would be available on the module object passed to the component.

Read more→

Sample Content Creation for Testing

The agent created sample content so we can test everything. Some things worked, some didn't - that's the reality of working with APIs and content management systems.

Read more→

Phase 9: Testing & QA Setup

I've set up the testing infrastructure, but we can't do full testing until we have content in the CMS. The agent created Playwright tests, Lighthouse CI configuration, and GitHub Actions workflows.

Read more→