.NET 10Open sourceMIT license

Background jobs.
Everything in view.

Schedule, retry, and chain jobs with Redis.
Monitor them in a live Blazor dashboard.

Flywheel dashboard showing job activity, searchable jobs, execution states, and recurring schedules using demo data
Dashboard · Demo data

Built for background work.

Run on your schedule

Immediate, delayed, recurring, and cron jobs with time-zone support.

Retry failed jobs

Backoff, attempt limits, cancellation, and dead-letter handling.

Chain jobs

Run each step after its predecessor succeeds. Wait through retries.

Coordinate workers

Shared leases, concurrency limits, and rate limits across instances.

Generated at compile time.

The source generator discovers your job methods and creates typed invokers. No runtime reflection for job dispatch.

The dashboard is a client.

Blazor WebAssembly runs the interface in your browser, keeping UI rendering off the server and background runner. The optional dashboard connects to Flywheel over HTTP and SignalR.

API requests and live updates still use server resources; the UI needs no server-side rendering session.

Inspect every execution.

View attempts, timing, and captured ILogger output.

Flywheel job details with attempt information and captured demo report logs

Your first job.

Requires .NET 10 and Redis 6.0.9 or newer.

Setup guide

Jobs can run more than once. Make handlers safe to retry.

Install the packages.NET CLI
dotnet add package Soenneker.Flywheel.Core
dotnet add package Soenneker.Flywheel.Redis
dotnet add package Soenneker.Flywheel.Generators
Register and enqueueC#
// Program.cs
builder.Services.AddFlywheel()
    .AddRedis(options =>
        options.ConnectionString = "localhost:6379")
    .AddGeneratedJobs();

await client.Enqueue(
    FlywheelJobs.MessageJobs_Write,
    new Message("Hello from Flywheel"));