Projects
Things I've built
Libraries I maintain and testing tooling I built because I needed it, plus the products I've shipped as an engineer on a team. Star and install counts are live from GitHub and npm.
Open source
state-in-url
418 2.5k/wkStores nested, typed state directly in the URL via React hooks. I built it because I needed a fast, convenient way to preserve state on page reload and share page links.
- React
- TypeScript
- Tailwind
- Next.js
- Remix.js
- react-router
react-horizontal-scrolling-menu
789 79k/wkA reusable horizontal scroll component. TypeScript, well tested, and used in production dashboards I never get to see. Maintained for years across multiple React majors and refactored along the way.
- React.js
- CI/CD
- storybook
- npm
test-proxy-recorder
111 60/wkVCR for Playwright — records real API responses once, then replays them deterministically on CI. Covers Next.js SSR, browser, and WebSocket traffic with no backend and no hand-written mocks. I built it because every flaky e2e run traces back to the network.
- TypeScript
- Playwright
- Next.js
- WebSocket
- e2e
- npm
X-Pat, a browser extension that puts an X account's country in the hover card and the feed, using X's own location API through your existing session. The feed fills in as you scroll without draining the endpoint's rate limit, and accounts can be collapsed, hidden or highlighted by country, organisation, age or bio keyword.
- TypeScript
- Browser extension
- MV3
- Playwright
- Cloudflare Workers
- SQLite
Self-hosted click and hover heatmaps, scroll depth, rage-click detection and ghost-cursor session replay, rendered on the live page. No cookies, no third-party scripts, and a tracker that is 1.7KB gzipped.
- Cloudflare Workers
- D1
- SQL
- TypeScript
- Node.js
- Analytics
A single-worker priority queue for local LLMs, exposed as an OpenAI-compatible HTTP service — so cron jobs, browser extensions and OpenAI clients all share one serialized queue against one model instead of fighting over the GPU.
- Node.js
- TypeScript
- Ollama
- HTTP API
- CLI
- npm
Client & product work
Closed-source commercial work — the write-ups cover what I owned and what shipped.
The merchant-facing dashboard for Omise's payments platform: three years architecting and maintaining it in React, GraphQL, and styled-components, plus an internal D3.js analytics dashboard and a JavaScript SDK bridging a native mobile wrapper to JS mini-apps.
- React
- GraphQL
- styled-components
- D3.js
- Payments
- SDK
A B2B hiring platform startup. Built the UI to match the design closely, refactored code, adapted it to mobile, and wrote Playwright tests the team actually relies on.
- React.js
- Next.js
- TypeScript
- Playwright
- B2B
Available for full-time remote work in EU timezones, 40 hrs/week.
Get in touch