Concept
Polyrepo vs Monorepo
In a polyrepo (many repositories) setup, each project has its own repository. Sharing code requires publishing packages to npm, managing versions, and dealing with dependency hell.
A monorepo places all applications (frontend apps, backend APIs) and shared packages (UI components, API clients, TypeScript typings) in a single Git repository:
my-monorepo/
├── apps/
│ ├── admin-portal/ <-- Consumer of ui & api
│ └── public-website/
├── packages/
│ ├── ui/ <-- Shared UI components
│ ├── api-client/ <-- Shared fetch API clients
│ └── ts-config/ <-- Shared tsconfig profiles
├── package.json <-- Workspace config
└── turbo.json <-- Turborepo caching configPackage Manager Workspaces & Internal Links
Modern package managers (pnpm, yarn, npm) support workspaces. A workspace links local packages dynamically inside node_modules without publishing them:
# pnpm-workspace.yaml
packages:
- 'apps/*'
- 'packages/*'In apps/admin-portal/package.json:
{
"dependencies": {
"@my-org/ui": "workspace:*"
}
}