Skip to content

Repository files navigation

name My Tsundoku
tagline_fr Collectionner des livres qu’on ne lira jamais, mais avec méthode.
tagline_en Collecting books you’ll never read, but doing it properly.
facts_fr Next.js 16, local-first sur IndexedDB, synchro Supabase, PWA hors ligne.
facts_en Next.js 16, local-first on IndexedDB, Supabase sync, offline PWA.

Tsundoku

Tsundoku (積ん読) is a PWA for organizing personal book collections. Inspired by the Japanese concept of letting unread books pile up, it provides a Kanban-style board to track books across four stages: wishlist, unread pile, library, and to sell. Available in French and English, with light and dark mode. Works offline with local-first storage — optionally sign in to sync across devices and contribute to the community book catalog.

Manual entry screen showing search results for "Dune", listing five matching editions with cover, title, and author Kanban board with the Tsundoku (unread pile) stage selected, showing four books alongside the Wishlist, Library, and To sell tabs

Tech Stack

  • Next.js 16 (App Router, Turbopack) + React 19 + TypeScript
  • Tailwind CSS v4 for styling
  • Dexie.js for IndexedDB (local-first storage)
  • Supabase for auth (email OTP code), cloud sync, storage, and community catalog
  • Serwist for PWA / service worker (configurator mode)
  • @dnd-kit/core + @dnd-kit/sortable for drag-and-drop
  • motion for animations
  • @zxing/browser for barcode scanning
  • react-image-crop for cover photo cropping
  • Vitest for testing

Running Locally

cp .env.example .env.local   # fill in your Supabase credentials
npm install
npm run dev

Open http://localhost:9876.

Environment Variables

Variable Description
NEXT_PUBLIC_SUPABASE_URL Supabase project URL
NEXT_PUBLIC_SUPABASE_ANON_KEY Supabase publishable (anon) key

Build

npm run build    # next build && serwist build

Tests

npm test           # single run
npm run test:watch # watch mode

Project Structure

src/
├── app/           # Next.js App Router pages
│   ├── page.tsx           # Home — Kanban board
│   ├── add/               # Add book (manual entry, barcode scan)
│   ├── book/[id]/         # Book detail & edit
│   ├── settings/          # Settings & backup
│   └── ~offline/          # Offline fallback page
├── components/    # Reusable UI components
├── hooks/         # Custom React hooks (useBooks, useBook, useBooksByStage, useIsMobile)
└── lib/           # Business logic, types, DB, constants

Roadmap

Planned features (in no particular order):

  • Share your Tsundoku — Share your book piles and recommendations with friends
  • Book clubs — Find readers with the same books and start a club
  • Find in bookstores — Find your books in online bookstores
  • Reading statistics — Track how many books you read per month and year

Have a suggestion? Get in touch.

Deployment

Auto-deployed on Vercel on push to main.

License

This project is licensed under the GNU Affero General Public License v3.0.

Commercial licensing available — contact w@revah.paris.

Author

Made with care by William

About

A bilingual (FR/EN) offline-first PWA for organizing personal book collections on a Kanban board

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages