UI tour
This page walks through the FLOWGRAPH window end-to-end: opening it, the block palette, the canvas, the per-node configuration panel, the run controls, the results inspector and the kill-chain viewer. Each section is paired with a screenshot.
If you prefer learning by doing, jump to the Portscan + SMB finger recipe — it walks through assembling and running an actual flowgraph in seven clicks.
1. Opening a FLOWGRAPH window
From the UTIL menu in the top bar, pick Flowgraph, or from any
console type createutil FLOWGRAPH. A new window opens with an empty
canvas; the block registry is pushed to the frontend automatically
about a second after the window mounts.

2. The empty canvas
The flowgraph window has three persistent panes:
- Left — the block palette (collapsible).
- Centre — the canvas where you wire blocks.
- Right — the configuration panel for the currently selected node (collapsible).
A toolbar across the top exposes the run controls (Run / Continuous / Runloop / Stop / Reset State), a save / load button, validation, zoom, and the composite save dialog.

3. The block palette
Blocks are grouped by category — the same categories the block reference is organised around. Categories expand and collapse; the search box at the top filters across every block id and description.
A few tips:
- Search by wire type — typing
credential_smbshows every block with an SMB-credential port. - Search by MITRE technique ID — typing
T1558shows every block that produces / consumes a Kerberos ticket attack.

4. Dropping a block on the canvas
Drag any block from the palette onto the canvas. The drop point is
exactly where you let go of the mouse; nodes can be repositioned
later with click-and-drag. A freshly dropped node has its default
parameter values applied and is marked PENDING until the next run.

5. Wiring blocks together
Hover over a port — a small handle appears. Click and drag from an output handle to an input handle. The editor highlights compatible input ports in green and incompatible ones in red as you drag, so it is hard to make a connection the engine will refuse.

6. The configuration panel
Click any node to open its configuration panel on the right. The
panel renders one input per parameter declared in the registry, with
the parameter description below it (this is the same text you can
read on the block reference page). Required
parameters are marked; defaults are pre-filled. Setting description
gives the node a memorable label on the canvas.

7. Validation
The Validate button runs the same logic as validate on the CLI.
Errors and warnings are listed in a popover; each entry has a
node_id / edge_id reference you can click to jump straight to the
offending node on the canvas. Common errors are missing required
parameters, dangling required input ports, and type mismatches you
somehow tricked the editor into accepting.

8. Run controls
The toolbar exposes five execution controls plus the pacing knobs:
- Run — single pass with RERUN_TRIGGER convergence.
- Continuous — keep running on an interval.
- Runloop — iterate until the store stops growing.
- Stop — cancel the current run.
- Reset state — clear seen IDs, queues, and journal.
The pacing inputs (max concurrent, ops/min, jitter, rerun delay) live in the same toolbar. See run modes & opsec for what each one does.

9. Live execution state
While a run is in flight, every node is coloured by its state:
| Colour | Meaning |
|---|---|
| Grey | PENDING — has not yet had all required inputs. |
| Blue | RUNNING — actively executing. |
| Green | DONE — finished, produced output. |
| Red | ERROR — raised an exception; details on hover. |
| Hatched | DISABLED — manually disabled by the operator. |
The window also shows a per-node iteration counter when you are
inside a runloop or continuous run.

10. Inspecting items on a wire — TAP_SINK
Drop a TAP_SINK block onto any wire (drag it on top, the editor
"splices" it into the connection). TAP forwards items downstream
unchanged, but every item it sees also appears in the results panel
under that node — full JSON, one row per item.

11. The CONSOLE block
CONSOLE is a pass-through logger. Each item is rendered through the
message template ({field_name} placeholders interpolate fields
from the dict) and printed live in a panel inside the block itself.
Leave message empty to print raw JSON.
This is the right block when you want a "log line" view of a stream without leaving the canvas.

12. Kill chain trace
Right-click any item in the results panel — or any credential / target
in the project store — and pick Trace kill chain. The frontend
sends a killchain {"__cid": …} command to the backend; the response
is rendered as an interactive tree showing every block that
contributed to the item, with MITRE ATT&CK badges where the registry
maps them.

13. Saving a composite
With one or more nodes selected, picking Save as composite in
the toolbar opens a dialog. You give the composite an ID
(COMPOSITE_<MyName>, validated by the same regex the CLI enforces),
a description, and confirm the inferred port surface (one port per
BOUNDARY_INPUT / BOUNDARY_OUTPUT in the selection).
After saving, the composite is in the palette under Composites and
in ~/.octopwn/composites/<id>.json for sharing.

14. Reusing a composite
Composites behave exactly like any other block — they appear in the palette with their ports and description, and they execute as a nested engine inside the parent. Double-clicking a composite opens its inner graph in a new tab so you can edit it; saving the inner graph updates the composite definition everywhere.

What's next
- For wire-type rules, see typing & wiring.
- For the run / continuous / runloop modes in detail, see run modes & opsec.
- For end-to-end pipelines you can copy and adapt, see the recipes.
- For the complete catalogue of every block type, see the block reference.