Your jobs, in view.

The dashboard is an optional Blazor WebAssembly client. Your browser renders the interface; Flywheel handles API requests and SignalR updates. You can run jobs without the dashboard.

Try the demo

With .NET 10 and Redis running at localhost:6379:

git clone https://github.com/soenneker/soenneker.flywheel.dashboard.git
cd soenneker.flywheel.dashboard
dotnet dev-certs https --trust
dotnet run --project test/Soenneker.Flywheel.Demo

Open https://localhost:7443 and sign in with admin / flywheel-demo. These credentials are for the local Development demo. Press Ctrl+C to stop it.

Find and inspect work

  1. Use the overview to search jobs and filter by state.
  2. Open a job to inspect its attempts, timing, and captured ILogger output.
  3. Open Scheduled for pending jobs and retries, or Recurring to inspect schedules and run one now.

Add it to your application

Install the package in a Blazor WebAssembly app:

dotnet add package Soenneker.Flywheel.Dashboard

Register the client in its Program.cs:

using Soenneker.Flywheel.Dashboard.Registrars;

builder.Services.AddScoped(_ => new HttpClient
{
    BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)
});
builder.Services.AddFlywheelDashboardAsScoped();

Use the WebAssembly demo for the host page, Quark styles, and router. Include the dashboard assembly in AdditionalAssemblies so its built-in pages resolve.

Connect the server

On the ASP.NET Core host, add dashboard services to your Flywheel registration:

.AddDashboard(options =>
{
    options.Username = builder.Configuration["Flywheel:Dashboard:Username"]!;
    options.PasswordHash = builder.Configuration["Flywheel:Dashboard:PasswordHash"]!;
})

Import Soenneker.Flywheel.Core.Registrars. Configure an ASP.NET Identity password hash, then map the authenticated API and SignalR hub. The complete sample server includes password hashing, authentication, rate limiting, and endpoint setup.

Serve the client and API over the same HTTPS origin. Static WebAssembly files can be delivered by a CDN or Cloudflare Worker, with API and WebSocket traffic routed to the ASP.NET Core backend. Static hosting alone does not run Flywheel or connect to Redis.

UI rendering stays in the browser. API queries and live updates still consume backend resources.

Built-in routes

RoutePage
/flywheelActivity and job search
/signinSign in
/flywheel/recurringRecurring schedules
/flywheel/scheduledPending jobs and retries
/jobs/{JobId}Execution details and logs

The default home is /flywheel. See the routing guide to host it at /.