Skip to content

Topic

Engineering

Architecture, trade-offs and the decisions behind software that lasts.

Engineering

Seventeen years on both sides of the line

Most organisations separate the people who build software from the people who run it. I have spent my career doing both. Here is what that taught me about designing systems that survive contact with production.

Read

Security

Letting AI agents near production, carefully

AI agents are becoming colleagues with keyboards. After years of managing who can do what on servers, I've applied the same principles to them — least privilege, explicit actors, approvals and honest boundaries — across four tools I build.

Read

Operations

Release scripts that refuse to half-ship

The worst release is the one that stops halfway — a tag pushed, a package published, the documentation still describing last week. Every project I ship uses the same pattern to make that impossible: check everything, ask once, then do it all.

Read

Product

Why this site runs on a CMS I built

Every developer eventually writes a content management system. I did it on purpose, after years of installing, patching and rescuing other people's. These are the decisions that made Nibble — and the one I got wrong first.

Read

Engineering

SQLite is enough (for most of us)

For most of my career, "which database?" meant "which database server?" Today my default is a file. Here is how to run SQLite in production properly — WAL, backups, honest limits — and when to move on.

Read