{"id":"xe8xdl6c0kz240d","title":"Monorepo vs Split Repos for Small Product Teams","slug":"monorepo-vs-split-repos-small-teams","summary":"Monorepos sound great for sharing types, but they usually turn into \"slow-repos\" that eat your afternoon with bloated CI and environment setup if you don't…","imageUrl":"https://briancrabtree.me/images/journal-monorepo-vs-split-repos-small-teams.webp","category":"Engineering","date":"2026-05-28T18:00:00.000Z","featured":false,"likes":18,"author":"Brian Crabtree","content":"<h2>Picking a Repo Structure</h2>\n\n<p>Codebase organization is a fundamental product decision, impacting small team iteration speed and deployment. Choosing between a monorepo or split repos is crucial for quick delivery and maintaining momentum in constrained environments.</p>\n\n<p>Engineers often overthink future scale. My pragmatic approach optimizes for present friction, observing pain points for growth. Early architectural decisions cast long shadows on productivity; prioritize immediate over hypothetical.</p>\n\n<p>Common monorepo advice for large enterprises rarely suits small startups. What appears clean on paper often becomes a tangled mess with tight resources and no platform team. Enterprise solutions burden nimble teams.</p>\n\n<pre><code># pnpm workspace — shared types package\npackages/\n  web/\n  api/\n  shared-types/</code></pre>\n\n<h2>The Monorepo Promise</h2>\n\n<p>The monorepo promises single source of truth, simpler dependency management, and atomic commits, streamlining versioning. Tools like Nx or Turborepo offer advanced build optimization and caching, making a unified system appealing.</p>\n\n<p>For small teams, shared code is a major draw. Design systems, utilities, or API client definitions reside in one place, reducing duplication. This promotes consistency and simplifies core component updates without separate packages.</p>\n\n<p>I've started projects aiming for shared types, components, and unified CI/CD. One `git clone` felt productive, suggesting a streamlined workflow where cross-project changes were trivial, minimizing context switching.</p>\n\n<h2>Monorepo Reality for Small Teams</h2>\n\n<p>Without a dedicated platform team, monorepo reality hits hard. Build times balloon as dependencies grow, and juggling language environments adds complexity. This drains developer time from feature work, hindering rapid development.</p>\n\n<p>Monorepos often become 'slow-repos' where developers fear breaking unrelated services. Lengthy CI pipelines and resource-hungry local environments slow feedback. This friction impacts deploy frequency and agility; engineers troubleshoot instead of coding.</p>\n\n<p>Debugging cross-service issues in a monorepo, despite atomic commits, is complex. Interconnectedness makes isolating a bug tricky, with cascading effects. A dependency upgrade can silently break parts, leading to difficult regressions.</p>\n\n<h2>The Case for Split Repos</h2>\n\n<p>Separate repositories offer clear boundaries for components like frontend, backend, or mobile apps. This modularity enforces architectural separation, allowing independent evolution with simpler deployment pipelines and reduced blast radius from failures.</p>\n\n<p>With split repos, each service owns its dependencies and build. A frontend developer needn't pull the entire backend, reducing local setup and cognitive load. Engineers focus purely on their service, avoiding unrelated system management.</p>\n\n<p>Fault isolation is key. When something breaks, it's contained, simplifying diagnosis. This enables faster hotfixes; deploying a frontend patch without rebuilding the backend. Such independence fosters quick iterations and less coordination.</p>\n\n<h2>Split Repo Downsides</h2>\n\n<p>Split repos introduce challenges around shared code. Duplication creeps in without discipline for separate library repos. Managing many small code pieces adds overhead, requiring planning to centralize common utilities or design assets effectively.</p>\n\n<p>Version management across services becomes a manual headache. Upgrading an API client means publishing a new version, then bumping the dependency in consuming services. This tedious, error-prone dance drags velocity. See <a href=\"/journal/when-frameworks-are-worth-it/\">When Frameworks Are Worth It: My Decision Framework</a>.</p>\n\n<p>Ensuring consistency across multiple deployments is tricky. A breaking API change requires meticulous coordination for simultaneous frontend updates, risking a broken user experience. This emphasizes critical organizational and communication boundaries.</p>\n\n<h2>My Real-World Tradeoffs</h2>\n\n<p>I've shipped products with both. For small, lean teams, I lean towards split repos initially. Monorepo complexity usually outweighs benefits until a team grows past 5-7 engineers, as speed and simplicity are paramount.</p>\n\n<p>My last SaaS used three separate repos: frontend, backend API, and a public SDK. Each team focused on their domain. We used internal NPM packages and an OpenAPI spec as our contract, keeping interfaces clear.</p>\n\n<p>This setup enabled daily frontend deployments without backend waits, boosting velocity. It reduced blast radius, and predictable friction from shared library updates was manageable. This was a worthy trade-off for autonomy and faster feedback.</p>\n\n<h2>What I Do Next</h2>\n\n<p>For small teams, I start with split repositories for distinct applications, prioritizing simplicity for rapid iteration and clear ownership. Streamlined local development outweighs monorepo advantages. Merging repos later is easier than fixing a bottleneck.</p>\n\n<p>I'll use separate shared library repositories for design systems or SDKs only when genuine reuse emerges, not speculatively. Premature abstraction introduces overhead without payoff. My focus remains on shipping efficiently, refactoring for reuse only when demand is undeniable.</p>\n\n<p>Repo structure is a continuous negotiation. When considering sophisticated architecture, I balance developer experience with long-term maintainability, examining lessons from successes and struggles. For more on frameworks, see <a href=\"/journal/when-frameworks-are-worth-it/\">When Frameworks Are Worth It: My Decision Framework</a>.</p>","tags":["monorepo","architecture","team-size"],"views":46}