About

Six years of making software feel lighter than it is.

I started in frontend because it was the layer where I could see the effect of a decision immediately. I stayed because the interesting problems turned out to live there: state that outgrows its container, motion that has to survive a slow network, a design system that four teams need to agree on.

These days I work mostly with product teams that have shipped a first version and now need it to hold. That means design systems, performance budgets, and the kind of motion work that makes a jump between screens feel like a move rather than a reload.

Outside work: long-exposure film photography, and a slowly growing collection of type specimens I cannot justify owning.

Toolkit
Building
TypeScript · React · Next.js · Svelte
Motion
GSAP · ScrollTrigger · Lenis · View Transitions
Styling
Tailwind · CSS Modules · HeroUI · Radix
Behind it
Node · Postgres · Prisma · Playwright

Working principles

Motion should explain, not perform

A transition earns its place when it tells you where you came from. Everything else is latency with a bow on it.

Design for the worst device in the room

If it holds up on a three-year-old Android on patchy 4G, it will feel instant everywhere else.

Fewer decisions, held firmly

One typeface pairing, one accent, one grid. Constraints are what make a small site feel considered.