All Articles


All Articles

2026

Sep 16 - AI Decisions Just Got 100 Times Cheaper

Sep 11 - (I Am No Longer) Coding With AI

Sep 11 - AI Progress Is Accelerating. Here Is Why It Feels Slow

Sep 10 - Webinar: Make Your AI Rollout Stick

Sep 9 - Prompt Evals Alone Are Useless

Aug 27 - A Thousand Flowers Is Not Enough

Aug 19 - Software Factories Can Handle UX

Aug 13 - The Harness Is The Bottleneck

Jul 28 - Intelligence Cost Is Collapsing

Jul 9 - Webinar: What CEOs Must Do Next About AI

Jun 30 - Don't Just Give Everyone an AI

Jun 23 - Slice Your Job Into Skills

Jun 17 - Skills Are Meant For Sharing

Jun 5 - Stop Saving Tokens. Start Writing Scripts.

Jun 4 - Webinar: Escape the Great AI Lock-In

May 19 - I Don't Want an AI God

May 15 - Open Models Are Ready

May 14 - Webinar: Unblock Your Team

May 12 - Polished Consensus Is Boring

May 10 - Ralph In One Line, No Setup

May 7 - Engineering in 2028

May 1 - What To Put In Your AI Knowledge Base

Apr 22 - How I Use AI to Code

Apr 17 - Truman Would Have Taken Over AI by Now

Apr 10 - Build An AI Knowledge Base From Scratch

Apr 8 - Ralph Loops Live at AI Engineer Europe 2026

Mar 26 - Webinar: AI Has a People Problem

Mar 20 - Stop Prompting, Start Briefing

Mar 13 - Feedback Is the New Bottleneck

Mar 9 - The AI Leadership Lab at CTO Craft

Mar 5 - Webinar: Let AI Do Your Work

Feb 26 - Lockbox: Constrain Your Bots To Set Them Free

Feb 24 - Code Review Is Dying

Feb 18 - Your Bot Is Your Responsibility

Feb 5 - AI Guardrails Do Not Work (Yet)

Feb 5 - Webinar: Ship While You Sleep

Feb 3 - Run Claude Code From Your Phone

Feb 3 - Don't Let Your CEO Install OpenClaw

Feb 2 - Dial-Up AI Is Ending

Jan 27 - AI Must Be Line Managed

Jan 25 - Skills Are Claude Code's Secret Weapon

Jan 21 - AI Is Still Searching for a Home

Jan 16 - Where Did My Day Go? A Claude Code Skill for Remembering

Jan 15 - Stop AI Stealing From You

Jan 14 - Running Ralph Loops Is Easy

Jan 13 - Your Agent Orchestrator Is Too Clever

Jan 8 - Webinar: Are We Behind in AI?

2025

Dec 31 - My AI Predictions for 2026

Dec 15 - See Three Kings Of Inference Spar

Dec 15 - The Missing Peer Group for AI Leaders

Dec 12 - ChatGPT Is Terraforming Earth

Dec 9 - The Slow And Dangerous Loss Of Self

Dec 8 - OpenAI's Code Red Is Your Window

Dec 4 - Why AI-Fast Teams Still Ship Slowly

Nov 27 - AI Slop Is Real. Model Collapse Isn't.

Nov 25 - How to React to a New Frontier Model

Nov 6 - Claude Code Is For Everything

Oct 23 - Who wants a browser?

Oct 21 - Which Coding Agent Is Best? (Head-to-Head Test)

Oct 16 - Ditch Autocomplete

Oct 14 - AI Teams Need Tortoises Not Hares

Oct 7 - AgentKit Helps Its Competitors

Oct 2 - Why Your AI Output Is Slop

Sep 19 - AI Is Consistently Mediocre. That's Why It's Valuable.

Sep 4 - How Not to Screw Up Your AI Rollout

Aug 29 - Chatbots Are the Wrong Tool for AI Writing

Aug 28 - Coding with AI: How To Do It Well And What It Means For The Industry

Aug 8 - Independent Coding Agents Aren't Ready

Aug 7 - Is AI Unshippable? (Lessons from Doing It)

Aug 6 - Doing Real Work with AI Just Became 150x Cheaper

Jul 31 - Parallel AI Agents Create Unusable Code

Jul 9 - Beyond the Demo: Building LLM Applications That Actually Ship

Jul 2 - You Should Kill Your Prompts

Jun 6 - AI Needs More From You

Jun 5 - The AI Tools Actually Worth Using

May 24 - How I Make Complex AI Changes

May 15 - Four Hours, One AI App, Many Lessons

May 12 - AI Might Save Software Craft

May 6 - Hiring Startup Engineers: a field manual

May 1 - Graph RAG is the Future

Apr 24 - I Built Kaijo to Fix Unreliable AI

Apr 22 - The AI Agent Opportunity Is Too Big to Ignore

Apr 14 - The AI Climate Panic Is Wrong

Apr 7 - Rehearse Hard Conversations with AI

Apr 1 - Always Be Unblocking

Mar 27 - Why Time Units Beat Story Points Every Time

Mar 26 - Startup Success Stories Are Flawed

