Four loops, one canvas.
Compose a workflow, run it, rewind any step, then eval it. Everything here runs on free tiers; a full run of the tweet template costs about $0.00007.
The four loops
- 1 Compose
Drag nodes onto the canvas: model, tool, router, human gate, code. Prompts reference variables as {{name}}; the inspector shows what is in scope.
- 2 Run
Press ⌘↵. Tokens stream inside the node that generates them, edges light up as data flows, and human nodes pause the run with a card showing exactly what to approve.
- 3 Time-travel
Open the State tab: scrub through every checkpoint, see what each step changed, edit a variable and fork a new run from that step. Compare the two side by side.
- 4 Eval and ship
Build a dataset, pick scorers, run an eval; failures light up the node that caused them. Sweep candidate models for a node and apply the cheapest one that still passes.
Node types
what each block on the canvas does| Node | Does | Config |
|---|---|---|
| Start | Entry point. Run input lands here. | input → vars |
| Model | Prompt a model, store the reply in a variable. | prompt · model · output_key |
| Tool | Call a built-in or MCP tool. | tool · args · output_key |
| Router | Branch by rule or by asking a model. | rule | model · branches |
| Human | Pause and wait for a person. | question · show_keys |
| Code | Run a Python function over the variables. | python · sandboxed |
| End | Run finishes when it reaches this node. | final vars |
Shortcuts
- ⌘KCommand palette: add nodes, run, fit view, undo, delete.
- ⌘↵Run the graph. A dialog asks for the input variables no node produces.
- ⌘Z / ⇧⌘ZUndo and redo any canvas edit, including config changes.
- ⌫Delete the selected node or edge.
- drag from a portConnect nodes. Routers have one port per branch along the bottom edge.
- click a timeline barSelect that node and show the step's input, output and usage.
Glossary
- Graph
- A workflow: nodes connected by edges, saved with a version number on every edit.
- Run
- One execution of a graph with a given input. Streams events live and keeps them for replay.
- Checkpoint
- The full state after a node finishes. Every run is a chain of checkpoints.
- Fork
- A new run that starts from an edited checkpoint of another run. The original stays untouched.
- Eval
- A dataset of inputs plus scorers; each row runs the graph and gets a pass or fail.
- Sweep
- The same eval repeated with different models on one node, to find the cheapest that passes.
- MCP
- Model Context Protocol. Connect a server and its tools appear in the Tool node.
Common questions
- Does a fork change the original run?
No. It creates a new checkpoint whose parent is the one you edited, and a new run with its own head.
- Why do tokens disappear after a run?
Live tokens are only streamed; the finished text is stored once in the node_end event, so replays stay small.
- What does the amber heatmap mean?
After an eval, each node glows by the share of failed rows that it wrote the scored variable for.
- Is the code node safe?
Code runs in a Docker container with no network, a read-only filesystem and a timeout; a subprocess is the fallback.
- What happens on rate limits?
Model calls retry with backoff and show a retry chip on the node. Evals run three rows at a time.
- Can someone else edit my shared graph?
No. A share link is read-only; viewers can copy the graph into their own workspace.
- Which models can I use?
Anything in the Models list: Groq's open-weight models by default, Gemini when a key is set. Each node picks its own model.
- Where do runs and their events live?
In Postgres, next to the graph. Console, timeline, cost and traces all read the same event log, so nothing is recomputed.
Under the hood
Each node completion is a LangGraph checkpoint in Postgres. A run is a pointer to the head of a checkpoint chain plus the events it emitted.
Forking creates a new checkpoint whose parent is the one you edited, and a new run with its own head. Lineage is a parent-pointer walk.
Console, timeline, cost and traces all derive from the same run_events table; reconnects replay by sequence number.