Staff frontend engineer. I build accessible web and mobile interfaces, and I contribute to the component libraries those interfaces sit on.
Merged this month:
- Base UI — a disabled radio group leaves the tab order.
- Material UI — WCAG 2.2 assessment and axe tests for CircularProgress.
- Material UI — a shared axe file counts only that component’s demos.
- Elastic EUI — CallOut and Banner announce the visible text on mount, without copying those nodes into the live region.
In review:
- Base UI — Shift+Tab stays inside an open context menu.
- Material UI — WCAG 2.2 assessment and axe tests for FormControlLabel.
- Radix Primitives — the select trigger id reaches the native select, so a label and native required checks work.
- shadcn/ui — keyboard focus stays visible on invalid controls.
Pull requests on these repos comment with the bundle delta against main. House also reports catalog bench times, and the console reports how many times a fixture mounts. The gzip ceiling still fails the build.
One visual language for the apps below: semantic tokens, light, dark, and high contrast, theme presets, and a small set of React primitives. A check fails the build when a second palette appears.
Operators upload a file, follow job progress streamed from an append-only event log, and review extracted fields in a virtualized viewer. The default extractor is a mock, and the app says so. Live.
Upload a script and get a multi-character audio episode. Live.
Hindi, Hinglish, and English dictation. The speech key stays on the server. Live.

