Releases: Parachord/parachord-mobile
Release list
v0.9.3
Parachord Android 0.9.3
What's new
Action required for Spotify users: Spotify now uses your own free Spotify Developer Client ID instead of a shared one. This gives every user their own Spotify rate-limit budget — the fix for the on-and-off "Spotify results disappeared" / rate-limit problems. It's a one-time setup, and you'll need to reconnect Spotify after updating.
How to Install
Two options:
- Grab the APK directly from the latest release (below) and sideload it. Android 8.0+ (API 26) required.
- Join the Parachord-Testers Google Group and you’ll get automatic updates via Google Play Store as new builds go out.
Reconnect Spotify (one-time, ~2 minutes)
Parachord no longer ships a shared Spotify key. Because Spotify rate-limits per app, every Parachord user was sharing one budget — so heavy use by anyone could rate-limit everyone (this is what caused Spotify tracks to intermittently stop resolving). Using your own free Developer Client ID gives you your own budget, so it just works.
After updating, Spotify will show as disconnected. To reconnect:
- Go to developer.spotify.com/dashboard and Create app (it's free; any name/description).
- In the app's settings, add this Redirect URI exactly:
parachord://auth/callback/spotify - Copy the app's Client ID.
- In Parachord: Settings → Spotify, paste the Client ID → Save Client ID → Connect.
Spotify Premium is still required for playback. Your saved music, playlists, and everything else are untouched — this only affects the Spotify connection.
Also fixed
- Resolver "Status" now reflects the Enabled toggle. A resolver you'd switched off could still read "ENABLED" while it silently wasn't resolving. The status now shows ENABLED, OFF (connected but toggled off), or DISABLED so the two controls can't disagree.
Full changelog: v0.9.2...v0.9.3
v0.9.2
Parachord Android 0.9.2
What's new
A focused fix-up release: if you don't use Apple Music, tracks no longer show a stray Apple Music badge or bounce you to the Apple Music login screen — plus a new one-tap "Report a bug with logs" so problems like that are easy to send in.
How to Install
Two options:
- Grab the APK directly from the latest release (below) and sideload it. Android 8.0+ (API 26) required.
- Join the Parachord-Testers Google Group and you’ll get automatic updates via Google Play Store as new builds go out.
Fixes & improvements
- Apple Music no longer shows up unless you've connected it. If you only use Spotify (or another service), tracks were showing an Apple Music badge and tapping one opened the Apple Music login screen — because Apple Music was resolving through a no-auth lookup even when it was never connected. It's now gated on being connected, like every other service. If a higher-priority service can't find a track, you'll simply see no badge rather than a dead Apple Music one.
- New: "Report a bug with logs." Settings → About → Report a bug with logs collects the app's own diagnostic logs, copies them to your clipboard, and opens a prefilled GitHub issue — just paste and describe what happened. No adb or cables needed, and no account tokens are ever included.
Full changelog: v0.9.1...v0.9.2
v0.9.1
Parachord Android 0.9.1
What's new
The big one, matching desktop: an all-new opt-in sync engine that makes playlists multi-master — edit on any service (or a shared playlist someone else owns) and your change round-trips everywhere, instead of one service always winning. It ships behind a preview-and-accept flow, so you see exactly what it would change before anything is written, and you can switch back anytime. Plus a deep batch of sync fixes that help everyone whether you opt in or not, a redesigned Sync settings screen, ISRC-based matching that keeps scrobbles and shares resolving even during a MusicBrainz outage, and clean handling of Spotify's new 6-month session expiry.
0.9.1 point release: makes the new opt-in sync engine actually reachable for everyone — in 0.9.0 the Settings → Sync → "Use new sync" entry was inadvertently left visible only in developer builds. Everything below is now available to all users.
How to Install
Two options:
- Grab the APK directly from the latest release (below) and sideload it. Android 8.0+ (API 26) required.
- Join the Parachord-Testers Google Group and you’ll get automatic updates via Google Play Store as new builds go out.
New: try the new sync engine (opt-in)
Classic sync treats one service as the source of truth — edits elsewhere get overwritten. The new sync engine treats every copy of a playlist as equal: an edit on Spotify, Apple Music, ListenBrainz, or a collaborative playlist owned by someone else all merge together and propagate to your other services.
It's opt-in and cautious by design:
- Settings → Sync → "Use new sync" → Preview. Parachord runs the new engine against your library without writing anything and shows you the exact diff — every track it would add or remove, per service.
- Nothing changes until you tap Accept. If the preview looks wrong, there's a "Report a problem" button instead.
- Reversible anytime with "Switch back to classic."
- Per device. Each device opts in separately — if you also use Parachord on desktop, switch it too so they stay in lockstep (the preview reminds you).
Highlights it unlocks: collaborative playlists round-trip (your edits to a playlist someone shared with you push back to the original), and playlists you only follow stay mirror-only (read in, never re-created as your own).
Sync got more accurate and more reliable — for everyone
These land regardless of whether you opt into the new engine:
- Stale mirror labels clean themselves up. If a playlist's "mirrored to Spotify / Apple Music" link points at a remote that was deleted on another device, that label is now dropped automatically — and your local playlist is kept untouched.
- Apple Music matches by ISRC in your storefront, so you stop getting duplicate Apple Music entries for the same recording.
- ListenBrainz sync is far gentler on MusicBrainz. Track-ID lookups are paced and bounded per cycle, and un-findable tracks are remembered instead of re-queried every time — no more MusicBrainz flood (or launch crash) on a big library. Large ListenBrainz playlists push reliably now (adds are chunked), and a previously-empty mirror re-fills instead of staying blank.
- Apple Music sync, sturdier. When the Apple Music library token goes stale (the "only some playlists showed up" symptom), you get a clear Reconnect Apple Music prompt instead of silently-incomplete syncs.
Better track matching across the app, via ISRC
Parachord now captures the ISRC (the standard recording ID) from Spotify, your local files (ID3 TSRC), and Apple Music, and uses it where it matters — scrobbling and sharing resolve to the right recording more often, and keep working even when the MusicBrainz mapper is having an outage.
Spotify session expiry, handled cleanly
Spotify is introducing a 6-month limit on sign-ins (effective 2026-07-20). When your session expires, Parachord now cleanly detects it — telling a genuinely-dead grant apart from a temporary outage — clears the expired session, and prompts you to reconnect, instead of silently failing to sync or logging you out over a transient blip. Redundant token refreshes are also collapsed, so a burst of activity doesn't stampede Spotify's auth.
Redesigned Sync settings
Sync now has its own tab with unified provider cards and a status header showing what's connected and what's syncing at a glance. The per-provider "Configure what syncs" picker is unified across Spotify, Apple Music, and ListenBrainz, and stays in lockstep with the per-playlist controls. You can also now opt a ListenBrainz playlist into mirroring to Spotify / Apple Music (off by default).
More ways to import, and self-updating plugins
- Import playlists from more sources. Playlist import is now resolver-driven — paste a link and whichever service handles it just works. New this release: SoundCloud playlists and Spotify editorial / algorithmic playlists (the ones that used to fail).
- Plugins update themselves from the marketplace in the background, so fixes and new services arrive without an app update.
Smaller fixes
- Disable a resolver without disconnecting the account (e.g. stop Spotify from resolving tracks while keeping it connected for metadata).
- Edit local-file tags (title / artist / album) with a built-in editor, plus artwork loading skeletons.
- Weekly playlist header polish ("Weekly Jam" reads singular).
Full changelog: v0.9.0...v0.9.1
v0.9.0
Parachord Android 0.9.0
What's new
The big one, matching desktop: an all-new opt-in sync engine that makes playlists multi-master — edit on any service (or a shared playlist someone else owns) and your change round-trips everywhere, instead of one service always winning. It ships behind a preview-and-accept flow, so you see exactly what it would change before anything is written, and you can switch back anytime. Plus a deep batch of sync fixes that help everyone whether you opt in or not, a redesigned Sync settings screen, ISRC-based matching that keeps scrobbles and shares resolving even during a MusicBrainz outage, and clean handling of Spotify's new 6-month session expiry.
How to Install
Two options:
- Grab the APK directly from the latest release (below) and sideload it. Android 8.0+ (API 26) required.
- Join the Parachord-Testers Google Group and you’ll get automatic updates via Google Play Store as new builds go out.
New: try the new sync engine (opt-in)
Classic sync treats one service as the source of truth — edits elsewhere get overwritten. The new sync engine treats every copy of a playlist as equal: an edit on Spotify, Apple Music, ListenBrainz, or a collaborative playlist owned by someone else all merge together and propagate to your other services.
It's opt-in and cautious by design:
- Settings → Sync → "Use new sync" → Preview. Parachord runs the new engine against your library without writing anything and shows you the exact diff — every track it would add or remove, per service.
- Nothing changes until you tap Accept. If the preview looks wrong, there's a "Report a problem" button instead.
- Reversible anytime with "Switch back to classic."
- Per device. Each device opts in separately — if you also use Parachord on desktop, switch it too so they stay in lockstep (the preview reminds you).
Highlights it unlocks: collaborative playlists round-trip (your edits to a playlist someone shared with you push back to the original), and playlists you only follow stay mirror-only (read in, never re-created as your own).
Sync got more accurate and more reliable — for everyone
These land regardless of whether you opt into the new engine:
- Stale mirror labels clean themselves up. If a playlist's "mirrored to Spotify / Apple Music" link points at a remote that was deleted on another device, that label is now dropped automatically — and your local playlist is kept untouched.
- Apple Music matches by ISRC in your storefront, so you stop getting duplicate Apple Music entries for the same recording.
- ListenBrainz sync is far gentler on MusicBrainz. Track-ID lookups are paced and bounded per cycle, and un-findable tracks are remembered instead of re-queried every time — no more MusicBrainz flood (or launch crash) on a big library. Large ListenBrainz playlists push reliably now (adds are chunked), and a previously-empty mirror re-fills instead of staying blank.
- Apple Music sync, sturdier. When the Apple Music library token goes stale (the "only some playlists showed up" symptom), you get a clear Reconnect Apple Music prompt instead of silently-incomplete syncs.
Better track matching across the app, via ISRC
Parachord now captures the ISRC (the standard recording ID) from Spotify, your local files (ID3 TSRC), and Apple Music, and uses it where it matters — scrobbling and sharing resolve to the right recording more often, and keep working even when the MusicBrainz mapper is having an outage.
Spotify session expiry, handled cleanly
Spotify is introducing a 6-month limit on sign-ins (effective 2026-07-20). When your session expires, Parachord now cleanly detects it — telling a genuinely-dead grant apart from a temporary outage — clears the expired session, and prompts you to reconnect, instead of silently failing to sync or logging you out over a transient blip. Redundant token refreshes are also collapsed, so a burst of activity doesn't stampede Spotify's auth.
Redesigned Sync settings
Sync now has its own tab with unified provider cards and a status header showing what's connected and what's syncing at a glance. The per-provider "Configure what syncs" picker is unified across Spotify, Apple Music, and ListenBrainz, and stays in lockstep with the per-playlist controls. You can also now opt a ListenBrainz playlist into mirroring to Spotify / Apple Music (off by default).
More ways to import, and self-updating plugins
- Import playlists from more sources. Playlist import is now resolver-driven — paste a link and whichever service handles it just works. New this release: SoundCloud playlists and Spotify editorial / algorithmic playlists (the ones that used to fail).
- Plugins update themselves from the marketplace in the background, so fixes and new services arrive without an app update.
Smaller fixes
- Disable a resolver without disconnecting the account (e.g. stop Spotify from resolving tracks while keeping it connected for metadata).
- Edit local-file tags (title / artist / album) with a built-in editor, plus artwork loading skeletons.
- Weekly playlist header polish ("Weekly Jam" reads singular).
Full changelog: v0.8.3...v0.9.0
v0.8.3
What's Changed
- fix(lastfm): guardedGet silently dropped all params (Android + iOS) by @jherskowitz in #183
Full Changelog: v0.8.2...v0.8.3
v0.8.2
What's Changed
- fix(spotify): stop abuse bans from compounding — escalating breaker + kill redundant search by @jherskowitz in #182
Full Changelog: v0.8.1...v0.8.2
v0.8.1
Parachord Android 0.8.1
Six merges since 0.8.0 — sturdier Spotify sync that respects rate limits even on writes, removed tracks that actually stay removed, snappier weekly playlists, and richer ListenBrainz scrobbles. This is also the release where the iOS app's Spotify playback came together on the shared core.
How to Install
Two options:
- Grab the APK directly from the latest release (below) and sideload it. Android 8.0+ (API 26) required.
- Join the Parachord-Testers Google Group and you’ll get automatic updates via Google Play Store as new builds go out.
What's new
Spotify sync got sturdier
When Spotify rate-limits your account, it can hand back a cooldown that lasts up to an hour — and poking it again mid-cooldown just resets the clock. Until now Parachord only backed off on reads; library and playlist writes (saving a track, pushing a playlist, following an artist) ignored the cooldown and could keep an account locked out. Writes now honor the same backoff, so a throttle settles instead of snowballing. Your skip / pause / play taps stay instant — those are deliberately exempt.
Removed tracks stay removed
Remove a track from your collection and it would sometimes creep back on the next sync — because the streaming service still had it, and some services (Apple Music) don't even support removing it via their API. Parachord now records a durable "you removed this on purpose" marker, so the next sync drops the track instead of re-importing it. Re-add it yourself anytime and the marker clears. Markers are per-device and expire after a year.
Weekly playlists load faster
Opening a Weekly Jams / Weekly Exploration playlist used to kick off a streaming-service search for every track at once — which, on a fresh install, could trip Spotify's rate limiter before you'd even scrolled. Now Parachord only resolves the songs actually on screen (plus a little ahead), trickling in more as you scroll. Faster to open, and much gentler on the streaming services.
Richer ListenBrainz scrobbles
Scrobbles sent to ListenBrainz now include where the track played from (the source URL and service name) and its MusicBrainz IDs — so your listening history is better-linked and more useful for stats and recommendations.
Quieter playlist sync
ListenBrainz playlists that haven't changed since the last sync no longer get needlessly re-pushed every cycle — no more spurious "modified just now" timestamps on playlists you didn't touch.
Cross-platform note
The two Spotify fixes here — the write rate-limit gate and visibility-scoped resolution — live in shared/commonMain, so the forthcoming iOS app inherits them for free. This release also lands the iOS side of Spotify Connect playback (device wake, the rate-limit cooldown, auto-advance, and the scrubber) on that same shared core.
Full changelog: v0.8.0...v0.8.1
v0.8.0
Parachord Android 0.8.0
A big Android Auto release — Loved Songs in the car, playlist cover art that actually shows, and now-playing info that stays correct with the screen off. Plus two-way ListenBrainz playlist sync, more reliable Spotify playback, and parachord.com links that open straight in the app.
How to Install
Two options:
- Grab the APK directly from the latest release (below) and sideload it. Android 8.0+ (API 26) required.
- Join the Parachord-Testers Google Group and you’ll get automatic updates via Google Play Store as new builds go out.
What's new
Android Auto, dialed in
This release put a lot of work into the car experience:
- Loved Songs folder. Your collection now shows up as a browsable list in the car — tap any loved song to play it, with the rest queued in order. Sits right next to Collection Radio (which still shuffle-plays everything).
- Playlist cover art. Playlists with locally-generated mosaic covers used to show blank tiles in the car — they now render their artwork.
- Now Playing info stays correct. The track title, artist, and duration on the head-unit card now update reliably during Spotify / Apple Music playback — including the first track and after skips — instead of getting stuck on a placeholder or 0:00.
- Locked-phone playback works. Picking a playlist from the head unit with the phone locked no longer bounces back to the browse list — it plays.
- Queue, browse, and search fixes carried over from earlier in the cycle keep the Up Next view and in-car search consistent.
Sync your playlists to ListenBrainz
Parachord can now two-way sync your playlists with ListenBrainz — pushing your local playlists up and reconciling edits across devices. Pick it from the sync provider screen (shown once you've connected ListenBrainz in Scrobblers). Playlists sync private by default, reconcile in place by MBID (no duplicates), and only push what's actually changed.
Spotify playback got more reliable
- Plays on the right device. Fixes for picking your phone over a stale "phantom" Spotify Connect device (an old TV or speaker that lingers in Spotify's device list), including when you've renamed your phone in Spotify.
- Re-auth, handled gracefully. If your Spotify session expires, you get a clear "reconnect" banner instead of silent failures and retry storms — and the app proactively refreshes tokens before they lapse.
Open parachord.com links in the app
https://parachord.com/<verb> links now route directly into Parachord (Android App Links), so shared links open the app instead of a browser.
Polish
- Search field on the Collection screen no longer clips the bottoms of letters.
- Wikipedia and Achordion icons render correctly on service/source rows.
Full changelog: v0.7.0...v0.8.0
v0.7.0
Parachord Android 0.7.0
10 merges since 0.6.1. Two new gestures on Now Playing, a smarter share-link surface, in-app announcements from the Parachord ops channel, and a handful of invariants + quality fixes that protect your library across devices.
How to Install
Two options:
- Grab the APK directly from the latest release (below) and sideload it. Android 8.0+ (API 26) required.
- Join the Parachord-Testers Google Group and you’ll get automatic updates via Google Play Store as new builds go out.
What's new
Now Playing learned two gestures
- Double-tap to love. Tap twice on the album art to add the track to your collection. A heart pops at the touch point — Instagram-style. Already-loved tracks are silent (no double-tap-to-unlove; use the menu for that).
- Swipe to skip. Drag the album art left for next, right for previous. Slow drag past ~30% commits; a fast flick commits regardless. Doesn't fight Android's edge back-gesture.
Share links go to Achordion
Sharing a track, album, or artist now produces an achordion.xyz/... link instead of a go.parachord.com/... smart-link. Recipients land on the canonical entity page with per-service "Listen on Spotify / Apple Music / SoundCloud" buttons. For tracks specifically, Parachord pre-warms Achordion's cache when you share — so the recipient's first click loads a fully-resolved page, not a placeholder. Playlists still use smart-links for now (no Achordion playlist page yet).
Home-screen announcements
A new banner at the top of the home screen surfaces in-app announcements from Parachord ops — outage notices, launch messages, the occasional Discord nudge. Same feed desktop uses; you'll see whatever's broadcast to all clients. Dismiss with the X and it stays gone.
Local-files library now contributes back to Achordion
If most of your library is local files (no Spotify / Apple Music IDs attached), Parachord now does background lookups to find streaming-service matches over time. When matches turn up, they're sent to Achordion's shared cache — which means the next person who shares a track you've got locally gets a better landing page. Runs idle: only on Wi-Fi, only when the battery isn't low, max 20 tracks per cycle with a 3-second gap. You won't see it; everyone benefits.
Sync resilience across devices
When one client has a sync bug that scrambles a playlist's source (which provider the playlist was originally imported from), the other client now silently fixes it on launch. This used to be desktop-only. With Android implementing the heal too, a single bad write doesn't corrupt your playlists fleet-wide; whichever device launches next undoes the damage. iOS will inherit the same fix when the iOS app lands.
Under the hood
- Apple Music catalog throttle. Large library imports and hosted-XSPF refreshes no longer fan out enough parallel Apple Music API calls to trip Apple's per-token rate limit (which, when tripped, used to kill the active playback alongside the background lookups). Concurrency capped at 3, 150ms between calls, time-bound 5-minute cooldown on rate-limit signals. Recovers automatically.
- Last.fm friend refresh log spam, gone. If you have ~60+ Last.fm friends, the every-2-minute background refresh used to dump dozens of stack traces into logcat per cycle once the per-IP rate-limit gate tripped. Now it logs one debug line and skips the rest of the cycle's Last.fm friends. Net behavior unchanged — those calls were already failing without network hits — just much quieter.
- Resolver direct-ID confidence. When a track has a previously-resolved Spotify / Apple Music / SoundCloud ID cached locally, we now stamp the resolved source at 1.0 confidence (the "by definition correct" tier) instead of 0.95 (the "fuzzy match passed" tier). Unlocks tier-1 Achordion contribution submits the moment a track starts playing, instead of waiting for the scrobble threshold halfway through.
Coming soon
- Universal / App Links —
https://parachord.com/<verb>URLs from share sheets, iMessage, Slack will route directly into the app (no "Open with…" chooser). Paired with iOS Universal Links when the iOS app lands. - iOS app — KMP shared module is feature-complete. iOS launch needs a SwiftUI shell over the same business logic.
- Inbound smart-link resolution — folded into the App Links work.
Cross-platform note
Six of this release's ten commits live in shared/commonMain. iOS will inherit them for free when the iOS shell lands: the sync heal, the slow-trickle Achordion contribution loop, the announcements consumer, the resolver direct-ID confidence change, the Achordion share-link migration, and the Last.fm refresh log-spam fix.
Full Changelog: v0.6.1...v0.7.0
v0.6.1
How to Install
Two options:
- Grab the APK directly from the latest release and sideload it. Android 8.0+ (API 26) required.
- Join the Parachord-Testers Google Group and you’ll get automatic updates via Google Play Store as new builds go out.
What's Changed
- share: migrate track / album / artist sharing to Achordion entity links by @jherskowitz in #141
Full Changelog: v0.6.0...v0.6.1