Skip to content
@FlowDSL

FlowDSL

FlowDSL — a domain-specific language for executable event-driven flows. Sibling to OpenAPI & AsyncAPI. Spec · Studio · Runtime · Node Registry
FlowDSL

The open specification for executable event-driven flows.

Nodes define business logic. Edges define delivery semantics. The runtime enforces guarantees.


Spec v1.0.0 Apache 2.0 Discord Website


Where FlowDSL fits

Each specification describes a different layer of your system. FlowDSL completes the picture:

Spec Describes
OpenAPI HTTP interfaces — endpoints, request/response schemas
AsyncAPI Event contracts — channels, message payloads, brokers
FlowDSL Flow graphs — nodes, edges, delivery semantics, runtime guarantees

FlowDSL is fully self-contained. Events and packets are defined natively in components.events and components.packets. OpenAPI and AsyncAPI are optional integrations — your FlowDSL documents work without them.


What it looks like

A complete LLM email triage pipeline — classified, routed, and delivered with the right guarantees at each step:

flowdsl: "1.0.0"
info:
  title: Smart Email Triage
  version: "1.0.0"

flows:
  email_triage:
    nodes:
      email_fetcher:   { $ref: "#/components/nodes/EmailFetcherNode" }
      llm_classifier:  { $ref: "#/components/nodes/LlmClassifierNode" }
      intent_router:   { $ref: "#/components/nodes/IntentRouterNode" }
      email_sender:    { $ref: "#/components/nodes/EmailSenderNode" }
      slack_notifier:  { $ref: "#/components/nodes/SlackNotifierNode" }
    edges:
      - from: email_fetcher
        to: llm_classifier
        packet: "#/components/packets/IncomingEmail"
        delivery:
          mode: direct                # in-process, zero overhead

      - from: intent_router
        to: email_sender
        when: "output.category == 'support' || output.category == 'inquiry'"
        delivery:
          mode: durable          # business-critical — persisted to MongoDB
          store: mongo
          retryPolicy:
            $ref: "#/components/policies/emailRetry"

      - from: intent_router
        to: slack_notifier
        when: "output.priority == 'high'"
        delivery:
          mode: ephemeral        # burst smoothing via Redis
          backend: redis

components:
  events:
    EmailReceived:
      summary: A new email has been fetched from the inbox
      version: "1.0.0"
      entityType: email
      action: received
      payload: { $ref: "#/components/packets/IncomingEmail" }

The JSON document is always the source of truth — not the canvas, not the runtime config.


Five delivery modes. One document.

Stop hardcoding Kafka everywhere. Each edge in your flow declares exactly the delivery guarantee it needs:

Mode Transport Durability Best for
direct In-process None Fast transforms, cheap steps
ephemeral Redis / NATS / RabbitMQ Low Burst smoothing, worker pools
checkpoint Mongo / Redis / Postgres Stage-level High-throughput replay
durable Mongo / Postgres Packet-level Business-critical transitions
stream Kafka / Redis / NATS Durable stream External integration, fan-out

Ten node kinds

Every node in the registry has a semantic kind — the runtime uses it for scheduling, Studio uses it for color-coding:

Kind What it does
source Ingests external events — email, webhook, Kafka, Postgres
transform Reshapes and maps payloads
router Conditional fan-out to multiple downstream nodes
llm LLM inference — prompt → structured output
action External side effect — write, notify, publish
checkpoint Durable state persistence for replay
publish Event bus publisher
terminal Flow terminator / data sink
integration Third-party platform connector
subworkflow Delegates execution to a child FlowDSL workflow

The ecosystem

The canonical FlowDSL JSON Schema, node.proto gRPC contract, node manifest format, and 8 reference examples. Single source of truth — Studio and website consume spec artefacts directly.

Visual drag-and-drop editor built with React Flow. Bidirectional — the canvas and JSON panel stay in sync at all times. Validate, export, and configure delivery semantics visually.

The execution engine. Reads FlowDSL documents, invokes nodes via gRPC, and manages all five delivery guarantees across MongoDB, Redis, and Kafka.

Write nodes in Python. Includes BaseNode, a gRPC server scaffold, and first-class redelay framework integration.

Write nodes in TypeScript. Full NodeService gRPC implementation with streaming support.

Real-world flows — email triage, webhook alerts, Kafka stream filtering, DB anomaly detection, HTTP-to-Mongo sync, and domain enrichment pipelines.


Multi-language nodes via gRPC

Nodes can be written in Go, Python, or TypeScript. Cross-language invocation uses gRPC + Protobuf — no HTTP between nodes, no serialization overhead.

FlowDSL Runtime (Go)
  │
  ├── Go nodes      ── in-process (direct function call, zero overhead)
  ├── Python nodes  ── gRPC → flowdsl-nodes-py:50052
  └── JS/TS nodes   ── gRPC → flowdsl-nodes-js:50053

Every node implements the same NodeService interface — defined once in schemas/node.proto, consumed by all three language SDKs.


Node registry

Pre-built nodes are published at repo.flowdsl.com — the open registry for FlowDSL nodes.

{
  "id": "flowdsl/llm-analyzer",
  "kind": "llm",
  "language": "python",
  "runtime": {
    "invocation": "grpc",
    "grpc": { "port": 50052, "streaming": true }
  },
  "settingsSchema": {
    "properties": {
      "prompt":        { "type": "string" },
      "model":         { "enum": ["claude-sonnet-4-5", "gpt-4o", "gemini-1.5-pro"] },
      "outputFormat":  { "enum": ["text", "json"] }
    }
  }
}

Drag a node from the Studio catalog → fill in settings → connect edges. No boilerplate. No transport code.


Get started

# Validate an example against the schema
git clone https://github.com/flowdsl/spec
cd spec
npm install -g ajv-cli
ajv validate -s schemas/flowdsl.schema.json -d examples/email-triage.flowdsl.json

# Or clone the examples repo and spin up infrastructure
git clone https://github.com/flowdsl/examples
cd examples
make up-infra          # MongoDB · Redis · Kafka · ClickHouse
open http://localhost:5173   # FlowDSL Studio

Full tutorial → flowdsl.com/docs/getting-started


AI-native

FlowDSL docs ship with:

Connect your IDE to the FlowDSL knowledge base:

# Claude Code
claude mcp add --transport http flowdsl https://flowdsl.com/mcp

# Cursor — .cursor/mcp.json
{ "mcpServers": { "flowdsl": { "type": "http", "url": "https://flowdsl.com/mcp" } } }

Commercial layer

FlowDSL is Apache 2.0. The commercial products build on top:

Product What it is
Node Catalog (coming soon) Node marketplace — build, publish, and sell FlowDSL nodes
Cloud Infrastructure (coming soon) Managed FlowDSL workflow hosting for businesses

Contributing

Contributions are welcome across all repos. The best place to start is the spec:

git clone https://github.com/flowdsl/spec
cd spec

# Add a node manifest, write an example flow, improve the schema
# Then validate:
ajv validate -s schemas/flowdsl.schema.json -d examples/your-flow.flowdsl.json

CONTRIBUTING.mdGood first issuesDiscord


Website · Docs · Studio · Node Registry · Discord


Apache 2.0 · Built with love by the FlowDSL community

Pinned Loading

  1. spec spec Public

    The JSON Schema, examples, YAML format, and specification docs

    Makefile

Repositories

Showing 6 of 6 repositories

People

This organization has no public members. You must be a member to see who’s a part of this organization.

Top languages

Loading…

Most used topics

Loading…