Dashboard
The FlowOrchestrator dashboard is an embedded REST API + single-page application served directly from your ASP.NET Core app. No separate server or deployment is required.
Setup
dotnet add package FlowOrchestrator.Dashboard
// In Program.cs
builder.Services.AddFlowDashboard(builder.Configuration);
var app = builder.Build();
app.MapFlowDashboard("/flows"); // SPA at /flows, API at /flows/api/**
AddFlowDashboard has three overloads:
// From IConfiguration — reads FlowDashboard section from appsettings.json
builder.Services.AddFlowDashboard(builder.Configuration);
// Inline configuration via delegate
builder.Services.AddFlowDashboard(options =>
{
options.Title = "OrderHub";
options.BasicAuth.Username = "admin";
options.BasicAuth.Password = "secret";
});
// No arguments — defaults only (no auth, default title)
builder.Services.AddFlowDashboard();
Configuration
{
"FlowDashboard": {
"Title": "OrderHub Workflows",
"Subtitle": "Production",
"LogoUrl": "/images/logo.png",
"BasicAuth": {
"Enabled": true,
"Username": "admin",
"Password": "changeme"
}
}
}
| Option | Default | Description |
|---|---|---|
Title |
"FlowOrchestrator" |
Browser tab title and navbar heading |
Subtitle |
— | Small label next to the title (e.g. environment name) |
LogoUrl |
— | URL of a custom logo image |
BasicAuth.Enabled |
false |
Enable HTTP Basic Auth on all dashboard routes |
BasicAuth.Username |
— | Required when BasicAuth.Enabled = true |
BasicAuth.Password |
— | Required when BasicAuth.Enabled = true |
Dashboard Pages
Overview
Landing page showing run statistics: total runs, active runs, succeeded today, failed today.
Flows
Lists all registered flows. Each row shows flow name, version, last run status, trigger types, and enabled/disabled state.
Click a flow to open the detail view:
- Manifest details: triggers, step list, DAG graph visualization
- Enable/Disable toggle
- Trigger button (manual trigger)
- Recent runs table
Runs
Filterable list of all flow runs with columns for flow name, status, trigger, start/end times.
Filter parameters:
- Flow (dropdown)
- Status (Pending / Running / Succeeded / Failed / Cancelled / TimedOut)
- Search (free text)
Click a run to open the run timeline:
- Step-by-step execution timeline with status badges (
Succeeded,Failed,Running,Pending,Blocked— step could not run because a dependency did not meet itsrunAftercondition) - Input/output JSON for each step
- Retry button on failed steps
- Cancel button for running steps
Scheduled
Lists all Hangfire recurring jobs registered by cron triggers.
Actions per job:
- Trigger Now — fires the job immediately outside of the schedule
- Pause / Resume — suspends or resumes the recurring schedule
- Edit Cron — inline cron expression editor (persisted when
Scheduler.PersistOverrides = true)
REST API Reference
All endpoints are under the base path configured in MapFlowDashboard. Examples below use /flows as the base.
Flow Catalog
| Method | Path | Description |
|---|---|---|
GET |
/flows/api/flows |
List all registered flows |
GET |
/flows/api/flows/{id} |
Get flow definition and manifest |
POST |
/flows/api/flows/{id}/trigger |
Manually trigger a flow |
POST |
/flows/api/flows/{id}/enable |
Enable the flow and restore cron jobs |
POST |
/flows/api/flows/{id}/disable |
Disable the flow and remove cron jobs |
GET |
/flows/api/handlers |
List registered step handler type names |
Webhook Endpoint
POST /flows/api/webhook/{webhookSlug}
Content-Type: application/json
X-Webhook-Key: {secret} (required if webhookSecret was configured)
Idempotency-Key: {unique-key} (optional — prevents duplicate runs)
{ ...trigger payload... }
Run Monitoring
| Method | Path | Description |
|---|---|---|
GET |
/flows/api/runs |
List runs — queryable: ?flowId=, ?status=, ?search=, ?skip=, ?take= |
GET |
/flows/api/runs/active |
List currently-running runs |
GET |
/flows/api/runs/stats |
Aggregate statistics for the dashboard overview |
GET |
/flows/api/runs/{id} |
Run detail with trigger headers/body |
GET |
/flows/api/runs/{id}/steps |
All step details for a run |
GET |
/flows/api/runs/{runId}/events |
Event stream for the run (requires EnableEventPersistence = true) |
GET |
/flows/api/runs/{runId}/control |
Timeout, cancellation, idempotency state |
POST |
/flows/api/runs/{runId}/cancel |
Request cooperative cancellation |
POST |
/flows/api/runs/{runId}/steps/{stepKey}/retry |
Retry a failed step |
Realtime Event Stream (SSE)
| Method | Path | Description |
|---|---|---|
GET |
/flows/api/events/stream |
Server-Sent Events stream of run / step lifecycle events |
The dashboard SPA subscribes to this endpoint via EventSource; state
changes (run.started, step.completed, step.retried, run.completed)
are pushed within milliseconds of the engine recording them. Polling
runs only as a fallback when the stream stalls (>20 s without events,
or 3+ failed reconnects) and stops on the next live event.
- Content-Type:
text/event-stream; charset=utf-8 - No compression: Brotli/Gzip would buffer chunks; the endpoint always writes uncompressed.
- Heartbeat: every 15 s as a comment line — beats nginx's 60 s and Azure Front Door's 240 s default proxy idle timeouts.
- Filter:
?runId={guid}scopes the stream to a single run for the detail page.
Custom realtime consumers (log sinks, custom UIs, Slack notifiers) can
implement IFlowEventNotifier from FlowOrchestrator.Core.Notifications
and replace the dashboard's broadcaster registration. The default
NoopFlowEventNotifier makes apps without the dashboard pay zero overhead.
Schedule Management
| Method | Path | Description |
|---|---|---|
GET |
/flows/api/schedules |
List Hangfire recurring jobs |
POST |
/flows/api/schedules/{jobId}/trigger |
Trigger a recurring job immediately |
POST |
/flows/api/schedules/{jobId}/pause |
Pause a recurring job |
POST |
/flows/api/schedules/{jobId}/resume |
Resume a paused recurring job |
PUT |
/flows/api/schedules/{jobId}/cron |
Update the cron expression |
Retry a Failed Step
From the dashboard, open a failed run and click Retry on the failed step. This calls:
POST /flows/api/runs/{runId}/steps/{stepKey}/retry
FlowOrchestrator resets the step to Pending, preserves all prior step outputs, and re-dispatches the step via the runtime adapter from the failure point. Steps that already succeeded are not re-executed.
Cancel a Running Flow
POST /flows/api/runs/{runId}/cancel
Sets a cancellation flag. The next execution of this run by the runtime adapter picks up the flag and the CancellationToken in IExecutionContext is cancelled. Step handlers that check ctx.CancellationToken will stop gracefully. The run is marked Cancelled after the in-flight step completes.