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 message on the bus, 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
Message Bus 1.0.8Message In, Message Out, Message Reply
OutputDebug, Catch

→ 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/Stop Pipeline
Execute once, nowExecute Pipeline
Trigger a single nodeExecute Pipeline
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 of the same project without wiring them into one graph.
Message bus 1.0.8Send by subject to any pipeline, screen or script that listens — and ask for a reply. Message In, Message Out, Message Reply.
VariablesShared key/value state readable and writable from any pipeline or script.
TagsThe most decoupled option — one pipeline writes an internal tag, another subscribes.

→ Message bus · Variables

Link or message bus? A Link joins two of your pipelines by node: the receiver names the sender, and nothing else can hear it. The bus joins anything to anything by subject: the sender does not know who listens, a screen's button or a script can send too, and a request gets an answer back. Reach for a Link for a fixed hand-off; reach for the bus when the receiver should be replaceable or the sender is not a pipeline.

A Link no longer crosses projects

Changed in 1.0.8 The project is now part of a Link's address. An ingress Link listening to an egress Link in another project stops receiving after the upgrade, without an error. Replace such a pair with Message Out (Send to: All projects) and Message In.

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
Whether a node's connection is upThe status line under the node — see below
Ad-hoc inspectionThe Debug node → the Debug panel

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

The connection status under a node New in 1.0.7​

Every node that names a connection — an Industrial I/O read, a SQL Query, a Telegram receiver — carries a small square and a few words under the card, saying whether that connection is up. Before, a node told you which connection it used and nothing about its state, so a pipeline full of nodes bound to a dead device looked exactly like one that was working. That is worst for a trigger node: one whose connection is down and one that simply has not been sent anything are both blank.

The two indicators answer different questions. The round badge in the node's corner is the last run — running, succeeded, failed. The square underneath is the connection behind it, and it changes whether or not the pipeline runs.

Changed in 1.0.8 The exception is a notification node — Send Email, Telegram, WhatsApp. Its line answers "is this node sending or receiving right now?", which has an answer only while the pipeline runs, so it is shown only then. On a stopped pipeline it kept reading receiving · 12 in from the bot's last state, which looked like the stopped node was still live. A database or device node keeps its line at design time: seeing that connection is down before you press Start is the point.

SquareCaptionMeans
GreenconnectedThe connection is up. Only this status ever says connected.
Greenreceiving · 12 in · 5 outUp and traffic is flowing — the counts are what prove the node has done something.
Greenconnected · waitingUp, and nothing has arrived yet.
Amberchecking…A check is in progress and has not answered.
AmberretryingLost, and reconnecting.
Yellowno recent dataNothing heard for longer than expected — not yet a failure, and deliberately not connected.
Orangebacking offFailing repeatedly, so attempts are paused for a while.
Rederror, or a specific failureFailed. Hover for the full message.
GreydisabledThe connection is switched off, and a node using it will fail.
Greynot checkedNobody has asked it anything yet — a new connection has not failed.

The caption is the glance; the full sentence is in the tooltip. For a Telegram bot the red case not polling is told apart from a plain error, because it has its own fix: enable the bot. 1.0.8 The captions token in use elsewhere and updates not arriving are gone — both fired on a healthy bot, during its own restart, and made it flicker between connected and failed. → Telegram status

The status is the same one the Connections list shows, and every node bound to one connection shares it, so a canvas with eighty nodes on four connections costs four subscriptions, not eighty.

Permissions​

ActionPermission
View pipelinesView Pipelines
CreateCreate Pipeline
EditEdit Pipeline
DeleteDelete Pipeline
Execute onceExecute Pipeline
Start/stopStart/Stop Pipeline
ExportExport Pipeline
ImportImport Pipeline
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