FluxFlow.Engine
0.3.0-alpha.1
See the version list below for details.
dotnet add package FluxFlow.Engine --version 0.3.0-alpha.1
NuGet\Install-Package FluxFlow.Engine -Version 0.3.0-alpha.1
<PackageReference Include="FluxFlow.Engine" Version="0.3.0-alpha.1" />
<PackageVersion Include="FluxFlow.Engine" Version="0.3.0-alpha.1" />
<PackageReference Include="FluxFlow.Engine" />
paket add FluxFlow.Engine --version 0.3.0-alpha.1
#r "nuget: FluxFlow.Engine, 0.3.0-alpha.1"
#:package FluxFlow.Engine@0.3.0-alpha.1
#addin nuget:?package=FluxFlow.Engine&version=0.3.0-alpha.1&prerelease
#tool nuget:?package=FluxFlow.Engine&version=0.3.0-alpha.1&prerelease
FluxFlow.Engine
A protocol-neutral, dataflow-based workflow engine for .NET.
Define graphs of typed processing nodes in JSON, build them into live TPL Dataflow networks, and drive them through a phase-ordered lifecycle — without any protocol-specific dependencies.
┌─────────────────────────────────────────────────────────────────────┐
│ ApplicationDefinition (JSON or code) │
│ ┌─────────────┐ ┌────────────────────────────────────────────┐ │
│ │ resources │ │ workflows.main │ │
│ │ ────────── │ │ ──────────────────────────────────────────│ │
│ │ shared │ │ source ──→ filter ──→ mapper ──→ sink │ │
│ └─────────────┘ └────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
│
▼ ApplicationRuntimeBuilder.Build()
┌─────────────────────────────────────────────────────────────────────┐
│ ApplicationRuntime (live TPL Dataflow graph) │
│ StateChanges ── ISourceBlock<ApplicationStateChanged> │
│ Events ── ISourceBlock<FlowEvent> │
└─────────────────────────────────────────────────────────────────────┘
Features
| Feature | Description |
|---|---|
| Typed ports | InputPort<T> / OutputPort<T>; type mismatches are caught at build time |
| Reliable fan-out | Runtime-owned output delivery sends each item to every linked input |
| Phase-ordered startup | Nodes declare a phase integer; the runtime starts lower phases first |
| Completion propagation | Entry nodes drive completion through the whole graph |
| State streams | ApplicationRuntime.StateChanges and Workflow.StateChanges are ISourceBlock<T> |
| Event stream | ApplicationRuntime.Events aggregates FlowEvent from every IFlowEventSource node |
| Diagnostics stream | FlowApplicationHost.Diagnostics and ApplicationRuntime.Diagnostics aggregate node health, status, and metric diagnostics |
| Expression mapping | Built-in DynamicExpresso (C#) and JSONata engines behind IFlowExpressionEngine |
| Node authoring helpers | Base classes and a fluent node builder reduce factory and port boilerplate |
| JSON definitions | Full round-trip via ApplicationDefinitionJson.CreateSerializerOptions() |
| Host lifecycle | FlowApplicationHost owns build → start → stop → dispose |
Quick start
1. Implement a node
using FluxFlow.Engine.Components;
using FluxFlow.Engine.Runtime;
public sealed class NumberSource : SourceFlowNode<int>
{
public static RuntimeNode Create(RuntimeNodeFactoryContext ctx)
{
var node = new NumberSource();
return ctx.CreateNode(node)
.Output("Output", node.OutputBlock)
.Build();
}
public override async Task StartAsync(CancellationToken ct = default)
{
for (var i = 0; i < 10; i++)
await SendOutputAsync(i, ct);
CompleteOutput();
}
}
Use SinkFlowNode<T>, TransformFlowNode<TInput,TOutput>, MapFlowNode<TInput,TOutput>,
and EventFlowNodeBase when those shapes fit. Direct IFlowNode implementations
still work when a node needs full control.
Nodes derived from FlowNodeBase can also emit operational diagnostics:
TryEmitDiagnostic(
"demo.node.ready",
FlowDiagnosticLevel.Information,
"Node is ready.");
The runtime labels each diagnostic with the node address, id, phase, and type.
Use diagnostics for health, status, counters, and live monitoring data. Use
FlowEvent for workflow/domain activity.
Subscribe to FlowApplicationHost.Diagnostics before StartAsync when startup
diagnostics matter:
var diagnostics = new BufferBlock<RuntimeFlowDiagnostic>();
host.Diagnostics.LinkTo(diagnostics, new DataflowLinkOptions { PropagateCompletion = true });
var result = await host.StartAsync();
2. Define the graph in JSON
{
"workflows": {
"main": {
"source": { "type": "demo.numbers" },
"sink": { "type": "demo.printer", "Input": "source.Output" }
}
}
}
3. Register, build, run
var registry = new RuntimeNodeFactoryRegistry();
registry.Register(new NodeType("demo.numbers"), NumberSource.Create);
registry.Register(new NodeType("demo.printer"), PrinterNode.Create);
var json = File.ReadAllText("flow.json");
var opts = ApplicationDefinitionJson.CreateSerializerOptions();
var definition = JsonSerializer.Deserialize<ApplicationDefinition>(json, opts)!;
var host = FlowApplicationHost.Create(definition, registry);
var result = await host.StartAsync();
if (!result.IsSuccess)
foreach (var e in result.Errors) Console.WriteLine(e.Message);
await host.StopAsync();
await host.DisposeAsync();
Documentation
The package README is the current public entrypoint. The full docs set is being rebuilt around the standalone package boundary; see docs/README.md for status.
Building
dotnet build FluxFlow.sln
dotnet test FluxFlow.sln
License
FluxFlow.Engine is licensed under the MIT License.
Extension boundary
FluxFlow.Engine does not ship transport, storage, web, or designer components. Applications add those behaviors by:
- Implementing
IFlowNodefor each external capability - Registering node factories with
RuntimeNodeFactoryRegistry - Composing flows as JSON that FluxFlow.Engine builds and runs
Component packages should own their own options, validation, event names, tests, and documentation.
Applications are free to keep richer workspace files with dashboards, tests,
connections, or UI state. Project only the executable resources and workflows
into ApplicationDefinition before building the engine runtime.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- DynamicExpresso.Core (>= 2.19.3)
- Jsonata.Net.Native (>= 3.0.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.7)
-
net8.0
- DynamicExpresso.Core (>= 2.19.3)
- Jsonata.Net.Native (>= 3.0.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.7)
- System.Threading.Tasks.Dataflow (>= 9.0.4)
NuGet packages (4)
Showing the top 4 NuGet packages that depend on FluxFlow.Engine:
| Package | Downloads |
|---|---|
|
FluxFlow.Fluent
Type-safe, code-first fluent DSL for composing FluxFlow standalone nodes into a runnable graph — Flow.From(source).Then(node).To(sink) with compile-time-checked wiring, branching, and fan-in. Reuses the FluxFlow.Composition runtime. |
|
|
FluxFlow.Engine.DurableInput
Optional provider-neutral durable input delivery for FluxFlow.Engine with leased at-least-once dispatch. |
|
|
FluxFlow.Engine.DurableOutput
Optional provider-neutral durable output capture, renewable leased at-least-once delivery, and dead-letter operations for FluxFlow.Engine. |
|
|
FluxFlow.Engine.HealthChecks
Optional standard .NET readiness health check for FluxFlow application lifecycle and revision state. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 9.0.0-rc.2 | 169 | 9/5/2026 |
| 8.0.0-rc.1 | 208 | 8/9/2026 |
| 7.0.0 | 349 | 8/3/2026 |
| 2.0.2 | 133 | 7/3/2026 |
| 2.0.1 | 137 | 7/2/2026 |
| 2.0.0 | 128 | 6/19/2026 |
| 1.3.0 | 577 | 6/17/2026 |
| 1.2.0 | 380 | 6/15/2026 |
| 1.1.0 | 983 | 6/12/2026 |
| 1.0.1 | 1,279 | 6/5/2026 |
| 1.0.0 | 1,155 | 6/2/2026 |
| 0.6.0-beta.1 | 85 | 6/2/2026 |
| 0.5.0-alpha.1 | 370 | 5/31/2026 |
| 0.4.0-alpha.1 | 97 | 5/31/2026 |
| 0.3.0-alpha.1 | 80 | 5/31/2026 |
| 0.2.0-alpha.1 | 83 | 5/31/2026 |
| 0.1.0-alpha.1 | 78 | 5/31/2026 |
Renames flow event route metadata to channel for a neutral event API.