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.
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.
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.
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.
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.
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.
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.
Petal Components is the open source UI library we wish we had had. The idea behind it, and what passing 1.4 million downloads showed us about what Phoenix developers actually want.
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.
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.
The upgrade to Tailwind v4 touched every component we ship. What changed, and why the pc- prefix matters more than it looks.
We built a kindness marketplace in the middle of lockdown. It reached more than 20,000 volunteers and taught me more about product than any calm year could have.
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.
The hardest part of bringing on other developers wasn't the technical side. It was learning to hand something over and actually let go of it.
A clinic's phone never stops, and the front desk can't be in two places at once. HealthVoice answers the calls. The hard part wasn't the AI, it was deciding when it should get out of the way.
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.
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.
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.
Wicked Sites has never taken a dollar of outside money. Building it taught me every part of a business, usually because there was no one else to do it.
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.
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 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.
Why I built this site: a public record of what I make, what I ship, and what I learn along the way.