The viewer
The viewer is the bundled UI the CLI serves at http://127.0.0.1:4747. This page is the map: if
you learn one thing from it, learn ⌘K.
The command palette
Section titled “The command palette”⌘K (or CtrlK) opens a palette over everything. It is the fastest route to any node, any run, and every action on this page — so you never have to hunt for a control.
| Type | To get |
|---|---|
| anything | Fuzzy search across the run’s nodes and your recent runs |
> | Actions only (or press > to open straight into command mode) |
/ | Opens the palette from anywhere |
Arrow keys move, Enter runs, Esc closes. Selecting a node centres it on the canvas and opens the inspector on it.
Keyboard shortcuts
Section titled “Keyboard shortcuts”Shortcuts are ignored while you are typing in a field — except ⌘K, which always works.
| Key | Action |
|---|---|
| ⌘K | Toggle the command palette |
| / | Open the palette (search) |
| > | Open the palette (actions) |
| Esc | Close the palette, or deselect the current node |
| F | Follow the active node with the camera |
| ⇧F | Fit the graph to the screen |
| ⇧A | Re-arrange the layout (full ELK pass) |
| ⇧T | Toggle the timeline |
| ⇧E | Show only the error path |
| ⇧C | Collapse / expand all groups |
| ⇧L | Copy a deep link to this view |
| B | Toggle the run list rail |
| D | Cycle the theme (system → dark → light) |
While a gate is held
Section titled “While a gate is held”When execution stops at a gate, focus moves to Continue so the keyboard is already where you need it, and four single-key shortcuts release the hold:
| Key | Action |
|---|---|
| C | Continue |
| S | Step |
| R | Retry |
| I | Inject — opens the editor; ⌘Enter sends it |
Abort has no shortcut on purpose: it ends the run, and a single keystroke is the wrong amount of friction for that. Click it.
The graph
Section titled “The graph”One node per logical node, lit up per execution — see nodes and instances. Nodes appear as the agent reaches them, glow while running, and turn red on failure.
- Follow (F) keeps the camera on whatever is executing — the right default for watching a live run.
- Fit (⇧F) zooms out to the whole graph.
- Re-arrange (⇧A) runs a full layout pass. Live runs are laid out incrementally so nothing jumps under your cursor; after a long run this tidies the result.
- Collapse (⇧C) folds sub-agents and chains into summary cards — the first thing to reach for on a graph you cannot take in at once.
Filters
Section titled “Filters”From the palette, to cut a large run down to what you care about:
| Filter | Shows |
|---|---|
| Errored nodes | Only nodes that failed |
| Slow nodes | p90 duration and above, for this run |
| Paused nodes | Only nodes currently held at a gate |
| Error path (⇧E) | Dims everything that is not an ancestor of a failure |
Error path is the one to know: on a 200-node run it answers “what actually led here” in a keystroke, instead of you tracing edges by hand.
Filters also narrow by node kind, and Clear all filters puts the whole graph back.
The timeline
Section titled “The timeline”⇧T opens a waterfall under the graph. It answers the questions the graph cannot:
- what overlapped — which tool calls actually ran in parallel;
- where the wall clock went — the step that took eleven seconds is the widest bar;
- how long a step waited before its first token;
- when a gate held, and for how long.
Rows are virtualised, so a thousand bars cost the same as thirty. Zoom with ⌘-scroll, the +/−/fit buttons, or by dragging a range on the ruler. Labels stay pinned while you scroll horizontally. Timeline only hides the graph when you want the full height.
The inspector
Section titled “The inspector”Click any node to open it: input, output, error with stack, duration, token usage, status, and every instance of that node newest-first. See inspecting a run.
The run bar
Section titled “The run bar”Connection status, the run picker, the Run / Step toggle, Pause all, and a removable chip for every armed breakpoint — including the default pause-on-error one. See breakpoints & step mode.
Deep links
Section titled “Deep links”The viewer’s routes are plain hash URLs:
http://127.0.0.1:4747/#/run/<runId>http://127.0.0.1:4747/#/run/<runId>/node/<nodeId>Both segments are URI-component encoded, so tool:issueRefund appears as tool%3AissueRefund.
⇧L copies a link to the current view — paste it into an issue, a message, or your notes and it reopens exactly there. The MCP tools return these same links, so a coding agent can cite the precise node it is talking about.
Built-in fixtures
Section titled “Built-in fixtures”The viewer can render three recorded runs with no server, no agent and no API key — useful for seeing what a shape looks like before you instrument anything, and for reporting a UI bug against something everyone has:
http://127.0.0.1:4747/?fixture=demo the planted-bug trip plannerhttp://127.0.0.1:4747/?fixture=mcp an MCP session (server / tool / resource / prompt)http://127.0.0.1:4747/?stress=300 a generated 300-node graph, for layout and performance?stress=<n> accepts 8–4000 nodes and takes optional &events=<n> and &pace=<ms>.
The empty state offers all three as buttons, so you do not have to remember the query parameter. A fixture is clearly badged as recorded — it is not a live run and nothing in it can be resumed.
Imported and replayed runs
Section titled “Imported and replayed runs”A run brought in by graphmind import is rendered with the viewer’s “imported” treatment:
history only. Nothing is executing, so there is nothing to pause, and the control affordances are
not offered. graphmind demo replays a recording through the real pipeline, so it does pause
for real.