Self-Hosting Audiobookshelf on a Raspberry Pi: Your Own Audiobook and Podcast Server
Jellyfin and Plex get all the attention in self-hosting circles, but neither handles audiobooks or podcasts particularly well; they're built around video and music metadata, and long-form spoken-word audio wants different features entirely: chapter markers, resume-from-position across devices, reading speed control, and podcast feed subscriptions. Audiobookshelf is purpose-built for exactly that, and a Raspberry Pi is more than enough hardware to run it for a household library. This guide covers setting it up with Docker, organizing your media so it actually gets recognized, and the day-to-day workflow with the mobile apps.
Why a Dedicated Audiobook Server
- Resume position syncs across devices: start a book on your phone during a commute, pick it up on a tablet at home, exactly where you left off.
- Chapter-aware playback: skip forward by chapter instead of scrubbing blindly through a multi-hour file.
- Podcast support: Audiobookshelf can subscribe to and auto-download podcast RSS feeds, acting as your own podcast server alongside your audiobook library.
- Variable playback speed and sleep timer: standard audiobook-app features that general media servers don't bother with.
Installing with Docker Compose
Create a project directory on your Pi with a folder structure for your media before you start the container:
mkdir -p ~/audiobookshelf/{config,metadata,audiobooks,podcasts} cd ~/audiobookshelfThen a docker-compose.yml:
services: audiobookshelf: image: ghcr.io/advplyr/audiobookshelf:latest container_name: audiobookshelf ports: - "13378:80" volumes: - ./audiobooks:/audiobooks - ./podcasts:/podcasts - ./config:/config - ./metadata:/metadata restart: unless-stoppedBring it up with docker compose up -d, then browse to http://<your-pi-ip>:13378.
Organizing Your Library So It Actually Gets Recognized
Audiobookshelf's automatic matching depends on reasonably consistent folder structure. The pattern that works most reliably:
Content typeExpected layout Audiobooks/audiobooks/Author Name/Book Title/, with the book's audio files (and optionally a cover image) inside that folder Multi-book series/audiobooks/Author Name/Series Name/Book Title/, which Audiobookshelf will group under the series automatically once scanned PodcastsA folder per show under /podcasts/; new episodes download into that same folder once you subscribe to the feed from inside the appAfter your first import, create a library from the web UI (Settings > Libraries > Add Library), pick "Book" as the media type, and point it at /audiobooks. A second library pointed at /podcasts with the "Podcast" media type handles the other half.
Initial Setup Checklist
- On first browser visit, create the root admin account with a strong password; this is a publicly-reachable-if-you-port-forward service, so don't skip this step or leave a default.
- Add your Book and Podcast libraries as described above and let the initial scan run; large libraries can take a while the first time while Audiobookshelf fetches cover art and metadata.
- Install the Audiobookshelf mobile app (iOS/Android) and point it at your server's address to start listening with sync support.
- If you want remote access away from home, pair this with Tailscale (covered elsewhere on this site) rather than exposing port 13378 directly to the internet.
Metadata Matching Tips
Audiobookshelf pulls metadata from providers like Audible and Google Books automatically based on folder and file naming. If a book shows up unmatched or with the wrong cover, use the "Match" button on that book's page to search manually and pick the correct result; this is far faster than trying to perfectly pre-name every folder before the initial scan.
Where It Fits Next to Your Other Self-Hosted Services
Audiobookshelf runs comfortably alongside Jellyfin, Immich, or any of the other self-hosted services covered on this site on the same Pi, provided you're not also running something CPU-heavy like Frigate's object detection on the same board. If you're centralizing several of these services, consider managing them through Portainer (covered elsewhere on this site) rather than juggling separate Compose files and manual docker commands for each one.