Index

adn


e-petitions: handling traffic
e-petitions: deconstructed

agents


Webinar: AI Can Do (Most Of) Your Work
AI Decisions Just Got 100 Times Cheaper
Prompt Evals Alone Are Useless
The Harness Is The Bottleneck
I Don't Want an AI God
Open Models Are Ready
Lockbox: Constrain Your Bots To Set Them Free
Your Bot Is Your Responsibility
AI Guardrails Do Not Work (Yet)
Webinar: Ship While You Sleep
AI Is Still Searching for a Home
Who wants a browser?
Which Coding Agent Is Best? (Head-to-Head Test)
AgentKit Helps Its Competitors
Is AI Unshippable? (Lessons from Doing It)
You Should Kill Your Prompts

agile


Why Time Units Beat Story Points Every Time
Your Code Is A Liability
Why you can scale agile with the right attitudes
Why BDD works solo, and why that matters for everyone
4 questions to discover if you're *really* agile...
Make Cucumber features more readable with this one weird trick
How to give BDD a chance
Your framework is a liability
Job titles are a team anti-pattern
Attempting validated learning with Sol Trader
Sol Trader now in Alpha
Layers of abstraction: writing great cucumber code
Layers of abstraction: combining BDD and UX
e-petitions: handling traffic
Work with me
e-petitions: deconstructed
Cucumbers with personality
Card Of The Day: Actually Do Retrospective Actions
Radiating status at Eden
The Story Card Is Not The Story
Pairing works for everything

ai


Webinar: AI Can Do (Most Of) Your Work
(I Think Whilst) Writing With AI
Ship Like an Engineer Without Writing Any Code
Time To Hire An AI Head
Call It Machine Intelligence
AI Decisions Just Got 100 Times Cheaper
(I Am No Longer) Coding With AI
AI Progress Is Accelerating. Here Is Why It Feels Slow
Webinar: Make Your AI Rollout Stick
Prompt Evals Alone Are Useless
A Thousand Flowers Is Not Enough
Software Factories Can Handle UX
The Harness Is The Bottleneck
Intelligence Cost Is Collapsing
Webinar: What CEOs Must Do Next About AI
Don't Just Give Everyone an AI
Slice Your Job Into Skills
Skills Are Meant For Sharing
Stop Saving Tokens. Start Writing Scripts.
Webinar: Escape the Great AI Lock-In
I Don't Want an AI God
Open Models Are Ready
Webinar: Unblock Your Team
Polished Consensus Is Boring
Ralph In One Line, No Setup
Engineering in 2028
What To Put In Your AI Knowledge Base
How I Use AI to Code
Truman Would Have Taken Over AI by Now
Build An AI Knowledge Base From Scratch
Ralph Loops Live at AI Engineer Europe 2026
Webinar: AI Has a People Problem
Stop Prompting, Start Briefing
Feedback Is the New Bottleneck
The AI Leadership Lab at CTO Craft
Webinar: Let AI Do Your Work
Lockbox: Constrain Your Bots To Set Them Free
Code Review Is Dying
Your Bot Is Your Responsibility
AI Guardrails Do Not Work (Yet)
Webinar: Ship While You Sleep
Run Claude Code From Your Phone
Don't Let Your CEO Install OpenClaw
Dial-Up AI Is Ending
AI Must Be Line Managed
Skills Are Claude Code's Secret Weapon
AI Is Still Searching for a Home
Where Did My Day Go? A Claude Code Skill for Remembering
Stop AI Stealing From You
Running Ralph Loops Is Easy
Your Agent Orchestrator Is Too Clever
Webinar: Are We Behind in AI?
My AI Predictions for 2026
See Three Kings Of Inference Spar
The Missing Peer Group for AI Leaders
ChatGPT Is Terraforming Earth
The Slow And Dangerous Loss Of Self
OpenAI's Code Red Is Your Window
Why AI-First Teams Still Ship Slowly
AI Slop Is Real. Model Collapse Isn't.
How to React to a New Frontier Model
Claude Code Is For Everything
Who wants a browser?
Which Coding Agent Is Best? (Head-to-Head Test)
Ditch Autocomplete
AI Teams Need Tortoises Not Hares
AgentKit Helps Its Competitors
Why Your AI Output Is Slop
AI Is Consistently Mediocre. That's Why It's Valuable.
How Not to Screw Up Your AI Rollout
Chatbots Are the Wrong Tool for AI Writing
Coding with AI: How To Do It Well And What It Means For The Industry
Independent Coding Agents Aren't Ready
Is AI Unshippable? (Lessons from Doing It)
Doing Real Work with AI Just Became 150x Cheaper
Parallel AI Agents Create Unusable Code
Beyond the Demo: Building LLM Applications That Actually Ship
You Should Kill Your Prompts
AI Needs More From You
The AI Tools Actually Worth Using
How I Make Complex AI Changes
Four Hours, One AI App, Many Lessons
AI Might Save Software Craft
Graph RAG is the Future
I Built Kaijo to Fix Unreliable AI
The AI Agent Opportunity Is Too Big to Ignore
The AI Climate Panic Is Wrong
Rehearse Hard Conversations with AI
Prompting Sucks (And What We Can Do About It)
How to Build a Robust LLM Application

ambiguity


Driving out feature ambiguity

analysis


AI Progress Is Accelerating. Here Is Why It Feels Slow

anti-pattern


