[{"data":1,"prerenderedAt":778},["ShallowReactive",2],{"blog-turborepo":3,"blog-turborepo-favor-of":752},{"id":4,"title":5,"body":6,"cover_image":752,"date":753,"decidedDate":753,"decision":754,"decisionInFavorOf":752,"decisionReason":755,"description":756,"evaluatedScore":125,"extension":757,"link":758,"logoPath":752,"meta":759,"navigation":760,"path":761,"placements":762,"reviewTrigger":752,"satisfaction":752,"seo":766,"stage":754,"stem":767,"tags":768,"target":775,"type":776,"__hash__":777},"radar\u002Fradar\u002Fturborepo.md","Turborepo",{"type":7,"value":8,"toc":740},"minimark",[9,14,32,49,52,57,68,78,83,90,271,299,301,305,312,318,351,353,361,364,369,397,426,428,432,435,496,504,506,510,655,657,661,688,690,694,736],[10,11,13],"h1",{"id":12},"turborepo-high-velocity-task-orchestration-for-typescript-monorepos","Turborepo: High-Velocity Task Orchestration for TypeScript Monorepos",[15,16,17,18,26,27,31],"p",{},"As a codebase expands from a handful of packages into an enterprise ",[19,20,21],"strong",{},[22,23,25],"a",{"href":24},"\u002Fblog\u002Fmonorepo","Monorepo Architecture",", native package manager scripts (",[28,29,30],"code",{},"pnpm -r run build",") quickly run into a wall: they re-run tasks sequentially, test unchanged code, and waste minutes on redundant computation.",[15,33,34,35,37,38,41,42,48],{},"Acquired and heavily developed by Vercel, ",[19,36,5],{}," is the gold standard for high-performance task orchestration in pure JavaScript and TypeScript monorepos. On our Tech Radar, ",[19,39,40],{},"Turborepo is adopted as the primary task orchestrator for pure TS\u002FJS codebases",", while being evaluated against ",[19,43,44],{},[22,45,47],{"href":46},"\u002Fblog\u002Fmoon","Moon"," for polyglot architectures.",[50,51],"hr",{},[53,54,56],"h2",{"id":55},"_1-what-turborepo-does-best-zero-friction-caching","1. What Turborepo Does Best: Zero-Friction Caching",[15,58,59,60,67],{},"Turborepo does not replace your package manager. Instead, it sits cleanly on top of ",[19,61,62,66],{},[22,63,65],{"href":64},"\u002Fblog\u002Fpnpm","pnpm"," workspaces"," (or npm\u002Fyarn), acting as an intelligent task execution scheduler and computation cache.",[69,70,76],"pre",{"className":71,"code":73,"language":74,"meta":75},[72],"language-text","┌────────────────────────────────────────────────────────┐\n│  Turborepo Architecture Overview                      │\n├────────────────────────────────────────────────────────┤\n│  ⚡ Rust-Powered Background Daemon                     │\n│  🧠 Topological Task Dependency Graph (turbo.json)     │\n│  🔒 Content-Aware Fingerprinting (Git + AST + Env)     │\n│  ☁️ Distributed Remote Caching (Vercel \u002F S3 \u002F Custom)  │\n│  ✂️ Docker Pruning with 'turbo prune'                  │\n└────────────────────────────────────────────────────────┘\n","text","",[28,77,73],{"__ignoreMap":75},[79,80,82],"h3",{"id":81},"the-turbojson-pipeline","The turbo.json Pipeline",[15,84,85,86,89],{},"Turborepo replaces messy shell scripts with a declarative pipeline defined in a single root ",[28,87,88],{},"turbo.json",":",[69,91,95],{"className":92,"code":93,"language":94,"meta":75,"style":75},"language-json shiki shiki-themes github-light github-dark","{\n  \"$schema\": \"https:\u002F\u002Fturbo.build\u002Fschema.json\",\n  \"tasks\": {\n    \"build\": {\n      \"dependsOn\": [\"^build\"],\n      \"outputs\": [\"dist\u002F**\", \".next\u002F**\", \".output\u002F**\"]\n    },\n    \"test\": {\n      \"dependsOn\": [\"build\"],\n      \"inputs\": [\"src\u002F**\u002F*.tsx\", \"src\u002F**\u002F*.ts\", \"test\u002F**\u002F*.ts\"]\n    },\n    \"lint\": {\n      \"cache\": true\n    }\n  }\n}\n","json",[28,96,97,106,123,132,140,155,180,186,194,206,229,234,242,253,259,265],{"__ignoreMap":75},[98,99,102],"span",{"class":100,"line":101},"line",1,[98,103,105],{"class":104},"sVt8B","{\n",[98,107,109,113,116,120],{"class":100,"line":108},2,[98,110,112],{"class":111},"sj4cs","  \"$schema\"",[98,114,115],{"class":104},": ",[98,117,119],{"class":118},"sZZnC","\"https:\u002F\u002Fturbo.build\u002Fschema.json\"",[98,121,122],{"class":104},",\n",[98,124,126,129],{"class":100,"line":125},3,[98,127,128],{"class":111},"  \"tasks\"",[98,130,131],{"class":104},": {\n",[98,133,135,138],{"class":100,"line":134},4,[98,136,137],{"class":111},"    \"build\"",[98,139,131],{"class":104},[98,141,143,146,149,152],{"class":100,"line":142},5,[98,144,145],{"class":111},"      \"dependsOn\"",[98,147,148],{"class":104},": [",[98,150,151],{"class":118},"\"^build\"",[98,153,154],{"class":104},"],\n",[98,156,158,161,163,166,169,172,174,177],{"class":100,"line":157},6,[98,159,160],{"class":111},"      \"outputs\"",[98,162,148],{"class":104},[98,164,165],{"class":118},"\"dist\u002F**\"",[98,167,168],{"class":104},", ",[98,170,171],{"class":118},"\".next\u002F**\"",[98,173,168],{"class":104},[98,175,176],{"class":118},"\".output\u002F**\"",[98,178,179],{"class":104},"]\n",[98,181,183],{"class":100,"line":182},7,[98,184,185],{"class":104},"    },\n",[98,187,189,192],{"class":100,"line":188},8,[98,190,191],{"class":111},"    \"test\"",[98,193,131],{"class":104},[98,195,197,199,201,204],{"class":100,"line":196},9,[98,198,145],{"class":111},[98,200,148],{"class":104},[98,202,203],{"class":118},"\"build\"",[98,205,154],{"class":104},[98,207,209,212,214,217,219,222,224,227],{"class":100,"line":208},10,[98,210,211],{"class":111},"      \"inputs\"",[98,213,148],{"class":104},[98,215,216],{"class":118},"\"src\u002F**\u002F*.tsx\"",[98,218,168],{"class":104},[98,220,221],{"class":118},"\"src\u002F**\u002F*.ts\"",[98,223,168],{"class":104},[98,225,226],{"class":118},"\"test\u002F**\u002F*.ts\"",[98,228,179],{"class":104},[98,230,232],{"class":100,"line":231},11,[98,233,185],{"class":104},[98,235,237,240],{"class":100,"line":236},12,[98,238,239],{"class":111},"    \"lint\"",[98,241,131],{"class":104},[98,243,245,248,250],{"class":100,"line":244},13,[98,246,247],{"class":111},"      \"cache\"",[98,249,115],{"class":104},[98,251,252],{"class":111},"true\n",[98,254,256],{"class":100,"line":255},14,[98,257,258],{"class":104},"    }\n",[98,260,262],{"class":100,"line":261},15,[98,263,264],{"class":104},"  }\n",[98,266,268],{"class":100,"line":267},16,[98,269,270],{"class":104},"}\n",[272,273,274,284],"ul",{},[275,276,277,279,280,283],"li",{},[28,278,151],{}," (with a caret) instructs Turborepo to build upstream internal dependencies ",[19,281,282],{},"before"," building the dependent package.",[275,285,286,287,290,291,294,295,298],{},"If no files matching ",[28,288,289],{},"inputs"," have changed since the last run, Turborepo replays the task from cache in ",[19,292,293],{},"under 35 milliseconds",", restoring ",[28,296,297],{},"outputs"," from the local or remote cache.",[50,300],{},[53,302,304],{"id":303},"_2-remote-caching-the-ci-game-changer","2. Remote Caching: The CI Game-Changer",[15,306,307,308,311],{},"In traditional CI pipelines, every commit re-runs linting, unit tests, and builds from scratch. In a 20-package monorepo, a developer changing a single button in ",[28,309,310],{},"packages\u002Fui-kit"," might wait 15 minutes for CI to finish.",[15,313,314,315,89],{},"With Turborepo's ",[19,316,317],{},"Remote Cache",[319,320,321,324,327,344],"ol",{},[275,322,323],{},"When Developer Alice builds or tests a package on her laptop, the resulting artifacts and log outputs are hashed and securely uploaded to the remote cache (Vercel or an S3 bucket).",[275,325,326],{},"When Developer Bob pulls the branch or when GitHub Actions executes the PR verification job, Turborepo detects the exact input hash match.",[275,328,329,330,333,334,337,338],{},"Instead of re-executing ",[28,331,332],{},"npm run build"," or ",[28,335,336],{},"pnpm test",", it downloads the cached output:\n",[69,339,342],{"className":340,"code":341,"language":74,"meta":75},[72],">>> FULL TURBO\nweb:build: cache hit, replaying logs 15ms\napi:build: cache hit, replaying logs 12ms\nui-kit:test: cache hit, replaying logs 20ms\n",[28,343,341],{"__ignoreMap":75},[275,345,346,347,350],{},"CI execution times drop from ",[19,348,349],{},"15 minutes down to 30 seconds",".",[50,352],{},[53,354,356,357,360],{"id":355},"_3-pruned-docker-builds-the-turbo-prune-advantage","3. Pruned Docker Builds: The ",[28,358,359],{},"turbo prune"," Advantage",[15,362,363],{},"One major historical complaint against monorepos is bloated Docker images: copying the entire repository into a container build context destroys caching and produces 2GB images.",[15,365,366,367,89],{},"Turborepo solves this with ",[28,368,359],{},[69,370,374],{"className":371,"code":372,"language":373,"meta":75,"style":75},"language-bash shiki shiki-themes github-light github-dark","# Generate a pruned workspace containing ONLY what's needed for the 'web' application:\nturbo prune web --docker\n","bash",[28,375,376,382],{"__ignoreMap":75},[98,377,378],{"class":100,"line":101},[98,379,381],{"class":380},"sJ8bj","# Generate a pruned workspace containing ONLY what's needed for the 'web' application:\n",[98,383,384,388,391,394],{"class":100,"line":108},[98,385,387],{"class":386},"sScJk","turbo",[98,389,390],{"class":118}," prune",[98,392,393],{"class":118}," web",[98,395,396],{"class":111}," --docker\n",[272,398,399,405,423],{},[275,400,401,402,350],{},"It inspects the dependency tree of ",[28,403,404],{},"web",[275,406,407,408,411,412,415,416,418,419,422],{},"It creates an isolated ",[28,409,410],{},"out\u002F"," directory containing only the ",[28,413,414],{},"package.json"," files and source files of ",[28,417,404],{}," and its exact internal dependencies (e.g. ",[28,420,421],{},"@org\u002Fui-kit",").",[275,424,425],{},"Unrelated microservices and libraries are excluded entirely, enabling lightning-fast Docker layer caching.",[50,427],{},[53,429,431],{"id":430},"_4-the-polyglot-limitation-where-turborepo-hits-a-wall","4. The Polyglot Limitation: Where Turborepo Hits a Wall",[15,433,434],{},"While Turborepo is unmatched for pure JavaScript and TypeScript applications, its architecture reveals sharp constraints when applied to multi-language stacks:",[319,436,437,443,486],{},[275,438,439,442],{},[19,440,441],{},"No Native Multi-Runtime Toolchains:"," Turborepo assumes the host machine or container already has the correct versions of runtimes installed. It cannot provision or manage Python or Rust runtimes.",[275,444,445,448,449,455,456,458,459,485],{},[19,446,447],{},"Non-JS Tools Require npm Wrappers:"," To run a Python lint task with ",[19,450,451],{},[22,452,454],{"href":453},"\u002Fblog\u002Fuv","uv"," or a Rust build with Cargo, you must wrap the command inside a ",[28,457,414],{}," script:\n",[69,460,462],{"className":92,"code":461,"language":94,"meta":75,"style":75},"\"scripts\": {\n  \"lint\": \"uv run ruff check .\"\n}\n",[28,463,464,471,481],{"__ignoreMap":75},[98,465,466,469],{"class":100,"line":101},[98,467,468],{"class":118},"\"scripts\"",[98,470,131],{"class":104},[98,472,473,476,478],{"class":100,"line":108},[98,474,475],{"class":111},"  \"lint\"",[98,477,115],{"class":104},[98,479,480],{"class":118},"\"uv run ruff check .\"\n",[98,482,483],{"class":100,"line":125},[98,484,270],{"class":104},"\nThis creates awkward boilerplate in non-JavaScript microservices.",[275,487,488,491,492,495],{},[19,489,490],{},"Cross-Language Task Dependencies:"," While Turborepo can chain npm scripts, it lacks native awareness of Python lockfiles (",[28,493,494],{},"uv.lock","), Cargo workspaces, or non-JS input hashing.",[15,497,498,499,503],{},"For true polyglot architectures that mix Python, TypeScript, and Rust, ",[19,500,501],{},[22,502,47],{"href":46}," provides a superior cross-language abstraction.",[50,505],{},[53,507,509],{"id":508},"_5-head-to-head-comparison-turborepo-vs-moon-vs-nx","5. Head-to-Head Comparison: Turborepo vs. Moon vs. Nx",[511,512,513,533],"table",{},[514,515,516],"thead",{},[517,518,519,524,527,530],"tr",{},[520,521,523],"th",{"align":522},"left","Dimension",[520,525,526],{"align":522},"Turborepo (Adopted for TS)",[520,528,529],{"align":522},"Moon (Front-Runner for Polyglot)",[520,531,532],{"align":522},"Nx (Enterprise Heavyweight)",[534,535,536,553,571,592,619,635],"tbody",{},[517,537,538,544,547,550],{},[539,540,541],"td",{"align":522},[19,542,543],{},"Primary Scope",[539,545,546],{"align":522},"JS\u002FTS Task Orchestrator",[539,548,549],{"align":522},"Polyglot Repository Orchestrator",[539,551,552],{"align":522},"Enterprise JS\u002FTS Ecosystem",[517,554,555,560,563,568],{},[539,556,557],{"align":522},[19,558,559],{},"Language Support",[539,561,562],{"align":522},"JS \u002F TS native (Others via npm scripts)",[539,564,565],{"align":522},[19,566,567],{},"Node, Python, Rust, Go, Bun (Native)",[539,569,570],{"align":522},"JS \u002F TS native (Python via plugins)",[517,572,573,578,581,590],{},[539,574,575],{"align":522},[19,576,577],{},"Toolchain Management",[539,579,580],{"align":522},"None (Host managed)",[539,582,583],{"align":522},[19,584,585,586,589],{},"Built-in hermetic toolchains (",[28,587,588],{},"proto",")",[539,591,580],{"align":522},[517,593,594,599,606,612],{},[539,595,596],{"align":522},[19,597,598],{},"Configuration Complexity",[539,600,601],{"align":522},[19,602,603,604,589],{},"Minimal (",[28,605,88],{},[539,607,608,609,589],{"align":522},"Moderate (",[28,610,611],{},".moon\u002F*.yml",[539,613,614,615,618],{"align":522},"High (",[28,616,617],{},"nx.json"," + generators)",[517,620,621,626,629,632],{},[539,622,623],{"align":522},[19,624,625],{},"Computation Caching",[539,627,628],{"align":522},"Local & Remote (Vercel \u002F S3)",[539,630,631],{"align":522},"Local & Remote (AWS \u002F GCP \u002F Moonbase)",[539,633,634],{"align":522},"Local & Remote (Nx Cloud)",[517,636,637,642,647,652],{},[539,638,639],{"align":522},[19,640,641],{},"Best Fit For",[539,643,644],{"align":522},[19,645,646],{},"High-velocity pure TS\u002FJS monorepos",[539,648,649],{"align":522},[19,650,651],{},"Polyglot Python + TS + Rust architectures",[539,653,654],{"align":522},"Large enterprise Angular \u002F React suites",[50,656],{},[53,658,660],{"id":659},"_6-architectural-decision-matrix","6. Architectural Decision Matrix",[272,662,663,669],{},[275,664,665,668],{},[19,666,667],{},"Choose Turborepo if:"," Your repository consists entirely of TypeScript and JavaScript applications (Next.js, Nuxt, Remix, Node backends) and you prioritize zero-friction configuration and ultra-fast remote caching.",[275,670,671,677,678,682,683,687],{},[19,672,673,674,676],{},"Graduate to ",[22,675,47],{"href":46}," if:"," Your repository combines a Python backend (managed with ",[19,679,680],{},[22,681,454],{"href":453},"), a TypeScript frontend (managed with ",[19,684,685],{},[22,686,65],{"href":64},"), or Rust\u002FGo microservices, and you require unified toolchain management and cross-language task graphs.",[50,689],{},[53,691,693],{"id":692},"_7-related-architecture-reports-toolchains","7. Related Architecture Reports & Toolchains",[272,695,696,704,712,719,728],{},[275,697,698,703],{},[19,699,700,89],{},[22,701,702],{"href":24},"Monorepo Architecture (Adopted)"," Complete strategy guide from native workspaces to distributed build engines.",[275,705,706,711],{},[19,707,708,89],{},[22,709,710],{"href":64},"pnpm (Adopted)"," The disk-efficient package manager underpinning Turborepo's workspace linking.",[275,713,714,718],{},[19,715,716,89],{},[22,717,47],{"href":46}," The polyglot alternative designed for Python, TypeScript, and Rust.",[275,720,721,727],{},[19,722,723,89],{},[22,724,726],{"href":725},"\u002Fblog\u002Fnx","Nx"," The enterprise-scale alternative with deep AST code analysis and generators.",[275,729,730,735],{},[19,731,732,89],{},[22,733,734],{"href":453},"uv (Adopted)"," The high-speed Python package manager used alongside Turborepo or Moon.",[737,738,739],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":75,"searchDepth":108,"depth":108,"links":741},[742,745,746,748,749,750,751],{"id":55,"depth":108,"text":56,"children":743},[744],{"id":81,"depth":125,"text":82},{"id":303,"depth":108,"text":304},{"id":355,"depth":108,"text":747},"3. Pruned Docker Builds: The turbo prune Advantage",{"id":430,"depth":108,"text":431},{"id":508,"depth":108,"text":509},{"id":659,"depth":108,"text":660},{"id":692,"depth":108,"text":693},null,"2026-08-08","adopt","The premier build system and computation cache for pure JavaScript and TypeScript monorepos. Zero-friction pipeline configuration, local daemon, and instant remote caching with pnpm workspaces make it unbeatable for pure TS stacks, though limited for polyglot setups compared to Moon.","High-performance monorepo build system and task orchestrator with remote caching, evaluated for pure JavaScript and TypeScript architectures.","md","https:\u002F\u002Fturbo.build\u002F",{},true,"\u002Fradar\u002Fturborepo",[763],{"category":764,"subCategory":765},"tools","monorepo_tooling",{"title":5,"description":756},"radar\u002Fturborepo",[769,770,771,772,773,774],"turborepo","monorepo","build-tools","javascript","typescript","cicd","_blank","tech_report","tLlu6AkYdqOKxQeKD7R9UvIgowj0MfvEj7TrgBZu8GY",1790263542725]