CEO OS

discovery

Music Discovery & Metadata — Navidrome Plugin Stack

Self-hosted Discover Weekly + automatic cover art / artist metadata via Navidrome's plugin system.

Active plugins

Plugin Capability Source
apple-music v0.1.1 MetadataAgent (album art, artist images, bios, similar artists) navidrome/apple-music-plugin
listenbrainz-metadata-provider v2.0.2 MetadataAgent (MusicBrainz / Cover Art Archive fallback) kgarner7/navidrome-listenbrainz-plugin
listenbrainz-daily-playlist v5.0.2 Daily Jams playlist generator kgarner7/navidrome-listenbrainz-daily-playlist
lrclib-lyrics v3.0.1 Synced + plain lyrics fetcher LRCLIB

All .ndp files live at ~/.navidrome/data/plugins/.

Critical config — ~/.navidrome/navidrome.toml

MusicFolder = "/Users/karthik/Music/Library"
DataFolder = "/Users/karthik/.navidrome/data"
Port = 4533
Address = "0.0.0.0"
ScanSchedule = "@every 6h"
EnableTranscodingConfig = true
RecentlyAddedByModTime = true
GroupAlbumReleases = true
CoverArtPriority = "cover.*, folder.*, front.*, embedded, external"
Agents = "apple-music,listenbrainz-metadata-provider"
LogLevel = "info"

[Plugins]
Enabled = true
Folder = "/Users/karthik/.navidrome/data/plugins"

Two non-obvious settings that matter

  1. Agents = "apple-music,listenbrainz-metadata-provider" — without this, Navidrome ignores plugins and only tries the built-in (unconfigured) lastfm agent. Plugins must be explicitly listed in priority order; first hit wins. Symptom of missing: album/artist art never auto-fetches even when albums are opened. Plugin kvstore.db files never get written to.
  2. CoverArtPriority = "cover.*, folder.*, front.*, embedded, external" — default puts embedded first, which is wrong when m4a/MP3 files have stale or wrong embedded art (e.g. Apple Music's Telugu poster baked into Tamil tracks). Folder priority lets you drop a cover.jpg into an album folder and have it win over embedded.

How metadata fetching actually works

  • Agent chain only fires when you open an album in any client (calls /rest/getAlbumInfo Subsonic endpoint internally).
  • Once fetched, results are cached forever in the album's external_info_updated_at / large_image_url DB columns.
  • It does NOT bulk-fetch during scan. 127 missing covers won't auto-fix; they fix one-by-one as you browse.
  • For albums where Apple Music + MusicBrainz both miss (e.g. obscure Tamil EPs), drop a cover.jpg into the album folder manually.

Per-plugin DB activation (after install)

Plugins must have enabled=1 AND all_users=1, all_libraries=1 in the plugin SQLite table, or they're inert. UI doesn't always set these correctly — verify with:

sqlite3 ~/.navidrome/data/navidrome.db "SELECT id, enabled, all_users, all_libraries FROM plugin;"

For apple-music, also enable album images (off by default):

UPDATE plugin SET config = json('{"enable_album_images":true,"enable_artist_biography":true,"enable_artist_images":true,"enable_artist_url":true,"enable_similar_artists":true,"enable_top_songs":true,"countries":"in,us,gb","cache_ttl_days":7}') WHERE id='apple-music';

countries="in,us,gb" — India first for Tamil catalog coverage.

Daily Jams playlist (recs only, no downloads)

  1. Plugin runs on configurable hour (24-hour clock)
  2. Hits ListenBrainz API for daily/weekly recs (Weekly Exploration, Weekly Jams, Daily Jams)
  3. Creates Navidrome playlist containing only tracks already in your library that match
  4. Skips anything you don't own — no downloads, no library pollution

ListenBrainz user mapping: karthikimkarthikk.

Why this beats Explo

Explo was tried first (binary at /Users/karthik/Developer/explo) but downloaded all recommendations as MP3s into Music/Library/explo/. Each track had its own album metadata in ID3 tags, so Navidrome surfaced 50 single-track "albums" in Recently Added — visually polluted.

Removed: Explo source tree, binary, archive folder, and cron entry.

Requirements

  • Navidrome ≥ 0.61.0 (current: 0.61.2 ✓)
  • ListenBrainz account with listening history (more history = better recs)

Manual cover-art recipe (when agents miss)

  1. Search MusicBrainz: https://musicbrainz.org/ws/2/release/?query=release:NAME+AND+artist:ARTIST&fmt=json
  2. Pick the release ID, hit Cover Art Archive: https://coverartarchive.org/release/<MBID>/front-1200
  3. Save as cover.jpg in the album folder
  4. touch the folder to trigger Navidrome watcher rescan

Backups of replaced art kept as cover.jpg.<reason>-bak in each folder (per the "never delete" rule in music/CLAUDE.md).

Private. Behind Cloudflare Access. © Karthik Kamalakannan.