How to decide whether a tool is right for you
4 questions to discover if you're *really* agile...
Delegated tasks are a team anti-pattern
Job titles are a team anti-pattern
Task assignment is a team anti-pattern

apprenticeship


Are apprenticeships scalable?
Are coding katas really worth it?
BBC Talk on A Philosophy of Software
Driving out feature ambiguity
Craftsmanship vs. Apprenticeship

architecture


AI Might Save Software Craft

ashcloud


Every Ash Cloud Has A Silver Lining

automation


Webinar: Let AI Do Your Work
Webinar: Ship While You Sleep
Don't Let Your CEO Install OpenClaw
AI Must Be Line Managed

bdd


Extreme YAGNI: How BDD nails your prototyping stage
Why you can scale agile with the right attitudes
Why BDD works solo, and why that matters for everyone
How not to check in temporary code
How to decide whether a tool is right for you
4 questions to discover if you're *really* agile...
How to layer context into your features using Real Narrative
Make Cucumber features more readable with this one weird trick
How to give BDD a chance
BDD Kickstart is dead. Long live...
The toolchain of dreams
BDD: How to deal stories into features
Why Continuous Delivery and BDD play so nicely
Rack::Usermanual - Cucumber features as in-app user manual
Features are documentation, not tests
BDD without tools: testing shell script
The perils of curiosity
"Project velocity is a useless metric." Discuss.
That's not BDD, that's just Cucumber
Dependency injection != Inversion of Control
BDD Kickstart: London and 2013 plans
Cucumber: keeping the build passing
Scenarios are not Acceptance Criteria
Cucumber: the integration testing trap
Should we store state in our steps?
How to write a great story
The simplest Cucumber project ever
Cucumber isn't a testing tool
The power of feedback
Kickstart your team on BDD
Feature writing: multiple actors
How I'm testing iPhone apps: part 2
How I'm testing iPhone apps: part 1
Your tests are lying to you
Layers of abstraction: writing great cucumber code
Layers of abstraction: combining BDD and UX

bddkickstart


BDD Kickstart is dead. Long live...
BDD Kickstart: London and 2013 plans
How to write a great story
The simplest Cucumber project ever
Kickstart your team on BDD

bloom


How to quickly add bloom to your game engine
Effective bloom in OpenGL for Sol Trader

business


OpenAI's Code Red Is Your Window
Who wants a browser?
AgentKit Helps Its Competitors
I Built Kaijo to Fix Unreliable AI
The AI Agent Opportunity Is Too Big to Ignore
Startup Success Stories Are Flawed
Founder mode is emergency surgery
How to Build a Robust LLM Application
Why Hybrid Work Works
The Job Is Not To Build
The First Thing A Startup CTO Must Do
Blogging again after a long hiatus
A new adventure
5 ways I screwed up Sol Trader's launch: a post-mortem
Why (I hope) I will weather the Indiepocalypse
7 things I've learnt in 3 years coding my first indie game
New for 2015: Sol Trader now on Kickstarter
BDD Kickstart is dead. Long live...
Cucumber isn't a testing tool
Showroom software
Attempting validated learning with Sol Trader
Kanogo: vapourware to beta in 24 hours
The Principle of Scattered Work
On Office Politics
Are apprenticeships scalable?
The team is the atomic unit of success
Certification: recommendation mass produced
Eden Development has closed
User Experience Is Everything
R.I.P. Web 1.0

c++


How to add live code reload to your game
Why I wrote Sol Trader's GUI code from scratch
How to quickly add bloom to your game engine
Your abstractions are a liability
How I doubled the speed of my game by giving up on C++
A fresh take on DCI with C++ (with example)
Sol Trader: on lighting
Effective bloom in OpenGL for Sol Trader
Switching Sol Trader from Ruby to C++: one week on
Why I switched from Ruby back to C++

career


A new adventure
Eden Development has closed

certification


Certification: recommendation mass produced

charity


Call for coders: Children's Future International

chef


e-petitions: deconstructed

cherrypick


How to Build a Robust LLM Application
Why Hybrid Work Works

chicago


Every Ash Cloud Has A Silver Lining

cijoe


Multiple CI Joes with Rack and Passenger

claude-code


Lockbox: Constrain Your Bots To Set Them Free
Run Claude Code From Your Phone
Where Did My Day Go? A Claude Code Skill for Remembering

climate


ChatGPT Is Terraforming Earth
The AI Climate Panic Is Wrong

code


