# Stash Spotify + YouTube Music Downloader

*Published:* 2026-07-25
*Author:* Farzan

.bfa-app-spotlight-block {
  --bfa-canvas:       #FFFFFF;
  --bfa-paper:        rgba(46, 74, 71, 0.04);
  --bfa-paper-cool:   #FAFAF7;
  --bfa-ink:          #0E1A1A;
  --bfa-ink-soft:     #4B5C5B;
  --bfa-ink-subtle:   #728483;
  --bfa-line:         rgba(46, 74, 71, 0.12);
  --bfa-line-soft:    #EFE7D8;
  --bfa-line-cool:    #D8E5E3;
  --bfa-accent:       #1F3837;
  --bfa-accent-mid:   #44706E;
  --bfa-accent-soft:  #7FA39F;
  --bfa-accent-deep:  #15292A;
  --bfa-success:      #047857;
  --bfa-success-mid:  #10B981;
  --bfa-success-soft: #ECFDF5;
  --bfa-warn:         #B91C1C;
  --bfa-warn-mid:     #DC2626;
  --bfa-warn-soft:    #FEF2F2;
  --bfa-font-display: "Fraunces", Georgia, "Times New Roman", serif;
  --bfa-font-body:    "Source Serif 4", Georgia, "Times New Roman", serif;
  --bfa-font-chrome:  "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
  --bfa-font-mono:    "JetBrains Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
  --bfa-ease:         cubic-bezier(.22, .85, .18, 1);
  --bfa-dur-quick:    250ms;
  --bfa-dur-smooth:   600ms;
  position: relative;
  margin: 32px 0;
  container-type: inline-size;
  container-name: bfa-app-spotlight;
  font-family: var(--bfa-font-body);
  color: var(--bfa-ink);
}
.bfa-app-spotlight-block,
.bfa-app-spotlight-block *,
.bfa-app-spotlight-block *::before,
.bfa-app-spotlight-block *::after { box-sizing: border-box; }
.bfa-app-spotlight-block .bfa-app-spotlight-inner {
  position: relative;
  background: linear-gradient(180deg, color-mix(in srgb, var(--bfa-paper) 92%, var(--bfa-canvas)), var(--bfa-paper));
  border: 1px solid color-mix(in srgb, var(--bfa-line) 100%, transparent);
  border-radius: clamp(16px, 4cqi, 22px);
  padding: clamp(24px, 5cqi, 32px) clamp(20px, 5cqi, 28px) clamp(24px, 5cqi, 30px);
  overflow: hidden;
  box-shadow:
    0 1px 0 0 color-mix(in srgb, var(--bfa-ink) 5%, transparent),
    0 4px 14px -8px color-mix(in srgb, var(--bfa-accent) 10%, transparent),
    0 24px 56px -32px color-mix(in srgb, var(--bfa-accent) 22%, transparent);
}
.bfa-app-spotlight-block .bfa-app-spotlight-tint {
  position: absolute; inset: 0; pointer-events: none;
  background: radial-gradient(ellipse 60% 40% at 100% 0%, color-mix(in srgb, var(--bfa-accent-soft) 14%, transparent), transparent 70%);
}
.bfa-app-spotlight-block .bfa-app-spotlight-chip {
  position: relative; display: inline-flex; align-items: center; gap: 10px;
  padding: 7px 14px 7px 12px;
  background: var(--bfa-canvas);
  border: 1px solid color-mix(in srgb, var(--bfa-line) 100%, transparent);
  border-radius: 999px;
  font-family: var(--bfa-font-chrome);
  font-size: 11px; font-weight: 600; letter-spacing: 0.18em; text-transform: uppercase;
  color: var(--bfa-accent);
  margin: 0 0 18px;
}
.bfa-app-spotlight-block .bfa-app-spotlight-chip::before {
  content: ""; width: 8px; height: 8px; border-radius: 50%;
  background: var(--bfa-warn); flex-shrink: 0;
}
.bfa-app-spotlight-block .bfa-app-spotlight-chip-sep {
  color: var(--bfa-ink-subtle); font-weight: 400; letter-spacing: 0;
}
.bfa-app-spotlight-block .bfa-app-spotlight-title {
  font-family: var(--bfa-font-display); font-weight: 500;
  font-size: clamp(1.85rem, 7cqi, 2.7rem); line-height: 1.12;
  letter-spacing: -0.015em; color: var(--bfa-accent);
  margin: 0; max-width: 22ch;
}
.bfa-app-spotlight-block .bfa-app-spotlight-title em {
  font-style: italic; font-weight: 500; color: var(--bfa-accent-mid);
}
.bfa-app-spotlight-block .bfa-app-spotlight-intro {
  font-family: var(--bfa-font-body); font-size: 1.05rem; line-height: 1.65;
  color: var(--bfa-ink-soft); margin: 16px 0 0; max-width: 56ch;
}
.bfa-app-spotlight-block .bfa-app-spotlight-features {
  margin: 22px 0 0; display: flex; flex-wrap: wrap; gap: 8px; list-style: none; padding: 0;
}
.bfa-app-spotlight-block .bfa-app-spotlight-feature {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 8px 12px 8px 10px;
  background: var(--bfa-canvas);
  border: 1px solid color-mix(in srgb, var(--bfa-line) 100%, transparent);
  border-radius: 8px;
  font-family: var(--bfa-font-chrome);
  font-size: 12px; font-weight: 600; letter-spacing: 0.02em;
  color: var(--bfa-accent);
}
.bfa-app-spotlight-block .bfa-app-spotlight-feature svg {
  width: 14px; height: 14px;
  color: var(--bfa-success); fill: none; stroke: currentColor;
  stroke-width: 2; stroke-linecap: round; stroke-linejoin: round;
  flex-shrink: 0;
}
@media (prefers-reduced-motion: reduce) {
  .bfa-app-spotlight-block * { transition: none !important; animation: none !important; }
}
  Music / Open Source 

