bvandeusen 22ac86f200 feat(web): trim main nav; pair Discover+Requests; move chrome to user menu
The main nav was carrying surfaces that didn't belong on it:

- Search led to an empty page when clicked (you only ever want to land
  there from the global SearchInput typing into /search?q=...). Drop it.
- Requests is downstream of Discover (you discover, then you request).
  Lift both onto a shared horizontal tab strip; keep their URLs so
  bookmarks survive. New DiscoverTabs component used by both pages.
- Settings + Admin are operator chrome, not primary surfaces. Move them
  into the username dropdown alongside Log out, with Admin gated on
  is_admin. Users see Settings + Log out; admins see Settings + Admin
  + Log out.

Final main nav: Home / Artists / Albums / Liked / Discover / Playlists.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 22:23:56 -04:00
2026-04-19 15:14:56 +00:00
2026-04-18 17:33:35 +00:00

Minstrel

Self-hosted music server with OpenSubsonic compatibility plus an extended API for server-side smart shuffle, a dual-like model (general + contextual), session-aware radio, ListenBrainz scrobble/similarity, and Lidarr integration. Go + Postgres, packaged as a Docker container.

State and intelligence belong on the server, not the client.

Specs

Authoritative v1 scope lives under docs/:

  • Server spec — current implementation focus.
  • Client spec — Flutter companion app; work starts once the server reaches its Subsonic-compatible baseline.

Development workflow

  • Day-to-day work happens on the dev branch (or feature branches merged into dev).
  • main is protected — changes land only via pull request from dev.
  • Production builds are cut by tagging a release (v*) off main.

CI / container image

Forgejo Actions handles:

  • Tests on push to dev and on PRs into main.
  • Container image build + push to the Forgejo registry on merge to main (:main) and on v* tags (:<version>).

Task and milestone tracking: Fable (Minstrel project, id 12).

Development

Minstrel has two concurrent dev processes:

  1. Backend: docker compose up — starts Postgres and Minstrel on :4533.
  2. Frontend: cd web && npm install && npm run dev — Vite dev server on :5173 with HMR.

The Vite dev server proxies /api/* and /rest/* to the backend on :4533, so session cookies work correctly when the SPA is loaded from the Vite origin.

Production build

docker build -t minstrel . runs the SvelteKit build inside a node stage, copies the output into the golang stage, and //go:embeds it into the final binary. The resulting container serves the SPA from / alongside the API surfaces. No separate static-file server is required.

S
Description
Self-hosted music server with OpenSubsonic compatibility, server-side smart shuffle, dual-like model, session-aware radio, and Lidarr integration. Go + Postgres.
Readme MIT 63 MiB
Languages
Go 39.2%
Kotlin 25%
Dart 14.2%
TypeScript 12%
Svelte 9.3%
Other 0.1%