(I Am No Longer) Coding With AI
How I Use AI to Code
Coding with AI: How To Do It Well And What It Means For The Industry
How to Build a Robust LLM Application
Your Code Is A Liability
The Sol Trader Christmas Eve update: moddable missions
New Sol Trader beta: the science of blame and unforgiveness
Modelling opinions and prejudices in Sol Trader
Sol Trader combat preview
How to add live code reload to your game
Why I wrote Sol Trader's GUI code from scratch
The difference review and planning makes to indie development
How to quickly add bloom to your game engine
The huge difference a good Entity System could make to your game
How tone of voice works in Sol Trader's dialogue system
How dialogue works in Sol Trader
How face generation works in Sol Trader
How I'm using Proxemics in Sol Trader's game design
Why I ditched all the build tools in favour of a simple script
Your abstractions are a liability
How I doubled the speed of my game by giving up on C++
Why video game coders don't use TDD, and why it matters
7 things I've learnt in 3 years coding my first indie game
How not to check in temporary code
The toolchain of dreams
Extreme isolation part 3: coding a CRUD app (with full example)
Extreme isolation part 2: separate the domain from the changes
Rack::Usermanual - Cucumber features as in-app user manual
Extreme isolation in web apps: part 1
BDD without tools: testing shell script
Dependency injection != Inversion of Control
Cucumber: keeping the build passing
Your framework is a liability
Never leave a failing test
The power of good naming
Kickstart your team on BDD
Waxing Lyrical on Pathfinding
A fresh take on DCI with C++ (with example)
On coding defensively
Sol Trader: on lighting
Effective bloom in OpenGL for Sol Trader
Switching Sol Trader from Ruby to C++: one week on
Why I switched from Ruby back to C++
Introducing Sol Trader
A cache-busting http server script in ruby
Feature writing: multiple actors
How I'm testing iPhone apps: part 2
How I'm testing iPhone apps: part 1
Your tests are lying to you
Kanogo: vapourware to beta in 24 hours
Pin in the map: customisable pin icons
e-petitions: handling traffic
Work with me
e-petitions: deconstructed
Lean code: slides and feedback
Pomodoros help you refactor
Call for coders: Children's Future International
How to test your node.js app
Every Ash Cloud Has A Silver Lining
Five things I learnt from Corey Haines
Archivey the Robot
Introducing Pushy - github notifications to google wave

coding


Ship Like an Engineer Without Writing Any Code
Which Coding Agent Is Best? (Head-to-Head Test)
Ditch Autocomplete

compliance


Stop AI Stealing From You

conference


Sol Trader will be at EGX in September!
Slides for "Leading software teams well"
Waxing Lyrical on Pathfinding
Leancamp Report

config


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

continuous delivery


BDD Kickstart is dead. Long live...
The toolchain of dreams
Why Continuous Delivery and BDD play so nicely

continuous integration


Why I ditched all the build tools in favour of a simple script
The toolchain of dreams
Multiple CI Joes with Rack and Passenger

craftsmanship


(I Am No Longer) Coding With AI
How I Use AI to Code
Coding with AI: How To Do It Well And What It Means For The Industry
AI Might Save Software Craft
How to Build a Robust LLM Application
Extreme isolation part 2: separate the domain from the changes

crud


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

cto


Hiring Startup Engineers: a field manual
Always Be Unblocking
Why Time Units Beat Story Points Every Time
How To Get Clarity With a New Tech Team
Founder mode is emergency surgery
How to Build a Robust LLM Application
Why Hybrid Work Works
The Job Is Not To Build
The First Thing A Startup CTO Must Do

cucumber


Extreme YAGNI: How BDD nails your prototyping stage
Why BDD works solo, and why that matters for everyone
How to layer context into your features using Real Narrative
Make Cucumber features more readable with this one weird trick
BDD Kickstart is dead. Long live...
How I learned to stop worrying and love (some) detailed Cucumber features
Extreme isolation part 3: coding a CRUD app (with full example)
BDD: How to deal stories into features
Extreme isolation part 2: separate the domain from the changes
Rack::Usermanual - Cucumber features as in-app user manual
Extreme isolation in web apps: part 1
Features are documentation, not tests
That's not BDD, that's just Cucumber
Dependency injection != Inversion of Control
Cucumber: keeping the build passing
Scenarios are not Acceptance Criteria
Cucumber: the integration testing trap
Should we store state in our steps?
How to write a great story
The simplest Cucumber project ever
Cucumber isn't a testing tool
Kickstart your team on BDD
Feature writing: multiple actors
Your tests are lying to you
Layers of abstraction: writing great cucumber code
Pin in the map: customisable pin icons
Layers of abstraction: combining BDD and UX
Cucumbers with personality
How to get Spork working NOW on Rails 3, Rspec 2 and Cucumber
Driving out feature ambiguity

culture


Always Be Unblocking
How To Avoid Bad Startup Culture

cursor


AI Needs More From You

dci


A fresh take on DCI with C++ (with example)

design


Software Factories Can Handle UX

developer-experience


Ditch Autocomplete

development


(I Am No Longer) Coding With AI
How I Use AI to Code
Skills Are Claude Code's Secret Weapon
AI Is Consistently Mediocre. That's Why It's Valuable.
Coding with AI: How To Do It Well And What It Means For The Industry
Independent Coding Agents Aren't Ready
AI Might Save Software Craft

diy planner


SVG Planner

e-petitions


e-petitions: handling traffic
e-petitions: deconstructed

ealdorlight


Ealdorlight: A Kickstarter retrospective
Ealdorlight's Kickstarter is live at 4pm today
How Ealdorlight's story stands out
Ealdorlight Kickstarter on 6th June, Sol Trader 1.3 released
Introducing: Ealdorlight

economics


Intelligence Cost Is Collapsing
Open Models Are Ready
Dial-Up AI Is Ending
ChatGPT Is Terraforming Earth
Doing Real Work with AI Just Became 150x Cheaper

eden


Eden Development has closed
Radiating status at Eden
The Story Card Is Not The Story

egx


Sol Trader will be at EGX in September!

email


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

engineering


