Projects
Apps I've built and maintain in my own time, each one for something I wanted myself: keeping track of a board game shelf, practicing a dance routine, running events for my neighborhood, packing for a trip. They are all live, so click the preview or follow the link and try one yourself!

A board game collection tracker that lets you visually map your physical bookshelves and find any game instantly. Import your collection from BoardGameGeek, build Hemnes, Kallax, wire rack or custom shelves, place games slot by slot, and check whether a new box will fit before you buy it.
- Next.js
- React
- TypeScript
- SCSS Modules
- Konva
- Netlify Blobs
- Google OAuth
- Vitest
- Playwright


Practice a dance routine to a song one section at a time. Drop markers on the waveform, loop the tricky parts, get counted in with clicks or a spoken count, slow the song down without changing pitch, and practice along to a mirrored video. Installable and works offline.
- Next.js
- React
- TypeScript
- SCSS Modules
- wavesurfer.js
- Serwist (PWA)
- IndexedDB
- Netlify Blobs
- Google OAuth
- Vitest


A members-only events app for a neighborhood community. Members sign in with Google or an emailed link, browse upcoming events, RSVP, pay the organizers by Venmo or Zelle, and get email reminders. Admins confirm payments, send announcements and check attendees in, with real-time notifications in both directions.
- Next.js
- React
- TypeScript
- SCSS Modules
- Sanity
- Netlify Blobs
- Google OAuth
- Resend
- Pusher


A shared packing list for two travelers. Each packer gets a list side by side, items tick off on both phones in real time, and every item is assigned to a carry-on, personal item or everyday bag so you know where it went. No sign-up needed: a workspace is shared by its link, or claimed with a Google account.
- Next.js
- React
- TypeScript
- CSS Modules
- Liveblocks
- Netlify Blobs
- Google OAuth


Rank the spots you try, on vacation or in your own city, so you know which to go back to and which to skip. Lists hold star ratings, prices, notes, tags and optional locations, and sort themselves as you rate. No account needed to start: lists stay in the browser, or sign in with Google to keep them on every device and share one as a read-only link.
- Next.js
- React
- TypeScript
- SCSS Modules
- Tailwind CSS
- Google Maps
- Netlify Functions
- Netlify Blobs
- Google OAuth