IronFlow

The workflow is alive.

Lua in. Reliable execution out.

Build a flow

101 nodesCLI + API + webhooksMIT

  1. A webhook and CLI command start a flow.
  2. User and order requests run independently.
  3. Results join at a routing step.
  4. High-value, standard, and bulk branches run in parallel.
  5. A failed task retries before the flow stores its result.
Example run
users.fetch 142ms completeorders.fetch 184ms completeroute.segments 38ms completesend.email 273ms retry 2/3store.users 91ms complete

One language. One runtime. One visible path.

Define, run, and observe workflows

01

Define

Declare dependencies, retry policy, and outputs in readable Lua.

02

Run

Execute the same flow from a shell, an API request, or a named webhook.

03

Observe

Follow run and task lifecycle events without surrendering your infrastructure.

local flow = Flow.new("nightly_report")
flow:step("users", nodes.http_get({ url = users_url }))
flow:step("orders", nodes.http_get({ url = orders_url }))
flow:step("report", function(ctx)
    return build_report(ctx.users_data, ctx.orders_data)
end):depends_on("users", "orders")

The runtime does the hard part

Branch.
Retry.
Rejoin.

  1. 00:00.000Fetch usersComplete
  2. 00:00.000Fetch ordersComplete
  3. 00:00.184Generate reportRetry 2/3
  4. 00:02.301Store resultComplete

Independent work runs in parallel. Dependencies wait. Retry and timeout policy stays with the flow—not scattered through every task.

Built-in capability

101 nodes.
Zero drag.

HTTPTransformDocumentS3AIDatabaseMCPShell

Start where you are

One command.
The flow starts moving.

Run an example

ironflow run examples/00-showcase/nightly_report.lua