AI Decisions Just Got 100 Times Cheaper
Prompt Evals Alone Are Useless
The Harness Is The Bottleneck
Stop Saving Tokens. Start Writing Scripts.
Ralph In One Line, No Setup
Ralph Loops Live at AI Engineer Europe 2026
Stop Prompting, Start Briefing
Feedback Is the New Bottleneck
Code Review Is Dying
Don't Let Your CEO Install OpenClaw
AI Must Be Line Managed
Running Ralph Loops Is Easy
Your Agent Orchestrator Is Too Clever
Is AI Unshippable? (Lessons from Doing It)
Parallel AI Agents Create Unusable Code
Beyond the Demo: Building LLM Applications That Actually Ship
You Should Kill Your Prompts
AI Needs More From You
The AI Tools Actually Worth Using
How I Make Complex AI Changes
Four Hours, One AI App, Many Lessons
Hiring Startup Engineers: a field manual
Graph RAG is the Future
Always Be Unblocking
How to Rebrand Your Mobile App (Without Breaking Everything)
How To Avoid Bad Startup Culture
How to Build a Robust LLM Application

estimation


Why Time Units Beat Story Points Every Time

evaluation


How to React to a New Frontier Model

extreme isolation


Extreme isolation part 3: coding a CRUD app (with full example)
Extreme isolation part 2: separate the domain from the changes
Extreme isolation in web apps: part 1

feedback


"Project velocity is a useless metric." Discuss.
The power of feedback

flow


How to lead your life
On Flow, and Katas

founders


Founder mode is emergency surgery

fun


Introducing Card Pirates
Waxing Lyrical on Pathfinding
Snakes and Ladders Kata

functional programming


Your abstractions are a liability
Why video game coders don't use TDD, and why it matters
The perils of curiosity
That's not BDD, that's just Cucumber

game design


5 ways I screwed up Sol Trader's launch: a post-mortem
Gossip: the best new Sol Trader feature for ages
The top 5 space games of 2015
The cunning plans of Sol Trader
Full disclosure: Sol Trader conversation upgrades
The Sol Trader Christmas Eve update: moddable missions
New Sol Trader beta: the science of blame and unforgiveness
Modelling opinions and prejudices in Sol Trader
Sol Trader combat preview
Three days to go
Gossip as a game mechanic
How Sol Trader uses information as currency
How to quickly add bloom to your game engine
The huge difference a good Entity System could make to your game
How tone of voice works in Sol Trader's dialogue system
How dialogue works in Sol Trader
How face generation works in Sol Trader
How I'm using Proxemics in Sol Trader's game design
How to choose between realism and fun in game design
4 things every space game must have

game development


Ealdorlight: A Kickstarter retrospective
Ealdorlight's Kickstarter is live at 4pm today
How Ealdorlight's story stands out
Ealdorlight Kickstarter on 6th June, Sol Trader 1.3 released
Introducing: Ealdorlight
What's next for Sol Trader and me
5 ways I screwed up Sol Trader's launch: a post-mortem
Gossip: the best new Sol Trader feature for ages
The cunning plans of Sol Trader
Full disclosure: Sol Trader conversation upgrades
The Sol Trader Christmas Eve update: moddable missions
New Sol Trader beta: the science of blame and unforgiveness
Modelling opinions and prejudices in Sol Trader
Sol Trader combat preview
Sol Trader Kickstarter now live!
Three days to go
Gossip as a game mechanic
How to add live code reload to your game
Why I wrote Sol Trader's GUI code from scratch
Sol Trader will be at EGX in September!
3 new screenshots of Sol Trader's new interface
Trailer: How it will feel to move around Sol Trader's cities
How Sol Trader uses information as currency
The difference review and planning makes to indie development
How to quickly add bloom to your game engine
The huge difference a good Entity System could make to your game
How tone of voice works in Sol Trader's dialogue system
Never, ever, ever, ever, ever give up
How dialogue works in Sol Trader
How face generation works in Sol Trader
How I'm using Proxemics in Sol Trader's game design
Why I ditched all the build tools in favour of a simple script
How to choose between realism and fun in game design
Your abstractions are a liability
How I doubled the speed of my game by giving up on C++
4 things every space game must have
After a long journey, Sol Trader has been greenlit!
Why video game coders don't use TDD, and why it matters
7 things I've learnt in 3 years coding my first indie game
New for 2015: Sol Trader now on Kickstarter
Introducing Card Pirates
Sol Trader: on lighting
Effective bloom in OpenGL for Sol Trader
Switching Sol Trader from Ruby to C++: one week on
Why I switched from Ruby back to C++
Introducing Sol Trader

git


The toolchain of dreams
How I'm writing my book using Vim, Git and Ruby

google wave


Archivey the Robot
Introducing Pushy - github notifications to google wave

government


e-petitions: handling traffic
e-petitions: deconstructed

gower street


A new adventure

gtd


A formula of motivation
SVG Planner

heroku


Kanogo: vapourware to beta in 24 hours

hiring


Hiring Startup Engineers: a field manual

howto


Use Markdown to send HTML email via Mutt: now working on iOS mail
Multiple CI Joes with Rack and Passenger

index cards


Card Of The Day: Actually Do Retrospective Actions

indie games


Ealdorlight: A Kickstarter retrospective
Ealdorlight's Kickstarter is live at 4pm today
How Ealdorlight's story stands out
Ealdorlight Kickstarter on 6th June, Sol Trader 1.3 released
Introducing: Ealdorlight
What's next for Sol Trader and me
Gossip: the best new Sol Trader feature for ages
The top 5 space games of 2015
Sol Trader at EGX Rezzed: 7-9 April 2016
The cunning plans of Sol Trader
Full disclosure: Sol Trader conversation upgrades
The Sol Trader Christmas Eve update: moddable missions
New Sol Trader beta: the science of blame and unforgiveness
Modelling opinions and prejudices in Sol Trader
Sol Trader combat preview
Why (I hope) I will weather the Indiepocalypse
Never, ever, ever, ever, ever give up
How to choose between realism and fun in game design
4 things every space game must have
After a long journey, Sol Trader has been greenlit!
Why video game coders don't use TDD, and why it matters
New for 2015: Sol Trader now on Kickstarter

