5 min read

Audiobookshelf: Your Own Audiobook and Podcast Server (GitHub, Scanned)

A self-hosted server for your audiobooks and podcasts, with apps that sync progress everywhere.

Audiobookshelf logo
✅
Scan: safe. Nothing malicious. The note is dependency age: the lockfiles carry many known advisories, so keep it updated if it faces the internet. Scanned Oct 26, 2026; the full report is below.

Audiobookshelf is a self-hosted home for audiobooks and podcasts, a Plex for spoken word. Point it at your folders and it builds a library with covers, chapters and metadata, streams any audio format to the browser or its Android and iOS apps, and remembers each listener's position across devices. Podcasts can be searched, subscribed to and downloaded automatically.

It handles the chores too: fetching metadata and cover art, editing and looking up chapters, merging files into a single m4b, embedding tags, daily backups, multiple users with permissions, and basic ebook reading (EPUB, PDF, CBR, CBZ) with send-to-Kindle. Chromecast is supported, and the web app installs as a progressive web app.

It is GPL-3.0, written in JavaScript on Node.js, with about 14,800 stars and 462 contributors, at v2.37.2. The mobile apps are still labelled beta, and the web client is being rewritten in React, so changes to the current front end are on hold.

  • Repository: github.com/advplyr/audiobookshelf
  • Licence: GPL-3.0 (GNU General Public License v3.0)
  • Language: JavaScript. Stars: 14.8K. Forks: 1,230. Last push: Oct 23, 2026.
  • Scan: safe, Oct 26, 2026, commit edb1f7e

Who it is for

People with a collection of DRM-free audiobooks or who want their own podcast app, and households that want one library with separate progress for each listener.

Getting started

1. Download the project's example Docker Compose file

curl -O https://raw.githubusercontent.com/advplyr/audiobookshelf/master/docker-compose.yml

2. Point its volume paths at your audiobooks and podcasts, then start it

docker compose up -d

