-
released this
2026-05-13 22:37:08 -04:00 | 747 commits to main since this releaseSubstantial batch since v2026.05.12.1 — 45 commits. See PR #43 for the full breakdown.
Highlights
- Live updates (#392, #402) — SSE event bus at /api/events/stream; Flutter consumer with screen-scoped invalidation for likes, quarantine, playlist mutations, request status, scan lifecycle
- Per-user playlist scheduling (#403) — system playlists refresh at 03:00 in each user's local timezone via CRON_TZ-prefixed gocron jobs; PUT /api/me/timezone + flutter_timezone capture
- Discover playlist (#400) — fixed (SELECT DISTINCT + ORDER BY plan error); daily seed rotation + jitter + 12/13 head/tail split so the same library produces noticeably different daily mixes
- Non-blocking version check — VersionGate no longer blocks app render on /healthz; 1-minute active-use polling with bounded 3s/2s timeouts; banner surfaces when client is too old without stalling the app
- Offline cache completion (#357) — drift-first homeProvider, library_changes retention compactor (30-day window), drift-first Liked / History / MyQuarantine tabs
- Cover caching — cached_network_image disk cache for every cover URL (survives scroll-off + app restart); SyncController prewarms covers for new/updated entities at concurrency=3
- Per-item rendering — new /api/home/index endpoint returns IDs only; HydrationQueue (concurrency=4) drives per-tile fetches against /api/albums/:id, /api/artists/:id, /api/tracks/:id; skeleton tiles match real-card dimensions; 220ms cross-fade reveal
- Flutter UI polish — #393 always-visible play buttons on home carousels, #396 full-screen now-playing polish (gradient backdrop + Hero animation + crossfade), #401 now-playing row highlight
Cold-visit behavior: shaped page paints instantly with skeletons, content cascades in as the hydration queue drains. Warm visits paint fully from drift in the first frame.
Deferred
- Full per-track playlist detail (Fable #405) — skeleton-row variant captures most of the perceptual win; full version awaits if cold visits to very large playlists still feel sluggish
- CachedHomeSnapshot cleanup (Fable #406) — legacy table + homeProvider left in place as revert path
Operator notes
- Drift schema bumps 2 → 6 (4 new tables). Migrations are in-place.
- New users.timezone column on the server (migration 0026)
- In-app updater should upgrade cleanly from v2026.05.12.0
- Pull the new server container image and roll prod
- Sideload minstrel-v2026.05.13.0.apk from this release page when CI finishes attaching it
Downloads