This website requires JavaScript.
bb3c5d7649
Merge pull request 'feat: web UI auth — login page, session store, Shell, TanStack Query' (#17 ) from dev into main
bvandeusen
2026-04-23 11:22:52 +00:00
048663a4c8
feat(web): wire root layout — bootstrap, guard, Shell, QueryProvider
bvandeusen
2026-04-23 06:11:43 -04:00
fe410f14eb
docs(plan): correct login test filename to avoid route walker collision
bvandeusen and Claude Opus 4.7
2026-04-23 06:10:29 -04:00
88961596b1
fix(web): rename route-colocated test to avoid +page.* collision
bvandeusen and Claude Opus 4.7
2026-04-23 06:10:11 -04:00
78f69b8736
feat(web): add login page with returnTo support and typed error UX
bvandeusen
2026-04-23 02:41:44 -04:00
d2d5d18e74
feat(web): add Library/Search/Playlists placeholder pages
bvandeusen
2026-04-22 22:22:11 -04:00
e1504f8e6c
feat(web): add Shell component with header, sidebar, and user menu
bvandeusen
2026-04-22 22:20:18 -04:00
7a6aa50693
feat(web): auto-logout on 401 inside apiFetch
bvandeusen
2026-04-22 17:29:36 -04:00
07b5912fae
feat(web): add rune-based auth store with bootstrap/login/logout
bvandeusen
2026-04-22 17:28:10 -04:00
12bf873f39
docs(plan): fix invalid toMatchObject<T> type-arg in auth plan
bvandeusen and Claude Opus 4.7
2026-04-22 17:26:37 -04:00
8a6a496c67
fix(web): drop invalid type-arg on toMatchObject in client tests
bvandeusen and Claude Opus 4.7
2026-04-22 17:26:15 -04:00
4591618e7b
feat(web): add TanStack Query client singleton
bvandeusen
2026-04-22 16:20:31 -04:00
37e5539e5a
feat(web): add api.{get,post,del} typed facade over apiFetch
bvandeusen
2026-04-22 16:04:25 -04:00
4d1a7f8b93
feat(web): add apiFetch with typed error envelope
bvandeusen
2026-04-22 15:56:15 -04:00
e31242b57f
feat(web): add api client types (User, LoginResponse, ApiError)
bvandeusen
2026-04-22 15:55:00 -04:00
d0015d3638
build(web): add TanStack Query + Testing Library deps
bvandeusen
2026-04-22 15:51:35 -04:00
0b5c4a13bf
docs(plan): add web UI auth implementation plan
bvandeusen and Claude Opus 4.7
2026-04-22 15:47:23 -04:00
d53e7e2985
docs(spec): add web UI auth design
bvandeusen and Claude Opus 4.7
2026-04-22 15:40:07 -04:00
5e4c45932c
Merge pull request 'feat: web UI scaffold with embedded SPA and multi-stage Docker build' (#16 ) from dev into main
bvandeusen
2026-04-22 18:23:01 +00:00
207798b667
docs: document two-process dev workflow with Vite proxy
bvandeusen and Claude Opus 4.7
2026-04-22 12:59:22 -04:00
0ee4dfcf42
ci: install Node + build web before Go steps
bvandeusen and Claude Opus 4.7
2026-04-22 12:59:07 -04:00
d9f55df347
build: multi-stage Dockerfile with node->go->slim for embedded SPA
bvandeusen and Claude Opus 4.7
2026-04-22 12:58:29 -04:00
75ce65c80e
feat(server): serve embedded SPA at root with /api,/rest carve-out
bvandeusen
2026-04-22 10:31:30 -04:00
8fe4a5f578
refactor(web): move embed package to web/ so go:embed reaches build/
bvandeusen
2026-04-22 10:29:31 -04:00
d5692a73ca
feat(web): embed SvelteKit build output with SPA fallback handler
bvandeusen and Claude Sonnet 4.6
2026-04-22 10:26:36 -04:00
8d88a76dbf
test(web): add Vitest smoke test and jsdom config
bvandeusen
2026-04-22 09:30:08 -04:00
86b024dc47
feat(web): scaffold SvelteKit SPA with Tailwind + adapter-static
bvandeusen
2026-04-22 09:26:36 -04:00
feb3f5bbd8
Merge pull request 'feat: /api/* library reads, search, and media endpoints' (#15 ) from dev into main
bvandeusen
2026-04-22 03:02:28 +00:00
8600b253fd
style: gofmt fixes across api package
bvandeusen and Claude Opus 4.7
2026-04-21 23:02:20 -04:00
63d3e234d9
feat(api): register cover + stream routes under RequireUser
bvandeusen
2026-04-21 22:48:45 -04:00
3656461b20
feat(api): GET /api/tracks/{id}/stream with Range support
bvandeusen and Claude Opus 4.7
2026-04-21 22:44:48 -04:00
945b773cbd
feat(api): GET /api/albums/{id}/cover with sidecar fallback
bvandeusen
2026-04-21 22:37:53 -04:00
5af6d7fac6
docs(api): document intentional audioContentType divergence from subsonic
bvandeusen
2026-04-21 22:35:29 -04:00
c799e5c1c9
feat(api): scaffold media helpers for cover + stream endpoints
bvandeusen
2026-04-21 22:30:25 -04:00
8da51a1d13
docs: add Plan 3 web UI media endpoints implementation plan
bvandeusen and Claude Opus 4.7
2026-04-21 22:02:55 -04:00
20c948a346
docs: clarify sidecar ordering and test helper extension in Plan 3 spec
bvandeusen and Claude Opus 4.7
2026-04-21 21:52:07 -04:00
7fcee05c1e
docs: add Plan 3 web UI media endpoints spec
bvandeusen and Claude Opus 4.7
2026-04-21 21:51:29 -04:00
b94b7514f9
fix(api): clamp negative offset instead of erroring + clarify duration_sec=0
bvandeusen and Claude Opus 4.7
2026-04-21 19:27:21 -04:00
db2ee3b21f
feat(api): register library + search routes under RequireUser
bvandeusen
2026-04-21 08:34:12 -04:00
683c11661b
feat(api): GET /api/search with three paged facets
bvandeusen and Claude Sonnet 4.6
2026-04-21 08:29:28 -04:00
8fb2f4e184
feat(api): GET /api/artists with alpha/newest sort and paging
bvandeusen and Claude Sonnet 4.6
2026-04-21 08:06:03 -04:00
f37fd782af
feat(api): GET /api/artists/{id} with nested albums
bvandeusen
2026-04-21 08:01:25 -04:00
c0487ecddb
feat(api): GET /api/albums/{id} with nested tracks
bvandeusen and Claude Sonnet 4.6
2026-04-21 07:43:39 -04:00
8c18e44d5b
feat(api): GET /api/tracks/{id} handler with parent metadata
bvandeusen and Claude Sonnet 4.6
2026-04-21 07:12:11 -04:00
98b4755b49
test(api): add library seed fixtures
bvandeusen
2026-04-21 00:16:24 -04:00
3855166a09
feat(api): add dbq→ref projection helpers
bvandeusen
2026-04-21 00:13:06 -04:00
e43b6f2761
feat(api): add conversion helpers for library DTOs
bvandeusen
2026-04-21 00:09:30 -04:00
c5af7bb53a
feat(api): add DTOs for library reads and search
bvandeusen
2026-04-21 00:04:51 -04:00
fb49a39492
feat(db): add paged + count queries for library reads
bvandeusen
2026-04-21 00:01:15 -04:00
62e48642e2
docs(plan): add implementation plan for library reads + search
bvandeusen and Claude Opus 4.7
2026-04-20 23:42:47 -04:00
14aa9d7fba
docs(spec): add design for library reads + search endpoints
bvandeusen and Claude Opus 4.7
2026-04-20 23:33:51 -04:00
728c852ba1
Merge pull request 'feat: web UI server auth foundation (/api/* login, logout, me)' (#14 ) from dev into main
bvandeusen
2026-04-21 02:51:45 +00:00
2324c5d576
fix(auth): silence unused-parameter lint in RequireUser test
bvandeusen and Claude Opus 4.7
2026-04-20 22:43:22 -04:00
1e5c8b5ab7
fix(api): trim whitespace from bearer token in logout
bvandeusen and Claude Opus 4.7
2026-04-20 22:32:12 -04:00
06a1fe16e0
feat(server): mount /api/* (login, logout, me)
bvandeusen and Claude Opus 4.7
2026-04-20 22:19:59 -04:00
2adf41604f
feat(api): GET /api/me
bvandeusen and Claude Opus 4.7
2026-04-20 22:11:02 -04:00
8537821d29
feat(api): POST /api/auth/logout
bvandeusen and Claude Opus 4.7
2026-04-20 22:07:16 -04:00
2f2dfa86df
feat(api): POST /api/auth/login
bvandeusen and Claude Opus 4.7
2026-04-20 21:25:52 -04:00
dc43921bcc
feat(api): package skeleton + error envelope
bvandeusen and Claude Opus 4.7
2026-04-20 20:57:09 -04:00
8cdaf8f0f1
feat(auth): RequireUser middleware (cookie or bearer)
bvandeusen and Claude Opus 4.7
2026-04-20 20:53:11 -04:00
ff4d443269
feat(auth): session token + password verification helpers
bvandeusen and Claude Opus 4.7
2026-04-20 20:24:09 -04:00
c8a4a930ea
feat(dbq): generate session queries
bvandeusen and Claude Opus 4.7
2026-04-20 20:15:45 -04:00
1741b57a0b
feat(db): add sessions table for /api/* auth
bvandeusen and Claude Opus 4.7
2026-04-20 19:37:26 -04:00
9b0433ad9b
docs: add web UI server auth foundation plan
bvandeusen and Claude Opus 4.7
2026-04-20 19:30:24 -04:00
cb3df51f08
docs: add web UI scaffold design spec
bvandeusen and Claude Opus 4.7
2026-04-20 19:18:04 -04:00
cd535b9de6
Merge pull request 'feat(library): extract track duration via ffprobe' (#13 ) from dev into main
bvandeusen
2026-04-20 12:11:09 +00:00
4a9193bc52
feat(library): extract track duration via ffprobe
bvandeusen and Claude Opus 4.7
2026-04-20 08:02:37 -04:00
be92087ba1
Merge pull request 'fix(library): drop out-of-range release years instead of failing the album' (#12 ) from dev into main
bvandeusen
2026-04-20 04:22:18 +00:00
dcd19c0143
fix(library): drop out-of-range years instead of failing the album
bvandeusen and Claude Opus 4.7
2026-04-20 00:14:51 -04:00
22bf7a70f2
Merge pull request 'feat(subsonic): getUser + envelope-shaped 404 for /rest/*' (#11 ) from dev into main
bvandeusen
2026-04-20 03:13:39 +00:00
dfcdf4d3ca
feat(subsonic): getUser + envelope-shaped 404 for /rest/*
bvandeusen and Claude Opus 4.7
2026-04-19 21:56:31 -04:00
5318f9b8dc
Merge pull request 'fix(auth): subsonic_password on bootstrap + dev compose defaults' (#10 ) from dev into main
bvandeusen
2026-04-19 23:07:13 +00:00
64582b21e3
fix(auth): set subsonic_password on admin bootstrap
bvandeusen and Claude Opus 4.7
2026-04-19 18:30:54 -04:00
e6b84190e7
chore(compose): bake in dev mount + scan defaults
bvandeusen and Claude Opus 4.7
2026-04-19 18:12:13 -04:00
f49d672b5f
Merge pull request 'feat(subsonic): stream/download/getCoverArt/scrobble (#296 )' (#9 ) from dev into main
bvandeusen
2026-04-19 19:33:10 +00:00
3c95740ebe
feat(subsonic): emit coverArt id unconditionally (#296 )
bvandeusen
2026-04-19 19:28:30 +00:00
547adb74ac
feat(subsonic): register media handlers (#296 )
bvandeusen
2026-04-19 19:27:15 +00:00
eb776bdaa2
test(subsonic): cover stream helpers (#296 )
bvandeusen
2026-04-19 19:26:59 +00:00
0760b48037
feat(subsonic): add stream/download/getCoverArt/scrobble (#296 )
bvandeusen
2026-04-19 19:26:39 +00:00
6637bbfdaf
Merge pull request 'feat(subsonic): browse endpoints — getArtists/getAlbum/search3/… (#295 )' (#8 ) from dev into main
bvandeusen
2026-04-19 19:13:12 +00:00
9997781ab8
test(subsonic): cover browse type helpers (#295 )
bvandeusen
2026-04-19 19:08:38 +00:00
d982bcb2ff
test(subsonic): pin getMusicFolders wire shape (#295 )
bvandeusen
2026-04-19 19:08:18 +00:00
ca92cec159
feat(subsonic): register browse endpoints (#295 )
bvandeusen
2026-04-19 19:08:08 +00:00
252428a104
feat(subsonic): add browse handlers (#295 )
bvandeusen
2026-04-19 19:07:50 +00:00
71e8849dca
subsonic: browse response shapes and conversion helpers (#295 )
bvandeusen
2026-04-19 19:05:03 +00:00
f8249a12ac
sqlc generate for CountTracksByAlbum and SearchTracks (#295 )
bvandeusen
2026-04-19 19:03:59 +00:00
f3a80347c1
sqlc generate for SearchArtists (#295 )
bvandeusen
2026-04-19 19:03:30 +00:00
319ef06a4f
sqlc generate for album browse queries (#295 )
bvandeusen
2026-04-19 19:03:10 +00:00
acd2c7f034
sqlc: add CountTracksByAlbum and SearchTracks for Subsonic browse (#295 )
bvandeusen
2026-04-19 19:02:27 +00:00
97eb91f50b
sqlc: add SearchArtists for Subsonic search3 (#295 )
bvandeusen
2026-04-19 19:02:14 +00:00
a498d20021
sqlc: add album listing/search queries for Subsonic browse (#295 )
bvandeusen
2026-04-19 19:02:03 +00:00
b6f7c894fb
Merge pull request 'feat(subsonic): auth + envelope + ping.view + getLicense.view (Fable #294 )' (#7 ) from dev into main
bvandeusen
2026-04-19 18:10:12 +00:00
98818fe28c
fix(subsonic): check fmt.Fprintf return (errcheck lint)
bvandeusen
2026-04-19 18:07:36 +00:00
02e867ce94
docs: refresh config.example.yaml with auth/library/subsonic sections
bvandeusen
2026-04-19 17:40:36 +00:00
9f325cf309
feat(cmd): plumb SubsonicConfig into server.New
bvandeusen
2026-04-19 17:40:24 +00:00
644af30a86
test(server): update New() call for new Subsonic arg
bvandeusen
2026-04-19 17:40:10 +00:00
5288e9d5df
feat(server): wire subsonic.Mount under /rest
bvandeusen
2026-04-19 17:40:05 +00:00
f8b0d78544
test(config): subsonic env override
bvandeusen
2026-04-19 17:39:48 +00:00
e649ad2f66
feat(config): subsonic.allow_plaintext_password
bvandeusen
2026-04-19 17:39:30 +00:00
841a3d8165
test(subsonic): decodePassword + md5(password+salt) derivation
bvandeusen
2026-04-19 17:39:12 +00:00