Recipe
pnpm workspaces
Monorepo setup with shared packages, zero-hoist isolation, and strict dependency boundaries.
Structure
my-monorepo/
├── pnpm-workspace.yaml
├── package.json
├── packages/
│ ├── shared/
│ │ └── package.json
│ └── config/
│ └── package.json
└── apps/
└── web/
└── package.jsonWorkspace config
# pnpm-workspace.yaml packages: - 'apps/*' - 'packages/*'
Root package.json
{
"private": true,
"scripts": {
"dev": "pnpm --filter web dev",
"build": "pnpm -r build",
"lint": "pnpm -r lint"
}
}Shared package
// packages/shared/package.json
{
"name": "@myorg/shared",
"version": "0.0.1",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"scripts": {
"build": "tsc"
}
}Consuming in an app
// apps/web/package.json
{
"dependencies": {
"@myorg/shared": "workspace:*"
}
}Tip: Use pnpm deploy to extract a pruned app with only production deps for Docker builds.