Skip to main content

Nodes

A node is the unit of work in a workflow step. Every node implements a common Go interface (internal/nodes.Node) — Type() returns its DSL identifier (e.g. "http", "llm", "slack-send") and Execute(ctx, config, inputs) runs it as a Temporal activity, returning an output map that downstream steps can reference via {{steps.<id>.output...}}.

OrcFlows ships 70+ built-in node types, organized into the categories below. Full configuration options, inputs, and output shapes for every node are in the Node Reference.

Categories

Triggers & control flow

DAG control: condition, switch, loop, batch, merge, delay, timer, subworkflow, test-runner, webhook_response. These let you branch, loop over collections, fan-in/fan-out, pause, call other workflows, assert outputs, and shape webhook responses.

Data transformation

General-purpose data wrangling: transform, set, code (sandboxed JS/Python), csv, xml, graphql, datetime, math-helper, text-helper, text_splitter, data-summarizer, crypto, compression, qrcode, html_extract.

HTTP, files & storage

Generic connectivity and I/O: http, connector (the universal node for any of the 60+ connectors), grpc-action, sftp, store, file-helper, neo4j.

AI & agents

The AI runtime: llm, agent (tool-using AI agent with memory), orchestrator (multi-agent supervisor), condition_agent (LLM-powered branching), query-kb (RAG retrieval), ai-search, vision. See AI Agents & Tools.

Documents & media

File and media processing: document (PDF/OCR/HTML/vision extraction), pdf, spreadsheet, image-gen, image-helper, tts, stt.

Communication & messaging

Channel-specific send/read actions: slack-send, slack-list-channels, slack-get-history, slack-add-reaction, telegram-send, telegram-get-updates, telegram-get-chat, whatsapp-send, instagram-send, twitter-send, teams-send, teams-list-teams, teams-list-channels, teams-list-chats, email-send, rss.

DevOps

ansible — run Ansible playbooks against inventory as a workflow step.

LiveKit & voice agents

Real-time audio/video: livekit-room, livekit-token, livekit-dispatch, livekit-ingress, livekit-egress, livekit-sip, livekit-data-send, livekit-voice-session, livekit-voice-agent, livekit-cold-call. See the LiveKit & Voice Agents node reference page.

The Connector node

Most third-party integrations (Slack, GitHub, Gmail, Stripe, databases, ad platforms, etc.) aren't separate node types — they're a single connector node configured with a connector_type (e.g. "tool-github") and an action. The connector system (internal/connectors) exposes the same tool set both as workflow node actions and as agent tools, so an AI agent can call the exact same GitHub/Slack/Stripe operations a workflow step can. See the Connector Reference for every connector and its actions.

Writing custom nodes

There are two ways to add your own node types:

  • In Go — implement the nodes.Node interface, register via init(), and wire up the editor metadata. First-class: full runtime access, available to all tenants, can double as an AI agent tool. The complete walkthrough — interface, conventions, frontend registration points, testing, checklist — is in Building Nodes in Go, with a copy-paste starter at examples/custom-node/.
  • Declaratively (no code) — define a node in the Custom Nodes page (or POST /api/v1/custom-nodes): config fields, outputs, icon, color and an HTTP request template. It appears in the editor instantly for your workspace, no rebuild — the worker resolves custom-* types from the database at execution time.

Rule of thumb: prototype with a declarative node; graduate to Go when you need real logic, SDK clients, or want to ship to every tenant.

Next