Understanding
monorepos
@PhilipJFulcher
@bencabanes nx.dev • nrwl.io powered by
Hi 👋

I’m Benjamin Cabanes
🇨🇦 · 🐬
Javascript Architect @ Nrwl

Nx Core Team
@bencabanes
@PhilipJFulcher
@bencabanes powered by
Hi 👋

I’m Philip Fulcher
🇺🇸 · 🐬
Nx Core Team Member
@philipjfulcher
@PhilipJFulcher
@bencabanes powered by
Why do companies
use monorepos?
@PhilipJFulcher
@bencabanes powered by
SHORT
ANSWER?
@PhilipJFulcher
@bencabanes powered by
Why do companies use
monorepos?
• Manage complexity
• Organization-wide best
practices
• Maximizing shared code
• Consistency & predictability in
code
• Discoverability and
communication
• Foster collaboration
@PhilipJFulcher
@bencabanes powered by
LONG
ANSWER?
@PhilipJFulcher
@bencabanes powered by
Let’s talk about
monorepos…
@PhilipJFulcher
@bencabanes powered by
What is a
monorepo?
@PhilipJFulcher
@bencabanes powered by
A monorepo is a single repository
containing multiple distinct projects,
with well-de
fi
ned relationships.
@PhilipJFulcher
@bencabanes powered by
A monorepo is a single repository
containing multiple distinct projects,
with well-de
fi
ned relationships.
@PhilipJFulcher
@bencabanes powered by
A monorepo is a single repository
containing multiple distinct projects,
with well-de
fi
ned relationships.
@PhilipJFulcher
@bencabanes powered by
@PhilipJFulcher
@bencabanes powered by
You projects in the
same place
• High level view of projects
• Allows collaboration
• Removes assumptions
• Project discoverability
• Code reuse
• Architecture discoverability
@PhilipJFulcher
@bencabanes powered by
@PhilipJFulcher
@bencabanes powered by
✋ Monolith ≠ Monorepo ✋
@PhilipJFulcher
@bencabanes powered by
Monolith & Monorepo are different concepts

A monorepo is about code organization
A monolith is about code linking and particular type of deployment
@PhilipJFulcher
@bencabanes powered by
@PhilipJFulcher
@bencabanes powered by
A monorepo is a single repository
containing multiple distinct projects,
with well-de
fi
ned relationships.
@PhilipJFulcher
@bencabanes powered by
Well-de
fi
ned relationships are
used by tooling to provide
automation & assistance
@PhilipJFulcher
@bencabanes powered by
00
V1
Date
Presentation Subtitle
Presentation Title
@PhilipJFulcher
@bencabanes powered by
Cross-project changes
Architecture awareness
Relationships
are key
Performance with
smart commands
Project graph
Projects discoverability & always
up to date visual representation
Test/build only affected code
Identify relations & contracts
Smart code generation
Adds a smart layer to
project relationships
@PhilipJFulcher
@bencabanes powered by
Smarter tooling
Better DX
Collaboration & Productivity increase
@PhilipJFulcher
@bencabanes powered by
Wait. So what’s wrong
with my polyrepo setup? 🤔
@PhilipJFulcher
@bencabanes powered by
Well, nothing is really
*wrong*. It’s just…
@PhilipJFulcher
@bencabanes powered by
Polyrepos have a high
cost of maintenance.
@PhilipJFulcher
@bencabanes powered by
Polyrepos are dif
fi
cult
to scale.
@PhilipJFulcher
@bencabanes powered by
A common situation
with polyrepos
Let’s share
some code!
@PhilipJFulcher
@bencabanes powered by
Sharing code with
polyrepos
4/ Write the shareable code
5/ CI & CD checks
6/ Deploy & publish to registry
1/ Create repository, setting
permissions, team management
2/ Setup CI & CD (waiting from
IT team)
3/ Setup tooling for build, serve,
lint …
@PhilipJFulcher
@bencabanes powered by
- Write the shared code
Sharing code with
monorepos
- Test consuming projects
directly from where you are.
All changes are done in a single PR
Consumers are all tested (high con
fi
dence)

