Stash v0.9.13
feat: 0.9.13 — Library & Likes + live tip jar
Headline: heart your tracks, get smarter Spotify mixes, and watch
the tip jar update in real time without an app rebuild.
Library & Likes
• Heart button on Now Playing's TopBar. Tap to add the current track
to your local Stash Liked Songs playlist; tap-filled to remove.
Standard like-button UX, fully Stash-local — does NOT touch your
Spotify/YT Music accounts.
• New "Liked Songs" playlist appears in Library + Home, lazy-seeded
on your first heart tap. Always-protected from sync orphan
cleanup so curated entries stay put.
• Auto-save liked tracks to Spotify (opt-in, off by default). Lives
inside the Spotify connect card in Settings. After a track has
been played on N distinct days within the last 30 (slider 1-10,
default 3), Stash sends it to your Spotify Liked Songs via the
public PUT /v1/me/tracks endpoint. Drives Daily Mix + Discover
Weekly to learn from your Stash listening. One-way only —
un-liking in Stash never unsaves on Spotify.
• YT Music "Send plays" toggle restored visibility in the same
pattern, even when YT isn't connected (so users can see the
feature exists).
Live Tip Jar
• Supporter pill on Home crossfades through the most recent Ko-fi
supporters every ~5 seconds. Tap → opens ko-fi.com/rawnald.
• Live data via a Cloudflare Worker (free tier): receives Ko-fi
webhooks, persists to KV, serves JSON the app fetches. New tips
reach the app within seconds — no APK rebuild.
• Worker setup is one-shot automated via setup.ps1 / setup.sh. Per-
fork redeployment is documented in infra/tipjar-worker/README.md.
Quality of Life
• Codec column auto-backfill on first launch. Tracks downloaded
before v0.9.11 were stuck at file_format = 'opus' regardless of
actual codec, so every track displayed "OPUS" on Now Playing
even when the on-disk file was FLAC. The migration reads the
file_path extension and corrects the column. Now Playing shows
the right codec — FLAC tracks read FLAC, m4a reads M4A, etc.
• System bar overlap fix. App content was drawing under the status
bar on Android 15+ (reported via Twitter; affected every screen).
Scaffold now respects safe-drawing insets per Material 3.
• Heart icon now live-bound to Room. Track display data on Now
Playing was sourcing from the player's MediaItem snapshot, which
only carries id+title+artist+album+art. Switching to a Room-live
Track flow fixed the heart icon failing to persist across screen
open/close AND the codec staleness in one move.
• "Report an issue" wrench icon next to the Stash wordmark on Home,
one tap to GitHub's new-issue form.
• Settings: deep-link from Home banners. "Try lossless audio" /
"Try Last.fm" CTAs now scroll Settings to the relevant card on
open instead of dumping the user at the top.
• Settings restructure: Spotify auto-save lives inside the Spotify
connect card (mirrors YT Music's "Send plays" pattern) instead of
a standalone Library & Likes section.
Schema migration
• MIGRATION_17_18: adds spotify_saved_at, ytmusic_saved_at,
stash_liked_at columns to tracks; completed_at to listening_events.
Forward-only timestamps. Existing data preserved.
• PlaylistType.STASH_LIKED added; protected-cascade queries updated
to keep Stash Liked entries safe from orphan-cleanup the same way
imported LIKED_SONGS are.
Known limitations
• Heart in track-row 3-dot context menu deferred to v0.9.14
(requires per-feature-screen integration; not a v0.9.13 blocker
since long-press and Now Playing both work).
• Worker setup requires a one-time Cloudflare account + free-tier
signup. setup.ps1 walks through it end-to-end including OAuth,
KV namespace creation, and BuildConfig URL update.
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.9.12...v0.9.13