[Org Name] · Monorepo
A pnpm + Turborepo monorepo. Apps in apps/, shared packages in packages/. Turborepo handles caching + parallel builds.
Source of truth
The monorepo is the source. Apps are independently deployable (Vercel, Fly, etc) but share code through packages/*. Versions of internal packages are managed by changesets.
Tech stack
pnpm 10 + Turborepo 2 + TypeScript 5.6+ + Vitest (workspace-aware). ESLint + Prettier (shared configs). Changesets for versioning internal packages (and any published-to-npm ones). Per-app deploy targets: Vercel for Next apps, Fly for Express API.
Deploy
Each app deploys independently. CI uses Turborepo remote cache for fast builds across PRs and across apps.
File map
apps/web/Next.js marketing siteapps/app/Next.js applicationapps/api/Node Express APIpackages/ui/shared React components + Tailwind presetpackages/db/Drizzle schema + queries (shared by api + app)packages/auth/JWT + session helperspackages/config/shared TS, ESLint, Tailwind configspackages/utils/shared utility functionspnpm-workspace.yamlworkspace globsturbo.jsontask pipeline + cache config.changeset/changesets per change
.env keys
Per-app .env.local files. Root .env.example shows the union of all needed vars.
Hard rules
- Internal packages use
workspace:*in dependents'package.json. NEVER hardcode version numbers for internal deps. - Every package has a
package.jsonexportsfield. No deep imports across packages. turbo.jsontask pipeline mirrors actual dependency order.builddepends on^build(upstream builds first).- TypeScript paths configured per-package, NOT globally. Each app's
tsconfigextendspackages/config/tsconfig.base.json. - Changesets for any internal-package change. CI runs
changeset versionon merge to bump packages atomically. - Lockfile is committed (
pnpm-lock.yaml). Frozen lockfile in CI (pnpm install --frozen-lockfile).
Recent significant changes
- 2026-04-26: Scaffolded. Locked: pnpm over yarn/npm (faster, stricter), Turborepo over Nx (less ceremony), changesets over standard-version (multi-package monorepos demand it).
Next session: start here
pnpm installfrom root. Confirm all workspaces resolve.- Run
pnpm turbo buildto warm the cache. Time the second run (should be near-instant). - Move shared code into
packages/. Start with one piece (auth helpers, UI button). - Set up Turborepo remote cache (Vercel or Cloudflare). Confirm CI uses it.
- Configure each app's deploy target. Vercel auto-detects monorepo apps; point each to its
apps/*directory.