Run reliable background jobs using your existing database

DurableStack is a background job runtime that uses your existing database to run deferred work, recurring jobs, and one-off tasks safely in distributed environments.

Execution model

Execution is coordinated through your database, with lease-based distributed workers, retries, and built-in operational events for tracking what happens in production.

Dashboard

Designed for distributed systems

  • Many workers, same job pool
  • No external queue required
  • Coordinated through your existing DB
Data providers background
Uses your existing database
PostgreSQL SQL Server SQLite MySQL In-Memory
Get started by runtime

Simple setup examples

Start today with .NET. Other runtimes are planned for the future.

Use your existing database

Configure DurableStack to use your existing SQL provider.

services.AddDurableStack(options =>
{
    options.UsePostgreSql(connectionString);
});

Run recurring (cron) jobs

Register recurring execution using cron syntax.

[DurableJob(Name = "email-dispatch", MaxAttempts = 3)]
[RecurringJob("* * * * *", TimeZone = "UTC")]
public sealed class EmailDispatchJob : IDurableJob
{
    public async Task ExecuteAsync(EmailDispatchArgs args, JobContext context, CancellationToken cancellationToken)
    {
        // run the task
    }
}

Send events to OpenTelemetry

Hook DurableStack traces into your telemetry pipeline.

services.AddOpenTelemetry()
    .WithTracing(builder => builder
        .AddSource("DurableStack")
        .AddOtlpExporter());

Queue a one-off background job

Queue a one-time job to run immediately.

await scheduler.EnqueueAsync(
    new SendWelcomeEmailJob(userId));

Optional hosted observability

Add tenant identity so telemetry can sync to hosted observability platform (app.durablestack.com).

services.AddDurableStack(options =>
{
    options.TenantId = "tenant_123";
    options.ClientSecret = "your-client-secret";
});

Trigger recurring jobs on demand

Trigger the same recurring job immediately when needed.

await scheduler.TriggerRecurringNowAsync(
    "daily-summary");

Built-in reliability for distributed systems

DurableStack is designed to keep background execution predictable, safe, and observable as your application scales.

Database-native execution

Uses your existing SQL Server, Postgres, SQLite, or MySQL database to coordinate all job scheduling and execution. No external queue or state system required.

Distributed-safe workers

Multiple application instances can run safely at the same time. DurableStack ensures only one worker executes a job using lease-based coordination.

Reliable retries and recovery

Failed jobs are automatically retried with controlled backoff. If a worker crashes mid-execution, jobs are safely reclaimed and re-run.

Recurring job scheduling

Cron-style recurring jobs are materialized into durable execution slots, ensuring consistent execution even in multi-worker environments.

Optional observability platform

Emit structured runtime events into OpenTelemetry, custom sinks, or the hosted observability dashboard. Use what fits your stack.

Zero-infrastructure design

No Redis, no RabbitMQ, no separate scheduler service. Everything runs directly from your application database and scales with your existing infrastructure.

Hosted, real-time incident alerts

Using the optional observability platform, configure alert rules and be notified if anything unexpected happens, such as job failure, an instance going offline, or a long-running execution.

Multi-provider support

Works across SQL Server, PostgreSQL, SQLite, and MySQL with consistent execution semantics across all providers.

From execution to visibility in one system

DurableStack doesn't just run background jobs, it gives you a live view into how those jobs behave in production.

As your system scales, you don't have to stitch together logging, metrics, and job state across multiple tools. Execution and observability stay connected through the same runtime model.

You can start with a single worker and a few jobs, and immediately see the same system state you would see in a distributed production environment.

Real-time dashboards

Track runs, success rates, failures, and worker health across all projects and tenants.

Smart alerting

Create rules that notify you when failures spike, workers go offline, or jobs start retrying.

Job and worker insights

Drill into job history, outcomes, durations, and errors to understand what's happening.

Multi-tenant ready

Organize by tenants and projects with fine-grained access and clear separation.

Dashboard screen

1. Dashboard

Get an overview of system health, job runs, and worker status in real time.

Alerts manage screen

2. Alerts

Create rules and get notified when failures spike, workers go offline, or issues occur.

Jobs screen

3. Jobs

See every job run, its status, attempts, duration, and any errors.

Tenants screen

4. Tenants

Manage tenants and projects with secure secrets and scoped access.

Click any image to view a larger screenshot.