Workflows & the DSL
A workflow is a directed acyclic graph (DAG) of steps, each backed by a node type, started by a trigger. Internally every workflow is represented as a JSON document called the DSL (pkg/dsl.WorkflowDSL). The visual canvas reads and writes this document; you can also create or edit it directly via the API, import/export it as a .goagents.json file, or generate it from a natural-language prompt.
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..output...}}.
Triggers
Every workflow has exactly one trigger (dsl.Trigger), defining how an execution starts. The trigger's type and config are stored on the workflow DSL; OrcFlows wires up the corresponding webhook route, Temporal Schedule, or poller automatically when the workflow is enabled.
Executions & Monitoring
Every time a workflow runs — whether triggered manually, by webhook, by schedule, or by an event poller — OrcFlows creates an execution: a Temporal workflow run plus a row in the executions table tracking its status, trigger data, input/output, and timing.
Human-in-the-Loop
Some workflows shouldn't proceed without a person's sign-off — sending a high-value email, deploying code, refunding a customer. OrcFlows supports this natively with approval steps that pause a running workflow indefinitely (durably, via Temporal signals) until a human approves or rejects.
AI Agents & Tools
OrcFlows has AI built into the workflow engine, not bolted on as a separate product. The agent node runs a full ReAct (reason + act) loop — powered by the Eino agent framework — as a single durable Temporal activity, with access to dozens of tools, persistent memory, your knowledge bases, and any other connector.
Knowledge Bases
A Knowledge Base (KB) is a per-tenant collection of documents that are chunked, embedded, and made searchable for Retrieval-Augmented Generation (RAG) — used by the query-kb node and the kb_search agent tool.
Skills
A Skill is a reusable, named capability an AI agent can invoke — modeled on Anthropic's Agent Skills format (a SKILL.md file plus optional scripts/ and references/ directories). Skills let you package domain-specific instructions, helper scripts, and reference material that an agent loads only when it actually needs them ("progressive disclosure"), keeping the system prompt small until a skill is invoked.
Secrets & Credentials
Workflows and agents need credentials — LLM API keys, database passwords, third-party API tokens, OAuth access tokens. OrcFlows stores all of these encrypted in PostgreSQL and resolves them into workflow expressions and connector calls at execution time. They are never written to logs or execution history in plaintext.
Teams, Organizations & Roles
OrcFlows is multi-tenant from the ground up. Every workflow, secret, connector connection, knowledge base, and execution belongs to exactly one tenant (workspace). On top of tenants, an optional organization layer groups multiple tenants for enterprise customers.
Billing & Plans
OrcFlows has a built-in plan ladder enforced at the application layer, with optional Stripe integration for self-serve upgrades.
Telephony & Phone Calls
OrcFlows can place and receive real phone calls and put an AI voice agent (speech-to-text → LLM → text-to-speech) on the line. This runs on LiveKit SIP — the same infrastructure used for production voice AI.
AI Workflow Generator
Instead of building a workflow node-by-node, describe it in plain English and let an LLM generate a complete, valid WorkflowDSL.
Deploying Workflows
Beyond internal automation, any workflow can be exposed as a public API endpoint, a chat widget, or run in bulk over a dataset for evaluation.
The Visual Canvas
The workflow editor is a drag-and-drop canvas built with SvelteKit, Svelte 5 runes, and SvelteFlow (XYFlow). It's a direct visual editor for the underlying DSL — every action on the canvas maps to a change in the workflow's JSON definition, and vice versa (paste/import a DSL and the canvas renders it).