Stash [APK](https://bestforandroid.com/apk/ "apps apk download"), one interface for a *[Spotify](https://bestforandroid.com/apk/spotify-premium-mod-apk/ "spotify") and YouTube Music library in FLAC.*

Stash APK is Spotify + YouTube Music library downloader in FLAC format, enjoy music offline and online, no subscription, no recurring charges.

- Unified Library
- Offline Music
- Open Source (GPL-3.0)
 
 


(function () {
  function init(root) {
    if (root.getAttribute("data-bfa-bound") === "1") { return; }
    root.setAttribute("data-bfa-bound", "1");
  }
  function run() {
    var nodes = document.getElementsByClassName("bfa-app-spotlight-block");
    for (var i = 0; i < nodes.length; i = i + 1) {
      try { init(nodes[(i)]); } catch (e) {}
    }
  }
  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", run);
  } else { run(); }
})();
Stash is an open-source [Android](https://bestforandroid.com/ "best android guides") app that connects to your existing Spotify and YouTube Music accounts and presents their libraries, liked songs, playlists, and mixes in a single unified interface on the phone, and allows you to download music and playlists for offline playback in FLAC format.

The app gives you the freedom to choose whether to stream tracks through an index or make them available offline by downloading music to your phone, depending on the source app's own access rules for that content.

How Stash APK works on Android
------------------------------

Stash does not run its own servers, host media, or require a Stash account. It authenticates directly against a user's Spotify and YouTube Music accounts and stores session credentials locally, encrypted with AES-256-GCM via Google's Tink library. The only outbound network requests the app makes are to Spotify and YouTube's own services.

The app operates in two modes per source, set individually for each playlist or mix a user selects:

- **Offline mode:** The track is retrieved once and stored on-device for playback without a network connection.
- **[Streaming](https://bestforandroid.com/movie-streaming-apps/ "best free movie apps") index mode:** Stash keeps a lightweight reference to the track (metadata plus a resolvable identifier) and streams it on demand, without persisting the audio file locally.

You can switch a playlist between these modes at any time, and the two modes aren't mutually exclusive across a library; someone could keep one playlist offline while everything else stays index-only.

Because Stash pulls from two catalogs that don't share identifiers, it runs a matching step to reconcile a track on one service with its counterpart on the other. This matching is heuristic, based on title, artist, album, and duration, rather than guaranteed by a shared database, which is why the app ships a manual correction path (the "wrong match" flag) rather than treating matches as final.

Core features of Stash Spotify Downloader
-----------------------------------------

- **Unified library:** liked songs, playlists, daily mixes, and other synced mixes from both Spotify and YouTube Music in one view
- **Track matching:** matches a track from one service to its equivalent on the other, with a manual re-match option (a "wrong match" flag on the Now Playing screen queues a re-search)
- **Optional Last.fm scrobbling:** off by default
- **Bidirectional sync:** when enabled, tracks liked or played in Stash are reflected back to the user's Spotify and YouTube accounts
- **Audio tools:** 5-band equalizer with presets, bass boost, virtualizer, crossfader, and normalizer
- **Synced lyrics:** pulled from LRCLIB and scrolled in time with playback

Good to know before installing
------------------------------

This app is distributed outside Google Play, so Android will show an "unknown sources" warning before installation. That's standard behavior for any sideloaded APK, not specific to this app's risk level.


.bfa-callout-block.bfa-callout-tone-info {
  --bfa-canvas:       #FFFFFF;
  --bfa-paper:        rgba(46, 74, 71, 0.04);
  --bfa-paper-cool:   #FAFAF7;
  --bfa-ink:          #0E1A1A;
  --bfa-ink-soft:     #4B5C5B;
  --bfa-ink-subtle:   #728483;
  --bfa-line:         rgba(46, 74, 71, 0.12);
  --bfa-line-soft:    #EFE7D8;
  --bfa-line-cool:    #D8E5E3;
  --bfa-accent:       #1F3837;
  --bfa-accent-mid:   #44706E;
  --bfa-accent-soft:  #7FA39F;
  --bfa-accent-deep:  #15292A;
  --bfa-success:      #047857;
  --bfa-success-mid:  #10B981;
  --bfa-success-soft: #ECFDF5;
  --bfa-warn:         #B91C1C;
  --bfa-warn-mid:     #DC2626;
  --bfa-warn-soft:    #FEF2F2;
  --bfa-font-display: "Fraunces", Georgia, "Times New Roman", serif;
  --bfa-font-body:    "Source Serif 4", Georgia, "Times New Roman", serif;
  --bfa-font-chrome:  "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
  --bfa-font-mono:    "JetBrains Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
  --bfa-ease:         cubic-bezier(.22, .85, .18, 1);
  --bfa-dur-quick:    250ms;
  --bfa-dur-smooth:   600ms;
  --tone-base: var(--bfa-accent-mid);
  --tone-mid: var(--bfa-accent-soft);
  position: relative; margin: 32px 0;
  container-type: inline-size; container-name: bfa-callout;
  font-family: var(--bfa-font-body); color: var(--bfa-ink);
}
.bfa-callout-block, .bfa-callout-block *,
.bfa-callout-block *::before, .bfa-callout-block *::after { box-sizing: border-box; }
.bfa-callout-block .bfa-callout-inner {
  position: relative; background: var(--bfa-canvas);
  border: 1px solid var(--bfa-line);
  border-radius: clamp(14px, 3.5cqi, 18px);
  padding: 20px 22px 18px 28px;
  overflow: hidden;
  display: grid; grid-template-columns: 32px 1fr; gap: 14px;
  align-items: flex-start;
}
.bfa-callout-block .bfa-callout-inner::before {
  content: ""; position: absolute; top: 0; bottom: 0; left: 0; width: 5px;
  background: var(--tone-base);
  border-radius: clamp(14px, 3.5cqi, 18px) 0 0 clamp(14px, 3.5cqi, 18px);
}
.bfa-callout-block .bfa-callout-icon {
  width: 32px; height: 32px;
  display: grid; place-items: center;
  background: color-mix(in srgb, var(--tone-mid) 12%, var(--bfa-canvas));
  border: 1px solid color-mix(in srgb, var(--tone-mid) 30%, transparent);
  border-radius: 50%;
  color: var(--tone-base);
  flex-shrink: 0;
}
.bfa-callout-block .bfa-callout-icon svg {
  width: 15px; height: 15px; fill: none; stroke: currentColor;
  stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round;
}
.bfa-callout-block .bfa-callout-body {
  display: flex; flex-direction: column; gap: 2px;
}
.bfa-callout-block .bfa-callout-eyebrow {
  font-family: var(--bfa-font-chrome);
  font-size: 10px; font-weight: 700; letter-spacing: 0.20em;
  text-transform: uppercase; color: var(--tone-base);
}
.bfa-callout-block .bfa-callout-headline {
  font-family: var(--bfa-font-display); font-weight: 500;
  font-size: 1.1rem; line-height: 1.3; color: var(--bfa-ink);
  letter-spacing: -0.01em; margin: 2px 0 6px;
}
.bfa-callout-block .bfa-callout-headline em {
  font-style: italic; color: var(--bfa-accent-mid);
}
.bfa-callout-block .bfa-callout-body p {
  font-family: var(--bfa-font-body); font-size: 0.95rem; line-height: 1.55;
  color: var(--bfa-ink-soft); margin: 0 0 8px;
}
.bfa-callout-block .bfa-callout-body p:last-child { margin: 0; }
.bfa-callout-block .bfa-callout-body code {
  font-family: var(--bfa-font-mono);
  font-size: 0.82rem; color: var(--bfa-accent);
  background: color-mix(in srgb, var(--bfa-paper) 100%, transparent);
  padding: 2px 6px; border-radius: 5px;
  border: 1px solid color-mix(in srgb, var(--bfa-line) 80%, transparent);
}
@media (prefers-reduced-motion: reduce) {
  .bfa-callout-block * { transition: none !important; animation: none !important; }
}
 Before you install

Sideload requires *extra trust*

Android does not pre-scan APKs from outside Google Play. Always check the package name (`com.stash.app`), version, file size, and requested permissions before tapping install. If anything looks unusual, do not install.

 

 


(function () {
  function init(root) {
    if (root.getAttribute("data-bfa-bound") === "1") { return; }
    root.setAttribute("data-bfa-bound", "1");
  }
  function run() {
    var nodes = document.getElementsByClassName("bfa-callout-block");
    for (var i = 0; i < nodes.length; i = i + 1) {
      try { init(nodes[(i)]); } catch (e) {}
    }
  }
  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", run);
  } else { run(); }
})();
How to Install Stash on Android
-------------------------------


.bfa-install-steps-block {
  --bfa-canvas:       #FFFFFF;
  --bfa-paper:        rgba(46, 74, 71, 0.04);
  --bfa-paper-cool:   #FAFAF7;
  --bfa-ink:          #0E1A1A;
  --bfa-ink-soft:     #4B5C5B;
  --bfa-ink-subtle:   #728483;
  --bfa-line:         rgba(46, 74, 71, 0.12);
  --bfa-line-soft:    #EFE7D8;
  --bfa-line-cool:    #D8E5E3;
  --bfa-accent:       #1F3837;
  --bfa-accent-mid:   #44706E;
  --bfa-accent-soft:  #7FA39F;
  --bfa-accent-deep:  #15292A;
  --bfa-success:      #047857;
  --bfa-success-mid:  #10B981;
  --bfa-success-soft: #ECFDF5;
  --bfa-warn:         #B91C1C;
  --bfa-warn-mid:     #DC2626;
  --bfa-warn-soft:    #FEF2F2;
  --bfa-font-display: "Fraunces", Georgia, "Times New Roman", serif;
  --bfa-font-body:    "Source Serif 4", Georgia, "Times New Roman", serif;
  --bfa-font-chrome:  "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
  --bfa-font-mono:    "JetBrains Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
  --bfa-ease:         cubic-bezier(.22, .85, .18, 1);
  --bfa-dur-quick:    250ms;
  --bfa-dur-smooth:   600ms;
  position: relative; margin: 32px 0;
  container-type: inline-size; container-name: bfa-install-steps;
  font-family: var(--bfa-font-body); color: var(--bfa-ink);
}
.bfa-install-steps-block, .bfa-install-steps-block *,
.bfa-install-steps-block *::before, .bfa-install-steps-block *::after { box-sizing: border-box; }
.bfa-install-steps-block .bfa-install-steps-inner {
  position: relative; background: var(--bfa-paper);
  border: 1px solid color-mix(in srgb, var(--bfa-line) 100%, transparent);
  border-radius: clamp(16px, 4cqi, 22px);
  padding: clamp(20px, 4cqi, 26px) clamp(20px, 4cqi, 28px) clamp(20px, 4cqi, 26px);
}
.bfa-install-steps-block .bfa-install-steps-eyebrow {
  display: inline-flex; align-items: center; gap: 10px;
  font-family: var(--bfa-font-chrome);
  font-size: 11px; font-weight: 600; letter-spacing: 0.20em; text-transform: uppercase;
  color: var(--bfa-accent); margin: 0 0 8px;
}
.bfa-install-steps-block .bfa-install-steps-eyebrow::before {
  content: ""; width: 22px; height: 1px;
  background: linear-gradient(90deg, currentColor, transparent);
  flex-shrink: 0; opacity: 0.6;
}
.bfa-install-steps-block .bfa-install-steps-headline {
  font-family: var(--bfa-font-display); font-weight: 500;
  font-size: clamp(1.4rem, 5cqi, 1.9rem); line-height: 1.15;
  letter-spacing: -0.015em; color: var(--bfa-accent);
  margin: 0 0 20px;
}
.bfa-install-steps-block .bfa-install-steps-headline em {
  font-style: italic; color: var(--bfa-accent-mid);
}
.bfa-install-steps-block .bfa-install-steps-list {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column;
}
.bfa-install-steps-block .bfa-install-steps-step {
  display: grid; grid-template-columns: 40px 1fr;
  gap: 16px; padding: 14px 0; align-items: flex-start;
  border-top: 1px solid color-mix(in srgb, var(--bfa-line) 60%, transparent);
}
.bfa-install-steps-block .bfa-install-steps-step:first-child { border-top: none; padding-top: 4px; }
.bfa-install-steps-block .bfa-install-steps-num {
  width: 40px; height: 40px;
  display: grid; place-items: center;
  background: var(--bfa-canvas);
  border: 1.5px solid color-mix(in srgb, var(--bfa-accent-mid) 40%, var(--bfa-line));
  border-radius: 999px;
  color: var(--bfa-accent);
  font-family: var(--bfa-font-display); font-weight: 500;
  font-size: 1.1rem;
}
.bfa-install-steps-block .bfa-install-steps-num span { line-height: 1; transform: translateY(-1px); }
.bfa-install-steps-block .bfa-install-steps-body {
  display: flex; flex-direction: column; gap: 4px; padding-top: 6px; min-width: 0;
}
.bfa-install-steps-block .bfa-install-steps-title {
  font-family: var(--bfa-font-display); font-weight: 500;
  font-size: 1.05rem; line-height: 1.3; color: var(--bfa-ink);
  letter-spacing: -0.005em;
}
.bfa-install-steps-block .bfa-install-steps-detail {
  font-family: var(--bfa-font-body); font-size: 0.94rem; line-height: 1.55;
  color: var(--bfa-ink-soft);
}
.bfa-install-steps-block .bfa-install-steps-detail em {
  font-family: var(--bfa-font-display); font-style: italic; color: var(--bfa-accent-mid);
}
@media (prefers-reduced-motion: reduce) {
  .bfa-install-steps-block * { transition: none !important; animation: none !important; }
}
Install in five steps

Getting *Stash APK* on your device

- 1
    
    Tap the download button
    
    The Stash APK file lands in your Downloads folder.
- 2
    
    Allow unknown apps
    
    Grant the install-unknown-apps permission to your file manager when Android prompts.
- 3
    
    Run the installer
    
    Accept the in-place update if a previous version is on the device.
- 4
    
    Launch the app
    
    Complete first-run setup or sign in to your account.
- 5
    
    Review permissions
    
    Open Settings inside the app and confirm permissions match the app's purpose.
 
 


(function () {
  function init(root) {
    if (root.getAttribute("data-bfa-bound") === "1") { return; }
    root.setAttribute("data-bfa-bound", "1");
  }
  function run() {
    var nodes = document.getElementsByClassName("bfa-install-steps-block");
    for (var i = 0; i < nodes.length; i = i + 1) {
      try { init(nodes[(i)]); } catch (e) {}
    }
  }
  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", run);
  } else { run(); }
})();
Pros and cons
-------------