No externals, faster merge and release
- Use existing code, tooling
@PhilipJFulcher
@bencabanes powered by
Sharing code with
polyrepos
- depends on published artefacts
- Changes, PRs, Code reviews, CI/
CD runs times “n” for each repo
- Takes time to complete and
start using the shared code.
@PhilipJFulcher
@bencabanes powered by
Sharing code with
polyrepos
A: v1.0
B: v1.0 C: v1.0
D: v1.0
A: v1.0
B: v1.0 C: v1.1
B: v1.0 C: v1.1
A: v1.0
B: v1.0 C: v1.1
D: v1.0 D: v1.1
😨
😎 😱
💎The Diam
on
d Dependency Problem 💎
@PhilipJFulcher
@bencabanes powered by
Polyrepos creates silos &
makes collaboration
harder.
@PhilipJFulcher
@bencabanes powered by
It is easy to do the wrong
things when working in
silos.
@PhilipJFulcher
@bencabanes powered by
Polyrepos and monoliths
are pretty common.
@PhilipJFulcher
@bencabanes powered by
@PhilipJFulcher
@bencabanes powered by
The industry has moved to the
polyrepo to get team autonomy.
@PhilipJFulcher
@bencabanes powered by
Autonomy by isolation
harms collaboration.
@PhilipJFulcher
@bencabanes powered by
What about
monorepos then?
@PhilipJFulcher
@bencabanes powered by
Monorepos do
relationships analysis
@PhilipJFulcher
@bencabanes powered by
One version of everything
03
Atomic commit across projects
02
No overhead to create new projects
01
Developer mobility
05
Consistent tooling
04
Monorepos
bene
fi
ts
@PhilipJFulcher
@bencabanes powered by
I can’t use a monorepo.
I do micro frontends. 😏
@PhilipJFulcher
@bencabanes powered by
Again, a common
misconception.
@PhilipJFulcher
@bencabanes powered by
No more assumptions,
all the code is here,
easier to debug with monorepos
@PhilipJFulcher
@bencabanes powered by
A monorepo makes micro-
frontends easier & manageable
@PhilipJFulcher
@bencabanes powered by
If everyone has access to
everything. Then it’s
unmanageable. Right? 😱
@PhilipJFulcher
@bencabanes powered by
Again, a common
misconception.
@PhilipJFulcher
@bencabanes powered by
Polyrepo
code ownership?
No high level overview
No structure
Everyone can depend on everything
Permissions per repository
@PhilipJFulcher
@bencabanes powered by
Monorepo

code ownership
High level overview
Visible structure & enforced by tooling
Clear hierarchy and dependencies
Granular access:
- constraints per import
- constraints per folder
- constraints per project
- custom constraints with tooling
@PhilipJFulcher
@bencabanes powered by
Relationships are key to
monorepos
@PhilipJFulcher
@bencabanes powered by
00
V1
Date
Presentation Subtitle
Presentation Title
Why is Nx the right
tool for your
Monorepo?
@PhilipJFulcher
@bencabanes powered by
Not just code
colocation
@PhilipJFulcher
@bencabanes powered by
Projects
@PhilipJFulcher
@bencabanes powered by
Knowledge Base

feat-knowledge-base
Live Chat

feat-live-chat
Support Tickets
feat-support-tickets
New Ticket
feat-new-ticket
Libraries
Customer Service App
App
@PhilipJFulcher
@bencabanes powered by
- Name
- Path Alias
- Well-de
fi
ned API
Each project
has
@PhilipJFulcher
@bencabanes powered by
cart-ui-components
@PhilipJFulcher
@bencabanes powered by
@myorg/cart/ui-components
@PhilipJFulcher
@bencabanes powered by
@PhilipJFulcher
@bencabanes powered by
Well-De
fi
ned
Relationships
@PhilipJFulcher
@bencabanes powered by
Tags
@PhilipJFulcher
@bencabanes powered by
Module
Boundaries
@PhilipJFulcher
@bencabanes powered by
Microfrontends 😎
@PhilipJFulcher
@bencabanes powered by
Superpowered
Micro Frontends with
Monorepos
@PhilipJFulcher
@bencabanes powered by
Speeding up day-to-
day development
@PhilipJFulcher
@bencabanes powered by
Targets
@PhilipJFulcher
@bencabanes powered by
Testing
@PhilipJFulcher
@bencabanes powered by
Affected Commands
- affected:test
- affected:build
- affected:e2e
@PhilipJFulcher
@bencabanes powered by
Never run the same target
twice.
@PhilipJFulcher
@bencabanes powered by
Nx Cloud
@PhilipJFulcher
@bencabanes powered by
Into the (Nx) Clouds
@PhilipJFulcher
@bencabanes powered by
Atomic Changes
@PhilipJFulcher
@bencabanes powered by
Project
Graph
@PhilipJFulcher
@bencabanes powered by
Affected Commands
- affected:test
- affected:build
- affected:e2e
@PhilipJFulcher
@bencabanes powered by
Experimentation
@PhilipJFulcher
@bencabanes powered by
Generators
@PhilipJFulcher
@bencabanes powered by
Workspace Generators
@PhilipJFulcher
@bencabanes powered by
Keys take away on
monorepos
@PhilipJFulcher
@bencabanes powered by
Monorepos are not just about
code colocation
@PhilipJFulcher
@bencabanes powered by
Well-de
fi
ned relationships between
isolated units of code are essential
@PhilipJFulcher
@bencabanes powered by
Good tools & automation are needed for
a monorepo to scale with the
organization
@PhilipJFulcher
@bencabanes powered by
nx.dev
monorepo.tools
@PhilipJFulcher
@bencabanes powered by

Understanding Monorepos