Monorepo vs Polyrepo: What the Blast Radius Tells You

Summary

The monorepo vs polyrepo debate rarely settles because both sides measure different scenarios. Faros AI's study of 320 teams found monorepo PR cycle times 9.5x longer at the median. The real decision driver: what percentage of your features require changes across multiple service boundaries? Below 30%, polyrepo isolation usually wins. Above 30%, monorepo coordination savings start to outweigh the tooling investment.

Monorepo vs polyrepo architecture diagram showing unified tree and isolated clusters on dark background

The answer to "monorepo vs polyrepo" is not a recommendation - it's a measurement. Specifically: what percentage of your features require changes across more than one service boundary?

If you don't know that number, you're making an infrastructure decision based on team preference rather than data. And in a 50-person engineering organization, that preference will cost someone a Sunday.

The keyword here is calculation. Both approaches impose costs. The question is which costs your organization can absorb better - the coordination tax of polyrepo or the tooling investment of monorepo.

PR Cycle Time Data Should Settle This. It Doesn't

Faros AI analyzed 320 engineering teams over 12 months and found that monorepo environments have a median PR cycle time of 19 hours. Polyrepo environments: 2 hours.

That is a 9.5x gap at the median. At the 90th percentile, the gap narrows to 8.6 days versus 5.5 days - but both tails are slow. The mean also narrows: 3.6 days monorepo, 2.8 days polyrepo.

The counterargument is well-established: monorepos have faster individual build times when caching works. A polyrepo team coordinating a cross-service change across five repositories with five separate CI pipelines and five separate CODEOWNERS sign-off requirements will not close a PR in two hours either.

The data captures cycle times for typical PRs, not worst-case cross-cutting changes. That distinction matters. Polyrepo teams quote their median (fast, because most of their PRs are isolated). Monorepo advocates quote the pain of coordinating across repos (also real, and documented in their worst-case PR tails). Both sides are right about different scenarios.

The data does not settle the debate. It describes the tradeoff more precisely than vibes do.

SRE engineer monitoring deployment metrics at workstation with multiple dashboards

The Blast Radius You're Not Calculating

Here's what rarely makes the conference talk slides: in a monorepo, a broken shared dependency lands across every service that imports it, in the same commit, before anyone with downstream ownership has reviewed the change.

In a polyrepo, a broken package version breaks the services that upgrade it - but only when they upgrade it. The blast radius is deferred and bounded by consumer choice.

This matters for SLO-gated rollouts. A bad shared library in a monorepo does not give you a canary window. It gives you a cross-service blast radius in a single deploy event. Your error budget starts burning across multiple SLOs simultaneously before your rollout automation can detect the pattern and trigger a revert.

In a polyrepo, the rollout of a shared dependency change is sequential by nature. Service A upgrades and you watch its SLO. Service B upgrades three days later. The blast radius at any given moment is bounded by who has already adopted the change.

The question is not which structure is inherently safer - it's what your deployment primitive is. If your deployment unit is the service with its own SLO gate, polyrepo gives you natural isolation. If your deployment unit is the atomic feature change landing consistently across frontend, API, and background worker simultaneously, monorepo gives you that coordination without versioning drift.

Most teams shipping microservices have the first problem. Most teams shipping a tightly coupled product surface have the second.

Why Polyrepo Teams Hit a Coordination Wall at 50 Engineers

The coordination tax compounds. At 8 engineers, managing four repositories is annoying but feasible. At 50, it becomes a part-time job for several people.

Concrete signs that polyrepo coordination overhead has become structural:

None of these are invented pathologies. They are documented failure modes from teams who reached 80 engineers and looked back at their repo decisions with regret.

Polyrepo works when teams are genuinely independent - different release cycles, different tech stacks, different on-call rotations. When teams share enough code that a change in one service requires reasoning about three others, the isolation that polyrepo was bought for becomes the mechanism that makes coordination painful.

The organizational tell: count how many Slack channels exist specifically to coordinate cross-repo releases. If the answer is more than zero, you have already started paying the coordination tax consistently.

What Monorepos Actually Cost at the 95th Percentile

The P90 data from Faros AI is instructive: 8.6 days for monorepo PRs at the 90th percentile. That is not a slow team - it is the structural consequence of large cross-cutting changes requiring coordination across multiple code owners, broader CI matrices, and review cycles that span organizational boundaries.

Google has Bazel. Meta built Buck. Nx Cloud and Turborepo remote cache exist because the tooling investment to make a monorepo perform is not trivial. A monorepo at 200 engineers without affected-only build selection, distributed caching, and automated merge queues produces 45-minute CI runs on PRs that touch a shared utility function.

The tooling cost is real and routinely underestimated. Teams that successfully operate monorepos at scale have typically hired platform engineers specifically focused on that infrastructure. Retrofitting monorepo tooling onto a growing codebase while also shipping product is a drain that shows up in deployment frequency before it shows up in a post-mortem.

