Feature guide

Building automation with Logic Flows

Triggers, gates, branches and actions on a visual canvas — the layer that reacts to what changes instead of waiting to be pressed. This guide builds a working flow from three nodes, then covers the full palette.

Triggers Logic Actions Loop protection

01What Logic Flows are for

Conditional automation, built with nodes instead of code.

A panel button and a Command Sequence both do one thing: something presses them, and a fixed chain of commands runs. A Logic Flow is different — it reacts to a condition rather than a press, and it can branch: when this variable changes, and only if it now holds this value, do one of several different things. It is the layer that turns "I have to remember to do X when Y happens" into something Fantago does for you, every time, without anyone watching for it.

It does

React to change

A variable changing, a device going offline or online, a timer firing, a button press anywhere in the system, or an HTTP/TCP/UDP trigger from outside.

It does

Decide

AND/OR/NOT gates, If/Branch/Switch nodes, time windows, debounce — so the same trigger can lead to different outcomes depending on what else is true.

It does

Act on anything

Run a device command or sequence, set a variable, call an external HTTP API, send an email, style a button, notify the dashboard, write to the log.

It does not

Require code

The whole thing is built as connected nodes on a canvas. Nothing here is a script — though an HTTP Request node can call one if you have it.

02A first flow: alert when a device goes offline

Three nodes, wired together in the Logic Builder canvas — the example this guide keeps coming back to.

  1. Logic → New Flow. Name it, leave Enabled checked.
  2. Add a Device Status Trigger. Add node → Triggers → Device Status Trigger, then in its panel on the right: pick the device (your ATEM, a HyperDeck, anything with monitoring available) and set Fires when device → Goes OFFLINE.
  3. Add an If / Condition node. Add node → Logic → If. For this flow you do not strictly need it — the trigger already only fires on the transition you asked for — but it is where you would add a second condition, such as only alerting outside a maintenance window (see Time Window below).
  4. Add a Dashboard Notify and a Log node from Add node → Actions, and connect the If node's TRUE output to both — one output can feed more than one node. Write the notification title and message; enable Also write to Fantago log if you want the same event to also land in the permanent log without a separate Log node.
  5. Save Flow. Disable the device (or unplug it) to see the toast arrive on every open Fantago page within a few seconds.
📡 Device Status Trigger ATEM_MAIN · goes OFFLINE If / Condition status == "offline" TRUE FALSE 🔔 Dashboard Notify "ATEM_MAIN is offline" 📝 Log permanent record, ERROR level
The flow this section builds: a device going offline branches into a dashboard toast and a permanent log line.
Device Status Trigger node configuration panel
The Device Status Trigger node's own panel. ATEM devices report connection changes instantly; everything else is checked at the interval you set here, with a 2-fail/1-success debounce so one dropped ping does not raise a false alarm.
If / Condition node configuration panel showing up to 8 conditions
The If node: up to eight conditions, each comparing a variable against a literal or another variable. It keeps no state of its own, so it can sit anywhere in a chain and always evaluates against the values at that instant.

03The building blocks

Three palettes — Triggers, Logic and Actions — cover everything a flow can start from, decide on, or do.

Triggers — what starts a flow

NodeFires on
Trigger (variable)Any custom or system variable changing value
Compare VariablesTwo variables (or a variable and a literal) satisfying a comparison — re-evaluated on every change
TimerA recurring interval, cron-style schedule
Timer EventSTART / STOP / RESET / RESTART of a specific countdown or counter timer
ButtonA specific button being pressed, on a specific panel or Stream Deck key
Device StatusA device going online or offline
Flow StartThe moment this flow itself is triggered — the entry point for a flow meant to be called from another flow via Flow Control

Logic — deciding what happens next

