M5–M7 sweep + offline cache + in-app updates + DRY pass #35
Reference in New Issue
Block a user
Delete Branch "dev"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
PR brings
dev(~555 commits, 2026-04-29 → 2026-05-10) intomainfor a real-device test release.Major themes
M5 / M6 / M7 server + web (Apr 29 → May 8)
Flutter offline mode (#357, plans A/B/C)
library_changeslog + cursor-based delta sync at/api/library/synccached_artists/albums/tracks/likes/playlists/playlist_tracks), SyncController,cacheFirstreactive helper, drift-first migration of 7 cached-entity providerslibrary_sync_views.goview structs + pinned wire-key tests.Flutter parity (#356)
Web mobile responsive (#358)
Web DRY pass (#375)
mocks/likes,mocks/quarantine,mocks/appState,fixtures/track) — ~46 test files sweptplaylists.tsmigrated toapi.*wrapper;api.delmade genericsafeLocalStorage,playlistTrackToRef,runMutation,CardActionClusterhelperssessionEndsignalWeb stream resilience (#369 + this batch)
preload="auto"on the audio elementattachStallRetry— auto-recovery fromstalled/waiting/ network errors with bounded retries<audio>for the next track (gap-free transitions)audioLoaderseam — Tauri shell can later swap to a Rust-backed cache without touching the player UI/requests+/admin/requestsevery 12s while ingests in-flight (#369 piece)In-app update flow (#397)
/api/client/version+/api/client/apkendpoints (auth-gated, APK rate-limited per user 60s)PackageInstallerintent through MainActivity MethodChannel + FileProviderrelease.ymlpolls the Forgejo release page for the APK thatflutter.ymlattached, drops it intoclient/, Dockerfile bakes it into the image at/app/client/MobileAppDownloadcomponent on Settings → Mobile app; renders nothing when no APK bundledHeads-up for the test pass
m.addColumn+ cursor reset.Test plan
🤖 Generated with Claude Code