Contribute to Stackyard
- One container. No extra services, no database.
- No runtime dependencies. The frontend has no framework and no build step.
- Server code is CommonJS. Frontend code is ES modules.
Open an issue first if a change needs a dependency or a build step.
Run locally
Section titled “Run locally”docker build -t stackyard:local .docker run -d -p 8700:80 -v ./data:/data -v ./icons:/icons stackyard:localWithout Docker, start the API with npm start in api/, setting CONFIG_PATH, ICONS_PATH and WIDGETS_PATH=../ui/widgets. Serve ui/ with any server that proxies /api/ and /health to 127.0.0.1:3000, as nginx/dashboard.conf does.
A behaviour change ships with its tests. A bug fix ships with a test that fails without it.
cd api && npm testcd ui/test && node --testPlaywright specs in e2e/ run against BASE_URL, default http://127.0.0.1:8730.
Pull request checks
Section titled “Pull request checks”CI runs .github/actions/checks/action.yml:
npm cinode scripts/changelog-check.jsnode scripts/changelog-fragments.js --checknode scripts/bump-cache-busting.js --checknpm run paths:checkcd api && npm testcd api && npx c8 check-coverage --lines 92cd ui/test && node --testnpm run lintnpm run format:checknpm run typechecknpm run typecheck:uidocker build -t stackyard:ci .CodeQL and Trivy also run. Both block on a finding.
- Do not edit
CHANGELOG.md. Add a fragment inchangelog.d/named<section>-<slug>.md. - Write
?v=1on new/css/and/js/imports. The release sets the real hash. - A new
ui/jsmodule needs two entries intsconfig.frontend.json: the path and its?v=*form. - Run Biome through
npm run lint. A barenpx biomeruns an unrelated package.