A geocaching-style hunt for street art. An artist hides a piece somewhere in the city, you go and find it, and you tap your phone against it to collect it into your own portfolio. I designed and built the whole thing. React and Vite on the front, FastAPI behind it.
Projects
The personal peaks I've reached
Give it a prompt, get back a whole batch of podcast episodes. Scripts come from the Anthropic API; the voices come from a pluggable TTS adapter layer, so swapping Fish Audio for ElevenLabs is a config change rather than a rewrite. The interesting part is the concurrency. A 100-episode run is bounded by an asyncio semaphore so it saturates without falling over. SQLite behind it, deployed on Vercel.
A custom MCP server for my own reselling. You ask it a pricing question in plain language and it answers, then keeps a live financial and inventory tracker in Google Sheets up to date without me touching it. Auth is per-user OAuth rather than one shared credential, so it can be handed to someone else without handing over my account.
The Slack bot. Nobody should have to write a formal email to say they’re sick. Now they tell Slack in whatever words they’d actually use, and the bot works out what they meant, files it as a real record, and routes it to their manager. Three days became same-day, for about 100 people.
The HR platform. A four-tier permission model, and an internal HR app built on top of it. It replaced a paid third-party tool and saves $8,000 a year.
The auditor. A scheduled Apps Script service that checks every account for 2FA, recovery info and profile photos, then logs what it finds. It replaced 40 hours a month of manual review across ~100 accounts.
A DJ library gets messy fast, and the mess is a sorting problem. I’m building two pieces that work together. A gamified Sorting Deck that previews a track on hover, guesses its category from BPM and energy, and lets me confirm or correct it with a keystroke; and a drag-and-drop Set Builder that assembles a tracklist and flags jarring BPM jumps between tracks. It works on whatever is already in my folders. A scan picks up new files and queues them for sorting. Audio analysis runs on librosa for BPM, key and energy, with mutagen reading the ID3 tags.
A Vite multi-page build, no framework driving the layout. The green lives in the photography and the interface stays out of its way. Every page is a different setting, and one scroll-progress value drives the layers on all of them, so the hero’s trunks can slide across my name instead of sitting on top of it.