RulesetEditor

App

A visual flow editor for the blocks of any catalog: typed blocks with params (each block gets a form from its schema), connections, groups, flows that run each other, undo, search, a shortcuts sheet, comments and a help tab per block. It is not tied to a domain: this entry uses a business catalog (a schedule, a webhook in, a comparison, a notification, a webhook out); the IoT demos use device blocks.

A business flow (no devices)

Preview
TrueTrueError path: where errors of this node goError path: where errors of this node goError path: where errors of this node go
Every Monday

08:00

out
Overdue invoices?

msg.payload.overdue > 0

in
yesno
Tell finance

Email finance

in
Update the CRM

POST https://crm.example.com/api/overdue

in
100%
Code
<RulesetEditor
  catalog={catalog}            // schedule, webhook in, compare, notification, webhook out
  choices={{ teams: [...] }}   // lists for source fields
  initialNodes={nodes}
  initialEdges={edges}
/>

Read only

Preview
TrueTrueError path: where errors of this node goError path: where errors of this node goError path: where errors of this node go
Every Monday

08:00

out
Overdue invoices?

msg.payload.overdue > 0

in
yesno
Tell finance

Email finance

in
Update the CRM

POST https://crm.example.com/api/overdue

in
100%
Code
<RulesetEditor readOnly catalog={catalog} initialNodes={nodes} initialEdges={edges} />

In another language

Preview
TrueTrueError path: where errors of this node goError path: where errors of this node goError path: where errors of this node go
Every Monday

08:00

out
Overdue invoices?

msg.payload.overdue > 0

in
yesno
Tell finance

Email finance

in
Update the CRM

POST https://crm.example.com/api/overdue

in
100%
Code
<RulesetEditor
  catalog={catalog}
  messages={{ paletteTitle: 'Blocktypen', toolUndo: 'Rückgängig', menuPaste: 'Einfügen' /* … */ }}
/>
// Any part of the bundle can be given; the rest stays English. See EditorMessages.

Version compare

Preview
TrueTrueTrueError path: where errors of this node goError path: where errors of this node goError path: where errors of this node goError path: where errors of this node go
Every Monday

08:00

out
Overdue invoices?

msg.payload.overdue > 5

in
yesno
Tell finance

Email finance

in
Tell accounting

POST https://accounting.example.com/api/overdue

in
Update the CRM

POST https://crm.example.com/api/overdue

in
100%
Code
import { diffView } from '@/modules/app/RulesetEditor';

// both versions in one graph: what was removed comes back at its old place
const view = diffView(deployedGraph, draftGraph);
<RulesetEditor readOnly catalog={catalog} initialNodes={view.nodes} initialEdges={view.edges} diffTint={view.tint} />
// view.diff is the change list per block and field (diffFlows, the router's flowlib diff)
Sourcemodules/app/RulesetEditor/RulesetEditor/index.tsx