Audiobookshelf is a self-hosted audiobook and podcast server with proper multi-user support, per-user progress sync, and apps on every platform. Where Jellyfin treats audio as just another media type, this one is built around it — chapters, embedded covers, and a progress bar that follows you between devices.
What it is
Point it at a folder of M4B, MP3 or FLAC and it groups them into libraries by author and series, reads the tags, extracts chapter markers, and serves them with resume-where-you-left-off. Podcasts work too: subscribe to a feed, and new episodes are fetched and kept.
Before you start
- Needs the
audiobookshelfnode user and read access to the media directory. If the container can't read the files, you'll see empty libraries rather than an error. - Both a metadata and a cover folder are useful. Missing covers means Audiobookshelf queries external metadata providers, which is slow on a cold library and looks like hanging.
- The transcoding cache lives in a subdirectory of
./configand grows. Mount it separately if your config is on a small volume.
1 — Create the directories
mkdir -p ~/services/audiobookshelf/{config,metadata,cover,transcodes}
mkdir -p /mnt/bigdisk/audiobooks
cd ~/services/audiobookshelf
id audiobookshelf 2>/dev/null || echo "create this user or use your own uid"
2 — Write the compose file
services:
audiobookshelf:
image: ghcr.io/advplyr/audiobookshelf:latest
container_name: audiobookshelf
restart: unless-stopped
user: "1000:1000"
ports:
- "127.0.0.1:13378:80"
environment:
- TZ=UTC
- NODE_ENV=production
- AUDIOBOOKSHELF_GENERIC_METADATA_LOCATION=/metadata
- COVER_LOCATION=/cover
volumes:
- ./config:/config
- ./metadata:/metadata
- ./cover:/cover
- ./transcodes:/config/transcodes
- /mnt/bigdisk/audiobooks:/audiobooks
healthcheck:
test: ["CMD", "curl", "-fs", "http://localhost:80/healthcheck"]
interval: 30s
timeout: 5s
retries: 3
3 — Start it
docker compose up -d
docker compose logs -f audiobookshelf | grep -i "listening\|error"
4 — First-run setup
- Open
http://yourhost:13378and create the root/admin user. This account sees every library, so use it sparingly. - Add libraries. For audiobooks use Single Folder or Author/Series as the library type — the nested option matches how most people already store M4B files.
- Scan the library. With metadata and cover folders populated it's fast; without them it queries providers per item and can take hours for a few thousand books.
- Create per-user accounts and restrict each to the libraries they should see. Settings → Users lets you set a per-user storage path too, which is handy for kids with a small allowance.
- Install the app on your phone and confirm position sync: play twenty seconds, stop, open the app on another device, and check the progress carried over.
5 — Add podcasts
# the container can fetch feeds itself; no cron needed
# Library type: Podcast -> add feed URL -> set auto-download on new episodes