Listenarr automates audiobook collection management similar to Sonarr or Radarr, but for audiobooks. It can search, download, and organize your library automatically using metadata from Audible and other sources.
884
stars
1,472
commits
C#
primary language
Sep 3, 2026
updated
Automated Audiobook Collection Management
Listenarr is a fast, feature-rich, cross-platform audiobook management server. Built with a focus on being a complete solution for all your audiobook downloading needs. Set up your own server and get ready to streamline your audiobook listening!
To see what's coming up, check out our Roadmap! If you have a suggestion or feature request, please submit them in Discussions
[!WARNING] Listenarr is being actively developed and should be considered beta software. There may be security exploits despite best efforts. Expose this software to the internet at your own risk. The platform may be subject to changes as it is being built out. You may experience data loss and need to restart. The Listenarr team strives to avoid any data loss, but please maintain backups of important data.
This app is coded with AI assistance. I started this because my wife (an avid audiobook listener) was reading through multiple series quickly and I wanted an automated way for her to request, download, and listen to new audiobooks. I am a front-end developer and I don't know C#, so I took this as an opportunity to learn and started this project.
[!NOTE]
This is just a fun a side project that solved a need for me; it is not my main priority. I will choose my work, family, and mental health before this project.
Join our community on Discord for help, announcements, and discussion: https://discord.gg/CwZ2Sqp9NF
The easiest way to get started is to use Docker (recommended for production), pre-built executables, or npm scripts:
Container images: GHCR is the preferred registry for Listenarr. Use
ghcr.io/listenarrs/listenarr:<tag>for the latest builds. A Docker Hub mirror (docker.io/therobbiedavis/listenarr:<tag>) is still published for backwards compatibility.
docker run -d \
--name listenarr \
-p 4545:4545 \
## OPTIONAL: Set container runtime user/group and file creation mask
-e PUID=1000 \
-e PGID=1000 \
-e UMASK=022 \
## OPTIONAL: Used by Discord Bot
-e LISTENARR_PUBLIC_URL=https://your-domain.com \
-v listenarr_data:/app/config \
-v /path/to/audiobooks:/audiobooks #optional \
-v /path/to/downloadclient-downloads:/downloads #optional \
ghcr.io/listenarrs/listenarr:canary
PUID and PGID control the user/group the container runs as. GID is also accepted as an alias for PGID for compatibility with other container stacks. UMASK controls default file permissions for newly created files and folders, and legacy UMASK_SET is also accepted as a compatibility alias. If PGID is omitted, it defaults to the same value as PUID. If neither UMASK nor UMASK_SET is provided, it defaults to 022.
Service will be available at:
Available Tags (GHCR + Docker Hub mirror):
latest / stablecanary - Latest canary build (pre-release)canary-X.Y.Z - Specific canary versionbeta - Latest beta build (pre-release)beta-X.Y.Z - Specific beta versionX.Y.Z - Specific release versionDocker Compose (Recommended):
version: '3.8'
services:
listenarr:
image: ghcr.io/listenarrs/listenarr:canary
ports:
- "4545:4545"
environment:
- PUID=1000
- PGID=1000
- UMASK=022
- LISTENARR_PUBLIC_URL=https://your-domain.com ## OPTIONAL: Used by Discord Bot
volumes:
- listenarr_data:/app/config
- /path/to/audiobooks:/audiobooks #optional
- /path/to/downloadclient-downloads:/downloads #optional
restart: unless-stopped
# For Docker Hub, replace the image with docker.io/therobbiedavis/listenarr:canary
volumes:
listenarr_data:
Download the latest release from GitHub Releases and extract the archive for your platform.
cd .\listenarr-win-x64
.\Listenarr.Api.exe
cd ./listenarr-linux-x64
chmod +x Listenarr.Api
./Listenarr.Api
cd ./listenarr-osx-x64 # or osx-arm64 for Apple Silicon
chmod +x Listenarr.Api
./Listenarr.Api
Prerequisites:
LISTENARR_PUBLIC_URL=https://your-domain.comService will be available at:
Note:
--urls "http://localhost:5656"LISTENARR_PUBLIC_URL to your actual domainFor custom deployments or when you need to build from source:
Prerequisites:
LISTENARR_PUBLIC_URL environment variable to your production domainOption 1: Use Self-Contained Executables (Recommended)
# Build self-contained executable for your platform
dotnet publish listenarr.api/Listenarr.Api.csproj -c Release -r win-x64 --self-contained
cd ./bin/Release/net10.0/win-x64/publish
./Listenarr.Api.exe
Option 2: Framework-Dependent Deployment
# Requires .NET Runtime installed on target system
dotnet publish listenarr.api/Listenarr.Api.csproj -c Release
cd ./bin/Release/net10.0/publish
dotnet Listenarr.Api.dll
IIS Deployment (Windows):
Service will be available at:
If you prefer to run the services separately:
Prerequisites:
Install dependencies:
npm run install:all # Install frontend dependencies
Start development servers:
npm run dev # Start both API and Web (recommended)
# OR run separately:
npm run dev:api # Start only backend API
npm run dev:web # Start only frontend web
Services will be available at:
Listenarr includes a small reference Discord bot (in tools/discord-bot) that registers a slash command and forwards requests to the running Listenarr API. The bot is optional — the preferred integration is configuring the Discord settings from the Listenarr UI so the server manages the registration for you. Use the steps below for local development or to run the bot separately.
Prerequisites:
Quick start (development):
https://discord.com/oauth2/authorize?client_id=<APP_ID>&scope=bot%20applications.commands&permissions=27648
The permissions=27648 value requests the View Channels, Send Messages, Manage Messages, and Embed Links permissions which is the bare minimum permissions needed for the bot to function.
When the Listenarr server has the bot token and application ID saved, the server will register the slash command and manage the bot. The tools/discord-bot helper is provided for local development or troubleshooting.
Run the bot standalone (development):
cd tools/discord-bot
npm install
# Point the helper at your running Listenarr instance (defaults to http://localhost:4545)
LISTENARR_URL=http://localhost:4545 npm start
Windows (PowerShell):
cd tools\discord-bot
npm install
$env:LISTENARR_URL = 'http://localhost:4545'
npm start
Notes and troubleshooting:
fetch-cookie + tough-cookie if installed — install them to avoid occasional CSRF errors:npm install fetch-cookie tough-cookie
To make the helper easier to run, it will automatically persist the Listenarr base URL when first started interactively. Order of precedence:
LISTENARR_URL environment variable (explicit)tools/discord-bot/.env file with LISTENARR_URL= (created automatically on first run).env)http://localhost:4545This means you can run the helper once and enter your public domain (for example https://listenarr.example.com) when prompted. The URL is saved to tools/discord-bot/.env so you don't need to export environment variables on subsequent runs.
Listenarr uses GitHub Actions for automated building and deployment:
canary pushes): Builds self-contained executables (Linux x64, Windows x64), creates a GitHub prerelease tagged v{VERSION}-canary, and publishes container images tagged canary / canary-X.Y.Z to GHCR & Docker Hub.beta pushes): Builds self-contained executables (Linux x64, Windows x64), creates a GitHub prerelease tagged v{VERSION}-beta, and publishes container images tagged beta / beta-X.Y.Z to GHCR & Docker Hub.stable, latest, and X.Y.Z to GHCR & Docker Hub.All workflows push to ghcr.io/listenarrs/listenarr and docker.io/therobbiedavis/listenarr.
Contribution branching model:
canary.canary is code-frozen and merged into beta by an org member.canary during the beta window.beta to stabilise the release candidate.beta is merged into main for the stable release, then rebased back into canary to carry fixes forward.main will be closed without review.Version numbers are automatically incremented:
patch, minor, or major (e.g., patch: 1.2.3 → 1.2.4)git tag v1.2.4); no automatic bumpAll builds are CI-first: dotnet publish automatically builds the frontend and includes it in the API's wwwroot.
Got a great idea? Throw it up on Discussions or vote on another idea. Many great features in Listenarr are driven by our community.
Listenarr/
├── listenarr.api/ # C# Backend API
│ ├── Controllers/ # API Endpoints
│ ├── Models/ # Data Models
│ ├── Services/ # Business Logic
│ ├── Dockerfile.runtime # Runtime Docker image for combined API + frontend
│ ├── Program.cs # Entry Point
│ └── ...
├── .env/development/config/ # Development runtime data (generated, gitignored)
│ ├── appsettings/ # Application configuration files
│ ├── cache/ # Image cache storage
│ ├── database/ # SQLite database files
│ ├── logs/ # Application log files
│ └── temp/ # Temporary download storage
├── fe/ # Vue.js Frontend
│ ├── src/
│ │ ├── components/ # Vue Components
│ │ ├── views/ # Pages
│ │ ├── stores/ # Pinia Stores
│ │ └── services/ # API Services
│ └── public/ # Static Assets
├── docker-compose.yml # Docker Configuration
└── README.md
Configure your search APIs in the Settings page:
You can control the application logging level in three ways:
LISTENARR_LOG_LEVEL=Debug).config/appsettings/appsettings.json under the active content root. In local development this is .env/development/config/appsettings/appsettings.json; in Docker this is /app/config/appsettings/appsettings.json. Set either Serilog:MinimumLevel:Default or Logging:LogLevel:Default to the desired level.docker run -e LISTENARR_LOG_LEVEL=Debug or docker-compose environment section.Docker users: the provided docker-compose.yml includes an example LISTENARR_LOG_LEVEL entry. For local development, edit .env/development/config/appsettings/appsettings.json after first startup; for a published non-Docker deployment, edit config/appsettings/appsettings.json under that deployment's content root.
Supported download clients:
GET /api/search?query={query} - Search all configured APIsPOST /api/search/audible?query={query} - Search Audible metadataGET /api/library - Get all audiobooksGET /api/library/{id} - Get specific audiobookPOST /api/library - Add audiobookPUT /api/library/{id} - Update audiobookDELETE /api/library/{id} - Remove audiobookGET /api/configuration - Get all settingsPOST /api/configuration - Save settingsFor complete API documentation, see our API Reference (coming soon).
npm run dev # Start both API and Web
npm run dev:api # Start only backend API
npm run dev:web # Start only frontend web
npm run build # Build both for production
npm run test # Run frontend tests
Backend:
cd listenarr.api
dotnet publish -c Release
Frontend:
cd fe
npm run build
The repository is configured so the API publish will build the frontend and copy the fe/dist output into the API wwwroot. This produces a single publish artifact that serves both backend and frontend.
To build locally (requires Node + npm):
# from repo root
dotnet publish listenarr.api/Listenarr.Api.csproj -c Release -o ./publish/local
If you want to skip the frontend build (no Node on host):
dotnet publish listenarr.api/Listenarr.Api.csproj -c Release -o ./publish/local /p:SkipFrontendBuild=true
To build a runtime Docker image from the publish output (CI-first):
# from repo root
# Optional: clean generated Docker publish output first.
rm -rf listenarr.api/docker-publish
dotnet publish listenarr.api/Listenarr.Api.csproj -c Release -r linux-x64 --self-contained false /p:UseAppHost=false -o listenarr.api/docker-publish/amd64
docker build -f listenarr.api/Dockerfile.runtime --build-arg TARGETARCH=amd64 -t <your-image> .
Application versions are managed in listenarr.api/Listenarr.Api.csproj with a <Version> element. CI automatically bumps versions on builds:
patch/minor/major; GitHub prerelease tagged v1.2.4-canaryv1.2.4-beta-<sha>git tag v1.2.4); tagged vX.Y.ZBumped versions are persisted via PR to maintain branch protection.
This project exists thanks to all the people who contribute. Contribute.
Thank you to all our backers! 🙏 Become a backer
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. Become a sponsor
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
The AGPL-3.0 license ensures that any modifications made to Listenarr, including when hosted as a network service, must be shared with users. This protects the open-source nature of the project and prevents proprietary forks.
Disclaimer: This project is for educational and personal use. Ensure you comply with all applicable laws and terms of service when using download clients and API sources.
C#
79.9%
Vue
11.4%
TypeScript
7.7%
Listenarr automates audiobook collection management similar to Sonarr or Radarr, but for audiobooks. It can search, download, and organize your library automatically using metadata from Audible and other sources.
884
stars
1,472
commits
C#
primary language
Sep 3, 2026
updated
Automated Audiobook Collection Management
Listenarr is a fast, feature-rich, cross-platform audiobook management server. Built with a focus on being a complete solution for all your audiobook downloading needs. Set up your own server and get ready to streamline your audiobook listening!
To see what's coming up, check out our Roadmap! If you have a suggestion or feature request, please submit them in Discussions
[!WARNING] Listenarr is being actively developed and should be considered beta software. There may be security exploits despite best efforts. Expose this software to the internet at your own risk. The platform may be subject to changes as it is being built out. You may experience data loss and need to restart. The Listenarr team strives to avoid any data loss, but please maintain backups of important data.
This app is coded with AI assistance. I started this because my wife (an avid audiobook listener) was reading through multiple series quickly and I wanted an automated way for her to request, download, and listen to new audiobooks. I am a front-end developer and I don't know C#, so I took this as an opportunity to learn and started this project.
[!NOTE]
This is just a fun a side project that solved a need for me; it is not my main priority. I will choose my work, family, and mental health before this project.
Join our community on Discord for help, announcements, and discussion: https://discord.gg/CwZ2Sqp9NF
The easiest way to get started is to use Docker (recommended for production), pre-built executables, or npm scripts:
Container images: GHCR is the preferred registry for Listenarr. Use
ghcr.io/listenarrs/listenarr:<tag>for the latest builds. A Docker Hub mirror (docker.io/therobbiedavis/listenarr:<tag>) is still published for backwards compatibility.
docker run -d \
--name listenarr \
-p 4545:4545 \
## OPTIONAL: Set container runtime user/group and file creation mask
-e PUID=1000 \
-e PGID=1000 \
-e UMASK=022 \
## OPTIONAL: Used by Discord Bot
-e LISTENARR_PUBLIC_URL=https://your-domain.com \
-v listenarr_data:/app/config \
-v /path/to/audiobooks:/audiobooks #optional \
-v /path/to/downloadclient-downloads:/downloads #optional \
ghcr.io/listenarrs/listenarr:canary
PUID and PGID control the user/group the container runs as. GID is also accepted as an alias for PGID for compatibility with other container stacks. UMASK controls default file permissions for newly created files and folders, and legacy UMASK_SET is also accepted as a compatibility alias. If PGID is omitted, it defaults to the same value as PUID. If neither UMASK nor UMASK_SET is provided, it defaults to 022.
Service will be available at:
Available Tags (GHCR + Docker Hub mirror):
latest / stablecanary - Latest canary build (pre-release)canary-X.Y.Z - Specific canary versionbeta - Latest beta build (pre-release)beta-X.Y.Z - Specific beta versionX.Y.Z - Specific release versionDocker Compose (Recommended):
version: '3.8'
services:
listenarr:
image: ghcr.io/listenarrs/listenarr:canary
ports:
- "4545:4545"
environment:
- PUID=1000
- PGID=1000
- UMASK=022
- LISTENARR_PUBLIC_URL=https://your-domain.com ## OPTIONAL: Used by Discord Bot
volumes:
- listenarr_data:/app/config
- /path/to/audiobooks:/audiobooks #optional
- /path/to/downloadclient-downloads:/downloads #optional
restart: unless-stopped
# For Docker Hub, replace the image with docker.io/therobbiedavis/listenarr:canary
volumes:
listenarr_data:
Download the latest release from GitHub Releases and extract the archive for your platform.
cd .\listenarr-win-x64
.\Listenarr.Api.exe
cd ./listenarr-linux-x64
chmod +x Listenarr.Api
./Listenarr.Api
cd ./listenarr-osx-x64 # or osx-arm64 for Apple Silicon
chmod +x Listenarr.Api
./Listenarr.Api
Prerequisites:
LISTENARR_PUBLIC_URL=https://your-domain.comService will be available at:
Note:
--urls "http://localhost:5656"LISTENARR_PUBLIC_URL to your actual domainFor custom deployments or when you need to build from source:
Prerequisites:
LISTENARR_PUBLIC_URL environment variable to your production domainOption 1: Use Self-Contained Executables (Recommended)
# Build self-contained executable for your platform
dotnet publish listenarr.api/Listenarr.Api.csproj -c Release -r win-x64 --self-contained
cd ./bin/Release/net10.0/win-x64/publish
./Listenarr.Api.exe
Option 2: Framework-Dependent Deployment
# Requires .NET Runtime installed on target system
dotnet publish listenarr.api/Listenarr.Api.csproj -c Release
cd ./bin/Release/net10.0/publish
dotnet Listenarr.Api.dll
IIS Deployment (Windows):
Service will be available at:
If you prefer to run the services separately:
Prerequisites:
Install dependencies:
npm run install:all # Install frontend dependencies
Start development servers:
npm run dev # Start both API and Web (recommended)
# OR run separately:
npm run dev:api # Start only backend API
npm run dev:web # Start only frontend web
Services will be available at:
Listenarr includes a small reference Discord bot (in tools/discord-bot) that registers a slash command and forwards requests to the running Listenarr API. The bot is optional — the preferred integration is configuring the Discord settings from the Listenarr UI so the server manages the registration for you. Use the steps below for local development or to run the bot separately.
Prerequisites:
Quick start (development):
https://discord.com/oauth2/authorize?client_id=<APP_ID>&scope=bot%20applications.commands&permissions=27648
The permissions=27648 value requests the View Channels, Send Messages, Manage Messages, and Embed Links permissions which is the bare minimum permissions needed for the bot to function.
When the Listenarr server has the bot token and application ID saved, the server will register the slash command and manage the bot. The tools/discord-bot helper is provided for local development or troubleshooting.
Run the bot standalone (development):
cd tools/discord-bot
npm install
# Point the helper at your running Listenarr instance (defaults to http://localhost:4545)
LISTENARR_URL=http://localhost:4545 npm start
Windows (PowerShell):
cd tools\discord-bot
npm install
$env:LISTENARR_URL = 'http://localhost:4545'
npm start
Notes and troubleshooting:
fetch-cookie + tough-cookie if installed — install them to avoid occasional CSRF errors:npm install fetch-cookie tough-cookie
To make the helper easier to run, it will automatically persist the Listenarr base URL when first started interactively. Order of precedence:
LISTENARR_URL environment variable (explicit)tools/discord-bot/.env file with LISTENARR_URL= (created automatically on first run).env)http://localhost:4545This means you can run the helper once and enter your public domain (for example https://listenarr.example.com) when prompted. The URL is saved to tools/discord-bot/.env so you don't need to export environment variables on subsequent runs.
Listenarr uses GitHub Actions for automated building and deployment:
canary pushes): Builds self-contained executables (Linux x64, Windows x64), creates a GitHub prerelease tagged v{VERSION}-canary, and publishes container images tagged canary / canary-X.Y.Z to GHCR & Docker Hub.beta pushes): Builds self-contained executables (Linux x64, Windows x64), creates a GitHub prerelease tagged v{VERSION}-beta, and publishes container images tagged beta / beta-X.Y.Z to GHCR & Docker Hub.stable, latest, and X.Y.Z to GHCR & Docker Hub.All workflows push to ghcr.io/listenarrs/listenarr and docker.io/therobbiedavis/listenarr.
Contribution branching model:
canary.canary is code-frozen and merged into beta by an org member.canary during the beta window.beta to stabilise the release candidate.beta is merged into main for the stable release, then rebased back into canary to carry fixes forward.main will be closed without review.Version numbers are automatically incremented:
patch, minor, or major (e.g., patch: 1.2.3 → 1.2.4)git tag v1.2.4); no automatic bumpAll builds are CI-first: dotnet publish automatically builds the frontend and includes it in the API's wwwroot.
Got a great idea? Throw it up on Discussions or vote on another idea. Many great features in Listenarr are driven by our community.
Listenarr/
├── listenarr.api/ # C# Backend API
│ ├── Controllers/ # API Endpoints
│ ├── Models/ # Data Models
│ ├── Services/ # Business Logic
│ ├── Dockerfile.runtime # Runtime Docker image for combined API + frontend
│ ├── Program.cs # Entry Point
│ └── ...
├── .env/development/config/ # Development runtime data (generated, gitignored)
│ ├── appsettings/ # Application configuration files
│ ├── cache/ # Image cache storage
│ ├── database/ # SQLite database files
│ ├── logs/ # Application log files
│ └── temp/ # Temporary download storage
├── fe/ # Vue.js Frontend
│ ├── src/
│ │ ├── components/ # Vue Components
│ │ ├── views/ # Pages
│ │ ├── stores/ # Pinia Stores
│ │ └── services/ # API Services
│ └── public/ # Static Assets
├── docker-compose.yml # Docker Configuration
└── README.md
Configure your search APIs in the Settings page:
You can control the application logging level in three ways:
LISTENARR_LOG_LEVEL=Debug).config/appsettings/appsettings.json under the active content root. In local development this is .env/development/config/appsettings/appsettings.json; in Docker this is /app/config/appsettings/appsettings.json. Set either Serilog:MinimumLevel:Default or Logging:LogLevel:Default to the desired level.docker run -e LISTENARR_LOG_LEVEL=Debug or docker-compose environment section.Docker users: the provided docker-compose.yml includes an example LISTENARR_LOG_LEVEL entry. For local development, edit .env/development/config/appsettings/appsettings.json after first startup; for a published non-Docker deployment, edit config/appsettings/appsettings.json under that deployment's content root.
Supported download clients:
GET /api/search?query={query} - Search all configured APIsPOST /api/search/audible?query={query} - Search Audible metadataGET /api/library - Get all audiobooksGET /api/library/{id} - Get specific audiobookPOST /api/library - Add audiobookPUT /api/library/{id} - Update audiobookDELETE /api/library/{id} - Remove audiobookGET /api/configuration - Get all settingsPOST /api/configuration - Save settingsFor complete API documentation, see our API Reference (coming soon).
npm run dev # Start both API and Web
npm run dev:api # Start only backend API
npm run dev:web # Start only frontend web
npm run build # Build both for production
npm run test # Run frontend tests
Backend:
cd listenarr.api
dotnet publish -c Release
Frontend:
cd fe
npm run build
The repository is configured so the API publish will build the frontend and copy the fe/dist output into the API wwwroot. This produces a single publish artifact that serves both backend and frontend.
To build locally (requires Node + npm):
# from repo root
dotnet publish listenarr.api/Listenarr.Api.csproj -c Release -o ./publish/local
If you want to skip the frontend build (no Node on host):
dotnet publish listenarr.api/Listenarr.Api.csproj -c Release -o ./publish/local /p:SkipFrontendBuild=true
To build a runtime Docker image from the publish output (CI-first):
# from repo root
# Optional: clean generated Docker publish output first.
rm -rf listenarr.api/docker-publish
dotnet publish listenarr.api/Listenarr.Api.csproj -c Release -r linux-x64 --self-contained false /p:UseAppHost=false -o listenarr.api/docker-publish/amd64
docker build -f listenarr.api/Dockerfile.runtime --build-arg TARGETARCH=amd64 -t <your-image> .
Application versions are managed in listenarr.api/Listenarr.Api.csproj with a <Version> element. CI automatically bumps versions on builds:
patch/minor/major; GitHub prerelease tagged v1.2.4-canaryv1.2.4-beta-<sha>git tag v1.2.4); tagged vX.Y.ZBumped versions are persisted via PR to maintain branch protection.
This project exists thanks to all the people who contribute. Contribute.
Thank you to all our backers! 🙏 Become a backer
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. Become a sponsor
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
The AGPL-3.0 license ensures that any modifications made to Listenarr, including when hosted as a network service, must be shared with users. This protects the open-source nature of the project and prevents proprietary forks.
Disclaimer: This project is for educational and personal use. Ensure you comply with all applicable laws and terms of service when using download clients and API sources.
C#
79.9%
Vue
11.4%
TypeScript
7.7%