Files
bookorbit/README.md
T
neon 0b9027c275 feat(book-dock): expose Book Dock folder as a configurable drop zone (#64)
* feat(docker): expose Book Dock folder as a configurable drop zone

Add support for an external book drop folder that users can bind-mount
into the container via the BOOK_DROP_HOST_PATH env var. Files copied or
moved into this folder are automatically picked up and ingested by the
existing Book Dock file watcher.

- docker-compose.yml: add BOOK_DROP_HOST_PATH volume override so the
  book-dock path is separately bind-mountable
- .env.example: document BOOK_DROP_HOST_PATH with an example NAS path
- AppInfoResponse: add bookDockPath so the UI can show the
  container-internal path admins need to bind-mount
- AppInfoService: compute and return bookDockPath from storage config
- BookDockSettings: display drop folder path with BOOK_DROP_HOST_PATH hint
- useAppInfo: expose bookDockPath ref from the app-info API response
- README: document the optional drop folder in the quickstart section

When BOOK_DROP_HOST_PATH is unset, the volume defaults to
./data/app/book-dock, preserving full backward compatibility.
No watcher code changes required - the watcher already watches
the correct container-internal path.

Closes #58

* fix(book-dock): resolve symlink paths so rescan stays idempotent

BookDockWatcherService and BookDockIngestService were building
bookDockPath with path.join(), which preserves symlinks. `@parcel/watcher`
resolves symlinks internally when reporting events (using realpath), so the
absolutePath values stored by watcher events and the paths computed by
walkAndIngest during rescan never matched. This caused findByAbsolutePath
to always return undefined on rescan, creating duplicate DB records for
every file already tracked via a watcher event.

Fix: both services now call `realpath(bookDockPath)` in
onApplicationBootstrap (after mkdir), updating the stored path to the
canonical real path that the watcher also uses. Rescan is now idempotent
regardless of symlinks in the data directory.

Verified by E2E test: 3 consecutive rescans produce zero new records.
2026-05-20 13:00:56 -06:00

7.1 KiB

BookOrbit

A self-hosted library management and reading platform for ebooks, PDFs, audiobooks, and comics.

Stars CI Release Latest release Commits/month License: AGPL v3

Website Demo Discussions Contributing GHCR


BookOrbit dashboard showing reading stats, widgets, and book shelves


What is BookOrbit?

BookOrbit is a self-hosted digital library and reading platform. Organize and read your books, sync seamlessly with Kobo and KOReader devices, enrich your collection with metadata from multiple providers, and support multiple users with OIDC/SSO authentication and detailed reading statistics. Built-in features include OPDS support, customizable dashboard widgets, Send-to-Kindle delivery, and Smart Scopes for dynamic rule-based shelves and filters - all running on infrastructure you control.


Features

Built-in readers - no plugins or extra installs required:

Reader Formats
eBook EPUB, KEPUB, MOBI, AZW3, AZW, FB2
PDF PDF
Comics CBZ, CBR, CB7
Audiobook M4B, MP3, M4A, OPUS, OGG, FLAC

Multiple libraries: Per-library folders, scan rules, format priorities, metadata config, and file-write settings.

Metadata from 9 providers: Google Books, Amazon, Goodreads, Hardcover, Open Library, iTunes, Audible, AudNexus, and ComicVine - with field-level rules.

Collections and Smart Scopes: Curated lists and rule-based saved filters in the sidebar.

Kobo and KOReader sync: Auto-push books to Kobo; two-way reading progress sync via KOReader over OPDS.

OPDS, email delivery, and Book Dock: OPDS for compatible apps, Send-to-Kindle via email, browser drag-and-drop uploads, and a configurable drop folder for automated ingestion.

Multi-user with multi-provider OIDC/SSO: Granular per-user permissions, isolated reading data, and simultaneous support for Authentik, Keycloak, Authelia, etc.

Reading statistics: Daily reading time, heatmap, streaks, pace, goal tracking, and library health dashboard.


Live Demo

Explore BookOrbit instantly, no installation or account required.

🚀 Launch Demo

Note: The demo includes a sample library of public domain books. Some features are limited in the public demo, self-hosting BookOrbit provides the full experience.


Quick Start

mkdir bookorbit && cd bookorbit
mkdir -p books data/app data/postgres
curl -fsSLo .env https://raw.githubusercontent.com/bookorbit/bookorbit/main/.env.example
curl -fsSLo docker-compose.yml https://raw.githubusercontent.com/bookorbit/bookorbit/main/docker-compose.yml

Edit .env and set these required values:

APP_URL=http://your-server-ip:3000   # the URL you'll open in your browser
BOOKS_HOST_PATH=./books              # folder on your server where your book files live

POSTGRES_PASSWORD=         # database password           - openssl rand -hex 24
JWT_SECRET=                # signs login tokens          - openssl rand -hex 32
SETUP_BOOTSTRAP_TOKEN=     # one-time setup wizard token - openssl rand -hex 16

Optional: Book Dock drop folder

To automatically ingest books placed in a folder (for example, a NAS share or a folder managed by another tool), set BOOK_DROP_HOST_PATH in .env:

BOOK_DROP_HOST_PATH=/mnt/nas/book-drop

Any ebook file copied or moved into that folder is automatically picked up and processed by Book Dock. The container-internal path it maps to is shown in Settings - Book Dock. Subdirectories are supported. Covers are stored in a covers/ subdirectory inside the drop folder. Files are removed from the drop folder when finalized into a library.

If BOOK_DROP_HOST_PATH is not set, the drop folder defaults to ./data/app/book-dock inside the app data volume.

Then start:

docker compose up -d

Open http://your-server-ip:3000 and complete setup using your SETUP_BOOTSTRAP_TOKEN.

For the full installation guide including reverse proxy setup, file permissions on NAS, external databases, and environment variable reference, see bookorbit.app/installation.


Documentation and Contributing

Full documentation is at bookorbit.app - covering libraries, metadata, readers, Kobo sync, OPDS, users and permissions, OIDC setup, and more.

For local development, see docs/DEVELOPMENT.md. To contribute, see docs/CONTRIBUTING.md for the full workflow: branch naming, test expectations, PR checklist, and commit format.


Support


License

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