Blog
On software development, technical decision-making, and building production systems.
What actually goes into shipping a production release when you're the only one who can break it.
CSV imports, API syncing, and webhook handling are the unglamorous core of SaaS — here's what I've learned building them
A concrete account of what Cursor does well, where I override it, and how the workflow has evolved as the tooling has changed
Production systems can't be taken offline for a rewrite. Here's how I approach making significant structural changes without breaking things users depend on.
Before you wireframe a single screen, you need to understand the shape of your data — because the schema is the real design
The difference between "minimum viable" and "half-finished"
Why the best code in the world doesn't matter if the client doesn't understand what's happening
Building for musicians isn't just a UI challenge — it requires understanding a domain with its own vocabulary, workflows, and professional expectations
Hard-won opinions on REST conventions, error handling, and pagination from building APIs across a lot of different projects
What to test, what not to test, and why 100% coverage is a vanity metric
Why reaching for familiar tools usually beats chasing new ones
The decision to take on technical debt is a resource allocation call, not a lapse in discipline — and treating it like one leads to worse outcomes
Where AI tools genuinely help in development, where they fall short, and what it means for the quality of work you receive.
Why PHP and Joomla systems persist for rational reasons, when modernization actually makes sense, and what good technical advice looks like.
The case for working with a solo senior developer over an agency — and an honest account of where the model falls short.
Treating your website as a case study rather than a brochure — and why the site itself demonstrates competence better than any list of client logos.