About this project

Podspine is a small self-hosted server that points at a folder of audiobooks and gives each book its own podcast RSS feed, with one episode per chapter in the correct order. You subscribe to the feed in Apple Podcasts, Pocket Casts, Overcast, AntennaPod, or any other RSS-based podcast app. There are no accounts, no separate app, and no built-in player — just a feed URL. Key characteristics described in the README: - Chapters as episodes, in order. Podspine emits sequential pubDates (oldest = chapter 1) and itunes:episode numbers, and refuses to serve a feed that fails its own self-check. - Zero-config Docker run with the library mounted. - No re-encode by default: chapters are extracted by stream copy, and whole files are served straight from the library. - DRM-free input only; the project ships no DRM circumvention. Deployment options include Docker (recommended), a signed binary install script for Linux/macOS and Windows, package managers (Homebrew, Scoop, Nix, cargo binstall), and building from source with Cargo. ffmpeg/ffprobe are bundled in the Docker image and must be on PATH for binary installs. The library path is the only required input; other settings can be set via CLI flag, environment variable, or TOML config file. Supported formats are grouped into two tiers. Tier 1 covers M4B/M4A (AAC/ALAC), single-file MP3, and folders of per-chapter MP3s, using embedded chapters or file/track order. Tier 2 covers OGG Vorbis, Opus, FLAC, and folders of per-chapter Tier-2 tracks, using embedded chapters, a .cue sidecar (required for FLAC), or file/track order. Chapter sidecars are preferred over embedded chapters in the order .cue, .ffmeta, then embedded. DRM-protected files such as Audible .aax/.aaxc/.aa and OverDrive .odm are skipped with a logged notice. Storage behavior: whole-file episodes (MP3 folders and chapterless single files) are streamed in place with no copy. Chaptered books materialize audio under the data directory; the default "full" mode keeps a per-chapter split, roughly doubling total size for chaptered libraries, while "saver" mode keeps a bounded cache and regenerates chapters on first play. Optional settings include PODSPINE_TRANSCODE=aac to re-encode oddball formats at ingest, and PODSPINE_REMUX_NON_FASTSTART=true to remux non-faststart MP4 files without re-encoding. Per-book overrides can be placed in a .podspine.toml file. Each book's feed lives at an unguessable capability URL (/feed/{feed_id}.xml), with companion routes for episode audio (HTTP Range), cover art, and a subscribe page with per-app deep links and a QR code. The browse UI enumerates the library, so the README advises keeping it on the LAN or behind proxy auth while capability routes are safe to expose. Prometheus metrics can be exposed on a separate listener. The project is written in Rust (2024 edition, MSRV 1.88) as a workspace with one crate per pipeline stage. It is licensed AGPL-3.0-only and shells out to ffmpeg/ffprobe as separate processes. Documentation covers deployment, importing into podcast apps, architecture, development, contributing, security, and a changelog.