Skip to main content

Nadle

Gradle-inspired. TypeScript-first. Built for speed.

Simple yet powerful

Define tasks with clear dependencies and let Nadle handle scheduling, parallelism, and caching.

  • Type-safe tasks with full IntelliSense
  • DAG-based parallel scheduling
  • Built-in caching for incremental builds
nadle.config.ts
import { tasks, ExecTask, Inputs, Outputs } from "nadle";

tasks.register("compile", ExecTask, {
  command: "tsc",
  args: ["--build"]
}).config({
  inputs: [Inputs.files("src/**/*.ts", "tsconfig.json")],
  outputs: [Outputs.dirs("lib")],
  description: "Compile TypeScript sources"
});

tasks.register("test", ExecTask, {
  command: "vitest",
  args: ["run"]
}).config({
  dependsOn: ["compile"],
  description: "Run test suite"
});

tasks.register("build").config({
  dependsOn: ["compile", "test"]
});

Built for developer experience

Three pillars that make Nadle different from every other task runner.

Type Safety

Catch errors before they happen

Define custom task types with generics. Get full IntelliSense for task options and catch configuration errors at compile time. TypeScript isn't bolted on — it's the foundation.

deploy.ts
import { tasks, defineTask } from "nadle";

interface DeployOptions {
  target: "staging" | "production";
  dryRun: boolean;
}

const DeployTask = defineTask<DeployOptions>({
  run: async ({ options, context }) => {
    context.logger.info(`Deploying to ${options.target}...`);
  }
});

tasks.register("deploy", DeployTask, {
  target: "staging",
  dryRun: true
});
Parallelism

Maximum throughput, zero wasted time

Nadle builds a dependency graph and runs independent tasks in parallel using worker threads. Watch your build pipeline light up.

Terminal
$ nadle build

  ● lint        running
  ● compile     running
  ○ test        waiting → compile
  ○ bundle      waiting → compile

  ✓ lint        done  1.2s
  ✓ compile     done  3.4s
  ● test        running
  ● bundle      running
Caching

Only rebuild what changed

Declare inputs and outputs for any task. Nadle fingerprints them and skips tasks when nothing has changed. Fast incremental builds out of the box.

nadle.config.ts
import { tasks, ExecTask, Inputs, Outputs } from "nadle";

tasks.register("compile", ExecTask, {
  command: "tsc",
  args: ["--build"]
}).config({
  inputs: [Inputs.files("src/**/*.ts", "tsconfig.json")],
  outputs: [Outputs.dirs("lib")]
});
// Unchanged inputs? Task is skipped automatically.

Everything you need

Batteries included, no bloat. Every feature earns its place.

Smart CLI

Abbreviation matching, autocorrection, dry run, and summary mode. Run tasks with minimal typing.

Real-Time Progress

Interactive footer shows scheduled, running, and completed tasks as they execute.

Monorepo-Native

First-class workspace support. Run tasks across packages with dependency awareness.

Built-in Tasks

ExecTask, PnpmTask, CopyTask, DeleteTask. Common operations ready out of the box.

Modern Architecture

Pure ESM, Node.js 22+, worker thread isolation. Zero legacy compromises.

Zero Config

Works immediately with sensible defaults. A single nadle.config.ts is all you need.

Nadle Builds Itself

We use Nadle to build, test, and release Nadle. A real-world task graph with caching, parallel execution, and monorepo orchestration.

View nadle.config.ts

Ready to get started?

Install Nadle and run your first task in under 2 minutes.

Get Started