Mar 25 - How To Get Clarity With a New Tech Team

Feb 15 - How to Rebrand Your Mobile App (Without Breaking Everything)

Feb 10 - How To Avoid Bad Startup Culture

Feb 9 - Prompting Sucks (And What We Can Do About It)

Jan 22 - Founder mode is emergency surgery

2024

Dec 13 - How to Build a Robust LLM Application

Dec 6 - Why Hybrid Work Works

Dec 1 - The Job Is Not To Build

Nov 25 - Your Code Is A Liability

Nov 22 - The First Thing A Startup CTO Must Do

Nov 19 - Blogging again after a long hiatus

2017

Dec 30 - A new adventure

Nov 19 - Ealdorlight: A Kickstarter retrospective

Jun 6 - Ealdorlight's Kickstarter is live at 4pm today

May 10 - How Ealdorlight's story stands out

Apr 28 - Ealdorlight Kickstarter on 6th June, Sol Trader 1.3 released

Mar 31 - Introducing: Ealdorlight

Feb 22 - What's next for Sol Trader and me

Jan 6 - How to lead your life

2016

Jun 28 - 5 ways I screwed up Sol Trader's launch: a post-mortem

May 4 - Extreme YAGNI: How BDD nails your prototyping stage

Feb 9 - Gossip: the best new Sol Trader feature for ages

Jan 28 - The top 5 space games of 2015

Jan 25 - Sol Trader at EGX Rezzed: 7-9 April 2016

Jan 12 - The cunning plans of Sol Trader

Jan 1 - Full disclosure: Sol Trader conversation upgrades

2015

Dec 24 - The Sol Trader Christmas Eve update: moddable missions

Dec 2 - New Sol Trader beta: the science of blame and unforgiveness

Nov 27 - Modelling opinions and prejudices in Sol Trader

Nov 11 - Sol Trader combat preview

Oct 2 - Why (I hope) I will weather the Indiepocalypse

Sep 21 - Sol Trader Kickstarter now live!

Sep 18 - Three days to go

Sep 3 - Gossip as a game mechanic

Aug 19 - How to add live code reload to your game

Aug 1 - Why I wrote Sol Trader's GUI code from scratch

Jul 22 - Sol Trader will be at EGX in September!

Jul 18 - 3 new screenshots of Sol Trader's new interface

Jul 17 - Trailer: How it will feel to move around Sol Trader's cities

Jun 24 - How Sol Trader uses information as currency

Jun 17 - The difference review and planning makes to indie development

Jun 10 - How to quickly add bloom to your game engine

Jun 3 - The huge difference a good Entity System could make to your game

May 27 - How tone of voice works in Sol Trader's dialogue system

May 20 - Never, ever, ever, ever, ever give up

May 13 - How dialogue works in Sol Trader

May 6 - How face generation works in Sol Trader

Apr 28 - How I'm using Proxemics in Sol Trader's game design

Apr 22 - Why I ditched all the build tools in favour of a simple script

Apr 15 - How to choose between realism and fun in game design

Apr 8 - Your abstractions are a liability

Apr 1 - How I doubled the speed of my game by giving up on C++

Mar 25 - 4 things every space game must have

Mar 18 - After a long journey, Sol Trader has been greenlit!

Mar 11 - Why video game coders don't use TDD, and why it matters

Jan 7 - 7 things I've learnt in 3 years coding my first indie game

Jan 7 - New for 2015: Sol Trader now on Kickstarter

2014

Dec 2 - Why you can scale agile with the right attitudes

Aug 4 - Why BDD works solo, and why that matters for everyone

Jul 8 - How not to check in temporary code

May 7 - How to decide whether a tool is right for you

Apr 16 - 4 questions to discover if you're *really* agile...

Apr 14 - How to layer context into your features using Real Narrative

Feb 12 - Make Cucumber features more readable with this one weird trick

2013

Nov 26 - How to give BDD a chance

Nov 19 - BDD Kickstart is dead. Long live...

Nov 11 - How I learned to stop worrying and love (some) detailed Cucumber features

Oct 7 - Use Markdown to send HTML email via Mutt: now working on iOS mail

Sep 19 - The toolchain of dreams

Sep 2 - Extreme isolation part 3: coding a CRUD app (with full example)

Aug 29 - BDD: How to deal stories into features

Aug 9 - Why Continuous Delivery and BDD play so nicely

Aug 6 - Introducing Card Pirates

Jul 16 - Extreme isolation part 2: separate the domain from the changes

Jun 17 - Rack::Usermanual - Cucumber features as in-app user manual

May 14 - Slides for "Leading software teams well"

May 9 - Extreme isolation in web apps: part 1

Apr 26 - Features are documentation, not tests

Mar 6 - BDD without tools: testing shell script

Feb 7 - The perils of curiosity

Jan 21 - "Project velocity is a useless metric." Discuss.

Jan 16 - That's not BDD, that's just Cucumber

Jan 10 - Dependency injection != Inversion of Control

Jan 3 - BDD Kickstart: London and 2013 plans

2012

Dec 11 - Cucumber: keeping the build passing

