Stash v0.9.12 build 50 (Spotify + YouTube Music client)
Requirements: 8.0+
Overview: Stash is an offline-first Android music player that syncs your liked songs, playlists, daily mixes, and discover mixes from both Spotify and YouTube Music into a single unified local library. Tracks are downloaded as high-quality FLAC audio.
Your Spotify + YouTube Music library, offline in FLAC for free.
Stash is an offline-first Android music player that syncs your liked songs, playlists, daily mixes, and discover mixes from both Spotify and YouTube Music into a single unified local library. Tracks are downloaded as high-quality FLAC audio.
Stash is not an online streaming service. It’s a personal-library tool for people who already have Spotify or YouTube Music accounts and want their library available offline on their terms. Studio quality tracks, they’re yours to keep.
Features
Offline everything — tracks download as high-quality lossless audio
Bulletproof matching — finds the right version of tracks 99% of the time
Custom playlists — create your own playlists and save tracks to them from anywhere.
Spotify & YT sync preferences — choose exactly which playlists, liked songs, daily mixes, and discovery mixes to sync. Individual toggles for each. Don’t want Daily Mix 3? Turn it off.
Expanded Spotify mix detection — Release Radar, Discover Weekly, On Repeat, Daylist, Repeat Rewind, Time Capsule, and Daily Mixes 1-6 are all automatically detected when available. Each gets its own toggle.
Refresh vs Accumulate sync modes — mixes can either replace their contents each sync (Refresh) or stack new tracks on top of what’s already there (Accumulate). Your call.
Parallel downloads — 8 simultaneous tracks. Background sync runs as a foreground service so it actually finishes with the phone locked.
High-res album art
Automatic update notifications — checks GitHub for new releases daily and notifies you when one is available.
Full equalizer — 5-band EQ with presets, bass boost, and virtualizer
Spotify sign-in built in — just log into Spotify inside the app
Private by design — credentials encrypted with AES-256-GCM, no servers, no telemetry, nothing leaves your phone
Free and open source — no subscriptions, no ads, GPL-3.0
★ Untouched apk with Original Hash Signature
★ Certificate MD5 digest: 51572c31db0cf8ec5d499a5da790aebf
★ No changes were applied
➡ Languages: Full Multi Languages
➡ CPU architectures: arm64-v8a, armeabi-v7a, x86, x86_64
➡ Screen DPIs: 160dpi, 240dpi, 320dpi, 480dpi, 640dpi
What’s New:
feat: 0.9.12 — lossless-first search-tab preview and download
Search-tab preview and download (artist profile, search results, album
discovery) now route through the v0.9.10 lossless registry first, with
ExoPlayer’s SimpleCache acting as a shared byte buffer between the two.
Tap Preview → bytes stream from Qobuz CDN (squid.wtf or kennyy.com.br)
through the cache to the player. Tap Download right after → the cache
is filled to completion (any missing ranges fetched fresh) and the
file is finalised into the library. No duplicate network fetch.
Lossless-first preview + download
A new SearchPreviewMediaSource builds an ExoPlayer MediaSource that
tries the lossless registry first. If a Qobuz match clears the
search-tab confidence threshold (0.65, vs sync’s 0.5 — search results
lack ISRC and reliable duration so we want tighter title+artist
agreement), the source plays from a CacheDataSource over the Qobuz
signed URL. On miss, falls through to the existing PreviewUrlExtractor
(InnerTube fast path → yt-dlp slow path) — same fall-through chain as
before, just routed through the same cache so subsequent download
finalises don’t re-fetch.
A new SearchDownloadCoordinator replaces the direct DownloadExecutor
call inside TrackActionsDelegate.downloadTrack. It re-resolves the
registry on tap (signed URLs are time-limited; we don’t reuse the
prefetcher’s cached match), reads through CacheDataSource into a temp
file, hands off to TrackFinalizer for embed/commit/probe, runs
search-specific DB writes (insert/update Track row, link to “Your
Downloads” playlist for orphan-cleanup protection). On lossless miss
or low confidence, falls through to yt-dlp with a typed
SearchDownloadStatus.Downloading(YOUTUBE) event that surfaces a
“Downloading via YouTube (slower)” snackbar.
Stream-while-cache + visible-row prefetch
The preview cache is a 200MB LRU SimpleCache rooted at
/preview_cache/. Cache keys are namespaced (lossless: vs
ytdlp:) so the same trackId can hold both codec variants without
collision. A visible-row LosslessUrlPrefetcher fires a registry.resolve
in the background as rows enter the viewport, with 4 concurrent calls
in flight (matches kennyy.com.br’s burst-of-4 budget) and a 5-min TTL
on cached matches (Qobuz signed URLs expire). Stale entries are pruned
every 60s by a loop in StashApplication.onCreate.
Sync refactor
DownloadManager.tryLosslessDownload was refactored to share its
file-side finalisation logic (metadata embed, library file commit,
audio probe) with the new search-tab path via a new TrackFinalizer.
Sync’s DB writes stay in DownloadManager — TrackFinalizer is
deliberately stateless w.r.t. the DB so sync continues to preserve its
spotifyUri / isrc / album / explicit fields verbatim. No behavioural
change for sync; same speed, same correctness.
Bug fixed mid-release
The launch-day build had a URL-pollution bug: the preview MediaItem
was being built with ?trackKey=lossless:videoId appended to the
upstream URL. Qobuz signed URLs are HMAC-authenticated against the
exact query string, so the appended param invalidated the signature
and every byte fetch returned 403. ExoPlayer’s default 3-retry
exponential backoff turned that into “preview takes forever” in the
user’s experience. Fixed by switching to MediaItem.Builder
.setCustomCacheKey() (which propagates to DataSpec.key without
touching the URL) and tuning the LoadErrorHandlingPolicy to fail-fast
(1 retry) so any future transient outage routes to the yt-dlp retry
path within ~10s instead of 30-90s.
Out of scope
No UI changes — same buttons, same screens, same flow. No re-download
on quality-tier change for tracks downloaded via search (forward-only,
matches v0.9.11 semantics). No filter-chip UI or batch “Download
album” button. Preview latency on uncached tracks remains a follow-up
target for v0.9.13.
Bumps versionCode 48 → 50 (49 was the original ship; 50 included the
mid-release URL-pollution fix), versionName 0.9.11 → 0.9.12.
This app has no advertisements
More Info:https://github.com/rawnaldclark/Stash
Download Instructions:
https://ouo.io/w75XRqJ
Mirrors:
https://ouo.io/b5Z96wE … 2.apk.html
https://ouo.io/fUE6ky