Contact

Blog

Practical notes on building useful software, choosing the right technical approach, and making better decisions about web projects.

Moon Pixels blog thumbnail
4 Jun 20266 min read

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.

Moon Pixels blog thumbnail
22 Apr 202611 min read

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.

Moon Pixels blog thumbnail
8 Apr 202612 min read

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.

Moon Pixels blog thumbnail
26 Feb 20266 min read

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.

Moon Pixels blog thumbnail
8 Feb 20267 min read

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.

Moon Pixels blog thumbnail
31 Jan 20265 min read

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.

Moon Pixels blog thumbnail
13 Oct 20257 min read

OpenCode AI coding agent review

Why I switched from Claude Code and how OpenCode’s model-agnostic approach fits daily development workflows

Moon Pixels blog thumbnail
24 Aug 20257 min read

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.

Moon Pixels blog thumbnail
29 Jun 20256 min read

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.

Adam Hainsworth-Potter

Have an internal system that needs a safer pair of hands?

If a Laravel app, spreadsheet, or manual process is starting to hold the business up, tell me what is happening. I can help you work out whether it needs a build, a rescue, or a careful tidy-up.