01
Pages, not intentions
Progress is a page number you typed, so “nearly finished” has to mean something. Finishing a book is what happens when the number reaches the last page.
Free forever · no card
Marginalia is a shelf you and your team actually keep. Type the page you stopped on, leave the note you argued with, and publish only the books worth sending to someone.
No card · free plan is permanent · your notes stay yours

Every number on this row is enforced by the backend rather than by a hidden button — the free ceiling, the seat count, and the rule that a margin note never leaves its workspace.
How it works
Scroll the four and watch the number change. There is no fifth step, no onboarding checklist, and nothing to configure before the first book goes on.
A workspace is one shelf. Keep the work reading apart from the home reading, or start a shared one and invite the team into it.
Title, author, page count. The page count is the only number that matters, because it is the one that turns intention into a percentage.
Type the page you stopped on. Reaching the last page finishes the book on its own — status is a consequence of reading, not a second thing to remember.
Any book can get its own public page at a link you control. Your margin notes never go with it, and retracting the link kills the page instantly.
What it does
Five things, done properly. No streaks to protect, no badges to collect, and no feed of what everybody else is reading.
01
Progress is a page number you typed, so “nearly finished” has to mean something. Finishing a book is what happens when the number reaches the last page.
02
Quote the sentence that stopped you, with the page beside it. Notes stay inside the workspace and are never published with a shared book.
03
On the Team plan everyone reads from the same shelf and sees each other's marginalia. Owners and admins moderate; members keep their own books.
04
Every read and every write resolves your membership first. There is no query in the backend that can return a row from a shelf you are not seated on.
05
A published book gets a real page with real metadata — a title tag, a description, an OG card — so a link sent to a friend looks like something.
Team shelf
On the Team plan a workspace seats up to twelve readers on the same shelf. Everyone sees what everyone else is reading, where they got to, and what they wrote in the margin.
Design team · this week
Idris reached page 96
Seeing Like a State
One book
Four moments in the life of a single book. Every one of them is a rule the backend enforces on every request, not a promise this page is making on its behalf.
Day one
Title, author, page count. The book belongs to one workspace from the moment it exists, and every read and write against it re-checks that membership on the server — not in the browser, and not once at login.
requireBookAccess(ctx, bookId) — resolves the book's own workspace, then your seat in it
Every session
Type the page you stopped on. That is the entire interaction. Reaching the last page finishes the book on its own, because status is a consequence of reading rather than a second thing to remember.
96 / 445 · 22% · finished at 445 without a second click
When it earns it
Any book can be published to a link you control. The page carries the title, the author, where you got to and your one-line summary. Your margin notes are not on it, because they were never part of what publishing means here.
marginalia.app/s/qk3xr9vn2mp7ta
The moment you change your mind
Retracting is one click and it is immediate — the public query re-checks the plan and the share flag on every request, so a link that was revoked is a link that is dead, not a link that is cached.
unshare(bookId) — the row loses its shareId, and the URL 404s on the next load
Pricing
The Free plan has no expiry, no card and no countdown: twelve books, kept forever. Reader lifts the ceiling and turns on public links. Team puts up to twelve people on one shelf. Subscribe the day the shelf outgrows the plan — not before.
$0/ forever
A private shelf, for one reader, with no expiry date on it.
$6/ per month
Unlimited books, and a public link for the ones worth arguing about.
$18/ per month
One shelf the whole team reads from, and shares from.
Checkout is live: choosing a paid plan opens Stripe's hosted page, and the entitlement is flipped by the webhook rather than by the success redirect. Cancelling in Stripe's portal drops the workspace back to Free with everything it already has intact.
Compare
Every row below is a rule the backend enforces, not a bullet this page invented. The unit test beside src/lib/plans.ts fails the build if the two ever disagree.
| Capability | Free$0 | Reader$6 | Team$18 |
|---|---|---|---|
| Books on the shelf | 12 | Unlimited | Unlimited |
| Readers in the workspace | 1 | 1 | 12 |
| Margin notes per book | 20 | 500 | 500 |
| Page-level progress | Included | Included | Included |
| Finish dates and reading stats | Included | Included | Included |
| Publish a book to a public link | Not included | Included | Included |
| Publish on behalf of the team | Not included | Not included | Included |
| One shelf, many readers | Not included | Not included | Included |
| Roles: owner, admin, member | Not included | Not included | Included |
| Margin notes stay private | Included | Included | Included |
Readers
Three of them, dealt one at a time. A wall of testimonials gets skimmed; a single card gets read — and none of these is about the software being delightful.
Priya Raman
Staff engineer
Tomas Berg
Engineering manager
Lena Ortiz
Researcher
Marcus Hale
Writer
Yuki Tanaka
Designer
Sofia Almeida
Head of design

Twelve books free, forever, with no card and no trial clock. Upgrade the day the shelf outgrows the plan, not before.