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 samplers and latents: a node is "generate an image," "animate this clip," "plan the film," not a low-level knob.

The canvas

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; a Multi-Shot node has base and reference. 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.

The execution model

When you run, Brut topologically sorts the graph and executes on a promise-graph scheduler: each node starts the moment its inputs are ready, so independent branches run concurrently. Two things make this cheap and fast:

Runs can overlap if their scopes don't share a node. Paid work is guarded so nothing double-pays.

Node families

Family Nodes
Inputs Prompt, Refine (Prompt Helper), Text→Text, Text Board, Image In
Image generation Text→Image, Image→Image, Inpaint, Compose
Exploration Multi-Shot, Shot Board, Reference Board
Cinema crew Scenarist, Artistic Director, DoP, Script Supervisor, Storyboard
Video Image→Video, Film Shots, Clip Board, Sequence
Utility Conform, Preview

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

The canvas autosaves into the project itself (a .workspace.json beside the saved graphs, written moments after every change), and it remembers which named graph it is — relaunch the app in any mode, 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 param edit keeps your caches warm.