What you need
- Somewhere for the server to run that is on when you want to listen: a NAS (Synology, QNAP, Unraid, TrueNAS), a Raspberry Pi, a mini PC, or an old laptop. Audiobookshelf is light; anything that runs Docker is enough.
- Your audiobook files, DRM-free. m4b with chapters is ideal; folders of mp3s work too. If a book has no chapters, add them first; the server reads them once at scan time.
- Docker. Most NAS systems have it as an app (Container Manager on Synology, the Community Applications tab on Unraid). On a Pi or PC, Docker's own installer is a single script.
Audiobookshelf also ships a Windows installer and a Debian package if you would rather not use Docker; the steps after installation are the same. The official docs cover those.
1. Organise the folders
Audiobookshelf reads author, title and series from the folder names, then refines them from the file tags. The layout it expects:
audiobooks/
J. R. R. Tolkien/
The Hobbit/
The Hobbit.m4b
The Lord of the Rings/
1 - The Fellowship of the Ring/
Part 01.mp3
Part 02.mp3
2 - The Two Towers/
The Two Towers.m4b
One folder per book, inside one folder per author, with an optional series folder between them. A cover image named cover.jpg in the book folder is picked up; so is embedded art. Do this before the first scan and you will avoid fixing metadata by hand later.
2. Install the server with Docker
Create a folder for the server's own data, then save this as docker-compose.yml next to it, editing the four paths on the left to match your machine:
services:
audiobookshelf:
image: ghcr.io/advplyr/audiobookshelf:latest
container_name: audiobookshelf
ports:
- 13378:80
volumes:
- /srv/audiobooks:/audiobooks
- /srv/podcasts:/podcasts
- /srv/audiobookshelf/config:/config
- /srv/audiobookshelf/metadata:/metadata
environment:
- TZ=America/Toronto
restart: unless-stopped
Then start it:
docker compose up -d
What the lines mean: 13378:80 publishes the server on port 13378 of the host (the number Audiobookshelf's docs use; any free port works). The four volumes lines mount your books, an optional podcasts folder, and two folders where the server keeps its database and cover cache; keep those two on the host so upgrades never lose anything. TZ sets the timezone for listening history. restart: unless-stopped brings it back after a reboot.
On a NAS with a Docker GUI, the same values go into the app's form: image name, port mapping, and the four folder mappings.
3. Create the admin, a library and a user
- Open
http://your-server:13378in a browser on the same network. The first visit asks you to create the root account. Use a long password; this account can do anything. - Go to Settings, Libraries, Add Library. Name it, set the media type to Audiobooks, and add the folder
/audiobooks(the path inside the container, not the host path). - Save, then let the first scan finish. It reads every file's tags, chapters and cover, so a large library takes a while. Watch progress in the top bar.
- Go to Settings, Users, Add User and create a normal account for your phone, with access to the library. Signing in from devices with a non-root user means a lost phone never exposes the admin password.
Spot-check a few books in the web app before moving on. If chapters or covers are wrong, fix the files (or the folder names) and use Quick Match or a rescan; getting this right on the server means every client gets it right.
4. Reach it from outside the house
On your home Wi-Fi, the address from step 3 already works. To listen on the train you need one of two things. Pick one; do not open the port on your router without either.
Option A: a VPN (simplest and safest)
Tailscale or WireGuard puts your phone and the server on a private network wherever you are. Install it on both, and the server keeps its plain http:// address, just with the VPN's IP or hostname instead of the LAN one. Nothing is exposed to the internet, so there is no certificate to manage.
Option B: a reverse proxy with HTTPS
If you want a public address like https://books.example.com, put a reverse proxy in front. Caddy gets a certificate automatically; the whole config is:
books.example.com {
reverse_proxy localhost:13378
}
Point the domain's DNS at your public IP, forward ports 80 and 443 on the router to the proxy, and you are done. Nginx Proxy Manager does the same with a web form. Audiobookshelf's docs have examples for both. With a public address, use a strong password and consider enabling the server's rate limiting.
5. Connect Kithara
- Install Kithara on your phone. Server libraries are part of Kithara Pro.
- Open Library. On a fresh install the screen offers Add a library directly; otherwise open the menu in the top corner, then Manage libraries and Add a library. Choose Audiobookshelf server.
- Server address: exactly what you type into the browser, including the port. On the LAN or a VPN that is something like
http://192.168.1.20:13378. Behind a reverse proxy it ishttps://books.example.com. If you leave off the scheme, Kithara assumeshttp://. - Username and Password: the user you created in step 3. Kithara exchanges them for a token and discards the password. Give the library a name if you like, then tap Connect.
- The first sync fetches every book's details. After that, only what changed on the server is fetched.
Your library now has its own tab. Tap a cover to stream; tap the cloud badge to download it for offline listening. Your position syncs on every pause, and if you listen offline the phone's newer position always wins when you reconnect. Details are in the Audiobookshelf guide.
Troubleshooting
- "Could not connect" on the phone. Open the same address in the phone's browser. If that fails too, the problem is the network (wrong IP, wrong port, phone on mobile data instead of Wi-Fi, VPN not connected), not Kithara.
- Sign-in refused. Check the user exists and has access to the library. Root works but is not recommended on a phone.
- Books missing after adding files. The server has not rescanned. Enable the library's automatic scan, or trigger one from its settings, then pull down in Kithara to sync.
- No chapters on a book. The server sends what it found at scan time. Fix the file and rescan the item; see adding chapters to an m4b.
- Seeking is slow over the internet. The proxy must pass HTTP range requests through unchanged; Caddy and Nginx Proxy Manager do by default. Downloading the book to the phone sidesteps the network entirely.