---
title: Feature comparison
---

import {
  DockerTable,
  GeneratorTable,
  JavaScriptTable,
  OtherSystemsTable,
  ProjectsTable,
  TasksTable,
  TaskRunnerTable,
  ToolchainTable,
  WorkspaceTable,
} from '@site/src/components/ComparisonTable';
import ComparisonColumn from '@site/src/components/ComparisonColumn';

The following comparisons are _not_ an exhaustive list of features, and may be inaccurate or out of
date, but represent a good starting point for investigation. If something is not correct, please
[create an issue](https://github.com/moonrepo/moon/issues) or
[submit a patch](https://github.com/moonrepo/moon/blob/master/website/src/components/ComparisonTable.tsx).

Before diving into our comparisons below, we highly suggest reading
[monorepo.tools](https://monorepo.tools/) for a deeper insight into monorepos and available tooling.
It's a great resource for learning about the current state of things and the ecosystem.

:::info

Looking to migrate from Nx or Turborepo to moon? Use our
[`moon ext migrate-nx`](./guides/extensions#migrate-nx) or
[`moon ext migrate-turborepo`](./guides/extensions#migrate-turborepo) commands for a (somewhat)
seamless migration!

:::

## Unique features

Although moon is still in its infancy, we provide an array of powerful features that other frontend
centric task runners do not, such as...

- **[Integrated toolchain](./concepts/toolchain)** - moon manages its own version of programming
  languages and dependency managers behind the scenes, so that every task is executed with the
  _exact same version_, across _all machines_.
- **[Task inheritance](./concepts/task-inheritance)** - Instead of defining the same tasks (lint,
  test, etc) over and over again for _every_ project in the monorepo, moon supports a task
  inheritance model where it only needs to be defined once at the top-level. Projects can then merge
  with, exclude, or override if need be.
- **[Continuous integration](./guides/ci)** - By default, all moon tasks will run in CI, as we want
  to encourage every facet of a project or repository to be continually tested and verified. This
  can be turned off on a per-task basis.

Curious to learn more? Check out the "[Why use moon?](.)" or "[Features](.)" sections for more
information, or these wonderful articles provided by the community:

- [A review of moon + Packemon](https://azu.github.io/slide/2022/moa/moon-packemon.html) by
  [azu](https://twitter.com/azu_re)
- [Improve repo management with moon](https://blog.logrocket.com/improve-repo-management-moon/) by
  [James Sinkala](https://jamesinkala.com/)

## Comparison

### Turborepo

At a high-level, Turborepo and moon seem very similar as they both claim to be task runners. They
both support incremental builds, content/smart hashing, local and remote caching<sup>1</sup>,
parallel execution, and everything else you'd expect from a task runner. But that's where the
similarities stop, because in the end, Turborepo is nothing more than a `package.json` scripts
orchestrator with a caching layer. While moon also supports this, it
[aims to be far more](#unique-features) with a heavy focus on the developer experience.

In the next section, we'll be talking about a few key areas that we deem important to consumers. If
you'd prefer a more granular comparison, jump down to the [comparison tables](#comparison-tables).

#### Configuration

<ComparisonColumn
left={
  <>

Turborepo only supports the Node.js ecosystem, so implicitly uses a conventions based approach. It
provides very little to no configuration for customizing Turborepo to your needs.

  </>
}
right={
  <>

moon is language agnostic, with initial support for Node.js and its ecosystem. Because of this, moon
provides a ton of configuration for customizing moon to your needs. It prefers a configuration over
conventions approach, as every repository is different.

  </>
}
/>

#### Projects

<ComparisonColumn
left={
  <>

Turborepo infers projects from `package.json` workspaces, and does not support non-JavaScript based
projects.

  </>
}
right={
  <>

moon requires projects to be defined in `.moon/workspace.*`, and supports any programming
language<sup>2</sup>.

  </>
}
/>

#### Tasks

<ComparisonColumn
left={
  <>

Turborepo requires `package.json` scripts to be defined for every project. This results in the same
scripts being repeated constantly.

  </>
}
right={
  <>

moon avoids this overhead by using [task inheritance](#unique-features). No more repetition.

  </>
}
/>

#### CI

<ComparisonColumn
left={
  <>

Each pipeline in `turbo.json` must be individually ran as a step in CI. Scripts not configured as
pipeline tasks are never ran.

  </>
}
right={
  <>

moon runs every task automatically using `moon ci`, which also supports parallelism/sharding.

  </>
}
/>

#### Long-term

<ComparisonColumn
left={
  <>

Turborepo is in the process of being rewritten in Rust, with its codebase being shared and coupled
with the new Turbopack library, a Rust based bundler.

Outside of this, there are no publicly available plans for Turborepo's future.

  </>
}
right={
  <>

moon plans to be so much more than a task runner, with one such facet being a repository management
tool. This includes code ownership, dependency management and auditing, repository linting, in-repo
secrets, and anything else we deem viable.

We also plan to support additional languages as first-class citizens within our toolchain.

  </>
}
/>

<small>

1. Turborepo remote caching is powered by Vercel. moon provides its own paid service.

2. moon projects may run commands for any language, but not all languages are supported in the
   toolchain.

</small>

### Lerna

Lerna was a fantastic tool that helped the JavaScript ecosystem grow and excelled at package
versioning and publishing (and still does), but it offered a very rudimentary task runner. While
Lerna was able to run scripts in parallel, it wasn't the most efficient, as it did not support
caching, hashing, or performant scheduling.

However, the reason Lerna is not compared in-depth, is that Lerna was unowned and unmaintained for
quite some time, and has recently fallen under the Nx umbrella. Lerna is basically Nx lite now.

## Comparison tables

<table>
  <tr>
    <td>🟩 Supported</td>
    <td>🟨 Partially supported</td>
    <td>🟦 Similarly supported</td>
    <td>🟥 Not supported</td>
  </tr>
</table>

### Workspace

<WorkspaceTable />

### Toolchain

<ToolchainTable />

### Projects

<ProjectsTable />

### Tasks

<TasksTable />

### Task runner

<TaskRunnerTable />

### Generator

<GeneratorTable />

### Other systems

<OtherSystemsTable />

### JavaScript ecosystem

<JavaScriptTable />

### Docker integration

<DockerTable />
