Developer, musician, committed geek. Writing about all three since 2007.
Twenty-odd years building things on the web — currently CPTO at Think Digital Group / Asset TV, half of PolyOrbit, and the one-person team behind Dotvault and Edmund. Most of what I do has a thread of considerate AI running through it these days — at work, and on side projects that probably wouldn't otherwise exist. This is where the rest of it lives: code notes, music posts, half-finished ideas, and the occasional strong opinion.
A docs chat that refuses to guess
No chunking, no vector database, and a validator that throws away answers the model cannot prove. What we shipped in Media Manager, with the numbers.
Rebuilding a 19-year-old blog: the technical version
The companion to the comeback post: the decisions, the gotchas, and the URL contract behind a five-hour Astro rebuild.
I tried to rewrite Dotvault in Swift ↗
I got a full Swift rewrite of Dotvault surprisingly far before deleting the lot. Rewriting things in Swift is fun. Selling software is not.
I kept losing my best ideas, so I built Edmund
The thought never turns up when you are sat at the right screen. So I built the app I wanted — one place to catch it, on-device AI to file it. Edmund is now in private beta.
Passwords are a liability. Laravel finally has first-party passkeys.
Laravel now ships a first-party passkeys package that plugs into Fortify. Wiring up the WebAuthn ceremony is the easy part — the interesting work is what passwordless does to the rest of your auth.
Stop your agents fighting over one test database
Run several coding agents in parallel git worktrees and they all hammer the same test database. Here is the small shim that gives each one its own.
Ten years off, five hours back on
This site sat untouched from 2016 to 2026. Why I nearly closed it three times, why I didn't, and what it took to drag it back in five working hours — with help.
Your secrets stay on your machine — here's how I keep it that way ↗
How Dotvault sends anonymous telemetry and crash reports without ever touching your `.env` files.