[{"data":1,"prerenderedAt":836},["ShallowReactive",2],{"blog-moon":3,"blog-moon-favor-of":811},{"id":4,"title":5,"body":6,"cover_image":811,"date":812,"decidedDate":812,"decision":813,"decisionInFavorOf":811,"decisionReason":814,"description":815,"evaluatedScore":194,"extension":816,"link":817,"logoPath":811,"meta":818,"navigation":227,"path":819,"placements":820,"reviewTrigger":811,"satisfaction":811,"seo":824,"stage":825,"stem":826,"tags":827,"target":833,"type":834,"__hash__":835},"radar\u002Fradar\u002Fmoon.md","Moon",{"type":7,"value":8,"toc":798},"minimark",[9,14,46,57,60,65,68,104,116,128,133,135,142,150,293,298,326,328,332,335,425,429,432,474,481,483,487,494,502,535,537,541,710,712,716,724,741,744,794],[10,11,13],"h1",{"id":12},"moon-moonrepo-the-premier-polyglot-monorepo-build-system","Moon (moonrepo): The Premier Polyglot Monorepo Build System",[15,16,17,18,26,27,33,34,40,41,45],"p",{},"When scaling a ",[19,20,21],"strong",{},[22,23,25],"a",{"href":24},"\u002Fblog\u002Fmonorepo","Monorepo Architecture"," beyond pure JavaScript, engineering teams encounter a severe tooling gap. Industry-standard tools like ",[19,28,29],{},[22,30,32],{"href":31},"\u002Fblog\u002Fturborepo","Turborepo"," and ",[19,35,36],{},[22,37,39],{"href":38},"\u002Fblog\u002Fnx","Nx"," are JavaScript-first systems; non-JS runtimes (like Python, Rust, or Go) are either bolted on via community plugins or forced to run through clumsy ",[42,43,44],"code",{},"package.json"," script wrappers.",[15,47,48,49,52,53,56],{},"Implemented from scratch in Rust, ",[19,50,51],{},"Moon (moonrepo)"," was built specifically to solve the polyglot monorepo problem. It provides native multi-language toolchain management, unified cross-language task pipelines, and distributed computation caching. On our Tech Radar, ",[19,54,55],{},"Moon is our chosen front-runner for polyglot multi-stack repositories",".",[58,59],"hr",{},[61,62,64],"h2",{"id":63},"_1-the-polyglot-dilemma-that-moon-solves","1. The Polyglot Dilemma That Moon Solves",[15,66,67],{},"Modern backend and AI engineering rarely lives in a single language:",[69,70,71,85,98],"ul",{},[72,73,74,77,78,84],"li",{},[19,75,76],{},"API Services & Agent Workflows:"," Python 3.12 (managed via ",[19,79,80],{},[22,81,83],{"href":82},"\u002Fblog\u002Fuv","uv"," and FastAPI).",[72,86,87,90,91,97],{},[19,88,89],{},"Web Frontend & UI Applications:"," TypeScript and Vue\u002FNuxt (managed via ",[19,92,93],{},[22,94,96],{"href":95},"\u002Fblog\u002Fpnpm","pnpm",").",[72,99,100,103],{},[19,101,102],{},"Performance Cores & Edge Workers:"," Rust (compiled to native binaries or WebAssembly).",[15,105,106,107,109,110,109,112,115],{},"In a traditional monorepo, orchestrating this mix requires stitching together ",[42,108,96],{},", ",[42,111,83],{},[42,113,114],{},"cargo",", and fragile shell scripts. There is no central orchestrator that understands:",[117,118,119,122,125],"ol",{},[72,120,121],{},"When a Rust crate changes, the WebAssembly module must recompile before the TypeScript frontend builds.",[72,123,124],{},"When a Python FastAPI schema changes, the TypeScript client SDK must regenerate before the client tests run.",[72,126,127],{},"Every developer and CI machine must run the exact same versions of Node, Python, and Rust without manual host setup.",[15,129,130],{},[19,131,132],{},"Moon solves all three challenges natively.",[58,134],{},[61,136,138,139],{"id":137},"_2-superpower-1-hermetic-toolchain-management-via-proto","2. Superpower #1: Hermetic Toolchain Management via ",[42,140,141],{},"proto",[15,143,144,145,149],{},"Unlike tools that rely on whatever runtime versions happen to be installed on a developer's laptop, Moon integrates directly with ",[19,146,147],{},[42,148,141],{},"—a multi-language version manager:",[151,152,157],"pre",{"className":153,"code":154,"language":155,"meta":156,"style":156},"language-yaml shiki shiki-themes github-light github-dark","# .moon\u002Ftoolchain.yml\nnode:\n  version: \"20.14.0\"\n  packageManager: \"pnpm\"\n  pnpm:\n    version: \"9.4.0\"\n\npython:\n  version: \"3.12.3\"\n  # Moon natively supports uv as the Python package manager!\n\nrust:\n  version: \"1.80.0\"\n  bins:\n    - \"wasm-pack\"\n","yaml","",[42,158,159,168,179,192,203,211,222,229,237,247,253,258,266,276,284],{"__ignoreMap":156},[160,161,164],"span",{"class":162,"line":163},"line",1,[160,165,167],{"class":166},"sJ8bj","# .moon\u002Ftoolchain.yml\n",[160,169,171,175],{"class":162,"line":170},2,[160,172,174],{"class":173},"s9eBZ","node",[160,176,178],{"class":177},"sVt8B",":\n",[160,180,182,185,188],{"class":162,"line":181},3,[160,183,184],{"class":173},"  version",[160,186,187],{"class":177},": ",[160,189,191],{"class":190},"sZZnC","\"20.14.0\"\n",[160,193,195,198,200],{"class":162,"line":194},4,[160,196,197],{"class":173},"  packageManager",[160,199,187],{"class":177},[160,201,202],{"class":190},"\"pnpm\"\n",[160,204,206,209],{"class":162,"line":205},5,[160,207,208],{"class":173},"  pnpm",[160,210,178],{"class":177},[160,212,214,217,219],{"class":162,"line":213},6,[160,215,216],{"class":173},"    version",[160,218,187],{"class":177},[160,220,221],{"class":190},"\"9.4.0\"\n",[160,223,225],{"class":162,"line":224},7,[160,226,228],{"emptyLinePlaceholder":227},true,"\n",[160,230,232,235],{"class":162,"line":231},8,[160,233,234],{"class":173},"python",[160,236,178],{"class":177},[160,238,240,242,244],{"class":162,"line":239},9,[160,241,184],{"class":173},[160,243,187],{"class":177},[160,245,246],{"class":190},"\"3.12.3\"\n",[160,248,250],{"class":162,"line":249},10,[160,251,252],{"class":166},"  # Moon natively supports uv as the Python package manager!\n",[160,254,256],{"class":162,"line":255},11,[160,257,228],{"emptyLinePlaceholder":227},[160,259,261,264],{"class":162,"line":260},12,[160,262,263],{"class":173},"rust",[160,265,178],{"class":177},[160,267,269,271,273],{"class":162,"line":268},13,[160,270,184],{"class":173},[160,272,187],{"class":177},[160,274,275],{"class":190},"\"1.80.0\"\n",[160,277,279,282],{"class":162,"line":278},14,[160,280,281],{"class":173},"  bins",[160,283,178],{"class":177},[160,285,287,290],{"class":162,"line":286},15,[160,288,289],{"class":177},"    - ",[160,291,292],{"class":190},"\"wasm-pack\"\n",[294,295,297],"h3",{"id":296},"the-operational-impact","The Operational Impact:",[69,299,300,311,323],{},[72,301,302,303,306,307,310],{},"When a developer clones the repository and runs ",[42,304,305],{},"moon run :test",", Moon ",[19,308,309],{},"automatically downloads, installs, and isolates"," Node 20, Python 3.12, and Rust 1.80 hermetically.",[72,312,313,314,109,317,109,320,97],{},"CI pipeline setup is reduced to a single step: install the Moon binary. No more dozens of GitHub Actions steps (",[42,315,316],{},"setup-node",[42,318,319],{},"setup-python",[42,321,322],{},"setup-rust",[72,324,325],{},"\"Works on my machine\" version drift is permanently eliminated.",[58,327],{},[61,329,331],{"id":330},"_3-superpower-2-cross-language-directed-acyclic-graphs-dag","3. Superpower #2: Cross-Language Directed Acyclic Graphs (DAG)",[15,333,334],{},"Moon allows tasks in one language to declare native dependencies on tasks in a completely different language:",[151,336,338],{"className":153,"code":337,"language":155,"meta":156,"style":156},"# apps\u002Fweb-frontend\u002Fmoon.yml\ntasks:\n  build:\n    command: \"pnpm run build\"\n    deps:\n      - \"crates-core:wasm\" # Depends on Rust WebAssembly compilation!\n      - \"services-api:export-schema\" # Depends on Python OpenAPI generation!\n    inputs:\n      - \"src\u002F**\u002F*\"\n    outputs:\n      - \"dist\u002F**\u002F*\"\n",[42,339,340,345,352,359,369,376,387,397,404,411,418],{"__ignoreMap":156},[160,341,342],{"class":162,"line":163},[160,343,344],{"class":166},"# apps\u002Fweb-frontend\u002Fmoon.yml\n",[160,346,347,350],{"class":162,"line":170},[160,348,349],{"class":173},"tasks",[160,351,178],{"class":177},[160,353,354,357],{"class":162,"line":181},[160,355,356],{"class":173},"  build",[160,358,178],{"class":177},[160,360,361,364,366],{"class":162,"line":194},[160,362,363],{"class":173},"    command",[160,365,187],{"class":177},[160,367,368],{"class":190},"\"pnpm run build\"\n",[160,370,371,374],{"class":162,"line":205},[160,372,373],{"class":173},"    deps",[160,375,178],{"class":177},[160,377,378,381,384],{"class":162,"line":213},[160,379,380],{"class":177},"      - ",[160,382,383],{"class":190},"\"crates-core:wasm\"",[160,385,386],{"class":166}," # Depends on Rust WebAssembly compilation!\n",[160,388,389,391,394],{"class":162,"line":224},[160,390,380],{"class":177},[160,392,393],{"class":190},"\"services-api:export-schema\"",[160,395,396],{"class":166}," # Depends on Python OpenAPI generation!\n",[160,398,399,402],{"class":162,"line":231},[160,400,401],{"class":173},"    inputs",[160,403,178],{"class":177},[160,405,406,408],{"class":162,"line":239},[160,407,380],{"class":177},[160,409,410],{"class":190},"\"src\u002F**\u002F*\"\n",[160,412,413,416],{"class":162,"line":249},[160,414,415],{"class":173},"    outputs",[160,417,178],{"class":177},[160,419,420,422],{"class":162,"line":255},[160,421,380],{"class":177},[160,423,424],{"class":190},"\"dist\u002F**\u002F*\"\n",[294,426,428],{"id":427},"universal-unified-ci","Universal Unified CI",[15,430,431],{},"Instead of maintaining separate CI jobs for Python and TypeScript:",[151,433,437],{"className":434,"code":435,"language":436,"meta":156,"style":156},"language-bash shiki shiki-themes github-light github-dark","# Run linters across TypeScript (eslint), Python (ruff), and Rust (clippy) in parallel:\nmoon run :lint\n\n# Run tests across all languages in topological order with computation caching:\nmoon run :test\n","bash",[42,438,439,444,456,460,465],{"__ignoreMap":156},[160,440,441],{"class":162,"line":163},[160,442,443],{"class":166},"# Run linters across TypeScript (eslint), Python (ruff), and Rust (clippy) in parallel:\n",[160,445,446,450,453],{"class":162,"line":170},[160,447,449],{"class":448},"sScJk","moon",[160,451,452],{"class":190}," run",[160,454,455],{"class":190}," :lint\n",[160,457,458],{"class":162,"line":181},[160,459,228],{"emptyLinePlaceholder":227},[160,461,462],{"class":162,"line":194},[160,463,464],{"class":166},"# Run tests across all languages in topological order with computation caching:\n",[160,466,467,469,471],{"class":162,"line":205},[160,468,449],{"class":448},[160,470,452],{"class":190},[160,472,473],{"class":190}," :test\n",[15,475,476,477,480],{},"If only ",[42,478,479],{},"apps\u002Fweb-frontend"," changed, Moon executes only that task. If a shared contract changed, Moon traces the exact downstream dependency graph and executes only affected targets.",[58,482],{},[61,484,486],{"id":485},"_4-symbiosis-with-native-package-managers","4. Symbiosis with Native Package Managers",[15,488,489,490,493],{},"A common misconception is that Moon replaces package managers. Moon is an ",[19,491,492],{},"orchestrator",", not a package manager. It orchestrates the best-in-class native tools we have adopted:",[151,495,500],{"className":496,"code":498,"language":499,"meta":156},[497],"language-text","Moon Polyglot Orchestrator (.moon\u002F*.yml)\n  │\n  ├── TypeScript Ecosystem  ──> pnpm workspaces (pnpm-workspace.yaml)\n  ├── Python Ecosystem      ──> uv workspaces (pyproject.toml + uv.lock)\n  └── Rust Ecosystem        ──> Cargo workspaces (Cargo.toml + Cargo.lock)\n","text",[42,501,498],{"__ignoreMap":156},[69,503,504,519,530],{},[72,505,506,507,511,512,33,515,518],{},"For TypeScript, Moon delegates to ",[19,508,509],{},[22,510,96],{"href":95}," and respects ",[42,513,514],{},"pnpm-workspace.yaml",[42,516,517],{},"workspace:*"," links.",[72,520,521,522,526,527,56],{},"For Python, Moon delegates to ",[19,523,524],{},[22,525,83],{"href":82}," and executes commands inside hermetic virtual environments via ",[42,528,529],{},"uv run",[72,531,532,533,56],{},"For Rust, Moon delegates to ",[42,534,114],{},[58,536],{},[61,538,540],{"id":539},"_5-head-to-head-comparison-moon-vs-turborepo-vs-nx","5. Head-to-Head Comparison: Moon vs. Turborepo vs. Nx",[542,543,544,564],"table",{},[545,546,547],"thead",{},[548,549,550,555,558,561],"tr",{},[551,552,554],"th",{"align":553},"left","Evaluation Criterion",[551,556,557],{"align":553},"Moon (Polyglot Front-Runner)",[551,559,560],{"align":553},"Turborepo (TS Specialist)",[551,562,563],{"align":553},"Nx (Enterprise Heavyweight)",[565,566,567,599,617,634,652,674,690],"tbody",{},[548,568,569,575,581,591],{},[570,571,572],"td",{"align":553},[19,573,574],{},"Status on Radar",[570,576,577,578],{"align":553},"✅ ",[19,579,580],{},"Adopted \u002F Front-Runner",[570,582,577,583,586,587,590],{"align":553},[19,584,585],{},"Adopted for pure TS"," (",[22,588,589],{"href":31},"Report",")",[570,592,593,594,586,597,590],{"align":553},"⚠️ ",[19,595,596],{},"Trial \u002F Assess",[22,598,589],{"href":38},[548,600,601,606,611,614],{},[570,602,603],{"align":553},[19,604,605],{},"Native Polyglot Support",[570,607,608],{"align":553},[19,609,610],{},"Node, Python, Rust, Go (Built-in)",[570,612,613],{"align":553},"❌ JS\u002FTS only (npm hacks)",[570,615,616],{"align":553},"⚠️ Via community plugins",[548,618,619,624,629,632],{},[570,620,621],{"align":553},[19,622,623],{},"Toolchain Management",[570,625,626],{"align":553},[19,627,628],{},"Yes (via proto)",[570,630,631],{"align":553},"❌ No (Host-managed)",[570,633,631],{"align":553},[548,635,636,641,646,649],{},[570,637,638],{"align":553},[19,639,640],{},"Cross-Language Task DAGs",[570,642,643],{"align":553},[19,644,645],{},"Native first-class",[570,647,648],{"align":553},"❌ None",[570,650,651],{"align":553},"⚠️ Basic",[548,653,654,659,665,671],{},[570,655,656],{"align":553},[19,657,658],{},"Configuration Model",[570,660,661,662,590],{"align":553},"Clean YAML (",[42,663,664],{},"moon.yml",[570,666,667,668,590],{"align":553},"Minimal JSON (",[42,669,670],{},"turbo.json",[570,672,673],{"align":553},"Verbose JSON \u002F Generators",[548,675,676,681,684,687],{},[570,677,678],{"align":553},[19,679,680],{},"Remote Caching",[570,682,683],{"align":553},"Local, S3, Moonbase",[570,685,686],{"align":553},"Local, Vercel, S3",[570,688,689],{"align":553},"Local, Nx Cloud",[548,691,692,697,702,707],{},[570,693,694],{"align":553},[19,695,696],{},"Best Architectural Fit",[570,698,699],{"align":553},[19,700,701],{},"Polyglot Python + TS + Rust",[570,703,704],{"align":553},[19,705,706],{},"Pure TypeScript repositories",[570,708,709],{"align":553},"Massive enterprise JS\u002FTS suites",[58,711],{},[61,713,715],{"id":714},"_6-radar-verdict-architecture-takeaway","6. Radar Verdict & Architecture Takeaway",[15,717,718,719,723],{},"If your monorepo contains exclusively TypeScript applications, ",[19,720,721],{},[22,722,32],{"href":31}," provides the lowest configuration friction.",[15,725,726,727,732,733,736,737,740],{},"However, the moment your architecture incorporates ",[19,728,729,730,590],{},"Python (",[22,731,83],{"href":82}," microservices, agentic AI pipelines, or ",[19,734,735],{},"Rust"," modules alongside your web frontend, ",[19,738,739],{},"Moon is the undisputed architectural choice",". It provides the first coherent, unified engineering system for multi-language monorepos.",[15,742,743],{},"Explore our connected toolchain reports:",[69,745,746,755,762,769,777,785],{},[72,747,748,754],{},[19,749,750,753],{},[22,751,752],{"href":24},"Monorepo Architecture (Adopted)",":"," Complete strategy breakdown including our interactive DAG visualizer.",[72,756,757,761],{},[19,758,759,753],{},[22,760,32],{"href":31}," Task runner and computation cache for pure TypeScript monorepos.",[72,763,764,768],{},[19,765,766,753],{},[22,767,39],{"href":38}," Enterprise monorepo build system with deep code generation.",[72,770,771,776],{},[19,772,773,753],{},[22,774,775],{"href":82},"uv (Adopted)"," The high-speed Python package manager orchestrated by Moon.",[72,778,779,784],{},[19,780,781,753],{},[22,782,783],{"href":95},"pnpm (Adopted)"," The disk-efficient package manager orchestrated by Moon for Node\u002FTS.",[72,786,787,793],{},[19,788,789,753],{},[22,790,792],{"href":791},"\u002Fblog\u002Fpolyrepo","Polyrepo (Rejected)"," Why multi-repo architectures fail compared to orchestrated monorepos.",[795,796,797],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":156,"searchDepth":170,"depth":170,"links":799},[800,801,805,808,809,810],{"id":63,"depth":170,"text":64},{"id":137,"depth":170,"text":802,"children":803},"2. Superpower #1: Hermetic Toolchain Management via proto",[804],{"id":296,"depth":181,"text":297},{"id":330,"depth":170,"text":331,"children":806},[807],{"id":427,"depth":181,"text":428},{"id":485,"depth":170,"text":486},{"id":539,"depth":170,"text":540},{"id":714,"depth":170,"text":715},null,"2026-08-08","adopt","The clear front-runner for polyglot monorepos mixing Python (uv), TypeScript (pnpm), and Rust (cargo). Hermetic toolchain management via proto, cross-language task DAGs, and distributed caching solve the polyglot coordination problem without awkward npm-wrapping hacks.","Polyglot monorepo build system and task runner with native multi-runtime toolchain management, evaluated for Python, TypeScript, and Rust architectures.","md","https:\u002F\u002Fmoonrepo.dev\u002F",{},"\u002Fradar\u002Fmoon",[821],{"category":822,"subCategory":823},"tools","monorepo_tooling",{"title":5,"description":815},"trial","radar\u002Fmoon",[449,828,829,830,234,831,263,832],"moonrepo","monorepo","build-tools","typescript","devops","_blank","tech_report","492sBUdOco1rL5qzou5IUCbvaABDtzbCFWAjVb0dGFE",1790263542849]