M365Con 2027 – free online conference · 11–22 Jan 2027 · 120 sessions→ m365con.net

2026-07-19 · Season 3

The Monorepo Myth: Why Your Architecture Is Fragmented

The Monorepo Myth: Why Your Architecture Is Fragmented
Choosing between a monorepo and multiple repositories may look like a technical decision about Git performance, build times, or repository size. In reality, it is an organizational decision that determines how teams communicate, coordinate changes, and deliver software. In this episode, we…

Show notes

Welcome to another episode of Knowledge Nuggets with Mirko Peters. In this episode, we're tackling one of the biggest misconceptions in software architecture: the Monorepo Myth. For years, engineering teams have debated whether a monorepo or a multirepo is the "correct" repository strategy. Discussions usually focus on Git performance, build speed, repository size, or tooling. But these technical arguments miss the real issue. Your repository strategy isn't primarily a Git decision—it's an organizational decision. The structure of your repositories shapes how teams collaborate, communicate, make decisions, and ultimately how quickly your organization can deliver software. THE BIGGEST MISCONCEPTION Most organizations evaluate repository strategies using technical criteria. Questions like:

  • Can Git handle millions of files?
  • How fast are clone operations?
  • How quickly does CI complete?
  • Which strategy scales better?

These are valid engineering concerns, but they aren't the questions that determine long-term success. The real question is: Where does your organization pay its coordination cost? A repository strategy doesn't eliminate coordination—it simply determines where that coordination happens. Whether you choose a monorepo or a multirepo, your teams still need to collaborate. The only difference is how visible that collaboration becomes. UNDERSTANDING MONOREPOS A monorepo stores multiple applications, services, libraries, infrastructure code, and shared components inside a single repository. This creates several important advantages:

  • Shared tooling
  • Consistent standards
  • Easier large-scale refactoring
  • Unified dependency management
  • Atomic cross-project changes
  • Complete visibility across the entire system

When teams are closely aligned, a monorepo enables rapid cross-cutting changes because everything lives together under one build system and one source of truth. However, as organizations grow, coordination becomes increasingly centralized. Shared libraries require approval from multiple teams, dependency updates affect everyone simultaneously, and build systems become more complex as additional teams join the repository. The technical challenges often blamed on monorepos are actually symptoms of growing organizational complexity rather than limitations of Git itself. THE HIDDEN COST OF MONOREPOS Large monorepos rarely fail because of technology. Git itself can manage repositories containing millions of files. Companies like Google successfully operate enormous monorepos. Instead, organizations encounter problems such as:

  • Slow code reviews
  • Long build pipelines
  • Complex branching strategies
  • Frozen dependencies
  • Endless coordination meetings
  • Difficult release planning

These issues arise because every significant architectural decision requires agreement across more teams. As organizations grow, the repository doesn't become technically unmanageable—it becomes organizationally expensive. The true scaling challenge is coordination, not source control. HOW MULTIREPOS WORK A multirepo architecture separates services, products, or components into independent repositories. Each team owns its own repository, deployment pipeline, testing strategy, and release schedule. The benefits include:

  • Independent deployments
  • Clear ownership
  • Team autonomy
  • Smaller repositories
  • Faster local builds
  • Flexible release cycles

However, the coordination burden doesn't disappear. Instead of coordinating through code reviews and shared repositories, teams coordinate through:

  • APIs
  • Versioning
  • Release notes
  • Contracts
  • Documentation
  • Governance processes

The coordination simply moves from code into communication between teams. ORGANIZATIONAL DEBT One of the most valuable ideas discussed in this episode is organizational debt. Unlike technical debt, organizational debt doesn't exist in the codebase. It appears as:

  • Unclear ownership
  • Slow approvals
  • Excessive meetings
  • Complicated release processes
  • Duplicate workflows
  • Ambiguous decision-making

These problems accumulate over time and become the real bottleneck for software delivery. Many organizations attempt to solve organizational debt by changing repository strategies. In reality, neither monorepos nor multirepos solve these problems—they simply expose them differently. CONWAY'S LAW A key concept behind repository design is Conway's Law. It states that software systems naturally mirror the communication structure of the organizations that build them. If teams are divided into silos, the architecture will eventually become siloed as well. Changing repository layouts cannot fix poor communication. Likewise, organizations with highly collaborative teams can successfully operate either monorepos or multirepos because the underlying communication patterns already support effective collaboration. Your repository structure is often a reflection of your organizational structure rather than its cause. THE COMMUNICATION ARCHITECTURE MODEL Rather than thinking about repositories as storage mechanisms, it is more useful to think of them as communication architectures. A monorepo encourages:

  • Shared visibility
  • Continuous collaboration
  • Immediate feedback
  • Centralized coordination

A multirepo encourages:

  • Clear contracts
  • Independent ownership
  • Explicit APIs
  • Autonomous deployments

Neither model is inherently superior. The best choice depends on how your teams naturally communicate and collaborate. Repository strategy should reflect your communication model—not dictate it. AI IS CHANGING THE EQUATION The rapid adoption of AI-assisted development introduces a new challenge. AI coding assistants dramatically increase software output. Developers can generate significantly more code than before, but code review and verification have not accelerated at the same pace. This creates what can be described as a verification tax. Organizations capable of generating code twice as fast often find that reviews, architectural validation, testing, and integration become the new bottlenecks. AI doesn't eliminate organizational fragmentation—it amplifies it by increasing the volume of work flowing through existing coordination processes. Become a supporter of this podcast: https://www.spreaker.com/podcast/m365-fm-microsoft-365-azure-cloud-power-platform-ai--6704921/support.

Apple Podcasts · Spotify · YouTube · YouTube Music · Deezer

Host: Mirko Peters

Guests

Related articles

Transcript

Read the full transcript

