Things I have built.

Every one of these started as a problem I had myself. Some are products, some are tools I needed badly enough to build twice. Here is what they are and why they exist.

2026
Beta

TracklistID

Track IDs for DJ mixes, from a timestamped link. Paste a SoundCloud URL with the moment baked in and get the record playing there — the segment is pulled server-side, so it beats holding a phone up to a speaker. Every answer lands in a shared index, so the next person asking about that passage gets it instantly.

Nuxt 4
Nitro
SQLite
Fly.io
TracklistID
2026
Beta

Cairn

A self-hosted "Product OS": the PM agent that turns a scattered stream of feedback into a roadmap you can reason about. Feedback comes in raw, comes out sorted, linked to features and shaped into Shape Up bets. Zero egress, single SQLite file, one process.

Nuxt 4
node:sqlite
Anthropic
Shape Up
Cairn
2026
Live

B.Cap

Salary cap management for B.League clubs. The 2026-27 reform changes how Japanese basketball teams can sign players, so B.Cap tracks contracts, simulates scenarios and flags penalties before they happen — set up in two minutes.

Nuxt
Supabase
i18n
Monorepo
B.Cap
2026
Live

Find on Discogs

Share a song from YouTube Music or Apple Music, pick the pressing you want, and the Discogs app opens straight on the release page. An iOS Shortcut backed by a small service that resolves the shared link to a title and queries Discogs — free, and no login anywhere.

iOS Shortcuts
FastAPI
Fly.io
Nuxt 4
Find on Discogs
2026
Live

Minna no Nihongo Revision

A revision app for the Minna no Nihongo Shokyū I textbook, built because every existing one got the reading aids wrong. Per-lesson vocabulary, grammar, kanji and quizzes, with furigana, rōmaji and hide-translation toggles that survive SSR.

Nuxt 4
Tailwind v4
shadcn-vue
zod
Minna no Nihongo Revision

Earlier work

What I built for other people: Spurred, and five years of internal products at Olympique Lyonnais. Internal or shut down since, so nothing to link to.

2023
Archived

Spurred

The talent-matching product I worked on for two years: a search that retrieves candidates from a pool, an LLM pass that scores how well each one actually fits the brief, and the product surfaces that make a match believable rather than a number. Shut down since.

Vue
Python
FastAPI
LLM scoring
2020
Archived

Sport Data Visualisation — Olympique Lyonnais

A dataviz interface for the staff to study opposing teams before a match: KPIs, pass networks, per-player activity, danger indicators and shot maps, computed from the club's match data.

Vue
Vuex
Chart.js
Firebase
2019
Archived

Live Game Monitoring — OLTV

The live match tool that drove the club's TV channel during games, with a back office to push score and event updates on air in real time.

Vue
Vuetify
Firebase
Realtime Database
2020
Archived

Fidelity Space — Olympique Lyonnais

A members' area for the club's premium subscribers: profile management, a directory to connect with other members, and event browsing and sign-up.

Vue
Vuex
Firebase
2019
Archived

Communication Flow — Olympique Lyonnais

A monitoring tool for the club's social accounts: every post in one timeline, publication rates per network, and a read on whether the communication plan was actually being followed.

Vue
Vuex
Chart.js