Commit Graph

  • 8a12b8c571 feat(web): add /discover route with search + request flow bvandeusen 2026-04-29 22:15:52 -04:00
  • d27b381250 feat(web): add StatusPill semantic-color status indicator bvandeusen 2026-04-29 22:08:09 -04:00
  • dcb49e9687 fix(web): a11y on DiscoverResultCard + drop test-only inline styles bvandeusen 2026-04-29 21:05:27 -04:00
  • c8bd19d6f1 feat(web): add DiscoverResultCard with reserved badge slot + anchored button bvandeusen 2026-04-29 20:27:58 -04:00
  • ce7424219c feat(web): adminRequests cache key + staleTime polish bvandeusen 2026-04-29 20:04:51 -04:00
  • d7eaa189e2 feat(web): add API client modules for Lidarr, requests, admin bvandeusen 2026-04-29 19:53:04 -04:00
  • 29968ae8da feat(web): wire Tailwind fontFamily to FS font tokens bvandeusen 2026-04-29 19:42:53 -04:00
  • a7090c3768 feat(web): introduce FabledSword design system tokens + Tailwind aliases bvandeusen 2026-04-29 18:48:20 -04:00
  • d1c1853d49 fix(auth): silence revive unused-parameter on stub test handlers bvandeusen 2026-04-29 17:58:32 -04:00
  • 1bde1787b9 feat(cmd): start Lidarr reconciler worker alongside HTTP server bvandeusen 2026-04-29 17:57:42 -04:00
  • 82ffb12f68 feat(api): add /api/admin/requests approval queue bvandeusen 2026-04-29 17:56:25 -04:00
  • 6fcae8dee4 feat(api): add /api/admin/lidarr/* config + profiles + folders + test bvandeusen 2026-04-29 17:44:54 -04:00
  • 03cbd4d0c1 feat(api): add /api/requests user-facing CRUD bvandeusen 2026-04-29 17:40:49 -04:00
  • 9192eb9f0a fix(api): gofmt + revive cleanup on lidarr search handler bvandeusen 2026-04-29 17:35:45 -04:00
  • 905e27a988 feat(api): add /api/lidarr/search proxy with library/request enrichment bvandeusen 2026-04-29 17:35:00 -04:00
  • 4492826354 feat(auth): add RequireAdmin middleware for /api/admin/* routes bvandeusen 2026-04-29 17:27:47 -04:00
  • f73a5ccef5 feat(lidarrrequests): add Reconciler worker matching approved requests to library bvandeusen 2026-04-29 17:17:32 -04:00
  • b11fc117e7 feat(lidarrrequests): request lifecycle service (create/list/approve/reject/cancel) bvandeusen 2026-04-29 17:12:03 -04:00
  • 429b75131b feat(lidarrconfig): typed singleton config wrapper bvandeusen 2026-04-29 16:29:22 -04:00
  • ebff8f69a0 fix(lidarr): address review findings on HTTP client bvandeusen 2026-04-29 16:26:23 -04:00
  • a43fa09a04 feat(lidarr): typed HTTP client for v1 API (lookup, add, profiles, ping) bvandeusen 2026-04-29 15:25:10 -04:00
  • a5bb79f2a8 fix(db): clarify lidarr_requests query semantics bvandeusen 2026-04-29 15:19:54 -04:00
  • 9ceac5c639 feat(db): add lidarr_config + lidarr_requests schema (migration 0010) bvandeusen 2026-04-29 15:10:01 -04:00
  • d77f2d4459 docs(plan): add M5a Lidarr connection + search/add implementation plan bvandeusen 2026-04-29 15:01:20 -04:00
  • 17406eebee docs(spec): add M5a Lidarr connection + search/add design bvandeusen 2026-04-29 14:25:08 -04:00
  • 2238a8a209 Merge pull request 'test: stop wiping admin user during integration tests' (#29) from dev into main bvandeusen 2026-04-29 16:24:07 +00:00
  • 21310e7716 test: bootstrap test saves/restores non-test users bvandeusen 2026-04-29 12:04:16 -04:00
  • 937a1930ad test: add dbtest.ResetDB helper that preserves admin user bvandeusen 2026-04-29 11:55:06 -04:00
  • 132dddbc37 Merge pull request 'feat: M4c radio similarity-driven candidate pool + 80% queue refresh (closes M4)' (#28) from dev into main bvandeusen 2026-04-29 14:45:17 +00:00
  • d8b955ff0c feat(web): radio queue auto-refreshes at 80% via ?exclude= param bvandeusen 2026-04-29 08:50:24 -04:00
  • 8647f9ebe0 feat(api): radio uses similarity pool with exclude param + M3 fallback bvandeusen 2026-04-29 08:47:31 -04:00
  • b8e3019654 fix(db): split seed_info CTE so similar-artist works without seed genre bvandeusen 2026-04-29 08:43:42 -04:00
  • 51811c9d35 feat(recommendation): add LoadCandidatesFromSimilarity (5-source candidate pool) bvandeusen 2026-04-29 08:30:53 -04:00
  • bb3f911761 feat(recommendation): extend Score with SimilarityScore + SimilarityWeight bvandeusen 2026-04-29 08:01:53 -04:00
  • 362cb2c9ce feat(db): add LoadRadioCandidatesV2 sqlc query (5-way UNION) bvandeusen 2026-04-29 07:56:57 -04:00
  • 2e6d2ffd03 docs(plan): add M4c radio similarity-driven candidate pool plan bvandeusen 2026-04-29 06:58:22 -04:00
  • 267c4ad80b docs(spec): add M4c radio similarity-driven candidate pool design bvandeusen 2026-04-28 23:02:01 -04:00
  • d9cbf4e434 Merge pull request 'feat: M4b inbound ListenBrainz similarity ingest' (#27) from dev into main bvandeusen 2026-04-29 01:22:37 +00:00
  • 358bfd9453 feat(cmd): start similarity worker alongside HTTP server bvandeusen 2026-04-28 20:25:11 -04:00
  • 893adf04c9 feat(similarity): implement Worker.tickOnce with track + artist passes bvandeusen 2026-04-28 20:06:47 -04:00
  • 9adad094b0 feat(similarity): add Worker skeleton with constructor + Run loop bvandeusen 2026-04-28 20:02:15 -04:00
  • b0d1d6bb46 feat(listenbrainz): add SimilarArtists client method bvandeusen 2026-04-28 20:01:17 -04:00
  • 23d55a868b feat(listenbrainz): add SimilarRecordings client method bvandeusen 2026-04-28 19:59:38 -04:00
  • d4e0e5fae3 feat(db): add similarity sqlc queries (list-needing, get-by-mbids, upsert) bvandeusen 2026-04-28 19:58:05 -04:00
  • fc2d35d33c feat(db): add migration 0009 for similarity (track_similarity + artist_similarity) bvandeusen 2026-04-28 19:57:02 -04:00
  • 9ec9caf667 docs(plan): add M4b ListenBrainz inbound similarity ingest plan bvandeusen 2026-04-28 19:51:57 -04:00
  • 86cb8e5cbf docs(spec): add M4b ListenBrainz inbound similarity ingest design bvandeusen 2026-04-28 19:46:23 -04:00
  • 6b5526788e Merge pull request 'feat: M4a outbound ListenBrainz scrobble worker' (#26) from dev into main bvandeusen 2026-04-28 22:36:57 +00:00
  • 13e12d97ae feat(web): add /settings page with ListenBrainz section bvandeusen 2026-04-28 15:45:42 -04:00
  • 46b23424c2 feat(cmd): start scrobble worker alongside HTTP server bvandeusen 2026-04-28 09:28:13 -04:00
  • 1d1119ac32 feat(api): add GET/PUT /api/me/listenbrainz endpoints bvandeusen 2026-04-28 09:27:06 -04:00
  • 4d123f1b71 feat(playevents): post-commit MaybeEnqueue in RecordPlayEnded + Synthetic bvandeusen 2026-04-28 09:23:21 -04:00
  • 9490bad360 feat(scrobble): add Worker with tickOnce, batched submit, retry/fail/auth handling bvandeusen 2026-04-28 09:20:23 -04:00
  • 8ce39a8868 feat(scrobble): add backoffDelay schedule (1m, 5m, 30m, 2h, 6h, give up) bvandeusen 2026-04-28 09:14:08 -04:00
  • dba1deaad1 feat(scrobble): add MaybeEnqueue with idempotent insert + threshold gate bvandeusen 2026-04-28 09:13:11 -04:00
  • 767e246b73 feat(scrobble): add pure Qualifies threshold function bvandeusen 2026-04-28 09:10:39 -04:00
  • 5359a16091 style(scrobble): rename unused r *http.Request to _ in client tests bvandeusen 2026-04-28 09:09:45 -04:00
  • 3d23f4930c feat(scrobble): add pure ListenBrainz HTTP client with typed errors bvandeusen 2026-04-28 08:45:13 -04:00
  • a0e21f21b6 feat(db): add ListenBrainz user-config and scrobble_queue queries bvandeusen 2026-04-28 08:42:38 -04:00
  • efc2308348 feat(db): add migration 0008 for scrobble (users LB columns + scrobble_queue table) bvandeusen 2026-04-28 08:40:39 -04:00
  • 08b360b67e Merge pull request 'ci: drop push:dev trigger; PR is the gate' (#25) from dev into main bvandeusen 2026-04-28 12:35:52 +00:00
  • a90deab862 docs(plan): add M4a outbound scrobble worker implementation plan bvandeusen 2026-04-28 08:34:26 -04:00
  • 791c6c7fd6 docs(spec): add M4a outbound scrobble worker design bvandeusen 2026-04-28 08:21:43 -04:00
  • 4f67dd6b0a ci: drop push:dev trigger; PR is the gate bvandeusen 2026-04-28 00:05:33 -04:00
  • bda35c73ef Merge pull request 'fix: M3.5 polish — genre splitting, radio button, search focus' (#24) from dev into main bvandeusen 2026-04-28 04:04:13 +00:00
  • 95d68e3d3d feat: M3.5 polish — genre splitting + radio button surface bvandeusen 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 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 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 2026-04-27 20:51:55 -04:00
  • 5b79aa1047 feat(recommendation): LoadCandidates computes per-candidate ContextualMatchScore bvandeusen 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 2026-04-27 19:57:18 -04:00
  • 20963847c2 docs(spec): add M3 session similarity + contextual_match_score design bvandeusen 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