.bfa-pros-cons-split-block {
  --bfa-canvas:       #FFFFFF;
  --bfa-paper:        rgba(46, 74, 71, 0.04);
  --bfa-paper-cool:   #FAFAF7;
  --bfa-ink:          #0E1A1A;
  --bfa-ink-soft:     #4B5C5B;
  --bfa-ink-subtle:   #728483;
  --bfa-line:         rgba(46, 74, 71, 0.12);
  --bfa-line-soft:    #EFE7D8;
  --bfa-line-cool:    #D8E5E3;
  --bfa-accent:       #1F3837;
  --bfa-accent-mid:   #44706E;
  --bfa-accent-soft:  #7FA39F;
  --bfa-accent-deep:  #15292A;
  --bfa-success:      #047857;
  --bfa-success-mid:  #10B981;
  --bfa-success-soft: #ECFDF5;
  --bfa-warn:         #B91C1C;
  --bfa-warn-mid:     #DC2626;
  --bfa-warn-soft:    #FEF2F2;
  --bfa-font-display: "Fraunces", Georgia, "Times New Roman", serif;
  --bfa-font-body:    "Source Serif 4", Georgia, "Times New Roman", serif;
  --bfa-font-chrome:  "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
  --bfa-font-mono:    "JetBrains Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
  --bfa-ease:         cubic-bezier(.22, .85, .18, 1);
  --bfa-dur-quick:    250ms;
  --bfa-dur-smooth:   600ms;
  position: relative; margin: 32px 0;
  container-type: inline-size; container-name: bfa-pros-cons-split;
  font-family: var(--bfa-font-body); color: var(--bfa-ink);
}
.bfa-pros-cons-split-block, .bfa-pros-cons-split-block *,
.bfa-pros-cons-split-block *::before, .bfa-pros-cons-split-block *::after { box-sizing: border-box; }
.bfa-pros-cons-split-block .bfa-pros-cons-split-grid {
  display: grid; grid-template-columns: 1fr; gap: 14px;
}
@container bfa-pros-cons-split (min-width: 560px) {
  .bfa-pros-cons-split-block .bfa-pros-cons-split-grid {
    grid-template-columns: 1fr 1fr; gap: 16px;
  }
}
.bfa-pros-cons-split-block .bfa-pros-cons-split-col {
  position: relative; background: var(--bfa-canvas);
  border: 1px solid var(--bfa-line);
  border-radius: clamp(14px, 3.5cqi, 18px);
  padding: 22px 22px 18px 28px;
  overflow: hidden;
  display: flex; flex-direction: column;
}
.bfa-pros-cons-split-block .bfa-pros-cons-split-col::before {
  content: ""; position: absolute; top: 0; bottom: 0; left: 0; width: 5px;
  border-radius: clamp(14px, 3.5cqi, 18px) 0 0 clamp(14px, 3.5cqi, 18px);
}
.bfa-pros-cons-split-block .bfa-pros-cons-split-col-pros::before { background: var(--bfa-success); }
.bfa-pros-cons-split-block .bfa-pros-cons-split-col-cons::before { background: var(--bfa-warn); }
.bfa-pros-cons-split-block .bfa-pros-cons-split-eyebrow {
  display: inline-flex; align-items: center; gap: 10px;
  font-family: var(--bfa-font-chrome);
  font-size: 11px; font-weight: 700; letter-spacing: 0.20em; text-transform: uppercase;
  margin: 0 0 16px;
}
.bfa-pros-cons-split-block .bfa-pros-cons-split-col-pros .bfa-pros-cons-split-eyebrow { color: var(--bfa-success); }
.bfa-pros-cons-split-block .bfa-pros-cons-split-col-cons .bfa-pros-cons-split-eyebrow { color: var(--bfa-warn); }
.bfa-pros-cons-split-block .bfa-pros-cons-split-eyebrow-icon {
  width: 26px; height: 26px;
  display: grid; place-items: center;
  border-radius: 50%; flex-shrink: 0;
}
.bfa-pros-cons-split-block .bfa-pros-cons-split-col-pros .bfa-pros-cons-split-eyebrow-icon {
  background: color-mix(in srgb, var(--bfa-success-mid) 12%, var(--bfa-canvas));
  border: 1px solid color-mix(in srgb, var(--bfa-success-mid) 30%, transparent);
}
.bfa-pros-cons-split-block .bfa-pros-cons-split-col-cons .bfa-pros-cons-split-eyebrow-icon {
  background: color-mix(in srgb, var(--bfa-warn-mid) 12%, var(--bfa-canvas));
  border: 1px solid color-mix(in srgb, var(--bfa-warn-mid) 30%, transparent);
}
.bfa-pros-cons-split-block .bfa-pros-cons-split-eyebrow-icon svg {
  width: 14px; height: 14px; fill: none; stroke: currentColor;
  stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round;
}
.bfa-pros-cons-split-block .bfa-pros-cons-split-list {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; flex: 1;
}
.bfa-pros-cons-split-block .bfa-pros-cons-split-item {
  display: grid; grid-template-columns: 18px 1fr; gap: 12px;
  align-items: flex-start; padding: 12px 0;
  border-bottom: 1px solid color-mix(in srgb, var(--bfa-line) 50%, transparent);
  font-family: var(--bfa-font-body); font-size: 0.97rem; line-height: 1.5;
  color: var(--bfa-ink);
  transition: background var(--bfa-dur-quick) var(--bfa-ease);
}
.bfa-pros-cons-split-block .bfa-pros-cons-split-item:first-child { padding-top: 4px; }
.bfa-pros-cons-split-block .bfa-pros-cons-split-item:last-child { border-bottom: none; }
.bfa-pros-cons-split-block .bfa-pros-cons-split-item-dot {
  width: 9px; height: 9px; border-radius: 50%;
  margin-top: 8px; flex-shrink: 0;
}
.bfa-pros-cons-split-block .bfa-pros-cons-split-col-pros .bfa-pros-cons-split-item-dot { background: var(--bfa-success); }
.bfa-pros-cons-split-block .bfa-pros-cons-split-col-cons .bfa-pros-cons-split-item-dot { background: var(--bfa-warn); }
.bfa-pros-cons-split-block .bfa-pros-cons-split-item-text {
  font-family: var(--bfa-font-body); font-size: 0.97rem; line-height: 1.5;
  color: var(--bfa-ink);
}
.bfa-pros-cons-split-block .bfa-pros-cons-split-item-text em {
  font-family: var(--bfa-font-display); font-style: italic; color: var(--bfa-accent-mid);
}
@media (prefers-reduced-motion: reduce) {
  .bfa-pros-cons-split-block * { transition: none !important; animation: none !important; }
}
What works and what does not (Stash)

    What works 

