.github/workflows/. They run on pull requests to main to verify Docker builds and enforce lint, type and format checks.
Build workflows
Build the API and Web Docker images to prove they compile.
Lint workflows
Run ESLint, TypeScript and Prettier via one reusable template.
| File | Purpose |
|---|---|
build-api.yml | Build the API Docker image |
build-web.yml | Build the Web Docker image |
linter.template.yml | Reusable lint job |
run-api-linter.yml | Lint the API |
run-web-linter.yml | Lint the Web app |
Web-only projects have no
apps/api, so the build-api.yml and run-api-linter.yml workflows aren’t included — only the web build and lint workflows ship.Build workflows
Each build workflow builds the app’s Docker image with BuildKit layer caching, to catch a broken build before merge.Build API — build-api.yml
Triggers on PRs to main touching apps/api/** or packages/**.
Build Web — build-web.yml
Same shape, scoped to apps/web/** (and packages/**), building ./apps/web/Dockerfile.
Lint workflows
Linting runs through one reusable workflow that both the API and Web jobs call.Reusable template — linter.template.yml
Pins the toolchain and runs ESLint, TypeScript and Prettier through lint-action, which posts inline comments on the PR.
Lint API & Web — run-api-linter.yml, run-web-linter.yml
Each one is a thin caller that passes a component and dir into the template:
main that touch the matching app or packages/**.
Customization
Update Node.js / pnpm versions
Bump them once inlinter.template.yml — both lint jobs inherit the change:
