This website requires JavaScript.
95d68e3d3d
feat: M3.5 polish — genre splitting + radio button surface
bvandeusen and Claude Opus 4.7
2026-04-27 23:50:00 -04:00
b7a59a9473
fix(web): SearchInput passes keepFocus to goto() to prevent blur on debounce
bvandeusen
2026-04-27 23:37:21 -04:00
693135896e
fix(web): SearchInput keeps focus across debounced URL updates
bvandeusen and Claude Opus 4.7
2026-04-27 23:25:30 -04:00
ed18622291
Merge pull request 'feat: M3 session similarity + contextual_match_score (closes M3)' (#23 ) from dev into main
bvandeusen
2026-04-28 03:02:27 +00:00
ad56eb279f
style(recommendation): drop trailing comments that gofmt-1.23 wants aligned
bvandeusen
2026-04-27 22:41:24 -04:00
22622f3065
test(api): end-to-end contextual ranking test for /api/radio
bvandeusen and Claude Sonnet 4.6
2026-04-27 21:20:01 -04:00
284271c190
feat(api): radio handler reads current session vector + threads ContextWeight
bvandeusen
2026-04-27 20:55:25 -04:00
541698a8b1
test(recommendation): check LoadCandidates errors in new contextual tests
bvandeusen and Claude Opus 4.7
2026-04-27 20:51:55 -04:00
5b79aa1047
feat(recommendation): LoadCandidates computes per-candidate ContextualMatchScore
bvandeusen and Claude Sonnet 4.6
2026-04-27 20:41:55 -04:00
cb46b3830f
feat(db): add similarity lookup queries (ListActiveContextualLikesForUser, GetCurrentSessionVectorForUser)
bvandeusen
2026-04-27 20:36:42 -04:00
49871ba06d
feat(recommendation): extend Score with ContextualMatchScore + ContextWeight
bvandeusen
2026-04-27 20:31:54 -04:00
347884bc2b
feat(recommendation): add ContextualMatchScore (max over non-seed likes)
bvandeusen
2026-04-27 20:20:53 -04:00
a7211aacff
feat(recommendation): add pure Similarity function with weighted Jaccard
bvandeusen
2026-04-27 20:04:35 -04:00
00483539ad
docs(plan): add M3 session similarity implementation plan
bvandeusen and Claude Opus 4.7
2026-04-27 19:57:18 -04:00
20963847c2
docs(spec): add M3 session similarity + contextual_match_score design
bvandeusen and Claude Opus 4.7
2026-04-27 19:57:10 -04:00
96ec5a6061
Merge pull request 'feat: M3 session vectors + contextual_likes capture' (#22 ) from dev into main
bvandeusen
2026-04-27 23:56:23 +00:00
bf7c5ad47d
feat(subsonic): wire contextual_likes capture/soft-delete into star/unstar
bvandeusen
2026-04-27 11:25:10 -04:00
fe1cc46752
feat(api): capture contextual_likes on like during open play_event
bvandeusen
2026-04-27 11:22:35 -04:00
d6acb3b63c
feat(playevents): persist session_vector_at_play on every record path
bvandeusen
2026-04-27 11:19:16 -04:00
627b7d1be5
feat(recommendation): add BuildSessionVector pure function
bvandeusen
2026-04-27 11:17:11 -04:00
d43d8df6d5
feat(db): add session-vector capture queries; LikeTrack returns row count
bvandeusen
2026-04-27 11:16:05 -04:00
92ef53c04d
feat(db): add contextual_likes table (M3 session-context capture)
bvandeusen
2026-04-27 11:13:31 -04:00
ad22581ede
Merge pull request 'feat: M3 weighted shuffle v1 — real /api/radio with scoring' (#21 ) from dev into main
bvandeusen
2026-04-27 15:00:25 +00:00
38beadf22e
docs(plan): add M3 session vectors + contextual likes implementation plan
bvandeusen
2026-04-27 10:05:52 -04:00
08eb1e3f8c
docs(spec): add M3 session vectors + contextual likes design
bvandeusen
2026-04-27 09:56:45 -04:00
08591debee
feat(api): rewrite /api/radio with weighted shuffle v1
bvandeusen
2026-04-27 08:08:10 -04:00
9426dc2eeb
feat(config): add recommendation section (weighted shuffle weights)
bvandeusen
2026-04-27 08:04:23 -04:00
b513c91520
feat(recommendation): add LoadCandidates DB-backed loader
bvandeusen
2026-04-27 08:03:20 -04:00
3ef560e414
feat(db): add LoadRadioCandidates query
bvandeusen
2026-04-27 08:01:50 -04:00
8c3d06c0a1
feat(recommendation): add Shuffle orchestrator
bvandeusen
2026-04-27 07:39:16 -04:00
546234187f
feat(recommendation): add pure Score function with recency + skip + jitter
bvandeusen
2026-04-27 07:38:07 -04:00
b9937d6e3b
docs(plan): add M3 weighted shuffle v1 implementation plan
bvandeusen
2026-04-27 07:35:13 -04:00
f51b7c05ae
docs(spec): add M3 weighted shuffle v1 design
bvandeusen
2026-04-27 01:35:51 -04:00
1074f266ad
Merge pull request 'feat: M2 likes — full track/album/artist starring (closes M2)' (#20 ) from dev into main
bvandeusen
2026-04-27 03:53:40 +00:00
1f08ee39bd
fix(web): add likes/QueryClient mocks to route tests rendering LikeButton
bvandeusen
2026-04-26 17:18:39 -04:00
457b94005f
feat(web): add /library/liked page with three sections
bvandeusen
2026-04-26 17:08:06 -04:00
de5320a7b4
feat(web): wire LikeButton into TrackRow, AlbumCard, ArtistRow, PlayerBar
bvandeusen
2026-04-26 16:56:07 -04:00
6ab1fef07e
feat(web): add LikeButton component
bvandeusen
2026-04-26 16:47:51 -04:00
dd2b9318a0
feat(web): add likes TanStack Query helpers + mutations
bvandeusen and Claude Opus 4.7
2026-04-26 16:46:39 -04:00
c7f4adbcc3
feat(subsonic): add getStarred and getStarred2 handlers
bvandeusen
2026-04-26 16:45:04 -04:00
32fb3fec20
feat(subsonic): add /rest/star and /rest/unstar handlers
bvandeusen
2026-04-26 16:43:20 -04:00
61d96bb288
feat(api): add /api/likes/{tracks,albums,artists} endpoints
bvandeusen
2026-04-26 16:23:04 -04:00
780beaa248
feat(db): add M2 likes schema (general_likes, _albums, _artists)
bvandeusen
2026-04-26 16:20:08 -04:00
a3c05aeb34
docs(plan): add M2 likes implementation plan
bvandeusen
2026-04-26 15:52:42 -04:00
f91257a79e
docs(spec): add M2 likes sub-plan design
bvandeusen
2026-04-26 15:44:45 -04:00
e7896318b4
Merge pull request 'feat: player + search + M2 events foundation' (#19 ) from dev into main
bvandeusen
2026-04-26 15:51:52 +00:00
6ff00ea24d
feat(web): mount useEventsDispatcher() in root layout
bvandeusen
2026-04-26 09:44:16 -04:00
b6f8a0c390
feat(web): events dispatcher posts to /api/events on player transitions
bvandeusen
2026-04-26 09:42:11 -04:00
599a19f780
feat(subsonic): wire /rest/scrobble into playevents.Writer
bvandeusen
2026-04-26 00:23:20 -04:00
f4e73b81b4
feat(api): add POST /api/events handler
bvandeusen
2026-04-26 00:12:06 -04:00
0c7e1b0408
feat(playevents): add Writer with start/end/skipped/synthetic paths
bvandeusen
2026-04-25 22:32:33 -04:00
73d3962fff
feat(playsessions): add FindOrCreate session service (30-min rolling window)
bvandeusen
2026-04-25 22:30:12 -04:00
722a6784a7
feat(config): add events section (session timeout + skip rule thresholds)
bvandeusen
2026-04-25 20:46:23 -04:00
4fcf2c9616
feat(db): add M2 schema — play_sessions, play_events, skip_events
bvandeusen
2026-04-25 20:45:44 -04:00
7df48ee9bc
docs(plan): add M2 events sub-plan implementation plan
bvandeusen
2026-04-25 19:56:58 -04:00
f3b28db9d1
docs(spec): add M2 events sub-plan design
bvandeusen
2026-04-25 19:39:16 -04:00
7fff293054
feat(web): add three search overflow pages
bvandeusen
2026-04-25 16:19:09 -04:00
e55520dab6
feat(web): /search page with three sections + see-all overflow links
bvandeusen
2026-04-25 16:16:55 -04:00
ad9c984b62
feat(web): mount SearchInput in Shell header
bvandeusen
2026-04-25 16:12:19 -04:00
3be0dc241c
feat(web): add SearchSkeleton placeholder for the search page
bvandeusen
2026-04-25 16:12:19 -04:00
251d165e0b
feat(web): add SearchInput header component (debounced URL sync)
bvandeusen
2026-04-25 16:01:25 -04:00
a4a5a20308
feat(web): AlbumCard + queue overlay button
bvandeusen
2026-04-25 15:54:18 -04:00
80b39f1713
feat(web): TrackRow div+role button with onPlay prop and + queue button
bvandeusen
2026-04-25 15:37:11 -04:00
7eb051c6f7
feat(web): add search query helpers (summary + 3 facet infinite queries)
bvandeusen
2026-04-25 15:30:06 -04:00
7dd77a4723
feat(web): add enqueueTrack, enqueueTracks, playRadio to player store
bvandeusen
2026-04-25 15:22:03 -04:00
8e80b6e0de
feat(web): add SearchResponse and RadioResponse types
bvandeusen
2026-04-25 15:02:56 -04:00
1e66910823
feat(api): add /api/radio stub returning the seed track only
bvandeusen
2026-04-25 15:01:39 -04:00
8fd193e186
docs(plan): add web UI search implementation plan
bvandeusen
2026-04-25 14:59:08 -04:00
3588af83e5
docs(spec): add web UI search design
bvandeusen
2026-04-25 14:49:01 -04:00
4264ecf538
fix(web): trigger audio.play() during 'loading' state, not only 'playing'
bvandeusen
2026-04-24 22:12:34 -04:00
571eb2ec53
feat(web): mount <audio> at root layout and wire it to the player store
bvandeusen
2026-04-24 21:43:03 -04:00
ccef9be2d3
feat(web): add PlayerBar slot to Shell
bvandeusen
2026-04-24 21:42:10 -04:00
ed082226a0
feat(web): add PlayerBar component
bvandeusen
2026-04-24 21:41:24 -04:00
4bff8cc99a
feat(web): make TrackRow click-to-play; pass tracks+index from album page
bvandeusen and Claude Opus 4.7
2026-04-24 21:39:34 -04:00
4189ef9899
feat(web): add MediaSession glue for OS media controls
bvandeusen
2026-04-24 21:03:01 -04:00
1476d5081b
feat(web): add shuffle, repeat, and audio-event reporting to player store
bvandeusen
2026-04-24 17:56:00 -04:00
431f333e41
feat(web): add player rune store with basic actions
bvandeusen
2026-04-24 17:54:07 -04:00
7c19fe8a6a
docs(plan): add web UI player implementation plan
bvandeusen and Claude Opus 4.7
2026-04-24 08:57:52 -04:00
d6ea734152
docs(spec): add web UI player design
bvandeusen and Claude Opus 4.7
2026-04-24 08:50:58 -04:00
3ee1295e99
Merge pull request 'feat: web UI library views — artists / artist detail / album detail' (#18 ) from dev into main
bvandeusen
2026-04-24 02:05:23 +00:00
9b67bb7521
fix(web): restore album-page back link; loosen test matchers
bvandeusen and Claude Opus 4.7
2026-04-23 20:52:28 -04:00
9d28c9d9de
feat(web): add album detail page at /albums/:id
bvandeusen
2026-04-23 20:21:50 -04:00
f9b02c4051
docs(plan): Task 13 — match the type-safety fixes applied in Task 12
bvandeusen and Claude Opus 4.7
2026-04-23 20:13:20 -04:00
2e49335aab
feat(web): add artist detail page at /artists/:id
bvandeusen
2026-04-23 20:12:57 -04:00
25d44a180c
docs(plan): update Tasks 12/13 to unwrap TanStack Query's Readable store
bvandeusen and Claude Opus 4.7
2026-04-23 20:01:46 -04:00
5174b093b9
feat(web): replace / placeholder with real artists list
bvandeusen
2026-04-23 19:43:37 -04:00
f94bf26f02
feat(web): add ApiErrorBanner retry-capable error card
bvandeusen
2026-04-23 18:42:22 -04:00
9ed8e261d4
feat(web): add LibrarySkeleton with list/grid/album variants
bvandeusen
2026-04-23 18:41:32 -04:00
12d1cb739b
feat(web): add TrackRow component
bvandeusen
2026-04-23 18:40:40 -04:00
e9b482da0c
feat(web): add AlbumCard component
bvandeusen
2026-04-23 18:39:42 -04:00
a1252c1ef4
feat(web): add ArtistRow component
bvandeusen
2026-04-23 18:18:52 -04:00
ce6b79ec95
feat(web): add TanStack Query helpers for library endpoints
bvandeusen
2026-04-23 18:17:34 -04:00
4cd67405c9
docs(plan): update useDelayed task to match .svelte.test.ts convention
bvandeusen and Claude Opus 4.7
2026-04-23 18:16:37 -04:00
19d74d00d6
refactor(web): drop useDelayed sync-timeout hack; fix test timing instead
bvandeusen and Claude Opus 4.7
2026-04-23 18:16:22 -04:00
6ca877b3ad
feat(web): add useDelayed rune helper
bvandeusen
2026-04-23 17:23:23 -04:00
828273a78f
feat(web): add cover URL helper + fallback SVG data URL
bvandeusen
2026-04-23 08:23:59 -04:00
7345625ecd
feat(web): add formatDuration helper
bvandeusen
2026-04-23 08:23:22 -04:00
d15995d19e
feat(web): add library API types mirroring internal/api/types.go
bvandeusen
2026-04-23 08:22:33 -04:00
ea17be9d45
docs(plan): add web UI library views implementation plan
bvandeusen and Claude Opus 4.7
2026-04-23 08:18:08 -04:00
248f03495e
docs(spec): add web UI library views design
bvandeusen and Claude Opus 4.7
2026-04-23 08:09:55 -04:00