Releases: rawnaldclark/Stash
Release list
Stash v0.9.100
YouTube playback works again
If tracks have been skipping instantly for the past week — every YouTube-sourced song failing the moment it started — this is the fix.
YouTube put its anti-bot PO Token in front of the client Stash had pinned since June. Once that happened, the extractor stopped being offered the audio-only formats and fell back to a combined 360p video stream whose URL was rejected on open, so every YouTube track died at the player and got skipped. With the lossless sources also unavailable for many tracks, that meant a lot of silence.
Stash now walks a chain of clients instead of trusting one, and — the part that actually matters — verifies a stream can serve its final byte before handing it to the player. A URL that only serves its first megabyte is caught here instead of becoming a skipped track. When one client gets blocked, the next is tried automatically rather than the app going quiet.
Your YouTube audio is also better than it was before the outage. Playback is back on Opus (~160 kbps, audio-only) rather than the combined video stream the broken path had degraded to — better sound, and no more downloading video frames that get thrown away.
One trade-off worth knowing: the first play of a YouTube track now takes noticeably longer to start, because the only client YouTube still allows requires extra work to unlock. Tracks queued behind the current one are prepared in advance, so this mostly shows up on the first tap rather than between songs.
Fewer stalls and duplicate work while streaming
- A track that failed and retried used to be handed the same dead URL again, so the "retry" was never a real second attempt and playback gave up early. It now fetches a fresh one.
- Tapping a track while the next one was being prepared could kick off two full resolutions of the same song at once, doubling the wait and hammering the sources. Those are now shared.
Now Playing tells the truth about what you're hearing
The quality badge was reporting a value from the database rather than the audio actually playing, so a YouTube stream showed "AAC" while genuinely playing Opus, and never showed where it came from. It now reads the real codec and source — OPUS · via YT. A related bug had the player rewriting that badge over a thousand times per track in the background; it now happens once.
Sync and library fixes
- Playlist download choices stick. An old startup migration could quietly re-enable syncing for playlists you'd turned off. (#438)
- The Synced / Off filters now filter everything. The chips only applied to your own playlists — Liked Songs and mixes ignored them, so switching to "Off" still showed rows that were clearly on. (#373)
- "Check for updates" answers you. It ran and then said nothing at all, which looked broken — especially if you were already on the latest version. It now tells you what it found. (#377)
- Albums and artists match multi-artist credits properly, so a track credited to several artists shows up under the right one. (#440)
- Album actions wrap instead of running off the edge of narrower screens. (#441)
- JioSaavn no longer fails silently — when it can't match a track it now says so in the logs, which makes the fallback chain diagnosable instead of invisible.
Thanks to @ParaliyzedEvo for diagnosing the three streaming reliability bugs (stale retry cache, duplicate resolves, and untrustworthy fast-client URLs), @chaudhary-lakshay for the sync-filter and update-check fixes, and @yuriikot2010 for the artist-credit matching and the album-hero layout fix.
Stash v0.9.99
Your playlists, on Home
- Pin any playlist to Home. Long-press a playlist in Library ▸ Playlists and tap Show on Home — it appears in a new Your playlists section at the top of Home, in the order you pinned. Long-press a card on Home for Open / Play All / Remove from Home. Nothing shows until you pin something, so Home is unchanged if you skip it.
- Liked Songs card. Settings ▸ Appearance ▸ Home layout ▸ Show Liked Songs on Home puts one card with your Stash, Spotify and YouTube likes (merged, de-duped) on that same section; tapping it opens Library ▸ Liked. The section itself is draggable and hideable in Home layout like every other section.
Download manager
- Sync ▸ Downloads now opens a full download manager: live queue with per-track progress, cancel on any queued or running item, and a history of recent downloads. Cancelling sticks — a cancelled track stays cancelled across future syncs — and History has a retry button for failed and cancelled downloads. Thanks to @ParaliyzedEvo and @JoshDui (#433, closes #224).
Lossless fixes
- The FLAC upgrade sweep now respects Settings ▸ Audio & Quality ▸ Lossless downloads. With the toggle off, sync no longer builds or drains upgrade batches in the background — and a batch queued just before you switch the toggle off is discarded instead of downloading anyway. Your manual upgrades are untouched: the Library multi-select Upgrade to FLAC and Now Playing's single-track upgrade still work regardless of the toggle. Sync also no longer re-attempts a lossless fetch for tracks it just downloaded moments earlier. Thanks @ParaliyzedEvo (#430).
Under the hood
- One new database migration (adds the playlist pin column). Room migrates in place on first launch; no re-sync needed.
Stash v0.9.98
What's new in v0.9.98
Songs no longer cut off and skip on a network blip
The most-reported playback complaint: a track streaming over mobile data (or spotty Wi-Fi) would randomly cut off mid-song and jump to the next track. The cause: any streaming hiccup — a brief network stall, a dropped connection, an expired stream URL — made the player give up on the track at the first error.
Playback now retries the same track in place, resuming right where it stopped (an expired URL is re-fetched automatically). Only if the track genuinely can't be recovered does it move on, and the existing protection against error cascades is unchanged. Verified on-device: a track interrupted mid-song by a network drop now resumes at the same second once the connection returns, instead of being lost.
Reinstalled? Your downloaded library is recognized, not re-downloaded
If you reinstall Stash (or move to a new phone) with your music stored in an external folder, the first sync now recognizes the files already in that folder and marks them as downloaded — instead of re-downloading gigabytes you already have. Just reconnect your services and pick the same music folder; sync does the rest. This also runs on every sync, so files you copy into your library folder by hand get picked up too. (The manual check remains under Settings → Library & Storage → Library Health → Verify.)
Stale debug switches can no longer break playback
Developer-only source toggles (like "Force Qobuz only") are now ignored on regular installs. Previously, one of these switches enabled long ago — including from a version where it was briefly visible — could silently pin all playback to a single source with no fallback, which for some users meant nothing played at all. The visible "Stream via YouTube" option is unaffected.
Stash v0.9.97
What's new in v0.9.97
Lossless is back on its fastest source
Stash's primary lossless source has been quietly failing — nearly every shared Qobuz account was rejected the moment a track was looked up, so playback kept falling through to slower backup sources (or lossy ones when those missed too).
The accounts were fine. Stash was asking with the wrong credentials: the account pool spans two Qobuz apps, and while the final file request already used each account's own app id, every catalog lookup used a single hardcoded one. A lookup is the first thing that happens on every track, so those accounts failed instantly and got marked dead before the correct path was ever reached.
Fixed, measured against the live pool: 12 of 18 accounts work now, versus 2 before. In practice that means more tracks resolve as true FLAC, faster (direct, no proxy hop), and fewer drop to a fallback.
Stash now recovers from account rotation on its own
Those shared accounts rotate every few weeks, which is why a build's bundled set eventually goes stale. Stash has always been able to fetch a fresh set at runtime — but that self-repair could never actually run: it only triggered when every account had failed, and accounts were retried faster than they could all be ruled out. On a real device it had never fired once.
It now recovers after a run of failures instead, and works its way through the whole account list rather than retrying the same few over and over. A freshly added account is tried first, so a newly published one is picked up on the next track instead of sitting unused.
Together these mean lossless should keep working through a rotation without waiting for an app update.
Stash v0.9.96
What's new in v0.9.96
Better sound when lossless misses: JioSaavn 320 kbps fallback
When a track isn't available from the lossless sources, Stash now tries JioSaavn's 320 kbps AAC before falling back to YouTube — for streaming, downloads, and search downloads. You'll see "via JioSaavn" on the Now Playing quality line when it's serving. Matching is deliberately strict (duration, artist, version checks) so a cover or karaoke version never sneaks in — uncertain matches still go to YouTube. Huge thanks to @ParaliyzedEvo for building this integration (#414, closes #104).
Sync no longer hangs on "Checking your library" (#429)
The library-verification step added in v0.9.95 was checking every downloaded track's file with a separate storage-framework directory walk — on a large external-storage library that meant thousands of slow system calls per sync, and the bar sat frozen at "Checking your library (3/5)". It now scans your library folder once and verifies everything against that in memory: minutes down to seconds.
Also hardened: if Stash ever loses access to your external storage folder (e.g. after the permission grant lapses), verification now leaves your library alone instead of marking every track as missing and re-downloading your whole collection.
"Force direct Qobuz" no longer means silence (#429)
If you had Settings → Audio & Quality → force direct Qobuz enabled while the shared Qobuz path was down, every track spun forever with no fallback. The toggle now falls through to the lossy chain (JioSaavn, then YouTube) like the other source toggles, so a stale toggle can never leave you unable to play music. For real lossless through that path, connect your own Qobuz account in Audio & Quality.
Stash v0.9.95
The biggest release since the redesign — nearly all of it @ParaliyzedEvo's work. Sync gets self-healing library verification, downloads stop going quiet when a lossless source is missing, and the app finally remembers how you left it.
Sync: Verify your library, and a real Playback/Download split (@ParaliyzedEvo)
- Verify library — new card under Settings → Library & Storage → Library Health. It reconciles the download queue against your actual library, checks every "downloaded" track's file really exists on disk (healing stale storage-permission paths after a reinstall instead of re-downloading), adopts files already in your music folder that the app didn't know about, and rebuilds the storage stats. Runs as its own visible sync phase ("Checking your library") at the start of every sync too.
- Playback mode and Download mode are now separate toggles on the Sync tab. Playback = can Now Playing stream tracks you haven't downloaded; Downloads = does Sync Now write real files or just refresh the streaming index. Your current behavior is migrated automatically — if you were in Online mode before, playback streaming stays on.
- FLAC upgrade sweep: after each sync, downloaded lossy tracks are queued for a paced re-attempt through the lossless pipeline. A track is only replaced when a genuine FLAC comes back — a lossy fallback result is discarded and your original file is never touched.
Downloads: no more silent skips (#421)
With lossless downloads on and no lossless source currently available, tracks are deferred, not failed — but the sync used to show "Downloading 0/5", never move, and end without a word. Now the progress bar counts deferrals, the label reads "Downloading 2/5 · 3 waiting for lossless…", and the sync log tells you how many tracks are waiting and how to get them now (connect ARCOD or your own Qobuz in Audio & Quality, or allow the YouTube fallback). "Downloaded X of Y" still only ever counts real files on disk.
The app remembers how you left it (@ParaliyzedEvo)
- Library sort order and source filter survive app restarts.
- Repeat mode survives too — including through the media-button resume after Android kills the background app (that path was missed in the first cut; caught and fixed during device verification).
- The queue sheet header now shows "Playing from …" (Library, Liked Songs, a playlist, an artist, radio) for queues started from the Library.
Also fixed
- Home-feed cards without owner data can no longer be mislabeled as Daily Mixes (hardening on top of v0.9.94's fix).
- FLAC-upgrade batch cancellation now clears the right notification.
Stash v0.9.94
Three fixes, a day after v0.9.93 — two of them from the community. Thank you @chaudhary-lakshay and @ParaliyzedEvo.
Fixed: old Liked Songs jumping to the top of the list (#410)
Liked Songs order was whatever order Spotify's endpoint happened to return — the sync stored the raw fetch index as the playlist position, so a track you saved years ago could land at the top after any sync. The sync now reads the save date Spotify reports for each track and orders the list newest-saved first, the way Spotify itself presents it. If Spotify ever stops reporting save dates, the order falls back to today's behavior rather than scrambling. (Fix by @chaudhary-lakshay.)
Fixed: your own playlists showing up as Daily Mixes on Home (#415 / mix mislabeling)
Home-feed cards that arrive without owner data (some "Jump back in" items, for example) were assumed to be Spotify-editorial mixes and could get swept into the mix rails under a DAILY MIX label. Ambiguous cards are now skipped instead of guessed at — your own playlists stay yours. (Fix by @ParaliyzedEvo.)
Fixed: no way to shuffle just your Liked Songs (#402)
Since the Library redesign, the shuffle icon in the Library header always shuffled the whole library — even while you were looking at the Liked tab. The icon now shuffles what you're looking at: on Library → Liked it shuffles just your liked songs (respecting the origin filter and any search), and everywhere else it keeps shuffling the full library.
Also in this release: dependency updates for the two Cloudflare Worker services (infra/lastfm-proxy, infra/tipjar-worker) clearing all open security advisories. No app-side changes from those.
Stash v0.9.93
Battery: playback no longer pays for effects you have off
The audio pipeline used to run every DSP stage on every buffer even when it was doing nothing — a disabled equalizer still copied the whole stream through itself, sample by sample. Profiling on-device put the pipeline at roughly half a CPU core during playback, with about a third of that burned by the disabled EQ, bass-boost, and preamp stages.
Stages that are off are now dropped from the pipeline entirely:
- EQ off (the default): the equalizer, bass boost, and preamp cost exactly zero while you listen.
- Loudness normalization off too: the whole effects pipeline disappears — playback is just decode and output.
- Effects you do use are unchanged — same math, same sound. Toggling EQ or loudness mid-track still applies seamlessly; the pipeline rebuilds itself in place without a gap.
Also fixed along the way: seeking no longer lets ~2 ms of pre-seek audio bleed into the new position through the limiter's lookahead buffer.
Fixed: deleting a large playlist crashed the app (#380)
With a playlist in the thousands of tracks, Library → long-press → Delete Playlist & Songs could kill the app mid-delete (Couldn't read row N from CursorWindow) and strand the delete half-finished. The same fault could crash the Songs, Albums, and Artists tabs any time the library changed underneath them on a big collection.
Root cause: Android re-runs a query every time a large result set crosses a ~2 MB cursor window, and a delete landing between those re-runs made the rows shift under the reader. Library feeds (TrackDao.getLibraryByDateAdded, getByPlaylist, getAllArtists, getAllAlbums) now read one consistent snapshot per refresh, and the Songs feed fetches only the columns it renders instead of entire track rows. Verified on-device against an 8,000-track playlist delete: the old build died inside 90 seconds; this build runs the full delete clean.
Stash v0.9.92
New app icon, and a crash fix for some Android 15 phones
New look
- Fresh app icon — the vinyl-record mark replaces the old placeholder. (Same great app; just a proper icon now.)
Fixed
- Playback no longer crashes on certain Android 15 custom ROMs. On some AOSP-based ROMs (LineageOS and similar), starting any track could crash the app instantly while it set up the media notification artwork. Stash now hands the system a safe copy of the artwork, so playback works normally. If this was you, this build should fix it — please let us know.
Full commit log below.
Stash v0.9.91
Longer battery, working loudness, and FLAC that stays up
Battery
- Pausing now actually lets your phone rest. Stash used to keep a process running around the clock after you paused — quietly draining the battery in your pocket. It now shuts itself down a few minutes after you stop, so idle Stash costs nothing. (The paused media notification disappearing after a few minutes is this working as intended.)
- Smaller drains fixed too: the Now Playing radar animation no longer runs when it isn't on screen, offline Last.fm scrobbling backs off instead of hammering a dead network, and the app no longer warms up YouTube tooling on launches that never need it.
Volume matching (loudness)
- Track-to-track volume leveling was silently broken and is now fixed. Every downloaded track had been measured wrong, so leveling did almost nothing. Downloads are now measured correctly, and your existing library re-measures itself in the background while charging — so volume matching quietly gets better over the next couple of nights on the charger.
Lossless / FLAC
- FLAC connections stop dropping out. A session-handling bug could silently disconnect your lossless source and make it look "down" when it wasn't; the app now holds its own session reliably and no longer logs you out on a temporary network blip.
- New: if the main FLAC source stops responding, Home now offers a one-tap way to connect ARCOD (a free second lossless source) so hi-res keeps working.
Full commit log below.