Blog
Practical notes on building useful software, choosing the right technical approach, and making better decisions about web projects.
Stop passing primitives around: Laravel value objects in practice
A practical Laravel value object pattern for stopping invalid primitive values from travelling through your app.
Monorepo vs polyrepo: when a monorepo makes sense for tightly coupled apps
How moving three tightly coupled client apps into one monorepo cut releases and PRs from three to one, and why repo boundaries should follow coupling, not habit.
The agentic coding workflow I use in OpenCode
How Propulsion grew out of a bloated AGENTS.md, what each workflow stage does in OpenCode, and why developers should build agentic workflows that fit how they think.
Document your units (or production will do it for you)
A practical way to prevent unit bugs in config: put the unit in the name, and promote values into a value object at runtime.
Safely adding non-nullable columns in Laravel without breaking production
A production-safe rollout pattern for adding a new NOT NULL column to a table that already has data: add it nullable, backfill safely, then enforce constraints when you can prove it is clean.
From Laravel to Astro: why I rebuilt my site with the right tool for the job
Why I moved my personal site from Laravel to Astro, what changed, and what I learned about performance, maintenance, and choosing the right tool for content-driven websites.
OpenCode AI coding agent review
Why I switched from Claude Code and how OpenCode’s model-agnostic approach fits daily development workflows
How I structure Laravel support services so I can swap vendors without a refactor
A contract-first pattern for Laravel support services: define an interface, implement providers behind it, and bind it in a service provider so you can swap (or conditionally select) vendor packages later.
How to use mixins in Laravel with Macroable
A practical guide to organising Laravel macros into mixins for cleaner, maintainable, and type-friendly extensions, with a request helper example.
