bookorbit

bookorbit

apps.detail.official

apps.detail.types.app from joshcrosby's Repository

apps.detail.sections.overview

BookOrbit is a self-hosted digital library and reading platform for EPUB, MOBI, AZW3, PDF, CBZ/CBR comics, and M4B/MP3 audiobooks, with sync to Kobo and KOReader devices, rich metadata lookup, reading stats, OPDS, and multi-user/OIDC support. THIS APP REQUIRES A COMPANION DATABASE. Install the "bookorbit-db" template FIRST or an instance of pgvector-18 and let it fully start (~20-30 seconds) before starting this container. Both containers must share a custom Docker network if they are setup to reach each other by name. Before installing, go to Docker Settings and create a custom network named "bookorbit" (Docker -> Add a new network -> name it "bookorbit", bridge driver), then attach both containers to it. Otherwise, use the database's IP and port to reach it. Required secrets - generate these yourself before filling in the fields below: openssl rand -hex 24 -> Postgres Password (also set on bookorbit-db) openssl rand -hex 32 -> JWT Secret openssl rand -hex 16 -> Setup Bootstrap Token After both containers are running, open App URL in your browser. You'll be redirected to a setup wizard - use your Setup Bootstrap Token to create the admin account. Full docs: https://bookorbit.app/installation.html

BookOrbit

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

Latest release Stars CI Release Coverage Crowdin

Website Demo GHCR Pulls Contributing License: AGPL v3

BookOrbit dashboard showing reading stats, widgets, and book shelves


What is BookOrbit?

BookOrbit organizes your books and reads them back to you anywhere: the web reader, a Kobo, or KOReader. Progress, highlights, and reading status move between all three, so you can start a chapter in one place and finish it in another.

Around that core sit 14 metadata providers, reading statistics and achievements, OPDS and Send-to-Kindle delivery, multi-user accounts with OIDC/SSO, and automatic sync out to Hardcover, Readwise, and StoryGraph. All of it runs on infrastructure you control.

Visit Website

Live Demo

Try the live instance before you install. No account required.

Launch Live Demo

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

Features

Reading Experience & Sync

  • Built-in Web Readers: Ebooks (EPUB, KEPUB, MOBI, AZW3, AZW, FB2), PDFs, comics (CBZ, CBR, CB7), and audiobooks (M4B, MP3, M4A, OPUS, OGG, FLAC), with no extra plugins required.
  • Three-Way Sync (Kobo + KOReader + BookOrbit): Progress and annotations flow bidirectionally between Kobo devices, KOReader, and the BookOrbit web reader. Pick up on any surface where you left off on another, including highlights and deletions.
  • KOReader Plugin: An on-device catalog browser with search, download, and status and rating management, alongside full progress and annotation sync.
  • Annotations & Highlights: Highlights from the web reader, KOReader, and Kobo merge into one searchable hub. Filter by color, style, and source; export as Markdown, CSV, or JSON.
  • Hardcover, Readwise & StoryGraph Sync: Push status, progress, reading dates, and ratings to Hardcover on configurable triggers; status and progress to The StoryGraph; and new highlights and notes to Readwise as you create them, from both the web reader and synced devices. Hardcover read history can be pulled back to backfill blank BookOrbit entries.
  • Statistics, Goals & Achievements: Daily reading time, heatmaps, streaks, and library health, plus yearly goals, monthly challenges, and 50+ achievements across five categories. Reading DNA profiles your reading style from your actual session history.

Library Management

  • Multiple Libraries: Isolate content with per-library folders, custom scan rules, and format priorities.
  • 14 Metadata Providers: Google Books, Open Library, Amazon, Goodreads, Kobo, Hardcover, Audible, Audnexus, Libro.fm, and iTunes, plus ComicVine for comics, RanobeDB for light novels, and Aladin and Lubimyczytać for Korean and Polish catalogs. Cover art is sourced separately from iTunes, DuckDuckGo, and AudiobookCovers.
  • Smart Scopes & Collections: Organize your collection with curated lists and dynamic, rule-based saved filters.

Platform & Delivery

  • Multi-User & SSO: Granular per-user permissions and isolated reading data, with native support for Authentik, Keycloak, and Authelia via OIDC.
  • Multilingual Interface: Community translations are managed on Crowdin. See the localization guide for current language support and contributor instructions.
  • Content Delivery: OPDS support for compatible apps, Send-to-Kindle via email, and browser drag-and-drop uploads.
  • Automated Ingestion: Configure a Book Dock drop folder for hands-free importing.

Quick Start (Docker)

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

On a NAS, or any host where your book folder is owned by a user other than UID 1000, also set PUID and PGID to match that owner. Run id -u and id -g as the owning user to find them. Getting these wrong is the most common cause of permission errors on first scan.

Optionally set LIBRARY_BROWSE_ROOT=/books to start the library folder picker at /books instead of /.

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.

KOReader Plugin

The BookOrbit plugin for KOReader adds progress sync, two-way annotation sync, and a native catalog browser: navigate, search, and download books from your library without leaving the device.

BookOrbit KOReader Plugin showing dashboard, catalog search, and book details

  1. In BookOrbit, go to Settings > Integrations > KOReader and click Download Plugin.
  2. Unzip bookorbit.koplugin.zip.
  3. Copy bookorbit.koplugin to koreader/plugins/ on the device.
  4. Restart KOReader and open a book.
  5. Use Tools > BookOrbit Sync to connect.

The download is pre-configured with your server URL and credentials, so there is no manual entry on the device. For full setup and sync options, see bookorbit.app/koreader-plugin.

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.

Repository Activity

