Case study · personal software
media tracker
One log for everything I play, read and watch. It replaced my use of Letterboxd, Goodreads and BoardGameGeek with a single private site that looks like a printed journal, fed by my personal AI agent. The real design problem: making logging so effortless that I keep doing it, week after week, across a dozen media types. The entries below are real; the live site stays private, and this board is the tour.
Three sites, one log
Films on Letterboxd, books on Goodreads, plays on BGG: three accounts, three feeds, three ideas of a rating. The tracker collapses all of it into one place, and a new kind of thing costs nothing to add. Board game night, a new campaign, a restaurant worth remembering: same log.
20 entry types, and adding a new one is trivial
The diary feed
The real feed component with real entries. Filter by type, or flip between the reading view and the index view: browsing and finding.
Designed to be actually used
The hard part was never storage. It was designing a product I would still be logging into a year later.
Shelves: the collection view
Every hobby gets a shelf. Covers are fetched automatically when an entry is created; ratings sit in the corner. Slices of two shelves:
Board games
RPG systems
On the table right now
The book on the nightstand and the mid-campaign RPGs surface above the log. Opening the site answers "where was I?" in one glance.
Every thing gets a page
Facts, my play history and comments on one page. Guests can leave a comment; I approve it before it appears.
Board Game
War of the Ring: Second Edition
R. Di Meglio · M. Maggi · F. Nepitello · 2011
No comments yet. Were you at this table?
Andreas reads it first; it appears once approved.
Ask it anything
Free-text questions become SQL: one model call drafts a query against the schema, a second validates and repairs it, and the result renders as an answer with its table. Guests get this too, with one boundary: their questions run against a scrubbed public copy of the database, never the live one.
Generated + validated SQL
SELECT system, COUNT(*) AS sessions FROM entries WHERE type = 'rpg_session' AND finished_at >= '2026-01-01' GROUP BY system ORDER BY sessions DESC;
Answer
A tie: Call of Cthulhu 7e and Mothership 1e, five sessions each.
| System | Sessions |
|---|---|
| Call of Cthulhu 7e | 5 |
| Mothership 1e | 5 |
| Starfinder 2e | 4 |
Logging is a chat message
This is the usability insight the whole system rests on. If logging means meticulously filling fields on three different sites, it stops happening. So the main entrance is a conversation: I paste rough notes and a couple of photos from the table into a chat with my agent, and it structures everything into the right fields, which render in the log immediately. The site has a full editor too, but the point is that the lazy path is also the good path.
1 · Dump it in chat
2 · The agent structures it
type: rpg_session title: Digital afternoon session system: Starfinder 2e finished_at: 2026-04-25 photos: 2 attached notes: cleaned-up recap
3 · Rendered in the log
The look is part of the habit
It reads like a printed journal, not a dashboard: warm paper, near-black ink, one accent, and a type system where every label, weight and rule was a deliberate choice. There is a full dark theme; these plates follow it.
War of the Ring: Second Edition
Fraunces sets titles and numbers. Instrument Sans carries reviews, notes and running text.
JetBrains Mono labels everything else
Under the hood: SQLite + Datasette with custom templates, largely built with Claude Code. The product thinking, design system and usability decisions are the human part.