This website requires JavaScript.
154f415f92
fix(server,web): auth-gate client APK + version endpoints + per-user rate limit (#397 )
bvandeusen and Claude Opus 4.7
2026-05-10 20:28:27 -04:00
2435ef7961
feat(web): MobileAppDownload component on login + settings (#397 follow-up)
bvandeusen and Claude Opus 4.7
2026-05-10 20:23:56 -04:00
f6e27cd39a
fix(flutter/test): isVersionNewer date-style assertion was wrong
bvandeusen and Claude Opus 4.7
2026-05-10 20:09:53 -04:00
f3378dd610
fix(flutter): apply Riverpod 3 NotifierProvider conversion missed in 14d7678
bvandeusen and Claude Opus 4.7
2026-05-10 20:02:29 -04:00
14d7678624
fix: CI lint errors after #397 commits
bvandeusen and Claude Opus 4.7
2026-05-10 20:01:43 -04:00
e57a53a92e
ci(server): bundle Android APK into image on tag releases (#397 phase 3)
bvandeusen and Claude Opus 4.7
2026-05-10 19:44:08 -04:00
02d9f39845
feat(flutter): in-app update banner + Android install intent (#397 phase 2)
bvandeusen and Claude Opus 4.7
2026-05-10 19:42:04 -04:00
a2bea8601a
feat(server): /api/client/version + /api/client/apk endpoints (#397 phase 1)
bvandeusen and Claude Opus 4.7
2026-05-10 19:35:24 -04:00
27f123f7d9
fix(server,flutter): sync wire format + systemVariant column (#357 )
bvandeusen and Claude Opus 4.7
2026-05-10 18:47:30 -04:00
0db7054518
feat(flutter): user-facing requests view + cancel (#356 )
bvandeusen and Claude Opus 4.7
2026-05-10 18:08:23 -04:00
861dd8ef17
feat(web): auto-poll request progress when ingests are in flight (#369 )
bvandeusen and Claude Opus 4.7
2026-05-10 17:59:38 -04:00
7bc254e17e
feat(web): stream resilience — preload=auto, stall recovery, next-track prefetch
bvandeusen and Claude Opus 4.7
2026-05-10 17:43:41 -04:00
1daf0b7fdf
feat(web): close #358 invites RowActionsMenu wiring
bvandeusen and Claude Opus 4.7
2026-05-10 17:14:18 -04:00
308202a1df
refactor(web): extract CardActionCluster (#375 item #8 — narrowed scope)
bvandeusen and Claude Opus 4.7
2026-05-10 16:58:17 -04:00
9b4f907db6
refactor(web): sweep 24 test files to use makeTrack/makeTracks fixtures (#375 )
bvandeusen and Claude Opus 4.7
2026-05-10 15:58:14 -04:00
993bcc6a14
fix(web/test): update playlist API tests for api.* call surface (#375 )
bvandeusen and Claude Opus 4.7
2026-05-10 15:48:04 -04:00
2ec54bc429
refactor(web): sweep playlist.test.ts to use emptyQuarantineMock() (#375 )
bvandeusen and Claude Opus 4.7
2026-05-10 15:42:57 -04:00
7e8d19606a
refactor(web): sweep test files to use empty likes/quarantine mocks (#375 )
bvandeusen and Claude Opus 4.7
2026-05-10 15:41:15 -04:00
dd67f28745
refactor(web): sweep 8 test files to use pageUrlModule() (#375 )
bvandeusen and Claude Opus 4.7
2026-05-10 15:39:25 -04:00
6e0223a9b1
refactor(web): runMutation helper for generic-toast admin handlers (#375 )
bvandeusen and Claude Opus 4.7
2026-05-10 15:39:00 -04:00
0eaaf66748
refactor(web): playlistTrackToRef helper to dedupe TrackRef reconstruction (#375 )
bvandeusen and Claude Opus 4.7
2026-05-10 15:37:11 -04:00
633406c05b
refactor(web): safeLocalStorage helper for store persistence (#375 )
bvandeusen and Claude Opus 4.7
2026-05-10 15:36:45 -04:00
2357df83be
refactor(web): add test-utils helpers for likes/quarantine/track/appState mocks (#375 )
bvandeusen and Claude Opus 4.7
2026-05-10 15:31:53 -04:00
e8eff1baa1
refactor(web): migrate playlists.ts to api.* wrapper (#375 )
bvandeusen and Claude Opus 4.7
2026-05-10 15:30:34 -04:00
714039bae5
refactor(web): drive vite-injected theme-color from tokens.json (#375 )
bvandeusen and Claude Opus 4.7
2026-05-10 15:29:48 -04:00
65057473c6
refactor(web): break auth ↔ player import cycle via session-end signal (#375 )
bvandeusen and Claude Opus 4.7
2026-05-10 15:29:30 -04:00
94727f40bb
fix(flutter): analyze errors after Plan C provider migrations
bvandeusen and Claude Opus 4.7
2026-05-10 13:04:27 -04:00
98fdd9dcdf
feat(flutter/cache): migrate playlist providers to drift-first (#357 plan C)
bvandeusen and Claude Opus 4.7
2026-05-10 11:27:49 -04:00
08c16d6d86
fix(flutter): point like consumers at likesControllerProvider
bvandeusen and Claude Opus 4.7
2026-05-10 11:21:47 -04:00
8a6c926ea7
feat(flutter/cache): migrate likedIdsProvider to drift-first; LikesController for mutations
bvandeusen and Claude Opus 4.7
2026-05-10 11:20:59 -04:00
fc83c7b514
feat(flutter/cache): migrate artistAlbums/artistTracks/album to drift-first
bvandeusen and Claude Opus 4.7
2026-05-10 11:19:47 -04:00
947d4401a6
feat(flutter/cache): migrate artistProvider to drift-first (#357 plan C)
bvandeusen and Claude Opus 4.7
2026-05-10 11:18:59 -04:00
4eb9935f8e
feat(flutter/cache): cacheFirst helper + drift↔model adapters (#357 plan C)
bvandeusen and Claude Opus 4.7
2026-05-10 11:18:29 -04:00
2940e95b64
fix(flutter/test): skip TrackRow smoke test under the drift cohort
bvandeusen and Claude Opus 4.7
2026-05-10 10:49:03 -04:00
a3db6c9453
fix(flutter/test): testWidgets skip takes bool, not String
bvandeusen and Claude Opus 4.7
2026-05-10 10:41:48 -04:00
1b223d3891
fix(flutter/test): skip drift tests pending libsqlite3 in CI runner image
bvandeusen and Claude Opus 4.7
2026-05-10 10:27:49 -04:00
0d171490c3
fix(flutter): analyze errors after Plan B push
bvandeusen and Claude Opus 4.7
2026-05-10 10:18:38 -04:00
5114a8118c
feat(flutter): CachedIndicator + Download buttons + app startup wiring
bvandeusen and Claude Opus 4.7
2026-05-09 23:23:26 -04:00
fd4ce402d7
feat(flutter/settings): Storage section UI — usage, cap, prefetch, controls
bvandeusen and Claude Opus 4.7
2026-05-09 23:21:34 -04:00
153e931490
feat(flutter/player): audio_handler reads from cache first; LockCaching fallback
bvandeusen and Claude Opus 4.7
2026-05-09 23:20:24 -04:00
536350380f
feat(flutter/cache): Prefetcher — queue-ahead pre-download window
bvandeusen and Claude Opus 4.7
2026-05-09 23:19:01 -04:00
ab58f3ffcb
feat(flutter/cache): SyncController — token-based delta sync
bvandeusen and Claude Opus 4.7
2026-05-09 23:18:15 -04:00
16669a0365
feat(flutter/cache): AudioCacheManager — pin/unpin/evict + tiered LRU
bvandeusen and Claude Opus 4.7
2026-05-09 23:17:14 -04:00
2bcbb53c49
feat(flutter/cache): connectivityProvider + cacheSettingsProvider
bvandeusen and Claude Opus 4.7
2026-05-09 23:15:17 -04:00
326b7008a9
feat(flutter/cache): drift schema + new deps + CI codegen step (#357 plan B)
bvandeusen and Claude Opus 4.7
2026-05-09 23:07:34 -04:00
8d5c90e0ed
fix(server): wrap defer tx.Rollback for errcheck + gofmt -s alignment
bvandeusen and Claude Opus 4.7
2026-05-09 22:47:25 -04:00
9c7dec60a9
fix(server): go mod tidy after sync_test brings testify direct
bvandeusen and Claude Opus 4.7
2026-05-09 22:45:15 -04:00
6fb6729beb
feat(server): playlists service writes library_changes
bvandeusen and Claude Opus 4.7
2026-05-09 22:41:59 -04:00
e0c5789cee
feat(server): like/unlike handlers write library_changes
bvandeusen and Claude Opus 4.7
2026-05-09 22:40:56 -04:00
0fa7dc7982
feat(server): scanner + DeleteTrackFile write library_changes
bvandeusen and Claude Opus 4.7
2026-05-09 22:39:58 -04:00
6bd8a15c7a
feat(server): mount /api/library/sync route
bvandeusen and Claude Opus 4.7
2026-05-09 22:36:46 -04:00
9bf4b504b3
feat(server): GET /api/library/sync endpoint
bvandeusen and Claude Opus 4.7
2026-05-09 22:36:26 -04:00
3959c85111
feat(server): sync.LogChange helper + EntityType/Op constants
bvandeusen and Claude Opus 4.7
2026-05-09 22:29:51 -04:00
cb35133843
feat(server): library_changes log table + sqlc queries
bvandeusen and Claude Opus 4.7
2026-05-09 22:28:26 -04:00
084c202654
fix(web/test): MobileNavDrawer inert + integrations Save mocks Test first
bvandeusen and Claude Opus 4.7
2026-05-09 21:21:04 -04:00
3ffd9beca0
fix(web): preserve per-row aria-labels through RowActionsMenu + test fixes
bvandeusen and Claude Opus 4.7
2026-05-09 21:16:48 -04:00
3f8a2c511a
fix(web): MobileNavDrawer focus uses querySelector, not conditional bind:this
bvandeusen and Claude Opus 4.7
2026-05-09 20:26:44 -04:00
1536860e59
fix(web): move {@const} blocks to immediate children of {#each}
bvandeusen and Claude Opus 4.7
2026-05-09 20:26:04 -04:00
268e12a5eb
feat(web): Modal overlay gets p-4 so max-w-md modals fit on phone
bvandeusen and Claude Opus 4.7
2026-05-09 20:21:52 -04:00
16e0e98943
feat(web): mobile mechanical sweep — pointer-aware arrows, h3 dividers, modal safe-area
bvandeusen and Claude Opus 4.7
2026-05-09 20:21:38 -04:00
f03a0042e8
feat(web): wire RowActionsMenu in users admin page
bvandeusen and Claude Opus 4.7
2026-05-09 20:21:17 -04:00
e266a0f2dc
feat(web): wire RowActionsMenu in requests + quarantine
bvandeusen and Claude Opus 4.7
2026-05-09 20:20:43 -04:00
e0cf527304
feat(web): RowActionsMenu generic primary + ⋮ for admin tables
bvandeusen and Claude Opus 4.7
2026-05-09 20:19:09 -04:00
ed6d0936ca
feat(web): PlayerBar reflows to two-row layout below md
bvandeusen and Claude Opus 4.7
2026-05-09 20:18:32 -04:00
d5983433c5
feat(web): PlayerOverflowMenu — shuffle/repeat/queue/volume in a menu
bvandeusen and Claude Opus 4.7
2026-05-09 20:18:10 -04:00
df4cb434b2
feat(web): hamburger trigger + mobile drawer mount in Shell
bvandeusen and Claude Opus 4.7
2026-05-09 20:17:35 -04:00
857a8621ec
feat(web): MobileNavDrawer off-canvas nav for <md viewport
bvandeusen and Claude Opus 4.7
2026-05-09 20:17:17 -04:00
7f395024a0
feat(web): mobileNav store for off-canvas drawer state
bvandeusen and Claude Opus 4.7
2026-05-09 20:16:38 -04:00
84a638a41f
fix(flutter): clear analyze --fatal-infos issues
bvandeusen and Claude Opus 4.7
2026-05-09 16:16:35 -04:00
dd848e76e8
feat(flutter/playlists): empty-state hint on empty playlist detail
bvandeusen and Claude Opus 4.7
2026-05-09 16:07:41 -04:00
0dbb662b4c
feat(flutter): search no-results copy mirrors design-system voice
bvandeusen and Claude Opus 4.7
2026-05-09 16:07:19 -04:00
ccebd98735
feat(flutter): empty-state copy mirrors web design-system voice
bvandeusen and Claude Opus 4.7
2026-05-09 16:06:58 -04:00
231f1ddf9a
test(flutter/theme): cover .dark()/.light() factories + back-compat alias
bvandeusen and Claude Opus 4.7
2026-05-09 15:50:51 -04:00
143130eaae
feat(flutter/settings): Appearance section with System/Light/Dark picker
bvandeusen and Claude Opus 4.7
2026-05-09 15:50:29 -04:00
56f0557d94
feat(flutter): MinstrelApp watches themeMode + offers darkTheme
bvandeusen and Claude Opus 4.7
2026-05-09 15:47:41 -04:00
6dc488652e
feat(flutter/theme): themeModeProvider with secure-storage persistence
bvandeusen and Claude Opus 4.7
2026-05-09 15:47:00 -04:00
caa19f2d91
feat(flutter/theme): buildDarkTheme + buildLightTheme
bvandeusen and Claude Opus 4.7
2026-05-09 15:46:37 -04:00
66ddd3c366
feat(flutter/theme): FabledSwordTheme.dark() + .light() factories
bvandeusen and Claude Opus 4.7
2026-05-09 15:46:01 -04:00
b1f62a0733
feat(flutter/theme): codegen emits dark + light + flat token classes
bvandeusen and Claude Opus 4.7
2026-05-09 15:45:40 -04:00
25ff7afc33
feat(flutter): TrackRow renders TrackActionsButton by default
bvandeusen and Claude Opus 4.7
2026-05-09 13:43:40 -04:00
c8baaa5329
feat(flutter): wire TrackActionsButton into 4 surfaces
bvandeusen and Claude Opus 4.7
2026-05-09 13:43:12 -04:00
36006d703d
feat(flutter/track-actions): AddToPlaylistSheet picker
bvandeusen and Claude Opus 4.7
2026-05-09 13:42:19 -04:00
2944288050
feat(flutter/track-actions): HideTrackSheet for reason + notes pick
bvandeusen and Claude Opus 4.7
2026-05-09 13:41:48 -04:00
5f239f05a5
feat(flutter/track-actions): TrackActionsButton + TrackActionsSheet
bvandeusen and Claude Opus 4.7
2026-05-09 13:41:16 -04:00
2499449c0b
feat(flutter/player): playNext + enqueue + PlaylistsApi.appendTracks
bvandeusen and Claude Opus 4.7
2026-05-09 13:40:17 -04:00
5159bcd3f4
feat(flutter/quarantine): MyQuarantineController + provider
bvandeusen and Claude Opus 4.7
2026-05-09 13:39:32 -04:00
fdaa1a0472
feat(flutter/api): QuarantineApi for flag/unflag
bvandeusen and Claude Opus 4.7
2026-05-09 13:38:52 -04:00
534dafb044
feat(flutter/player): set MediaItem.artUri from local cover cache
bvandeusen and Claude Opus 4.7
2026-05-09 12:54:47 -04:00
d70075c426
feat(flutter/player): albumCoverCacheProvider + pass cache through configure
bvandeusen and Claude Opus 4.7
2026-05-09 12:54:05 -04:00
b6d6f22598
feat(flutter/player): AlbumCoverCache for lock-screen artwork
bvandeusen and Claude Opus 4.7
2026-05-09 12:53:20 -04:00
78ad8a31e7
chore(flutter): promote path_provider to direct dep
bvandeusen and Claude Opus 4.7
2026-05-09 12:52:44 -04:00
d3a05520d3
fix(flutter): clear analyze --fatal-infos issues
bvandeusen and Claude Opus 4.7
2026-05-09 12:05:02 -04:00
17ff69780d
test(flutter/home): cover new home parity layout
bvandeusen and Claude Opus 4.7
2026-05-09 11:40:46 -04:00
a2f6bdb44f
feat(flutter/home): mirror web home structurally
bvandeusen and Claude Opus 4.7
2026-05-09 11:40:12 -04:00
8fb82d473d
feat(flutter/widgets): HorizontalScrollRow skips header when title empty
bvandeusen and Claude Opus 4.7
2026-05-09 11:38:57 -04:00
a7fcafadda
feat(flutter): DelayedLoading wrapper for skeleton-with-delay
bvandeusen and Claude Opus 4.7
2026-05-09 11:38:42 -04:00
3ac8cc9363
feat(flutter/widgets): PlaylistCard + PlaylistPlaceholderCard
bvandeusen and Claude Opus 4.7
2026-05-09 11:38:19 -04:00
dccdb00bce
feat(flutter/widgets): CompactTrackCard for dense home Most-played row
bvandeusen and Claude Opus 4.7
2026-05-09 11:37:40 -04:00
078520f504
feat(flutter): systemPlaylistsStatusProvider
bvandeusen and Claude Opus 4.7
2026-05-09 11:36:29 -04:00
d872a30506
feat(flutter): SystemPlaylistsStatus model + endpoint method
bvandeusen and Claude Opus 4.7
2026-05-09 11:36:15 -04:00