industry


AI Progress Is Accelerating. Here Is Why It Feels Slow

information radiator


Announcing edash
Radiating status at Eden

infrastructure


Independent Coding Agents Aren't Ready

ios


Use Markdown to send HTML email via Mutt: now working on iOS mail
How I'm testing iPhone apps: part 2
How I'm testing iPhone apps: part 1

java


Dependency injection != Inversion of Control
Spring Richclient ~ That's a wrap
Spring Richclient ~ A Journey
Spring Richclient ~ Session Eight ~ Such a bind
Spring Richclient ~ Session Seven ~ Beating the Command Framework into Submission
Spring Richclient ~ Session Six ~ The View
Spring Richclient ~ Session Five ~ Applications, windows, views
Spring Richclient ~ Session One ~ Beans, Shmeans and services
Spring Richclient ~ Session Three ~ How did that work then?
Spring Richclient ~ Session Two ~ Hello World
Spring Richclient ~ Session One ~ Making Petclinic work
Spring Richclient ~ Introduction

javascript


A cache-busting http server script in ruby
How to test your node.js app

jenkins


Sol Trader: a continuous deployment story

jobs


Why Hybrid Work Works

kaijo


I Built Kaijo to Fix Unreliable AI

kanban


The Story Card Is Not The Story

kano analysis


Kanogo: vapourware to beta in 24 hours

kanogo


Kanogo: vapourware to beta in 24 hours

karate


Are coding katas really worth it?

katas


Are coding katas really worth it?
Driving out feature ambiguity
Snakes and Ladders Kata

kickstart


BDD Kickstart is dead. Long live...
Why Continuous Delivery and BDD play so nicely

kickstarter


Ealdorlight: A Kickstarter retrospective
Ealdorlight's Kickstarter is live at 4pm today
How Ealdorlight's story stands out
Ealdorlight Kickstarter on 6th June, Sol Trader 1.3 released
Sol Trader Kickstarter now live!
Three days to go
Gossip as a game mechanic
7 things I've learnt in 3 years coding my first indie game
New for 2015: Sol Trader now on Kickstarter

knowledge-management


Chatbots Are the Wrong Tool for AI Writing

leadership


(I Think Whilst) Writing With AI
Time To Hire An AI Head
Call It Machine Intelligence
AI Decisions Just Got 100 Times Cheaper
Webinar: Make Your AI Rollout Stick
A Thousand Flowers Is Not Enough
Webinar: What CEOs Must Do Next About AI
Don't Just Give Everyone an AI
Slice Your Job Into Skills
Skills Are Meant For Sharing
Webinar: Escape the Great AI Lock-In
Webinar: Unblock Your Team
Polished Consensus Is Boring
Engineering in 2028
What To Put In Your AI Knowledge Base
Truman Would Have Taken Over AI by Now
Build An AI Knowledge Base From Scratch
Webinar: AI Has a People Problem
The AI Leadership Lab at CTO Craft
Webinar: Let AI Do Your Work
Webinar: Are We Behind in AI?
The Missing Peer Group for AI Leaders
The Slow And Dangerous Loss Of Self
Why AI-First Teams Still Ship Slowly
How Not to Screw Up Your AI Rollout
Always Be Unblocking
Why Time Units Beat Story Points Every Time
How To Get Clarity With a New Tech Team
How To Avoid Bad Startup Culture
Why you can scale agile with the right attitudes
How to give BDD a chance
Slides for "Leading software teams well"
Delegated tasks are a team anti-pattern

learning


How to lead your life
Attempting validated learning with Sol Trader

legacy


Pin in the map: customisable pin icons

liability


Your Code Is A Liability
Your abstractions are a liability
Your framework is a liability

life


Blogging again after a long hiatus
How to lead your life
Introducing Morning Pages
Introducing Sol Trader
Work with me
Don't miss your greatest achievement
The Principle of Scattered Work
A formula of motivation
On the nature of time
Are coding katas really worth it?
Learning to say Yes
Pomodoros done (hopefully) right
Eden Development has closed
My Polyphasic Sleep Experiment
750words.com + GTD = Focus

lighting


Sol Trader: on lighting

livestream


Four Hours, One AI App, Many Lessons

llm


Beyond the Demo: Building LLM Applications That Actually Ship

local-ai


Dial-Up AI Is Ending
Doing Real Work with AI Just Became 150x Cheaper

management


How To Get Clarity With a New Tech Team
How to give BDD a chance
Delegated tasks are a team anti-pattern

markdown


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

marketing


5 ways I screwed up Sol Trader's launch: a post-mortem
Sol Trader will be at EGX in September!
After a long journey, Sol Trader has been greenlit!

meta


Work with me
Old blog articles from yesteryear
Jekyll, the blog engine of kings
Welcome

mobile


How to Rebrand Your Mobile App (Without Breaking Everything)

motivation


How to lead your life
Never, ever, ever, ever, ever give up

mutt


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

node.js


How to test your node.js app

object oriented


Your abstractions are a liability
How I doubled the speed of my game by giving up on C++
The perils of curiosity