NodeWhat it does
AND / OR / NOTCombine trigger conditions — only trigger nodes may feed a gate, so it always has something concrete to re-check
If / BranchUp to 8 conditions with a TRUE/FALSE (If) or per-condition (Branch) output
SwitchRoutes down one of several named outputs based on a variable's value, instead of a chain of Ifs
Debounce / WaitSuppress rapid repeats, or hold until a condition becomes true
Delay / Dynamic DelayPause before continuing — fixed, or computed from a variable
Repeat1–1000 iterations with an interval, each a fresh pass down its Loop output
Time WindowTrue only inside a time-of-day range — aware of ranges that cross midnight
RelayPasses a signal through unchanged — useful for tidying a busy canvas

Actions — what a flow actually does

NodeWhat it does
Command / SequenceSend a device command, or run an existing Command Sequence
Set Variable / Toggle / CounterWrite a value, flip a latch, increment or reset a counter
Math / Clamp-MapArithmetic, or rescale a value from one range to another
String Template / TransformBuild text from variables, or run operations like uppercase, trim, regex extract/replace, JSON extract
HTTP RequestCall an external API — Success/Error outputs, response and status land in variables, {var} templating in URL/headers/body
Flow ControlTrigger, enable or disable another flow (a self-trigger is blocked automatically)
StyleOverride a button or Stream Deck key's colour, label or blink at runtime — in memory, so a restart clears it unless the flow re-applies it on startup
Notify / LogA toast on every open dashboard page, and/or a permanent log line
Send Email / Random / Timer ActionSend mail through the configured SMTP account, pick a random value, or start/stop/reset a timer
ℹ
Every parametric text field across these nodes — a URL, a message, a command — accepts {variable_name} placeholders, resolved once when that node runs. This is different from the double-brace {{variable}} placeholders used in device command text, which stay live-bound on a panel and are resolved by the browser, not the flow engine.

04Guarding against runaway flows

A flow that reacts to a variable it also sets can trigger itself. Fantago catches that before it floods the system.

It is easy to build a chain where flow A sets a variable that triggers flow B, which sets a variable that triggers flow A again. Every flow has a built-in circuit breaker for exactly this: set Infinite loop detection (top of the flow editor) to a maximum execution count and a time window — the default is 5 executions in 1000 ms. Cross that limit and the flow disables itself and reports why, rather than spinning silently in the background.

ℹ
Loop detection covers manual triggers too — a Flow Control node starting another flow, or a REST/TCP/UDP trigger calling one from outside, both count toward the same limit. A self-trigger through Flow Control is blocked outright, regardless of the limit.

05Watching it run

A flow that fires silently is hard to trust. Fantago gives you three ways to see it working.

Live

Verbose engine logs

The checkbox at the top of the Logic Flows list prints every evaluation to the message log while you build and test — turn it off once a flow is proven.

Live

Dashboard toasts

A Notify node's message appears on every open Fantago page — Dashboard, Panel Viewer, Logic Builder — with a 🔔 bell keeping the last 50 (cleared on restart).

Permanent

The message log

A Log node, or "Also write to Fantago log" on a Notify node, leaves a permanent [FLOW] line — searchable the same way as SENT/RECEIVED device traffic.

06Frequently asked questions

Logic Flow vs. Command Sequence vs. panel button — which one?

A button runs when pressed. A Sequence runs a fixed list of commands, in order, when started — by a button, a schedule or a flow. A Logic Flow is the only one of the three that starts itself, based on a condition, and the only one that can branch.

Can a flow trigger another flow?

Yes, with a Flow Control node — trigger, enable or disable a target flow by name. Self-triggering is blocked to stop an immediate infinite loop; an indirect cycle (A→B→A) is caught by loop detection instead.

Do flows keep running if I close the Logic Builder tab?

Yes — flows run server-side, independent of any open browser tab. The builder is only where you design and watch them; closing it does not pause anything.

What happens to a Style override after a restart?

Runtime style overrides from a Style node live in memory and are cleared on restart. If a flow's appearance should survive a reboot, give it Run on startup so it re-applies itself.