Then open port 13378 in your browser (http://localhost:13378) and create the admin account. Folder layout matters, and the docs describe the naming it expects. If you expose it outside your home network, put it behind a reverse proxy with HTTPS that passes websockets.

Safety scan

We cloned advplyr/audiobookshelf at commit edb1f7e on Oct 26, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.

  • No secrets, no install scripts, no committed binaries and no bare-IP URLs across about 199,000 lines of JavaScript and Vue.
  • The five pattern hits are long lines in server/libs/watcher, a compiled copy of the watcher file-watching library vendored into the server. They are generated code, not hidden code.
  • client/package-lock.json has 227 advisories, 8 critical. The critical ones in the sample (elliptic, pbkdf2, sha.js, cipher-base) are browser crypto shims pulled in by the old Nuxt 2 build of the web client, the part now being rewritten.
  • The server's package-lock.json has 153 (4 critical) across 576 packages, 303 of which are test and lint tools (Mocha, ESLint, nyc and similar). The rest run on your server, which is the reason to update promptly.
  • The outside hosts are metadata sources (Audnexus, Open Library, MusicBrainz, FantLab) and the podcast feeds you add. 12 workflows, none using pull_request_target; 1 of 10 third-party actions pinned; CodeQL present, no security policy or Dependabot.

What the scanner counted

CheckResult
SecretsNone found.
Suspicious code5 pattern hits found and read; every one is listed under the raw findings.
Install-time codeNone: nothing runs at install beyond the package manager itself.
Committed binariesNone.
CI workflows12 workflows. None use pull_request_target. 9 of 10 third-party actions pinned to a tag rather than a commit.
Network hosts40 distinct hosts referenced from source; most often github.com, server1.com, nodejs.org, audiobookshelf.org. No URLs to bare IP addresses.
Known vulnerabilities342 advisories across 1,710 pinned packages: 12 critical, 164 high, 119 moderate, 47 low. client/package-lock.json: 1,582 packages, 227 advisories; package-lock.json: 576 packages, 153 advisories.
Project hygieneHas CodeQL, licence file. Missing security policy, automated dependency updates, contributing guide.
OpenSSF ScorecardNot scored: the project is not in Scorecard's weekly index.

The raw findings

Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.

Pattern hits (5)
WhereRuleMatch
server/libs/watcher/utils.js:88very-long-line3490 chars
server/libs/watcher/watcher.js:397very-long-line20974 chars
server/libs/watcher/watcher_handler.js:245very-long-line12642 chars
server/libs/watcher/watcher_locker.js:136very-long-line5278 chars
server/libs/watcher/watcher_poller.js:113very-long-line4630 chars
Worst known vulnerabilities (24 of 342)
AdvisorySeverityPackageSummary
GHSA-cpq7-6gpm-g9rccriticalcipher-base@1.0.4cipher-base is missing type checks, leading to hash rewind and passing on crafted data
GHSA-vjh7-7g9h-fjfhcriticalelliptic@6.5.4Elliptic's private key extraction in ECDSA upon signing a malformed input (e.g. a string)
GHSA-fjxv-7rqg-78g4criticalform-data@2.3.3form-data uses unsafe random function in form-data for choosing boundary
GHSA-h7cp-r72f-jxh6criticalpbkdf2@3.1.2pbkdf2 returns predictable uninitialized/zero-filled memory for non-normalized or unimplemented algos
GHSA-v62p-rq8g-8h59criticalpbkdf2@3.1.2pbkdf2 silently disregards Uint8Array input, returning static keys
GHSA-95m3-7q98-8xr5criticalsha.js@2.4.11sha.js is missing type checks leading to hash rewind and passing on crafted data
GHSA-w7jw-789q-3m8pcriticalshell-quote@1.8.1shell-quote quote() does not escape newlines in object .op values
GHSA-23hp-3jrh-7fpwcriticaltar@6.2.1node-tar: Decompression/parse DoS via unlimited input
GHSA-fjxv-7rqg-78g4criticalform-data@4.0.0form-data uses unsafe random function in form-data for choosing boundary
GHSA-jqcg-44mw-7w3hcriticalproxy-addr@2.0.7proxy-addr vulnerable to IP spoofing via IPv4-mapped IPv6 trust subnet
GHSA-v8fg-2rw7-q452criticalsequelize@6.35.2Sequelize: SQL Injection (Oracle DB)
GHSA-23hp-3jrh-7fpwcriticaltar@6.1.15node-tar: Decompression/parse DoS via unlimited input
GHSA-fv7c-fp4j-7gwphigh@babel/plugin-transform-modules-systemjs@7.25.0@babel/plugin-transform-modules-systemjs generates arbitrary code when compiling malicious input
GHSA-3jxr-9vmj-r5cphighbrace-expansion@1.1.11brace-expansion: DoS via exponential-time expansion of consecutive non-expanding {} groups
GHSA-6j4f-fj2g-mc7phighbrace-expansion@1.1.11brace-expansion: DoS via uncontrolled recursion in parseCommaParts causing stack exhaustion
GHSA-mh99-v99m-4gvghighbrace-expansion@1.1.11brace-expansion: DoS via unbounded expansion length causing an out-of-memory process crash
GHSA-qhr7-859c-m2p7highbrace-expansion@1.1.11brace-expansion: DoS via uncontrolled recursion on nested brace groups causing stack exhaustion
GHSA-rgw5-rvv9-x895highbrace-expansion@1.1.11brace-expansion: DoS via unbounded intermediate arrays, bypassing the CVE-2026-14257 mitigation
GHSA-23c5-xmqv-rm74highminimatch@3.1.2minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions
GHSA-3ppc-4f35-3m26highminimatch@3.1.2minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern
GHSA-7r86-cg39-jmmjhighminimatch@3.1.2minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments
GHSA-737v-mqg7-c878highdefu@6.1.4defu: Prototype pollution via `__proto__` key in defaults argument
GHSA-737v-mqg7-c878highdefu@5.0.1defu: Prototype pollution via `__proto__` key in defaults argument
GHSA-6g55-p6wh-862qhighpostcss@7.0.39PostCSS: Arbitrary file read and information disclosure via attacker-controlled sourceMappingURL in CSS comments

By the numbers

Stars14.8K
Forks1,230
Contributors462
Commits6,676
Open issues1,019
Open pull requests218
Releases162
Latest releasev2.37.2
LicenceGPL-3.0
Main languageJavaScript
Project age5 years
Last pushOct 23, 2026
Tracked files954
Lines of code198.5K
Checkout size14 MB

Lines by language: JavaScript 105.1K, JSON 43.5K, Vue 43.5K, YAML 3,995, CSS 1,516, TypeScript 499.

Questions

Is Audiobookshelf free?

Yes. Audiobookshelf is free and open source under GPL-3.0, including the mobile apps, with no paid tier or account. The project accepts donations.

Can Audiobookshelf play my Audible books?

It plays audio files in open formats such as MP3, M4B and FLAC. It does not remove DRM, so books locked to a store's own app have to be in a DRM-free format before Audiobookshelf can use them.

Is there a mobile app?

Yes, for Android on Google Play and for iOS through Apple's TestFlight, both labelled beta; the iOS beta is often full. The web app works well on phones and can be installed to the home screen as a progressive web app.


This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.