Library
ESM-only, dependency-free compiled JavaScript. Node.js 22+ on Linux and macOS.
Typed pipelines for Node.js. Define dependencies, preview execution, and inspect step results.
$ bunx tubeless plan ./examples/typed-import.ts --target normalize-rows --explain Pipeline import: plan (ok=true, dryRun=false, steps=2) - load-rows: run (required by normalize-rows for target normalize-rows) - Normalize Rows [normalize-rows]: run (target normalize-rows)
Build a pipeline with createSteps and definePipeline.
Preview the selected steps with plan(), then execute with
run() or runOrThrow(). The CLI uses the same pipeline definitions.
ESM-only, dependency-free compiled JavaScript. Node.js 22+ on Linux and macOS.
inspect, plan, graph, run, and ui. Bun 1.3.14+. npx tubeless relaunches through Bun.
Pipelines run in your Node.js process. No separate server is required.
Connect steps through their inputs and outputs. TypeScript checks the values passed between them, and Tubeless checks for missing dependencies, cycles, and duplicate IDs before execution.
import { createSteps, definePipeline, requireOutputs } from "tubeless";
interface ImportOptions {
lines: readonly string[];
}
const step = createSteps<ImportOptions>();
const load = step("load", {
run: (_inputs, context) => context.options.lines,
});
const normalize = step("normalize", {
dependsOn: [load],
run: ({ load: rows }) =>
rows.map((row) => row.trim().toLowerCase()).filter(Boolean),
});
export const ImportPipeline = definePipeline({
id: "import",
steps: [load, normalize],
targets: [normalize],
finalize: requireOutputs([normalize], ({ normalize }) => normalize),
}); plan() lists the steps selected for a target without
executing them. Export the dependency graph as Mermaid with
toMermaid().
flowchart LR
required optional input + failure gate
flowchart LR step0["build-artifact"] step1["validate-artifact"] step2["publish-artifact"] step0 --> step1 step0 --> step2 step1 -. optional input + failure gate .-> step2
run() returns step results, failures, and timings.
The terminal reporter displays progress during execution.
Run history can be stored in SQLite or exported as NDJSON.
Open recorded runs in your browser to inspect step timelines, logs, errors, and child pipelines. Register commands to preview and launch new runs.