· software-engineers Editorial · Career · 5 min read
Monorepo Vs Polyrepo Migration Guide
A data-driven comparison of monorepo and polyrepo strategies, with a step-by-step migration path and the build-tooling decisions that determine success.
Monorepo Vs Polyrepo Migration Guide
The monorepo-versus-polyrepo debate resurfaces every few years, but by mid-2026 the decision has become less ideological and more tooling-dependent. With Bazel, Nx, Turborepo, and pnpm workspaces now handling incremental builds, remote caching, and dependency graphs at scale, the operational cost of a monorepo has dropped sharply, while polyrepo tooling (Git submodules, package registries, cross-repo CI orchestration) has plateaued. This guide compares both approaches on concrete engineering metrics and walks through a migration path for teams moving in either direction.
What Actually Changes Between Monorepo and Polyrepo
A monorepo stores multiple projects, services, or packages in a single version-controlled repository with a unified build system. A polyrepo splits each project into its own repository, versioned and released independently. The distinction matters most in four areas: dependency management, CI/CD complexity, code review scope, and cross-team coordination overhead.
In a monorepo, an internal library change and its consuming services are visible in the same pull request, which makes atomic cross-cutting refactors possible. In a polyrepo, the same change requires publishing a new package version, bumping the version in each consumer, and coordinating merge order across repositories — a process that introduces “dependency lag,” where consumers run stale internal library versions for weeks or months.
Monorepo vs Polyrepo: Head-to-Head Comparison
| Dimension | Monorepo | Polyrepo |
|---|---|---|
| Atomic cross-service changes | Single PR, single merge | Requires coordinated multi-repo PRs |
| Build tooling maturity (2026) | Bazel, Nx, Turborepo, pnpm workspaces mature | Standard per-language tooling, no cross-repo graph |
| CI cost at scale | High without remote caching; low with it | Naturally isolated, but duplicated pipeline config |
| Code ownership boundaries | Requires CODEOWNERS + enforced module boundaries | Enforced by repo boundary itself |
| Onboarding a new engineer | One clone, full context visible | Must discover and clone N repos |
| Dependency versioning | Single version (trunk-based) or workspace-scoped | Semantic versioning + registry required |
| Access control granularity | Coarse (repo-level) unless using path-based ACLs | Fine-grained (per-repo) |
| Repo size / clone time | Can grow to tens of GB without sparse checkout | Stays small per repo |
| Best fit team size (2026 data) | 20-2000+ engineers with strong tooling investment | <20 engineers, or regulatory/IP-isolation requirements |
The Real Cost Driver: Build System Investment, Not Repo Count
The most common mistake teams make is treating “monorepo” as a Git decision when it is actually a build-system decision. A naive monorepo with no incremental build tooling forces every CI run to rebuild and retest the entire codebase, which becomes untenable past a few hundred thousand lines of code. Google, Meta, and Uber’s public engineering writeups all converge on the same conclusion: monorepos only scale with investment in (1) a dependency graph the build system understands, (2) remote build caching, and (3) affected-project detection so CI only runs tests for what actually changed.
In 2026, Nx and Turborepo have made this tooling accessible to mid-size teams without a dedicated build infrastructure group, which is the primary reason monorepo adoption has grown among Series B-D startups that previously would have defaulted to polyrepo for simplicity.
Migration Path: Polyrepo to Monorepo
- Inventory and dependency-map every repo that will merge, including internal package versions currently in use by each consumer.
- Choose a build orchestrator (Nx, Turborepo, or Bazel) before merging any code — retrofitting this after the merge is significantly more expensive.
- Merge with history preservation using
git subtreeorgit filter-repo, not a flat copy-paste, sogit blameand history remain intact. - Flatten internal package versions to a single version across the new workspace (the “one version rule”), eliminating the version-skew problem that motivated the migration.
- Set up CODEOWNERS and path-based CI triggers so teams retain review autonomy and CI only runs affected test suites, not the full suite on every commit.
- Migrate CI/CD incrementally, repo by repo, running old and new pipelines in parallel for at least one release cycle before decommissioning the old ones.
Migration Path: Monorepo to Polyrepo
This direction is less common but happens when a monorepo’s build times or access-control requirements outgrow the org’s tooling maturity, or when splitting off an acquired product line for independent release cadence.
- Extract the target module with full Git history using
git filter-repo --path <dir>. - Publish internal dependencies the extracted module relied on as versioned packages to an internal registry (npm, Artifactory, or a private PyPI/crates index).
- Stand up independent CI/CD for the new repo, since it can no longer rely on the monorepo’s shared pipeline config.
- Pin consumer version ranges carefully — this is where dependency lag reappears, so establish a Renovate or Dependabot policy from day one to keep consumers current.
- Deprecate the in-monorepo path only after the new repo has shipped at least one production release independently.
Interview Relevance: System Design and Engineering Leadership Rounds
Build system and repository strategy questions show up frequently in staff and senior engineering interviews, especially for platform, infrastructure, and engineering-productivity roles. Interviewers are typically less interested in “monorepo good, polyrepo bad” and more interested in whether a candidate can reason about the actual trade-off drivers — build caching, ownership boundaries, and release cadence — and defend a recommendation for a specific team size and org structure. The 0-to-1 SWE Interview Playbook (https://www.amazon.com/dp/B0H256Z1MF?tag=sirjohnnymai-20) includes a system design chapter on developer tooling and internal platform design that walks through exactly this kind of trade-off analysis, which interviewers at infrastructure-heavy companies increasingly favor over pure application-design questions.
FAQ
Q: Does a monorepo require Bazel specifically? A: No. Bazel is the most powerful and most complex option, generally justified only past very large scale (Google/Meta-scale) or polyglot codebases. For most mid-size teams in 2026, Nx (JS/TS-centric but extensible) or Turborepo (lighter weight, JS/TS-focused) deliver most of the benefit with substantially less operational overhead.
Q: Can you have a “hybrid” model? A: Yes, and it is increasingly common. Teams group tightly-coupled services (a frontend and its BFF, or a set of microservices owned by one team) into a monorepo, while keeping genuinely independent products or open-source-facing packages in separate repos. This captures most atomic-change benefits without forcing unrelated teams into a single build graph.
Q: What is the single biggest predictor of migration failure? A: Migrating the repository structure before the build tooling is in place. Teams that merge repos first and figure out incremental builds later end up with CI times so long that engineers start bypassing tests, which erodes the trust the migration was meant to build.