• bvandeusen released this 2026-05-13 22:37:08 -04:00 | 747 commits to main since this release

    Substantial 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