ADR-0001: Turborepo + pnpm multi-runtime monorepo
Status: Accepted — the orchestration decision stands; the pinned Node and pnpm baseline it names is superseded by ADR-0026.
Date: 2026-06-24
Context
The product ships a NestJS API, Next.js web applications, Expo mobile app, Tauri desktop app, Docusaurus documentation, and shared TypeScript packages. They need one dependency graph and reproducible build order without forcing every surface into one runtime.
Decision
- pnpm workspaces own dependency installation and
workspace:*linking. - Turborepo owns root orchestration and dependency-aware
build,lint,test,check-types, anddevtasks. - Each app/package owns its runner-specific scripts and configuration.
- Shared packages use the
@bitrate/namespace. - Node 20+ and the pinned
pnpm@10.30.3package manager are the supported baseline. - PostgreSQL and Redis run through the minimal development Compose stack; apps normally run natively.
Consequences
Root commands are the common interface, while package filters remain the fastest local feedback loop. Changes to shared packages can fan out to multiple applications and must be verified proportionally.
Alternatives considered
- Independent repositories — rejected because contracts, tokens, and UI evolve together.
- One framework/runtime — rejected because mobile, desktop, backend, and docs have genuinely different runtime requirements.