# Canvas Operations

Keyboard shortcuts for working with selected nodes, and how disabling a node changes the way your flow runs.

## Keyboard Shortcuts

With one or more nodes selected on the canvas:

Key | Action
--- | ---
`D` | Disable or enable the selected nodes. If any selected node is enabled, all become disabled; if all are already disabled, all become enabled.
`Delete` / `Backspace` | Delete the selected nodes or connections.
`⌘Z` | Undo. Disabling or enabling a multi-node selection is a single undo step that restores each node's exact prior state.

Disable and Enable are also available from the node's right-click context menu and from the Enabled checkbox in the inspector.

## Disabling Nodes

A disabled node passes its input through unchanged and performs no work. A disabled condition always answers Yes. Loops run zero iterations. Disabled triggers don't fire — disabling prevents new fires but never cancels in-flight runs.

That one rule covers everything: no script runs, no file moves, no notification shows, no LLM is called, no delay waits, no breakpoint pauses. The payload that arrived at the node continues downstream exactly as it arrived, and the run never fails because a node is disabled.

On the canvas, a disabled node dims and shows a gray slash badge in its header. Its ports stay live and connectable, and connections through it remain in place — they carry the payload straight through during a run.

## How Each Node Type Behaves When Disabled

Node type | Disabled behavior
--- | ---
Actions, transformers, AI, utilities | Pass the input through unchanged on their normal outlet. Zero side effects — an AI node makes no LLM call and spends no tokens.
Conditions (Compare) | The check is removed; the flow continues as if the condition always passes. Execution exits the Yes outlet only — the No branch is skipped, never both.
Loops (For Each, While) | Run zero iterations. The input continues out the Done outlet; the loop body is skipped entirely.
Unzip, Extract Text (PDF) | No extraction happens. The archive or document passes through untouched on the scalar outlet (File / Document); the per-item outlet never fires.
Triggers and emitters | Never armed, never fire. A flow whose every trigger is disabled refuses to arm until you enable one.

💡 Free flow testing: disabling an AI node is the free way to test the rest of a flow. The node makes no LLM call and spends no tokens; the payload passes straight through, so you can exercise every trigger, condition, and action around it without paying for inference on each test run.

## Disabling a Trigger While the Flow Is Armed

Disabling a trigger takes effect immediately, even while the flow is armed — the canvas says it's off, so it is off. Disable prevents new fires; it never cancels in-flight runs. Any execution already underway completes normally.

If you disable every trigger in a flow, the flow cannot arm: Watchflows refuses with “All triggers are disabled — enable a trigger to arm this flow.” An armed flow that can never fire would be a lie in the UI.

## Disabled Nodes in the Timeline

A disabled node still appears in every run's timeline with a Disabled status and an annotation explaining what happened — “Disabled — passed through”, “Disabled — continued via Yes”, or “Disabled — 0 iterations, continued via Done”. Its output payload equals its input, and you can inspect it like any other row.

This is distinct from skipped: a skipped node sits on an untaken branch and received no payload at all; a disabled node received a payload and passed it through.