The Breaking Points
You know it's time to switch when Turborepo stops being the solution and becomes the problem.
JavaScript-Only Support Will Fuck You Over
Got a Go microservice? Python data pipeline? Rust library? Congratulations, you now need wrapper scripts like it's fucking 2015. The GitHub issues are full of teams spending more time writing bash scripts than actual features. I watched our team spend 3 days wrapping a simple go build
command in package.json scripts just so Turborepo wouldn't shit itself.
We had a React app, a Node.js API, and one tiny Go service for image processing. Turborepo couldn't cache the Go builds, so every change triggered a complete Docker rebuild. Took us three weeks to realize the "fast" monorepo tool was slower than our old shell scripts. Nx handles polyglot projects without the scripting nightmare, Bazel was designed for this from day one.
Cache Corruption Becomes a Weekly Ritual
The cache works great until it doesn't. GitHub issue #4591 documents cache stall issues, but the real problem is cache corruption every few days. You'll memorize this command:
rm -rf node_modules/.cache/turbo
I watched our CI builds randomly fail with CACHE_CORRUPTION
errors at least twice a week. The "solution" in their GitHub issues? Delete the cache and rebuild everything from scratch. When your build system's most-used command is rm -rf .turbo
, maybe it's time to admit the cache is fundamentally broken. Last month we had builds failing with Error: unable to verify the first certificate
because their cache SSL handling is also fucked. Nx remote cache fails maybe once a month, Bazel's remote cache actually works reliably.
Vercel Vendor Lock-in (Update: They Fixed the Pricing, Broke Everything Else)
Remote caching used to cost $20/month per developer until Vercel made it free in December 2024. Cool, now the financial argument for leaving is gone, but the technical problems got worse. Deploy anywhere else and you still lose half the optimizations, plus the cache randomly fails for reasons they won't explain.
Set up your own S3 bucket and discover Turborepo's remote caching configuration is still intentionally obtuse. GitHub discussions show the hoops you jump through just to get basic S3 caching working. Meanwhile, Bazel works with any S3-compatible storage out of the box without the configuration nightmare.
What Actually Works When You Escape
Nx: The Reasonable Migration Path
Nx is what Turborepo should have been. Same task-running concepts, but with actual polyglot support, working cache, and migration tools that don't suck.
The migration took our team two weeks instead of the three months we budgeted. Nx automatically converts your turbo.json
to their format. Most importantly, when the cache breaks, it actually tells you why instead of silently corrupting.
Bazel: For When You Need It to Actually Work
Bazel is the nuclear option - complex as hell but unfuckwithably reliable. If Google uses it to build Chrome, it can probably handle your monorepo. The learning curve is brutal, but the builds are fast and the cache never corrupts.
BUILD files are a pain to maintain, but at least they're explicit about dependencies. No more mystery cache misses because someone forgot to declare a dependency. The migration guide walks you through converting from npm scripts.
Rush: Microsoft's Enterprise Answer
Rush is overkill for most teams but perfect if you need enterprise governance. Version management, policy enforcement, and pnpm workspace integration that actually works.
The configuration is complex, but at least it's documented. Unlike Turborepo's "figure it out yourself" approach to anything beyond basic caching. Rush policies can prevent the monorepo anti-patterns that break caching in the first place.
Pants: The Polyglot Alternative That Doesn't Suck
Pants handles Python, Java, Go, and JavaScript without wrapper scripts or cache corruption. The configuration is simpler than Bazel but more powerful than Turborepo.
Started by ex-Twitter engineers who were tired of maintaining thousands of BUILD files. Less magic than Nx, more reliable than Turborepo, easier than Bazel. Check out this Python monorepo example to see how it handles mixed codebases.
The choice depends on your pain tolerance and requirements. Turborepo is fine for simple JavaScript projects until it breaks. Everything else handles complexity better, with varying degrees of setup pain.