Appearance
The flow canvas
The flow canvas is where you build an automation: drop nodes, wire their ports together, and configure each one in the inspector. This page is a tour of the editing surface.
Adding nodes
Open a flow file and you get an infinite canvas. Add a node from the node menu and it appears as a box you can drag anywhere. Every node shows its name, a small handle for each input port on one side, and a handle for each output port on the other.
You'll almost always start with a Start node and finish with an End node — the two ends of every runnable flow. In between go the working nodes: If, Switch, ForEach, Set, Template, HTTP, Email, MongoDB. Browse them all in the Node reference.
INFO
📸 Screenshot — the flow canvas with a Start node, an If node, and an End node placed but not yet wired.
Wiring ports
A connection is a wire from one node's output port to the next node's input port. Drag from an output handle to an input handle to create one. The wire is directional — it says "after this port, go here".
- Nodes that always continue expose a single next output.
- If exposes
trueandfalse; Switch exposes one output per case plusdefault; ForEach exposesloop(the body) andnext(after the loop). - Every node also has an error output you can wire to a handler branch. Leave it unwired and failures surface as a run error instead. See Error handling.
You can wire more than one connection out of the same port; the engine follows all of them. A port with nothing connected simply ends that path.
TIP
As you wire, the trigger bar re-checks the flow. If it turns red, hover the issues chip to see what's wrong — a missing Start, a missing End, or a node that isn't connected to anything. See Testing & the trigger URL.
The inspector
Select a node and the inspector opens its configuration. What you see depends on the node:
- An If node asks for a condition.
- An HTTP node asks for a method, URL, headers, and body.
- An Email node asks for a recipient, subject, and body.
- A Set or Template node asks for a variable name and its source or template text.
Most text fields accept references to values produced earlier in the flow, plus ${env.X} and ${secrets.X} placeholders that resolve at run time. Those are explained in Data & references.
Configuration is stored with the node and applied when the flow runs on the server — the inspector never executes your node in the browser. Custom, workspace-authored nodes render their own settings inside a sandbox, so a third-party node can't reach into the rest of the editor.
INFO
📸 Screenshot — a node selected on the canvas with the inspector panel open showing its config fields.
The trigger bar
Running along the top of the canvas is the trigger bar. It is the flow's control strip:
| Element | What it tells you |
|---|---|
| Method chips | The HTTP methods this flow answers — one chip per Start node (GET, POST, …). "no Start node" if there are none. |
| Endpoint path | The public URL this flow is callable at, e.g. /api/run/<project>/<flow-name>. |
| Validity chip | Wiring OK in green, or a count of issues you can hover to read. |
| Test run button | The green Test run (▶) button — opens the run inspector to run the flow with inputs you supply and see it node by node. See Testing & the trigger URL. |
| Run history button | The Run history (clock) button — opens the run-history dialog for this project. See Run history. |
| Schedule button | Set the flow to run on a cron schedule as well as on request. |
| Copy button | Copies the full trigger URL to your clipboard. |
The path is derived from your project and the flow's file name, so renaming the file changes the URL.
See also
Starter templates
An empty flow canvas offers ready-made starting points — valid wiring with placeholder config you then fill in:
| Template | What it builds |
|---|---|
| Webhook → respond | Receive a POST, shape a value, return JSON |
| Call an API | Fetch from an external API and return its data |
| Branch on a value | Route to one of two responses |
| Notify by email | Send an email, then confirm |
| Save to a database | Insert into MongoDB, then confirm |
| Take a payment | Create a Stripe checkout session and redirect the visitor to it |
| Confirm a payment | Receive a signature-verified Stripe webhook and email a receipt |
| Log to a spreadsheet | Append each submission as a row in a Google Sheet |
| Ask a model | Send the input to Claude and return the reply |
| Query Postgres | Run a parameterised SQL query and return the rows |
Each carries ${secrets.NAME} placeholders rather than blank credential fields, so you're pointed at the vault instead of pasting a key inline.
You can also start a whole project as an automation — the New project dialog offers these alongside the page starters.