github rawnaldclark/Stash v0.4.0
Stash v0.4.0

latest releases: v0.9.104, v0.9.103, v0.9.102...
4 months ago

feat(mixes): Stash Mixes — recipe-driven daily mix engine

Closes the gap where the only "mixes" on Home were imports from Spotify
and YouTube Music. Stash now generates its own curated, rotating mixes
from local listening history + Last.fm public-API data (no account
required). Makes Stash a destination by itself, not a downloader for
other services' algorithms.

Seven built-in recipes (Rediscovery, Heavy Rotation, Focus, Late Night,
Throwback, Road Trip, New Arrivals) cover the common mix archetypes.
Each is a declarative recipe row: include/exclude tags, era range,
affinity bias, discovery ratio, freshness window. The MixGenerator
scores every library track with a blend of log-scaled affinity, tag
match, and freshness boost, picks library-slot count, and spreads
artists to avoid same-artist runs.

Pipeline:

  • Schema v10 → v11: track_tags + stash_mix_recipes + discovery_queue.
  • TrackTagDao / StashMixRecipeDao / DiscoveryQueueDao.
  • MixGenerator (pure Kotlin scorer).
  • StashMixDefaults.seedIfNeeded on first launch.
  • StashMixRefreshWorker: daily, materializes every active recipe into
    a PlaylistType.STASH_MIX playlist, enqueues discovery candidates.
  • TagEnrichmentWorker: daily, batches Last.fm track/artist top-tag
    calls, rate-limited to ~4.5 req/sec, unmetered+charging.
  • StashDiscoveryWorker: daily, drains discovery_queue, creates track
    stubs + download_queue rows so the existing TrackDownloadWorker
    handles the actual search+download. Per-recipe weekly cap of 10
    new tracks.
  • LastFmApiClient gains public read endpoints (getTrackTopTags,
    getArtistTopTags, getSimilarArtists, getArtistTopTracks,
    getUserTopArtists, getUserLovedTracks).
  • LastFmColdStartImporter: on connect, pulls user's Last.fm top
    artists + loved tracks and synthesizes listening_events for
    library matches so mixes feel personal from day one.

Home:

  • New "Stash Mixes" section above Spotify/YouTube daily mixes.
  • HomeUiState.stashMixes + HomeViewModel filter by PlaylistType.STASH_MIX.

No Last.fm account? Everything except the cold-start import works on
the public API key. No ML on device. Fully transparent recipe model —
future mix-builder UI will let users create their own.

Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com


Install

Download the .apk below and open it on your Android device. If you've got a previous Stash release installed, this upgrades in place — your library, sync history, and settings are preserved.

Requires: Android 8.0 (API 26) or newer.

See the README for first-time setup.

Full Changelog: v0.3.9...v0.4.0

Don't miss a new Stash release

NewReleases is sending notifications on new releases.