- Combines Spotify and YouTube Music libraries in one interface
- Session credentials encrypted on-device with AES-256-GCM
- No ads, analytics, or third-party crash reporting
- Source code published under GPL-3.0
- Offline or streaming mode selectable per playlist
- Includes equalizer, bass boost, and synced lyrics

 

    What does not 

- Track matching between services is heuristic and not always accurate
- Some tracks or playlists have no equivalent on the other service
- Android only, no iOS version
- Relies on Spotify and YouTube Music APIs staying accessible in their current form
- Not officially supported by either platform
- Downloading and mirroring streamed content may conflict with each platform's terms of service

 

 


(function () {
  function init(root) {
    if (root.getAttribute("data-bfa-bound") === "1") { return; }
    root.setAttribute("data-bfa-bound", "1");
  }
  function run() {
    var nodes = document.getElementsByClassName("bfa-pros-cons-split-block");
    for (var i = 0; i < nodes.length; i = i + 1) {
      try { init(nodes[(i)]); } catch (e) {}
    }
  }
  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", run);
  } else { run(); }
})();
Privacy and architecture notes
------------------------------

- No Stash-run backend or account system
- No analytics or third-party crash reporting
- No ads
- Credentials stored on-device only, encrypted
- Codebase is fully open source under GPL-3.0

