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.
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
devbranch (or feature branches merged intodev). mainis protected — changes land only via pull request fromdev.- Production builds are cut by tagging a release (
v*) offmain.
CI / container image
Forgejo Actions handles:
- Tests on push to
devand on PRs intomain. - Container image build + push to the Forgejo registry on merge to
main(:main) and onv*tags (:<version>).
Task and milestone tracking: Fable (Minstrel project, id 12).
Development
Minstrel has two concurrent dev processes:
- Backend:
docker compose up— starts Postgres and Minstrel on:4533. - Frontend:
cd web && npm install && npm run dev— Vite dev server on:5173with 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.