Quick answer

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:

  1. Settings → Libraries → New Library
  2. Name it “Audiobooks”, set type to Books, folder path /audiobooks
  3. 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

  1. Settings → Libraries → Podcasts → View Podcasts → Add Podcast
  2. Paste the RSS feed URL
  3. Configure: how many episodes to auto-download, whether to keep all episodes or maintain a fixed count
  4. 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

  1. 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)
  2. Open the app → “Connect to your server”
  3. 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:

  1. /opt/audiobookshelf/config/ — SQLite database (audiobookshelf.db), server configuration
  2. /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

Frequently asked questions

What audio formats does AudioBookshelf support?
AudioBookshelf supports M4B (the standard audiobook container), MP3, M4A, FLAC, OGG, and OPus. M4B is preferred because it stores chapter markers in the file — AudioBookshelf reads chapter timestamps directly without scanning filenames. MP3 audiobooks that come as individual chapter files work too; AudioBookshelf groups them by directory and creates a chapter list from the filenames.
Does AudioBookshelf track progress per user across devices?
Yes. AudioBookshelf has multi-user support with per-user progress tracking. Each user creates an account (or the admin creates one for them), logs into the iOS or Android app, and their listening position, bookmark, and playback speed settings sync across every device they use. This is the key feature that makes it a real Audible replacement rather than just a file server.
Can AudioBookshelf add podcast feeds?
Yes. Go to Podcast Libraries → New Podcast Library, point it at a directory on your server, then add feeds by URL. AudioBookshelf checks feeds on a schedule and downloads new episodes automatically. You can set how many episodes to keep per feed. Podcast progress also syncs per-user.
What metadata sources does AudioBookshelf use?
AudioBookshelf can match books against Open Library (openlibrary.org), Google Books, Audible (via the unofficial API wrapper), and AudiobookBay. The Audible source often gets the best cover art and chapter data. For books without matches, you can manually edit metadata including author, series name, series position, narrator, and description.
Is there an iOS app for AudioBookshelf?
Yes, as a beta. The official AudioBookshelf iOS and Android apps are free and published by the AudioBookshelf project; they connect to your self-hosted server, sync progress, and support background playback, speed control, and sleep timers. As of 2026-08-22 the project’s app README lists the Android app on Google Play (beta) and the iOS app only through TestFlight (early beta, which the README says is currently full at Apple’s 10,000-tester cap), not the App Store.
How do I access AudioBookshelf outside my home network?
Two options: Tailscale (connect as if you’re on your home network, no port forwarding) or a public reverse proxy via Nginx Proxy Manager with a domain and Let’s Encrypt SSL. Tailscale is the simpler option for personal use and keeps your library private with no public-facing server. NPM is needed only if you want to share access with people outside your Tailscale 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.

About the author

Written by Lowell K. Wood IV, who builds and runs TechFuelHQ from St. Louis, Missouri.