Because there's no Stash backend, there's also nowhere for the project to have a data breach on the server side, the attack surface is limited to the device itself. Session tokens for Spotify and YouTube Music are encrypted at rest with AES-256-GCM via Tink, which handles key management and nonce generation rather than leaving that to hand-rolled crypto. The GPL-3.0 license means any fork or redistribution of the code has to remain open source, which is a meaningful constraint on how the project could be commercialized or closed off later.

The bidirectional sync feature is worth flagging on its own. Because likes and plays in Stash write back to the linked Spotify and YouTube accounts, those accounts' native recommendation systems and listening history will reflect activity that happened inside Stash, not just inside the official apps.

System requirements and permissions
-----------------------------------

Beyond the Android 8.0 (API 26) minimum listed above, an app with this feature set would typically need to request:

- **Storage access:** to write downloaded tracks and cached lyrics to the device
- **Network access:** to reach Spotify and YouTube's APIs
- **Foreground service permission:** to keep audio playing when the app isn't in the foreground
- **Notification access:** for the standard media playback controls on the lock screen and notification shade

The exact permission list isn't fully provided by the developer. If you are planning to install the app, then you should look at the actual permissions prompt on install rather than assume the list above is complete or exact.

Possible limitations
--------------------

- **Matching isn't guaranteed:** the heuristic matching between Spotify and YouTube Music catalogs (by title, artist, album, duration) won't always land on the correct version of a track, particularly for live recordings, remixes, or tracks with multiple releases. The manual "wrong match" flag exists specifically because this isn't solved perfectly.
- **Catalog gaps:** a track, playlist, or mix that exists on one service may not have an equivalent on the other, which limits what can be mirrored regardless of matching quality.
- **No iOS version:** Stash is Android-only based on what's described here; nothing indicates a parallel iOS build.
- **Dependent on external APIs:** because Stash has no backend of its own, its functionality depends entirely on Spotify and YouTube Music's own APIs staying accessible in their current form. A change on either platform's end (rate limits, authentication flow, API deprecation) could affect Stash's reliability without any action from the Stash developer.
- **Not officially supported:** Spotify and YouTube Music have no relationship with Stash and provide no guarantees about compatibility going forward.

