The notebook
Notes on design,
and shipping solo.
Things I’ve learned building accessible public services and characterful products — from accessibility and design systems to the details of shipping. Written for people who build.
Latest thinking
Most recent firstRunning Next.js 16 on Cloudflare Workers: what actually breaks
OpenNext gets you 90% of the way. The last 10% — patch scripts, Node APIs, and edge quirks — is where the real work lives.
Circuit breakers, graceful degradation, and UIs that stay calm
When TMDB goes down, Horrorometer doesn’t. The resilience patterns that keep an external-API-dependent product from melting.
Accessible by default: how I bake it in from the first sketch
Accessibility isn’t a checklist at the end — it’s a posture. Here’s how I keep it present from wireframe through to production code.
The OAuth device flow is a state machine, not a form
Implementing RFC 8628 taught me more about race conditions than any CRUD app ever did. Here’s where the concurrent states bite.
A vine, not a tree: how Stay With Me: Deep Sea stays shippable
Branching stories die of unsustainability. The design rules — from Lifeline’s creators — that keep a 30,000-word real-time narrative buildable.
What local government taught me about design
Public services can’t assume a willing user. Eight years of designing for people who have to be there changed how I build everything.
Shipping solo: what I learned building three live products
Horrorometer, Kanaboards, and SENDadvisor all started as itches I wanted to scratch. Some patterns held across all three — and a few surprised me.
A directory is a pipeline with a UI on the front
11,000+ SENDadvisor listings, four pipeline stages, and a state machine that keeps half-finished data off the public site.
My AI coding stack, honestly
OpenCode, Codex, and Claude as teammates — not toys. What I hand to agents, what I never do, and what changed about how I plan work.
Designing for stressful systems: lessons from SENDadvisor
Families navigating SEND services are already overwhelmed. How do you design a directory that feels calm, trustworthy, and genuinely useful?
Every decision in this site, and why
A self-review: the design and build choices behind this portfolio — the ones that worked, the ones I’d change, and the reasoning.
Design tokens that enforce contrast so you never audit again
A colour system where 4.5:1 is a property of the token, not a review step. How to build one, and how it fails.
Agents on the board: planning with coding agents as teammates
Kanaboards started with a question: what if AI coding agents could read and update the same planning surface as the humans? Here’s what that looks like.
Prototype with real users or don’t call it testing
Rapid prototyping in local government: what I test, what I deliberately leave broken, and how a week of paper beats a month of opinions.
153 local authorities, one calm page each
The Local Offer pages were supposed to be a small feature. They became one of the most-used parts of SENDadvisor — here’s why.
One number can’t describe a scare
Why Horrorometer rates films on Creepy, Gory, and Jumpy instead of five stars — and what a week of rating-system design taught me about taste.
What two security audits taught me to fix first
31 audit cards, two formal reviews, and the checklist I now run before shipping anything with an auth flow.
Design systems that survive other teams
A component library is code. A design system is an agreement. What makes one hold up when five teams pull it in different directions.
Operations for one: running three products without a team
Backups with restore drills, cron hygiene, and the Saturday-morning checklist that keeps three live products from keeping me up.
Designing dread: the UX of a horror game
Horrorometer and Stay With Me: Deep Sea both design fear, from opposite directions — what dread teaches a product designer about attention and time.
prefers-reduced-motion is not an accessibility tax
Motion design that respects reduced motion from the start — and ends up calmer, faster, and better for every user.