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
Get a binary for Linux, macOS or Windows. Extract it, then save this workflow as hello.lua beside the executable. No Rust compiler or separate Lua installation needed.
Save as hello.lua
local flow = Flow.new("hello")
flow:step("greet", nodes.log({ message = "Hello from IronFlow!" }))
return flowOpen a terminal in that directory and run:
./ironflow run hello.luaOn Windows, use .\ironflow.exe run hello.lua.
You will see Hello from IronFlow! and a successful run.