Build a Workflow
The visual workflow builder lets you compose multi-step automations using 7 step types, connected as a directed acyclic graph (DAG). Workflows can be triggered manually or on a schedule.
Creating a workflow
Section titled “Creating a workflow”-
Navigate to Workflows — click Workflows in the sidebar, then click New Workflow
-
Name your workflow and add an optional description
-
Add steps by dragging from the step palette on the left into the canvas
-
Connect steps by dragging from a node’s output handle (right side) to another node’s input handle (left side)
-
Configure each step by clicking it to open the inspector panel on the right
-
Save with Ctrl/Cmd + S or click the Save button
Common step properties
Section titled “Common step properties”Every step shares these properties in the inspector panel, regardless of type.
| Property | Type | Default | Description |
|---|---|---|---|
| ID | Text (immutable) | Auto-generated | Lowercase alphanumeric + underscores, unique per workflow |
| Name | Text | Required | Display name, max 200 characters |
| Type | Badge (read-only) | — | Set when adding the step |
| Enabled | Toggle | On | Disable without deleting |
| Timeout (s) | Number | 300 | Max execution time |
| On Error | Dropdown | Fail | Fail (stop workflow), Continue (skip), Retry (with backoff), Fallback (jump to step) |
| Catch Step | Step picker | — | Error recovery step if this step fails |
| Depends On | Step picker | — | Steps that must complete first |
When On Error is set to Fallback, a Fallback Step picker appears to select the target step.
When On Error is set to Retry, additional retry configuration fields appear:
| Property | Default | Description |
|---|---|---|
| Max Attempts | 3 | Retry count |
| Delay (s) | 5 | Initial delay |
| Backoff | Fixed | Fixed, Linear, or Exponential |
| Max Delay (s) | 60 | Maximum delay cap |
The 7 step types
Section titled “The 7 step types”Steps are grouped into three categories matching the toolbar palette: Execution, Logic, and Orchestration.
Execute a shell command or installed tool. Use this for bash scripts, CLI tools, MCP tools, or any executable task.
| Property | Description |
|---|---|
| Tool | Click Change to browse installed tools (bash, Python, MCP tools). Shows tool name and description |
| Tool Input | Arguments for the tool. For bash: the shell command. Supports {{...}} template expressions |
LLM Agent
Section titled “LLM Agent”AI-powered agentic execution with Claude. Delegates work to an AI agent with a natural language prompt.
| Property | Default | Description |
|---|---|---|
| Prompt | — | Natural language instruction. Supports template expressions |
| Model | Sonnet (Balanced) | Quick Select (Haiku / Sonnet / Opus) or browse all providers |
| Max Turns | 3 | Maximum agentic reasoning cycles; tool calls count as turns |
Conditional
Section titled “Conditional”Branch based on a condition. The inspector offers two modes, toggled with tabs at the top of the section.
If / Else mode:
| Property | Description |
|---|---|
| Condition | Boolean expression. Click Add Condition to open the condition builder, Edit to modify, Test to preview the result |
| If True | Step to execute when condition is true |
| If False | Step to execute when condition is false |
Switch / Case mode:
| Property | Description |
|---|---|
| Switch Value | Expression resolving to a string, e.g. {{steps.classify.output}} |
| Cases | Value-to-target-step mapping. Click Add Case to add entries |
| Default Case | Fallback step if no case matches |
Iterate over a collection. Repeats a set of steps for each item in a list.
| Property | Default | Description |
|---|---|---|
| Loop Over | — | Expression resolving to a list. E.g., {{steps.fetch.output}} |
| Variable Name | item | Accessible as {{loop.item}} inside the loop body |
| Max Iterations | 100 | Safety limit |
| Loop Body Steps | — | Steps to execute per iteration (multi-select) |
| Break Condition | — | Optional; loop stops if true after an iteration |
Parallel
Section titled “Parallel”Run branches concurrently. Executes multiple paths at the same time and waits for all to complete.
| Property | Default | Description |
|---|---|---|
| Branches | — | Each branch is a list of steps. Click Add Branch to create. Branches run concurrently |
| Fail Fast | On | Cancels all branches when any branch fails |
Approval Gate
Section titled “Approval Gate”Human-in-the-loop approval checkpoint. Pauses the workflow and waits for a human to approve or reject.
| Property | Default | Description |
|---|---|---|
| Approval Message | — | Shown to the approver. Supports template expressions |
| Timeout (s) | 3600 | Wait time before timeout action (1 hour default) |
| Timeout Action | Deny | Deny, Approve (auto-approve), or Escalate |
Sub-workflow
Section titled “Sub-workflow”Execute a nested workflow. Embeds another workflow as a step, allowing reuse and composition.
| Property | Description |
|---|---|
| Subworkflow ID | ID of the workflow to execute. Inputs are passed via step inputs |
Connecting steps
Section titled “Connecting steps”Steps pass data to downstream steps through their outputs. Each step has an output that can be consumed by the next connected step. Configure connections by dragging from a step’s output handle (right side) to the input handle (left side) of the next step in the canvas.
Step IDs are set in the inspector panel. Use descriptive IDs: fetch_data, process, notify.
Example: GitHub issue triage
Section titled “Example: GitHub issue triage”A workflow that fetches open issues, analyzes them with AI, loops over high-priority items, and gates on human approval before posting.
-
fetch_issues — Add a Tool step. Select the
bashtool and enter your fetch command (e.g.python fetch_github_issues.py --repo myorg/myrepo --label bug) in the Tool Input field. -
analyze_priorities — Add an LLM Agent step. Write the analysis prompt (e.g. “Analyze the fetched issues and categorize by priority: high, medium, low”) and select your preferred model.
-
loop_high_priority — Add a Loop step. Set Loop Over to
{{steps.analyze_priorities.output}}, Variable Name toissue, and select the body steps to execute per iteration. -
approval_gate — Add an Approval Gate step. Set the Approval Message to describe what the reviewer should check (e.g. “Review these high-priority issues before posting to Slack”).
-
post_summary — Add a Tool step. Select the
bashtool and enter the notification command (e.g.python post_to_slack.py --channel #eng-alerts) in the Tool Input field.
Connect the steps in sequence: drag from each step’s output handle to the next step’s input handle.
Running a workflow
Section titled “Running a workflow”From the builder
Section titled “From the builder”Click Run in the toolbar. A run panel opens at the bottom showing step-by-step progress.
From the list page
Section titled “From the list page”Click Run on any workflow card.
Scheduling a workflow
Section titled “Scheduling a workflow”-
Open the workflow detail page by clicking a workflow from the list
-
Go to the Schedules tab and click Add Schedule
-
Enter the schedule — provide a cron expression (e.g.,
0 9 * * 1-5for weekdays at 9 AM) and select your timezone from the dropdown -
Save the schedule
Version control
Section titled “Version control”Every save creates a new version. From Workflows → [Workflow] → Versions:
- View all versions with change summaries
- Compare two versions side-by-side (diff view)
- Roll back to any previous version
- Keep steps focused: one step, one responsibility. Use LLM Agent steps for anything that needs judgment.
- Name your output variables clearly —
issue_id,filtered_items,summary— so downstream steps are readable. - Use the Conditional step for error handling: branch on whether a previous step succeeded.
- Test incrementally: run after each new step to verify data flows correctly.
- Use templates as starting points — click Templates on the Workflows list page.