Writing on building web products and small internet businesses.

Longer-form pieces on what I’m building and learning: Elixir and Phoenix, web development, and the realities of running products on the internet. Newest first.

Border plasma, and a busy month on Petal Components

Since the playground shipped we have pushed nine releases in about a month. A glowing new border effect, a searchable select that fought back, and a lesson about z-index I should have known.

Building a live playground for Petal Components

We built a place where you can see every Petal component, dial in your own colours and radius, and watch the whole library restyle live. All in LiveView.

Rebuilding Petal Pro for an AI-first world

Petal Pro started as a Phoenix boilerplate with auth and billing baked in. v4 rethinks it around how people actually build now, with an agent in the loop from the first commit.

How I actually build now

I don't think of myself as a full-time developer. I think of myself as a technologist who ships. Here's what AI changed about the day-to-day, and what it didn't.

Teaching AI assistants to write Phoenix UI

If an agent is going to write your HEEx, it should reach for real components instead of inventing Tailwind soup. That is why we built an MCP server for Petal Components.

Designing multi-tenancy in Petal Pro

Most real SaaS apps are multi-tenant sooner than they expect. Here is how Petal Pro models organisations, memberships, and per-org billing so you do not have to invent it under deadline.

Killing our Alpine.js dependency

Petal Components used to lean on Alpine for interactivity. Moving that to Phoenix’s own LiveView.JS made the library lighter and more at home in a Phoenix app.

Moving Petal Components to Tailwind v4

The upgrade to Tailwind v4 touched every component we ship. What changed, and why the pc- prefix matters more than it looks.

From law to code

People assume I have always built software. I have not. The path from a Melbourne law office to shipping products people use every day was anything but straight.

My first app, built end to end

The Yoto Developer Challenge got me to ship a complete app on my own, back-end and all. I didn't win. I walked away with something I wanted far more.

Designing Doseloop dark-mode-first

Most health apps feel like a spreadsheet or a hospital. I wanted Doseloop to feel calm. Here is what designing it dark-mode-first taught me about front-end craft.

Building Talentbookr for a friend

A friend had a sharp idea for booking live entertainment and needed someone who could take it from a sketch to a real product. That someone was me.

The most valuable hour of any project

The hour you spend scoping a project properly saves you weeks later. Here is how I run it, and why clients rarely see it as the most important thing we do together.

Turning our fridge chart into a Yoto app

A hand-drawn sticker chart for my son is becoming Chores + Rewards, my entry for the Yoto developer challenge. Here is what I'm setting out to build, and the two bets I'm making.

The last ten percent

The difference between an interface that works and one that feels finished is a hundred small decisions no one puts on a feature list. That last ten percent is most of the craft.

Hello, world

Why I built this site: a public record of what I make, what I ship, and what I learn along the way.