My Tsundoku
An app for the books you haven’t read yet — and don’t feel bad about keeping.
The word
Tsundoku (積ん読) is the Japanese word for the stack of books you’ve bought and haven’t read yet. The usual translations miss the texture: in Japanese, the word is tender. It doesn’t accuse. It describes, without judgement, a perfectly ordinary state — that of a reader who loves books faster than they finish them.
It took me a while to understand that the pile is half a promise, not a failure. It’s not a backlog; it’s desire in the present tense.
What other apps got wrong
Goodreads, Babelio, StoryGraph: three columns — to read, reading, read. The pile, in that model, is a transit zone you’re meant to clear. The bigger it gets, the more the app becomes a quiet reproach.
None of them have a column for “I wanted this” — a book noticed, not yet bought. None of them have a column for “I’m letting this go” — a book finished or abandoned that someone else might want. The linear model doesn’t fit a real reader’s life.
Four columns, observed
I watched how I actually handled my books. There were four states, not three:
Wishlist → Unread pile → Library → To sell.
The app is a kanban. You drag a card from one column to the next and the verb changes: buy, start, shelve, give away. No reading streaks. No percentages. No notification telling you it’s been three days since you opened a book. Just an honest inventory that tracks the actual movement.
Why local-first
A reading tracker has no business living in someone else’s cloud. The app stores everything in IndexedDB, on the device. It works offline by default. Sync exists — Supabase, magic link — but it’s an option, not a condition of use.
Books were the excuse to learn the architecture I want for everything personal: my data, my device, sync as opt-in.
What’s inside
Scanning a barcode triggers an ISBN lookup on Open Library. An anonymous community catalogue means the next person doesn’t have to retype the same book. FR/EN, light/dark mode, installable as a PWA from the browser.
P.S.
The code is public. AGPL-3.0 for personal use; commercial licence on request. Not for contributions — so people can see how it’s made.