Portal Community

The Five Layers

#LayerWhat to BuildTypeCode Role
1DatabaseNodeType record in the NodeTypes tableDefines the canonical typeCode
2Configuration FormAtlas Form for node settings (formId in NodeType)Linked by formId, not typeCode
3Frontend RendererReact class extending BaseNodeRenderer file (no typeCode coupling)
4Canvas RegistrationEntry in WorkflowCanvas.nodeTypesKey must equal typeCode exactly
5Backend ExecutorC# class implementing IProcessElementExecutionExecutor.TypeCode must equal typeCode

Complete Checklist

1 — Database: NodeType Record

2 — Atlas Form: Configuration UI

3 — Frontend: Custom Renderer (only if custom shape needed)

4 — Frontend: Canvas Registration

5 — Backend: Executor

TypeCode Must Match in All Three Places

// 1. NodeType DB record
typeCode: "send-slack-message"

// 2. WorkflowCanvas.tsx — nodeTypes key
const nodeTypes = {
  'send-slack-message': SlackMessageNode,  // <-- must match
}

// 3. Backend executor
public string TypeCode => "send-slack-message";  // <-- must match
TypeCode Is Immutable After Deploy Changing a typeCode after workflows have been saved will break every existing workflow that uses the node. The typeCode is stored in the ProcessElement records in the database. Treat it as a permanent identifier — plan carefully before committing.
Skipping the Custom Renderer If your node fits the rectangle, circle, or diamond shape exactly and needs no special visual behaviour, you can skip steps 3 and 4 entirely. Set shape in the NodeType DB record and the canvas will use the built-in renderer automatically. You still need the DB record, Atlas Form, and backend executor.