Structuring Scalable Multi-Package Monorepos with pnpm and Turborepo
Building high-performance monorepos sharing TypeScript configs, UI design systems, and database clients across Next.js and Nuxt apps.
Managing multiple repositories for frontend apps, CMS platforms, and shared libraries leads to dependency divergence and duplication. A unified pnpm workspace paired with Turborepo solves this elegantly.
Monorepo Workspace Structure
lana-developer/
├── apps/
│ ├── lana-portfolio/ (Next.js 15 Website)
│ ├── lana-cms/ (Payload 3.0 Headless CMS)
│ └── lana-docs/ (Nuxt 4 Technical Blog)
├── packages/
│ ├── ui/ (Shared Tailwind & Icons)
│ ├── config-typescript/
│ └── database/ (Drizzle / Prisma Client)
├── turbo.json
└── pnpm-workspace.yamlTurborepo Pipeline Configuration (turbo.json)
{
"$schema": "https://turbo.build/schema.json",
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": [".next/**", "!.next/cache/**", ".output/**", "dist/**"]
},
"lint": {
"dependsOn": ["^build"]
},
"dev": {
"cache": false,
"persistent": true
}
}
}Turborepo caches previous build outputs remotely, dropping subsequent CI build times from 3 minutes to under 8 seconds.