Audiobookshelf is a self-hosted alternative to Audible for streaming audiobooks and podcasts with multi-user sync and offline mobile playback.
Audiobookshelf is an open-source media server designed specifically for organizing and streaming audiobooks and podcasts. Rather than treating spoken media as audio tracks inside a general-purpose music player, the software provides tailored progress tracking, chapter navigation, and multi-user synchronization. It pairs a Node.js backend with responsive web and mobile clients to deliver a private listening environment on self-managed infrastructure.
Audible couples commercial content sales, proprietary digital rights management, and player software into a closed subscription workflow. Moving to Audiobookshelf replaces that centralized pipeline with a decoupled architecture. Rather than streaming through a vendor-locked application, self-hosters store DRM-free M4B, MP3, and FLAC collections on local disks. Audiobookshelf matches Audible's core listening features—chapter navigation, adjustable playback speeds, sleep timers, and cross-device progress synchronization—while granting complete control over file formats and library structure.
The trade-off centers on content acquisition and operational overhead. Audible provides an immediate commercial storefront with cloud delivery, requiring zero maintenance from the listener. Audiobookshelf handles only media hosting and streaming; acquiring titles requires ripping physical discs, purchasing DRM-free files from independent publishers, or extracting purchased books with desktop utilities. Self-hosting admins must also deploy the server, configure reverse proxies with WebSocket pass-through, and structure directories properly so the scanner parses metadata accurately.
Can Audiobookshelf replace Audible? Audiobookshelf replaces Audible's library management, cross-device playback, and listening progress sync, but it does not sell audiobooks. You must supply your own DRM-free audio files or import podcasts via RSS.
Does Audiobookshelf support multiple users? Yes, Audiobookshelf includes multi-user support with custom permissions, allowing household members to maintain independent playback progress, bookmarks, and listening statistics.
Can I download audiobooks for offline listening? Yes, the official companion mobile applications for Android and iOS allow users to download audiobooks and podcast episodes directly to local device storage for offline playback.
Audiobookshelf is an ideal solution for homelab operators who already manage local storage and want complete ownership over their audiobook and podcast libraries. It is less suited for listeners who expect an integrated commercial bookstore or who do not wish to maintain server infrastructure. Backed by active development and governed by the GPL-3.0 copyleft terms, it keeps listening habits and media files entirely private without ongoing subscription costs.
Commands from the official package registries. Each package is matched to Audiobookshelf through the registry's own link to its source code or website.
sudo pacman -S audiobookshelfWe started this exact setup from scratch in a clean Linux machine on Oct 23, 2026 and checked it through Audiobookshelf's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p audiobookshelf && cd audiobookshelf
curl -fsSL https://open-source.store/tools/audiobookshelf/compose.yml -o compose.ymlcat > .env <<EOF
ROOT_PASSWORD=$(openssl rand -hex 12)
EOFROOT_PASSWORD — Password used by automated smoke checks to initialize the root administrator account. Generated above; keep it secret.docker compose up -dservices:
audiobookshelf:
image: ghcr.io/advplyr/audiobookshelf:2.37.2
ports:
- "13378:80"
environment:
- TZ=Etc/UTC
volumes:
- audiobookshelf-config:/config
- audiobookshelf-metadata:/metadata
- ./audiobooks:/audiobooks
- ./podcasts:/podcasts
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:80/healthcheck"]
interval: 10s
timeout: 5s
retries: 5
volumes:
audiobookshelf-config:
audiobookshelf-metadata:
Free IDE for Java, Kotlin, Go, TypeScript and Python. Built on IntelliJ Community, fully open source, 300+ plugins.
Show that Audiobookshelf is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 52 s: ghcr.io/advplyr/audiobookshelf:2.37.2.
Based on the upstream setup. Official compose from the documentation. Image pinned to 2.37.2; config and metadata stored in named volumes; media mounted from ./audiobooks and ./podcasts; healthcheck added.
audiobookshelf-1 | 2026-10-23T20:34:47.616923468Z at IncomingMessage.emit (node:events:514:28) audiobookshelf-1 | 2026-10-23T20:34:47.616924259Z at endReadableNT (node:internal/streams/readable:1783:12) audiobookshelf-1 | 2026-10-23T20:34:47.616925051Z at process.processTicksAndRejections (node:internal/process/task_queues:90:21) audiobookshelf-1 | 2026-10-23T20:34:47.621020968Z SyntaxError: Expected ',' or '}' after property value in JSON at position 65 (line 1 column 66) audiobookshelf-1 | 2026-10-23T20:34:47.621028676Z at JSON.parse (<anonymous>) audiobookshelf-1 | 2026-10-23T20:34:47.621029801Z at parse (/app/node_modules/body-parser/lib/types/json.js:89:19) audiobookshelf-1 | 2026-10-23T20:34:47.621030676Z at /app/node_modules/body-parser/lib/read.js:128:18 audiobookshelf-1 | 2026-10-23T20:34:47.621031509Z at AsyncResource.runInAsyncScope (node:async_hooks:227:14) audiobookshelf-1 | 2026-10-23T20:34:47.621032259Z at invokeCallback (/app/node_modules/raw-body/index.js:231:16) audiobookshelf-1 | 2026-10-23T20:34:47.621033051Z at done (/app/node_modules/raw-body/index.js:220:7) audiobookshelf-1 | 2026-10-23T20:34:47.621033801Z at IncomingMessage.onEnd (/app/node_modules/raw-body/index.js:280:7) audiobookshelf-1 | 2026-10-23T20:34:47.621034634Z at IncomingMessage.emit (node:events:514:28) audiobookshelf-1 | 2026-10-23T20:34:47.621035384Z at endReadableNT (node:internal/streams/readable:1783:12) audiobookshelf-1 | 2026-10-23T20:34:47.621036176Z at process.processTicksAndRejections (node:internal/process/task_queues:90:21) audiobookshelf-1 | 2026-10-23T20:34:52.609548262Z [2026-10-23 20:34:52.609] ERROR: [LocalAuth] Failed login attempt for username "3L6w81cIYqIP4X6T5v4hi3Vqz6O\' audiobookshelf-1 | 2026-10-23T20:34:52.609639387Z [1970-01-01 00:00:00] INJECTED mgo968 THIS ENTRY HAS BEEN INJECTED" from ip ::ffff:192.168.64.27 (User not found) audiobookshelf-1 | 2026-10-23T20:34:52.627948720Z [2026-10-23 20:34:52.627] ERROR: [LocalAuth] Failed login attempt for username "3L6w81cIYqIP4X6T5v4hi3Vqz6O\' audiobookshelf-1 | 2026-10-23T20:34:52.627968303Z [1970-01-01 00:00:00] INJECTED mgo968 THIS ENTRY HAS BEEN INJECTED" from ip ::ffff:192.168.64.27 (User not found) audiobookshelf-1 | 2026-10-23T20:35:07.637771421Z [2026-10-23 20:35:07.637] ERROR: [LocalAuth] Failed login attempt for username "alice" from ip ::ffff:192.168.64.27 (User not found) audiobookshelf-1 | 2026-10-23T20:35:07.638113796Z [2026-10-23 20:35:07.638] ERROR: [LocalAuth] Failed login attempt for username "alice" from ip ::ffff:192.168.64.27 (User not found) audiobookshelf-1 | 2026-10-23T20:35:07.638519046Z [2026-10-23 20:35:07.638] ERROR: [LocalAuth] Failed login attempt for username "bob" from ip ::ffff:192.168.64.27 (User not found) audiobookshelf-1 | 2026-10-23T20:35:07.638972796Z [2026-10-23 20:35:07.638] ERROR: [LocalAuth] Failed login attempt for username "bob" from ip ::ffff:192.168.64.27 (User not found) audiobookshelf-1 | 2026-10-23T20:35:08.597656463Z [2026-10-23 20:35:08.597] ERROR: [LocalAuth] Failed login attempt for username "admin" from ip ::ffff:192.168.64.27 (User not found) audiobookshelf-1 | 2026-10-23T20:35:08.619140546Z [2026-10-23 20:35:08.618] ERROR: [LocalAuth] Failed login attempt for username "admin" from ip ::ffff:192.168.64.27 (User not found) audiobookshelf-1 | 2026-10-23T20:35:09.641606005Z [2026-10-23 20:35:09.640] ERROR: [LocalAuth] Failed login attempt for username "datahub" from ip ::ffff:192.168.64.27 (User not found) audiobookshelf-1 | 2026-10-23T20:35:09.641617380Z [2026-10-23 20:35:09.640] ERROR: [LocalAuth] Failed login attempt for username "datahub" from ip ::ffff:192.168.64.27 (User not found) audiobookshelf-1 | 2026-10-23T20:35:12.637395048Z [2026-10-23 20:35:12.636] ERROR: [LocalAuth] Failed login attempt for username "admin" from ip ::ffff:192.168.64.27 (User not found) audiobookshelf-1 | 2026-10-23T20:35:12.638657965Z [2026-10-23 20:35:12.638] ERROR: [LocalAuth] Failed login attempt for username "admin" from ip ::ffff:192.168.64.27 (User not found) audiobookshelf-1 | 2026-10-23T20:35:12.652145840Z [2026-10-23 20:35:12.651] ERROR: [LocalAuth] Failed login attempt for username "netdisco" from ip ::ffff:192.168.64.27 (User not found) audiobookshelf-1 | 2026-10-23T20:35:13.604394215Z [2026-10-23 20:35:13.604] ERROR: [LocalAuth] Failed login attempt for username "netdisco" from ip ::ffff:192.168.64.27 (User not found) audiobookshelf-1 | 2026-10-23T20:35:13.607612798Z [2026-10-23 20:35:13.607] ERROR: [LocalAuth] Failed login attempt for username "admin" from ip ::ffff:192.168.64.27 (User not found) audiobookshelf-1 | 2026-10-23T20:35:13.609033298Z [2026-10-23 20:35:13.608] ERROR: [LocalAuth] Failed login attempt for username "admin" from ip ::ffff:192.168.64.27 (User not found) audiobookshelf-1 | 2026-10-23T20:35:13.620915132Z [2026-10-23 20:35:13.620] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login, User-Agent: Mozilla/5.0 (Debian; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 audiobookshelf-1 | 2026-10-23T20:35:13.624353507Z [2026-10-23 20:35:13.624] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login, User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36 audiobookshelf-1 | 2026-10-23T20:35:13.628461257Z [2026-10-23 20:35:13.628] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login, User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:125.0) Gecko/20100101 Firefox/125.0 audiobookshelf-1 | 2026-10-23T20:35:13.629515215Z [2026-10-23 20:35:13.629] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login, User-Agent: Mozilla/5.0 (Knoppix; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 audiobookshelf-1 | 2026-10-23T20:35:13.638781298Z [2026-10-23 20:35:13.638] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login, User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_16) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15 audiobookshelf-1 | 2026-10-23T20:35:13.648730465Z [2026-10-23 20:35:13.648] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login, User-Agent: Mozilla/5.0 (Ubuntu; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 audiobookshelf-1 | 2026-10-23T20:35:14.621578507Z [2026-10-23 20:35:14.613] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login/, User-Agent: Mozilla/5.0 (ZZ; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 audiobookshelf-1 | 2026-10-23T20:35:14.621594716Z [2026-10-23 20:35:14.613] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login/, User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:1.9.5.20) Gecko/ Firefox/15.0 audiobookshelf-1 | 2026-10-23T20:35:14.621596507Z [2026-10-23 20:35:14.618] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login, User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15 audiobookshelf-1 | 2026-10-23T20:35:14.629298466Z [2026-10-23 20:35:14.629] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login, User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.7 Mobile/15E148 Safari/604.1 audiobookshelf-1 | 2026-10-23T20:35:14.629865424Z SyntaxError: Expected property name or '}' in JSON at position 1 (line 1 column 2) audiobookshelf-1 | 2026-10-23T20:35:14.629879257Z at JSON.parse (<anonymous>) audiobookshelf-1 | 2026-10-23T20:35:14.629881049Z at parse (/app/node_modules/body-parser/lib/types/json.js:89:19) audiobookshelf-1 | 2026-10-23T20:35:14.629882132Z at /app/node_modules/body-parser/lib/read.js:128:18 audiobookshelf-1 | 2026-10-23T20:35:14.629883216Z at AsyncResource.runInAsyncScope (node:async_hooks:227:14) audiobookshelf-1 | 2026-10-23T20:35:14.629884132Z at invokeCallback (/app/node_modules/raw-body/index.js:231:16) audiobookshelf-1 | 2026-10-23T20:35:14.629885007Z at done (/app/node_modules/raw-body/index.js:220:7) audiobookshelf-1 | 2026-10-23T20:35:14.629885841Z at IncomingMessage.onEnd (/app/node_modules/raw-body/index.js:280:7) audiobookshelf-1 | 2026-10-23T20:35:14.629886757Z at IncomingMessage.emit (node:events:514:28) audiobookshelf-1 | 2026-10-23T20:35:14.629887674Z at endReadableNT (node:internal/streams/readable:1783:12) audiobookshelf-1 | 2026-10-23T20:35:14.629888507Z at process.processTicksAndRejections (node:internal/process/task_queues:90:21) audiobookshelf-1 | 2026-10-23T20:35:14.629889424Z SyntaxError: Expected property name or '}' in JSON at position 1 (line 1 column 2) audiobookshelf-1 | 2026-10-23T20:35:14.629890299Z at JSON.parse (<anonymous>) audiobookshelf-1 | 2026-10-23T20:35:14.629891174Z at parse (/app/node_modules/body-parser/lib/types/json.js:89:19) audiobookshelf-1 | 2026-10-23T20:35:14.629892007Z at /app/node_modules/body-parser/lib/read.js:128:18 audiobookshelf-1 | 2026-10-23T20:35:14.629892841Z at AsyncResource.runInAsyncScope (node:async_hooks:227:14) audiobookshelf-1 | 2026-10-23T20:35:14.629893674Z at invokeCallback (/app/node_modules/raw-body/index.js:231:16) audiobookshelf-1 | 2026-10-23T20:35:14.629894549Z at done (/app/node_modules/raw-body/index.js:220:7) audiobookshelf-1 | 2026-10-23T20:35:14.629895341Z at IncomingMessage.onEnd (/app/node_modules/raw-body/index.js:280:7) audiobookshelf-1 | 2026-10-23T20:35:14.629896299Z at IncomingMessage.emit (node:events:514:28) audiobookshelf-1 | 2026-10-23T20:35:14.629897174Z at endReadableNT (node:internal/streams/readable:1783:12) audiobookshelf-1 | 2026-10-23T20:35:14.629898174Z at process.processTicksAndRejections (node:internal/process/task_queues:90:21) audiobookshelf-1 | 2026-10-23T20:35:15.605608258Z [2026-10-23 20:35:15.604] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login, User-Agent: Mozilla/5.0 (Debian; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 audiobookshelf-1 | 2026-10-23T20:35:15.605957674Z [2026-10-23 20:35:15.605] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login, User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.2 Safari/605.1.15 audiobookshelf-1 | 2026-10-23T20:35:15.608013216Z [2026-10-23 20:35:15.607] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login, User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15 audiobookshelf-1 | 2026-10-23T20:35:15.608682216Z [2026-10-23 20:35:15.608] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login, User-Agent: Mozilla/5.0 (ZZ; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 audiobookshelf-1 | 2026-10-23T20:35:15.609614508Z [2026-10-23 20:35:15.609] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login, User-Agent: Mozilla/5.0 (Debian; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 audiobookshelf-1 | 2026-10-23T20:35:15.619943091Z [2026-10-23 20:35:15.619] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login, User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363 audiobookshelf-1 | 2026-10-23T20:35:18.598695092Z [2026-10-23 20:35:18.598] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login, User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36; ClaudeBot/1.0; [email protected]) audiobookshelf-1 | 2026-10-23T20:35:18.599265509Z [2026-10-23 20:35:18.599] WARN: [RateLimiter] Rate limit exceeded - IP: ::ffff:192.168.64.27, Endpoint: POST /login, User-Agent: Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 audiobookshelf-1 | 2026-10-23T20:35:35.610228211Z [2026-10-23 20:35:35.609] INFO: [Server] Requesting rss feed ShowImage.do;.js.jsp audiobookshelf-1 | 2026-10-23T20:35:35.614933127Z [2026-10-23 20:35:35.614] INFO: [Server] Requesting rss feed ShowImage.do;.js.jsp audiobookshelf-1 | 2026-10-23T20:35:35.623859252Z [2026-10-23 20:35:35.623] WARN: [RssFeedManager] Feed not found ShowImage.do;.js.jsp audiobookshelf-1 | 2026-10-23T20:35:35.624331002Z [2026-10-23 20:35:35.624] WARN: [RssFeedManager] Feed not found ShowImage.do;.js.jsp audiobookshelf-1 | 2026-10-23T20:35:39.667319504Z Error: Malformed content type audiobookshelf-1 | 2026-10-23T20:35:39.667355087Z at getInstance (/app/dist-server/server/libs/busboy/index.js:11:15) audiobookshelf-1 | 2026-10-23T20:35:39.667358921Z at module.exports (/app/dist-server/server/libs/busboy/index.js:51:12) audiobookshelf-1 | 2026-10-23T20:35:39.667360421Z at module.exports (/app/dist-server/server/libs/expressFileupload/processMultipart.js:24:20) audiobookshelf-1 | 2026-10-23T20:35:39.667361754Z at /app/dist-server/server/libs/expressFileupload/index.js:34:9 audiobookshelf-1 | 2026-10-23T20:35:39.667362962Z at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) audiobookshelf-1 | 2026-10-23T20:35:39.667364504Z at trim_prefix (/app/node_modules/express/lib/router/index.js:328:13) audiobookshelf-1 | 2026-10-23T20:35:39.667365712Z at /app/node_modules/express/lib/router/index.js:286:9 audiobookshelf-1 | 2026-10-23T20:35:39.667366962Z at router.process_params (/app/node_modules/express/lib/router/index.js:346:12) audiobookshelf-1 | 2026-10-23T20:35:39.667368171Z at next (/app/node_modules/express/lib/router/index.js:280:10) audiobookshelf-1 | 2026-10-23T20:35:39.667369296Z at router.handle (/app/node_modules/express/lib/router/index.js:175:3) audiobookshelf-1 | 2026-10-23T20:35:40.608141671Z Error: Malformed content type audiobookshelf-1 | 2026-10-23T20:35:40.608163963Z at getInstance (/app/dist-server/server/libs/busboy/index.js:11:15) audiobookshelf-1 | 2026-10-23T20:35:40.608166546Z at module.exports (/app/dist-server/server/libs/busboy/index.js:51:12) audiobookshelf-1 | 2026-10-23T20:35:40.608167963Z at module.exports (/app/dist-server/server/libs/expressFileupload/processMultipart.js:24:20) audiobookshelf-1 | 2026-10-23T20:35:40.608169213Z at /app/dist-server/server/libs/expressFileupload/index.js:34:9 audiobookshelf-1 | 2026-10-23T20:35:40.608170296Z at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) audiobookshelf-1 | 2026-10-23T20:35:40.608171463Z at trim_prefix (/app/node_modules/express/lib/router/index.js:328:13) audiobookshelf-1 | 2026-10-23T20:35:40.608172546Z at /app/node_modules/express/lib/router/index.js:286:9 audiobookshelf-1 | 2026-10-23T20:35:40.608173713Z at router.process_params (/app/node_modules/express/lib/router/index.js:346:12) audiobookshelf-1 | 2026-10-23T20:35:40.608174838Z at next (/app/node_modules/express/lib/router/index.js:280:10) audiobookshelf-1 | 2026-10-23T20:35:40.608175963Z at router.handle (/app/node_modules/express/lib/router/index.js:175:3) audiobookshelf-1 | 2026-10-23T20:35:40.608179838Z Error: Malformed content type audiobookshelf-1 | 2026-10-23T20:35:40.608181130Z at getInstance (/app/dist-server/server/libs/busboy/index.js:11:15) audiobookshelf-1 | 2026-10-23T20:35:40.608182380Z at module.exports (/app/dist-server/server/libs/busboy/index.js:51:12) audiobookshelf-1 | 2026-10-23T20:35:40.608183463Z at module.exports (/app/dist-server/server/libs/expressFileupload/processMultipart.js:24:20) audiobookshelf-1 | 2026-10-23T20:35:40.608184713Z at /app/dist-server/server/libs/expressFileupload/index.js:34:9 audiobookshelf-1 | 2026-10-23T20:35:40.608185838Z at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) audiobookshelf-1 | 2026-10-23T20:35:40.608186921Z at trim_prefix (/app/node_modules/express/lib/router/index.js:328:13) audiobookshelf-1 | 2026-10-23T20:35:40.608188046Z at /app/node_modules/express/lib/router/index.js:286:9 audiobookshelf-1 | 2026-10-23T20:35:40.608189130Z at router.process_params (/app/node_modules/express/lib/router/index.js:346:12) audiobookshelf-1 | 2026-10-23T20:35:40.608190255Z at next (/app/node_modules/express/lib/router/index.js:280:10) audiobookshelf-1 | 2026-10-23T20:35:40.608191338Z at router.handle (/app/node_modules/express/lib/router/index.js:175:3) audiobookshelf-1 | 2026-10-23T20:35:40.688088713Z Error: Malformed content type audiobookshelf-1 | 2026-10-23T20:35:40.688108671Z at getInstance (/app/dist-server/server/libs/busboy/index.js:11:15) audiobookshelf-1 | 2026-10-23T20:35:40.688110630Z at module.exports (/app/dist-server/server/libs/busboy/index.js:51:12) audiobookshelf-1 | 2026-10-23T20:35:40.688112505Z at module.exports (/app/dist-server/server/libs/expressFileupload/processMultipart.js:24:20) audiobookshelf-1 | 2026-10-23T20:35:40.688113671Z at /app/dist-server/server/libs/expressFileupload/index.js:34:9 audiobookshelf-1 | 2026-10-23T20:35:40.688114630Z at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) audiobookshelf-1 | 2026-10-23T20:35:40.688115588Z at trim_prefix (/app/node_modules/express/lib/router/index.js:328:13) audiobookshelf-1 | 2026-10-23T20:35:40.688125630Z at /app/node_modules/express/lib/router/index.js:286:9 audiobookshelf-1 | 2026-10-23T20:35:40.688127005Z at router.process_params (/app/node_modules/express/lib/router/index.js:346:12) audiobookshelf-1 | 2026-10-23T20:35:40.688128046Z at next (/app/node_modules/express/lib/router/index.js:280:10) audiobookshelf-1 | 2026-10-23T20:35:40.688129005Z at router.handle (/app/node_modules/express/lib/router/index.js:175:3)