
AudioBookShelf
Self-hosted audiobook and podcast server
Overview
AudioBookShelf is a self-hosted audiobook and podcast server. It organizes your audiobooks and podcasts into libraries, keeps your listening position in sync across the web client and the official iOS and Android apps, subscribes to podcast RSS feeds with automatic episode downloads, and matches rich metadata (covers, narrators, series, chapters) from Audible, iTunes, and Google Books. AudioBookShelf ships its own complete multi-user authentication — you create the admin account in your browser on first visit, and manage additional users with per-library permissions inside the app.
QuickBox Pro installs AudioBookShelf per user, built from source: the installer clones the latest upstream release tag, provisions an isolated Node.js 20 runtime for your user, compiles the native SQLite bindings, and generates the web client with your personal URL path baked in. The result is a single systemd service served at https://your-server/username/audiobookshelf/ through a clean nginx reverse proxy — no rewrites, no path tricks. Docker images and the upstream .deb package are upstream alternatives and are not used by the QuickBox package.
Because the install is a real source build, the first install (and every update) takes noticeably longer than a binary application — expect several minutes while dependencies compile and the web client is generated.
Key features
Audiobook & Podcast Library
Organize audiobooks and podcasts with chapters, series, collections, and per-book progress tracking
Progress Sync
Listening position stays in sync across the web client and the official iOS and Android apps in real time
Podcast Auto-Download
Subscribe to RSS feeds with scheduled episode downloads, retention rules, and episode search
Metadata Matching
Covers, descriptions, narrators, series, and chapters from Audible, iTunes, and Google Books
Built-In Multi-User Auth
Per-user accounts with granular library permissions; the admin account is created in-browser on first visit
Mobile Apps
Official iOS and Android apps with offline listening and background playback
Per-User Service
Isolated Node.js 20 runtime and systemd unit audiobookshelf@username with auto-allocated port and loopback-only binding
Reverse-Proxy Ready
Native nginx subpath at /username/audiobookshelf/ with WebSocket support and optional custom-domain SSL
When to use it
Good fit
- You want a self-hosted home for your audiobook collection with chapter support and progress tracking
- You want podcast subscriptions that download new episodes automatically
- Multiple people share your audiobook library and need their own accounts and listening positions
- You listen on the go and want official mobile apps with offline playback
What you get
- Install via
qb install audiobookshelf -u username— built from source with an isolated Node.js 20 runtime - Served at
https://your-server/username/audiobookshelf/by default, with optional custom subdomain and SSL - Single per-user systemd service
audiobookshelf@usernamewith auto-start on boot - For a full music server, look at Airsonic or Subsonic instead; for comics and manga, look at Kavita or Komga
Installation
Install from the QuickBox CLI
qb install audiobookshelf -u usernameThe install clones the latest stable release tag from the upstream repository, builds a per-user Node.js 20 runtime, installs the server dependencies (including a native SQLite module compile), and generates the web client with your per-user URL path baked in.
AudioBookShelf publishes no prebuilt Linux binaries, so QuickBox builds it from source. The first install and every update spend several minutes on dependency installation and the web client build — this is normal. You can follow the build in /opt/quickbox/logs/audiobookshelf.log.
CLI commands
Install flags
AudioBookShelf tracks stable tagged releases only — there is no --beta flag. Passing --dns without --dns-provider fails fast before any work is done.
Install from the Dashboard
You can also install AudioBookShelf from the QuickBox Pro dashboard. The dashboard installs for the currently signed-in user — there is no user picker on the install dialog. To install for a different user, use the CLI with an explicit -u <other_user>.
To install from the dashboard:
- Open App Dashboard → Package Management (
/dashboard?mode=packages) - Find AudioBookShelf under the Media Servers category
- (Optional) Switch the Custom Domain toggle to Custom and enter a domain — the install issues an SSL certificate and publishes on that subdomain. Choose HTTP-01 (the default) or DNS-01 as the challenge method; DNS-01 also asks for the DNS provider
- Submit — a live install log streams in the response modal
The dashboard runs the same install pipeline as the CLI.
The upstream default port is 3333, but QuickBox assigns each user their own free port at install time and binds it to 127.0.0.1 only — nginx is the sole public entry point. The assigned port is recorded in the QuickBox database and shown on the AudioBookShelf row in the dashboard’s App Dashboard. You never need to touch it.
Access and authentication
URL
AudioBookShelf is published under the per-user subpath of your QuickBox server by default:
https://your-server/username/audiobookshelf/The web client is generated with this exact path baked in, so the subpath is served natively — including the socket.io WebSocket connection that powers real-time progress updates. You can also click Open on the AudioBookShelf row in the dashboard’s App Dashboard to launch the UI directly. When AudioBookShelf is published on a custom subdomain (see Custom subdomain with SSL below), the Open link points at https://<your-subdomain>/ instead.
First-run setup
AudioBookShelf manages its own accounts. On your first visit, the app shows an initialization screen where you create the admin (root) account in the browser — pick a username and a strong password. QuickBox does not generate, write, or store any AudioBookShelf credentials; there is no default password and no credentials file to retrieve.
- Open
https://your-server/username/audiobookshelf/ - On the initialization screen, create the root user — choose a username and a strong password
- Sign in with the account you just created
- Create your first library: pick Books or Podcasts, then add one or more folders that hold your media
- AudioBookShelf scans the folders and matches metadata automatically
Additional accounts, per-library permissions, and all other user management live inside the app under Settings → Users. These AudioBookShelf accounts are separate from QuickBox accounts — every QuickBox user who installs AudioBookShelf gets their own private instance with its own users.
Unlike some QuickBox applications, there is no auto-generated admin password for AudioBookShelf and nothing to reveal in the dashboard. The root account exists only after you create it in the browser, and AudioBookShelf stores it in its own database.
Custom subdomain with SSL
By default AudioBookShelf serves under the per-user subpath of your main server address. You can also publish it on a dedicated subdomain (for example audiobookshelf.example.com) with a Let’s Encrypt certificate. There are three ways to set this up: a single-call install (Path A), a post-install retrofit from the CLI (Path B), and the dashboard SSL Control page (Path C).
AudioBookShelf bakes its serving path into the web client at build time. Whenever the install flips between the per-user subpath and a custom subdomain — in either direction — QuickBox automatically rebuilds the client for the new base. The service stops during the rebuild and starts again when it finishes; expect a few minutes of downtime for the flip. Your library, users, and progress are not affected.
Path A — Subdomain at install time
The fastest path is to pass -d <domain> to the install. The certificate is issued, the subdomain vhost is written, and the web client is built for the subdomain on the first try — you never see the subpath URL.
Point a DNS record (A or CNAME) for your chosen subdomain at the server, then run:
qb install audiobookshelf -u username -d audiobookshelf.example.comThe install chain-calls Let’s Encrypt under the hood and auto-detects any saved DNS provider credentials, switching to the DNS-01 challenge automatically when it finds them. To force the DNS-01 challenge explicitly:
qb install audiobookshelf -u username -d audiobookshelf.example.com --dns --dns-provider cloudflarePath B — Retrofit a subdomain to an existing install
If AudioBookShelf is already running on the per-user subpath and you want to move it to a dedicated subdomain, issue the certificate with the AudioBookShelf-specific lecert flag:
qb install lecert --audiobookshelf -d audiobookshelf.example.com -u usernameThis uses the same shape as every other lecert-managed application (--emby, --jellyfin, --plex, --komga, etc.). QuickBox:
- Requests a Let’s Encrypt certificate for the supplied domain (HTTP-01 challenge by default)
- Writes the subdomain vhost into
/etc/nginx/sites-enabled/username.audiobookshelf.confwith your assigned port filled in - Stops the service, rebuilds the web client for the subdomain root, and starts it again
- Reloads nginx and registers the certificate for automatic renewal
Wildcard or DNS challenge: add --dns --dns-provider cloudflare (or another supported provider). See the Let’s Encrypt application reference for the full list of supported DNS providers.
Testing without rate-limit exposure: add --staging to issue against the Let’s Encrypt staging CA, or --dry-run to validate the ACME challenge without writing any certificate or nginx changes. Combine the two to fully exercise the flow with zero side effects.
Removing the subdomain: qb remove lecert --audiobookshelf -d <domain> -u username deletes the subdomain vhost. If AudioBookShelf is still installed, QuickBox rebuilds the web client for the per-user subpath and restores the subpath nginx config, so subpath access continues to work.
Path C — Dashboard SSL Control
The dashboard’s SSL Control page at System → SSL Control (/system/ssl) exposes the same flow. The form fields, in order, are:
- Target — pick AudioBookShelf from the dropdown
- Domain — your chosen subdomain (for example
audiobookshelf.example.com) - Challenge Method — HTTP-01 (the default) or DNS-01
- DNS Provider — only shown when DNS-01 is selected
- DNS credentials — only shown when DNS-01 is selected and no credentials are saved for that provider yet
- Username — the QuickBox user that owns the install
The SSL Control page runs the same qb install lecert --audiobookshelf pipeline under the hood.
For end-to-end SSL setup, supported DNS providers, wildcard certificates, and renewal behavior, see the SSL Certificates dashboard page and the Let’s Encrypt application reference.
Configuration and files
AudioBookShelf keeps the application install and your library state in two separate trees. Everything that matters to you — the database, covers, cached metadata, and logs — lives under /home/username/.config/audiobookshelf/. The install tree under /opt/username/audiobookshelf/ is disposable and is rebuilt on every update.
AudioBookShelf has no text settings file — all in-app settings live in the SQLite database and are managed through the web UI. The only file QuickBox manages is env.conf, which carries the runtime environment the systemd unit loads (port, bind address, data paths, and serving base). It is kept in sync automatically by installs, updates, and SSL flips.
The managed nginx config allows uploads up to 10 GB per file for audiobook and podcast uploads through the web UI, and holds WebSocket connections open for real-time progress sync. You do not need to tune nginx yourself.
Service management
AudioBookShelf runs as a single per-user systemd unit:
# Check status
sudo systemctl status audiobookshelf@username
# Restart / stop / start
sudo systemctl restart audiobookshelf@username
sudo systemctl stop audiobookshelf@username
sudo systemctl start audiobookshelf@username
# Follow the service log
sudo journalctl -u audiobookshelf@username -fThe service starts automatically at boot. The application’s SQLite database migrates itself on start after an update — no manual migration step is ever needed. In-app daily logs are also written to /home/username/.config/audiobookshelf/config/logs/, but the systemd journal carries the full output and is the first place to look.
Common tasks
Add an audiobook library
- Sign in and click the library switcher in the top bar, then Add Library (or go to Settings → Libraries)
- Choose Books as the media type and add the folder(s) that hold your audiobooks
- Save — AudioBookShelf scans the folders and matches covers, series, narrators, and chapters automatically
Subscribe to a podcast with auto-download
- Create a library with the Podcasts media type pointed at a folder for episode storage
- In the podcast library, click Add → Podcast and search by name or paste an RSS feed URL
- On the podcast’s page, enable Auto Download Episodes and set the check interval and retention to taste
Update AudioBookShelf
qb update audiobookshelf -u usernameThe update backs up your database, fetches the newest stable release tag, rebuilds the server dependencies and the web client with the same serving base the install is using, and restarts the service. Your library, users, and progress are untouched — all state lives outside the install tree. Like the install, the update is a source build and takes a few minutes.
Check the logs
# Service output (the canonical log stream)
sudo journalctl -u audiobookshelf@username -f
# In-app daily logs
ls /home/username/.config/audiobookshelf/config/logs/
# QuickBox install/update build log
tail -f /opt/quickbox/logs/audiobookshelf.logBack up your library state
Everything worth keeping lives in one tree. Back it up while the service is stopped for a clean snapshot:
sudo systemctl stop audiobookshelf@username
tar -czf ~/audiobookshelf-backup.tar.gz -C /home/username/.config audiobookshelf
sudo systemctl start audiobookshelf@usernameQuickBox also snapshots absdatabase.sqlite into /home/username/.QuickBox/software/audiobookshelf/ during installs and updates.
Remove AudioBookShelf
qb remove audiobookshelf -u usernameqb remove audiobookshelf deletes the full per-user state tree at /home/username/.config/audiobookshelf/ — the database, every user account, listening progress, covers, cached metadata, and logs — along with the install tree and the per-user Node runtime. Back up the state tree first if there is any chance you will want your library back. Your actual audiobook and podcast media files in your library folders are NOT touched.
Troubleshooting
Source builds are slow by nature — the native SQLite compile and the web client generation can each run for minutes with little console output. Follow /opt/quickbox/logs/audiobookshelf.log to watch the real progress before assuming a hang.
On its very first start, AudioBookShelf downloads a small SQLite extension from upstream, and — only if your system’s ffmpeg is older than the version it needs — its own ffmpeg copy into the config directory. This is a one-time fetch; subsequent starts are fast. The install waits for the app to answer its health check before reporting success, so a slightly longer first install is normal.
Check the journal first: sudo journalctl -u audiobookshelf@username -n 100. The most common causes are a missing or interrupted build (rerun qb update audiobookshelf -u username to rebuild) and filesystem permission drift under the state tree (files under /home/username/.config/audiobookshelf/ must be owned by your user).
The web client is built for exactly one serving base. QuickBox rebuilds it automatically whenever you flip between the subpath and a custom subdomain — but if a rebuild was interrupted (power loss, manual cancel), the client and the URL can disagree, which shows up as a blank page or 404ing assets. Run qb update audiobookshelf -u username to rebuild the client for the currently active base.
QuickBox holds no copy of your AudioBookShelf credentials — accounts live entirely inside the app. If another admin-level account exists on your instance, it can reset the password under Settings → Users. Otherwise, restoring a backup of the state tree (taken while you still had access) is the recovery path.
Best practices
Do
- Choose a strong password for the root account you create on first run — the login page is reachable by anyone who can reach your server
- Back up
/home/username/.config/audiobookshelf/regularly — the database, progress, and covers all live there - Use
qb update audiobookshelf -u usernamefor updates — it backs up the database and rebuilds the client with the correct serving base - Use the official iOS and Android apps for on-the-go listening with progress sync
- Keep an eye on free disk space — cover art and cached metadata under
metadata/grow with your library
Don't
- Don't run
qb remove audiobookshelfwithout a backup — it permanently wipes your database, users, and progress - Don't edit the port in
env.confby hand — nginx and the QuickBox database must agree with it, and QuickBox manages all three together - Don't delete the
.base_pathmarker in the state tree — updates use it to rebuild the web client for the right URL - Don't install AudioBookShelf from apt or Docker alongside the QuickBox package — they will fight over ports and data paths
FAQ
Resources
Join the Community
Media server operators sharing configs, getting support, and shaping the future of QuickBox Pro.