Work

I have built software in very different rooms: a large enterprise, two early-stage startups, consulting engagements and my own products.

What changed over time was not only the technology. It was how much of the problem I was responsible for.

Project 1

Rebuilding a booking flow that people could finish

A booking product where most people gave up halfway. We rebuilt the flow around the three decisions that actually mattered and doubled completion.

TypeScript, Next.js, Node.js, PostgreSQL

Most abandoned flows are not a design problem or an engineering problem. They are a problem of asking for things in the wrong order.

Project 2

A design system three teams actually used

Two previous attempts at a shared component library had been abandoned. This one survived, mostly because we built it from what already shipped instead of from an ideal.

TypeScript, React, Storybook, CSS

A design system is not a library. It is an agreement, and the library is only how the agreement gets enforced.

Project 3

Cutting a page load from nine seconds to under two

A content site was slow enough that people left before it rendered. Fixing it needed measurement first, and turned out to be four changes rather than forty.

Next.js, Cloudflare, Lighthouse CI

Performance work goes wrong when it starts with a list of best practices instead of a measurement of what is actually slow.

Project 4

Replacing a spreadsheet that ran a business

The operations team ran on one shared spreadsheet with 40,000 rows and eight people editing it. Replacing it was less about software than about understanding what the spreadsheet was really doing.

TypeScript, Node.js, PostgreSQL, Docker

When you replace a spreadsheet, you are replacing a process that grew to fit real work. Copy the process before you improve it.

Project 5

Taking my own product to its first hundred customers

I built and launched a small product on my own. Building it took four months. Finding out whether anyone wanted it took considerably longer, and taught me more.

Next.js, Node.js, PostgreSQL, Stripe

Building the software was the easiest part. A product becomes a business only once people can find it, trust it, and keep paying for it.

Project 1 of 5

  • Project 1

    Rebuilding a booking flow that people could finish

    A booking product where most people gave up halfway. We rebuilt the flow around the three decisions that actually mattered and doubled completion.

    TypeScript, Next.js, Node.js, PostgreSQL

    Most abandoned flows are not a design problem or an engineering problem. They are a problem of asking for things in the wrong order.

  • Project 2

    A design system three teams actually used

    Two previous attempts at a shared component library had been abandoned. This one survived, mostly because we built it from what already shipped instead of from an ideal.

    TypeScript, React, Storybook, CSS

    A design system is not a library. It is an agreement, and the library is only how the agreement gets enforced.

  • Project 3

    Cutting a page load from nine seconds to under two

    A content site was slow enough that people left before it rendered. Fixing it needed measurement first, and turned out to be four changes rather than forty.

    Next.js, Cloudflare, Lighthouse CI

    Performance work goes wrong when it starts with a list of best practices instead of a measurement of what is actually slow.

  • Project 4

    Replacing a spreadsheet that ran a business

    The operations team ran on one shared spreadsheet with 40,000 rows and eight people editing it. Replacing it was less about software than about understanding what the spreadsheet was really doing.

    TypeScript, Node.js, PostgreSQL, Docker

    When you replace a spreadsheet, you are replacing a process that grew to fit real work. Copy the process before you improve it.

  • Project 5

    Taking my own product to its first hundred customers

    I built and launched a small product on my own. Building it took four months. Finding out whether anyone wanted it took considerably longer, and taught me more.

    Next.js, Node.js, PostgreSQL, Stripe

    Building the software was the easiest part. A product becomes a business only once people can find it, trust it, and keep paying for it.

Not everything worth building deserves to become a case study.

The lab is where smaller experiments live: prototypes, half-ideas and things I am still figuring out in public.

I am most useful where the technical question is only one part of a larger product or business problem.