Cleanup your audiobook collection.
Shelfarr automatically proposes clean, consistent filenames using embedded tags and optional Audiobookshelf metadata. Preview everything first, batch apply, and undo when needed.
Shelfarr gets better through real use. Join the Discord to discuss tricky naming cases, share templates, and suggest features backed by real examples. If something in your library feels off, this is where it gets fixed.
What you get
A focused tool with the right defaults: fast scanning, safe renames, and human-friendly review.
Everything is proposed before it’s applied. Start with dry-run and enable backups when you’re ready.
Uses embedded tags and can cross-check Audiobookshelf for better titles and authors.
Use {author}, {series},
{title} and folders to standardize your library.
Quick start (Docker Compose)
Run Shelfarr locally and mount your library at /library.
services:
shelfarr:
image: vacantlycrushing/shelfarr:latest
ports:
- "5055:5055"
environment:
PORT: "5055"
ABR_SETTINGS_DB: "/data/settings.db"
ABR_HISTORY_LOG: "/data/shelfarr_history.jsonl"
ABR_LOG_FILE: "/data/shelfarr.log"
volumes:
- ./data:/data
- /path/to/your/audiobooks:/library
restart: unless-stopped
docker compose up -d
http://localhost:5055, point Shelfarr at your mounted
folder, and start a scan.
Run locally (Python)
Prefer not to use Docker? Run the server directly on macOS, Windows, or Linux.
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
PORT=5055 python3 app.py
http://localhost:5055. Use normal filesystem paths
(e.g. /Users/you/Audiobooks).
py -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
$env:PORT = "5055"
py .\app.py
D:\Audiobooks).
app.py (or inside your Docker container).
Your browser is only the UI client.
Configuration
Most settings are available in the UI. These environment variables are useful for deployment.
# Server
PORT=5055
# Paths (persist these)
ABR_SETTINGS_DB=/data/settings.db
ABR_HISTORY_LOG=/data/shelfarr_history.jsonl
ABR_LOG_FILE=/data/shelfarr.log
# Audiobookshelf (optional)
ABS_BASE_URL=http://audiobookshelf:13378
ABS_TOKEN=YOUR_ABS_API_TOKEN
# Safety
ABR_DRY_RUN=1
ABR_BACKUP=1
Screenshots
A quick look at scanning and stats.
FAQ
No. Shelfarr refuses to overwrite existing targets. Start with dry-run, then enable backups.
Yes—if you enable directory moves and use folder-style templates like {author}/{series}/{title}.
No. You can rename using embedded tags only and still get clean, consistent results.
Backend: Python + Flask + SQLite
Frontend: Preact