Self-hosted music discovery for your library. Digarr finds artists and albums from your listening history or a mood. Review the suggestions, listen to previews, then send what you like to Lidarr, slskd, or a playlist. Bring your own AI provider or local model. Lidarr is optional.
Note
v2.1.0 is out. It adds personal API tokens and an MCP endpoint for scripts and agents, per-user approval policies, ListenBrainz recommended tracks and Weekly Exploration, an option to skip recently played recordings, per-target playlist export results, and a persistent MusicBrainz cache so scans are fast after a restart. Upgrades from v2.0.x run migrations automatically after the pre-migration backup; read the upgrade notes first. Coming from v1.19.0, follow the v2.0.x upgrade procedure first.
More screenshots | Quick start | Configuration | Documentation
- Find artists and albums. Connect a listening source, scan, and review scored suggestions. Release Radar finds new releases; Library Gap-Fill finds missing albums. Use Get missing albums on an artist to review and approve missing studio albums together. Mood and artist searches work without a listening history.
- Review before adding. Preview, approve, reject, or permanently block suggestions. Individual and bulk album approval monitor and search only the recommended album in Lidarr. Automatic album approval also uses only the recommended release; its monitoring setting applies to artist recommendations.
- Keep discovery running. Run or schedule a mode from one Discovery Modes page, review all schedules in Settings > Schedule, or generate playlists from your connected libraries and catalog searches for Spotify and supported media servers. Saved playlists refresh their bound remote playlists; explicit recovery handles uncertain creation and changed destinations. Audition playlists use pending artists without approving them. You can also export M3U/XSPF files. Media-server exports use music already in that server's library.
- Share an instance. Each user has their own queue, connections, and preferences; admins assign targets to each user. Optional approval policies let members request additions for admin review, with score-based trust and open-request limits. Local accounts and OIDC/SSO are supported, with 15 languages and light and dark themes.
Digarr calls your connected services. It doesn't include a downloader or a full music player.
AI suggestions and MusicBrainz matches can be wrong, so check the artist and release before approving. Playlist generation reports local results; it doesn't verify remote playback. Media-server exports require an exact artist/title match after case and whitespace normalization. Unmatched tracks are skipped, and omissions are reported in Job History. See known limitations.
| Use | Services |
|---|---|
| Scan taste-profile sources | ListenBrainz, Last.fm, Spotify, Plex, Jellyfin, Emby, Subsonic, Discogs |
| Deezer feeds | Flow, favorites, followed artists, and playlists (own app required) |
| Library sync | Lidarr, Plex, Jellyfin, Emby, Subsonic |
| Approval and acquisition | Lidarr, slskd |
| Playlist export | Spotify, Navidrome, Jellyfin, Emby, Plex |
| Search | Spotify, Deezer, MusicBrainz; Bandcamp and TIDAL (both experimental) |
| Audio similarity | AudioMuse-AI (optional, experimental; v3.6.4+) |
| AI recommendations | Anthropic, OpenAI, Gemini, Ollama, OpenAI-compatible endpoints |
| Notifications | Webhooks, ntfy, Telegram, Apprise |
A connection's capabilities differ by service. Release Radar requires ListenBrainz, Spotify, or Last.fm. Spotify Saved Albums and Followed Artists, Deezer Flow, and Subsonic Starred have focused discovery modes.
In Settings > Connections, on the ListenBrainz and Last.fm cards, you can opt in separately to ListenBrainz track loves, ListenBrainz playlists from manual generation, and Last.fm track loves. Scheduled playlist regenerations never send to ListenBrainz. Only exact-track approvals from previews or Audition send loves; rejects and artist-only approvals stay local. Last.fm requires an encrypted per-user connection. See scrobbler setup and privacy.
Your database runs on your server. Connected services still receive requests: hosted AI providers receive discovery prompts, metadata services receive lookups, and embedded previews contact their providers. A local AI model keeps AI requests local, but does not make all of Digarr offline.
Set and retain DIGARR_ENCRYPTION_KEY before saving service credentials. Without it, sensitive database fields are stored unencrypted. Back up the key separately from the database; losing it means re-entering encrypted credentials. Application exports preserve persistent state; a native consistent database backup is still required for exact schema rollback. Required automatic-backup failures stop migrations. See the key rotation guide before changing an existing key.
You need Docker and access to an AI provider or local model. Digarr includes an embedded PostgreSQL database (PGlite), so this runs as one container:
mkdir digarr && cd digarr &&
(set -C; umask 077 && key=$(openssl rand -hex 32) && printf 'DIGARR_ENCRYPTION_KEY=%s\n' "$key" > digarr.env) &&
docker run -d --name digarr --restart unless-stopped -p 127.0.0.1:3000:3000 \
--env-file ./digarr.env \
-e ALLOWED_ORIGIN=http://localhost:3000 \
-e DIGARR_ALLOW_INSECURE_COOKIES=true \
-v digarr-data:/app/data -v digarr-backups:/app/backups \
docker.io/iuliandita/digarr:latestThis local-only HTTP example needs OpenSSL and saves the key in protected digarr.env. Retain that file for container recreation and recovery. The cookie override avoids browser-dependent Secure-cookie handling on localhost. For other devices, configure an HTTPS public origin; deliberate HTTP exposes session cookies to interception.
Open http://localhost:3000 and complete setup. Create the first account or sign in before the wizard. Passwords need 12 characters. The first account becomes admin; further local self-registration is closed by default. OIDC can still create accounts, so restrict access at your identity provider.
For unattended first boot, set both DIGARR_INITIAL_USERNAME and DIGARR_INITIAL_PASSWORD before starting. The configured admin must be created before HTTP opens; partial credentials or a password shorter than 12 characters stop startup. Leave both unset for manual registration. These settings never reset an existing account. Restrict access until you verify the intended admin. See first-boot access.
Use :latest for the newest release, a minor tag like :2.1 for patch updates, or a specific patch like :2.1.0 to pin a release. Only the newest release receives security fixes. See image channels.
For Compose, backend selection, and updates, follow the Docker guide. Keep one app instance per database, verify its backend at /health, and back up before upgrading.
- Sign in, then choose Lidarr, Emby, or discovery-only in the setup wizard and configure your AI provider, or skip it and rely on the listening sources you connect later. Requested settings, connections, and targets save together; a failed save leaves setup retryable.
- Open Settings > Connections > Add connection, then search for a listening or library service. Saved connections appear under Your connections; add export targets under Targets when needed.
- Run a scan from Dashboard or Discover.
- Preview, approve, or reject suggestions. Adjust genre priorities in Settings > Recommendations if needed. Personal saves work for non-admins. Image-source keys and switches live under Settings > Connections > Artist images; server rows are read-only for non-admins. Use Release Radar or Library Gap-Fill for albums. The net-new album toggle defaults to off and persists when saved.
Open Discovery Modes > Run a mode > Presets and imports for CSV, M3U, XSPF, and connected-service imports. File and playlist imports process the listed artists into recommendations through separate subscription runs. Spotify's Import Liked Songs does the same for saved tracks. Imports do not become inputs to a normal scan. Spotify playlist imports honor the saved artist cap across pages; see limits and playlist access.
A scan can complete with a failed source. Admins can check Job History for partial results; other users can refresh Discover. Services without similar-artist lookup still contribute their supported listening and library data. See the pipeline guide for the details.
Use Customize on the Dashboard to show or hide any card, drag or use the keyboard to reorder cards, and choose small, medium, or large sizes. Layouts follow your account across devices. Empty cards hide by default; enable Show empty cards to keep them visible. Reset to default restores Today's Pick, Your decisions, Listening, Genres, and Subscriptions. Genres, Subscriptions, Discover's pending and decision views, and Settings > Connections have a Show on dashboard switch for their card.
Use Settings for connections, scoring, schedules, preferences, and language. For scripts, create a named, revocable credential in Settings > Account > API tokens with read, write, or admin scope and an optional expiry; personal token setup explains the one-time reveal and permissions. Authentication covers origins, cookies, SSO, and proxies. Operations covers Plex listeners, slskd imports, Data Hygiene, playlists, notifications, and local AI.
Connections lists saved services, including incomplete setups. Add connection opens a searchable picker grouped by listening history, streaming accounts, media servers, and collections. Missing admin services are also available there. Disconnecting a service returns it to the picker. The admin-only Show experimental integrations switch at the bottom reveals AudioMuse-AI, TIDAL and Bandcamp in settings, search-source choices, and discovery-mode choices. New setups default to off; completed older setups retain their previously enabled Bandcamp search. Hiding a service does not disable stored connections or scheduled jobs.
Spotify needs your own OAuth app, a Premium app owner, and up to five allowlisted Development Mode users. Search needs a connected account. Local HTTP uses 127.0.0.1, with the same ALLOWED_ORIGIN and browser address. Follow Spotify setup before changing the quick-start origin.
TIDAL is experimental: authorization, refresh, and favorite-artist retrieval have not been tested with a live account. Catalog search needs admin-registered credentials; each user connects their own account for Favorite Artists. Follow TIDAL setup. The feedback checklist explains what to report safely.
Application JSON exports preserve persistent application state and reject unsafe partial restores before writes. Required automatic-backup failures stop migrations. Retain the matching encryption key separately, and use a native consistent database backup for exact schema rollback. Read backup boundaries and recovery before upgrading or restoring, including the explicit native-backup procedure for older schemas. Operations covers application exports and version-specific upgrade notes.
Selecting a backup in Settings > Administration opens a replacement confirmation before any upload. An encryption-key mismatch requires a separate Restore Anyway confirmation; retain the original key whenever possible.
| Method | Path | Notes |
|---|---|---|
| Docker Compose | deploy/docker/ |
Recommended. Choose single-container PGlite or the bundled PostgreSQL stack. Also on Docker Hub. |
| Helm chart | deploy/helm/digarr/ |
Kubernetes. Embedded PGlite, bundled PostgreSQL, or your own database. Keep one app replica. |
| Raw k8s manifests | deploy/k8s/ |
Reference manifests for advanced setups. |
| Unraid | docs/guides/unraid.md |
In the Community Applications store (search "Digarr"); bundled template (deploy/unraid/digarr.xml) as manual fallback. Embedded PGlite by default; external PostgreSQL optional. |
| Synology NAS | docs/guides/synology.md |
DSM 7.1+ (Docker/Container Manager). SSH or GUI. |
| Docker Desktop | docs/guides/docker-desktop.md |
macOS and Windows (WSL 2 or PowerShell). |
Any PostgreSQL you supply yourself must be version 15 or newer: migrations create NULLS NOT DISTINCT unique indexes. The bundled stacks use PostgreSQL 17.
Check image signatures and SBOM coverage before running a release.
- Configuration and operations
- Authentication, SSO, and user management
- API reference, architecture, and name normalization
- Connect an MCP client for recommendations, approvals, and scans
- Recommendation quality evaluation
- Discovery recipes for discovery-only and existing-library setups, seasonal and decade tags, and familiar versus adventurous tuning
- Switching database backends and encryption-key rotation
- Changelog, roadmap, and screenshots
- Other self-hosted music projects
Bug reports, translations, documentation fixes, and code contributions are welcome. See CONTRIBUTING.md for development setup and checks. Report security problems through the private reporting process.
Most code and tests are AI-generated, with a human setting direction and reviewing changes.
MIT. See LICENSE.
Made by Iulian Dita. Other projects.
