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
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.
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.
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
});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.
$ nadle build ● lint running ● compile running ○ test waiting → compile ○ bundle waiting → compile ✓ lint done 1.2s ✓ compile done 3.4s ● test running ● bundle running
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.
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