Portal Community

Opening the Palette

The palette lives in the Left Toolbar. Click the toolbar edge icon (or press N when the canvas has focus) to expand the palette drawer. It stays open until you click elsewhere or close it manually.

How the Palette Is Built

Node types are loaded from the backend API on application startup:

// nodeTypeApiClient.ts
GET /api/v1/flow-studio/node-types
→ NodeType[]

// Result is cached in:
workflowStore.nodeTypes: Map<string, NodeType>

The palette groups node types by their category field into collapsible sections. Each section is sorted alphabetically by displayName.

Node Categories

CategoryShapeNode Types
TriggerCirclemanual-trigger, webhook-trigger, schedule-trigger, form-trigger
LogicDiamondif-condition, switch, filter, loop, break, continue, try-catch
User InteractionRectangle (rounded)form, chat, chat-receive, approval
DataRectanglevariable-assignment, json-transform, data-mapping, merge, split, aggregate
IntegrationRectangle (icon)http-request, graphql, database nodes (MySQL, PostgreSQL, SQL Server, MongoDB, Redis)
NotificationRectangle (icon)send-email, slack-message, teams-message, discord-message
FileRectangle (icon)read-file, write-file, delete-file
AISpecial multi-handleai-agent, openai-llm, anthropic-chat, sub-workflow, parallel-fork, parallel-join

Node Card Anatomy

Each node in the palette is displayed as a card with:

The NodeFactoryService

When you drag a node from the palette to the canvas, NodeFactoryService.createNode() is called to construct a WorkflowNode instance from the NodeType template:

// NodeFactoryService.ts
createNode(nodeType: NodeType, position: XYPosition): WorkflowNode {
  return {
    id: generateId(),
    type: nodeType.typeCode,
    position,
    data: {
      label: nodeType.displayName,
      config: { ...nodeType.defaultConfig },
      ports: nodeType.portDefinitions
    }
  };
}