First run
1. Grab your admin credentials
On its very first start the server creates an admin account and prints the password plus an auth
code exactly once — save them. (With --setup, a browser wizard sets the
password for you instead.)
# In the server's logs on first start:
admin password: 9f3c… (shown once — save it)
auth code: ABCD-EFGH (redeem to pair a device)
With Docker, run docker compose logs to see them. Sign in to the admin console at
/admin with the username admin and that password.
2. Add a library
Point a library at a folder of audiobooks — the one you mounted at /library in Docker,
for example. You can do this in the admin console, or via the API:
# Get a session token by logging in as admin:
TOKEN=... # from POST /api/v1/auth/login
# Add a library, then browse it immediately:
curl -X POST https://your-server/api/v1/admin/libraries \
-H "Authorization: Bearer $TOKEN" \
-d '{"name":"Main","root":"/library"}' There's nothing else to configure: the scanner auto-detects each folder's shape (single-file m4b, folder-per-book, or multi-file mp3 parts) and indexes titles, authors, chapters and cover art. A folder it misclassifies can be overridden per-folder from the admin console.
3. Pair a device
The connect flow turns an auth code into a durable, device-scoped session:
-
In the admin console, mint an auth code or click Copy invite to get a shareable
link (
/connect#code=…— the code rides in the URL fragment, so it never hits the server logs). - The connect screen shows a QR code with Open in app / Open web player. Scanning opens the native app (when it claims your domain) or the web player.
- The client exchanges a single-use pairing token for a device-named session token. Username and password login is also supported.
4. Open the web player
The Docker image and native binaries serve the installable web player at /web. Open it
in a browser and “Add to Home Screen” for an app-like experience, or wait for the native
apps (see the download page). Either way, your progress, bookmarks and notes
sync across every device you connect.
Tip: set public_url to your real external URL before
minting invites, so the QR and copy-invite links point somewhere your devices can actually reach.