Canvas Basics

Applies to: ChengOS v0.1.0+ | Last verified: 2026-08-12 | Source: chengflow-ui/src/features/editor/components

The editor is a React Flow canvas with a node palette on the left, the graph in the middle, and a property panel on the right. This page covers moving around and assembling a graph; for configuring a selected node see node configuration.

Layout

RegionContents
Left sidebarThe node palette, searchable, grouped by category
CanvasYour graph, with a minimap and a zoom/fit control
Right sidebarThe property panel for the current selection
Control panelSave, run, and execution status

Adding nodes

Drag a node from the palette onto the canvas. Position carries no meaning to the engine — execution order comes from edges, not from left-to-right placement — but laying a graph out in reading order makes it dramatically easier to follow, and the editor does not rearrange it for you.

The palette is the authoritative list of what is installed: it is built from the backend's node registry, so a newly added node type appears without a frontend release.

Connecting nodes

Drag from an output port on a node's right edge to an input port on another node's left edge.

Connections are type-checked. Each port carries a declared type, and the editor refuses a pair that cannot carry data safely. A port that will not accept your edge is telling you the types are incompatible — the check is O(1) against the node registry, so this is instant rather than a validation pass you trigger later. Fixing it usually means inserting a utils/type_cast node, or choosing a different output port.

An input port generally accepts one edge; output ports can feed many downstream nodes, which is how you fan a value out to parallel branches.

Selecting and editing

Keyboard

KeysAction
Ctrl+SSave the workflow
Delete / BackspaceRemove the selection
Drag on empty canvasPan
Scroll / pinchZoom

Notes and organization

The canvas supports free-floating notes, which are annotations rather than graph participants — they never execute and never carry data. Use them to record why a branch exists, which is the thing a graph cannot express on its own.

Saving

Save with the toolbar button or Ctrl+S. The first save asks for a name. Workflows persist in PostgreSQL, not in browser storage, so they are available to every client and to the API immediately.

Unsaved changes are tracked per tab, and the editor marks a tab dirty rather than auto-saving — so an experiment you abandon does not overwrite something that worked.

Importing an existing workflow

Drop a workflow JSON file onto the canvas to import it. This is the same format GET /api/v1/workflows/:id/export produces, which makes export-edit-import a legitimate way to make bulk mechanical changes that would be tedious by mouse.

Next steps