Getting Started
Goal
Get your library syncing in about 10 minutes.
Prerequisites
All you actually need:
- Docker and Docker Compose
- An ebook folder on the Docker host (mounted as
/books) - At least two places you read or listen that you want kept in sync
Common starting points:
- Audiobookshelf + KOReader — the classic audiobook ↔ ebook pairing
- Ebook-only — KOReader, BookFusion, Grimmory, BookOrbit, or CWA in any combination, with Audiobookshelf intentionally disabled
Everything else — Storyteller, Hardcover, StoryGraph, Readest, Telegram, AI assist — is optional and can be added later from the Settings UI.
Storyteller is optional
You do not need Storyteller for audio ↔ ebook sync. The bridge aligns audio and text itself using built-in Whisper transcription (or the EPUB's SMIL data). Add Storyteller only if you actually use the Storyteller read-along app.
Step 1: Gather your ABS details
Setting up ebook-only? Skip this step — you will enter disabled for Audiobookshelf later.
Audiobookshelf API token
- Log into Audiobookshelf.
- Go to Settings -> Users -> Your user.
- Click Generate API Token.
- Copy the token.
ABS library ID
If you want searches scoped to one ABS library:
- Open the audiobook library in Audiobookshelf.
- Look at the URL.
- Copy the part after
/library/.
Optional service credentials
If you plan to use them, also keep these handy:
- KOSync URL, username, and password
- BookFusion account access, if you want BookFusion progress or highlight sync
- Grimmory and/or BookOrbit URL, username, and password
- CWA URL, username/password, and Kobo sync token if you use Calibre-Web Automated
- Storyteller URL, username, and password
Step 2: Prepare a working directory
mkdir ~/bookbridge
cd ~/bookbridge
mkdir data
Step 3: Create docker-compose.yml
services:
abs-kosync:
container_name: bookbridge
image: ghcr.io/cporcellijr/bookbridge:latest
restart: unless-stopped
ports:
- "8080:5757"
# - "5758:5758" # Optional: expose the sync-only port when using KOSYNC_PORT=5758
environment:
- TZ=America/New_York
- LOG_LEVEL=INFO
# - KOSYNC_PORT=5758 # Optional: enable split-port mode
# Configure ABS, KOSync, BookFusion, Grimmory, BookOrbit, CWA, Storyteller, and other services in the Web UI.
volumes:
- ./data:/data
- /path/to/ebooks:/books
# - /path/to/storyteller/library:/storyteller_library # Optional: local Storyteller fallback/download access
# - /path/to/storyteller/assets:/storyteller/assets # Optional: Storyteller transcript ingest
Split-port mode
By default, port 8080 exposes the full web UI and API.
If you want to expose only the KOSync endpoint to the internet:
- Uncomment
KOSYNC_PORT=5758. - Uncomment the
5758:5758port mapping. - Keep
8080private to your LAN or reverse proxy.
Optional Integrations
It is usually easiest to start with the minimal compose file above and finish configuration in the Web UI.
If you enable Grimmory or BookOrbit, the bridge can use them for ebook matching and audiobook sources. If you enable CWA, the bridge can use it as an ebook source and, when Kobo sync is enabled, as a reading-progress participant.
Forge uploads directly to Storyteller over the API, so a Storyteller library mount is not required for normal Forge imports.
If you mount Storyteller assets at /storyteller/assets, set Storyteller Assets Path in Settings to /storyteller.
The assets path can be configured entirely in the UI; STORYTELLER_ASSETS_DIR is optional.
Step 4: Start the service
docker compose up -d
Check the logs:
docker compose logs -f
Step 5: Create your account and finish configuration
Settings are split by scope: server-wide connections (URLs, engine behavior) live in Settings → Integrations, while your personal logins (tokens, usernames, passwords) live in My Account → My Integrations. Both pages show the same service cards, with the same names, in the same order.
- Open
http://localhost:8080. The first time you open it, you will be asked to create your account — choose a username and password. This becomes your main (admin) account. - Open Settings → Integrations.
- On the Audiobookshelf card, enter your Server URL — or
disabledfor an ebook-only install. - Enable any optional services you use and enter their server URLs: Grimmory, BookOrbit, CWA, BookFusion, Storyteller, Readest, Hardcover, StoryGraph.
- Click Save Settings and wait for the app to come back.
- Open Account → My Integrations and enter your personal logins: your ABS API token and Library ID, KoSync username/password, and any other service accounts. Use the Test button on a card to check a login before saving.
- If you mounted Storyteller assets, set Storyteller Assets Path to
/storytellerunder Settings → System.
Sharing with more than one reader?
Your main account can add other people from Settings -> Users. Each reader signs in to their own dashboard, opens Account -> My Integrations, enters their own service logins, and only sees the books they are reading - so everyone keeps their own progress, even on the same book. Admins can also fill those integrations for a reader from Settings -> Users -> Integrations.
Step 6: Create your first mapping
You can start in either of these ways:
Suggestions
- Open Suggestions.
- Click Scan Library.
- Review the likely pairs.
- Add the good ones to the queue.
- Click Process All.
If your audiobook and ebook services point at the same mounted /books tree,
sibling audio and ebook files in the same title folder appear as high-confidence
same-folder matches.
Add / Update Book
- Open Add / Update Book.
- Pick an ABS, Grimmory, or BookOrbit audiobook, or leave audio on None / Skip for an ebook-only link.
- Optionally pick a Storyteller title (skip this unless you use the Storyteller app).
- Pick the standard ebook.
- Click Create Mapping.
That is enough to get syncing started. The normal background cycle runs every 5 minutes by default, and instant sync can react faster when supported by the source.
Optional: Connect a KOReader device
Open My Account → Connect a KOReader device for a two-step card:
- Point KOReader at the bridge. Copy the sync-server address shown on the card into KOReader's Tools → Progress sync → Custom sync server, then sign in on the device with the KoSync username/password from My Integrations. This alone gives you progress sync.
- Install the Bridge Sync plugin (download on the same card). The plugin delivers books
from the bridge byte-for-byte — so KOReader progress auto-links with no manual matching —
and adds reading-stats sync plus highlight and note sync. Unzip it into
koreader/plugins/, restart KOReader, then open Tools -> Bridge Sync to set the same server URL and KoSync login.
Plain KOReader/KOSync progress sync works without the plugin; highlights, notes, sweep, and close-capture need the Bridge Sync plugin from the current release or newer. With the plugin installed, each reader's integrations can also turn Grimmory shelves or Hardcover lists into KOReader collections for synced books.
This is optional. The bridge works without it.