You chose a repository strategy years ago. It felt technical at the time, a decision about Git, whether to use one repository or many, whether you needed Sparse checkout, how many branches you could manage, how fast you needed to clone, it felt like an engineering problem, in reality. It wasn't a Git decision at all, it was an organizational decision, and you probably didn't know you were making it because that choice didn't just affect how your code was stored. It started shaping how your teams worked together, how they communicate, whether they can move fast, or whether they grind, whether they build products, or manage structure. And it's been doing that ever since, whether you've noticed it or not, most organizations don't realize this, they don't realize that their fragmentation isn't a code problem, it's a structure problem. Today we're diagnosing why, the assumption everyone makes. Most teams think repository strategy is about one thing, Git performance, scalability, how fast can you clone, how fast can you push, can the system handle a million files, can it handle thousands of developers? These are real questions, they're just not the right questions. When you talk to technical leaders in organizations that actually move fast, they don't talk about Git speed, they talk about coordination, where do we pay our coordination tax, that's the real question hiding inside the repository choice. Most technical leaders are solving for the wrong problem because they are looking at a tool instead of a system. But here's what's actually happening when you choose between Monorepo and Multi-Repo, you're not choosing a repository structure, you're choosing where coordination happens, you're choosing how information moves, you're choosing how decisions get made, and you're choosing whether that process is visible or invisible, Monorepo, one repository, everything in one place. The promise is clean, shared tooling, easier refactoring, consistent standards, high visibility, a single source of truth, one build system, one set of rules, what you're actually doing is centralizing the coordination problem. Every change that affects multiple parts of the system has to be reviewed by everyone who cares. Every dependency bump touches every team, every breaking change gets negotiated in one place, the coordination becomes visible, it becomes concrete, it happens in code reviews and CIP lines, Multi-Repo, many repositories, clear boundaries. The promise here is different, team autonomy, independent release cycles, clear ownership, the ability to move fast without waiting for other teams, what you're actually doing is pushing the coordination problem into a different place. Instead of managing it in code review, you manage it through APIs and contracts. Instead of one commit touching everything, you have coordinated releases. Instead of shared governance, you have explicit versioning, the coordination becomes invisible, it happens in meetings, it happens in release notes and migration guides, neither choice makes coordination disappear. You just choose which text to pay. And most technical leaders don't realize they're making that choice, they think they're solving for performance or scalability, they're actually encoding their organizational structure into the code base, they're making structural assumptions about how teams should work together. This choice reflects how your organization actually communicates, and it reinforces that pattern. Once you choose Monorepo, you've made it harder to work independently, which forces teams toward alignment. Once you choose Multi-Repo, you've made it easier for teams to move alone, which requires much more formal communication. Technical leaders often miss this because they're solving for the wrong problem, they're asking which Git strategy scales. When they should be asking, how do my teams actually work together? The answer to the first question is, all of them scale. Google has Monorepo's with millions of files, Spotify has hundreds of independent repositories, both work, neither is objectively better, but here's what actually happens when you make that choice. How Monorepo's work and what they cost? A Monorepo puts all your code in one place, not just the main product, not just the core services, everything. Your libraries, your build tools, your infrastructure code, your internal frameworks, your shared components, all of it versioned together, building together and deploying together. The infrastructure is unified. You have one build system, one CI pipeline, and one set of dependencies. You use one version of the compiler, the testing framework, and the linting rules. When you upgrade a library, you upgrade it everywhere at once, and when you change a standard, it applies to every single line of code. The visibility is total. Any developer can see any code. There are no permissions boundaries, and no, you don't have access to that repository errors. The entire system is right there for you to reason about. Dependencies are explicit because every service that relies on a shared library is visible, and every place a change will ripple through shows up immediately. The promise is powerful. Refactoring is easier because you see all the callers. Dependency management is simpler because there is only one version of everything. Standards stay consistent, because there is nowhere to hide from the rules. Changes are atomic because one commit can update a library and all its consumers at the same time. This works beautifully when teams are aligned. It works when the teams using a library agree on what the API should be. It works when they coordinate on changes, and are willing to adapt their code when a library moves forward. It works when they communicate about breaking changes before they happen, and accept that they are part of a larger system. But here's what actually happens as the monorepo grows. More teams start touching it. Not just your core platform team, but feature teams, infrastructure teams, and teams in different parts of the organization. You have teams that don't talk to each other very much, and teams with completely different priorities. Now that unified build system isn't so unified anymore, you can't upgrade the compiler without checking if every team is ready. You can't change the build configuration without understanding how 50 different teams rely on it. You can't deprecate an API without waiting months for every consumer to migrate. The visibility becomes a burden, everyone can see the code, but nobody owns it. A change to a shared library requires review from whoever cares about it. And as the monorepo grows, more people care about more things. Dependencies become a political negotiation instead of a technical decision. Code review becomes the bottleneck. If a change touches multiple services, it needs sign-off from each team. If a library change affects the whole system, everyone needs to verify it doesn't break their code. As the monorepo grows, code review doesn't speed up. It slows down because more stakeholders are involved in every decision. The branching model breaks. In a small monorepo, everyone commits to main. But as teams multiply, long-lived branches multiply too. You get feature branches that live for weeks because they're too risky to merge without every stakeholder checking them. You get release branches because you can't coordinate a synchronized release across 30 teams. And you get hot-fixed branches because production broke and nobody wants to wait for a massive code review. Build time explodes. The monorepo is massive. And because all the code for all the teams is there, the build system has to understand all of it. Builds get slower, C.I. becomes a bottleneck and tests take longer. Developers spend their day waiting for builds instead of doing actual work. The solution is usually to add more infrastructure. You set up Spass checkout, so you don't have to download everything. You use partial clones, so you aren't cloning the entire history. You implement selective builds, so only changed parts, rebuilt, and you add caching, so you aren't recompiling everything. You create different test groups, so you aren't running every test for every change. But here's the thing, all of that infrastructure exists. To work around the fact that the monorepo is too big, the coordination is too complex and the teams aren't aligned. You're treating the symptom, not the disease. The disease isn't that Git can't handle the scale because Git handles monorepo with millions of files every day. The disease is organizational debt. It's the accumulation of teams that need to coordinate but don't have the trust or alignment to do it smoothly. It's unresolved decisions about who owns what and processes that haven't kept up with the scale. The monorepo doesn't fail because of technical reasons. It fails because you've made coordination visible and then you pretended you could manage it with infrastructure instead of actually fixing the underlying organizational problem. And that's where most organizations hit the wall. The monorepo scaling problem, no one talks about. Now let's be clear about what's actually breaking. It's not Git, it's not the technology. It's not that your version control system hits some hard limit and stops working. GitHub manages monorepo with millions of files and Google's monorepo is larger than anything you will ever build the technology scales. What breaks is the organizational model. And here's the thing, nobody talks about. The monorepo doesn't fail because you ran out of infrastructure. It fails because you ran out of alignment. You have people making decisions in parallel who should be making decisions together. You have teams touching the same code who haven't agreed on what safe means. You have dependencies that are implicit instead of explicit. As the monorepo grows, these unresolved decisions accumulate faster than you can manage them. This is organizational debt. It isn't technical debt because the code might be fine. It isn't infrastructure debt because you might have plenty of resources. It is the cost of decisions you haven't made yet and the burden of coordination problems you're pretending don't exist. In a growing monorepo, decision debt shows up in concrete ways who decides when it's safe to break an API. In a small monorepo, the team that owns the API decides checks with the three other teams that use it and then breaks it. In a large monorepo, you have 40 teams using that API and you can't break it without breaking something important. So the API gets frozen. You add a new version, then a third version, and suddenly you have three versions of the same API in the code base and nobody knows which one to use. Who decides when to upgrade a dependency? In a small monorepo, you upgrade when it's safe and push the change to everyone. In a large monorepo, upgrading a compiler or a core library affects every single team. Some teams are ready, but some teams are blocked and some teams haven't even checked their code against the new version. So you don't upgrade. You freeze the version, you create a compatibility layer and you build workarounds. The dependency becomes stale and security patches don't get applied because applying them breaks something somewhere else. Who decides what coordinated release means? Does the monorepo release once a day or once a week? Does it release only when all the tests pass? Even if that means a critical fix for team A waits behind a failing test from team C, these are not technical questions. They are organizational questions. But if you haven't answered them explicitly, the system will answer them for you by blocking releases and creating the perception that the monorepo is slow. These decisions don't get made because making them requires authority. It requires someone saying, here's the policy. Everyone follows it. That person has to have the organizational credibility to enforce it across all the teams. Most organizations don't have that person. Most organizations have distributed authority where each team has autonomy, but nobody has the final say. So the decisions don't happen. They accumulate. They become organizational debt. And then you try to fix it with infrastructure. You add spars checkout so teams don't have to download the whole monorepo, but that doesn't fix the decision debt. It just hides the fact that the monorepo is too big. You add selective builds, so only relevant code rebuilds. But that doesn't fix the decision debt. It just hides the fact that you have too many teams with too many interdependencies. You add caching and distributed builds and parallel test execution. You're adding complexity to work around the fundamental problem, which is that your organization hasn't decided how to coordinate. The infrastructure doesn't fix anything. It just delays the reckoning. Eventually, you hit the wall where no amount of infrastructure engineering solves the organizational problem. Your CI becomes a nightmare because you're building everything for everyone. Your review process becomes glacial because you have too many stakeholders. Your releases become risky because you're coordinating too many changes at once. And at that point, the monorepo isn't the solution anymore. It's the problem. Now let's look at the other side of this choice. How multi-repo's work and their hidden tax. A multi-repo keeps your services, libraries, or products in separate repositories. It is not one massive repository. It is multiple repositories. You have one for your API service and another for your front-end application. You keep separate repositories for payment processing, notifications, and user management. Every single repository has its own code, its own build system, its own tests, and its own deployment pipeline. The boundaries are clear. Team A owns this repository while Team B owns that one. The code is separated, the deployments are separate, and the versions are separate. When Team A wants to deploy, they do not have to wait for Team B to finish their work. When Team B updates their service, Team A does not automatically pull in that change. The promise is explicit. Team autonomy. Each team controls their own repository and decides exactly when to deploy. You can iterate at your own pace without coordinating with anyone to push a change. You do not have to wait for code reviews from distant teams, and you do not even have to understand how anyone else's system works. You just control your own corner of the world. The architecture is built on contracts instead of shared code. If Team A needs to call a service owned by Team B, they use an API contract. Team B publishes the API and Team A consumes it. Team B can change their implementation as long as the API stays the same, and Team A can upgrade to a new version on their own schedule. They test it against their own code and deploy whenever they feel ready. This is elegant in theory. You have independent teams, clear interfaces, and minimal coordination. But here is what actually happens. The coordination problem does not disappear. It moves. In a monorippo, you see the problem during code review. A change ripples through the system, and you see every single place where it breaks. You fix all of those issues in one commit. The coordination is visible, and while it feels painful, it is concrete. In a multi-repo, the coordination problem becomes invisible. It hides an API design, version compatibility, release timing, and dependency management. When Team A needs a new feature from Team B, they cannot just modify the code because that code lives in a different repository. They have to ask Team B for help and explain the use case. Then they have to wait for Team B to prioritize the request, implement it, test it, and finally release it. What would have been a single commit in a monorippo becomes a month-long negotiation in a multi-repo. When Team B updates their API, they have to worry about backwards compatibility. They have to decide how long to support the old version, or if they should create a V2 API. Every consumer from Team A to Team D has to decide when to migrate. They probably will not all migrate at once, so you end up supporting multiple versions simultaneously. This makes your service more complex and forces your team to maintain code paths that only a few people use. When a critical bug is found in a shared library, it cannot be fixed in one place and consumed everywhere immediately. The library owner fixes the bug and releases a new version, but then every team, depending on that library, has to update their dependency declaration. They have to rerun their tests and deploy, which might conflict with other work or block their current release cycle. The coordination tax does not disappear. It moves from code review to dependency management. It moves from one integrated system to a bunch of loosely coupled services that have to negotiate with each other. And this tax is invisible. In a monorepo, when you make a breaking change to an API, you see the error immediately because the code will not compile. The tests fail and you have to fix it right there. The problem is concrete. In a multi-repo, when you release a new version of your service, you do not see who breaks. You release it to production, and three weeks later, somebody's integration fails. By then your change is months old and you have moved on to something else. The problem is abstract, hiding away and release notes and migration guides. The coordination also becomes more social. It is less about automated systems and more about meetings and process. You need API reviews, versioning discipline and release coordination. You need explicit communication about breaking changes and governance forums where teams negotiate over shared concerns. All of that requires organizational capability and discipline. It requires people to actually read the documentation and follow the processes you put in place. But here's the thing. It does not always work. Teams skip the API review, push breaking changes without coordination and fail to maintain backward compatibility. They update dependencies without understanding the impact. The informal coordination falls apart because there is no system to enforce it. Both choices have a text. The real question is which text you are actually paying. The real cost coordination overhead, here is what neither choice teaches you. Whether you choose a monorapal or a multi-rapo, you are going to have coordination overhead. You will have meetings, you will have waiting and you will have people blocked because they need input from someone else. You will deal with dependencies that do not move at the speed they should. That is not a technical problem, but a structural reality of building software with multiple teams. The question is not whether you have coordination overhead but the question is what form it takes. And that form is called organizational debt. Organizational debt is different from technical debt. Technical debt lives in the code, like the shortcut you took or the test you did not write. You can see it, quantify it and decide to pay it down. Organizational debt lives in the structure. It is the unresolved decisions, the ambiguity about ownership and the processes that nobody follows because nobody agreed on them. It is the complexity that accumulated because you never simplified it and the meetings that exist only because communication broke down in the system. Complex branching models are organizational debt. When you have five long-lived branches because you cannot figure out how to release from main, you are carrying organizational debt. When you have released branches because teams cannot coordinate their deployments, you are carrying organizational debt. When feature branches live for weeks because the change is too risky to merge, you are carrying organizational debt. Fragmented repositories are also organizational debt. When you have dozens of repositories because teams cannot agree on shared standards, you are carrying organizational debt. When you have API versioning nightmares because you never established a policy, you are carrying organizational debt. When you have to maintain multiple versions of a library because nobody will coordinate a migration, you are carrying organizational debt. The cost of that debt is invisible. It does not show up as a line item in your budget and it does not slow down your build or make your tests fail, but it is there every single day in the form of coordination overhead. Here is what the research actually says about this. High performing teams keep their collaborative overhead below 35% of their total time. That means 35% of their day is spent in meetings, waiting for input and unblocking dependencies. The other 65% is spent actually building. That threshold matters because it is the boundary between being productive and being stuck. Below 35% you are still a team that builds things. You have meetings and a coordination tax but it is manageable, it is just the cost of working together. Once you cross that line, you are in a different mode. You are no longer primarily building but primarily managing. You spend your time in meetings deciding how to coordinate, waiting for sign-offs and managing structure instead of building features. Most large organizations exceed that threshold easily. I have seen organizations where collaborative overhead is above 50%, meaning half the day is just coordination. That is not an outlier, that is normal. Your monorepal choice determines whether you see that overhead or not. In a monorepo, the coordination overhead is visible. It shows up in code reviews, build times and test failures. It shows up when you cannot merge because team C has not approved your change. The overhead is concrete, so you can see it, measure it and point to the exact cost. In a multi-repo, the coordination overhead hides. It hides in API design meetings, release planning and dependency management. It hides in the fact that you cannot deploy on your own schedule because you are waiting for another team to release. The overhead is there and you are definitely paying it, but it is invisible. You just feel slower than you should be without understanding why. This is where the architecture question becomes a business question. Once you see the coordination overhead, you have to decide what to do about it. You cannot just let it sit there and pretend it does not exist. You have to either pay down the organizational debt or accept that your organization will never move faster than that threshold allows. Most organizations make the wrong choice. They accept the overhead and the slow coordination. They accept the 35% benchmark as just how big organizations work and then they wonder why their competitors move faster. But there is another option. Why teams choose mono-repos? The real reasons. Teams don't adopt mono-repos because GitScale is better. Let's be honest about that. If scalability was the only issue, most organizations would just use a multi-repo. Separate repositories work fine at scale. You don't hit some magical technical ceiling where the system just snaps. The real reason teams choose mono-repos is because coordination in a multi-repo is painful. And they're willing to accept a different kind of pain to make the workflow, but here's the problem. A mono-repo makes cross-cutting changes atomic. When you're moving fast, when you're iterating, when you're responding to market feedback, you need to make changes that span multiple systems. Your API layer needs to change. Your authentication model needs to change. Your data contract needs to change. In a mono-repo, you make that change once, one commit, one code review, one deployment, everything moves together. Everything is validated together. Everything breaks together if it's going to break. And that's the point. You catch the problem immediately instead of discovering it in production when you try to integrate three different services. It's fast, it's coordinated. It doesn't require negotiation with other teams about when they're going to update their dependencies. It doesn't require waiting for multiple deployments to align. It doesn't require release notes and migration guides. You change the thing, you test the thing, you deploy the thing, done. This is powerful when your teams are actually co-located or well aligned, when team A and team B are in the same organization. They talk every day. They understand each other's constraints. They can coordinate quickly. A mono-repo lets them move at the speed of conversation. Instead of the speed of formal process, but there's another reason teams choose mono-repos. And it's more subtle. It's because they want to enforce standards when you have a strong platform team, a group of engineers who own the shared infrastructure. Who set the standards? Who decide how things should work? A mono-repo is a tool for enforcement. The platform team can enforce the limiting rules on every project. They can enforce testing standards. They can enforce naming conventions. They can decide what version of the compiler everyone uses. They can ensure everyone uses their shared authentication library instead of rolling their own. In a multi-repo, enforcing standards is soft. You can publish guidelines. You can create templates. You can ask teams to follow the policy. But you can't force it. Teams that own their own repositories can always decide to diverge. They can use their own build system. They can use their own authentication model. They can refuse to upgrade a shared library because they don't want to deal with the migration. In a mono-repo, enforcement is hard. There's only one build system. So you use the one the platform team chose. There's only one version of the authentication library. So you upgrade when the platform team upgrades. There's one-linting configuration, one testing framework, one deployment pipeline. You can't opt out because the code you're working on lives in the same system as everything else. For organizations that value consistency and coherence, that matters a lot. But here's the critical thing that decides whether a mono-repo actually succeeds. You have to invest in the infrastructure to make it work. Not just the git infrastructure, though that matters. You need the Spass checkout tool. So teams aren't downloading code. They don't need. You need the partial clone. So history doesn't become a bottleneck. You need the selective build so you're not recombiling everything. You need the caching. So repeated builds are fast. But also the organizational infrastructure. You need a clear governance model. You need documented standards. You need a platform team that's actually resourced to maintain and enforce them. You need onboarding their teachers' teams. How to work in the mono-repo without breaking things. You need clear ownership of different parts of the system. Most organizations don't have that capacity. Most organizations choose a mono-repo. Expect it to solve their coordination problems. And then discover that it just concentrates the coordination problem into one system without providing the infrastructure to manage it at scale. And that's where most organizations fail. The infrastructure trap. And this is where most organizations hit the infrastructure wall. A large mono-repo isn't just git. It's not just throw everything in one repository and let git handle it. That's a catastrophic misunderstanding. Git handles it fine from a version control perspective. The problem is everything else. Large mono-repos require tooling that doesn't come with git by default. Spass checkout is the first piece. This lets developers clone the repository, but only check out the directories they actually work on. You're pulling down the metadata for the entire mono-repo. You need to know about all the dependencies, all the structure, but you're not materializing the files you don't need on your local disk. Without this, a developer working on one service is downloading gigabytes of code for services they'll never touch. Partial clone is different. Partial clone lets you defer downloading file contents until you actually need them. You clone the repository, you get the history, you get the file names, but the actual file contents are lazy loaded. When you try to read a file, it downloads on demand. This cuts initial clone time from hours to minutes for massive repositories. Selective builds are where the real work happens. When a developer pushes code, you don't rebuild the entire mono-repo. You only rebuild the parts that changed. The services that depend on the changed code, the tests that are affected, you need a build system that understands the dependency graph deeply enough to know what changed and what it impacts. Most build systems don't have this. You need something sophisticated, something that knows which tests actually exercise which code paths. Caching is the final pillar. Build outputs need to be cached and reused across developers and CI runs. If one developer built a particular component and it hasn't changed, the next developer should use the cached result instead of rebuilding. This requires infrastructure to store and distribute those caches reliably. It requires coordination so that cache invalidation works correctly. This isn't optional infrastructure. This is essential. Without sparse checkout, your developers wait forever to clone. Without partial clone, your history becomes a bottleneck. Without selective builds, your CI takes hours. Because you're rebuilding things that haven't changed. Without caching, your builds are slow and resource-intensive. But here's the thing most organizations don't understand. Building this infrastructure is expensive. It takes years. It requires specialized engineers who understand both the domain and the problem deeply. Google built their monorepo infrastructure over decades. They have engineers whose entire job is making the monorepo work at scale. They built a custom build system called Basel, specifically to handle the dependency graph complexity. They built distributed caching infrastructure. They built distributed testing orchestration. Meta did the same thing. They built their own build system. They built sapling their own version control system, specifically because Git didn't do everything they needed for their monorepo. They invested substantially. Microsoft invested substantially. They built infrastructure for their monorepo. They built systems to handle the scale of their cloud services. Your organization probably doesn't have that capacity. Most organizations don't have a team of engineers dedicated to build system infrastructure. Most organizations don't have the budget to build custom tooling. Most organizations are running on whatever Git and whatever standard build system they happen to have without the specialized infrastructure that makes a large monorepo actually work. So what happens? You choose a monorepo. You expect it to solve your coordination problems. You expect developers to work efficiently. But then you hit the wall. Clones take too long, builds take too long. Spars checkout doesn't work right because nobody's maintained it. CI becomes glacial because you're trying to build and test the entire system on every change. Developers get frustrated because they're waiting all the time. The monorepo doesn't become a source of speed and coordination. It becomes a bottleneck. It becomes the thing slowing everyone down. It becomes the thing people complain about constantly. And at that point you've made the problem worse. Not better, you've taken the coordination problem that was invisible in a multi-repo or manageable in a smaller monorepo. And you've made it into an infrastructure problem that impacts every single developer every single day. That's the infrastructure trap. You choose the right structure but without the infrastructure to support it, the structure becomes a liability instead of an asset. Now let's talk about what actually happens when the monorepo breaks. The fragmentation problem. Repository level. Here's the thing about fragmentation that most organizations don't see coming. It's not about having too many repositories. It's not about Git repository count. The problem isn't, we have 40 repos instead of one. The problem is having the wrong repositories. Having repositories that don't match how your teams actually work. Having boundaries in the wrong places. Having a structure that forces you to work around the system instead of with it. When you have a monorepo that's too large, when you've hit the infrastructure wall and builds, our slow and coordination is painful. Something interesting starts to happen. Teams don't abandon the monorepo. They stay committed to it for the reasons they chose it in the first place. The shared standards, the ease of cross-cutting refactors, the unified visibility. But they stop using it the way it was designed. Instead they start creating workarounds. They carve out informal boundaries within the monorepo. Team A decides they're only going to touch their service and the shared libraries it directly depends on. They set up sparse checkout to only pull down those directories. They configure their local build to only rebuild what they need. They create local branch workflows that diverge from how everyone else is supposed to work. Team B does the same thing. They create their own checkout pattern. Their own build configuration. Their own branching convention. What was supposed to be one unified monorepo becomes a collection of de facto separate repositories all living within the same git instance. Parallel development tracks emerge. Team A is working on version 3.2 of a shared library. Team B hasn't upgraded yet. Team C skipped version 3.1 because of breaking changes they didn't want to deal with. So now you have different versions of the same library in flight in different parts of the monorepo. That shouldn't be possible. The whole point of a monorepo is one version of everything, but it is. Teams are managing their own checkouts, creating workarounds to avoid the coordination tax. The selective builds become selective in ways they weren't designed to be. A team configures their CI to only run tests for their service. They skip the cross cutting tests that would tell them if their change breaks anything else. They do this not out of malice but out of necessity. The full test suite takes too long. They can't wait for it. So they create a parallel testing world where they test only their part. Selective builds become invisible silos. You end up with local knowledge about which builds matter and which don't. You end up with developers who know they need to manually run a broader test if they're touching a shared library, but newer team members don't know that. You end up with breakage that should have been caught by automated tests but wasn't because the automated tests were configured to skip the affected areas. And here's what emerges from all of this. You end up with the worst of both worlds. You have a monorepo, so you have the centralized coordination problem, the unified build system, the everything is in one place infrastructure overhead. But you also have informal fragmentation. You have workarounds that make the system harder to understand. You have local conventions that contradict the global ones. You have implicit boundaries that contradict the explicit structure. The result is invisible coupling. Team A thinks they're isolated. They're only working on their service. But their service depends on a shared library that team B is changing. They don't see the dependency because it's hidden in the sparse checkout configuration. They don't know they need to coordinate because the system doesn't make it explicit. The deployment happens and something breaks. Unclear ownership becomes the default state. Nominally ownership is clear. There's a code owner's file. There's documentation. There's a team responsible for each service. But because teams are working around the system, the actual ownership becomes fuzzy when something breaks in the shared library. Who do you call? The official owners? But they didn't change it directly. They changed something else that broke it indirectly. Do you call the person who works on that part most frequently? Do you call the team who's changed calls the cascade? Slow integration becomes endemic. You're not getting the benefits of a monorepo. Atomic changes, unified testing, comprehensive validation because the workarounds have created implicit fragmentation, but you're also not getting the benefits of a multi-repo, clear contracts, explicit versioning autonomous teams. You're stuck in a hybrid state that has the downsides of both. This is fragmentation at the repository level. Not we have too many repositories per year, but we have a repository structure that doesn't match our actual work patterns. So we've layered workarounds on top of it that make the system harder to understand and harder to reason about. And this fragmentation at the repository level is a symptom of something deeper. It's a real fragmentation, organizational level. The mess in your repositories is just a symptom. It's a sign of something deeper happening inside your company. There's a rule in systems thinking called Conway's Law. It says that the structure of your software will always mirror the structure of your organization. If you have separate teams for backend, frontend, and operations, your code will have those same walls. If you organize around products where one team owns everything from the database to the UI, your code will follow that path. You can't separate the two. The boundaries in your code are just a map of the boundaries in your office. This works both ways. Your repository setup didn't just appear out of nowhere. It grew out of how you decided to structure your teams. And once that code structure exists, it locks those organizational silos in place. The moment you create separate repositories for backend and frontend, you've made it a physical reality that those are separate teams. You've drawn a line in the code that makes it much harder to redraw the lines in your organization later on. But here's the problem. If your teams are siloed, your repositories will be siloed. It doesn't matter if you pick a monorepo or a multi-repo. If your teams don't talk, if they have different goals, if they report to different bosses and follow different road maps, your code base will show it. In a monorepo, you'll see parts of the code that never actually touch. In a multi-repo, you'll see services with messy contracts and zero coordination. The fragmentation is there either way. And if your teams aren't aligned on standards, your code will be a mess. You can try to force standards in a monorepo because everyone uses the same build system, but if those rules don't make sense for how the teams actually work, they will find a way around them. They'll just end up with inconsistency hiding under a thin layer of uniformity. Because in reality, the repository doesn't fix the people. On the other hand, if your teams are coordinated and talk every day, a multi-repo can work perfectly. You get clear contracts between services and independent deployments that don't break things. And there is some extra work to keep things in sync, but it's manageable because the teams are moving in the same direction. They aren't fighting the system. They're using it. That's the critical insight. The repository choice doesn't fix organizational fragmentation. It just changes how you see it. A fragmented organization will eventually break a monorepo. You'll end up with informal boundaries and hidden dependencies that make the system impossible to understand. People will start complaining that the monorepo is slower on wieldy and they'll blame the tool. But the tool isn't the problem. The problem is that the organization isn't aligned enough to use a unified system. If you take that same fragmented organization and give them a multi-repo, the problems become explicit. You'll run into API versioning nightmares and release delays because nobody knows who owns what. People will say the multi-repo is inefficient, but that inefficiency is just an honest look at the fragmentation that was already there. So what's actually happening when your architecture feels broken? It's not that your repository strategy is wrong. It's that your organization is fragmented. And the repository you chose is just the container where that fragmentation lives. You can't fix a communication problem with a folder structure. You can only choose which version of the problem you want to deal with it. If this changed how you think about your architecture, follow me, Mercopeders, Unlinked in. The real fragmentation, organizational level. But the repository level fragmentation is just a surface symptom of something much deeper happening in your organization. There's a principle in systems thinking called Conway's Law. It says the structure of a system reflects the structure of the organization that built it. If your organization is built around functions, separate backend teams, separate front end teams, separate ops teams, your architecture will look exactly the same way. If your organization is built around products, teams that own an entire feature from the database to the UI, your architecture will be organized around products. You can't separate the two. The boundaries in your code mirror the boundaries in your organization. This works in both directions. Your repository structure didn't randomly emerge from nowhere. It came from decisions about how your organization is structured. And once it exists, it reinforces those organizational boundaries. Once you have separate repositories for backend and front end, you've made it concrete that those are separate teams. Once you've drawn the line there in code, it becomes much harder to redraw it in the organization. But here's the problem. If your teams are siloed, your repositories will be siloed. It doesn't matter if you choose Monorepo or Multi-Repo. If your teams don't talk to each other, if they have different priorities, if they report to different leaders, but if they have different budgets and different roadmaps, then your codebase will reflect that. In a Monorepo, you'll see it as separate parts that don't really integrate. In a multi-repo, you'll see it as repositories with unclear contracts and minimal coordination. But the fragmentation will be there either way. And if your teams are misaligned on standards, your code will be inconsistent, regardless of repository strategy. You can enforce standards in a Monorepo because there's only one build system for everyone to use. But if the standards don't make sense to the teams, if they conflict with how those teams work, then teams will find workarounds. You'll get inconsistency hidden beneath the surface of uniformity. Conversely, if your teams are well coordinated, if they talk frequently, if they understand each other's constraints and priorities, then a multi-repo can work beautifully. Clear contracts between services, explicit versioning independent deployments, yes, there's overhead, but it's manageable because the teams are aligned. They're not fighting the system. They're working with it. The repository choice doesn't fix organizational fragmentation. That's the critical insight. It doesn't fix it. It just exposes it in different ways. The fragmented organization will fragmented a Monorepo. You'll end up with workarounds and informal boundaries and implicit coupling. The system becomes hard to understand because the structure doesn't match how the teams actually work. A coordinated organization can make a multi-repo succeed. The teams communicate. The contracts are clear. Integration points are explicit. The coordination burden exists, but teams shoulder it together because they're aligned on the mission. This means choosing a Monorepo thinking it will solve coordination problems is a strategic mistake. You can't fix organizational fragmentation with a repository decision. You can only choose which form the fragmentation takes. If you choose Monorepo in a fragmented organization, you're making the fragmentation invisible. It hides in sparse checkouts and selective builds and informal boundaries. People think the Monorepo is slower and wieldy. They blame the tool. But the tool isn't the problem. The problem is that your organization isn't aligned enough to use a unified system effectively. If you choose multi-repo in a fragmented organization, you're making the fragmentation explicit. It shows up as API versioning challenges and release coordination problems and unclear contracts. People think the multi-repo is inefficient. But the inefficiency is just an honest representation of the organizational fragmentation that already existed. So what's actually happening when you experience fragmentation in your architecture is this. It's not that your repository strategy is wrong. It's that your organization is fragmented. The repository strategy you chose is just the container where that fragmentation manifests. The communication architecture model. Here is the frame shift that changes everything. Repository strategy isn't about how you store code. It isn't about git performance, scalability, or build times. Those are just downstream consequences. The real choice you are making when you pick a Monorepo or a multi-repo is a choice about how your organization will communicate. Think about it this way. When you put all your code in a Monorepo, you are making a statement about communication. You are saying that you are one system. All changes that affect the system must be visible to every part of that system at the same time. If your backend changes in API, the front end sees that change immediately. If you add a new field to a shared data model, every service using that model sees it. The communication happens through code. It happens through shared visibility. It happens because when you change something in the center, the impact ripples everywhere. Communication in a Monorepo is synchronous. It is visible. It happens through code review and failing tests. It happens through CI systems that validate that everything still works together. The coordination problem is front and center. You cannot hide from it. You have to address it the moment you make the change instead of waiting until you try to integrate later. A Monorepo centralizes communication into code, CI, and shared processes. The message your structure sends is that you coordinate tightly, you move together, and you validate together. Now take the opposite choice. You put each service in its own repository. You are making a different statement about communication. You are saying that you are many systems. Each system can evolve on its own. Communication between these systems happens at the boundary. It happens through contracts, APIs, and explicit versioning. Communication in a Monorepo is asynchronous. It is formal. It happens through published APIs, release notes, and versioning contracts. It happens through migration guides that explain how to upgrade to a new version. It happens through meetings where teams negotiate what the API should be before anyone even writes the code. The coordination problem is invisible in daily work, but it emerges at integration points. You do not see it until you try to deploy. You do not see it until you upgrade a dependency and something breaks. You do not see it until you realize that two teams built incompatible versions of the same thing because they were not looking at each other's code. A Monorepo decentralizes communication into APIs, contracts, and governance forums. The message your structure sends is that you move independently, you coordinate at boundaries and you respect each team's autonomy. Neither model is better. That is the thing. They are not better or worse. They are different communication architectures. They encode different assumptions about how your organization works. They create different friction points. They are quite different kinds of discipline. If you have a communication style that works by sitting together and talking frequently, then the Monorepo synchronous model fits. You can move at the speed of conversation. You can see ripple effects immediately. You can coordinate through shared code and shared process. If you have a communication style that works by publishing clear contracts and respecting boundaries, then the multi-repo asynchronous model fits. You can move independently. You can deploy on your own schedule. You can own your own destiny within your domain. But here is the critical insight. The fragmentation happens when your communication model does not match your actual communication patterns. If you adopt a Monorepo, but your teams actually communicate asynchronously, you have created a mismatch. If they are distributed across time zones and do not talk to each other, they have to coordinate through formal processes instead of sitting together. The Monorepo assumes synchronous communication, but you are operating asynchronously. That mismatch creates friction. It creates workarounds. It creates fragmentation. Conversely, if you adopt a multi-repo, but your teams actually need to communicate synchronously, you have a different problem. If you are moving fast and need cross-cutting changes to happen all at once, the formal contract model creates bottlenecks. You end up constantly negotiating about APIs. The multi-repo assumes asynchronous boundary-based communication, but you need synchronous coordination. The real fragmentation isn't about how many repositories you have. It is about the gap between the communication model your structure assumes, and the communication model your organization actually uses. Diagnosing your actual communication pattern. So now the practical question is, how you know if you have that mismatch? How do you figure out what your organization actually needs versus what your repository structure assumes? The answer is simpler than you might think. Stop looking at your documentation. Stop looking at your org chart. Stop looking at how you are supposed to work. Look at how you actually work. Watch what happens when a change needs to be made. Let's say your product team decides you need to add a new field to a core data model. This field needs to be added to the API, consumed by three different services, stored in the database, and surfaced in the UI. Now watch what happens next. If most of the work happens in one repository with one code review and one deployment, you have high coupling. The field gets added to the data model and the API gets updated. The three services in the UI get updated, one pull request, one review, and one deployment means everything moves together. That is the signal. When changes like this are atomic and move together, your teams have high coupling. They need to coordinate frequently. They need to see each other's changes immediately. They need unified visibility. A monorepo makes that work. A monorepo says that this is how you operate. But imagine the same change requires coordinating across repositories. If the data model lives in one repo and the API in another, while each service and the UI have their own repositories, the process changes completely. You have to make the change in the data model repo first and wait for that to be released. Then you update the API repo to depend on the new version, then you update each service, and finally you update the UI. If it takes days or weeks to complete because each repository has its own release cycle, then you have low coupling. Your teams move independently. They do not need to coordinate frequently. They need explicit contracts. A multi-repo works for this. A multi-repo says that you move independently and talk at the boundary. But here is where most organizations are actually living. They are in between. Some changes are independent. Team A can add a feature to their service without touching anything else. They deploy on their schedule and they own their domain. That is low coupling. But other changes require coordination. The API team needs to work with the backend team. The front end team needs to work with the data team. Some changes are atomic while others are distributed across time and space. That is when you know you have a structural mismatch. If you have chosen a multi-repo for this scenario, the independent changes work great. Team A ships fast. But the coupled changes are painful. You are stuck coordinating across repositories, managing, versioning and negotiating about API contracts. The multi-repo structure assumes low coupling, but you have a mix. If you have chosen a monorepo for this scenario, the coupled changes work great. They make the change automatically. But the independent changes feel heavy. Team A has to wait for the full build. They have to go through the unified review process. They have to work within the constraints of the monorepo's infrastructure. The monorepo structure assumes high coupling, but you have a mix. The mismatch creates friction. Here is the diagnostic. Look at where your friction is concentrated. If you are experiencing long review cycles and slow builds while developers complain that the system is heavy, but your teams actually work independently, then you probably have a monorepo that assumes more coupling than you actually have. You have built a heavyweight system for a lightweight problem. If you are experiencing coordination nightmares and release scheduling problems while your teams actually have high coupling, then you probably have a multi-repo that assumes more autonomy than you actually have. You have built a lightweight system for a heavyweight problem. The fragmentation you are experiencing isn't random. It is structural. It is the system telling you that the communication model, your repository choice assumes, does not match the communication model your organization actually uses. That is the diagnosis. The next question is what you do about it. AI code generation and the verification tags. The monorepo myth is becoming dangerous. In 2024 and 2025, your organization is changing because AI code generation is now the standard. Developers are using GitHub, Co-Pilot, Claude and Curse to write code faster than ever before. The data on this shift is clear. AI generates code about 50% faster than a human can type. This isn't just a small productivity boost. It is a structural shift in how fast we produce software. A developer with an AI agent can implement a feature or write boilerplate in half the time. They prototype faster. They iterate faster. But here is where the model breaks. That AI generated code is sitting in code review 4.6 times longer than human written code. We have a strange dynamic where code is produced at double the speed but reviewed at half the speed. The acceleration on the generation side is being completely canceled out by the deceleration on the review side. So why is this happening? It isn't because your reviewers are lazy or your processes are broken. It's because of fragmentation. Your coordination system wasn't designed to handle this volume of change. Think about what happens when an AI generates a new API endpoint. In a fragmented architecture that change doesn't exist in a vacuum, the endpoint depends on authentication, database updates and security validation. It has to stay consistent with how every other endpoint works. In a monorepo with tight coupling, these dependencies are visible immediately. The AI's change triggers tests that fail because the database hasn't been updated yet. It triggers linting failures because the code doesn't match your standards. All these issues surface during the review. The reviewer has to read the AI code, figure out what it's trying to do and validate every place it touches. That takes time. And it takes more time than reviewing human code because AI is often less coherent. It solves the immediate problem but lacks the context a human brings. A human developer asks where a change fits in the broader architecture. An AI just looks at the spec and generates something that technically works but might not fit the big picture. The reviewer has to fill in those gaps. They have to validate the architectural fit, not just the code. In a multi-repo setup, a different problem emerges. The AI might change a services internal API but that change has to be backward compatible. Now, the review has to validate the contract with other teams. Does this break something downstream? Does someone need to update the documentation? The verification burden explodes. But here is the critical insight. AI generated code is produced at such a high volume that it simply overwhelms your coordination system. One developer using an AI tool can generate as much code in a day as they used to generate in a week. When you multiply that across a whole team, the volume of code hitting your bottlenecks increases dramatically. Your organization was not built to handle that much code while maintaining quality. You end up in a state where AI accelerates production but slows down integration. You are paying a verification tax at the point of maximum fragmentation. If your organization is already struggling to coordinate, AI won't solve that. It amplifies it. It makes the bottleneck visible because that's where all the work is piling up. The fragmentation you used to hide is now impossible to ignore. The monorepo myth. But everyone gets wrong. We need to talk about what you've been told a monorepo will do for you. There is a myth at the center of this decision that leads most organizations astray. The myth is that a monorepo will reduce your coordination overhead and make you move faster. That's the pitch. You put all the code in one place and unify the build system. You enforce one set of standards. No more versioning nightmares or release conflicts. Everything moves together and gets tested together. It's a seductive idea because it sounds like it fixes the coordination problem directly, but the reality is different. A monorepo does not reduce coordination overhead. It makes that overhead visible and concentrated. The problem doesn't go away. It just stops being invisible. In a multi-repo world, coordination overhead is distributed. It hides in meetings and API contracts that take weeks to negotiate. It hides in version management and release schedules. It's there, but it's spread out across the system so you can pretend it isn't happening. In a monorepo, that overhead is concentrated. You see it in code reviews and long build times. You see it in merge conflicts because everyone is touching the same shared code. You see it in CIFalias because when one service breaks, the impact on everything else is immediate. The problem becomes undeniable. This is where most organizations hit a wall. They adopt a monorepo thinking it will reduce friction. For about six months, it feels like it's working. Cross-cutting changes are easier and the tooling feels clean. But then the monorepo hits an inflection point. The number of teams grows and the dependencies multiply. Suddenly you are dealing with the same coordination problems you had before, but now they are all in one system. Because they are concentrated, they are uncomfortable. You have slow builds because you're building more code. You have merge conflicts because multiple teams are hitting the same files. You have CIFalias that ripple across the entire organization. The overhead that used to be hidden is now impossible to ignore. At this point, many organizations make the wrong move. They think the monorepo was a mistake and they try to split it apart again. But they are missing the point. The coordination problem was always there. The monorepo just exposed it. And that visibility is valuable if you actually use it. A monorepo doesn't fix organizational fragmentation. It exposes it. If your teams aren't aligned or they aren't communicating, a monorepo forces you to deal with that right now. You can't hide from it. It's right there in your builds and your reviews. A fragmented organization will blame the monorepo. They'll say it's slow or hard to work with. They'll split it up so the coordination problem becomes invisible again. Then they can go back to thinking it's manageable. But a coordinated organization sees something else. They see exactly where the friction is. They see which teams depend on each other and where decisions need to be made. They invest in the infrastructure to make it work. They clarify ownership and align teams around shared standards. They build a CI system that can handle the complexity. They do the actual organizational work. The monorepo becomes a tool for moving fast. Not because the problem went away, but because the problem is being actively managed. That is the myth we need to break. The choice of repository won't solve your coordination problems for you. It won't. But it will show you where they are. And that is only valuable if you're willing to face what it's showing you. The real work. Organizational debt repayment. Now you know what the actual problem is. It's not the repository strategy. It's not Git. It's not the build system. The actual problem is organizational debt. Organizational debt is what happens when you accumulate unresolved decisions. It's the result of compromises that feel necessary in the moment. You say, "We'll deal with this later. We'll clarify ownership next quarter. We'll standardize the process once we have more capacity." And then next quarter comes. And you still haven't dealt with it. Now there's a new problem. The old one gets pushed down the list again. That's organizational debt. It's the accumulation of things you decided to live with instead of fix. And like financial debt, it costs you interest. Every day you live with an unresolved decision. Every day you operate with unclear ownership. Every day you have a duplicated process instead of a unified one. That's costing you. It costs you in slow decisions. It costs you in wasted coordination effort. It costs you in mistakes that happen because ownership is ambiguous. Complex branching models are organizational debt. You have a strategy that made sense at some point or at least felt safer than the alternative. But now you're maintaining it even though it's slowing you down. That's debt. The ownership is organizational debt. When someone changes code and nobody knows who to talk to. When a service breaks and three different teams could be responsible. When there's a code owner's file but nobody actually knows who owns it. That's debt. Duplicated processes are organizational debt. Team A has a different build process than Team B because they evolved separately. Nobody took the time to unify them. One team uses one branching convention and another team uses a different one. Approval process is vary by team or by service. That's all debt. All accumulating costs that you're paying invisibly through coordination overhead. Fixing fragmentation isn't about choosing a better repository strategy. You can't choose your way out of organizational debt. You can't buy a tool that solves it. It's not a technical problem that has a technical solution. Fixing fragmentation requires doing the actual work of organizational debt repayment. It requires clarifying ownership, sitting down and deciding who owns this service, who owns the shared library, who decides when we make breaking changes, who gets paged at three in the morning when it breaks. And then documenting that. Making it real, making it the truth, not a best guess. It requires simplifying decision parts. If a decision takes three layers of approval, you have organizational debt. If a change requires consensus from six different teams, you have organizational debt. Repaying that debt means pushing decisions down. It means asking what's the minimum approval required to make this decision safely. And then building a system that enforces that. Nothing more. It requires standardizing processes, not for standardization sake. But because every variation in process is cognitive load. We do it this way in this team, but that way in that team is a small tax. It's a tax on every person trying to work across boundaries. Standardizing means picking one way and committing to it. Not always the best way. Just one way and everyone using it. Most organizations don't do this work. Because it's hard because it's not visible in the sprint backlog. Because it doesn't feel like shipping features. The debt is being paid invisibly as coordination overhead. And when you're paying invisibly, you can kind of pretend it's not there. But here's the problem. Organizations that don't do this work. They stay fragmented. They swap repository strategies and think that will help. They buy new tools and think that will help. They implement new branching models and think that will help. And nothing changes. Because the actual problem, the organizational debt, the unresolved decisions, the unclear ownership is still there. Organizations that do do this work. They look completely different. They move faster. Not because of their repository strategy. But because there's less coordination overhead to wade through, they make better decisions. Not because they're smarter. But because decision paths are clear and responsibility is explicit, they onboard people faster. Not because of their tools. But because the standards are consistent and the ownership is unambiguous. The question isn't whether you'll do this work. The question is whether you'll do it intentionally. Or whether you'll keep paying the debt invisibly. Wondering why your organization feels slow. There's a pattern in organizations that actually solve this problem. And it's worth understanding. The trunk-based development pattern. The pattern looks like this. High performing organizations don't use complex branching strategies. They don't maintain long-lived release branches. They don't use separate development branches or intricate promotion paths. They use something called trunk-based development. In trunk-based development, there's one primary branch. It's usually called main or master. And the way it works is simple. Developers work on features in short-lived branches. When a feature is ready, they merge it back to main. The whole cycle happens fast. A branch might exist for a few hours or a few days, not weeks, not months, but days at most. The key is that main is always in a deployable state, always. Not. We hope it's deployable. Not, it should be deployable once we run the full test suite. But actually, provably, measurably in a state where you could deploy it to production right now if you needed to. And because main is always deployable, because changes are moving to main frequently. The coordination problem doesn't pile up. Think about the alternative for a second. In a complex branching model, you have a feature branch that lives for weeks. During those weeks, other changes are going to main. Other branches are being worked on. The longer the feature branch lives, the more it diverges from main. When you finally try to merge it back, you have massive conflicts. You have to resolve weeks of other people's changes. You have to retest everything because the codebase has moved so far. The coordination problem compounds. It accumulates by the time you merge, you're dealing with a huge coordination burden. In trunk-based development, you don't let that accumulate. You merge frequently. You deal with conflicts as they happen, not later when they're exponentially worse. You see the impact of your change on other work immediately. Not weeks later when it's intertwined with a dozen other changes. The coordination still happens, but it happens continuously in small increments rather than in batches at the end. And this is why it works for organizations that are trying to solve their fragmentation problem because fragmentation gets solved by making coordination a continuous, visible process. Not by trying to eliminate it, not by trying to hide it, but by making it the default state. Now, does trunk-based development require infrastructure? Yes. You need strong CI/CD. You need automated testing that runs quickly and validates that main is actually deployable. You need feature flags so that you can merge incomplete work without exposing it to users. You need monitoring and observability so you can catch problems quickly when they do happen. But here's the critical thing. Those are tools. They're important tools. But they're not the core requirement. The core requirement is that your teams are aligned on what "done" means. If you have two teams with different definitions of "done". trunk-based development will expose that immediately. Team A thinks "done" means my feature works locally. Team B thinks "done" means my feature has been tested in production for a week. If those definitions are different, trunk-based development breaks because you're merging constantly to main. If main is always supposed to be deployable, but half your team thinks deployable is flexible and the other half thinks it's rigid, you're going to have problems. But that's not a problem with trunk-based development. That's a problem with organizational misalignment. And trunk-based development forces you to deal with it. It won't let you pretend it's not there. A coordinated organization can use trunk-based development beautifully. The teams agree on what "done" means. They enforce it through automated testing. They merge constantly. They move fast. The coordination is continuous but manageable because everyone's pulling in the same direction. A fragmented organization will try trunk-based development and fail. They'll blame it. They'll say trunk-based development doesn't work at scale. It requires too much infrastructure. It's too risky. But what they're actually discovering is their fragmentation. The tool is just making it visible. The pattern isn't that trunk-based development solves everything. The pattern is that successful organizations use trunk-based development because they've already done the work of alignment that makes it viable. And the continuous coordination that trunk-based development requires keeps them aligned. It prevents fragmentation from creeping back in. Microsoft's release flow model, the blueprint. Now let's look at what happens when an organization actually implements this at scale. When they take trunk-based development and they do it right. Microsoft is the perfect example here. They build a model that is incredibly instructive because of the sheer scale they deal with every single day. Microsoft operates M365. That's Outlook, Teams, SharePoint, OneDrive, Exchange Online. These services are massive. They have millions of people using them at the same time. They process billions of operations every day. The complexity is staggering. And yet, Microsoft deploys changes to production multiple times per day, not once a week, not once a day, multiple times across all of those interconnected services. How do they do that? They use something called release flow. Release flow is the blueprint for making trunk-based development work when you have thousands of developers. Here is the model. The team develops on a single trunk. That is the main branch. Changes are small. They merge frequently. The main branch is always in a state where it could be deployed. All of this is standard trunk-based development. And here is where release flow adds the critical layer. Instead of deploying directly to everyone, instead of saying we merged it so everyone gets it, they deploy in rings. The first ring is the canary. It is a tiny percentage of users, maybe 1%. The code goes to production, and it starts processing real traffic for a very small group. The monitoring is watching. If something breaks, you see it immediately. You can roll back, you can fix it, you can redeploy. But the blast radius is tiny because you only affected 1% of your users. If the canary is stable and the monitoring looks clean, you move to the next ring. Maybe 5% of users, then 20%, then 50, then everyone. Each ring takes time. Each ring gathers more data. Each ring proves that the change is safe. And you only move forward if the previous ring succeeded. This model separates two things that most organizations confuse, deployment and release. Deployment is putting the code on servers, making it live, making it handle traffic, release is letting users see it, making it available to customers. Most organizations treat these as the same thing. You deploy and you release at the same time. The code goes live and the users see it. Microsoft separates them. Code gets deployed in the canary ring, and it is live. But it is not released to users. The code is running. But users do not see it. Feature flags control the experience. So the canary ring is running the new code, but users still see the old behavior because the flag is off. Once you are confident the code is safe. Once you have moved through the rings and proven it works. Then you flip the flag. That is the release. It can happen instantly. It can happen gradually. It is completely decoupled from the deployment. This matters because it changes the risk profile. In traditional models, the risk of shipping bad code is acute. You deploy and everyone sees it immediately. If something goes wrong, it goes wrong for everyone. The pressure to be perfect is enormous. The testing is slow. The review is heavy. And you still deploy in frequently because the stakes are too high. With release flow, the risk is distributed. You deploy to 1%. If it breaks, you catch it. You roll back. Only 1% of users had a problem. The stakes are lower. The blast radius is controlled. And that means you can deploy more frequently. Each deployment is lower risk. You can deploy throughout the day because you aren't coordinating a massive event. You are just moving code through a canary and waiting for it to prove itself. Trunk-based development provides the coordination. Release flow through rings provides the risk management. Feature flags provide the decoupling. Together they form a model that works at scale. Not because the coordination problem went away. But because the coordination is continuous and the risk is managed. This is what fixing fragmentation actually looks like. How to measure fragmentation, the real metrics. So now you understand the actual problem. It is organizational debt. It is about alignment and coordination patterns. You know that your repository strategy is just a symptom. But how do you know if you are fragmented? How do you actually measure it? This is where most organizations get it completely wrong. They count repositories. They count branches. They measure build times and code review latency. They look at door or metrics and cycle time in all the technical signals that feel like they should matter. And none of that actually tells you if you are fragmented. You can have three repositories and be completely fragmented. You can have 50 repositories and be completely aligned. You can have trunk-based development and still have massive coordination overhead. The technical metrics are activity metrics. They measure what is happening. But they do not measure the outcome. Fragmentation is not a technical problem. It is an organizational outcome. So what should you actually measure? Measure coordination overhead. That is the real metric. Coordination overhead is the time your organization spends talking about work instead of building it. It is the hour spent in meetings. It is the time waiting for approvals. It is the time managing dependencies. It is the rework that happens because one team didn't know what another team was doing. Ask your team how much of your week is spent actively building and how much time is spent waiting waiting for a review, waiting for an approval, waiting for another team to finish their piece. Most organizations have flow efficiency below 20%. That means 80% of your lead time is just wait time. You are spending 80% of your calendar on coordination overhead. That is fragmentation, not the number of repositories, not the branching strategy. At the amount of time your organization spends on coordination instead of value. The research shows that high performing teams keep collaborative overhead below 35%. That is the boundary. Below 35% you are coordinating efficiently. Above 35% you have crossed into fragmentation. So start tracking it. Of every hour a developer spends working, how much is active progress and how much is waiting. Break it down. When they are waiting, what are they waiting for? If they are waiting for code reviews, your process is a bottleneck. If they are waiting for approvals, your process has too many gates. If they are waiting for another team, your dependencies are creating serialization points. Each category of waiting points to a different fragmentation problem. The beauty of measuring it this way is that it doesn't care about your tools. You can measure this whether you use a monorepo or a thousand small ones. The metric tells you the truth about your organization, not your repository. And here is what matters. Once you know your baseline, once you know you are at 17% flow efficiency. Then you can start improving, but you cannot improve what you do not measure. Most organizations never look at this. They look at build times. They optimize the build system. They buy a faster CI tool. They get the build time down by 30% and their developers still feel slow because the build time was never the bottleneck. It was the meetings. It was the approvals. It was the dependency coordination. The metric keeps you honest. It stops you from optimizing the wrong thing. If your flow efficiency is low, your fragmentation is real. It doesn't matter what your org chart says. It doesn't matter what your repository strategy is. The metric is telling you the truth. And if your flow efficiency is low, you need to do the organizational work. You need to clarify ownership. You need to simplify decision paths. You need to minimize the number of teams that have to coordinate on a single change. No repository strategy will fix that. No branching model will fix that. Only organizational alignment will fix that. Only reducing the actual coordination overhead will fix it. So start measuring. Track your flow efficiency. Break down where the waiting happens. And let the metric guide you toward the actual problem. That is how you diagnose fragmentation. Not by looking at your tools, but by looking at how your organization actually spends its time. It's the path forward reducing fragmentation. Now that you know what to measure and what you're actually looking at, the question becomes practical. What do you actually do? This is where most organizations get stuck. They understand the diagnosis. They know they have fragmentation. They know it's an organizational problem. And then they don't know how to move forward because the solution isn't a tool purchase. It's not a software decision. It's structural change. But here's the problem. You can't fix what you can't see. First, you need to measure your actual communication patterns and coordination overhead. You already know this. Intellectually, but you need to make it quantitative. You need to track for a representative two week period where your organization's time actually goes, not where it's supposed to go, where it actually goes. You'll discover that some teams have flow efficiency above 40% while others sit below 10. That variation is a signal. It tells you that some parts of your organization have solved the fragmentation problem and other parts haven't. That baseline measurement is everything until you have a number, until you know that you're at 17% or 31% or 52% you're operating on assumption. Second, map your organizational structure to your repository structure. Draw out where your code actually lives. Draw out where your teams actually sit. And look for alignment or misalignment. If you have a team that owns a microservice, is that service in its own repository? Or is it embedded in a shared monorepo with eight other services? If it's in a shared monorepo, is that by design or by accident? If you have two teams that need to coordinate frequently, are they in separate repositories forcing them to manage, versioning and contracts? Or are they in the same repository where they can coordinate through shared code and share testing? And for a perfect answer, you're looking for intentionality and you're looking for cases where the repository structure doesn't match how the teams actually work. Those misalignments are costing you. They're not obvious in the sprint backlog, but they're showing up in your flow efficiency metric. Third, identify where decision making is slow or unclear. Walk through a representative change that required coordination. Track it. Where did it get stuck? Where did it wait the longest? Was it in code review? Was it waiting for approval from another team? Was it waiting for another service to be released before you could deploy your change? Wherever it got stuck. That's where organizational debt is concentrated. That's where unresolved decisions are creating bottlenecks. The most common stuck points are unclear ownership, too many approval gates and synchronized dependencies. Teams don't know who decides, so changes wait for a consensus that never forms, or changes need approval from three different stakeholders and coordinating those three approvals takes weeks. Or your change can't deploy until another team's change is released, so you're blocked on their schedule. Those aren't technical problems, but they show up as technical friction. Fourth, choose a repository strategy that matches your actual coupling, not your desired coupling. This is where the rubber meets the road. Look at the changes that create the most coordination overhead. Look at what actually has to move together. Is it your entire organization? Then a monorapal with strong infrastructure might be right. You're acknowledging that your teams are tightly coupled, and you're building a system that makes that coupling explicit and manageable. Are your teams independent? Do they move on different schedules? Do they have different definitions of done? Then a multi-repa with clear contracts might be right. You're acknowledging that your teams don't coordinate frequently, and you're building a system that respects their autonomy. Are you in between? Then you need a hybrid model, some core services in a shared monorapal, product services in separate repositories. Explicit seems between the coupled and independent parts. The worst choice is the choice that doesn't match reality. A monorapal imposed on independent teams creates resentment and workarounds. A multi-repa imposed on tightly coupled teams creates coordination nightmares. Choose what fits how you actually work. If, invest in the infrastructure that makes your choice viable at scale. This is where commitment shows if you choose monorepo you need sparse checkout, partial clone, selective builds and caching. You need strong CI/CD. You need feature flags. You need the infrastructure that lets teams work in parts of the system without building the whole thing. Google and Meta and Microsoft have this infrastructure. Most organizations don't. Building it costs time and money. But without it, the monorepo becomes a bottleneck. If you choose multi-repo you need versioning discipline. You need API governance. You need clear contracts between services. You need the discipline that keeps teams aligned even though they're working separately. You need mechanisms to prevent API drift. The infrastructure investment is non-negotiable. It's not optional. It's the cost of paying down your organizational debt. Do these five things. Not perfectly. Not all at once. But do them intentionally. That's how you move from fragmentation to coherence. The infrastructure investment mistake. But here's where most organizations fail. They make the choice. They commit to a repository strategy. And then they don't actually commit the resources required to make that choice work. You see this pattern constantly. A leadership team decides we're going monorepo. That's the call. We're consolidating our scattered repositories. We're unifying our code base. We're going to reap the benefits of shared visibility and atomic changes. So they merge the repositories. They unify the build system. They celebrate the decision. And then they expect Git to scale on its own. It doesn't. Git doesn't scale on its own. Not at the size most large organizations operate. Not with hundreds of developers. Not with millions of lines of code. Not with complex dependencies and interconnected services. A monorepo at that scale needs infrastructure. You need sparse checkouts so developers can work on their part of the system without checking out the whole 500 gigabyte repository. You need partial clone so the initial setup doesn't take hours. You need selective builds so a change to one service doesn't trigger a rebuild of the entire monolith. You need aggressive caching so you're not re-computing the same builds over and over. You need a build system that understands dependencies and can orchestrate work intelligently. Most organizations don't have that infrastructure. Because it takes work to build, it takes engineering capacity. It takes decisions about how the system should work. So what happens instead? Teams start working around the limitations of the monorepo. One team enables sparse checkout on their own. Another team starts using a different build tool to work around the slowness. A third team creates an unofficial sub-repost structure with their own branching patterns and build process. The monorepo that was supposed to unify the organization becomes a bottleneck instead. And teams respond by fragmenting it informally. They create boundaries within the monorepo that were never intended. They work around the system instead of with it. The irony is that you end up with the worst of both worlds. You have a monorepo which assumes tight coupling and requires unified infrastructure. But you have the workarounds and informal boundaries of a multi-repo, except without the explicit contracts, without the clear expectations. So you get both the coupling problems and the coordination problems. That's what happens when you don't invest. The opposite is equally common. A different leadership team decides, we're going multi-repo. We're respecting team autonomy. We're letting each service be independently deployable and independently versioned. We're reducing the coordination burden by giving teams clear boundaries. Again, a good decision. But then they don't invest in what makes it work. A multi-repo requires discipline. It requires teams to agree on versioning conventions. It requires clear API contracts. It requires governance about when you can make breaking changes. It requires mechanisms to prevent version skew, where one service depends on version 2.0 of a library, but another service depends on version 1.5. Most organizations expect teams to figure this out on their own. They expect natural emergence of discipline. They expect that once the repositories are separated, teams will automatically communicate about their APIs and coordinate their releases. They don't. What happens instead is that teams drift. One team's API changes in ways that break downstream consumers, but nobody is looking for that. One service upgrades to a new version of a shared library and another service doesn't. And now you have incompatible versions running. Teams decide on different standards for logging or error handling or configuration because nobody enforced unified standards. The multi-repo was supposed to reduce coordination. But it trades visible coordination problems for invisible ones. The problems don't go away. They just hide until they surface as a production incident again. The worst of both worlds, you have separate repositories, which assumes low coupling and clear boundaries. But you don't have the explicit contracts and governance that make it work. So you get the autonomy problems and the coordination problems. The infrastructure investment isn't about having the fanciest tools. It's about committing to the operating model that your choice requires. If you choose monorippo, you're committing to investing in selective builds and caching and the infrastructure that lets teams work efficiently at that scale. If you choose multi-repo, you're committing to investing in versioning governance and API contracts and the discipline that keeps teams aligned even though they're working independently. That investment isn't optional. It's not nice to have. It's the price of making your choice work. Most organizations skip it. They choose the repository strategy, but not the infrastructure. And then they wonder why the strategy isn't delivering the promised benefits of it. AI, fragmentation and the verification crisis. Now let's talk about what happens when you add AI to this picture. Because everything we've been discussing about fragmentation and coordination overhead, AI doesn't solve it. AI amplifies it. And the amplification is happening right now. The scale of code generation is accelerating. A developer using modern AI tools isn't producing incremental improvements. They're producing exponentially more code. An individual can generate in a single day what would have taken a week without AI. And when you multiply that across a team and an entire organization, the volume becomes staggering. The verification infrastructure was built for a different world. It was built for a time when code generation was human-paced. Back then, a team produced a predictable amount of code per sprint. And that code moved through review and testing in a cadence that everyone could handle that cadence is gone. Now code is arriving at the verification system faster than the system can process it. In a fragmented architecture, this creates a crisis. Every change generated by AI still has to navigate your fragmentation. It still has to pass through your review gates. It's just for your approval processes. And be checked against dependencies in a multi-repo or integrated into shared code in a monorepo. But now it's arriving 10 times faster. In a monorepo environment, this creates an immediate bottleneck. The CICD system gets overwhelmed, the build queue backs up, and developers end up sitting around waiting for builds to complete. The infrastructure that was supposed to be unified and fast becomes a choke point because it was designed for a certain load. And you've suddenly tripled that load overnight. More than that, the review process breaks. AI generated code requires more scrutiny, not less. It's not that the AI is bad at writing code, but it lacks the contextual reasoning that a human developer brings to the table. It solves the immediate problem, but lacks architectural awareness. So reviewers have to work harder to validate that the code actually fits into the bigger picture. And now they're doing that deep review work on 10 times the volume. In a multi-repo environment, a different kind of crisis emerges. Every AI generated change that touches a service boundary has to be checked against contracts with other services. It has to be validated for backward compatibility and reasoned about in terms of how it affects every downstream consumer. That's already a heavy overhead in a multi-repo. At human speeds, it's manageable. Teams coordinate on API contracts, discuss breaking changes, and plan migrations together. It's formal, but it works. At AI speeds, it becomes impossible. You can't coordinate about every API change as it happens. You can't negotiate every contract change in real time. And you certainly can't plan migrations for code that was generated five minutes ago. So the changes pile up. They're waiting for coordination, waiting for approval, waiting for other teams to adapt. The verification crisis is what happens when you apply AI scale generation to a fragmented architecture. And here's the critical thing. This isn't a review capacity problem that you can solve by hiring more people or buying better tools. It's a coordination problem. It's the fragmentation of your organization becoming visible in the form of backed up cues and stagnant code. Organizations without fragmentation handle this differently. They see the volume of code arriving. They know it's AI generated and they have clear mechanisms to validate it quickly. They have clear ownership, clear standards, and clear contracts. The verification still happens, but it's not delayed because there's no confusion about who's responsible or which rules apply. Organizations that are fragmented, they see the volume and they panic. The fragmentation that was already slowing them down is now the limiting factor. The coordination overhead that used to eat 30% of their time is now eating 60%. The irony is that AI is the perfect exposure for fragmentation. It's invisible when code moves slowly. When things move at human speed, the coordination text feels manageable and you get used to it without realizing how much time you're actually wasting. But when AI generates code at 10 times the speed and your coordination system can't keep up, the fragmentation becomes impossible to ignore. The organizations that will win with AI aren't the ones that bought the best tools. They're the ones that already solved their fragmentation problem. They already have clear ownership, explicit contracts, and streamlined decision paths. Because those organizations can take AI generated code and move it through their system at high velocity. The verification happens and the coordination happens, but it's not a bottleneck because the organization is already optimized for it. The fragmented organizations, they're about to hit a wall. The future state unified architecture. So what does winning actually look like? What's the state you're trying to get to? It's not about monorippo or multi-repo, it's not a specific repository strategy. It's unified architecture. And unified architecture is something different altogether. Unified architecture means your organization has made intentional choices about how teams communicate and how code moves through the system. Those choices are consistent. They're reinforced by your tooling, your governance, and your infrastructure. In a unified architecture you have clear ownership. Every service and every library has an owner, not in theory, but in reality. There is a specific person or team you can go to with a question. When something breaks, you know who's responsible and when you need to change someone else's code, you know exactly who to talk to. There's no ambiguity and no one ever says we're not sure who owns that. You have explicit contracts. Services have versioning policies and APIs are fully documented. Teams agree on which breaking changes are allowed and how they're communicated to everyone else. If you change an API, you don't just hope people figure it out. You follow a process, you announce it, and you provide migration paths. The contract is explicit. You have automated coordination. The build system understands dependencies. If service A depends on library B and someone changes that library, the system automatically runs A's test to validate the change. You don't have to manually coordinate or check because the system does it for you. The coordination is automated and it's immediate. You have continuous integration. Code moves through the system constantly, not in batches. It moves to the main branch frequently, gets validated immediately, and deploys quickly. There's no integration event scheduled for three months from now. There is continuous incremental integration happening every single hour. The beautiful thing about unified architecture is that coordination is built into the system. It's not something you add on top. It's not something you do in meetings or over long email threads. It's something your infrastructure enforces and your tools make happen. This is where AI actually becomes powerful. In a fragmented architecture, AI is a problem because the fragmentation is the bottleneck. You generate code fast, but you can't integrate it because your coordination system can't keep up. In a unified architecture, AI is a force multiplier. You generate code fast and the system validates it automatically. The dependencies are clear, so the system catches problems immediately. The ownership is clear, so the code goes to the right reviewers, and the contracts are explicit. The system verifies that the AI didn't break anything. An AI tool generating code in a unified architecture isn't struggling through coordination overhead. It's moving through a system designed to handle it. The code gets generated, hits the CI system, and the system runs tests, validates dependencies and checks contracts against unified standards. All of that happens automatically and quickly. If something looks suspicious, or if the AI tool generates something that doesn't fit the pattern, the system flags it immediately, not days later when someone finally gets around to reviewing it. But right away, the feedback loop is tied. Right, the AI can be corrected, and the code moves through. That's the environment where AI stops being a crisis and starts being a productivity multiplier. Organizations that achieve unified architecture move differently than fragmented ones. They move faster. Not just a little bit faster, exponentially faster. The research suggests 10 times faster on delivery metrics, 10 times faster on lead time, and 10 times faster on how quickly you can respond to what your customers actually need. That's not because the people are smarter. It's because they've eliminated the coordination tax. The system moves through without friction, the infrastructure handles the verification, and the tooling handles the coordination. The people just focus on building, and that's what you're building toward. Not a specific repository strategy or a branching model, but a unified system where coordination is automatic and code moves fast. This is the future state, and it's achievable. It's not easy, and it requires real work, but organizations are doing it right now. The question is whether your organization will be one of them. The decision framework. What to do Monday? You understand the diagnosis now? You know where fragmentation comes from? It is organizational, not technical. You know what to measure, but the question is practical. What decision do you actually make on Monday? Here is a framework. It is not the only way to think about this, but it is a way that works. Start with one question. How are your teams actually coupled? This is the foundational insight, not how you wish they were coupled, not how your org chart says they should be coupled, but how they actually work. If you trace the changes that require the most coordination, where does that coupling live? Look for the changes that involve the most teams. Look for the work that forces people into meetings. If your teams are tightly coupled, a monorepo makes sense. This is for the groups where most changes involve multiple teams. It is for the people frequently refactoring across service boundaries. It is for the systems with shared dependencies that must move together. By choosing a monorepo, you are acknowledging the reality of that coupling. You are building a system designed for it. You are moving coordination into your tooling, so it doesn't get lost in a calendar full of meetings. But the investment is substantial. You need sparse checkout. You need selective builds. You need feature flags and canary deployments. You need monitoring that catches problems before they ever reach a user. If your teams are tightly coupled, you are already paying for it. You're just paying invisibly through waiting and rework and endless sinks. Making it visible and investing in infrastructure is the honest choice. Now look at the other side. If your teams are independent, a multi-repo with explicit contracts makes sense. This is for the teams where changes rarely cross boundaries. It is for the services with clear ownership that move on different schedules. In this model, you are respecting autonomy. You are building clear themes between systems. You are letting teams own their own destiny. The investment here is different. You need discipline around versioning. You need API contracts that teams actually respect. You need governance that prevents your systems from drifting apart. You need mechanisms to keep teams aware of breaking changes and migration parts. If your teams are truly independent, you are already paying for that independence. Making it explicit and investing in governance is the honest choice. But most organizations are in between. If that is you, you need a hybrid. Keep your core coupled services in a monorepo. Keep your truly independent services in separate repositories. Draw an explicit boundary to find which side of that boundary owns what. Make it clear which model applies to which part of your system. This isn't about splitting the difference. It is about being honest about where coupling actually exists. And choosing a model that fits the architecture once you have made that choice. There is a second decision. What are you willing to invest? Because whatever you choose, it requires infrastructure. It requires governance. It requires discipline. If you are not willing to pay that price, your choice does not matter. You will end up with a monorepo that acts like a multi-repo. You will end up with a multi-repo that lacks contracts. You will end up with a hybrid that has ambiguous seams. You will end up fragmented either way. The organizations that succeed understand this trade off upfront. They choose a model. They commit to the investment and they follow through. That investment might be built optimization and partial clones. It might be versioning discipline and API contracts. It might be hybrid governance. But it is not optional. The worst choice is the one that doesn't match your coupling. Combined with the choice not to invest. That is how you end up fragmented. So here is what you do Monday, not Tuesday, not next quarter, Monday. Map your coupling. Be honest about how your teams actually work. Do not try to engineer your way to independence if you are tightly coupled. Do not expect natural alignment. If you are operating as independent services, make a choice. Monorepo. Multi-repo. Hybrid. Choose the one that fits. Document why you are choosing it. Commit the resources if it is a monorepo. Budget for the infrastructure. If it is a multi-repo. Budget for the governance. If it is a hybrid. Budget for both. Make it visible. Make it a line item in your engineering budget. And then follow through. Consistency matters more than perfection. A suboptimal choice executed consistently beats a perfect choice executed halfway. That is the decision framework. It is simple on the surface. It is difficult in practice because it requires honesty about where you are. And it requires a commitment to the path forward. But it works. Your architecture isn't fragmented because of your repository strategy. It is fragmented because of unresolved decisions. Somewhere along the way, your organization accumulated debt. Decisions about how teams should work together were never finished. And those unresolved decisions are costing you every single day. The monorepo myth is that the right repository structure will solve that problem for you. It won't. A monorepo won't fix fragmentation. A multi-repo won't fix fragmentation. No tool will fix fragmentation. What a repository choice will do is make your fragmentation visible. Or invisible. Make it visible. And you are forced to deal with it. Make it invisible. And you can pretend it is not there. While you pretend, it slowly erodes your ability to move fast. The organization's moving fastest are not the ones with monorepo's. They are the ones that paid down their organizational debt. They align their teams around clear patterns. They chose a communication model. And they invested in making it work. Your choice isn't monorepo or multi-repo. Your choice is whether you are going to face your fragmentation problem. Or keep pretending it doesn't exist.

← Microsoft Graph Data Connect - Simply ExplainedScaling CI-CD: The Governance Blueprint →