bvandeusen 6858e45dbe ci: split test.yml into test-web.yml + test-go.yml, run on dev pushes
Operator wants CI to run on dev pushes (not just PR-to-main) but
path-scoped so Go-only diffs don't run web tests and vice versa. The
old test.yml ran everything on PR-to-main only; the new shape is two
focused workflows that each path-filter their own scope.

- test-web.yml — paths: web/**. Runs npm ci + npm run check + vitest.
  Drops the npm run build step (vitest doesn't need the bundle; the
  go:embed placeholder lives in web/build/index.html and never needs
  the test job to rebuild it).
- test-go.yml — paths: **/*.go, go.mod, go.sum, sqlc.yaml, internal/**,
  cmd/**. Runs go vet + golangci-lint + go test -short -race.

Both trigger on push to dev/main and PR to main. Tag pushes are not
covered — release.yml owns the tag-build path and tests have already
passed by the time a tag lands.

Drops the gomod-detect guard from test.yml — go.mod has been present
since M1 and is required for any Go file to exist anyway.
2026-05-02 23:11:20 -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%