Back to Blog Series
Part 4: Editor UXStep 4 of 15ArchitectureReact FlowEditor

Building Fluxo's Visual Workflow Engine with React Flow

How I built Fluxo's graph editor, node system, variable model, version history, and collaboration ergonomics on top of React Flow.

Why this part is here in the storyline

See how the visual graph editor enforces safe workflow construction in the product UI.

Artem Moshnin, Lead Software EngineerFebruary 20, 202614 min
Series Progress4/15

Fluxo is a review-first workflow automation platform. You build workflows as a visual graph: a trigger starts a run, nodes transform data or call external systems, and a Human Review step can pause execution until someone approves what will happen next.

This post is about the visual editor, because it is where Fluxo becomes understandable. A runtime can be perfect, but if the editor lets users build invalid graphs or hides failure modes, the product will feel unreliable. I treated the editor as infrastructure: it encodes product rules, not just pixels.

Section 1

Why this editor architecture

#why-this-editor-architecture

Automation in real teams is not linear. Workflows branch, merge, fan out, wait on humans, and resume later. A graph model matches that reality, and it also keeps the UI and backend aligned: the same nodes and edges the user sees are the same nodes and edges the runtime executes.

I use React Flow for rendering and interaction (nodes, edges, handles, selection, pan/zoom). Then I layer Fluxo’s product rules on top:

  • exactly one trigger per workflow
  • explicit source and target handles
  • strict node type registration
  • plan-aware node gating
  • validation before save
Section 2

The graph contract I enforce

#the-graph-contract-i-enforce

The most important decision is that Fluxo has one graph contract shared across the whole platform. The editor, execution engine, analytics, review system, and prompt learning all operate on the same shape.

At a high level, each workflow is persisted as nodes and connections:

  • Node: id, workflowId, type, position, data, optional credentialId
  • Connection: fromNodeId, toNodeId, fromOutput, toInput
  • WorkflowVersion: immutable snapshots for rollback and auditing

This avoids the classic automation-product failure where the UI implies one thing but the runtime does another. When everything shares the contract, correctness becomes enforceable.

Section 3

Editor UX decisions that mattered

#editor-ux-decisions-that-mattered

I focused on reducing silent failure modes. The editor should make “correct” feel natural and make mistakes hard to persist:

  • node selector enforces one-trigger rule up front
  • tier checks happen before node insertion for premium nodes
  • variable names are normalized and checked for duplicates
  • type-specific node forms are schema-driven to reduce malformed config
  • node output inspection is exposed directly in execution details

Performance is UX. Dragging and panning should never block on serialization or heavy transforms. Fluxo persists changes through explicit save paths rather than uncontrolled optimistic mutation, so the canvas stays responsive and the backend stays authoritative.

Section 4

Collaboration and version history

#collaboration-and-version-history

Workflows evolve. Teams iterate, fix incidents, and refine prompts. That means you need history.

Fluxo writes WorkflowVersion snapshots on meaningful saves. That enables:

  • fast rollback for production incidents
  • diff-based confidence during iteration
  • clear timeline for who changed what and why

I also built collaboration primitives into the editor layer (presence/cursor components and provider plumbing) so Fluxo can scale from solo building to team operation without rewriting the UI architecture later.

Section 5

Natural-language workflow generation

#natural-language-workflow-generation

Fluxo can also generate a workflow from a natural-language description. This is only useful if it cannot bypass safety rules, so the generation path has guardrails:

  • whitelist of allowed node types
  • exactly one trigger enforced post-generation
  • automatic insertion of Human Review before outbound destinations
  • automatic variable name uniqueness
  • graph connectivity repair and layout normalization

The principle is: AI helps with speed, not permission. The generated graph must still satisfy the same constraints as a human-built graph.

Section 6

What this unlocked across Fluxo

#what-this-unlocked-across-fluxo

Because the editor contract is strict, I can reliably power:

  • execution planning via topological sort
  • per-node runtime telemetry
  • prompt-learning graph traversal
  • review governance routing checks against downstream node types
  • template instantiation into valid editable workflows

Treating the editor as infrastructure is why Fluxo can evolve quickly without breaking core behavior. When UI and runtime share a contract, new capabilities land as extensions of the model, not as fragile special cases.