Turborepo
Workspace Structure
Section titled “Workspace Structure”soon/├── apps/│ ├── web/ # Next.js application│ └── docs/ # Astro documentation site├── packages/│ ├── backend/ # Convex backend│ ├── ui/ # shadcn/ui components│ ├── validators/ # Shared Zod schemas│ ├── oxlint-config/ # Shared oxlint configs│ ├── typescript-config/# Shared TypeScript configs│ └── vitest-config/ # Shared Vitest config├── turbo.json # Task pipeline configuration└── package.json # Root scriptsTask Pipelines
Section titled “Task Pipelines”Defined in turbo.json:
{ "tasks": { "build": { "dependsOn": ["^build"], "inputs": ["$TURBO_DEFAULT$", ".env*"], "outputs": [".next/**", "!.next/cache/**", "dist/**"] }, "lint": { "dependsOn": ["^lint"] }, "check-types": { "dependsOn": ["^check-types", "^transit"] }, "test": { "dependsOn": ["transit"], "inputs": ["$TURBO_DEFAULT$", "$TURBO_ROOT$/vitest.config.ts"], "outputs": ["coverage/**"] }, "transit": { "dependsOn": ["^transit"] }, "dev": { "cache": false, "persistent": true } }}Pipeline Concepts
Section titled “Pipeline Concepts”| Symbol | Meaning |
|---|---|
^build | Run build in dependencies first |
dependsOn | Tasks that must complete first |
inputs | Files that affect task cache |
outputs | Files produced by task |
persistent: true | Task runs continuously |
cache: false | Never cache this task |
Transit Task
Section titled “Transit Task”The transit task compiles config packages (like vitest-config) that export TypeScript. This ensures they’re built before dependent packages run type checking or tests.
Filters
Section titled “Filters”By Package Name
Section titled “By Package Name”turbo build --filter=webturbo lint --filter=@repo/uiturbo dev --filter=docsBy Directory
Section titled “By Directory”turbo build --filter=./apps/webturbo lint --filter=./packages/*Affected Only
Section titled “Affected Only”turbo build --affectedExclusions
Section titled “Exclusions”turbo build --filter=!docsDependencies
Section titled “Dependencies”# Package and its dependenciesturbo build --filter=web...
# Packages that depend on uiturbo build --filter=...@repo/uiCaching
Section titled “Caching”How It Works
Section titled “How It Works”Turborepo hashes:
- Task inputs (source files, configs)
- Dependencies’ outputs
- Environment variables (from
globalEnv)
If hash matches, outputs are restored from cache.
Global Environment Variables
Section titled “Global Environment Variables”{ "globalEnv": ["NEXT_PUBLIC_CONVEX_URL", "CONVEX_DEPLOYMENT"]}Cache Commands
Section titled “Cache Commands”# Dry run (see what would run)turbo build --dry-run
# Force rebuild (ignore cache)turbo build --force
# Clear local cacherm -rf .turboRoot Scripts
Section titled “Root Scripts”{ "scripts": { "build": "turbo run build", "dev": "turbo run dev", "lint": "turbo run lint", "check-types": "turbo run check-types", "format": "prettier --write .", "format:check": "prettier --check .", "test": "turbo run test" }}Adding New Packages
Section titled “Adding New Packages”- Create directory in
packages/orapps/ - Add
package.jsonwithnamefield - Run
bun installat root
Package Requirements
Section titled “Package Requirements”{ "name": "@repo/my-package", "private": true, "scripts": { "build": "tsc", "lint": "oxlint -c @repo/oxlint-config/base", "check-types": "tsc --noEmit" }}Common Patterns
Section titled “Common Patterns”Run Multiple Tasks
Section titled “Run Multiple Tasks”turbo build lint check-typesDev Multiple Packages
Section titled “Dev Multiple Packages”turbo dev --filter=web --filter=docsCI Pipeline
Section titled “CI Pipeline”turbo check-types lint test build