Staff-level frontend engineer with ~12 years of building web products. I work on frontend architecture: component systems, monorepos, performance and accessibility. I also lead teams and build AI-powered product experiences.
- 🏗️ Led the frontend for a conversational assistant: streaming bot responses, rich action cards, in-chat webviews for web, Teams and Slack, and bot-to-human handoff
- 🧩 Moved a fork-a-new-copy component culture to one shared library: deprecated and removed v1/v2/v3 duplicates, and built an MCP-based Figma-to-code pipeline that reuses it
- ⚙️ Migrated Webpack 4 → 5 with codemods and cut tech debt by ~75%
- 👥 Managed pods of 5–6 engineers for 5+ years (hiring, reviews, promotions) and kept ~80% of the original team through my tenure
| Project | What it is | Under the hood |
|---|---|---|
| BecauseILiked | Tell it what you loved and why; get films, shows, books and games back with a reason each one fits | Next.js, Supabase + pgvector, embeddings + RAG with streaming LLM explanations, ~13.8k-title catalog |
| Thumbline · repo | Upload a song clip, get fingerstyle / arpeggio / flamenco right-hand sheets at three skill levels, with playback | Nx monorepo, audio processing to notation |
| VitalDelta · repo | Turns lab reports into trend charts, so you can show your doctor how your numbers move over time | Local-first: reports never leave your device; Chart.js |
I contribute to UI libraries, state managers, routers and design tools: accessibility, correctness and API work, each with a root cause, a failing test and a reproduction.
Recently merged
- react-resizable-panels:
vh/vw/empanel sizes now resolve against the panel's own window, so popouts and iframes size correctly (#777, released in 4.15.2) - Zag.js:
- ToC auto-scroll no longer interrupts the smooth scroll to a heading (#3542)
- Splitter
aria-orientationnow matches the separator (#3553) - Password input visibility toggle: dropped a misleading
aria-expanded, and the maintainer extended it with keyboard access (#3555) - Steps:
aria-currentmoved from the item wrapper to the tab (#3529)
- Ark UI:
Field.Root readOnlynow makes FileUpload read-only, across React, Solid, Vue and Svelte (#4234) - Matita:
- File Viewer: reported toolbar buttons losing keyboard focus, with root cause and fix options (#419). Fixed in 3.3.0 along the approach I proposed.
In review
- Jotai:
freezeAtomno longer crashes on circular references or typed arrays; the maintainer opened the PR from my branch (#3383) - Excalidraw: links to other sites (
//host, look-alike hosts) no longer open in the editor's tab (#12482) - TanStack Router:
createMemoryHistoryignoredinitialIndex: 0and started on the last entry (#8828) - Floating UI: typeahead skipped the first item after a key with no match (#3536); reported items with duplicate labels being unreachable (#3538)
- Matita: a
roughoption, from today's pencil to crayon-rough, planned with the maintainer for 0.6.0 (#22) - Material UI: keep focus when
loadingis set on Button / IconButton (#49540), now part of a wider discussion on how loading buttons should behave - Oat: dropdown no longer steals focus from an element clicked outside the menu (#192)
- Storybook: reported the sidebar search using the outdated ARIA 1.1 combobox pattern, with a tested fix (#37030)
Core: TypeScript · React · Next.js · Nx monorepos · GraphQL · Storybook Styling: styled-components / Emotion · Sass / CSS Modules · Tailwind Testing: Playwright · Vitest / Jest · axe AI & data: embeddings · RAG · pgvector · Supabase · Postgres Also: Node.js · Webpack / Vite · enterprise SSO (SAML / OIDC)
Frontend architecture at scale, design systems and component APIs, accessibility (WAI-ARIA / WCAG), monorepos, and building AI features that feel good to use.
