# Navidrome changelog > A self-hosted music server and streamer compatible with Subsonic clients. - Vendor: Navidrome - Category: Media - Official site: https://www.navidrome.org - Tracked by: What's New (https://whatsnew.fyi/product/navidrome) - Harvested from: GitHub (navidrome/navidrome) - Entries below: 10 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## Releases ### v0.63.2 - Date: 2026-07-11 - Version: v0.63.2 - Original notes: https://github.com/navidrome/navidrome/releases/tag/v0.63.2 - Permalink: https://whatsnew.fyi/product/navidrome/releases/v0.63.2 - **fixed** — Surface host service failures when loading plugins - **fixed** — Resolve file symlinks with the production local storage FS in scanner - **fixed** — Reject NSP mixing top-level 'any' and 'all' in smartplaylist ##### Changelog ###### Bug fixes * 205c85da5523338807808202d8877ccaa6e82776: fix(plugins): surface host service failures when loading plugins (#5756) (@deluan) * 7fa13761d734159e2f0a502a31affacc88e66d37: fix(scanner): resolve file symlinks with the production local storage FS (#5755) (@deluan) * e91687e760a8b4e19dc74b6a9b1ff7f3674565ce: fix(smartplaylist): reject NSP mixing top-level 'any' and 'all' (#5759) (@deluan) ###### Build process updates * be10f89c117925fabf10394b8d2962a370108b97: ci: don't skip release jobs after the DB migration check on tag pushes (#5760) (@deluan) * 4381366e663b4647cfec1eb5597c39c3c42e9d7a: ci: validate DB migration order on pull requests (#5750) (@deluan) ###### Other work * 116a4407184b6f21221a6aa7702fb738a3915773: test(scanner): fix flaky Windows search_normalized rescan test (#5758) (@deluan) **Full Changelog**: https://github.com/navidrome/navidrome/compare/v0.63.1...v0.63.2 ##### Helping out This release is only possible thanks to the support of some **awesome people**! Want to be one of them? You can [sponsor](https://github.com/sponsors/deluan), pay me a [Ko-fi](https://ko-fi.com/deluan), or [contribute with code](https://www.navidrome.org/docs/developers/). ##### Where to go next? * Read installation instructions on our [website](https://www.navidrome.org/docs/installation/). * Host Navidrome on [PikaPods](https://www.pikapods.com/pods/navidrome) or [Danian](https://danian.co/navidrome?nd) for a simple cloud solution. * Reach out on [Discord](https://discord.gg/xh7j7yF), [Reddit](https://www.reddit.com/r/navidrome/) and [Twitter](https://twitter.com/navidrome)! ### v0.63.1 - Date: 2026-07-09 - Version: v0.63.1 - Original notes: https://github.com/navidrome/navidrome/releases/tag/v0.63.1 - Permalink: https://whatsnew.fyi/product/navidrome/releases/v0.63.1 - **fixed** — Prevent 32-bit startup crash (segfault/SIGILL) in downloaded binaries - **fixed** — Discard buffered scrobbles when a plugin is removed - **fixed** — Populate username for buffered plugin scrobbles - **fixed** — Rewrite systemd service template for kardianos/service v1.3.0 ##### Changelog ###### Bug fixes * 052f10fd68984a01cc2c87eee9edcc16dbfa6ad5: fix(build): prevent 32-bit startup crash (segfault/SIGILL) in downloads binaries (#5739) (@deluan) * f48943c05873dad7cab4e159747453a5d7677f74: fix(plugins): discard buffered scrobbles when a plugin is removed (#5737) (@deluan) * 4652b4660205abf38a484a2dc7856b4f6d5c24aa: fix(plugins): populate username for buffered plugin scrobbles (#5736) (@deluan) * 42d4363f6135167b7fce5c8fd9070a25fab10172: fix(service): rewrite systemd service template for kardianos/service v1.3.0 (#5743) (@deluan) **Full Changelog**: https://github.com/navidrome/navidrome/compare/v0.63.0...v0.63.1 ##### Helping out This release is only possible thanks to the support of some **awesome people**! Want to be one of them? You can [sponsor](https://github.com/sponsors/deluan), pay me a [Ko-fi](https://ko-fi.com/deluan), or [contribute with code](https://www.navidrome.org/docs/developers/). ##### Where to go next? * Read installation instructions on our [website](https://www.navidrome.org/docs/installation/). * Host Navidrome on [PikaPods](https://www.pikapods.com/pods/navidrome) or [Danian](https://danian.co/navidrome?nd) for a simple cloud solution. * Reach out on [Discord](https://discord.gg/xh7j7yF), [Reddit](https://www.reddit.com/r/navidrome/) and [Twitter](https://twitter.com/navidrome)! ### v0.63.0 - Date: 2026-07-08 - Version: v0.63.0 - Original notes: https://github.com/navidrome/navidrome/releases/tag/v0.63.0 - Permalink: https://whatsnew.fyi/product/navidrome/releases/v0.63.0 - **added** — Add structured sidecar lyrics support with OpenSubsonic v2 karaoke cues and agent layers in TTML, ELRC, SRT and YAML formats with word-by-word timing and multi-voice information - **added** — Add Rosé Pine themes - **added** — Add Scanner.ArtistSplitExceptions configuration option to protect artist names from being split by tag separators - **added** — Add Scanner.IgnoreDotFolders configuration option to allow indexing dot-prefixed folders - **changed** — Rank exact matches above prefix matches in search results - **changed** — Enable sharing by default; set EnableSharing to false to restore the previous behavior - **changed** — Update LyricsPriority default to include new sidecar lyrics formats - **changed** — Improve full-library synchronization via search3 to perform at flat time at every offset instead of degrading with depth, achieving roughly 30-50x faster performance at deep offsets and about 20x faster complete sync on ~1M-track libraries - **changed** — Make getRandomSongs approximately 13x faster on large libraries - **changed** — Optimize database queries with annotation-index-friendly smart playlist filters, leaner list-count queries, and new composite indexes for album and artist song sorts - **fixed** — Enforce per-library access on playlist import and sharing paths to prevent users with access to only some libraries from resolving or being served tracks from unauthorized libraries - **fixed** — Resolve symlinks to their real target when classifying files during scan to prevent misclassification - **fixed** — Fix artists with short or non-ASCII names being unfindable after the FTS5 search migration - **fixed** — Fix pagination-integrity issue that eliminated duplicate and short pages that could corrupt library syncs - **fixed** — Fix transient jump to a wrong song when switching tracks in the web player - **fixed** — Fix profile self-edits not reporting success or failure - **fixed** — Fix Nautiline theme font and width on mobile devices - **fixed** — Fix DefaultLanguage not being applied on app startup - **fixed** — Keep the player's lyrics in sync on track change and seek so the previous song's lyrics no longer linger - **changed** — Allow lyrics plugins to return lyrics in any supported format, not just LRC Navidrome 0.63 brings a long-awaited upgrade to lyrics: full support for synced sidecar lyrics in multiple formats (TTML, ELRC, SRT, YAML and LRC), including word-by-word karaoke timing and multi-voice (agent) layers, exposed to clients through the new OpenSubsonic v2 lyrics extensions. A huge shoutout to [@ranokay](https://github.com/ranokay), who not only contributed the code for these lyrics enhancements, but also helped shape the OpenSubsonic extension specification behind them. Search also gets noticeably smarter: exact matches now rank above prefix matches (searching for "MØ" brings MØ to the top instead of burying it), and artists with short or non-ASCII names that were previously unfindable now show up correctly. The other big theme of this release is performance for large libraries and offline-first clients. Full-library synchronization via `search3` (the way clients like Symfonium mirror the whole library) is now flat at every offset instead of degrading with depth, roughly 30-50x faster at deep offsets and about 20x faster for a complete sync on a ~1M-track library, and a related pagination-integrity fix eliminates the duplicate and short pages that could corrupt those syncs. Alongside it, `getRandomSongs` is about 13x faster on the same library size, and a batch of database improvements (annotation-index-friendly smart playlist filters, leaner list-count queries, and new composite indexes for album/artist song sorts) makes everyday operations anywhere from ~9x to ~160x faster. Finally, a heads-up on a behavior change: sharing is now enabled by default, and can be turned off with `EnableSharing=false`. ##### Security - Enforce per-library access on playlist import and sharing paths. In multi-library setups, three read paths did not consistently apply per-library restrictions: M3U import path resolution, shared-playlist track loading, and public share-scoped streams. A user with access to only some libraries could resolve or be served tracks from libraries they weren't assigned to. All three now respect the user's (or share owner's) library access. ([#5640](https://github.com/navidrome/navidrome/pull/5640) by [@deluan](https://github.com/deluan)) - Resolve symlinks to their real target when classifying files during scan, preventing symlinked entries from being misclassified. ([ecba19a08](https://github.com/navidrome/navidrome/commit/ecba19a08) by [@deluan](https://github.com/deluan)) ##### Configuration Changes | Status | Option | Description | Default | |--------|--------|-------------|---------| | New | `Scanner.ArtistSplitExceptions` | List of artist names that must never be split by tag separators (e.g. "Tyler, The Creator"). ([#5701](https://github.com/navidrome/navidrome/pull/5701)) | `[]` (empty) | | New | `Scanner.IgnoreDotFolders` | Whether to skip folders whose name starts with a dot when scanning. Set to `false` to index dot-prefixed folders. ([#5568](https://github.com/navidrome/navidrome/pull/5568)) | `true` | | Changed | `EnableSharing` | Sharing is now enabled by default. Set to `false` to restore the previous behavior. ([#5714](https://github.com/navidrome/navidrome/pull/5714)) | `true` | | Changed | `LyricsPriority` | New sidecar lyrics formats added to the default priority list. ([#5076](https://github.com/navidrome/navidrome/pull/5076)) | `.ttml,.yaml,.yml,.elrc,.lrc,.srt,.txt,embedded` | For a complete list of all configuration options, see the [Configuration Options](https://www.navidrome.org/docs/usage/configuration-options/) documentation. ##### Lyrics - Add structured sidecar lyrics support with OpenSubsonic v2 karaoke cues and agent layers: TTML, ELRC, SRT and YAML sidecar files are now parsed with word-by-word timing and multi-voice information. ([#5076](https://github.com/navidrome/navidrome/pull/5076) by [@ranokay](https://github.com/ranokay)) - Allow lyrics plugins to return lyrics in any supported format, not just LRC. ([#5632](https://github.com/navidrome/ _[Truncated at 4000 characters — full notes: https://github.com/navidrome/navidrome/releases/tag/v0.63.0]_ ### v0.62.0 - Date: 2026-06-08 - Version: v0.62.0 - Original notes: https://github.com/navidrome/navidrome/releases/tag/v0.62.0 - Permalink: https://whatsnew.fyi/product/navidrome/releases/v0.62.0 - **added** — Support for OpenSubsonic sonicSimilarity extension enabling audio-based similarity through plugins with getSonicSimilarTracks and findSonicPath endpoints - **added** — New OpenSubsonic playbackReport extension for playback reporting in the UI - **added** — ReplayGain fields in smart playlists - **added** — New isMissing and isPresent operators for smart playlists - **added** — Five new UI themes - **added** — EnforceNonRootUser option to exit early on startup if Navidrome is running as root - **added** — Transcoding.MaxConcurrent option to set maximum number of concurrent transcodes server-wide - **added** — Transcoding.MaxConcurrentPerUser option to set maximum number of concurrent transcodes per user - **added** — Matcher.PreferStarred option to bias the fuzzy matcher toward starred and high-rated tracks - **added** — UIPlaybackReportInterval option to configure how often the UI reports playback progress - **changed** — Redesigned Now Playing experience and playback reporting panel using OpenSubsonic playbackReport extension - **changed** — Renamed EnableTranscodingCancellation to Transcoding.EnableCancellation and moved under Transcoding section - **changed** — Renamed SimilarSongsMatchThreshold to Matcher.FuzzyThreshold and moved under Matcher section - **security** — Enforce per-user ownership on share reads to fix cross-account disclosure of other users' shares and share tokens - **security** — Enforce ownership atomically on player and share updates to fix cross-tenant player takeover and share-update IDOR - **security** — Require signed state token on Last.fm link callback to fix unauthenticated scrobble session hijack - **security** — Validate token expiration and share existence on public share stream endpoints to fix JWT expiration bypass - **security** — Restrict transcoding configuration reads to admins to fix disclosure of admin-only configuration to non-admin users - **security** — Require admin access for Subsonic internet radio station management endpoints to fix missing authorization - **security** — Cap concurrent transcodes to prevent ffmpeg-based denial of service with per-server and per-user limits This release introduces support for the OpenSubsonic **`sonicSimilarity`** extension, enabling audio-based similarity through the plugin system: when a plugin provides the capability, the new `getSonicSimilarTracks` and `findSonicPath` endpoints unlock smarter, sound-based recommendations and playlists. One plugin that implements it is [AudioMuse-AI](https://github.com/NeptuneHub/AudioMuse-AI-NV-plugin). It also brings a major overhaul to playback reporting and the **Now Playing** experience — the UI now uses the new OpenSubsonic `playbackReport` extension, replacing the old scrobble flow with a redesigned panel and configurable reporting interval. On the security front, it hardens the server with stronger ownership and authorization checks across shares, players, and transcoding endpoints, caps concurrent transcodes to prevent ffmpeg-based denial of service, and adds an option to refuse to run as root. Smart playlists gain ReplayGain fields and new `isMissing`/`isPresent` operators, and there are five new UI themes to choose from. ##### Security This release fixes several reported vulnerabilities. We thank the security researchers who responsibly disclosed them. - Fix cross-account disclosure of other users' shares (incl. share tokens) by enforcing per-user ownership on share reads. ([1e7996f5d](https://github.com/navidrome/navidrome/commit/1e7996f5d), [GHSA-3g4p-jhv2-xrxf](https://github.com/navidrome/navidrome/security/advisories/GHSA-3g4p-jhv2-xrxf), reported by [@Wernerina](https://github.com/Wernerina)) - Fix cross-tenant player takeover and share-update IDOR by enforcing ownership atomically on player and share updates. ([#5563](https://github.com/navidrome/navidrome/pull/5563), [GHSA-x65f-m8x9-pjxm](https://github.com/navidrome/navidrome/security/advisories/GHSA-x65f-m8x9-pjxm) reported by [@tonghuaroot](https://github.com/tonghuaroot); [GHSA-58gr-c777-g23p](https://github.com/navidrome/navidrome/security/advisories/GHSA-58gr-c777-g23p) reported by [@lighthousekeeper1212](https://github.com/lighthousekeeper1212); [GHSA-wx2c-q8g7-4q5p](https://github.com/navidrome/navidrome/security/advisories/GHSA-wx2c-q8g7-4q5p) reported by [@CE2Sec](https://github.com/CE2Sec)) - Fix unauthenticated Last.fm scrobble session hijack (IDOR) by requiring a signed state token on the link callback. ([#5521](https://github.com/navidrome/navidrome/pull/5521), [GHSA-8jrh-w926-8rvw](https://github.com/navidrome/navidrome/security/advisories/GHSA-8jrh-w926-8rvw), reported by [@geo-chen](https://github.com/geo-chen)) - Fix JWT expiration bypass on public share stream endpoints by validating token expiration and share existence. ([#5426](https://github.com/navidrome/navidrome/pull/5426), [GHSA-3rfj-qx9q-jghx](https://github.com/navidrome/navidrome/security/advisories/GHSA-3rfj-qx9q-jghx), reported by [@wooseokdotkim](https://github.com/wooseokdotkim)) - Fix disclosure of admin-only transcoding configuration to non-admin users by restricting transcoding config reads to admins. ([#5564](https://github.com/navidrome/navidrome/pull/5564), [GHSA-4p3r-6362-833w](https://github.com/navidrome/navidrome/security/advisories/GHSA-4p3r-6362-833w), reported by [@DavidCarliez](https://github.com/DavidCarliez)) - Fix missing admin authorization on internet radio station management endpoints by requiring admin access for Subsonic management endpoints. ([#5510](https://github.com/navidrome/navidrome/pull/5510), [GHSA-jw24-qqrj-633c](https://github.com/navidrome/navidrome/security/advisories/GHSA-jw24-qqrj-633c), reported by [@osageling](https://github.com/osageling)) - Cap concurrent transcodes to prevent an ffmpeg-based denial of service, with new per-server and per-user limits. ([#5522](https://github.com/navidrome/navidrome/pull/5522) by [@deluan](https://github.com/deluan)) - Add `EnforceNonRootUser` option to exit early if Navidrome is started as root. ([#5373](https://github.com/navidrome/navidrome/pull/5373) by [@kopf](https://github.com/kop _[Truncated at 4000 characters — full notes: https://github.com/navidrome/navidrome/releases/tag/v0.62.0]_ ### v0.61.2 - Date: 2026-04-12 - Version: v0.61.2 - Original notes: https://github.com/navidrome/navidrome/releases/tag/v0.61.2 - Permalink: https://whatsnew.fyi/product/navidrome/releases/v0.61.2 - **added** — Add MaxImageUploadSize configuration option to set maximum allowed size for uploaded cover art images - **changed** — Map ORIGYEAR tag for VorbisComment and MP4 formats to match ID3 behavior - **changed** — Clamp target channels to codec limit when transcoding to fix issues with codecs that do not support high channel counts - **changed** — Play WAV files directly in browsers instead of transcoding - **changed** — Prevent theme CSS filters from affecting disc cover art - **changed** — Refine image filters for playing and paused states in SquiddiesGlass theme - **changed** — Add file path to Scrobbler and Lyrics plugin TrackInfo - **changed** — Honor path component of ShareURL config - **fixed** — Fix issue with empty ID3v2 frames in go-taglib - **fixed** — Always emit required created field on AlbumID3 responses - **fixed** — Allow shared disc art from unnumbered filenames in single-folder albums - **fixed** — Fix race condition between KVStore cleanup goroutine and Close - **fixed** — Surface real SQLite error when backup step fails - **fixed** — Improve error handling in configuration validation - **fixed** — Resolve schema inconsistencies in library_artist and scrobble_buffer tables - **changed** — Include ffprobe in MSI installer and fall back gracefully when absent - **changed** — Reduce hot-path heap escapes from value-param pointer aliasing Another round of bugfixes. Transcoding now properly clamps target channels to codec limits, WAV files play directly in browsers without unnecessary transcoding, and the scanner picks up `ORIGYEAR` tags for VorbisComment and MP4 formats. Cover art handling got a few fixes too, including configurable max upload size. Plugin developers now get the file path in TrackInfo for Scrobbler and Lyrics plugins. ##### Configuration Changes | Status | Option | Description | Default | |--------|--------|-------------|---------| | New | `MaxImageUploadSize` | Maximum allowed size for uploaded cover art images. Accepts human-readable values like '10MB', '1GB'. ([#5335](https://github.com/navidrome/navidrome/pull/5335)) | `10MB` | For a complete list of all configuration options, see the [Configuration Options](https://www.navidrome.org/docs/usage/configuration-options/) documentation. ##### UI - Prevent theme CSS filters from affecting disc cover art. ([c91721363](https://github.com/navidrome/navidrome/commit/c91721363) by [@deluan](https://github.com/deluan)) - Refine image filters for playing and paused states in SquiddiesGlass theme. ([4570dec67](https://github.com/navidrome/navidrome/commit/4570dec67) by [@deluan](https://github.com/deluan)) - Update Chinese (Simplified) translation. ([#5323](https://github.com/navidrome/navidrome/pull/5323) by [@fxj368](https://github.com/fxj368)) - Update Russian translations. ([#5329](https://github.com/navidrome/navidrome/pull/5329) by [@amakeenk](https://github.com/amakeenk)) ##### Scanner - Map ORIGYEAR tag for VorbisComment and MP4 formats, bringing them in line with ID3. ([#5303](https://github.com/navidrome/navidrome/pull/5303) by [@obskyr](https://github.com/obskyr)) - Fix issue with empty ID3v2 frames in go-taglib. ([1de4e43d2](https://github.com/navidrome/navidrome/commit/1de4e43d2) by [@deluan](https://github.com/deluan)) ##### Subsonic API - Always emit required `created` field on AlbumID3 responses. ([#5340](https://github.com/navidrome/navidrome/pull/5340) by [@deluan](https://github.com/deluan)) ##### Artwork - Make max image upload size configurable. ([#5335](https://github.com/navidrome/navidrome/pull/5335) by [@m8tec](https://github.com/m8tec)) - Allow shared disc art from unnumbered filenames in single-folder albums. ([#5344](https://github.com/navidrome/navidrome/pull/5344) by [@deluan](https://github.com/deluan)) ##### Transcoding - Clamp target channels to codec limit, fixing issues with codecs that don't support high channel counts. ([#5345](https://github.com/navidrome/navidrome/pull/5345) by [@deluan](https://github.com/deluan)) - Play WAV files directly in browsers instead of transcoding. ([#5309](https://github.com/navidrome/navidrome/pull/5309) by [@deluan](https://github.com/deluan)) - Include ffprobe in MSI installer and fall back gracefully when absent. ([#5326](https://github.com/navidrome/navidrome/pull/5326) by [@deluan](https://github.com/deluan)) ##### Plugins - Add file path to Scrobbler and Lyrics plugin TrackInfo. ([#5339](https://github.com/navidrome/navidrome/pull/5339) by [@J0R6IT0](https://github.com/J0R6IT0)) - Fix race condition between KVStore cleanup goroutine and Close. ([478845bc5](https://github.com/navidrome/navidrome/commit/478845bc5) by [@deluan](https://github.com/deluan)) ##### Server - Honor path component of ShareURL config. ([d7baf6ee7](https://github.com/navidrome/navidrome/commit/d7baf6ee7) by [@deluan](https://github.com/deluan)) - Surface real SQLite error when backup step fails. ([1f3a7efa7](https://github.com/navidrome/navidrome/commit/1f3a7efa7) by [@deluan](https://github.com/deluan)) - Improve error handling in configuration validation. ([1988a4162](https://github.com/navidrome/navidrome/commit/1988a4162) by [@deluan](https://github.com/deluan)) - Reduce hot-path heap escapes from value-param pointer aliasing. ([#5342](https://github.com/navidrome/navidrome/pull/5342) by [@deluan](https:/ _[Truncated at 4000 characters — full notes: https://github.com/navidrome/navidrome/releases/tag/v0.61.2]_ ### v0.61.1 - Date: 2026-04-05 - Version: v0.61.1 - Original notes: https://github.com/navidrome/navidrome/releases/tag/v0.61.1 - Permalink: https://whatsnew.fyi/product/navidrome/releases/v0.61.1 - **fixed** — Address WebP performance regression on low-power hardware by preserving original image format when WebP encoding is disabled - **added** — Add EnableWebPEncoding config option to opt-in to WebP encoding for resized artwork - **added** — Add UICoverArtSize config option for configurable UI cover art size (200–1200 pixels, defaulting to 300px) - **changed** — Lower DevArtworkMaxRequests default from max(4, NumCPU) to max(2, NumCPU/2) to reduce load on low-power hardware - **removed** — Remove DevJpegCoverArt config option, replaced by EnableWebPEncoding - **added** — Add sampleRate, codec, and missing fields for smart playlist criteria - **fixed** — Preserve animation for square thumbnails with animated images - **fixed** — Strip OpenSubsonic extensions from playlists for legacy clients to improve compatibility - **fixed** — Return proper artwork ID format in getInternetRadioStations - **added** — Add missing viper defaults for MPVPath, ArtistImageFolder, and Plugins.LogLevel so they can be overridden via environment variables and config files - **changed** — Update go-sqlite3 to v1.14.38 and go-toml to v2.3.0 This patch release addresses a WebP performance regression on low-power hardware introduced in v0.61.0, adds a new `EnableWebPEncoding` config option and a configurable UI cover art size, and includes several Subsonic API and translation fixes. ##### Configuration Changes | Status | Option | Description | Default | |--------|--------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------| | New | `EnableWebPEncoding` | Opt-in to WebP encoding for resized artwork. When `false` (default), Navidrome uses JPEG/PNG (preserving the original source format), avoiding the WebP WASM encoder overhead that caused slow image processing on low-power hardware in v0.61.0. Set to `true` to re-enable WebP output. Replaces the internal `DevJpegCoverArt` flag. ([#5286](https://github.com/navidrome/navidrome/pull/5286)) | `false` | | New | `UICoverArtSize` | Size (in pixels, 200–1200) of cover art requested by the web UI. It was increased from 300px to 600px in 0.61.0; now configurable and defaulting to 300px to reduce image encoding load on low-power hardware. Users on capable hardware can raise it for sharper thumbnails. ([#5286](https://github.com/navidrome/navidrome/pull/5286)) | `300` | | Changed | `DevArtworkMaxRequests` | Default lowered from `max(4, NumCPU)` to `max(2, NumCPU/2)` to reduce load on low-power hardware. ([#5286](https://github.com/navidrome/navidrome/pull/5286)). (Note: this is an internal configuration and can be removed in future releases) | `max(2, NumCPU/2)` | | Removed | `DevJpegCoverArt` | Replaced by the user-facing `EnableWebPEncoding` option. ([#5286](https://github.com/navidrome/navidrome/pull/5286)) | — | For a complete list of all configuration options, see the [Configuration Options](https://www.navidrome.org/docs/usage/configuration-options/) documentation. ##### Server - Add missing viper defaults for `MPVPath`, `ArtistImageFolder`, and `Plugins.LogLevel` so they can be overridden via environment variables and config files. ([220019a9f](https://github.com/navidrome/navidrome/commit/220019a9f) by [@deluan](https://github.com/deluan)) - Update `go-sqlite3` to v1.14.38 and `go-toml` to v2.3.0. ([6109bf519](https://github.com/navidrome/navidrome/commit/6109bf519) by [@deluan](https://github.com/deluan)) ##### Artwork - Address WebP performance regression on low-power hardware by preserving original image format when WebP encoding is disabled, and adding encoder/decoder selection logging. ([#5286](https://github.com/navidrome/navidrome/pull/5286) by [@deluan](https://github.com/deluan)) - Preserve animation for square thumbnails with animated images. ([4030bfe06](https://github.com/navidrome/navidrome/commit/4030bfe06) by [@deluan](https://github.com/deluan)) ##### Smart Playlists - Add `sampleRate`, `codec`, and _[Truncated at 4000 characters — full notes: https://github.com/navidrome/navidrome/releases/tag/v0.61.1]_ ### v0.61.0 - Date: 2026-03-31 - Version: v0.61.0 - Original notes: https://github.com/navidrome/navidrome/releases/tag/v0.61.0 - Permalink: https://whatsnew.fyi/product/navidrome/releases/v0.61.0 - **added** — Support per-disc cover art with automatic disc-specific image detection for multi-disc albums - **added** — Enable custom artwork uploads for playlists, artists, and internet radios directly from the UI - **added** — Preserve animated images in the artwork pipeline - **added** — Implement WebP encoding for faster image processing - **added** — Rebuild search engine on SQLite FTS5 with two-phase BM25 ranking for faster and more accurate results - **added** — Implement OpenSubsonic Transcoding extension with server-managed transcoding that detects client codecs and applies format-aware bitrate defaults - **added** — Add plugin host services for HTTP requests, persistent task queues, lyrics providers, and key-value storage with TTL support - **added** — Add EnableM3UExternalAlbumArt configuration option to fetch album art URLs from #EXTALBUMARTURL directives in M3U playlists - **added** — Add DiscArtPriority configuration option to specify priority list for disc-level cover art sources - **added** — Add ArtistImageFolder configuration option to search for artist images within the library - **added** — Add Search.Backend configuration option to select search backend - **added** — Add ExtAuth.LogoutURL configuration option to redirect when logging out with external authentication - **added** — Add Subsonic.AppendAlbumVersion configuration option to append album version/edition to album names in Subsonic API responses - **added** — Add UISearchDebounceMs configuration option to control debounce delay for the UI search field - **changed** — Rename CoverJpegQuality configuration option to CoverArtQuality for clarity, with backward compatibility - **fixed** — Add ownership checks to share Delete and Update operations to prevent unauthorized access to other users' shares - **fixed** — Clear server-managed fields in savePlaylist to prevent field injection via REST API - **security** — Bump golang.org/x/image to v0.38.0 to address CVE-2026-33809 - **removed** — Remove built-in Spotify integration and Spotify.ID and Spotify.Secret configuration options This version brings a comprehensive **Artwork overhaul**, with per-disc cover art, artist image uploads, animated image preservation, and a faster image pipeline powered by WebP encoding. You can now upload custom artwork for playlists, artists, and internet radios directly from the UI, and multi-disc albums will automatically pick up disc-specific cover images. **Search** has been completely rebuilt on top of SQLite FTS5 with two-phase BM25 ranking, delivering faster and more accurate results across your entire library. **Transcoding** is now fully server-managed: Navidrome detects client codecs, applies format-aware bitrate defaults, and implements the [OpenSubsonic Transcoding extension](https://opensubsonic.netlify.app/docs/extensions/transcoding/), so clients no longer need to guess what format to request. The **Plugin System** continues to mature with new host services for HTTP requests, persistent task queues, lyrics providers, and key-value storage with TTL support, giving plugin developers more tools to build powerful integrations. ##### Security - Bump `golang.org/x/image` to v0.38.0 to address CVE-2026-33809. ([#5268](https://github.com/navidrome/navidrome/pull/5268)) - Add ownership checks to share Delete and Update operations, preventing unauthorized access to other users' shares. ([#5189](https://github.com/navidrome/navidrome/pull/5189) by [@deluan](https://github.com/deluan)) - Clear server-managed fields in savePlaylist to prevent field injection via REST API. ([f102036dc](https://github.com/navidrome/navidrome/commit/f102036dc) by [@deluan](https://github.com/deluan)) ##### ⚠️ Breaking Changes - Remove built-in Spotify integration. The `Spotify.ID` and `Spotify.Secret` configuration options are no longer supported. Use the Last.fm or Deezer agents, or a plugin for similar functionality, like the new [Apple Music Plugin](https://github.com/navidrome/apple-music-plugin). ([#5197](https://github.com/navidrome/navidrome/pull/5197) by [@deluan](https://github.com/deluan)) ##### Configuration Changes | Status | Option | Description | Default | |---------|----------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------| | New | `EnableArtworkUpload` | Enable uploading custom artwork for playlists and artists. ([#5110](https://github.com/navidrome/navidrome/pull/5110), [#5198](https://github.com/navidrome/navidrome/pull/5198)) | `true` | | New | `EnableM3UExternalAlbumArt` | Enable fetching album art URLs from `#EXTALBUMARTURL` directives in M3U playlists. ([#5131](https://github.com/navidrome/navidrome/pull/5131)) | `false` | | New | `DiscArtPriority` | Priority list for disc-level cover art sources. ([#5182](https://github.com/navidrome/navidrome/pull/5182)) | `disc*.*, cd*.*, cover.*, folder.*, front.*, discsubtitle, embedded` | | New | `ArtistImageFolder` | Folder name to search for artist images within the library. ([#5198](https://github.com/navidrome/navidrome/pull/5198)) | — | | New | `Search.Backend` | Search backend to use (`fts` for FTS5 full-t _[Truncated at 4000 characters — full notes: https://github.com/navidrome/navidrome/releases/tag/v0.61.0]_ ### v0.60.3 - Date: 2026-02-10 - Version: v0.60.3 - Original notes: https://github.com/navidrome/navidrome/releases/tag/v0.60.3 - Permalink: https://whatsnew.fyi/product/navidrome/releases/v0.60.3 - **added** — Add explicit status support in smart playlists - **fixed** — Log warning when metadata extraction fails - **fixed** — Pass filename hint to gotaglib's OpenStream for format detection - **fixed** — Resolve data race on conf.Server access in getScanner - **fixed** — Validate JSONP callback parameter in Subsonic API - **fixed** — Add missing keys in Danish translation - **fixed** — Linux service should restart when upgrading - **fixed** — Prevent data race on conf.Server during cleanup in e2e tests - **fixed** — Split reflex -R flags to preserve directory exclusion optimization ##### Changelog ###### New Features * 34c6f12aeeb11144100d764b06248e0a40ccb126: feat(server): add explicit status support in smart playlists (#5031) (@kgarner7) ###### Bug fixes * 408aa78ed53f0299d35e758cd422fd0b9dfe93a3: fix(scanner): log warning when metadata extraction fails (@deluan) * ed79a8897bc16602ebadb4e3a253d87f1599642f: fix(scanner): pass filename hint to gotaglib's OpenStream for format detection (#5012) (@deluan) * fd09ca103fd9fd14f5d0ecd3df6efd839a9df560: fix(scanner): resolve data race on conf.Server access in getScanner (@deluan) * 0a4722802af833caa8dd794fa8c25f8d0a97dd06: fix(subsonic): validate JSONP callback parameter (@deluan) * eb9ebc3fba6545334c2c13d778273c1bd55135ee: fix(ui): add missing keys in Danish translation (#5011) (@denisarissa) * 62f9c3a458bd101df1d059eeaf8bce43e7c97c21: fix: linux service should restart when upgrading (#5001) (@mintsoft) * e05a7e230f7a72b6c2e7d789006df63b688c30e2: fix: prevent data race on conf.Server during cleanup in e2e tests (@deluan) * bee0305831a76c49a46e7a6b0cbe09fd865abebc: fix: split reflex -R flags to preserve directory exclusion optimization (@deluan) ###### Other work * 302d99aa8b17e381cbd5a6c78d58125a9e0d6755: chore(deps): update dependencies in go.mod and go.sum (@deluan) * c80ef8ae41d692f971baf2ebab1a710a3182108f: chore: ignore _test.go files in reflex conf (@deluan) * 8319905d2c913b817a896a0b79a44b6b1cffe8c9: test(subsonic): add comprehensive e2e test suite for Subsonic API (#5003) (@deluan) **Full Changelog**: https://github.com/navidrome/navidrome/compare/v0.60.2...v0.60.3 ##### Helping out This release is only possible thanks to the support of some **awesome people**! Want to be one of them? You can [sponsor](https://github.com/sponsors/deluan), pay me a [Ko-fi](https://ko-fi.com/deluan), or [contribute with code](https://www.navidrome.org/docs/developers/). ##### Where to go next? * Read installation instructions on our [website](https://www.navidrome.org/docs/installation/). * Host Navidrome on [PikaPods](https://www.pikapods.com/pods/navidrome) for a simple cloud solution. * Reach out on [Discord](https://discord.gg/xh7j7yF), [Reddit](https://www.reddit.com/r/navidrome/) and [Twitter](https://twitter.com/navidrome)! ### v0.60.2 - Date: 2026-02-07 - Version: v0.60.2 - Original notes: https://github.com/navidrome/navidrome/releases/tag/v0.60.2 - Permalink: https://whatsnew.fyi/product/navidrome/releases/v0.60.2 - **added** — Add artist URL, top songs, and similar songs support to the ListenBrainz agent - **added** — Add OpenSubsonic readonly and validUntil properties to playlists - **added** — Add CallRaw method to SubsonicAPI host function with support for binary responses - **fixed** — Fix Last.fm URL handling and Biographies rendering on artist page - **fixed** — Fix Nautiline theme font path - **fixed** — Preserve first line in parentheses in lyrics - **fixed** — Clean up Last.fm content by removing "Read more" links from descriptions and bios - **fixed** — Handle WASM runtime panics in gotaglib openFile function This release expands ListenBrainz integration with artist URLs and top/similar songs, adds OpenSubsonic readonly and validUntil properties for playlists, and includes several bug fixes for the UI, scanner, and plugin system. ##### Added - Backend Features: - Add artist URL, top songs, and similar songs support to the ListenBrainz agent. ([#4934](https://github.com/navidrome/navidrome/pull/4934) by [@kgarner7](https://github.com/kgarner7)) - API Features: - Add OpenSubsonic `readonly` and `validUntil` properties to playlists. ([#4993](https://github.com/navidrome/navidrome/pull/4993) by [@kgarner7](https://github.com/kgarner7)) - Plugin Features: - Add `CallRaw` method to SubsonicAPI host function with support for binary responses. ([#4982](https://github.com/navidrome/navidrome/pull/4982) by [@deluan](https://github.com/deluan)) ##### Fixed - UI: - Fix Last.fm URL handling and Biographies rendering on artist page. ([#4980](https://github.com/navidrome/navidrome/pull/4980) by [@kgarner7](https://github.com/kgarner7)) - Fix Nautiline theme font path. ([#4983](https://github.com/navidrome/navidrome/pull/4983) by [@borisrorsvort](https://github.com/borisrorsvort)) - Scanner: - Preserve first line in parentheses in lyrics. ([#4985](https://github.com/navidrome/navidrome/pull/4985) by [@deluan](https://github.com/deluan)) - Server: - Clean up Last.fm content by removing "Read more" links from descriptions and bios. ([e11206f0e](https://github.com/navidrome/navidrome/commit/e11206f0e) by [@deluan](https://github.com/deluan)) - Handle WASM runtime panics in gotaglib openFile function. ([4e720ee93](https://github.com/navidrome/navidrome/commit/4e720ee93) by [@deluan](https://github.com/deluan)) **Full Changelog**: https://github.com/navidrome/navidrome/compare/v0.60.0...v0.60.2 ##### Helping out This release is only possible thanks to the support of some **awesome people**! Want to be one of them? You can [sponsor](https://github.com/sponsors/deluan), pay me a [Ko-fi](https://ko-fi.com/deluan), or [contribute with code](https://www.navidrome.org/docs/developers/). ##### Where to go next? * Read installation instructions on our [website](https://www.navidrome.org/docs/installation/). * Host Navidrome on [PikaPods](https://www.pikapods.com/pods/navidrome) for a simple cloud solution. * Reach out on [Discord](https://discord.gg/xh7j7yF), [Reddit](https://www.reddit.com/r/navidrome/) and [Twitter](https://twitter.com/navidrome)! ### v0.60.0 - Date: 2026-02-03 - Version: v0.60.0 - Original notes: https://github.com/navidrome/navidrome/releases/tag/v0.60.0 - Permalink: https://whatsnew.fyi/product/navidrome/releases/v0.60.0 - **added** — Add WebAssembly-based plugin system with multi-language PDK support for Go, Rust, Python, and JavaScript - **added** — Add JSONForms-based plugin configuration UI - **added** — Add similar songs retrieval functions to plugins API - **added** — Add pure-Go metadata extractor built on go-taglib library - **added** — Add Instant Mix feature to generate playlists of similar songs based on selected track - **added** — Add Plugins.Enabled, Plugins.Folder, Plugins.CacheSize, Plugins.AutoReload, and Plugins.LogLevel configuration options - **added** — Add Subsonic.MinimalClients configuration option for reduced API responses to resource-constrained devices - **added** — Add Subsonic.EnableAverageRating configuration option to control average rating in API responses - **added** — Add SimilarSongsMatchThreshold configuration option to set minimum similarity score for external source matching - **changed** — Change LastFM.Language and Deezer.Language to support comma-separated list of languages for metadata fallback - **changed** — Change metadata extractor to pure-Go implementation by default, with option to revert to legacy-taglib - **changed** — Rename HTTPSecurityHeaders.CustomFrameOptionsValue to HTTPHeaders.FrameOptions - **security** — Fix potential XSS vulnerability by sanitizing user-supplied data before rendering - **security** — Fix potential DoS vulnerability in cover art upscaling by clamping requested square size to original dimensions ##### Plugins This release introduces a major rewrite of the experimental **Plugin System**, now with multi-language PDK support, enabling developers to extend Navidrome's functionality using WebAssembly-based plugins written in Go, Rust, Python or JavaScript. Plugins run in a secure sandbox and can provide additional metadata sources, custom integrations, and server-side enhancements. Users can now easily configure plugins directly from the UI through a new JSONForms-based configuration interface. A couple of working plugins are already available: - [AudioMuse-AI integration](https://github.com/NeptuneHub/AudioMuse-AI-NV-plugin) - [ListenBrainz Daily Playlist Importer](https://github.com/kgarner7/navidrome-listenbrainz-daily-playlist) - [Discord Rich Presence](https://github.com/navidrome/discord-rich-presence-plugin) For more plugins, keep an eye on the tag [navidrome-plugins](https://github.com/topics/navidrome-plugin) in GitHub. More details and instructions on how to use and manage plugins can be found in our [documentation](https://www.navidrome.org/docs/usage/features/plugins/). New documentation will soon be added with details on how to create new plugins. ##### Metadata Extraction Additionally, this version includes a **pure-Go metadata extractor** built on top of the new `go-taglib` library. This is a significant step toward removing the C++ TagLib dependency, which will simplify cross-platform builds and packaging in future releases. The new extractor is activated by default, but in case of any issues you can revert to the previous implementation by setting `Scanner.Extractor="legacy-taglib"` configuration option. ##### Instant Mix The Instant Mix feature generates a playlist of similar songs based on a selected track. By default, it retrieves similar songs from Last.fm (if configured with an API key) or falls back to Deezer. It can also be configured to use external plugins, like [AudioMuse-AI](https://github.com/NeptuneHub/AudioMuse-AI-NV-plugin) for sonic analysis-based similarity recommendations. ##### New and Changed Configuration Options ###### Plugin System Options | Option | Default | Description | |----------------------|-----------|---------------------------------------------------------------| | `Plugins.Enabled` | `true` | Enable/disable the plugin system | | `Plugins.Folder` | `""` | Path to the plugins directory. Default: `$DataFolder/Plugins` | | `Plugins.CacheSize` | `"200MB"` | Maximum cache size for storing compiled plugin WASM modules | | `Plugins.AutoReload` | `false` | Automatically detect new/changed/removed plugins | | `Plugins.LogLevel` | `""` | Override log level for plugin-related messages | ###### Subsonic API Options | Option | Default | Description | |--------------------------------|---------|--------------------------------------------------------------------------------------------------------------------------------| | `Subsonic.MinimalClients` | `""` | Comma-separated list of clients that receive reduced API responses (useful for resource-constrained devices like smartwatches) | | `Subsonic.EnableAverageRating` | `true` | Include average rating in API responses | ###### Metadata & Matching Options | Option | Default | Description | |------------------------------|---------|----------------------------------------------------------------------------------------------------| | `SimilarSongsMatchThreshold` | `85` | Minimum similarity sc _[Truncated at 4000 characters — full notes: https://github.com/navidrome/navidrome/releases/tag/v0.60.0]_