Custom components let you extend Nodlyn with your own workflow nodes — proprietary APIs, internal protocols, or business logic — as .NET plugins. Built plugins appear in the Studio palette under the Custom section, with Inspector settings generated automatically from your schema.
When to use
- Wrap an internal REST API or legacy system not covered by built-in connectors.
- Package domain-specific validation or transformation reusable across workflows.
- Ship proprietary logic to customers inside an exported runtime agent (DLLs in
plugins/custom/are bundled automatically).
Official sample project
Start from the reference plugin on GitHub — full source, three example nodes, and step-by-step comments:
Nodlyn.CustomComponent on GitHub
git clone https://github.com/nodlyn-dev/custom-component.git
cd custom-component/Nodlyn.CustomComponent
dotnet build -c Release
The sample includes:
| Node | Node type | Type | What it demonstrates |
|---|---|---|---|
| Hello World | custom.example.helloWorld | Action | Settings, outputs, minimal executor. |
| Text Transform | custom.example.textTransform | Transform | Reading pipeline input, passing data downstream. |
| Number Check | custom.example.numberCheck | Condition | Threshold comparison, true/false branching. |
How plugins work
- At startup, Nodlyn scans
plugins/custom/for*.dllfiles. - Each DLL may define a Connector Definition (
DeviceConnectorDefinition) and one or more Executors (CapabilityExecutor). - Capabilities become draggable nodes; node type is
{ConnectorId}.{CapabilityId}(e.g.custom.example.helloWorld). - Executors run when the node executes — same engine path as built-in connectors.
Plugins load in an isolated assembly context. A invalid DLL is logged and skipped; other plugins still load. There is no hot reload — restart Studio or the runtime agent after deploying changes.
Quick start (deploy sample)
- Build the sample (see above). Output DLL:
Nodlyn.CustomComponent/bin/Release/net8.0/Nodlyn.CustomComponent.dll - Copy to your Nodlyn install:
plugins/custom/Nodlyn.CustomComponent.dll - Restart the platform (Studio API or runtime agent).
- Open the workflow editor — nodes appear under Custom → Example Plugin.
Build your own plugin
1. Connector definition
Create a class extending DeviceConnectorDefinition. Declare identity and capabilities (Inspector fields, security level, inputs/outputs):
- ConnectorId — globally unique, e.g.
custom.mycompany - DisplayName, Icon, Color, Description — palette appearance
- Capabilities — list of
CapabilityContractentries withCapabilityId, settings schema,CapabilityType
2. Executor
Create a class extending CapabilityExecutor with matching ConnectorId and CapabilityId:
- Read settings from
node.Settings(Inspector labels map to setting names). - Read upstream data via
ResolveInput(node, context). - Return
StepOutcome.Ok(...)with output object for downstream nodes. - For side effects (HTTP, hardware), honour Dry Run via
context.ExecutionMode.
3. Project rules
| Rule | Detail |
|---|---|
| References | Reference Nodlyn.Core only — not Nodlyn.Api or Nodlyn.Connectors. |
| Constructors | Parameterless constructors required (loaded via Activator.CreateInstance). |
| Unique IDs | ConnectorId and each CapabilityId must not collide with built-in or other plugins. |
| Validation | If any type in the DLL fails validation, the entire plugin is rejected. |
| Restart | Deploy DLL → restart — no hot reload. |
Inspector setting types
| Type | UI control |
|---|---|
text | Single-line input |
number | Numeric input |
toggle | On/off switch ("true" / "false") |
select | Dropdown with Options |
textarea | Multi-line text |
Capability types
| Type | Use for |
|---|---|
Action | Operations with side effects |
Condition | True/false branching |
Transform | Reshape pipeline data |
Trigger | Start workflow from external events |
FlowControl | Delays, forks, merges |
Security levels
| Level | Behaviour |
|---|---|
| Safe | No special permission |
| Sensitive | Credential or confirmation |
| Dangerous | Operator approval before execution |
| ArmedRequired | Approval plus arm signal (two-person rule) |
Sample node — Hello World properties
From Nodlyn.CustomComponent (Inspector labels):
| Property | Type | Description |
|---|---|---|
| Your Name | text | Name to greet. Required. |
| Greeting Style | select | Friendly, Formal, or Casual. |
| Include Timestamp | toggle | Append ISO timestamp to output. |
Outputs: message, greetedAt (when timestamp enabled).
Runtime export
When you export a runtime agent, any DLL present in Studio’s plugins/custom/ at export time is copied into the ZIP under plugins/custom/. The headless runtime loads them the same way — custom nodes work on edge deployments without Studio installed.
If a workflow references a custom node but the DLL is missing on the target machine, Studio shows a missing-component banner until the plugin is deployed.
Related samples on GitHub
- Nodlyn.CustomComponent — plugin template (Action, Transform, Condition)
- RuntimeIngressConsumer — external HTTP/MQTT/file consumer for deployed agents (not a palette plugin)
See also
- Runtime Export
- Dry Run
- Approval & Arm Gates
- AI Workflow Assistant — can help design workflows that use your custom nodes