@ -3413,6 +3413,10 @@ function closeHelperSearch() {
// projects that span multiple commits before shipping. Strip the flag at
// release time and add a real `date:` line at the top of the version block.
constWHATS_NEW={
'2.5.6':[
{date:'May 18, 2026 — 2.5.6 release'},
{title:'MusicBrainz as Primary Metadata Source',desc:'MusicBrainz is now a full primary metadata source on equal footing with Deezer, iTunes, Spotify, and Discogs. switch to it in Settings → Metadata Source — always available, no account or API key needed, rate-limited to 1 req/sec. covers all primary source flows: search, album/track/artist lookup, watchlist scans, discover hero, similar artist backfill, artist map.',page:'settings'},
],
'2.5.5':[
{date:'May 17, 2026 — 2.5.5 release'},
{title:'Manual Library Match',desc:'stop SoulSync from re-downloading tracks it already has. new centralized tool (Tools page → Manual Library Match, or Sync page → Library Match button) lets you search your wishlist / sync history on the left and your library on the right, then link them. once matched, that source track is permanently skipped in wishlist cleanup and the download analysis loop — even when force download is on. manage all your matches in one place with remove support.',page:'tools'},
// usage_note?: 'optional hint shown at the bottom' }
constVERSION_MODAL_SECTIONS=[
{
title:"MusicBrainz Is Now a First-Class Metadata Source",
description:"MusicBrainz was already available as an optional search tab, but it wasn't selectable as your primary metadata source. now it is — switch to it in Settings → Metadata Source and the whole app routes through it.",
features:[
"• always available — no account, no API key, no token needed",
"• rate-limited to 1 req/sec at the client layer, consistent with MusicBrainz's terms",
"• covers the full primary-source interface: search, album/track/artist lookup, top tracks, artist albums, discography",
"• watchlist scanner now backfills MusicBrainz artist IDs alongside Spotify / iTunes / Deezer in the similar artists table",
"• discover hero, artist map, and personalized playlists all source from MusicBrainz IDs when it's the active primary",
"• cover art served via Cover Art Archive — no extra API calls, browser fetches the URL directly",
"• fallback source logic in Settings and the registry now reads from source priority order instead of hardcoding 'deezer'",
description:"github issue #607: live recordings were quarantining as 'Version mismatch: expected ... (live) but file is ... (original)' because MusicBrainz often stores live recordings with bare titles — venue annotations live on the release entity, not the recording entity itself. AcoustID's fingerprint correctly identified the live recording, but the title-text comparison flagged it as wrong.",
title:"Earlier in v2.4 — Reorganize, Search, Sync polish",
description:"highlights from the 2.4.0 cycle that landed before this patch.",
features:[
"• reorganize is now a queue with a live status panel — spam-click all you want, items run one at a time and you can keep browsing",
"• search page got a row of source icons above the bar — typing only searches the active source instead of fanning out to all of them",
"• per-query source cache + cache dots — switching back to a source you already searched is instant",
"• fix: \"maduk — leave a light on\" on tidal was downloading tom walker\'s song of the same name with maduk\'s metadata embedded — tightened the candidate artist gate and acoustid verification",
"• tidal: rejects silent quality downgrades (320kbps when you asked for hires)",
"• spotify: bumped post-ban cooldown from 5 to 30 minutes — first call after a ban was getting re-banned within seconds",
],
},
{
title:"Reorganize Queue Polish",
description:"cleaned up some race conditions in the queue. behavior is solid now.",
features:[
"• worker pick + status flip is atomic now — cancel can\'t land between them and let a cancelled item still run",
"• swapped lock + wakeup-event for a single threading.Condition — newly-queued items don\'t sleep up to 60s anymore",
"• bulk enqueue dedupes within a single batch (was only deduping against pre-existing items)",
"• reorganize-preview Apply button no longer gets stuck disabled on errors",
"• db helpers let exceptions bubble instead of swallowing them as \"album not found\"",
],
},
{
title:"Reorganize Queue with Live Status Panel",
description:"reorganize is now a queue with a live status panel. spam-click all you want — items run one at a time and you can keep browsing.",
features:[
"• per-album reorganize and reorganize all both enqueue into a single backend queue",
"• buttons stay clickable — clicking the same album twice silently dedupes",
"• status panel shows active progress, queued count, and recent finishes",
"• expand the panel for the full queue + per-item cancel buttons (running items can\'t be cancelled mid-flight)",
"• cross-artist items get tagged so you know what\'s queued from where",
"• continue-on-failure: one bad album never stalls the queue",
"• reorganize all is now one backend call instead of N js-driven calls — way faster",
description:"searching for a track could silently download a completely different artist\'s song with the same name. fixed at two layers.",
features:[
"• example: \"maduk — leave a light on\" on tidal was downloading tom walker\'s song of the same name with maduk\'s metadata embedded",
"• tightened the candidate artist gate (was letting through 0.4 similarity, now blocks at 0.5)",
"• acoustid verification now FAILs (quarantines) clear artist mismatches instead of accepting them",
"• ambiguous matches (covers, collabs) still get the benefit of the doubt — only obvious mismatches get blocked",
],
},
{
title:"Tidal Search Falls Back on Long Queries",
description:"tidal\'s search chokes on long remix-credit queries. now retries with shorter variants when the original returns 0 results.",
features:[
"• example: \"maduk transformations remixed fire away fred v remix\" returned 0 — falls back to shorter queries until tidal finds the track",
"• up to 4 shortened variants tried, capped at 5 total requests",
"• qualifier-safe: live/remix/acoustic searches only accept fallback results that keep the qualifier",
"• returns empty if no variant preserves the qualifiers — same as before",
],
},
{
title:"Manual Discovery Fixes Persist Across Restart",
description:"manual discovery fixes are now saved under your active metadata source instead of always \"spotify\" — so deezer / itunes / discogs / hydrabase users\' fixes survive restart.",
features:[
"• affects tidal, deezer, spotify public, youtube, and discovery pool manual fixes",
"• matches how the auto-discovery worker already saved",
"• spotify-primary users unaffected (hardcoded value matched their source)",
],
},
{
title:"Watchlist Content Filters Fixed",
description:"global override and live-version detection now behave the way the ui implies.",