The CI pipeline is defined in .github/workflows/ci.yml. It runs on every push to main and on every pull request.
Push["Push / PR"] --> Check Push --> TestDB Push --> TestE2E
Push["Push / PR"] --> Check Push --> TestDB Push --> TestE2E
graph LR
subgraph ci [CI Pipeline]
Check["check<br/>Type check + Lint + Unit tests"]
TestDB["test-db<br/>DB integration tests"]
TestE2E["test-e2e<br/>Playwright E2E tests"]
end
Push["Push / PR"] --> Check
Push --> TestDB
Push --> TestE2E
All three jobs run in parallel for fast feedback.
checkPurpose: Fast validation of types, linting, and unit tests (no external dependencies needed).
Steps:
pnpm install --frozen-lockfilepnpm check-types -- TypeScript type checking across all packagespnpm lint -- Biome + ESLintpnpm turbo run test --filter=!@repo/db --filter=!@repo/e2e-web -- Unit tests (excluding DB and E2E packages)test-dbPurpose: Run database integration tests against a real Supabase instance.
Steps:
pnpm --filter @repo/db test:supabase-start -- Start local Supabase via Dockerpnpm --filter @repo/db test -- Run DB package teststest-e2ePurpose: Run full end-to-end tests with Playwright.
Steps:
packages/e2e-web/.env.test and run E2E tests with START_WEB_SERVER=trueE2E test results are also reported to Currents when the CURRENTS_RECORD_KEY secret is available.
Turborepo caches task outputs based on:
.env* files.turbo.json (e.g. SUPABASE_URL, DATABASE_URL).dependsOn: ["^build"] so upstream changes invalidate downstream caches.This means:
graph TD
Build["build"] -->|"dependsOn: ^build"| DepBuild["dependency builds"]
Test["test"] -->|"dependsOn: ^build"| DepBuild
Lint["lint"] -->|"dependsOn: ^lint"| DepLint["dependency lints"]
CheckTypes["check-types"] -->|"dependsOn: ^check-types"| DepCheck["dependency checks"]Deployment details for apps/web are environment-specific. The build output is standard Next.js (.next/).
Key production settings from next.config.js:
assetPrefix: "/v2" -- assets served under /v2 for coexistence with the legacy app.LEGACY_APP_URL origin.Storybook (apps/storybook) deploys to Vercel. The vercel.json configures outputDirectory: "storybook-static".
Build:
pnpm --filter storybook storybook:build