I build interfaces that stay clear when the data gets messy.
Frontend engineer working in React and TypeScript, with a bias toward accessibility, careful state and interfaces that hold up under real content rather than demo data.
Selected work
An accessible component library
Twenty-odd React primitives built keyboard-first, with the focus behaviour written down before the styles.
Personal project · 2026 · TypeScript, React, Radix UI
A dashboard that stays readable when full
An operations view for a few thousand rows, designed against real volume rather than six tidy demo records.
Personal project · 2026 · TypeScript, React, TanStack Table
An offline-first field app
A data-collection interface for patchy connections, where the honest answer to "did that save?" is always on screen.
Personal project · 2025 · TypeScript, React, IndexedDB
A design token pipeline
One source of truth for colour and type, generating both the Figma variables and the CSS the app ships.
Personal project · 2025 · TypeScript, Style Dictionary, Tailwind CSS
A performance rescue
Taking a content site from a four-second first paint to under one, mostly by deleting things.
Personal project · 2025 · Next.js, Lighthouse, WebPageTest
About
I care about the parts of an interface people notice only when they are wrong: a focus ring that never appears, a table that breaks at 400px, a form that loses what you typed. Most of my work is making those things not happen.
I work in React and TypeScript, usually with a design system underneath, and I am happiest on problems where the interface has to carry a lot of information without becoming noise.
Tools I reach for
- TypeScript
- React
- Next.js
- Tailwind CSS
- Testing Library
- Playwright
- Storybook
- Figma