Project status
--------------

**Maintainer:** Stash is maintained by a single named developer, Rawnald Clark.

**Why it's worth checking:** Stash's functionality depends on keeping pace with changes to Spotify and YouTube's APIs. For a project like that, maintenance activity is a reasonable thing to check before relying on it.

How it compares to similar tools
--------------------------------

**The category:** Stash sits in a broader space of unofficial, open-source clients built on top of major streaming platforms' APIs, projects focused on offline access, ad removal, or alternate UIs for Spotify or YouTube Music individually.

**What sets it apart:** Most tools in this category work against a single platform. Stash's distinguishing choice is unifying two separate services into one library.

**On privacy:** Its no-account, no-backend, on-device-encryption approach is also more conservative than some tools in this space, which sometimes rely on a hosted backend or a third-party API proxy.

**One caveat:** This isn't an endorsement or a ranking. Evaluating any specific alternative would need the same scrutiny applied here: what data it touches, what permissions it needs, and how it holds up against the terms of the platforms it connects to.

**What Stash does, functionally:** Stash downloads and mirrors content from Spotify and YouTube Music outside those platforms' own apps. That's true regardless of how the app is built, licensed, or monetized.

**Why that matters:** Spotify's and YouTube's terms generally prohibit extracting, downloading, or redistributing streamed content through anything other than their own official clients. That restriction applies whether or not a third-party tool charges money, shows ads, or collects data; it's about the activity, not the business model behind it.

