Platform/Visual canvas

16 nodes. 4 categories.

The smallest node palette we could ship that still models anything teams actually run. Each node has a typed input schema, a typed output schema, and a single visual identity that tells you what it does at a glance.

The palette

Four colors. That's how you read a graph.

Color is the first thing you see and the last thing you forget. Every node belongs to one of four categories — and the color tells you whether you're looking at an entry point, an effect, a branch, or a human.

Triggers · entry points

Where workflows start.

Inbound events that wake a workflow. Each trigger emits a typed payload onto the canvas.

WebhookHTTP
Schedulecron
Email inboundSES
Manual runUI
Actions · effects

Where work gets done.

Talk to outside systems. Run code. Query knowledge. Reason. Each action declares its inputs and outputs.

MCP toolany server
LLMBedrock+
Knowledge queryRAG
CodeTS / Py
HTTP requestREST
Sub-workflowA2A
Flow · structure

How the graph branches.

Decide. Loop. Wait. Recover. The control-flow vocabulary is intentionally small — most graphs need only two of these.

Branchif / else
Map / loopparallel
Wait / delaytimer
Try / catcherrors
Humans · approvals

People as first-class nodes.

Forms aren't pop-ups. They're nodes with their own inputs, outputs, and outgoing edges per button.

Approval formapprove/deny
Data formcollect input
Why this small

Six categories of node would be three too many.

Most workflow tools ship 80+ node types — one per integration, one per branch shape, one per common pattern. We deliberately didn't. Here's the reasoning.

01

One MCP node beats 400 connector nodes.

The vendor maintains the integration. Their server is the node. We don't ship a Salesforce node and a HubSpot node; we ship an MCP node, and you point it at any MCP server.

02

Forms aren't a special case.

Every other tool treats human approvals as a sidecar — a popup, a Slack message, an email. Here they're a node category, with the same versioning, replay, and audit as everything else.

03

Branch & loop, not "switch / for-each / parallel-each."

One branch node with N output edges. One map node with parallelism. The graph reads cleaner than ten variants of the same thing.

04

Code is the escape hatch.

The long tail — string parsing, weird format conversion, vendor quirks — goes in a Code node. TypeScript or Python, sandboxed. We don't try to ship a node for every odd transform.

05

Sub-workflow is a node.

A2A composition isn't a feature, it's a node type. Drop a published workflow as a single block; its typed interface drives the form designer like any other node.

06

Triggers are nodes too.

No separate trigger panel, no separate config screen. They sit on the canvas like everything else. You can have multiple, and they emit typed payloads.

In practice

A graph reads left to right. Color tells you the rest.

customer-onboarding · v3.draft
live
WebhookNew lead
MCPEnrich
LLMRisk score
Branchrisk > 0.7?
FormManager approval
MCPProvision
MCPNotify Slack
See the palette in action

Bring a workflow. We'll model it on the canvas live.

30 minutes. We pick something painful from your stack and sketch the graph together — usually in fewer than nine nodes.