No database container, no companion services. AudioBookshelf runs as one container with /audiobooks, /podcasts, /config and /metadata mounted and SQLite inside. This example pins ghcr.io/advplyr/audiobookshelf:2.37.1 and publishes 13378:80. Back up config and metadata while the container is stopped before changing the version, then verify login, playback and progress sync.
Contents
By LK Wood IV · 2026-06-15 · ~10 min read · St. Louis County, MO
AudioBookshelf is a single Docker container that turns a folder of audiobook files into a real library server: per-user progress sync, metadata matching, mobile apps, and podcast RSS support. It’s the most complete Audible replacement available for self-hosting, and it’s one of the simplest installs on the self-hosted stack.
What you get
- Web interface for browsing and streaming from any browser
- iOS and Android apps (official, free, both still beta) with progress sync
- Per-user accounts (track your books separately from family members)
- Metadata matching from Open Library, Google Books, Audible
- Podcast RSS support with auto-download
- M4B chapter detection, speed controls, sleep timer
- ~100 MB idle RAM — negligible on any shared host
No companion containers needed. No database service (uses SQLite internally, appropriate here because it’s single-threaded read-heavy, not concurrent-write heavy like n8n). One container, one volume mount.
Directory structure for your library
AudioBookshelf scans a directory to build its library. The expected layout for audiobooks:
/audiobooks/
Author Name/
Book Title/
Book Title.m4b
Another Book/
Another Book.m4b
Second Author/
Series Name/
Series Name, Book 1.m4b
Series Name, Book 2.m4b
For MP3 audiobooks that come as numbered chapter files:
/audiobooks/
Author Name/
Book Title/
01 - Chapter One.mp3
02 - Chapter Two.mp3
03 - Chapter Three.mp3
AudioBookshelf groups all files in a directory as a single book. The chapter list is built from M4B metadata (preferred) or filename ordering (MP3 fallback).
For podcasts, use a separate directory:
/podcasts/
Podcast Name/
(AudioBookshelf manages files here via auto-download)
Docker Compose
Save this as /opt/audiobookshelf/compose.yaml. The example pins v2.37.1, checked against the project’s release on 2026-10-12. The pin is documentation-reviewed. A deployment test is still needed on your host, with the configured library permissions and clients, before treating the release as verified for your installation.
Keep the previous version’s image locally until playback and client progress sync have been verified after the upgrade.
services:
audiobookshelf:
image: ghcr.io/advplyr/audiobookshelf:2.37.1
container_name: audiobookshelf
restart: unless-stopped
ports:
- "13378:80"
environment:
- AUDIOBOOKSHELF_UID=1000
- AUDIOBOOKSHELF_GID=1000
volumes:
- /path/to/audiobooks:/audiobooks
- /path/to/podcasts:/podcasts
- /opt/audiobookshelf/config:/config
- /opt/audiobookshelf/metadata:/metadata
Replace /path/to/audiobooks and /path/to/podcasts with your actual library paths. The config and metadata volumes hold AudioBookshelf’s database, cover art cache, and chapter data.
mkdir -p /opt/audiobookshelf/{config,metadata}
cd /opt/audiobookshelf
docker compose config --quiet
docker compose up -d
Access the web UI at http://your-host-ip:13378. On first load, AudioBookshelf prompts you to create an admin account.
Initial library setup
After logging in:
- Settings → Libraries → New Library
- Name it “Audiobooks”, set type to Books, folder path
/audiobooks - Click Scan — AudioBookshelf walks the directory tree and builds the library
For podcasts: create a second library with type Podcast, folder path /podcasts.
The initial scan finds all audio files and groups them by directory. Metadata matching runs separately after the scan.
Metadata matching
After the initial scan, most books will have the title and author from the directory name but no cover art, description, or narrator. Run metadata matching:
Per-book: click a book → Edit → Match → select a source → Apply.
Bulk: Settings → Libraries → Audiobooks → Manage Library → Quick Match All.
Quick Match sends each book’s title and author to the configured metadata sources and applies the first match. For well-known titles, this fills in cover, description, narrator, ISBN, and publication year automatically. For obscure titles, you’ll get no match and need to edit manually.
Best metadata source for most books: Audible. The AudioBookshelf Audible provider pulls cover art and narrator data that Open Library and Google Books often lack. Enable it: Settings → Libraries → Audiobooks → Configure → Book metadata provider → Audible.
Adding podcast feeds
- Settings → Libraries → Podcasts → View Podcasts → Add Podcast
- Paste the RSS feed URL
- Configure: how many episodes to auto-download, whether to keep all episodes or maintain a fixed count
- Click Add
AudioBookshelf checks feeds on a schedule (configurable, default every 24 hours) and downloads new episodes to the podcast library directory. Old episodes beyond your keep count are deleted automatically.
For podcast-only installs, the audiobook library is optional — you can run AudioBookshelf as a podcast manager alone.
Mobile app setup
- Install “AudioBookshelf” from Google Play (Android, beta) or through the TestFlight link on audiobookshelf.org (iOS, early beta — the project says that beta is currently full)
- Open the app → “Connect to your server”
- Enter your server URL:
http://your-host-ip:13378(local) or your external domain if using NPM
For access outside the home network without a public domain, Tailscale is the simplest path: install Tailscale on your phone and server, then use the Tailscale IP (100.x.x.x) as the server address in the AudioBookshelf app. The app connects over the WireGuard mesh without any port forwarding or SSL setup. See the Tailscale remote access guide.
For public HTTPS with a proper domain: point Nginx Proxy Manager at audiobookshelf:80 (or host IP:13378), enable SSL, and use the public domain in the app.
Sharing with family members
Create additional user accounts: Settings → Users → Create User.
Each user gets their own:
- Listening progress (per book, per podcast episode)
- Playback speed preference
- Bookmarks
- Reading speed (for displaying time remaining)
Users see the same library but their progress is independent. If a family member starts listening to a book, their “last played” timestamp won’t affect your progress.
Permissions per user: you can restrict users to specific libraries, disable downloads, or give admin access. For family members who only listen, a standard user with no download permission is the right setup.
Listening stats
AudioBookshelf tracks listening time per user, per book, and per library. Check: Settings → Users → (username) → Listening Sessions.
The stats page shows daily and monthly listening time, total hours per book, and which device was used. It’s not exported to any external system by default, but the AudioBookshelf API exposes session data for integration with external dashboards if you want it in Grafana.
Backing up AudioBookshelf
AudioBookshelf’s data lives in two places:
/opt/audiobookshelf/config/— SQLite database (audiobookshelf.db), server configuration/opt/audiobookshelf/metadata/— cover art cache, chapter data, backup metadata
Your actual audiobook files (in /audiobooks/) are the source of truth and should be backed up independently as part of your media storage backup strategy.
Run this from /opt/audiobookshelf. Stop the container so the SQLite database and its journal files are captured together. The archive also stores the Compose file with the version used for that backup:
set -euo pipefail
backup_dir="/backup/audiobookshelf/$(date -u +%Y%m%dT%H%M%SZ)"
install -d -m 0700 "$backup_dir"
docker compose stop audiobookshelf
trap 'docker compose start audiobookshelf' EXIT
tar -C /opt/audiobookshelf -czf "$backup_dir/state.tar.gz.tmp" \
config metadata compose.yaml
tar -tzf "$backup_dir/state.tar.gz.tmp" >/dev/null
mv "$backup_dir/state.tar.gz.tmp" "$backup_dir/state.tar.gz"
docker compose start audiobookshelf
trap - EXIT
printf 'Backup directory: %s\n' "$backup_dir"
Copy the archive to a separate backup target. Listing it checks readability. To confirm recovery, restore into an isolated instance with copies of the media and check accounts, library entries and saved listening positions before relying on the backup.
Coexistence with Jellyfin
AudioBookshelf and Jellyfin handle different media types and don’t conflict. Jellyfin handles video (movies, TV shows, home video); AudioBookshelf handles audio (audiobooks, podcasts). Both can run on the same host, same Docker Compose file, sharing the same reverse proxy.
Don’t add your audiobook directory to Jellyfin — Jellyfin has weak audiobook support and won’t import M4B chapter data correctly. AudioBookshelf is the right tool for audio; Jellyfin is the right tool for video. The Jellyfin setup guide covers the video side.
Updating AudioBookshelf
Read the release notes for the target version. Run the backup sequence above and record its directory. Edit image: in compose.yaml to that exact release:
docker compose config --quiet
docker compose pull audiobookshelf
docker compose up -d audiobookshelf
docker compose ps audiobookshelf
docker compose logs --tail=100 audiobookshelf
curl --fail --silent --show-error http://127.0.0.1:13378/ >/dev/null
The HTTP check confirms the web server responds. Log in and play a book. Change its position, then confirm that position on a second device. A running container alone does not verify database migrations or progress sync.
If those checks fail, stop the new container. Preserve its data for diagnosis. Restore the old Compose pin with its matching pre-upgrade state, because an older image may not understand a database migrated by a newer one. Replace the backup path below with the directory printed before the upgrade:
cd /opt/audiobookshelf
docker compose stop audiobookshelf
mv config "config.failed-$(date -u +%Y%m%dT%H%M%SZ)"
mv metadata "metadata.failed-$(date -u +%Y%m%dT%H%M%SZ)"
tar -xzf /backup/audiobookshelf/REPLACE-WITH-BACKUP-TIMESTAMP/state.tar.gz \
-C /opt/audiobookshelf
docker compose config --quiet
docker compose up -d audiobookshelf
Repeat those checks after rollback. Keep the media backup separate; the state archive does not include audiobook or podcast files.
AudioBookshelf is item #9 in the 12 best self-hosted apps guide — see that article for how it fits alongside Jellyfin, Nextcloud, and the rest of the stack. For video streaming alongside your audiobook library, the Jellyfin Docker setup guide covers hardware transcoding and remote access.
Sources
- AudioBookshelf documentation – official reference for library setup, metadata, podcasts, users, and the mobile apps
- Docker Compose documentation – official reference for the Compose file used to run the container
- Jellyfin documentation – official docs for the companion video server that coexists with AudioBookshelf
Frequently asked questions
What audio formats does AudioBookshelf support?
Does AudioBookshelf track progress per user across devices?
Can AudioBookshelf add podcast feeds?
What metadata sources does AudioBookshelf use?
Is there an iOS app for AudioBookshelf?
How do I access AudioBookshelf outside my home network?
Sources and corrections
- Last updated
- Methodology
- See our methodology for research and review standards.
- Corrections
- Spotted an error or a stale number? Email contact@techfuelhq.com. Confirmed corrections are recorded here with the date and change.