Nov 23 - Scenarios are not Acceptance Criteria

Nov 15 - Cucumber: the integration testing trap

Nov 7 - Should we store state in our steps?

Oct 30 - How to write a great story

Oct 25 - The simplest Cucumber project ever

Oct 4 - Delegated tasks are a team anti-pattern

Sep 28 - Your framework is a liability

Sep 27 - OStatus: what I've learnt in 24 hours

Sep 26 - OStatus: like Twitter, but open

Sep 25 - Job titles are a team anti-pattern

Sep 21 - Introducing Morning Pages

Sep 20 - Never leave a failing test

Sep 19 - Cucumber isn't a testing tool

Sep 18 - The power of good naming

Sep 17 - Showroom software

Sep 14 - Task assignment is a team anti-pattern

Sep 13 - The power of feedback

Jul 27 - Kickstart your team on BDD

May 15 - Waxing Lyrical on Pathfinding

May 14 - Attempting validated learning with Sol Trader

May 2 - Sol Trader now in Alpha

Apr 16 - A fresh take on DCI with C++ (with example)

Mar 23 - Sol Trader: a continuous deployment story

Feb 17 - On coding defensively

Feb 14 - Sol Trader: on lighting

Feb 2 - Effective bloom in OpenGL for Sol Trader

Jan 16 - Switching Sol Trader from Ruby to C++: one week on

Jan 8 - Why I switched from Ruby back to C++

Jan 3 - Introducing Sol Trader

2011

Dec 14 - A cache-busting http server script in ruby

Dec 8 - Feature writing: multiple actors

Dec 6 - How I'm testing iPhone apps: part 2

Dec 1 - How I'm testing iPhone apps: part 1

Oct 17 - Your tests are lying to you

Sep 15 - Layers of abstraction: writing great cucumber code

Sep 12 - Kanogo: vapourware to beta in 24 hours

Sep 6 - Pin in the map: customisable pin icons

Sep 5 - Layers of abstraction: combining BDD and UX

Aug 30 - e-petitions: handling traffic

Aug 22 - Work with me

Jul 29 - e-petitions: deconstructed

May 26 - Lean code: slides and feedback

May 17 - Don't miss your greatest achievement

May 9 - The Principle of Scattered Work

May 6 - On Flow, and Katas

May 4 - On Office Politics

Apr 18 - Cucumbers with personality

Apr 15 - A formula of motivation

Apr 12 - Are apprenticeships scalable?

Apr 5 - The team is the atomic unit of success

Apr 5 - Certification: recommendation mass produced

Apr 4 - On the nature of time

Apr 1 - Pomodoros help you refactor

Mar 31 - Are coding katas really worth it?

Mar 30 - Learning to say Yes

Mar 29 - Truly indispensable people

Mar 28 - Pomodoros done (hopefully) right

Mar 25 - Eden Development has closed

2010

Nov 16 - How to get Spork working NOW on Rails 3, Rspec 2 and Cucumber

Nov 2 - How I'm writing my book using Vim, Git and Ruby

Oct 18 - Call for coders: Children's Future International

Jul 29 - My Polyphasic Sleep Experiment

Jul 22 - Card Of The Day: Actually Do Retrospective Actions

Jul 12 - 750words.com + GTD = Focus

May 23 - How to test your node.js app

May 21 - User Experience Is Everything

May 16 - Leancamp Report

May 12 - Every Ash Cloud Has A Silver Lining

Mar 29 - Announcing edash

Mar 22 - Multiple CI Joes with Rack and Passenger

Mar 22 - Radiating status at Eden

Mar 17 - Five things I learnt from Corey Haines

Mar 8 - Archivey the Robot

Mar 7 - Introducing Pushy - github notifications to google wave

Feb 21 - BBC Talk on A Philosophy of Software

Feb 11 - The Story Card Is Not The Story

Jan 27 - Pairing works for everything

Jan 15 - Driving out feature ambiguity

2009

Dec 29 - Old blog articles from yesteryear

Dec 23 - R.I.P. Web 1.0

Dec 20 - Snakes and Ladders Kata

Dec 15 - Craftsmanship vs. Apprenticeship

Dec 14 - Jekyll, the blog engine of kings

Dec 14 - Welcome

2006

Oct 24 - SVG Planner

Apr 11 - Spring Richclient ~ That's a wrap

Apr 1 - Spring Richclient ~ A Journey

Mar 9 - Spring Richclient ~ Session Eight ~ Such a bind

Mar 2 - Spring Richclient ~ Session Seven ~ Beating the Command Framework into Submission

Feb 16 - TDD ~ The Tortoise and the Hare

Feb 10 - Spring Richclient ~ Session Six ~ The View

Feb 3 - Spring Richclient ~ Session Five ~ Applications, windows, views

Jan 28 - Spring Richclient ~ Session One ~ Beans, Shmeans and services

Jan 26 - Spring Richclient ~ Session Three ~ How did that work then?

Jan 24 - Spring Richclient ~ Session Two ~ Hello World

Jan 23 - Spring Richclient ~ Session One ~ Making Petclinic work

Jan 23 - Spring Richclient ~ Introduction