Skip to content

Nodes and Edges

Nodes and edges are the building blocks of flows. Understanding how to work with them effectively is key to building powerful automations.

Nodes

A node is an instance of a component placed on the flow canvas. Each node performs a specific operation.

Node Anatomy

              ⚙️ Settings Port
              |
    +---------+---------+
    |                   |
📥 -+   Component Name  +- 📤
    |                   |
    +---------+---------+
              |
              ⚠️ Error Port

Adding Nodes

From Palette:

  1. Open the node palette (left sidebar)
  2. Find the component you need
  3. Drag it onto the canvas

Via Search:

  1. Press / or click search
  2. Type component name
  3. Click to add at cursor

Keyboard Shortcut:

  1. Press N to open quick-add
  2. Type to filter
  3. Enter to add

Configuring Nodes

Click a node to select it, then use the properties panel:

  1. Settings Port: Core configuration
  2. Input Ports: Default input values
  3. Output Ports: View output schema

Node States

Visual indicators show node status:

StateIndicatorMeaning
IdleGray outlineNot processing
ActiveBlue pulseProcessing message
SuccessGreen flashCompleted successfully
ErrorRed outlineError occurred
DisabledFadedNode is disabled

Renaming Nodes

  1. Double-click the node label
  2. Enter a descriptive name
  3. Press Enter to confirm

Good names describe what the node does:

  • "Validate Input" instead of "Modify"
  • "Route by Type" instead of "Router"

Disabling Nodes

Temporarily disable without deleting:

  1. Right-click the node
  2. Select "Disable"
  3. The node is bypassed during execution

Re-enable via the same menu.

Edges

Edges are connections between node ports. They define how data flows through your automation.

Creating Edges

  1. Hover over a source port (output)
  2. Click and drag
  3. Release on a target port (input)
+----------+              +----------+
|  Node A  |-------------->  Node B  |
|          | output    input         |
+----------+              +----------+

Edge Appearance

StyleMeaning
Solid lineActive connection
Dashed lineOptional/conditional
Thick lineHigh volume
PulsingCurrently active

Edge Colors

ColorMeaning
BlueData flow
PurpleSettings
OrangeControl
RedError path

Editing Edges

Click an edge to:

  • Configure data mapping
  • Set conditions
  • View schema

Deleting Edges

  1. Click the edge to select
  2. Press Delete or Backspace

Or right-click and select "Delete".

Rerouting Edges

To change an edge's target:

  1. Click the edge
  2. Drag the endpoint
  3. Drop on new target port

Ports

Ports are the connection points on nodes.

Port Types

PositionTypePurpose
LeftInputReceive data
RightOutputEmit data
TopSettings/ControlConfiguration
BottomError/StatusErrors, status

Port Properties

Each port has:

  • Name: Unique identifier
  • Label: Display text
  • Schema: Expected data format
  • Required: Whether connection is needed

Viewing Port Schema

Click a port to see its schema:

json
{
  "type": "object",
  "properties": {
    "method": { "type": "string" },
    "path": { "type": "string" },
    "body": { "type": "object" }
  }
}

Port Compatibility

Not all ports can connect:

SourceTargetCompatible?
OutputInput✅ Yes
OutputSettings⚠️ Usually no
OutputOutput❌ No
InputInput❌ No

The editor shows green (compatible) or red (incompatible) when dragging.

Data Flow

Single Path

Simple linear flow:

A --> B --> C --> D

Data moves from A through each node to D.

Branching

One output to multiple inputs:

     +--> B
A ---+
     +--> C

Both B and C receive the same data from A.

Merging

Multiple inputs to one node:

A ---+
     +--> C
B ---+

C receives messages from both A and B (not merged, separate executions).

Conditional Paths

Router component creates conditional branches:

         +--> Success Handler
Input ---+
         +--> Error Handler

Only one path executes based on condition.

Edge Configuration

Data Mapping

Configure how data transforms between nodes:

yaml
# Simple pass-through
data: "{{$}}"

# Select specific fields
userId: "{{$.user.id}}"
email: "{{$.user.email}}"

# Transform data
fullName: "{{$.firstName}} {{$.lastName}}"
timestamp: "{{now()}}"

Static Values

Set constant values:

yaml
environment: "production"
version: "1.0.0"
enabled: true

Mixed Values

Combine static and dynamic:

yaml
message: "User {{$.userName}} logged in"
metadata:
  source: "login-flow"
  userId: "{{$.userId}}"

Working with Complex Flows

Organizing Nodes

Keep flows readable:

✅ Good Layout:
+---+     +---+     +---+
| A |---->| B |---->| C |
+---+     +---+     +---+

❌ Messy Layout:
+---+
| A |------+
+---+      |     +---+
     +---+ +---->| C |
     | B |-------+
     +---+

Using Comments

Add comment nodes to document:

+-------------------------------------+
| 💡 This section validates input     |
|    before processing                |
+-------------------------------------+
     |
     v
+----------+     +----------+
| Validate |---->| Process  |
+----------+     +----------+

Grouping Nodes

Visually group related nodes:

+---------------------------------+
| Validation Section              |
|  +---+    +---+    +---+       |
|  | A |--->| B |--->| C |       |
|  +---+    +---+    +---+       |
+---------------------------------+
         |
         v
+---------------------------------+
| Processing Section              |
|  ...                            |
+---------------------------------+

Best Practices

1. Name Everything

Give descriptive names to nodes:

  • What does this node do?
  • What data does it handle?

2. Keep Edges Short

Minimize crossing edges:

  • Rearrange nodes for clarity
  • Use left-to-right flow
  • Group related nodes

3. Document Complex Mappings

Add comments in edge configuration:

yaml
# Extract user info for notification
userId: "{{$.data.user.id}}"
email: "{{$.data.user.email}}"
# Format timestamp for display
timestamp: "{{RFC3339($.createdAt)}}"

4. Validate Connections

Before deploying:

  • Check all required ports are connected
  • Verify schemas match
  • Test with sample data

5. Handle All Paths

Ensure all execution paths complete:

  • Connect error ports
  • Add fallback handlers
  • Don't leave dangling outputs

Next Steps

Build flow-based applications on Kubernetes