BRUT DOCS getbrut.app ↗

Nodes & graphs

Brut is a node canvas. You build a graph — nodes connected by wires — and run it. Nodes are shots and decisions, not low-level settings: a node is "generate an image," "animate this clip," "plan the film," not a low-level knob.

The canvas

Left-drag selects, middle-drag pans, the wheel zooms, Tab opens the node menu at the cursor
- **Wire** — drag from an output port to an input port. Drop a wire on empty canvas and the add menu opens, filtered to compatible nodes — pick one and it's placed *and* wired. Three gestures work on wires you already have, all explained under [Ports and wires](#ports-and-wires): **double-click a wire** to splice a node into it, **`Alt`-click a wire** to split it with a dot and send it to more nodes, **`Alt`-click a pin** to move all its wires to another pin. - **Wire style** — the three wire buttons on the left rail (curved, straight, stepped) set how every wire in the graph is drawn. One style per graph: it's saved in the graph file and `Ctrl+Z` undoes a switch. Old graphs open curved, exactly as before. - **Snap to grid** — the **magnet** on the left rail. On, a dragged node lands on the canvas dots (the dots *are* the grid); off, nodes go exactly where you drop them. It's a preference of this computer, not of the graph, and it stays as you left it.
Magnet off, a node stops between dots; magnet on, it lands on them and lines up with its neighbor
- **Move children**: the toggle under the magnet. On, dragging a node drags everything upstream of it (its inputs, their inputs, through composite ports and reroute dots), the way a linked hierarchy follows its parent in a 3D package; off, a drag moves only what you hold. What a node feeds never rides along. Nodes already in your selection move once, never twice. A preference of this computer, like the magnet. - **Opening a graph fits it to the window**: from the home, the graph switcher or a file, the canvas lands zoomed on the whole graph, never on where the last viewport happened to be. Undo, autosave and Marcel's additions leave your view alone.

Ports and wires

Every node exposes typed ports. Wires carry one of three things: images, text (prompts and plans), or video. Ports are labeled by role — a Compose node has scene and reference image inlets. Brut only lets you connect compatible types, and picks the right inlet automatically when you drag-to-connect.

Some nodes expose per-tile output plugs — a Shot Board tile has its own handle so you can route one chosen shot downstream, a Clip Board tile has one per clip.

Splice a node into a wire

Double-click a wire (or right-click it → Insert node…): the add menu opens, filtered to the nodes that fit between the two ends. Pick one and it lands on the wire, wired in and out — an Upscale between a generator and its Preview, a Conform in front of a board, without redrawing anything.

Double-click a wire, pick a node: it lands on the wire, wired in and out
### Split a wire with a reroute dot

Alt-click a wire and a small dot drops on it at that point: the wire now runs through the dot, and the dot is a branch point.

Right-click a wire → Add reroute here does the same. A dot has one inlet and as many outlets as you drag off it, and it carries the color of its wire along. It's purely cosmetic: it changes nothing about how the graph runs or what it costs, so nothing downstream re-runs or re-pays, and Marcel doesn't see it. Delete a dot and the wire heals: its input reconnects to every wire that left it, nothing is left dangling.

Alt-click a wire: a dot drops on it; drag a new wire off the dot and the same output feeds a second node
### Move wires between pins (`Alt`-click a pin)

To re-plumb a graph without redrawing it, Alt-click a pin. Every pin on the canvas starts pulsing: a rewire is armed on that pin (the Activity panel says so). Then click the destination pin (Alt no longer needed):

Click the armed pin again, press Esc or click empty canvas to cancel. Two wires that would end up on the same two pins merge into one. The Activity panel logs what moved, and Ctrl+Z undoes it like any other edit.

Alt-click a Prompt's output, click another Prompt's output: every wire moves across in one go
## How a run works
Run: independent branches execute at the same time, unchanged nodes answer from cache instantly
## Node families
Family Nodes
Inputs Prompt, Image In
Text Refine, Text → Text, Text Board
Images Text → Image, Image → Image, Inpaint, Annotate & Correct, Layers, Sketchpad, Compose, Upscale Image
Exploration Multi-Shot, Shot Board
Cinema team Reference Board, Director (plan + proof sheet), Scenarist, Artistic Director, DoP, Script Supervisor, Storyboard, Film Shots
Video Image → Video, Clip Board, Upscale Video, Sequence
Utilities Conform, Preview, Compare, History

Each family has its own page under Nodes in the sidebar. Sticky notes, emoji stamps, the pen and text labels aren't nodes — they're annotation tools in the rail's Organize section, also one right-click away via the ring menu (all documented on the utility page).

Saving & undo

Brut saves your canvas into the project a moment after every change, and it remembers which named graph it is: relaunch the app, or reopen the project from another machine on a NAS share, and you land exactly where you left off, name in the selector and all. Named saves are still explicit (File ▾ → Save, Ctrl+S); a • next to the graph name means the canvas has changes not yet saved to it, and opening another graph over unsaved work asks first instead of silently replacing it. Undo/redo (Ctrl+Z / Ctrl+Shift+Z) covers structure and parameters — never generation results, which are the ledger's job, so undoing a parameter edit keeps your past results.

Delete a node by mistake, Ctrl+Z brings it back with its results intact