Skip to content

Turborepo

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 scripts

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
}
}
}
SymbolMeaning
^buildRun build in dependencies first
dependsOnTasks that must complete first
inputsFiles that affect task cache
outputsFiles produced by task
persistent: trueTask runs continuously
cache: falseNever cache this 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.

Terminal window
turbo build --filter=web
turbo lint --filter=@repo/ui
turbo dev --filter=docs
Terminal window
turbo build --filter=./apps/web
turbo lint --filter=./packages/*
Terminal window
turbo build --affected
Terminal window
turbo build --filter=!docs
Terminal window
# Package and its dependencies
turbo build --filter=web...
# Packages that depend on ui
turbo build --filter=...@repo/ui

Turborepo hashes:

  • Task inputs (source files, configs)
  • Dependencies’ outputs
  • Environment variables (from globalEnv)

If hash matches, outputs are restored from cache.

{
"globalEnv": ["NEXT_PUBLIC_CONVEX_URL", "CONVEX_DEPLOYMENT"]
}
Terminal window
# Dry run (see what would run)
turbo build --dry-run
# Force rebuild (ignore cache)
turbo build --force
# Clear local cache
rm -rf .turbo
{
"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"
}
}
  1. Create directory in packages/ or apps/
  2. Add package.json with name field
  3. Run bun install at root
{
"name": "@repo/my-package",
"private": true,
"scripts": {
"build": "tsc",
"lint": "oxlint -c @repo/oxlint-config/base",
"check-types": "tsc --noEmit"
}
}
Terminal window
turbo build lint check-types
Terminal window
turbo dev --filter=web --filter=docs
Terminal window
turbo check-types lint test build