If your platform team is already stretched, adding monorepo tooling maintenance is a meaningful commitment - not a configuration choice.

Architecture diagram on whiteboard showing branching pipeline structures for monorepo and polyrepo

The 30 Percent Rule High-Performing Teams Actually Use

A useful heuristic from teams that have made this decision deliberately: if more than 30% of your features require changes across multiple service boundaries, the coordination overhead of a polyrepo will eventually exceed the tooling investment of a well-run monorepo.

Below 30% - where most microservices organizations sit - polyrepo's isolation benefits usually outweigh the coordination tax. Cross-service changes happen, but not frequently enough to make shared tooling pay off faster than isolation does.

This is measurable. Pull your last six months of merged PRs and count how many required changes in more than one repository to ship a single user-facing feature. That ratio is your input. It will not be precise to a decimal, but it will be directional - and directional is enough to stop the debate from running on team preference.

A team with a 12% cross-service rate does not need a monorepo. A team at 38% and growing is paying coordination tax that will keep compounding.

How Rollout Strategy Changes the Calculation

There is a dimension of this decision that gets almost no coverage: your rollout primitive.

If you run percentage-based rollouts with SLO gates - shipping a feature to 5% of traffic, watching error budgets, then progressively expanding - your blast radius calculation changes depending on whether the feature spans one service or several.

In a polyrepo, a multi-service feature rollout requires coordinating the rollout state across services. Service A can be at 20% while Service B is still at 0%, creating inconsistent states that are genuinely hard to reason about under incident conditions. Feature flags help, but you are still managing cross-service flag state with no single source of truth for rollout progress.

In a monorepo with atomic commits, the feature lands consistently across services. The rollout can still be percentage-based at the infrastructure level, but the code is consistent from the moment the deploy happens. Your SLO gates fire against a coherent state.

Teams doing a lot of atomic multi-service features, running progressive rollouts with automated rollback on SLO breach, often find that monorepo's consistency eliminates an entire category of incident that polyrepo does not have a clean name for - the cross-service state divergence incident that looks like a bug but is actually a deployment coordination problem.

What the Post-Mortem Will Actually Say

Most engineering organizations end up on a hybrid that nobody calls a hybrid because it sounds like an architectural cop-out.

One or two monorepos for tightly coupled product surfaces. Separate repositories for genuinely autonomous services with independent deployment cycles, their own on-call rotation, and a team that has not needed to coordinate a shared library change in six months.

The signal to revisit your current setup:

The signal that the decision is fine for now:

The post-mortem will tell you which of these you are actually living in. That document is usually more honest than the architecture decision record that preceded the system it describes.

Frequently asked questions

What is the main difference between monorepo and polyrepo?
A monorepo stores all services and libraries in a single repository, enabling atomic commits and shared tooling. A polyrepo stores each service or team domain in its own repository, providing deployment isolation and independent release cycles. The structural difference drives different coordination costs and blast radius profiles.
Does the data favor monorepo or polyrepo for developer experience?
Faros AI's benchmark of 320 teams found polyrepo environments have a median PR cycle time of 2 hours versus 19 hours for monorepos - a 9.5x gap. However, this reflects typical isolated PRs in polyrepo environments. Cross-service changes in polyrepo show much slower cycle times that are harder to measure systematically.
At what team size does polyrepo coordination become a problem?
There is no universal threshold, but teams commonly report that polyrepo coordination overhead becomes structural somewhere between 40 and 80 engineers. The signal is not headcount but cross-service change frequency: if more than 30% of features require coordinated changes across multiple repos, the coordination tax starts compounding faster than it can be managed manually.
What is the 30% rule for monorepo vs polyrepo decisions?
If more than 30% of your features require code changes across multiple service boundaries to ship, the coordination overhead of a polyrepo will typically exceed the tooling investment of a well-maintained monorepo. Below 30%, polyrepo isolation usually wins. This threshold is measurable: count multi-repo PRs in your last six months of shipping history.
How does a monorepo affect deployment blast radius?
A broken shared dependency in a monorepo lands across all consuming services in a single deploy event, before downstream owners can review. In a polyrepo, the blast radius is deferred - services adopt new versions on their own schedule, so the impact is bounded by who has already upgraded. Monorepos require more disciplined SLO-gated rollout tooling to compensate.
Can monorepos scale to large engineering organizations?
Yes, but with significant tooling investment. Google operates billions of lines of code in a single repository using a custom build system (Bazel). For most organizations, scaling a monorepo requires affected-only build selection, distributed caching (Nx Cloud, Turborepo), automated merge queues, and dedicated platform engineering capacity - none of which are configuration choices.
What is a hybrid repository strategy and when does it make sense?
A hybrid strategy uses a monorepo for tightly coupled product surfaces (frontend and API layer, or API and background workers) while keeping genuinely autonomous services in separate repositories. This is the pragmatic outcome for most mature engineering organizations. It makes sense when different parts of the codebase have genuinely different coupling profiles and deployment independence levels.