Audiobookshelf is a self-hosted server for audiobooks, podcasts and ebooks with its own iOS and Android apps. It replaces Audible and a podcast app for content you own, and it does the one thing generic media servers get wrong: precise, per-user, cross-device progress tracking.
Our verdict on Audiobookshelf#
The reason to run this instead of pointing Jellyfin at a folder of m4b files is progress: Audiobookshelf tracks position per user per item at second resolution, syncs it between the web player and the mobile apps, and survives you switching devices mid-chapter. Nothing else in this category does that properly. Current release is 2.36.0 (July 2026). Treat this as a security-relevant app: the authentication system was rewritten in 2.26.0 and the releases since have patched real problems, including weak OIDC protocol validation, an authentication bypass through refresh tokens, and bulk downloads skipping item-level access checks. 2.36.0 added a sessions table and a logout-all-devices button. Two operational quirks that catch people: the container ignores PUID and PGID entirely (use the compose user: directive), and the SQLite database in /config must be on local disk, never an NFS or SMB share.
Who Audiobookshelf is for#
Choose it if
- You have a DRM-free audiobook collection and want Audible's resume-anywhere behavior without Audible.
- Multiple people in the house listen to the same books and each needs their own position and bookmarks.
- You want podcasts downloaded and retained on your own disk instead of expiring from a hosted app.
- You already run an OIDC provider and want a media app that speaks it natively rather than through a plugin.
Look elsewhere if
- Your audiobooks are DRM-protected Audible files: Audiobookshelf will not strip DRM and cannot play them.
- Your only storage is a NAS share mounted over SMB or NFS and you cannot put the config directory on local disk.
- You want a single server for video and audiobooks; this is deliberately not a video server.
What running it actually looks like#
One container, ghcr.io/advplyr/audiobookshelf, listening on 13378. Three mounts matter: /config for the SQLite database, /metadata for covers, logs and backups, and your audio directories, conventionally /audiobooks and /podcasts. The container does not use PUID and PGID, which trips up anyone coming from LinuxServer images; set ownership yourself and use user: 1000:1000 in compose. First run creates the root admin account in the browser, then you add libraries and pick a folder structure. Audiobookshelf's scanner is happiest with Author/Series/Title/ layout, and fixing structure later means a rescan rather than a rename in the UI. Upgrades are a tag pull with automatic schema migration on start. The /config volume must be a local filesystem: SQLite over a network share corrupts, sometimes only after weeks.
Resource profile#
- Memory
- 200 MB idle, around 450 MB in ordinary use. Node.js baseline plus the SQLite connection; scans, audio probing with ffprobe and cover downloads are what push it up on large libraries.
- CPU and acceleration
- Streaming is direct file serving and costs almost nothing. CPU spikes on library scans (ffprobe on every file) and when generating m4b merges or transcoding for a client, neither of which is a steady-state load.
- Storage growth
- The /metadata volume grows with cover art, extracted chapter data, logs and the built-in backup archives, so budget for backups accumulating there rather than just your audio files.
- Operational load
- 2 of 5, Light. One container, one SQLite database, straightforward tag-bump upgrades. It is a 2 rather than a 1 because the auth system has been reworked and repeatedly patched since 2.26.0, so this is an app you have to actually keep current, and OIDC misconfiguration can lock you out of your own admin account.
Figures describe a small single-household install and are the working assumptions behind our stack planner. Your numbers will differ with library size, user count and hardware. See methodology.
Data and backup surface#
Two volumes matter. /config holds absdatabase.sqlite, which contains users, libraries, every playback position, bookmarks and API tokens: this is the irreplaceable part. /metadata holds cover images, author images, item metadata, logs and the archives written by the built-in scheduled backup, so backing up /metadata naively means backing up your backups. Point the internal backup at a path you then copy off-box, or exclude metadata/backups from your own job. Covers and extracted metadata are regenerable from a rescan plus a metadata refetch; listening progress is not. Stop the container or use SQLite .backup rather than copying the db while it is open.
Derived backup shape
SQLite backup. sqlite3 <db> ".backup out.db" while running, or stop the container and copy. A live cp of a WAL-mode SQLite file can restore corrupt.
Traps and surprises#
PUID and PGID are ignored
Unlike most self-hosted media images, Audiobookshelf does not read PUID or PGID. Setting them changes nothing and the container runs as root by default, writing root-owned files into your media tree. Use the compose user: 1000:1000 directive instead, and chown the config and metadata volumes to match before first start, otherwise the first run fails to create the database with a permission error.
SQLite on a network share will corrupt
The docs are explicit that the /config mount must be on the same machine running the server. Putting it on NFS, SMB or a Synology shared folder mounted into a VM appears to work, then produces database is locked errors and eventually a corrupted file, often weeks in. Keep /config local and mount only the media over the network.
OIDC misconfiguration can lock out every account
If you enable OpenID Connect and disable local login, a broken provider config leaves nobody able to sign in, including the root admin. The documented recovery is editing the SQLite database by hand to re-enable local password login. Back up absdatabase.sqlite before touching auth settings, and keep local login enabled until you have signed in through the provider at least once.
Auth has been patched repeatedly since 2.26.0
The 2.26.0 authentication overhaul introduced refresh tokens, and subsequent releases fixed weak OIDC protocol validation, an authentication bypass via refresh tokens, root account deletion risk, and bulk downloads bypassing per-item access checks. If your instance is internet-facing and pinned to a 2.2x or early 2.3x tag, you are running known-bad auth code. Track releases rather than pinning indefinitely.
Specifications#
- Category
- Media servers and libraries
- Licence
- GPL-3.0 (Copyleft)
- Written in
- JavaScript / Node.js
- First release
- 2021
- Maturity
- Stable
- Datastore
- SQLite
- Default ports
13378- Ships as
- docker, deb package, native binary
- arm64 builds
- Yes
- Identity
- Native OIDC. Built-in OpenID Connect with an auto-populate button that reads the provider's discovery document; no plugin needed, and the mobile apps support the OIDC flow too.
- Replaces
- Audible, Overcast, Pocket Casts, Google Play Books
- Project site
- www.audiobookshelf.org
- Source
- github.com/advplyr/audiobookshelf
- Documentation
- www.audiobookshelf.org/docs
Alternatives to Audiobookshelf#
Everything else in media servers and libraries, closest in operational weight first.
| Tool | Ops load | Idle RAM | Licence |
|---|---|---|---|
| Calibre-Web | 2, Light | 120 MB | GPL-3.0 |
| Emby | 2, Light | 350 MB | Proprietary |
| Jellyfin | 2, Light | 280 MB | GPL-2.0-only |
| Jellyseerr | 2, Light | 220 MB | MIT |
| Kavita | 2, Light | 250 MB | GPL-3.0 |
| Plex Media Server | 2, Light | 400 MB | Proprietary |
Where Audiobookshelf comes up elsewhere#
Migration guides
Guides
Sources#
Facts on this page were checked against the project's own material. Where a number is our own estimate rather than a published figure, the text says so.
Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.