Skip to main content
Version: Next

Pipelines

A pipeline is a directed graph of nodes that moves and transforms data. Where the namespace answers "what is this value?", a pipeline answers "what should happen to it?"

A pipeline of five nodes: an Inject trigger every 60 seconds into an Industrial I/O read of 8 tags, into a Python node computing OEE, which fans out to a SQL insert and a Debug node.A pipeline of five nodes: an Inject trigger every 60 seconds into an Industrial I/O read of 8 tags, into a Python node computing OEE, which fans out to a SQL insert and a Debug node.
One trigger, one read, one calculation, two destinations.

When to use a pipeline

SituationUse
Show a live value on a screenA binding — no pipeline needed
React to a button press on a screenAn event action
Move data on a schedule or an event, reliablyA pipeline
Transform, enrich, aggregate before storingA pipeline
Expose an HTTP endpoint other systems callA pipeline (REST ingress)
Bridge one protocol to anotherA pipeline, or a second binding for simple cases
Server-side logic invoked from a screenA Gateway script

The distinguishing property of a pipeline is reliability: writes it performs are covered by store-and-forward — buffered on outage, replayed in order, quarantined on permanent failure. A script write is immediate and fails to its caller.

Anatomy

ConceptMeaning
NodeOne step. Has a type, a configuration, optional code, and input/output ports.
Connection (wire)Passes a message from one node's output to another's input.
MessageThe envelope travelling the graph: a payload plus metadata and context.
TriggerWhat starts execution — a schedule, an inbound HTTP request, a tag change, a manual run.
ExecutionOne traversal of the graph, logged and inspectable.

The message

Every node receives a message and returns one. In scripts you see two things:

NameContents
payloadThe primary data — what the previous node produced.
messageThe full envelope: payload plus metadata, correlation identifiers and context.
def transform(payload, message):
# payload — the data
# message — the envelope, including where it came from
return {"value": payload["value"] * 2}

Return the value you want the next node to receive.

Node categories

CategoryNodes
CommonInject, Link, RBE (Filter), Switch, Timer
RealtimeIndustrial I/O, Alarm
DatasourceSQL Query, MongoDB, QuestDB
TransformPython Script, Batch Transform, Array Iterator, Join
AIAI
NotificationSend Email, Telegram, WhatsApp, On-Call Roster
APIREST API, HTTP Response
OutputDebug

Node reference for every node's configuration.

Execution model

  • Execution is graph-driven, not line-by-line: a node runs when a message arrives on its input.
  • A node with several outbound wires fans out — every downstream branch receives the message.
  • Switch is the exception: it has one output per rule, and a message leaves by the outputs whose rules matched. A branch that did not fire is skipped, and the skip cascades.
  • Array Iterator splits an array into one message per item; Join collects them back.
  • Batch Transform processes items of a collection in parallel.
  • Timer is the only node that defers. It never blocks the graph: it hands a deadline to the runtime and returns, and the run that fires later is an independent one — which is how a repeating timer works in a graph that forbids cycles.
  • Errors are logged against the execution, and the branch stops. Other branches continue.

Execution and triggering

Pipeline lifecycle

StateMeaning
StoppedNot listening, not scheduled.
RunningTriggers are armed; the graph executes when they fire.
ErrorStarted but a node failed fatally; see the execution log.
ActionPermission
Start or stop a pipeline, or all of themStart and stop pipelines
Execute once, nowRun pipelines
Trigger a single nodeRun pipelines
See runtime stateauthenticated

A pipeline is also enabled/disabled as configuration. Disabling stops it and keeps it from being started by "start all" — the right way to shelve a pipeline without deleting it.

The canvas

ControlDoesShortcut
Undo / RedoStep back and forward through your edits⌘/Ctrl+Z · ⌘/Ctrl+Shift+Z
Zoom out / Zoom inCtrl/⌘ + scroll
The zoom percentageClick it to reset to 100%
Zoom to fitFrame the whole graph

New in 1.0.4 — the controls are on the canvas itself, and undo and redo grey out when there is nothing to step to, so the canvas says what is available rather than leaving you to try it.

Multi-touch pinch to zoom and two-finger pan work on a touch screen. New in 1.0.1

Editing safely

Pipelines are optimistically locked with a server-managed revision. Saving carries the revision you loaded; a concurrent save by someone else is rejected rather than silently overwriting. Two engineers editing the same pipeline get a conflict to resolve, not a lost afternoon.

Cross-pipeline communication

MechanismUse
Link nodesSend messages between pipelines without wiring them into one graph.
VariablesShared key/value state readable and writable from any pipeline or script.
TagsThe most decoupled option — one pipeline writes an internal tag, another subscribes.

Variables

Observability

WhatWhere
Per-execution logThe execution log panel (needs View execution logs)
Per-node resultsThe execution log panel, per node (needs View execution logs)
Live node statusNode badges on the canvas, pushed over the telemetry bus
Ad-hoc inspectionThe Debug node → the Debug panel

Clearing logs requires Clear execution logs; they are diagnostic data, not the audit journal.

Permissions

ActionPermission
View pipelinesView pipelines
CreateCreate pipelines
EditEdit pipelines
DeleteDelete pipelines
Execute onceRun pipelines
Start/stopStart and stop pipelines
ExportExport pipelines
ImportImport pipelines
View execution logsView execution logs
Clear execution logsClear execution logs

In this section

PageContents
Node referenceEvery node type and its configuration
Execution & triggeringHow and when a pipeline runs, and how to debug it
VariablesShared state across pipelines and scripts
REST endpointsPublishing HTTP APIs from a pipeline