All projects
01 / Project Live

Marginalia

A conversational book recommender that takes a feeling, a question, a theme, or a mood — and suggests two or three books, chosen by something that learns your taste the way a friend would.

Recommenders optimize for similarity. Taste is something else.

Most book recommenders work the same way: given what you already liked, here's more like it. They're built for scale, not for taste. The result is an echo chamber — the same books circling back to you in slightly different shapes, the same algorithmic popularity bubble dressed up as personalization.

But the way I actually find books is closer to a conversation with a knowledgeable friend. Someone who knows what I've read, hears the mood I'm in, and suggests two or three things — sometimes safe, sometimes a stretch. Someone who builds an evolving picture of who I am as a reader. Marginalia is my attempt to make that.

I built a conversational book recommender. It takes a feeling, a question, a theme, or a mood — and suggests two or three books.

A conversation, not a query.

You don't pick filters or browse categories. You write the way you'd write to a friend — "something for the last week of winter", "a book that reads like a long walk", "I want to understand grief without drowning in it". The system reads the request, reaches into what it knows about you, and comes back with a small handful of suggestions, each with its own reason for being there.

Example conversational prompts to Marginalia
Sample conversational prompts — moods and questions instead of filters.
Marginalia book recommendation response
A response: two or three books, each with a reason.

The same data, four different librarians.

The same reading history can be read in different ways. Marginalia lets you choose the voice doing the reading — four personas that produce meaningfully different suggestions from identical data.

The Sage

Deeper, slower, more considered — pulls from the canon and the philosophical shelves. Good for when you want a book to sit with.

The Bookseller

The friend at the independent bookstore who reads everything new. Curated taste, contemporary leanings, knows what's just out.

The Provocateur

Pushes against your patterns. Suggests the book outside your comfort zone — the one that argues with what you already believe.

The Companion

Matches you where you are. Reads the emotional weather of the request and suggests something kind, something close.

A picture of how you read.

Every so often, Marginalia writes a prose portrait of your taste — not a list of genres, but a narrative observation of what you keep returning to, what you avoid, where you've drifted lately. It refreshes as your reading evolves, so the picture is never stale.

Marginalia taste portrait highlights
Highlights extracted from accumulated reading data.
Prose portrait of reader's taste
The prose portrait — observations rendered as narrative, not metadata.

Reading is a map, not a list.

Beyond the prose, there's a visualization: a constellation of themes pulled from across your books, connected where they overlap. You can pull on a node and see which books sit underneath it, where it touches other themes, where the gaps are. It's the structure of your reading made visible.

Theme constellation visualization
The constellation — themes as nodes, connections as overlaps.
Constellation node expanded
Expanding a node reveals the books underneath and adjacent themes.

When the librarian asks first.

A real librarian wouldn't just answer questions — they'd notice things. Marginalia does the same: when it detects a shift in your reading patterns (a sudden swerve toward grief, a new fixation on a place, a long absence from fiction), it surfaces a perceptive question of its own. The conversation goes both ways.

Marginalia asking a question of the reader
A librarian-initiated question, drawn from shifts in recent reading.

How it's built.

The recommender runs Claude Sonnet for the reasoning that produces suggestions, with Haiku handling the cheaper signal extraction — tagging themes, noticing patterns, keeping the taste portrait fresh. Web search is integrated through Claude's built-in tool, so the system can reach for what's just been published.

State lives locally in SQLite — every book has a full lifecycle: suggested → purchased → reading → read or abandoned. There's no remote infrastructure, no analytics calls. Every API request reconstructs your full context from scratch, which means Anthropic never holds persistent state, and yet the system still gets sharper as your library grows.

Marginalia data model schema
The data model — tables for books, suggestions, lifecycle states, and themes.
Reasoning
Claude Sonnet
Signals
Claude Haiku
Storage
SQLite
Backend
Python
Frontend
Vanilla JS + SVG
Search
Claude Web Tool
Infra
Local-only
License
Open Source
Next Project

I gave Gemma 4 my
Instagram reels

Continue