
Aug 12, 2026
Builder and SDK are the same graph
The canvas, the workflow JSON, and the node registry describe one thing. Pick the surface. Do not pick a second product.
Teams split here for no good reason. One group wants a canvas. The other wants a file in git. Those are two editors. They are not two products.
We keep one graph: the same nodes, the same registry, the same run. That graph is the workflow — the versioned executable behind the agent you ship. The builder draws it. The SDK writes it. The host executes that JSON. If those views diverge, you now operate two graphs. That is the second product. We will not ship it.

One document
This is the thing both surfaces emit. The canvas is a view. The TypeScript is a view. The run does not care which view you used.
{
"name": "invoice-recovery",
"nodes": [
{ "id": "fetch", "type": "http", "url": "https://billing.internal/invoices" },
{ "id": "reason", "type": "model", "prompt": "Explain the failure in one paragraph." },
{ "id": "notify", "type": "http", "url": "https://slack.internal/hooks" }
],
"edges": [
{ "from": "fetch", "to": "reason" },
{ "from": "reason", "to": "notify" }
]
}The useful test is boring. Can you open the same run in both surfaces and see the same nodes, the same checkpoints, the same replay target? If not, the product has split, even if the marketing has not.
Who authors what
| Surface | You use it when | It writes |
|---|---|---|
| Builder | You want to see the path | The same workflow JSON |
| SDK | The graph lives in a repo | The same workflow JSON |
| Host | A trigger fires | A run against that JSON |
Pick the surface that matches how you already work. The checkpoint and the replay loop stay the same.
More on that in Why replay needs the checkpoint.