open data


OStatus: what I've learnt in 24 hours
OStatus: like Twitter, but open

open source


OStatus: what I've learnt in 24 hours
OStatus: like Twitter, but open

open-source


Open Models Are Ready
Doing Real Work with AI Just Became 150x Cheaper

opengl


How to quickly add bloom to your game engine
Sol Trader: on lighting
Effective bloom in OpenGL for Sol Trader

ostatus


OStatus: what I've learnt in 24 hours
OStatus: like Twitter, but open

pairing


Task assignment is a team anti-pattern
Pomodoros help you refactor
Every Ash Cloud Has A Silver Lining
Five things I learnt from Corey Haines
Pairing works for everything

paypal


Your framework is a liability

personal


Introducing Morning Pages
750words.com + GTD = Focus

personas


Cucumbers with personality

peter drucker


R.I.P. Web 1.0

pininthemap


Pin in the map: customisable pin icons

platform-engineering


AI Teams Need Tortoises Not Hares

pomodoros


A formula of motivation
On the nature of time
Pomodoros help you refactor

pragprowrimo


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

predictions


My AI Predictions for 2026

process


Why you can scale agile with the right attitudes
Why BDD works solo, and why that matters for everyone
How to decide whether a tool is right for you
4 questions to discover if you're *really* agile...
Make Cucumber features more readable with this one weird trick
"Project velocity is a useless metric." Discuss.
Cucumber: keeping the build passing
Delegated tasks are a team anti-pattern
Task assignment is a team anti-pattern
Card Of The Day: Actually Do Retrospective Actions

product


Software Factories Can Handle UX
I Built Kaijo to Fix Unreliable AI
The AI Agent Opportunity Is Too Big to Ignore
How to Rebrand Your Mobile App (Without Breaking Everything)
The Job Is Not To Build

productivity


Webinar: AI Can Do (Most Of) Your Work
Slice Your Job Into Skills
Skills Are Meant For Sharing
I Don't Want an AI God
Webinar: Unblock Your Team
What To Put In Your AI Knowledge Base
Build An AI Knowledge Base From Scratch
Stop Prompting, Start Briefing
Feedback Is the New Bottleneck
Run Claude Code From Your Phone
Skills Are Claude Code's Secret Weapon
See Three Kings Of Inference Spar
AI Slop Is Real. Model Collapse Isn't.
Why Your AI Output Is Slop
AI Is Consistently Mediocre. That's Why It's Valuable.
Chatbots Are the Wrong Tool for AI Writing
Parallel AI Agents Create Unusable Code
Rehearse Hard Conversations with AI
Prompting Sucks (And What We Can Do About It)
How to lead your life
How to add live code reload to your game
The difference review and planning makes to indie development
Never, ever, ever, ever, ever give up
"Project velocity is a useless metric." Discuss.
Delegated tasks are a team anti-pattern
Introducing Morning Pages
Task assignment is a team anti-pattern
Don't miss your greatest achievement
The Principle of Scattered Work
On Flow, and Katas
A formula of motivation
On the nature of time
Learning to say Yes
Truly indispensable people
Pomodoros done (hopefully) right
My Polyphasic Sleep Experiment
750words.com + GTD = Focus
Pairing works for everything
SVG Planner

products


Ealdorlight: A Kickstarter retrospective
Ealdorlight's Kickstarter is live at 4pm today
How Ealdorlight's story stands out
Ealdorlight Kickstarter on 6th June, Sol Trader 1.3 released
Introducing: Ealdorlight
What's next for Sol Trader and me
5 ways I screwed up Sol Trader's launch: a post-mortem
The perils of curiosity
Introducing Morning Pages
Showroom software
Attempting validated learning with Sol Trader
Sol Trader now in Alpha
Sol Trader: a continuous deployment story
Sol Trader: on lighting
Effective bloom in OpenGL for Sol Trader
Switching Sol Trader from Ruby to C++: one week on
Why I switched from Ruby back to C++
Introducing Sol Trader
Kanogo: vapourware to beta in 24 hours
Pin in the map: customisable pin icons

prompting


Prompting Sucks (And What We Can Do About It)

psychology


Rehearse Hard Conversations with AI
How I'm using Proxemics in Sol Trader's game design

rag


The AI Tools Actually Worth Using
Graph RAG is the Future

rails


The toolchain of dreams
Your tests are lying to you
Kanogo: vapourware to beta in 24 hours
How to get Spork working NOW on Rails 3, Rspec 2 and Cucumber

refactoring


Your abstractions are a liability
How not to check in temporary code
Extreme isolation part 2: separate the domain from the changes
Extreme isolation in web apps: part 1
The power of good naming

remote-development


Independent Coding Agents Aren't Ready

retrospectives


How To Get Clarity With a New Tech Team
Card Of The Day: Actually Do Retrospective Actions

revelation games


Ealdorlight: A Kickstarter retrospective

richclient


Spring Richclient ~ That's a wrap
Spring Richclient ~ A Journey
Spring Richclient ~ Session Eight ~ Such a bind
Spring Richclient ~ Session Seven ~ Beating the Command Framework into Submission
Spring Richclient ~ Session Six ~ The View
Spring Richclient ~ Session Five ~ Applications, windows, views
Spring Richclient ~ Session One ~ Beans, Shmeans and services
Spring Richclient ~ Session Three ~ How did that work then?
Spring Richclient ~ Session Two ~ Hello World
Spring Richclient ~ Session One ~ Making Petclinic work
Spring Richclient ~ Introduction

