Keyboard & canvas
The canvas is deliberately shallow: a handful of modifier shortcuts, and everything else on the right mouse button. This page lists what is actually bound — nothing more.
Keyboard
Section titled “Keyboard”Every shortcut in the editor’s own handler requires a modifier, and Cmd and Ctrl are interchangeable on every platform — the handler tests metaKey || ctrlKey, so Ctrl+Z works on macOS and Cmd+M works on Linux. Tooltips in the UI say “Cmd” because it was written on a Mac.
All of them are suppressed while the event target is an <input>, a <textarea>, or a contenteditable element — typing in a note or a prompt never triggers them.
| Keys | Action |
|---|---|
Cmd/Ctrl + Z | Undo |
Cmd/Ctrl + Shift + Z | Redo |
Cmd/Ctrl + C | Copy the selected nodes |
Cmd/Ctrl + V | Paste |
Cmd/Ctrl + D | Duplicate the selection |
Cmd/Ctrl + M | Toggle mute on every selected node |
Cmd/Ctrl + B | Toggle bypass on every selected node |
There is no Cmd+Y redo, no Cmd+A, no Cmd+X, no Cmd+S (graphs save themselves), and no arrow-key nudge.
Two keys are bound outside that handler:
| Keys | Action | Note |
|---|---|---|
Backspace or Delete | Delete the selected nodes and wires | The only way to delete a wire — there is no edge context menu |
Escape | Close the node menu, the wire/add-node menu, and the tab menu | Not a modal dismiss: the params editor, param-run prompt, validation and detached-gate dialogs close via their own buttons or by clicking the backdrop |
Cmd/Ctrl + Enter | Send the message in the Live handoff dock | Only while that dock’s composer has focus |
Mute and bypass behavior
Section titled “Mute and bypass behavior”The toggle is per-node, so a mixed selection inverts rather than normalizing. Mute and bypass are mutually exclusive — setting one clears the other. Nodes that cannot be muted (notes, frames) ignore the shortcut silently.
Opening menus
Section titled “Opening menus”| Action | Result |
|---|---|
| Double-click empty canvas | Quick-add menu — every node type, nothing pre-wired |
| Right-click empty canvas | The same add-node menu |
| Drop a wire on empty canvas | Wire-drop menu, filtered to node types that can legally connect. Titled add next node when you dragged from an output, add input node when you dragged from an input |
| Right-click a node | Node context menu |
| Right-click a workflow tab | Tab menu — export, duplicate, promote/convert, close, close others, close to the right, close all |
Double-click zoom is disabled so the quick-add gesture is free. Panning or zooming the canvas closes any open menu, because the menus are viewport-fixed.
The wire-drop menu lists the built-in blocks first, then custom nodes, agents, library payloads and sessions. If nothing can legally connect to what you dragged, it says no compatible node.
The node context menu
Section titled “The node context menu”| Entry | Effect |
|---|---|
❯ run from this node | Run this node and everything downstream; upstream nodes feed in their last result |
⊙ test this node | Run only this node |
⊘ mute / unmute | Skip the node — downstream starves |
⤳ bypass / unbypass | Pass input straight through without executing |
⟳ retry | Cycle extra attempts (with backoff) before the node counts as failed |
⤼ on error | Toggle between continue and fail run |
⇄ exchange agent › | Swap the agent on an agent node (agent nodes only) |
▦ group selection | Wrap two or more selected nodes in a frame |
⌗ save selection as sub-workflow | Extract the selection into its own graph |
▦ ungroup | Dissolve a frame (frames only) |
↻ sync from sub-workflow | Re-pull a linked frame’s contents (linked frames only) |
The two run entries are disabled while the graph is running.
Clicking and dragging
Section titled “Clicking and dragging”| Action | Result |
|---|---|
| Click a skill or rules node | Opens the inspector — reading is the primary action for these |
| Double-click any node | Opens the inspector |
| Double-click a linked frame | Navigates into the sub-workflow it points at |
| Double-click a frame title | Rename it inline |
| Double-click a note | Edit its text |
| Drag a frame | Moves every member with it — nodes tagged to the frame, plus any node whose centre sits inside it |
| Drag a node into a frame | Re-tags it to the innermost frame containing its centre. Members of a linked frame are exempt and stay put |
| Drag a palette item onto the canvas | Adds it where you dropped it |
Drag a .json file onto the canvas | Imports it as a workflow |
| Drag a workflow tab | Reorders it |
| Middle-click a workflow tab | Closes it |
Navigation
Section titled “Navigation”These come from the canvas library’s defaults rather than threadle’s own handler, and they are the one place where macOS and other platforms genuinely differ.
| Action | Result |
|---|---|
Shift + drag on empty canvas | Rubber-band selection box |
Cmd (macOS) / Ctrl (elsewhere) + click a node | Add it to the selection |
| Wheel | Zoom |
| Drag empty canvas | Pan |
Hold Space + drag | Pan without hitting the pane |
Zoom is clamped to 0.08×–2.5×, and the view fits the graph when a workflow first opens. Scrollable areas inside nodes — prompt bodies, output panes, run logs — capture the wheel instead of zooming the canvas. The minimap in the bottom-right is both pannable and zoomable.
Related
Section titled “Related”- Graph & wires — what the canvas is modelling
- Run — partial runs and graph settings
- Loose ends — the dock that catches wiring mistakes