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
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
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
// turbo.json — define task dependencies
{
"tasks": {
"build": { "dependsOn": ["^build"], "outputs": [".next/**", "dist/**"] },
"test": { "dependsOn": ["build"] },
"lint": { "outputs": [] }
}
}
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
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" }
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)