BookOrbit repository activity: commits, issues, and pull requests over the last 30 days

Translations

Help translate BookOrbit into your language on Crowdin.

When adding user-facing text in code, add the Vue I18n key only to client/src/locales/en.json. Do not edit non-English catalogs in a feature pull request; untranslated keys fall back to English until Crowdin provides a translation. See docs/LOCALIZATION.md for the complete workflow.

Translation progress

Star History

BookOrbit GitHub star history

Support

License

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

apps.marketingCta.appInstallTitle

apps.marketingCta.appInstallDescription

apps.installHelp.stepOpen apps.installHelp.stepSearchApp apps.installHelp.stepReview apps.installHelp.stepInstall

apps.detail.sections.requirements

bookorbit-db/pgvector-18 must be created and started first and reachable by this container.

apps.detail.sections.categories

apps.detail.sections.related

apps.detail.sections.details

apps.detail.details.repository
ghcr.io/bookorbit/bookorbit:latest
apps.detail.details.lastUpdated2026-08-11
apps.detail.details.firstSeen2026-07-10

apps.detail.sections.runtime

apps.detail.details.webui
http://[IP]:[PORT:3000]/
apps.detail.details.network
bridge
apps.detail.details.shell
sh
apps.detail.details.privileged
false
apps.detail.details.extraParams
--init --read-only --tmpfs /tmp --cap-drop=ALL --cap-add=CHOWN --cap-add=DAC_OVERRIDE --cap-add=FOWNER --cap-add=SETGID --cap-add=SETUID --security-opt no-new-privileges:true --stop-timeout 30 -e NODE_ENV=production -e PORT=3000 --health-cmd="node -e \"const p=process.env.PORT||3000;fetch('http://127.0.0.1:'+p+'/api/v1/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"" --health-interval=30s --health-timeout=5s --health-retries=3 --health-start-period=20s

apps.detail.sections.configuration

WebUI PortPorttcp

Host port used to reach BookOrbit. Maps to the fixed internal port 3000.

apps.detail.config.target
3000
apps.detail.config.default
3000
apps.detail.config.value
3000
Books FolderPathrw

Host folder where your book files live. Point this at your existing media/books share.

apps.detail.config.target
/books
apps.detail.config.default
/mnt/user/data/media/books
apps.detail.config.value
/mnt/user/media/books
App DataPathrw

BookOrbit's own app data (config, generated files). BookOrbit manages ownership of this folder automatically.

apps.detail.config.target
/data
apps.detail.config.default
/mnt/user/appdata/bookorbit
apps.detail.config.value
/mnt/user/appdata/bookorbit
App URLVariable

Full URL you'll use to open BookOrbit, e.g. http://192.168.1.10:3000 for direct LAN access, or https://books.example.com if behind a reverse proxy.

apps.detail.config.target
APP_URL
BookOrbit Books FolderVariable

Host folder mounted as /books in the container.

apps.detail.config.target
BOOKS_HOST_PATH
apps.detail.config.default
./books
apps.detail.config.value
./books
Postgres UserVariable

Must exactly match POSTGRES_USER on the bookorbit-db container.

apps.detail.config.target
POSTGRES_USER
apps.detail.config.default
bookorbit
apps.detail.config.value
bookorbit
Postgres PasswordVariable

Must exactly match POSTGRES_PASSWORD on the bookorbit-db container.

apps.detail.config.target
POSTGRES_PASSWORD
Postgres DBVariable

Must exactly match POSTGRES_DB on the bookorbit-db container.

apps.detail.config.target
POSTGRES_DB
apps.detail.config.default
bookorbit
apps.detail.config.value
bookorbit
Postgres HostVariable

IP of bookorbit-db container or 'bookorbit-db' if both containers share a custom network.

apps.detail.config.target
POSTGRES_HOST
Postgres PortVariable

Port the Postgres container listens on internally.

apps.detail.config.target
POSTGRES_PORT
apps.detail.config.default
5432
apps.detail.config.value
5432
JWT SecretVariable

Long random secret used to sign login tokens. Generate with: openssl rand -hex 32

apps.detail.config.target
JWT_SECRET
Setup Bootstrap TokenVariable

One-time token used to claim the admin account on first setup. Generate with: openssl rand -hex 16

apps.detail.config.target
SETUP_BOOTSTRAP_TOKEN
PUIDVariable

User ID BookOrbit runs/writes files as. Must have read (and write, for uploads/Book Dock) access to your Books Folder.

apps.detail.config.default
1000
apps.detail.config.value
1000
PGIDVariable

Group ID BookOrbit runs/writes files as.

apps.detail.config.default
1000
apps.detail.config.value
1000
Book Dock PathVariable

Advanced: internal path for the Book Dock drop-folder feature. Leave blank unless you've read the Book Dock docs and mapped an additional volume for it.

apps.detail.config.target
BOOK_DOCK_PATH
Fix PermissionsVariable

BookOrbit automatically repairs ownership of the App Data folder on startup. Set to false only if your platform manages that folder's ownership externally.

apps.detail.config.target
BOOKORBIT_FIX_PERMISSIONS
apps.detail.config.default
true
apps.detail.config.value
true
Node Max Old Space SizeVariable

Node.js heap limit in MB. Raise this (e.g. 4096) for very large libraries if you see out-of-memory errors. 'auto' lets Node decide.

apps.detail.config.target
NODE_MAX_OLD_SPACE_SIZE
apps.detail.config.default
2048
apps.detail.config.value
2048
Log LevelVariable

Log verbosity. Set to 'debug' for troubleshooting.

apps.detail.config.target
LOG_LEVEL
apps.detail.config.default
info
apps.detail.config.value
info