DEV Community

Atlas Whoff
Atlas Whoff

Posted on

Monorepo vs Polyrepo: Making the Right Choice for Your Team

Monorepo vs Polyrepo: Making the Right Choice for Your Team

Google uses a monorepo. Most startups use polyrepos. Both work — the right choice depends on team size, code sharing, and deployment strategy.

Polyrepo (Multiple Repositories)

Each service/app lives in its own repo.

github.com/myorg/api         # Backend API
github.com/myorg/web         # Frontend
github.com/myorg/mobile      # React Native
github.com/myorg/shared-ui   # Shared components
Enter fullscreen mode Exit fullscreen mode

Pros:

  • Independent deployments and CI/CD per repo
  • Clear ownership and permissions
  • Smaller repos are faster to clone and search

Cons:

  • Sharing code requires publishing packages (npm)
  • Cross-repo changes need multiple PRs
  • Version drift between shared packages
  • Inconsistent tooling across repos

Monorepo (Single Repository)

myorg/
├── apps/
│   ├── web/          # Next.js
│   ├── api/          # Express
│   └── mobile/       # React Native
├── packages/
│   ├── ui/           # Shared components
│   ├── database/     # Prisma
│   └── config/       # Shared tsconfig, eslint
└── turbo.json
Enter fullscreen mode Exit fullscreen mode

Pros:

  • Atomic cross-package changes in one PR
  • Shared tooling and configs
  • Easy code reuse (no publishing)
  • Single source of truth for types

Cons:

  • Larger repo, slower CI without caching
  • Anyone can see all code
  • Requires monorepo tooling (Turborepo, Nx)

When to Choose Each

Situation Choose
Solo or small team Monorepo
Multiple frontend apps sharing components Monorepo
Strict team ownership boundaries Polyrepo
Services in different languages Polyrepo
Frequent cross-cutting changes Monorepo
Independent scaling/deployment needs Polyrepo

Turborepo Monorepo Setup

npx create-turbo@latest
Enter fullscreen mode Exit fullscreen mode
// turbo.json  define task dependencies
{
  "tasks": {
    "build": { "dependsOn": ["^build"], "outputs": [".next/**", "dist/**"] },
    "test": { "dependsOn": ["build"] },
    "lint": { "outputs": [] }
  }
}
Enter fullscreen mode Exit fullscreen mode

Shared Package Pattern

// packages/ui/src/index.ts
export { Button } from './components/Button';
export { Card } from './components/Card';
export { Input } from './components/Input';

// packages/ui/package.json
{
  "name": "@myorg/ui",
  "main": "./src/index.ts",
  "exports": { ".": "./src/index.ts" }
}

// apps/web/package.json
{ "dependencies": { "@myorg/ui": "*" } }
// Imports directly from source — no build step needed
Enter fullscreen mode Exit fullscreen mode

Shared TypeScript Config

// packages/config/tsconfig.base.json
{
  "compilerOptions": {
    "strict": true,
    "skipLibCheck": true,
    "moduleResolution": "bundler"
  }
}

// apps/web/tsconfig.json
{ "extends": "@myorg/config/tsconfig.base.json" }
Enter fullscreen mode Exit fullscreen mode

The AI SaaS Starter Kit ships as a Turborepo monorepo — web app, shared UI package, and Prisma database package all pre-wired. $99 at whoffagents.com.

Top comments (0)