DEV Community

Atlas Whoff
Atlas Whoff

Posted on

Monorepo Tooling in 2025: Turborepo, Nx, and When to Split

Monorepo Tooling in 2025: Turborepo, Nx, and When to Split

Monorepos are back in fashion — and for good reason. When you have multiple packages that share code and deploy together, a well-configured monorepo beats managing separate repos.

Why Monorepos?

  • Shared code without npm publishing
  • Atomic commits across packages
  • Single CI/CD pipeline
  • Consistent tooling and dependency versions
  • Easier refactoring across package boundaries

Turborepo: Fast Builds via Caching

Turborepo's core value: never rebuild what hasn't changed.

npx create-turbo@latest my-monorepo
Enter fullscreen mode Exit fullscreen mode
// turbo.json
{
  "$schema": "https://turbo.build/schema.json",
  "tasks": {
    "build": {
      "dependsOn": ["^build"],  // Build deps first
      "outputs": [".next/**", "dist/**"]
    },
    "test": {
      "dependsOn": ["^build"],
      "inputs": ["src/**", "test/**"]
    },
    "lint": {
      "inputs": ["src/**", ".eslintrc*"]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode
// package.json (root)
{
  "workspaces": ["apps/*", "packages/*"],
  "scripts": {
    "build": "turbo build",
    "test": "turbo test",
    "dev": "turbo dev --parallel"
  }
}
Enter fullscreen mode Exit fullscreen mode

Remote caching (Vercel's cache or self-hosted) means CI skips unchanged packages — even across machines.

Nx: Full-Featured for Large Teams

Nx adds more than caching: code generation, dependency graph visualization, module boundaries enforcement:

npx create-nx-workspace@latest
Enter fullscreen mode Exit fullscreen mode
// nx.json
{
  "targetDefaults": {
    "build": { "cache": true },
    "test": { "cache": true }
  },
  "affected": {
    "defaultBase": "main"
  }
}
Enter fullscreen mode Exit fullscreen mode

Nx's killer feature for large teams: affected commands. Only test/build what changed:

nx affected:test  # Only runs tests for changed packages
nx affected:build # Only builds what's affected by the change
Enter fullscreen mode Exit fullscreen mode

Package Structure

my-monorepo/
  apps/
    web/          # Next.js frontend
    api/          # Express/Fastify backend
    mobile/       # React Native
  packages/
    ui/           # Shared component library
    types/        # Shared TypeScript types
    utils/        # Shared utilities
    config/       # Shared ESLint, TS configs
Enter fullscreen mode Exit fullscreen mode

Turborepo vs Nx

Turborepo Nx
Learning curve Low Higher
Build caching Excellent Excellent
Code generation No Yes
Dep graph viz Basic Full
Best for Startups, small teams Large orgs

When to Split into Separate Repos

Consider splitting when:

  • Teams have completely different deployment cadences
  • Security requirements mandate isolation
  • The monorepo build takes >10 minutes even with caching
  • Teams need to use different toolchains

For most SaaS products, a monorepo with Turborepo is the right call. The AI SaaS Starter Kit ships with a Turborepo setup for web + API + shared packages, so you start with proper monorepo structure from day one.

Top comments (0)