Matthew Culnane
WritingReadingListeningWatchingLinksProjectsTagsSearchAboutRSS
Matthew Culnane
  • Writing
  • Reading
  • Listening
  • Watching
  • Links
  • Projects⇠
  • Tags
  • Search
  • About
  • RSS

© 2026 Matthew Culnane. Built with Next.js & Supabase.

Tags · RSS

Projects

Fabian's Quest

My son is in Year 3 and needs to practise times tables, spelling, and a handful of other subjects every night. The available apps were either too broad, too patronising, or too keen on subscription revenue. I built him something instead.

Fabian’s Quest is a learning app dressed up as an RPG. There’s a Daily Quest—37 questions across seven rounds covering maths, scales, spelling, grammar, science, history, and geography—designed to take about ten minutes. Short enough that it happens every night regardless of energy levels. You can also take a deeper dive into any of the subjects on their own. Each correct answer earns XP, streaks build, levels unlock. The kind of feedback loop that works on a child who treats everything as a competition.

It runs on an iPad, built with React and Vite, deployed to Cloudflare Pages. No backend—player data lives in localStorage, which is fine when your entire user base shares a device and a surname. The visual language is dark navy with gold accents, chunky rounded type, and the sort of progress bars that make eight-year-olds feel like they’re levelling up in a proper game. (Claude helped with the styling—it’s not my thing at all.)

Some details worth noting:

  • Procedurally generated measurement questions with inline SVG number lines—no static image assets, no question bank to exhaust
  • A spelling hint system that auto-detects patterns (double letters, silent letters, tricky vowel pairs) and generates contextual clues rather than just revealing the answer
  • Programmatic sound effects via the Web Audio API and text-to-speech via the Web Speech API—zero external media files
  • The entire application lives in a single 3,200-line React component, which I mostly think is admirably focused but occasionally see as a future problem
  • I’ve built a workflow with Claude Code to automatically update it each week when the school sends home new material

The name was Fabian’s idea. He wanted a quest.

3 April 2026project
education

Showrunner

A personal publishing system built to scratch a very specific itch: I wanted a Tumblr-style blog with editorial design sensibilities, and nothing that existed was quite right.

Showrunner is a headless CMS backed by Supabase and served through Next.js. It supports the post types I actually use—text, links, quotes, photos, albums—and pulls in activity from Letterboxd, Goodreads, Backloggd, and Pinboard to create a unified timeline of everything I’m reading, watching, playing, and bookmarking.

The design takes cues from Frank Chimero and Max MacWright: warm off-white backgrounds, a serif body column, restrained typography. Dark mode, naturally. The kind of site that looks like it was made by a person rather than a platform.

Some details worth noting:

  • Bluesky cross-posting, so I don’t have to choose between owning my content and participating in public conversation
  • Full-text search across posts and external feeds
  • Monthly Last.fm listening recaps generated automatically
  • Album posts enriched with metadata from Last.fm and MusicBrainz
  • Letterboxd reviews enriched with TMDB director credits and tag scraping

The whole thing was built collaboratively with Claude Code—architecture decisions, implementation, the editorial restyle, all of it. That process deserves its own post at some point.

The name is borrowed from television production. The showrunner is the person responsible for the creative direction of a series. Felt appropriate for a system whose entire purpose is giving one person control over how their work appears on the web.

31 March 2026project
technologydevelopment