An expression puts a value from earlier in the run into a field: {{ nodes.collect.output.items }}. Expressions are path lookups with pipe helpers. Nothing is evaluated as code, so a field can't run arbitrary JavaScript.
Roots
| Root | Gives | Example |
|---|---|---|
item | The item the node runs for (its input) | {{ item.url }} |
file.<key> | One of that item's files: the reference, or .name Β· .mime Β· .size Β· .extension | {{ file.screenshot.name }} |
index | That item's position among the node's input items | {{ index }} |
input.items / input.count | Every input item / how many | {{ input.count }} |
nodes.<id>.output | An earlier node's item linked to this one (the one it came from), else its first | {{ nodes.loop.output.item.url }} |
nodes.<id>.items / .first / .last / .count | All of that node's items / its first / last / how many | {{ nodes.collect.count }} |
run.id / run.dry | This run's id / whether it's a test run | {{ run.dry }} |
ai.<name> | Left as written: in an AI agent's node and HTTP tools it marks what the model fills | {{ ai.city }} |
run.resume | This run's resume URL: a call to it answers a Wait for a call (add ?answer=approve for approve links) | {{ run.resume }} |
flow.id / flow.name | This flow | {{ flow.name }} |
vars.<name> | A variable from Dataset βΊ Variables | {{ vars.signature }} |
option.<key> | One of the flow's : the campaign's value, else its default (dotted keys nest) | {{ option.account.x }}, {{ option.author.rule }} |
now | The current time, ISO 8601 (UTC) | {{ now }} β 2026-10-28T06:10:21.000Z |
today | Today's date (UTC) | {{ today }} β 2026-10-28 |
A node runs once per input item (most nodes), so item and the linked nodes.<id>.output follow the item it's on: after a Merge or a node that sends several items, each step reads its own. The editor's preview uses the first item.
Paths use dots; list items by index with a dot or brackets: picks.0.id or picks[0].id.
Whole value or text
- A field that is exactly one expression keeps the value's type:
{{ nodes.collect.output.items }}is the array itself. - An expression inside text becomes text:
Reply to {{ nodes.loop.output.item.url }} with this?. Objects and arrays turn into JSON there.
Typing {{ (or Insert value) lists earlier nodes' fields, the flow's Options, then the helpers.
Helpers
Pipe a value through helpers with |. Arguments follow a :, comma separated; quote text with "β¦".
{{ nodes.health.output.missing | join:", " }}
{{ nodes.write.output.text | truncate:200 }}
{{ nodes.input.output.keyword | trim | lower }}
{{ nodes.collect.output.items | length }}
{{ now | date:"YYYY-MM-DD HH:mm","Asia/Jakarta" }}
| Helper | Does | Example β result |
|---|---|---|
upper | Upper case | "hi" | upper β HI |
lower | Lower case | "Hi" | lower β hi |
trim | Trim spaces | " hi " | trim β hi |
capitalize | First letter upper case | "hello" | capitalize β Hello |
default:"x" | x when empty, null or missing | missing | default:"n/a" β n/a |
json | JSON text | {a:1} | json β {"a":1} |
number | To a number | "42" | number β 42 |
text | To text | 42 | text β "42" |
length | List or text length | [1,2,3] | length β 3 |
first / last | First / last item (or character) | [1,2,3] | last β 3 |
join:", " | List to text | ["a","b"] | join:" / " β a / b |
split:"," | Text to list | "a,b" | split:"," β ["a","b"] |
slice:0,10 | Part of a list or text | "abcdef" | slice:1,3 β bc |
truncate:100 | Cut with β¦ | "abcdef" | truncate:3 β abcβ¦ |
replace:"a","b" | Replace every match | "a-a" | replace:"-","+" β a+a |
round:2 | Round to decimals | 3.14159 | round:2 β 3.14 |
date:"FORMAT","TZ" | Format a date in a timezone | now | date:"DD/MM HH:mm","Asia/Jakarta" |
add:5, subtract:5, multiply:2, divide:2, mod:3 | Arithmetic | "7" | multiply:2 β 14 |
abs, , , |
date tokens: YYYY, MM, DD, HH, mm, ss. Numbers under 10ΒΉΒ² are read as unix seconds. The timezone defaults to UTC.
An unknown helper fails the step with Unknown template helper "<name>".
Where it runs
The engine's agent resolves expressions when a node starts (engine/agent/patchright). The editor's preview and picker use the same rules (src/lib/flow/expression), so what you preview is what runs. Keep both in step when adding a helper.
Examples
Set a reply from a loop item and an AI output:
{
"instructions": "Reply to this post as a friendly, knowledgeable person. Angle: {{ nodes.loop.output.item.angle }}",
"context": "@{{ nodes.loop.output.item.author }}: {{ nodes.loop.output.item.text }}"
}
Pass a whole list to a node:
{ "list": "{{ nodes.choose.output.picks }}", "max": 3 }
Use a variable with a fallback:
{ "message": "{{ vars.greeting | default:\"Hello\" }}, {{ nodes.input.output.name | capitalize }}!" }
FAQ
Can I do math or conditions inside {{ }}?
No. Use an If, Switch, Set or Date & Time node, or a .
What happens when the path doesn't exist?
The value is empty (null as a whole value, empty text inside text). Add | default:"β¦" for a fallback.