01
Define
Declare dependencies, retry policy, and outputs in readable Lua.
One language. One runtime. One visible path.
01
Declare dependencies, retry policy, and outputs in readable Lua.
02
Execute the same flow from a shell, an API request, or a named webhook.
03
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
Independent work runs in parallel. Dependencies wait. Retry and timeout policy stays with the flow—not scattered through every task.
Built-in capability
When the flow needs judgment
Some steps can't be encoded: research, interpretation, a decision someone must stand behind. IronCrew — IronFlow's sibling runtime, the same single-binary Rust + Lua shape — runs specialist agent crews with human questions and fail-closed approval gates. The flow hands over one step, gets a structured decision back over plain HTTP, and keeps moving.
Start where you are
Run an example
ironflow run examples/00-showcase/nightly_report.lua