rspec


Your tests are lying to you
How to get Spork working NOW on Rails 3, Rspec 2 and Cucumber

ruby


How I learned to stop worrying and love (some) detailed Cucumber features
The toolchain of dreams
Extreme isolation part 3: coding a CRUD app (with full example)
Extreme isolation part 2: separate the domain from the changes
Extreme isolation in web apps: part 1
Features are documentation, not tests
Dependency injection != Inversion of Control
BDD Kickstart: London and 2013 plans
Should we store state in our steps?
Your framework is a liability
Kickstart your team on BDD
On coding defensively
Switching Sol Trader from Ruby to C++: one week on
Why I switched from Ruby back to C++
A cache-busting http server script in ruby
Kanogo: vapourware to beta in 24 hours
Pin in the map: customisable pin icons
How to get Spork working NOW on Rails 3, Rspec 2 and Cucumber
How I'm writing my book using Vim, Git and Ruby

sc2012


Waxing Lyrical on Pathfinding

scaling


e-petitions: handling traffic

scrum


Why Time Units Beat Story Points Every Time

security


Lockbox: Constrain Your Bots To Set Them Free
Your Bot Is Your Responsibility
AI Guardrails Do Not Work (Yet)
Stop AI Stealing From You
Who wants a browser?

shell script


BDD without tools: testing shell script

sinatra


Your framework is a liability

sleep


My Polyphasic Sleep Experiment

social


OStatus: what I've learnt in 24 hours
OStatus: like Twitter, but open

software craftsmanship


Waxing Lyrical on Pathfinding

sol trader


Parallel AI Agents Create Unusable Code
The Job Is Not To Build
Ealdorlight: A Kickstarter retrospective
Ealdorlight's Kickstarter is live at 4pm today
How Ealdorlight's story stands out
Ealdorlight Kickstarter on 6th June, Sol Trader 1.3 released
What's next for Sol Trader and me
5 ways I screwed up Sol Trader's launch: a post-mortem
Gossip: the best new Sol Trader feature for ages
Sol Trader at EGX Rezzed: 7-9 April 2016
The cunning plans of Sol Trader
Full disclosure: Sol Trader conversation upgrades
The Sol Trader Christmas Eve update: moddable missions
New Sol Trader beta: the science of blame and unforgiveness
Modelling opinions and prejudices in Sol Trader
Sol Trader combat preview
Why (I hope) I will weather the Indiepocalypse
Sol Trader Kickstarter now live!
Three days to go
Gossip as a game mechanic
How to add live code reload to your game
Why I wrote Sol Trader's GUI code from scratch
Sol Trader will be at EGX in September!
3 new screenshots of Sol Trader's new interface
Trailer: How it will feel to move around Sol Trader's cities
How Sol Trader uses information as currency
The difference review and planning makes to indie development
How to quickly add bloom to your game engine
The huge difference a good Entity System could make to your game
How tone of voice works in Sol Trader's dialogue system
How dialogue works in Sol Trader
How face generation works in Sol Trader
How I'm using Proxemics in Sol Trader's game design
Why I ditched all the build tools in favour of a simple script
How to choose between realism and fun in game design
How I doubled the speed of my game by giving up on C++
4 things every space game must have
After a long journey, Sol Trader has been greenlit!
Why video game coders don't use TDD, and why it matters
7 things I've learnt in 3 years coding my first indie game
New for 2015: Sol Trader now on Kickstarter
Extreme isolation part 2: separate the domain from the changes
Rack::Usermanual - Cucumber features as in-app user manual
Extreme isolation in web apps: part 1
Features are documentation, not tests
The perils of curiosity
Attempting validated learning with Sol Trader
Sol Trader now in Alpha
A fresh take on DCI with C++ (with example)
Sol Trader: a continuous deployment story
Sol Trader: on lighting
Effective bloom in OpenGL for Sol Trader
Switching Sol Trader from Ruby to C++: one week on
Why I switched from Ruby back to C++
Introducing Sol Trader

spork


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

spring


Spring Richclient ~ That's a wrap
Spring Richclient ~ A Journey
Spring Richclient ~ Session Eight ~ Such a bind
Spring Richclient ~ Session Seven ~ Beating the Command Framework into Submission
Spring Richclient ~ Session Six ~ The View
Spring Richclient ~ Session Five ~ Applications, windows, views
Spring Richclient ~ Session One ~ Beans, Shmeans and services
Spring Richclient ~ Session Three ~ How did that work then?
Spring Richclient ~ Session Two ~ Hello World
Spring Richclient ~ Session One ~ Making Petclinic work
Spring Richclient ~ Introduction

startup


Always Be Unblocking
How To Avoid Bad Startup Culture
Founder mode is emergency surgery
How to Build a Robust LLM Application
The Job Is Not To Build
Your Code Is A Liability
The First Thing A Startup CTO Must Do
Extreme YAGNI: How BDD nails your prototyping stage
The power of feedback
Attempting validated learning with Sol Trader
Sol Trader now in Alpha

startups


Startup Success Stories Are Flawed

state


Your abstractions are a liability
Extreme isolation part 3: coding a CRUD app (with full example)
Extreme isolation part 2: separate the domain from the changes
Extreme isolation in web apps: part 1
Features are documentation, not tests
Should we store state in our steps?

steam


After a long journey, Sol Trader has been greenlit!

stories


