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.
- 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.