BookLite is a self-hosted digital book library for people who want a clean personal or family bookshelf without the heavier feature surface of larger library servers. You can upload books, organize them, enrich metadata from multiple providers, read in the browser, share books between users, and sync selected books to Kobo.
It is inspired by BookLore, but deliberately keeps a tighter scope: no OPDS feeds, no KOReader sync, no comics or audiobooks, and no BookDrop-style ingestion pipeline.
- Upload
EPUB,KEPUB, andPDFfrom the web UI - Built-in browser reader for
EPUBandKEPUB - Reading status and progress tracking
- Full-text library search powered by SQLite FTS5
- Custom collections plus built-in
Favorites,Shared with me, andUncollected - Per-book metadata editing, cover changes, downloads, and deletion
- Drag-and-drop multi-file uploads
- Background import jobs with live queue/progress states
- Automatic filename parsing before import
- Optional OpenRouter-assisted filename cleanup for messy filenames
- Automatic metadata preview while reviewing uploads
- Manual edits to title, author, and description are preserved during enrichment
- Assign collections and favorites before import completes
- Metadata from 7 providers: Open Library, Google Books, Amazon, bol.com, Hardcover, Goodreads, and Douban
- Owners can enable or disable providers per instance
- Results are merged field-by-field instead of trusting a single source
- Covers are ranked separately from text metadata
- Optional OpenRouter resolver can normalize provider results, reject wrong matches, and fill missing series data
- Cover suggestions can be reviewed and changed later from the library detail drawer
- Simple
OWNERandMEMBERroles - Share books directly between users
- Owner-only user management, provider settings, upload limits, and diagnostics
- Admin impersonation for member support and debugging
- Activity log for auth, upload, metadata, and Kobo events
- LLM-ready API docs with expiring admin-generated tokens
- Built-in Kobo-compatible API endpoint
- Sync all books or only selected collections
- Reading progress sync with latest timestamp wins
- Only
EPUBandKEPUBare synced to Kobo - New accounts automatically get a
Favoritescollection, which is preselected for Kobo sync
- Backend: Fastify + TypeScript + Drizzle + SQLite (WAL)
- Frontend: React + Vite + TanStack Query + dnd-kit
- Runtime: single Docker container
cp .env.example .env
# then edit .env and set JWT_SECRET
docker compose up -d --buildOpen http://localhost:6060.
docker run -d \
--name booklite \
-p 6060:6060 \
-e JWT_SECRET=replace-with-a-long-random-secret \
-e BASE_URL=http://localhost:6060 \
-v "$(pwd)/app-data:/app/data" \
-v "$(pwd)/books:/books" \
ghcr.io/marijnbent/booklite:latestPending Drizzle migrations are applied automatically when the API starts, including on Docker deploys.
On first run either:
- Open
/setupin the UI and create the first owner account. - Or set bootstrap env vars before startup:
BOOTSTRAP_OWNER_EMAILBOOTSTRAP_OWNER_USERNAMEBOOTSTRAP_OWNER_PASSWORD
See .env.example for the common starting point.
Core settings:
PORTdefault6060HOSTdefault0.0.0.0BASE_URLdefaulthttp://localhost:6060JWT_SECRETrequired, must not be left empty or set to the example/default valueACCESS_TOKEN_TTL_SECONDSdefault3600REFRESH_TOKEN_TTL_SECONDSdefault7776000
Storage and frontend:
APP_DATA_DIRdefault/app/dataBOOKS_DIRdefault/booksAPP_DATA_BINDdefault./app-datawhen usingcompose.ymlBOOKS_BINDdefault./bookswhen usingcompose.ymlWEB_DIST_DIRoptional override for built frontend assetsBOOKLITE_FRONTEND_MODEone ofauto,vite,static,off
Upload and metadata defaults:
UPLOAD_LIMIT_MBdefault100AMAZON_BOOKS_DOMAINoptional, defaultcomAMAZON_BOOKS_COOKIEoptionalGOOGLE_BOOKS_LANGUAGEoptional, exampleenGOOGLE_BOOKS_API_KEYoptionalHARDCOVER_API_KEYoptionalOPENROUTER_API_KEYoptionalOPENROUTER_MODELoptional, defaultgoogle/gemini-3.1-flash-lite-preview
Bootstrap:
BOOTSTRAP_OWNER_EMAILBOOTSTRAP_OWNER_USERNAMEBOOTSTRAP_OWNER_PASSWORD
Most metadata provider toggles and AI settings can also be changed later from Administration.
npm install
npm run db:migrate
npm run dev- App:
http://localhost:6060 - Run
npm run db:migrateagain after pulling new schema or migration changes.
Docker dev mode:
npm run docker:devOptional split dev mode:
npm run dev:splitnpm run build
npm run typecheck
npm testDatabase helpers:
npm run db:generate
npm run db:migrate
npm run db:studioapps/apiFastify APIapps/webReact apppackages/sharedshared TypeScript contracts
- Copy the full
api_endpoint=https://your-booklite-host/api/kobo/...line from the Kobo page intoKobo eReader.conf - Only
EPUBandKEPUBsync to Kobo PDFstays library-only- Progress sync uses latest timestamp wins
- Regenerating the Kobo token invalidates the previous endpoint