Practise a real IELTS exam, get a band score back in seconds.
An IELTS prep service covering all four sections: listening, reading, writing and speaking. You answer real questions from past exams, an AI examiner marks the answer and explains the band score, and a dashboard tracks where you are improving and where you are stuck. Next.js, with Claude doing the marking.
Drag coffees onto a day and watch what your blood does.
A sandbox for understanding caffeine. Drop drinks on a timeline and the curve, the bedtime number and every panel below redraw live. It runs a one-compartment pharmacokinetic model with first-order absorption, so a dose peaks about 45 minutes in and then halves on your own clearance rate. One HTML file, no server, works offline.
Lantern
Building One Mandarin app instead of the seven I was juggling.
A Mandarin learning app built around a spaced-repetition engine. Everything else hangs off that same vocabulary and progress model: an AI reader that generates passages at your level, listening drills, mock HSK exams, character decomposition, and a tutor you can talk to. Next.js and Supabase, with an FSRS scheduler at the centre.
Talk, and see your words half a second later. Nothing leaves the machine.
A local speech-to-text and translation tool that streams into a browser page. Settled text is black, the working draft is grey and rewrites itself as more words arrive, and a second column translates each line between English and Chinese. Whisper and Qwen both run on your own GPU, so no audio is uploaded anywhere.
A present that is a whole website about the person.
You answer a questionnaire about someone, and it becomes a personal site built from slide templates: a Wrapped-style year in review, fake Yelp reviews of them, a Wikipedia page, a bingo card of their habits, messages from everyone who knows them. Birthdays first, now weddings, retirements, graduations and trips.
Astro, a hand-rolled WebGL globe, and no CMS.
Built in Astro and deployed to GitHub Pages. The globe is Three.js with the real travel route drawn as arcs. All the copy lives in one TypeScript file so nothing drifts out of sync.