ARCHE
FamiliesDocsExamplesBlogGitHub ↗
← All posts
May 10, 2026technical2 min read

When a monorepo is worth the overhead

Turborepo graphs, shared packages, and the point where splitting repos hurts more than it helps.

Monorepos are not a moral good. They are a coordination technology: one graph of tasks, shared types, and atomic changes across apps. Arche defaults to a monorepo for TypeScript fullstack because the product shape is inherently multi-surface (web, API, worker, packages).

When a monorepo wins

  • Shared contracts — packages/trpc and packages/store change with apps/server and apps/web in one commit
  • One CI graph — Turborepo runs lint/typecheck/test/build in dependency order
  • One catalog — Bun or pnpm workspace catalogs keep versions aligned
  • Agent context — a single AGENTS.md map with workspace children

That is the TypeScript fullstack preset in one sentence.

When to split repos

Consider separate repositories when:

  • Release cadences are completely independent and you accept manual contract versioning
  • Teams have hard legal/security boundaries between artifacts
  • The “shared” code is tiny relative to coordination tax

Arche does not forbid polyrepo workflows—it simply optimizes for the case where you are building a product, not publishing a library in isolation.

Turborepo in generated projects

Root turbo.json is rendered, not copied blindly:

  • Transit nodes for dev servers
  • db:* when Prisma exists
  • mdx:generate when the web app ships Fumadocs content

Remote cache is not promised by default. You can wire CI credentials later; the template does not claim remote cache is on.

Boundaries that matter

terminal
apps/*     → compose features, stay thin
packages/* → domain logic, no UI imports

The Architecture page shows the TypeScript layout. Breaking the rule (“just this once import Prisma in a component”) is how monorepos become mud.

Package managers

Bun default, pnpm where verified. See Package managers. Mixing lockfiles after scaffold is self-inflicted pain.

Solana and Rust presets

Not every preset is a JS monorepo—Rust uses Cargo workspaces; Solana splits program/client/mobile. The monorepo lesson still applies: one graph, explicit boundaries, different manifests.

Practical takeaway

If you are building a fullstack product with shared types, start monorepo. If you are publishing a single npm package, use a library preset or another tool. Arche’s typescript-fullstack is aimed squarely at the first case.

KitsuneKode

Maintains Arche

All posts