The open specification for describing executable event-driven flow graphs.
Nodes define business logic. Edges define delivery semantics. The runtime enforces guarantees.
FlowDSL is a sibling specification to OpenAPI and AsyncAPI, focused on a different concern: orchestration topology, edge delivery policies, and runtime execution semantics.
- OpenAPI describes HTTP interfaces
- AsyncAPI describes event and message interfaces
- FlowDSL describes executable flow graphs and runtime guarantees
Most flow tools force you to choose one transport for everything. FlowDSL lets each edge in your graph define its own delivery semantics — so a high-throughput pipeline can use direct in-process handoff between cheap steps, Redis streams for burst smoothing, durable MongoDB queues for expensive LLM calls, and Kafka for external publication — all in a single, readable document.
edges:
- from: rule_filter
to: dns_check
delivery:
mode: direct # fast, in-process — no persistence needed
batching:
batchSize: 1000
- from: score_preselect
to: llm_analysis
when: "output.name == 'DomainShortlisted'"
delivery:
mode: durable # expensive stage — must survive restart
store: mongo
retryPolicy:
$ref: "#/components/policies/llmExpensiveRetry"
- from: llm_analysis
to: publish_results
delivery:
mode: stream # publish to external systems via Kafka
stream:
bus: kafka
topic: domains.analyzed| Mode | Durability | Replay | Restart-safe | Best for |
|---|---|---|---|---|
direct |
none | no | no | fast local transforms |
ephemeral |
low | limited | limited | burst smoothing (Redis) |
checkpoint |
stage-level | yes | yes from boundary | high-throughput stages |
durable |
packet-level | yes | yes | business-critical transitions |
stream |
durable stream | yes | yes | external integration, fan-out |
The FlowDSL specification is defined as a JSON Schema:
schemas/
flowdsl.schema.json # Core FlowDSL JSON Schema (Draft-07)
FlowDSL documents can be written in JSON (canonical) or YAML (human-readable). The JSON form is always the source of truth for validation and tooling.
.flowdsl.json.flowdsl.yaml/.flowdsl.yml
flowdsl: "1.0.0"
info:
title: My First Flow
version: "1.0.0"
externalDocs:
asyncapi: /asyncapi.json
flows:
my_flow:
entrypoints:
- message:
$ref: "asyncapi#/components/messages/OrderPlaced"
nodes:
validate_order:
operationId: validate_order
title: Validate Order
kind: transform
runtime:
language: python
handler: app.nodes.orders.ValidateOrderNode
invocation: http
inputs:
- message:
$ref: "asyncapi#/components/messages/OrderPlaced"
outputs:
- name: OrderValid
message:
$ref: "#/components/packets/ValidOrderPacket"
notify_fulfillment:
operationId: notify_fulfillment
title: Notify Fulfillment
kind: action
runtime:
language: go
handler: app.nodes.orders.NotifyFulfillmentNode
invocation: proc
inputs:
- name: OrderValid
message:
$ref: "#/components/packets/ValidOrderPacket"
outputs: []
edges:
- from: validate_order
to: notify_fulfillment
when: "output.name == 'OrderValid'"
delivery:
mode: durable
store: mongo
components:
packets:
ValidOrderPacket:
type: object
required: [orderId, total]
properties:
orderId: { type: string }
total: { type: number }examples/
domain-pipeline.flowdsl.json # High-throughput domain drop catch pipeline
domain-pipeline.flowdsl.yaml # Same pipeline in YAML
High-throughput pipeline processing 1M+ expiring domains daily. Demonstrates direct, ephemeral, durable, and stream delivery modes in a single flow.
Stateful workflow for email processing with priority routing, SMS alerts, and LLM summarization. All edges use durable for full restart safety.
FlowDSL nodes can be implemented in any supported language:
| Language | Invocation modes |
|---|---|
go |
proc, http, kafka |
python |
http, kafka |
nodejs |
http, kafka |
FlowDSL references AsyncAPI message schemas instead of duplicating them:
inputs:
- message:
$ref: "asyncapi#/components/messages/DomainExpiredPayload"Point FlowDSL to your AsyncAPI document via externalDocs.asyncapi.
| Project | Description |
|---|---|
| FlowDSL (this repo) | Open specification + JSON Schema |
| FlowDSL Studio | Visual editor and flow canvas |
| Node Catalog | Community and premium node marketplace (coming soon) |
| Cloud Service | Managed workflow hosting — deploy and run flows (coming soon) |
| redelay | Python/FastAPI framework with native FlowDSL integration |
flowdsl/
├── schemas/
│ └── flowdsl.schema.json # Core JSON Schema (Draft-07)
├── examples/
│ ├── domain-pipeline.flowdsl.json
│ ├── domain-pipeline.flowdsl.yaml
│ └── email-workflow.flowdsl.yaml
├── docs/
│ ├── specification.md # Full specification reference
│ ├── concepts.md # Core concepts guide
│ ├── delivery-modes.md # Delivery mode reference
│ └── integrations/
│ ├── asyncapi.md
│ ├── redelay.md
│ └── go-events.md
├── CHANGELOG.md
├── CONTRIBUTING.md
└── README.md
FlowDSL follows semantic versioning. The current version is 1.0.0 (draft).
Schema URL: https://flowdsl.com/schemas/v1/flowdsl.schema.json
FlowDSL is open source under the Apache 2.0 license. Contributions welcome — see CONTRIBUTING.md.
Apache 2.0 — see LICENSE.