How to layer context into your features using Real Narrative
BDD: How to deal stories into features

strategy


Webinar: Make Your AI Rollout Stick
A Thousand Flowers Is Not Enough
Intelligence Cost Is Collapsing
Webinar: What CEOs Must Do Next About AI
Webinar: Escape the Great AI Lock-In
AI Is Still Searching for a Home
The Slow And Dangerous Loss Of Self
OpenAI's Code Red Is Your Window
How to React to a New Frontier Model
Who wants a browser?
AgentKit Helps Its Competitors
Startup Success Stories Are Flawed

svg


SVG Planner

talk


Ship Like an Engineer Without Writing Any Code
Don't Just Give Everyone an AI
Polished Consensus Is Boring
Engineering in 2028
The AI Leadership Lab at CTO Craft
Ditch Autocomplete
AI Teams Need Tortoises Not Hares
Beyond the Demo: Building LLM Applications That Actually Ship

talks


Lean code: slides and feedback
BBC Talk on A Philosophy of Software

tdd


Why video game coders don't use TDD, and why it matters
That's not BDD, that's just Cucumber
Scenarios are not Acceptance Criteria
Cucumber: the integration testing trap
Never leave a failing test
The power of feedback
How I'm testing iPhone apps: part 2
How I'm testing iPhone apps: part 1
Work with me
Pomodoros help you refactor
How to test your node.js app
TDD ~ The Tortoise and the Hare

team


Hiring Startup Engineers: a field manual
Why Time Units Beat Story Points Every Time
How To Get Clarity With a New Tech Team
Your Code Is A Liability
A new adventure
Extreme YAGNI: How BDD nails your prototyping stage
Why you can scale agile with the right attitudes
Why BDD works solo, and why that matters for everyone
How to give BDD a chance
Slides for "Leading software teams well"
Delegated tasks are a team anti-pattern
Job titles are a team anti-pattern
Cucumber isn't a testing tool
Task assignment is a team anti-pattern
On Office Politics
The team is the atomic unit of success
Truly indispensable people

team-topology


Don't Just Give Everyone an AI
Why AI-First Teams Still Ship Slowly
AI Teams Need Tortoises Not Hares

teams


Webinar: Unblock Your Team
Webinar: AI Has a People Problem

tech


The AI Tools Actually Worth Using

technology


ChatGPT Is Terraforming Earth
The AI Climate Panic Is Wrong

testing


Why video game coders don't use TDD, and why it matters
How I learned to stop worrying and love (some) detailed Cucumber features
Extreme isolation part 3: coding a CRUD app (with full example)
Extreme isolation part 2: separate the domain from the changes
Extreme isolation in web apps: part 1
The perils of curiosity
Cucumber: keeping the build passing
Scenarios are not Acceptance Criteria
Cucumber: the integration testing trap
Never leave a failing test
Cucumber isn't a testing tool

tools


Where Did My Day Go? A Claude Code Skill for Remembering
The AI Tools Actually Worth Using
Why I ditched all the build tools in favour of a simple script
How to decide whether a tool is right for you
4 questions to discover if you're *really* agile...
The toolchain of dreams

training


BDD Kickstart is dead. Long live...
How I learned to stop worrying and love (some) detailed Cucumber features
Work with me

transformation


How Not to Screw Up Your AI Rollout

travel


Every Ash Cloud Has A Silver Lining

tutorial


Spring Richclient ~ That's a wrap
Spring Richclient ~ A Journey
Spring Richclient ~ Session Eight ~ Such a bind
Spring Richclient ~ Session Seven ~ Beating the Command Framework into Submission
Spring Richclient ~ Session Six ~ The View
Spring Richclient ~ Session Five ~ Applications, windows, views
Spring Richclient ~ Session One ~ Beans, Shmeans and services
Spring Richclient ~ Session Three ~ How did that work then?
Spring Richclient ~ Session Two ~ Hello World
Spring Richclient ~ Session One ~ Making Petclinic work
Spring Richclient ~ Introduction

ux


Layers of abstraction: writing great cucumber code
Layers of abstraction: combining BDD and UX
Cucumbers with personality
User Experience Is Everything
R.I.P. Web 1.0

wardley maps


Coding with AI: How To Do It Well And What It Means For The Industry
Startup Success Stories Are Flawed

webinar


Webinar: AI Can Do (Most Of) Your Work
Webinar: Make Your AI Rollout Stick
Webinar: What CEOs Must Do Next About AI
Webinar: Escape the Great AI Lock-In
Webinar: Unblock Your Team
Webinar: AI Has a People Problem
Webinar: Let AI Do Your Work
Webinar: Ship While You Sleep
Stop AI Stealing From You
Webinar: Are We Behind in AI?
Why AI-First Teams Still Ship Slowly
Claude Code Is For Everything
Why Your AI Output Is Slop
How Not to Screw Up Your AI Rollout
Is AI Unshippable? (Lessons from Doing It)
You Should Kill Your Prompts
AI Needs More From You
How I Make Complex AI Changes
Four Hours, One AI App, Many Lessons

windows


Sol Trader: a continuous deployment story

workflow


How I Make Complex AI Changes

writing


(I Think Whilst) Writing With AI
AI Slop Is Real. Model Collapse Isn't.
Chatbots Are the Wrong Tool for AI Writing
Introducing Morning Pages
How I'm writing my book using Vim, Git and Ruby
750words.com + GTD = Focus

xp


The Story Card Is Not The Story
Pairing works for everything