logic & data flow Branches are sockets, not guesses.
Every decision, loop and fan-out is a socket you can see. A route follows one path at a time, nothing is inferred from where a block sits, and cycles are rejected when you save.
Read the docsswitch
One of many, first match wins.
Wire several blocks to a Switch's case socket. In value mode it computes one value and compares each case with ===; in condition mode each case has its own check. Order is yours.
loops & parallel work
A loop body is a chain on a socket.
Some sockets don't continue the flow — they own a chain. For and For Each repeat theirs; Orchestrator runs several of them at the same time and waits for all.
- onError: throw — one failed branch fails the Orchestrator.
- onError: settle — failed branches return their error; the rest carry on.
- A Response inside a branch ends the whole route with that answer.
data flow
Data rides the wires.
The value leaving a block is the input of the next. Reshape it with a Transformer, read request values anywhere, and save what you'll need later.
- input
- the previous block's output
- outputs.name
- what a block saved for later
- route params
- path, query, headers, cookies, body — anywhere
- App Config
- secrets and settings, chosen by name
rules the editor enforces
Readable by construction.
-
No cycles
An edge back to an earlier block is rejected at save. Repetition belongs in a loop block.
-
One wire per plain socket
Only orchestrate and case may carry more than one wire, so a second wire is never a hidden parallel branch.
-
Position is layout only
Moving a block never changes behaviour. The edges are the program.
-
Validation before blocks
Body, query and path params are checked against the route's schemas before the first block runs.