Release date: 2026-10-30
A faster, steadier Parachord. The pinwheel and the freezes many of you hit are fixed: the app no longer rewrites one big file on every save, pages only redraw when their own content changes, and big local libraries (especially on spinning hard drives) no longer lock the window. Plus Discord Rich Presence, Amazon Music playlists of any length, Bandcamp links that point at the right song, and covers that come back when a cached image goes dead.
Speed and freezes
- No more pinwheel on save. Parachord kept its caches and playlists in one settings file and rewrote the whole thing on every save, which locked the app for a moment each time. Big caches and playlists now live in their own files. Your data moves over automatically on first launch.
- Pages redraw only when their own content changes. Collection, Home, playlists, artist pages and Search used to redraw on every change anywhere in the app, such as a track resolving in the background. The Songs list in Collection is no longer rebuilt on each redraw either, which mattered for libraries in the tens of thousands.
- Local libraries on slow disks. Checking your music folder for changes held up the app while it worked, and on Windows that froze the whole window. The app also re-read the whole folder every time its window lost and regained focus. It now works in the background in small steps, and only switches to its slower background check after two minutes away.
- Big local libraries load faster. Artwork checks run in one batch, a changed file updates just that row instead of reloading the whole library, and the five-minute background check only reloads when something actually changed. Artwork lookup now runs for libraries over 10,000 tracks too, one album at a time, where it used to be skipped.
- Album and artist pages no longer wait behind a background job. Filling in missing album track counts used to compete with the pages you open for MusicBrainz lookups (one per second), and it started over at every launch. It now runs in the background lane, saves in batches, and remembers albums MusicBrainz doesn't have.
- Concerts and Fresh Drops open from what they found last time, then update in the background. Right after launch, both used to start from scratch: Concerts showed its loading state and fetched everything again, and Fresh Drops ran its full MusicBrainz scan at every start. Saved results that had gone stale were also never refreshed until you pressed refresh. Concerts also refreshes faster, because each concert service (SeatGeek, Ticketmaster and the rest) now has its own queue instead of waiting behind the others, and Fresh Drops no longer looks up every one of your artists on MusicBrainz again at each launch.
- When MusicBrainz is down, Parachord says so. Opening an album during a MusicBrainz outage used to jump to the artist's page with "Network error - please check your internet connection", even though your connection was fine. Now the album page stays open, says MusicBrainz couldn't be reached (or is busy), and offers Try Again. Parachord also waits properly between retries instead of firing them back to back, and no longer repeats the same lookup up to nine times.
- Albums open even when MusicBrainz can't help. When MusicBrainz is down or doesn't know an album, Parachord now gets the track list from Apple Music's public catalog (no account needed), Spotify, Amazon Music, Bandcamp, your own local files or your Subsonic server, and the album page says where it came from. If MusicBrainz is just slow, the album shows that track list after a few seconds instead of waiting, and MusicBrainz's list takes over once it arrives. Search also shows albums from these during an outage. Albums found on Spotify or Apple Music in search, and some albums on artist pages, used to never open at all; they do now.
- Albums opened from the playbar or your Collection keep their cover while they load, and open faster when you've just queued them.
- Artist bios load even when MusicBrainz is down. Parachord used to find an artist's Wikipedia article through MusicBrainz, so during an outage the Biography tab spun and then came up empty. It now asks Wikidata directly. A bio the player has already loaded also opens instantly on the artist page instead of being fetched again. And when a Wikipedia article opens with just a sentence or two, the bio now includes the article's history, without its member lists, discography or reference sections.
- Amazon Music playback no longer churns the UI. Small bitrate changes during a track were re-rendering the app every few seconds.
- Amazon Music searches are much faster. Every Amazon search used to load a full page of Amazon's web player, one at a time, so resolving a playlist paid that cost for every track. Parachord now reuses the search request Amazon's page already made, and runs several at once, so a burst of searches shares a single page load. Resolving a playlist, opening albums and finding artist photos on Amazon all speed up.
Discord Rich Presence
Turn it on in Settings → General → Discord Presence and your Discord profile shows what you're listening to: title, artist, album, the cover, and a progress bar. It only shows while a track is playing, and covers are only sent when Discord can fetch them publicly. A cover from a server that puts a password or token in its address (Plex, Subsonic) is never sent; you get the Parachord logo instead.
Amazon Music
- Playlists of any length. Imports used to stop at the first 100 tracks; a 977-track playlist now comes in whole. Tracks Amazon has delisted are skipped, and the count shows the difference.
- Share links work, including
music.amazon.com/user-playlists/…links for playlists you made yourself. - Better search. Search reads Amazon's own search results instead of scraping the page, and tries both word orders, so songs Amazon only finds with the artist first (or only with the title first) now resolve.
- Clean titles. Amazon puts "[Explicit]" inside track titles. It's removed now, so those tracks match other services and scrobble under their real name.
- The version you asked for. When Amazon listed a live cut, remix or karaoke version above the original, that's what played. Parachord now picks the exact track first, and only falls back to another version of it when that's all Amazon has.
- Your OS shows the right track. During Amazon playback, Control Center on macOS and the media flyout on Windows showed "Amazon Music" instead of the song, and media keys could pause Amazon's player behind Parachord's back. Both are fixed. On Linux there's now one media player entry instead of two.
Playback and matching
- Bandcamp links point at the song you're playing. Bandcamp's search ranks covers, fan remixes and live versions alongside the original, and Parachord often took the first one: the Buy button could send you to a cover by someone else. Parachord now prefers the exact track, skips other versions unless you asked for one, and the Buy button won't link to them.
- Same recording, same match. When a result has the same ISRC or MusicBrainz recording ID as the track you asked for, Parachord treats it as an exact match, even when the service spells the title or artist differently.
- Releases in non-Latin scripts. On a Cyrillic, Chinese, Japanese or Arabic release, every track got the same internal id, so they all showed as playing and could play the wrong song. Each track is distinct now.
- Deleted local files. A track whose file is gone now plays from another service if it can, or says the file wasn't found, instead of claiming the file "could not be decoded".
- Hi-res audio. When a local file failed to play, the error told you to downsample hi-res FLAC or WAV. That advice was wrong: they play fine. It's gone.
Local files
- Remove Missing Files. In Settings → Local Files, or from a track's right-click menu, you can remove files that are no longer on disk. A folder that can't be read (an unplugged drive, an offline share) is skipped and named, never treated as empty.
- Library-only tracks in the Collection's Songs tab offered "Remove from Collection" and then failed. They now offer Show in Finder/Folder instead.
Album art
- Dead covers come back. When a cached cover image stops loading, Parachord looks it up again instead of showing a blank square. This covers album pages, Fresh Drops, Pop of the Tops and Critical Darlings.
- Critical Darlings and charts find covers for albums MusicBrainz doesn't know, by asking your services, iTunes and Deezer.
- Fresh Drops checks that a cover exists before using it, instead of remembering a guessed address for 90 days.
- Loading skeletons on Recommendations, and Critical Darlings' placeholders are now the same size as the cards that replace them.
- Amazon Music and Subsonic logos in plugin settings and on track badges.
Artist pages
- Discogs biographies read properly. Bios from Discogs showed their raw markup: band members as
[a17632854]and headings wrapped in[b]tags. Members, labels and releases now appear by name, and bold, italic, underline and links display as formatting. - Artist photos without a Spotify or Apple Music sign-in. Artist photos on Home, Recommendations, Search, friends and in chat only came from Spotify or Apple Music, so without either you saw placeholders. Parachord now also asks your other services that have artist photos (Amazon Music among them), Deezer, Wikipedia and Discogs.
Recommendations and sharing
- Recommendations are recommendations. When ListenBrainz hadn't made you a recommendation playlist yet (common for new accounts), the Recommendations page showed your own most-played tracks instead. Now it shows Last.fm's picks if you've connected it, or says that ListenBrainz needs a few weeks of listens first.
- Last.fm friends who hide their listening. A friend whose Last.fm profile hides recent listening looked broken: their card went quietly stale, and their Recent tab said it failed to load. Parachord now says they've hidden it.
- Copy Link works for playlists. Share → Copy Link on a playlist, and Copy link from a playlist's right-click menu, always said to sync the playlist to ListenBrainz first, even when it was. Synced playlists now copy their link.
Settings
- Local Server Port (Settings → General). Spotify and SoundCloud sign-in, and the
parachord://bridge used by Raycast, listen on port 8888. If something else on your computer already uses it, you can now pick another port (it takes effect after a restart), and Parachord tells you when it couldn't start on the one you chose. SoundCloud only accepts 8888 unless you use your own SoundCloud app credentials.
Shuffleupagus
- ChatGPT works with GPT-5 and the o-series, and the Home page's Refresh button works with ChatGPT and Gemini again. A Refresh that fails now says so instead of quietly keeping the old suggestions.
- Artists Shuffleupagus recommends in chat show their photos. Artist cards in the chat only had a photo if Parachord had already loaded that artist's picture somewhere else; the rest showed a placeholder.
Under the hood
- Electron 44 (castlabs, up from 39) and current versions of the app's dependencies.
- Two errors at startup fixed.
- ListenBrainz listens now record which Parachord version sent them (e.g. "0.9.10 (desktop)"), so a listen from the desktop app can be told apart from one sent by Parachord on your phone.
- Removed leftover code: the old Qobuz integration, an unused location lookup, and a Spotify permission Parachord never used.
- A large internal reorganization: the main process is split into modules, the interface is split into components, and plugins are generated from source in CI.
Thanks
@theli-ua did a large share of this release again: Discord Rich Presence, Amazon Music playlist pagination, search and title cleanup, the OS now-playing fix for Amazon, the fix for non-Latin releases, the Electron update, and most of the internal reorganization. Thank you. Thanks also to @jphastings, whose Plex work is where the ISRC matching came from.
What's Changed
Browser Extension
- Docs cleanup: delete obsolete docs, fold specs into docs/architecture, fix stale facts by @jherskowitz in #1112
Resolvers & Playback
- Amazon playlist import: /user-playlists URLs + full pagination via pageInfo.token by @theli-ua in #1072
- Amazon search: gql replay instead of DOM scrape by @theli-ua in #1074
- Guard ChatGPT against empty-tools and GPT-5 temperature 400s; toast a failed Home refresh by @jherskowitz in #1095
- fix(bandcamp): stop matching covers, remixes and live cuts as the track by @jherskowitz in #1115
Sync & Scrobbling
- refactor(app): consume the canonical confidence module; kill the inline copies by @theli-ua in #1051
- fix: two startup errors (renderer module.exports, tombstone prune TDZ) by @jherskowitz in #1066
- Split CLAUDE.md: lean always-loaded guide + docs/architecture topic files by @jherskowitz in #1110
- feat(scoring): identity tier for ISRC / recording-MBID matches by @jherskowitz in #1138
Bug Fixes
- fix(fresh-drops): verify cover art and run the fallbacks instead of guessing a CAA URL by @jherskowitz in #1042
- fix(test): url-safety single-source guard reads the source, not the bundle by @theli-ua in #1057
- Stop telling users to downsample hi-res FLAC and WAV by @jherskowitz in #1076
- Unicode-aware track ids: non-Latin releases no longer collapse to one id by @theli-ua in #1079
- Configurable local server port (Spotify/SoundCloud sign-in + parachord:// bridge) by @jherskowitz in #1082
- Drop local-file sources whose file has left the library by @jherskowitz in #1083
- Remove missing local files on request; fix library-only track actions by @jherskowitz in #1085
- Cut recurring console errors: Spotify pause, listening context, friend poll by @jherskowitz in #1097
- Retry the art pipeline when a cached cover URL is dead by @jherskowitz in #1101
- Retry dead cached covers in Fresh Drops, Pop of the Tops and Critical Darlings by @jherskowitz in #1102
- Look up art for Critical Darlings and charts albums MusicBrainz doesn't know by @jherskowitz in #1103
- Loading skeletons: Recommendations artists, Critical Darlings sized to the cards by @jherskowitz in #1104
- Retry missing Critical Darlings covers when picks are restored from cache by @jherskowitz in #1105
- fix(amazonmusic): robust song search — OR both phrase orders, strip in-title [Explicit] marker by @theli-ua in #1113
- fix(collection): album track-count backfill on the background lane, batched, misses remembered by @jherskowitz in #1118
- fix(local-files): non-blocking scan, and keep watchers through short focus changes by @jherskowitz in #1119
- fix(share): Copy Link works for ListenBrainz-synced playlists by @jherskowitz in #1120
- fix(amazonmusic): prefer the exact track over live, remix and karaoke versions by @jherskowitz in #1122
- fix(recommendations): don't show the user's own top tracks as recommendations by @jherskowitz in #1121
- fix(discovery): Concerts and Fresh Drops show their cache first, then refresh by @jherskowitz in #1123
- fix(bio): render Discogs profile markup and resolve id references by @jherskowitz in #1124
- fix(scrobbling): send the real app version in ListenBrainz submission_client_version by @jherskowitz in #1126
- fix(cache): restore concerts and Fresh Drops' artist IDs at startup; one concerts limiter per service by @jherskowitz in #1127
- fix(musicbrainz): handle outages without blaming the user's connection by @jherskowitz in #1128
- fix(artist-bio): load the Wikipedia bio without MusicBrainz; share bios between playbar and artist page by @jherskowitz in #1133
- fix(artist-bio): Wikipedia bio is the lead plus the prose sections by @jherskowitz in #1134
- fix(chat): Shuffleupagus artist cards get their photos by @jherskowitz in #1139
- fix(friends): say when a Last.fm friend hides their recent listening by @jherskowitz in #1140
- fix(artist-images): photos without a Spotify or Apple Music sign-in by @jherskowitz in #1141
- fix(album-page): keep the cover while an album opens, and open it faster by @jherskowitz in #1146
- fix(menus): title-case Copy Link like the other menu items by @jherskowitz in #1147
- fix(hooks): make the []-dep volume dispatch paths live to Settings offsets changes by @theli-ua in #1142
- fix(renderer): restore the usePlaybackQueue require dropped by #1143 by @theli-ua in #1155
Other Changes
- ui: Amazon Music and Subsonic logos in plugin settings and track badges by @jherskowitz in #1041
- refactor(main): extract store IPC to main-process/ipc/store.js by @theli-ua in #1043
- refactor(main): extract MusicKit IPC to main-process/ipc/musickit.js by @theli-ua in #1044
- refactor(main): extract Local Files IPC to main-process/ipc/local-files.js by @theli-ua in #1045
- refactor(main): extract sync create gateway + durable link map by @theli-ua in #1047
- refactor(main): extract the inbound sync engine to main-process/ipc/sync-start.js by @theli-ua in #1048
- refactor(main): extract the remaining sync IPC to main-process/ipc/sync-playlists.js by @theli-ua in #1049
- refactor(app): extract URL/protocol helpers to protocol-url.js by @theli-ua in #1050
- docs: build-from-source docs for the bundled renderer, generated plugins and castlabs Electron by @jherskowitz in #1063
- refactor(components): extract the UI atoms to src/renderer/components/ui-atoms.js by @theli-ua in #1058
- refactor(components): extract the card family to src/renderer/components/cards.js by @theli-ua in #1061
- refactor(components): extract the settings cards to settings-cards.js by @theli-ua in #1062
- Amazon playlists: dashed-uuid ids + raw-edge pagination progress (testable loop) by @theli-ua in #1073
- CLAUDE.md: Spotify plays through Connect only by @jherskowitz in #1078
- Memoize the Collection → Songs list instead of rebuilding it every render by @jherskowitz in #1086
- Move the Collection page into a React.memo'd module fed stable props by @jherskowitz in #1087
- Move the Home page into a React.memo'd module fed stable props by @jherskowitz in #1088
- Move the playlist view into a React.memo'd module fed stable props by @jherskowitz in #1089
- Move the artist page into a React.memo'd module fed stable props by @jherskowitz in #1090
- Move the Search page into a React.memo'd module fed stable props by @jherskowitz in #1091
- Embedded web players: own the OS media surface (hijack + now-playing mirror + Linux MPRIS kill) by @theli-ua in #1092
- Local library load: batch the art checks; poll reports only real changes by @jherskowitz in #1093
- Large local libraries: incremental library updates, per-album artwork pass by @jherskowitz in #1094
- Keep big persisted keys out of config.json (pinwheel fix) by @jherskowitz in #1096
- Stop Amazon's VBR bitrate re-creating currentTrack every poll by @jherskowitz in #1100
- CLAUDE.md: document the drift test's second job by @jherskowitz in #1109
- Remove dead Qobuz code, the HTTP location fallback and the unused streaming scope by @jherskowitz in #1111
- feat(albums): load track lists from the plugins when MusicBrainz can't by @jherskowitz in #1129
- feat(albums): show the catalog track list while MusicBrainz is slow by @jherskowitz in #1132
- feat(amazonmusic): gql capture diagnostic for album search by @jherskowitz in #1130
- refactor(resolvers): route HTML5 stream resolvers by capability, not by name by @jherskowitz in #1136
- docs: npm 10 lock-regeneration rule (with the failing npm ci run as evidence) by @theli-ua in #1116
- build(hooks): extract the volume domain to src/renderer/hooks (Track 2b slice 1) by @theli-ua in #1137
- feat(amazonmusic): album search for the album-page catalog fallback by @theli-ua in #1135
- feat(applemusic): search albums in Apple's catalog before iTunes by @jherskowitz in #1148
- build(hooks): extract the playback-queue domain to src/renderer/hooks (Track 2b slice 2) by @theli-ua in #1143
- feat(amazonmusic): artist photos via the artists tab of the spec search by @theli-ua in #1149
- docs(amazon-music): parity line names the generated fallback module by @jherskowitz in #1153
- perf(amazonmusic): replay-first spec-search templates, parallel gql replays by @theli-ua in #1152
- docs(readme): subscriptions and copy protection by @jherskowitz in #1157
- docs(readme): copy-protection section covers the service's web endpoints by @jherskowitz in #1159
Full Changelog: v0.9.9...v0.9.10