← Docs
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.json

Workspace 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.