· David Webb · build-log  · 5 min read

Monorepo 101: What It Is, Why It Matters, and Things To Consider

A simple guide to monorepos for founders and non‑technical teammates. What a monorepo is, when it helps, when it hurts, and how to wrap your head around it conceptually.

A simple guide to monorepos for founders and non‑technical teammates. What a monorepo is, when it helps, when it hurts, and how to wrap your head around it conceptually.

I stumbled across the term “monorepo” recently when I was researching best practice architecture for more complex products. I’m still upskilling when it comes to Git, deployments and repositories (aka “repos” or your product’s source code).

What is a monorepo?

A monorepo is a single repository that contains multiple apps and shared building blocks (like login, UI, and payments). The alternative is a “many repos” setup where each app lives in its own repo and does not share code.

For solo founders and small teams (≤4 people), the real question isn’t “what do big tech companies use?”, it’s “will this help you ship faster with fewer surprises?” Sometimes yes. Sometimes no…

The picture (two views)

Here’s the high‑level idea and how it maps to domains in the real world.

Simplified monorepo

repo/
  apps/         → Each app has it's on sub directory and source code
    marketing/  → yourdomain.com
      src/
    web/        → app.yourdomain.com
      src/
    admin/      → admin.yourdomain.com
      src/
  packages/     → Shared building blocks used by all apps
    auth/
    ui/
    payments/
    utilities/
    entitlements/
  docs/         → Requirements, plans, notes, and decisions

By contrast two standalone repos might look like this:

repo-1/          → yourdomain-1.com
  src/
  packages/     → building blocks used by app 1 (not shared)
    auth/
    ui/
    payments/
    utilities/
    entitlements/
  docs/         → Requirements, plans, notes, and decisions

repo-2/          → yourdomain-2.com
  src/
  packages/     → building blocks used by app 2 (not shared)
    auth/
    ui/
    payments/
    utilities/
    entitlements/
  docs/         → Requirements, plans, notes, and decisions

Subdomains vs Proxies

  • Subdomains e.g. admin.yourdomain.com are operationally simpler and map cleanly to separate deployments.
  • Proxies e.g. yourdomain.com/admin can feel nice for users, but routing, redirects, and auth callbacks get trickier. If you’re early, prefer subdomains unless you have a strong reason not to. I burned a lot of time on this!

Top Level Business Benefits

  • Faster shipping: change a shared thing once (e.g., brand from green to blue) and all apps benefit.
  • Consistent brand: the same button styles and UI patterns show up everywhere.
  • Independence: one app can go down without taking the others with it; deploy fixes to just the app that needs them.

Business value

Benefits (solo founder lens)

  • One source of truth for shared components (auth, UI, payments, utilities)
  • Less duplication, easier updates, clearer ownership
  • Fewer version mismatches across apps
  • Shared tooling, linting, and CI improve quality

(These themes show up repeatedly in guides and case studies: collaboration and consistency are the most cited wins mindfulchase.com, howik.com.)

Drawbacks / pitfalls (what actually hurt)

  • Up‑front investment: getting structure, scripts, and CI right takes longer upfront but it’s likely to save time later.
  • Bigger repo can slow builds/CI if you don’t enable caching or incremental builds.
  • Tooling complexity rises (workspaces, task runners) and needs deliberate setup.
  • Access control can get tricky without clear folder ownership.
  • Lockfile/dependency drift in workspaces: when versions or peer dependencies fall out of sync across apps/* and packages/*, installs break. Use the same Node version everywhere and avoid changing the lockfile during CI installs.

Most gotchas are performance, ownership boundaries, and dependency hygiene related. Counter with incremental builds, caching, explicit ownership, and CI that only runs checks for the parts you changed.

Visual guide to what’s actually “shared”

Think of a package as a reusable feature that each app can import and leverage without doing the heavy lifting of building from scratch.

Left column = package names. Columns = apps within the monorepo. Filled cells = app uses the package.

  • P1 Auth, P2 UI, P3 Payments, P4 Utilities, P5 Entitlements

Shared packages matrix

Consistent UI in practice

Whether you import a React button or apply a CSS class on a static page, the result looks and feels the same across all apps. This means that should your brand change in the future, you’ll have a ‘control tower’ of sorts ready to go. Make the change once and it automatically cascades across all apps in the monorepo that consume that element. This is the power and ‘magic’ of a monorepo.

Button consistency

Should you consider a monorepo?

Choose a monorepo if:

  • ✅ You have multiple apps that should share clearly defined building blocks
  • ✅ You want one design system and one login that work everywhere
  • ✅ Your team collaborates closely and prefers shared tooling and conventions
  • ✅ You have the time, patience, and technical skills to spend additional time upfront on architecture

Stick with multiple repos if:

  • ❌ Projects are unrelated and won’t share code
  • ❌ You need strict, separate governance or vendor boundaries per app
  • ❌ You want to keep each app’s lifecycle completely independent
  • ❌ You don’t want to invest upfront time getting it right

Top tips if you’re considering a monorepo

Planning & Migration

  • Invest time upfront in planning - Consider something like ChatPRD to build out your requirements
  • Document what works - If moving from multiple repos, capture what works well so that you are not starting from scratch
  • Create a migration folder - Copy useful files from old repos for reuse in your monorepo
  • Question complexity - Continually ask “is this the simplest way we can do this?” and seek evidence-based research when considering recommendations

Technical Setup

  • Prefer proven components - Use out-of-the-box solutions like shadcn/ui to avoid unnecessary complexity
  • Add ENV tracking early - Configure turbo.json properly, or production can silently use wrong environment variables
  • Prevent dependency bloat - Add pnpm overrides in root package.json to avoid duplicate Tailwind/PostCSS versions

Deployment & Ownership

  • Independent deployments - Keep deployments separate per app from day one
  • Clear ownership boundaries - Document ownership for apps/* and packages/* to avoid accidental cross-coupling

Getting started

If you want to try this quickly in JavaScript/TypeScript, start by reading the official Turborepo docs: turbo.build

Tips:

  • Extract one shared package first (UI or Auth).
  • Add caching and incremental builds before CI slows down.
  • Use the same Node version everywhere and avoid changing the lockfile during CI installs.

Wrap‑up

If this helped demystify monorepos, consider subscribing for more founder‑focused build logs and vote on what I should tackle next.

Share:
Back to Blog

Related Posts

View All Posts »
First Impressions: ChatGPT Codex Opens New Possibilities

First Impressions: ChatGPT Codex Opens New Possibilities

I tested ChatGPT's Codex AI coding agent for the first time. It found a typo I missed, added 1,300 lines of test code, and opened my mind to what's possible with AI-assisted development. Here's what happened and why it matters for solo developers.

Monorepo Design System Chaos (Part 1)

Monorepo Design System Chaos (Part 1)

Three apps, one design system, and a $20 AI expert consultation. Here's what happens when Astro, Vite, shadcn/ui, and Tailwind collide in a monorepo, and why it's still not resolved.

Monorepo Mayhem & Database Drama

Monorepo Mayhem & Database Drama

Midway through merging three repos into a monorepo, my build broke due to exposed security keys. Here's how I fixed my deployment and secured my database.