**What doesn't change that:** Being non-commercial, open source, and privacy-respecting doesn't change whether the underlying activity is authorized by the platforms Stash depends on. Those are two separate questions: one is about how well the app is built and how it handles user data, the other is about whether its core function is permitted at all.

**Why this is worth separating out:** The privacy and architecture choices described above are real and verifiable in the code. But anyone evaluating the codebase, considering running it, or writing about it should keep that distinction in mind rather than treating good engineering as the same thing as permission.


.bfa-disclaimer-ribbon-block {
  --bfa-canvas:       #FFFFFF;
  --bfa-paper:        rgba(46, 74, 71, 0.04);
  --bfa-paper-cool:   #FAFAF7;
  --bfa-ink:          #0E1A1A;
  --bfa-ink-soft:     #4B5C5B;
  --bfa-ink-subtle:   #728483;
  --bfa-line:         rgba(46, 74, 71, 0.12);
  --bfa-line-soft:    #EFE7D8;
  --bfa-line-cool:    #D8E5E3;
  --bfa-accent:       #1F3837;
  --bfa-accent-mid:   #44706E;
  --bfa-accent-soft:  #7FA39F;
  --bfa-accent-deep:  #15292A;
  --bfa-success:      #047857;
  --bfa-success-mid:  #10B981;
  --bfa-success-soft: #ECFDF5;
  --bfa-warn:         #B91C1C;
  --bfa-warn-mid:     #DC2626;
  --bfa-warn-soft:    #FEF2F2;
  --bfa-font-display: "Fraunces", Georgia, "Times New Roman", serif;
  --bfa-font-body:    "Source Serif 4", Georgia, "Times New Roman", serif;
  --bfa-font-chrome:  "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
  --bfa-font-mono:    "JetBrains Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
  --bfa-ease:         cubic-bezier(.22, .85, .18, 1);
  --bfa-dur-quick:    250ms;
  --bfa-dur-smooth:   600ms;

  position: relative; margin: 40px 0 0;
  container-type: inline-size; container-name: bfa-disclaimer-ribbon;
  font-family: var(--bfa-font-body); color: var(--bfa-ink-soft);
}
.bfa-disclaimer-ribbon-block, .bfa-disclaimer-ribbon-block * { box-sizing: border-box; }
.bfa-disclaimer-ribbon-block .bfa-disclaimer-ribbon-inner {
  padding: 20px 24px;
  background: var(--bfa-paper);
  border-top: 1px solid var(--bfa-line);
  border-bottom: 1px solid var(--bfa-line);
}
.bfa-disclaimer-ribbon-block .bfa-disclaimer-ribbon-eyebrow {
  font-family: var(--bfa-font-chrome);
  font-size: 10px; font-weight: 700; letter-spacing: 0.20em; text-transform: uppercase;
  color: var(--bfa-accent-mid); margin: 0 0 6px;
}
.bfa-disclaimer-ribbon-block .bfa-disclaimer-ribbon-text {
  font-family: var(--bfa-font-body);
  font-size: 0.85rem; line-height: 1.65; font-style: italic;
  color: var(--bfa-ink-subtle);
}
.bfa-disclaimer-ribbon-block .bfa-disclaimer-ribbon-text a {
  color: var(--bfa-accent-mid); text-decoration: underline;
}
, Disclaimer

This page links to a modified APK that unlocks features normally gated behind a paid subscription or in-app purchase. The build is not affiliated with or endorsed by the original developer. Installing modded apps may breach the Terms of Service for the underlying account. The choice to install is yours. See our [DMCA notice](https://bestforandroid.com/apk/dmca/) for takedown requests.