FluxFlow.Engine 0.3.0-alpha.1

This is a prerelease version of FluxFlow.Engine.
There is a newer version of this package available.
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
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="FluxFlow.Engine" Version="0.3.0-alpha.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="FluxFlow.Engine" Version="0.3.0-alpha.1" />
                    
Directory.Packages.props
<PackageReference Include="FluxFlow.Engine" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add FluxFlow.Engine --version 0.3.0-alpha.1
                    
#r "nuget: FluxFlow.Engine, 0.3.0-alpha.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package FluxFlow.Engine@0.3.0-alpha.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=FluxFlow.Engine&version=0.3.0-alpha.1&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=FluxFlow.Engine&version=0.3.0-alpha.1&prerelease
                    
Install as a Cake Tool

FluxFlow.Engine

Package Version Package Downloads

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:

  1. Implementing IFlowNode for each external capability
  2. Registering node factories with RuntimeNodeFactoryRegistry
  3. 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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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.