High-level architecture
FlowDrop is a frontend library that communicates with your backend via REST.Module structure
FlowDrop is tree-shakable. Each sub-module has different dependencies and bundle cost:Component hierarchy
When you mountmountFlowDropApp(), this is the component tree:
mountWorkflowEditor() mounts just the canvas — no navbar, no sidebar.
Each mount produces one such tree backed by its own instance; node/field
registries and settings are shared across all trees on the page.
Stores
FlowDrop uses Svelte 5 runes for state management. Each mount creates a per-instanceFlowDropInstance container that holds these stores:
Instance model
Every mount creates an isolatedFlowDropInstance container holding the stores
above (workflow, history, playground, interrupts, categories, port coordinates,
and pipeline-panel state), resolved through Svelte context. Multiple editors can
therefore coexist on one page without sharing state.
See the multiple instances guide for details.
Services
Services handle communication and side effects:Data flow
Here’s what happens when a user makes a change: When the user saves:Registry system
FlowDrop has two registries for extending the editor:Node component registry
Register custom Svelte components for new node types against the instance’sfd.nodes registry:
Field component registry
Register custom form fields for config schemas againstfd.fields:
getInstance(). You can register after mounting.
Why registration works after mount
Why registration works after mount
BaseRegistry tracks a version counter that invalidates dependent $derived
reads, so registrations made after mount still take effect.Next steps
- What is a Workflow? — the mental model
- Quick Start — mount FlowDrop in your app
- Backend Implementation — build the API FlowDrop expects
- Event System — hook into every lifecycle event