Monorepos sind 2026 der Standard für skalierbare TypeScript-Projekte. Turborepo von Vercel ist das schnellste Build-System für JavaScript-Monorepos — mit intelligentem Caching, paralleler Task-Ausführung und nahtloser CI-Integration. Kombiniert mit Claude Code als AI-Pair-Programmer entstehen produktive Setups in Minuten statt Stunden.
⚡
Parallele Builds
Tasks laufen gleichzeitig — Turborepo erkennt Abhängigkeiten automatisch.
🗄️
Remote Cache
Build-Artefakte werden teamweit geteilt — CI-Zeiten reduzieren sich drastisch.
📦
Shared Packages
UI-Komponenten, Config und TypeScript-Definitionen einmal — überall genutzt.
🔍
Affected-only
Nur geänderte Pakete werden getestet und deployed — kein unnötiger Overhead.
1. Turborepo Setup
Der schnellste Einstieg in Turborepo ist via create-turbo. Claude Code generiert das komplette Scaffold inklusive pnpm-Workspaces, turbo.json und einer sinnvollen Paketstruktur — in einem einzigen Prompt.
Terminal
# Neues Turborepo-Projekt erstellen
npx create-turbo@latest my-monorepo
cd my-monorepo
# Package Manager: pnpm (empfohlen)
pnpm install
# Struktur ansehen
tree -L 3 --dirsfirst
Nach dem Scaffold entsteht folgende Workspace-Struktur — Claude Code versteht diese Konvention und kann Pakete direkt in die richtige Ebene einordnen:
Projektstruktur
my-monorepo/
├── apps/
│ ├── web/ # Next.js Frontend
│ │ ├── package.json
│ │ └── src/
│ └── docs/ # Docusaurus / weitere App
│ └── package.json
├── packages/
│ ├── ui/ # Shared UI-Komponenten
│ ├── config/ # ESLint, Prettier, etc.
│ └── tsconfig/ # TypeScript-Konfigurationen
├── turbo.json # Pipeline-Konfiguration
├── package.json # Root Workspace
└── pnpm-workspace.yaml
Die Root-package.json definiert die Workspaces und enthält keine eigene Applikationslogik:
package.json (Root)
{
"name": "my-monorepo",
"private": true,
"scripts": {
"build": "turbo run build",
"dev": "turbo run dev",
"lint": "turbo run lint",
"test": "turbo run test",
"format": "prettier --write \"**/*.{ts,tsx,md}\""
},
"devDependencies": {
"turbo": "^2.0.0",
"typescript": "^5.4.0",
"prettier": "^3.2.0"
},
"engines": {
"node": ">=20.0.0",
"pnpm": ">=9.0.0"
}
}
pnpm-workspace.yaml
packages:
- "apps/*"
- "packages/*"
Claude Code Prompt: "Erstelle ein Turborepo-Monorepo mit pnpm-Workspaces. Apps: web (Next.js 15), api (Hono). Packages: ui, config, tsconfig. Generiere alle package.json-Dateien und die turbo.json-Pipeline."
2. Pipeline-Konfiguration
Die turbo.json ist das Herzstück jedes Turborepo-Projekts. Sie definiert, welche Tasks existieren, wie sie voneinander abhängen, was gecacht wird und welche Eingaben das Cache-Verhalten steuern.
turbo.json
{
"$schema": "https://turbo.build/schema.json",
"globalDependencies": ["**/.env.*local", ".env"],
"globalEnv": ["NODE_ENV", "VERCEL_ENV"],
"tasks": {
"build": {
"dependsOn": ["^build"],
"inputs": ["src/**", "!src/**/*.test.ts"],
"outputs": [".next/**", "!.next/cache/**", "dist/**"],
"env": ["NEXT_PUBLIC_API_URL"]
},
"test": {
"dependsOn": ["build"],
"inputs": ["src/**", "tests/**"],
"outputs": ["coverage/**"],
"cache": true
},
"lint": {
"dependsOn": [],
"inputs": ["src/**", "*.{js,ts,json}"],
"outputs": []
},
"dev": {
"cache": false,
"persistent": true
},
"clean": {
"cache": false
},
"typecheck": {
"dependsOn": ["^build"],
"inputs": ["src/**/*.ts", "src/**/*.tsx", "tsconfig.json"],
"outputs": []
}
}
}
Pipeline-Konzepte verstehen
Die Schlüsselkonzepte der turbo.json-Pipeline:
dependsOn: ["^build"] — Das Karet ^ bedeutet: erst alle Abhängigkeits-Pakete bauen, dann dieses Paket.
inputs — Welche Dateien beeinflussen den Cache-Key? Test-Dateien beim Build ausschließen spart Cache-Misses.
outputs — Was soll im Remote Cache gespeichert werden? .next/cache/** ausschließen verhindert aufgeblähte Artefakte.
persistent: true — Für dev-Server, die nicht beendet werden (blockierende Prozesse).
cache: false — Für Tasks wie dev und clean die nie gecacht werden sollen.
Performance-Tipp: Die inputs-Konfiguration ist entscheidend für Cache-Effizienz. Je präziser die Inputs, desto seltener Cache-Misses. Claude Code kann die optimalen Input-Patterns für jedes Paket vorschlagen.
3. Shared Packages
Shared Packages sind der größte Effizienz-Gewinn in einem Monorepo. UI-Komponenten, TypeScript-Konfigurationen und ESLint-Regeln werden einmal definiert und in allen Apps genutzt — ohne Duplikation.
packages/ui/package.json
{
"name": "@repo/ui",
"version": "0.0.0",
"private": true,
"exports": {
".": {
"types": "./src/index.ts",
"default": "./src/index.ts"
},
"./button": {
"types": "./src/components/Button.tsx",
"default": "./src/components/Button.tsx"
},
"./card": {
"types": "./src/components/Card.tsx",
"default": "./src/components/Card.tsx"
}
},
"scripts": {
"lint": "eslint . --max-warnings 0",
"typecheck": "tsc --noEmit"
},
"devDependencies": {
"@repo/tsconfig": "*",
"@types/react": "^18.3.0",
"typescript": "^5.4.0"
},
"peerDependencies": {
"react": "^18.0.0 || ^19.0.0",
"react-dom": "^18.0.0 || ^19.0.0"
}
}
packages/tsconfig/package.json
{
"name": "@repo/tsconfig",
"version": "0.0.0",
"private": true,
"exports": {
"./base.json": "./base.json",
"./nextjs.json": "./nextjs.json",
"./react-library.json": "./react-library.json",
"./node.json": "./node.json"
}
}
packages/tsconfig/base.json
{
"compilerOptions": {
"target": "ES2022",
"lib": ["ES2022"],
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true,
"skipLibCheck": true,
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"isolatedModules": true
}
}
Package in Apps verwenden
apps/web/package.json (Auszug)
{
"name": "web",
"dependencies": {
"@repo/ui": "*",
"next": "^15.0.0",
"react": "^19.0.0"
},
"devDependencies": {
"@repo/tsconfig": "*",
"@repo/config": "*"
}
}
apps/web/tsconfig.json
{
"extends": "@repo/tsconfig/nextjs.json",
"compilerOptions": {
"paths": {
"@/*": ["./src/*"]
}
},
"include": ["src"],
"exclude": ["node_modules"]
}
Best Practice: Verwende "*" als Version für interne Pakete in pnpm-Workspaces. pnpm resolved das automatisch auf den lokalen Workspace — kein npm-Publishing nötig.
4. Remote Caching
Remote Caching ist Turborepos Killer-Feature für Teams. Build-Artefakte werden in einem gemeinsamen Cache gespeichert — ein Entwickler baut, alle anderen überspringen identische Tasks. CI-Pipelines profitieren am stärksten.
Terminal
# 1. Bei Vercel anmelden (einmalig)
npx turbo login
# 2. Repo mit Vercel Remote Cache verknüpfen
npx turbo link
# 3. Erster Build — Artefakte werden hochgeladen
pnpm build
# 4. Zweiter Build — alles aus Cache (FULL TURBO)
pnpm build
# >>> FULL TURBO (0 Tasks ausgeführt)
Eigener Cache-Server (Self-hosted)
Für Projekte ohne Vercel-Anbindung gibt es den offiziellen @turborepo/remote-cache Server oder kompatible Alternativen wie ducktape und turborepo-remote-cache (open source).
turbo.json — Custom Cache-Server
{
"$schema": "https://turbo.build/schema.json",
"remoteCache": {
"enabled": true,
"apiUrl": "https://cache.my-company.com",
"signature": true
},
"tasks": {
// ... deine Pipeline
}
}
.env (für lokale Entwicklung)
TURBO_TOKEN=your-cache-token
TURBO_TEAM=your-team-slug
TURBO_API=https://cache.my-company.com
Self-hosted Cache mit Docker
# docker-compose.yml für turborepo-remote-cache
services:
turbo-cache:
image: fox1t/turborepo-remote-cache:latest
ports:
- "3000:3000"
environment:
NODE_ENV: production
TURBO_TOKEN: your-secret-token
STORAGE_PROVIDER: s3
S3_BUCKET: turbo-cache
volumes:
- turbo-cache-data:/app/cache
Cache-Analytics: turbo run build --summarize generiert einen detaillierten JSON-Report über Cache-Hits, Task-Dauer und Task-Graph. Ideal um Bottlenecks zu finden.
5. Filtering und Task-Running
Turborepos --filter-Flag ist eines der mächtigsten Features im täglichen Workflow. Es ermöglicht gezieltes Ausführen von Tasks nur für bestimmte Pakete oder solche, die sich seit einem bestimmten Git-Commit geändert haben.
Terminal — Filter-Beispiele
# Nur eine spezifische App bauen
turbo run build --filter=web
# App inklusive aller Abhängigkeiten bauen
turbo run build --filter=web...
# Alle Apps die von @repo/ui abhängen
turbo run build --filter=...@repo/ui
# Nur Pakete die sich seit main geändert haben
turbo run build --filter=[origin/main]
# Alle Pakete seit letztem Git-Tag
turbo run test --filter=[HEAD^1]
# Kombiniert: web + geänderte Pakete
turbo run build --filter=web --filter=[origin/main]
# Dev-Server für alle Apps parallel
turbo run dev --parallel
# Nur apps/ (nicht packages/)
turbo run dev --filter="./apps/*"
Nützliche Task-Kombinationen
package.json Scripts (optimiert)
{
"scripts": {
// Alle Apps bauen (inkl. package-Abhängigkeiten)
"build": "turbo run build",
// Nur veränderte Pakete testen (CI-Optimierung)
"test:affected": "turbo run test --filter=[origin/main]",
// Vollständiger CI-Check
"ci": "turbo run build lint typecheck test",
// Dev mit Concurrency-Limit
"dev": "turbo run dev --concurrency=10",
// Workspace-übergreifendes Typecheck
"typecheck": "turbo run typecheck",
// Cache analysieren
"analyze": "turbo run build --summarize --dry=json"
}
}
Dry-Run und Graph-Visualisierung
Terminal
# Zeigt welche Tasks ausgeführt würden (ohne Ausführung)
turbo run build --dry
# Task-Graph als DOT-Format exportieren
turbo run build --graph=graph.dot
# Als SVG rendern (graphviz erforderlich)
dot -Tsvg graph.dot -o graph.svg
# Turbo-Daemon-Status prüfen
turbo daemon status
Achtung bei --parallel: Das Flag deaktiviert Turborepo-Abhängigkeitserkennung und führt alle Tasks gleichzeitig aus — nur für unabhängige Tasks wie dev verwenden. Für build den normalen Task-Graph nutzen.
6. CI/CD Integration
Turborepo entfaltet seinen vollen Nutzen in CI/CD-Pipelines. Mit Remote Cache und Affected-only-Builds reduzieren sich CI-Zeiten um 60–90%. Claude Code generiert GitHub Actions Workflows, die beide Features optimal nutzen.
.github/workflows/ci.yml
name: CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
env:
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ vars.TURBO_TEAM }}
jobs:
build-and-test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: ['20', '22']
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Für --since/--filter=[origin/main]
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 9
- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: pnpm
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build
run: pnpm turbo run build --filter=[origin/main]
- name: Lint
run: pnpm turbo run lint
- name: Typecheck
run: pnpm turbo run typecheck
- name: Test (affected only)
run: pnpm turbo run test --filter=[origin/main]
- name: Upload Turbo summary
if: always()
uses: actions/upload-artifact@v4
with:
name: turbo-summary
path: .turbo/runs
Affected-only Deployments
.github/workflows/deploy.yml (Auszug)
jobs:
detect-changes:
runs-on: ubuntu-latest
outputs:
web-changed: ${{ steps.turbo.outputs.web }}
api-changed: ${{ steps.turbo.outputs.api }}
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- name: Detect affected packages
id: turbo
run: |
WEB=$(turbo run build --filter=web --dry=json | jq '.tasks | length')
echo "web=$([[ $WEB -gt 0 ]] && echo true || echo false)" >> $GITHUB_OUTPUT
deploy-web:
needs: detect-changes
if: needs.detect-changes.outputs.web-changed == 'true'
runs-on: ubuntu-latest
steps:
- name: Deploy web to Vercel
run: vercel --prod --token=${{ secrets.VERCEL_TOKEN }}
Turbo für GitHub Actions optimieren
turbo.json — CI-spezifische Konfiguration
{
"$schema": "https://turbo.build/schema.json",
"remoteCache": {
"enabled": true,
"signature": true
},
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**", ".next/**", "!.next/cache/**"],
"env": [
"NODE_ENV",
"NEXT_PUBLIC_*"
]
}
}
}
CI Cache-Tipp: Setze fetch-depth: 0 in actions/checkout — ohne vollständige Git-History kann Turborepo --filter=[origin/main] nicht korrekt auflösen und fällt auf einen Full-Build zurück.
Fazit: Turborepo + Claude Code = produktives Monorepo
Turborepo ist 2026 die erste Wahl für TypeScript-Monorepos — mit intelligentem Caching, klaren Pipeline-Definitionen und nahtloser CI-Integration. Claude Code beschleunigt das Setup erheblich: turbo.json-Pipelines, package.json-Exports und GitHub Actions Workflows entstehen durch präzise Prompts in Minuten.
Die Kombination aus Remote Cache, Affected-only-Builds und Shared Packages macht Turborepo besonders wertvoll für wachsende Teams. Wer einmal die Produktivitätsgewinne erlebt hat — Build-Zeiten von Minuten auf Sekunden, geteilte Komponenten ohne Duplikation, CI-Läufe die nur das Nötige testen — kehrt nicht mehr zu traditionellen Multi-Repo-Setups zurück.