Resuma OS (execution layer)

Durable workers, disk-backed queues, cron scheduler, webhooks, and an ops dashboard — self-hosted. No Redis or Cloudflare Workers required. Rate limiting for the whole app (actions, submits, exec) also lives on disk under {RESUMA_DATA_DIR}/rate-limit/.

LIVE

Resuma OS — live worker

A real #[worker] runs on this server: durable graph, SSE event stream, pause/resume/cancel. No Redis — self-hosted execution in the same binary as your app.

How to use this demo

  1. Click Run worker — a ~25s graph starts; the execution panel appears below.
  2. In the panel, open Controls and wait until status is Running.
  3. While Running, try Pause, Resume, or Cancel.
  4. When status is done, run again to start a fresh graph (the event stream clears).

Ready — start with step 1.

Execution panel

Graph, controls, and event stream appear here after you click Run worker.

Ops snapshot

From flow_dashboard_poll — same data as GET /_resuma/status.

Resuma OS

healthy · uptime 30h 31m

Workers

1

Graphs running

0

Graphs paused

0

Queue pending

0

Processing

0

Scheduler due

0

Workers

docs_showcase

Queues

NamePendingActiveDoneFailedLoad
default0000
docs0018060

Scheduler

1 enabled · 1 total · 0 due now

When to use

  • Background jobs (enqueue + multi-process consumers)
  • Cron-triggered workers
  • AI / fetch pipelines with map-reduce
  • Ops visibility (graphs, queues, Prometheus metrics)

On-disk layout

.resuma/
├── durable/     graphs, events, checkpoints, tokens
├── queue/       pending → processing → done|failed
├── scheduler/   cron jobs (multi-process safe)
├── rate-limit/  per-IP limits on disk
└── webhooks/    outbound lifecycle hooks

Bootstrap

init_exec() runs automatically when you FlowApp::serve or ResumaApp::into_router. Configure data dir with RESUMA_DATA_DIR.

use resuma::prelude::*;

#[worker(intent = "summarize text with AI")]
async fn summarize(input: SummarizeInput) -> Result<Value> {
    Ok(json!({ "summary": input.text }))
}

FlowApp::new()
    .auto_pages("src/pages", PagesRegistry)
    .serve(FlowServeOptions::default())  // init_exec() inside
    .await

HTTP routes

RoutePurpose
POST /_resuma/worker/{name}Start worker graph
POST /_resuma/queue/{name}Enqueue job
GET /_resuma/queue/{name}/statsQueue depth
GET /_resuma/graph/{id}Graph snapshot
GET /_resuma/graph/{id}/eventsSSE live events
POST .../pause|resume|cancelGraph control
GET /_resuma/statusOps snapshot (API key)
GET /_resuma/metricsPrometheus text
GET|POST /_resuma/schedulerCron jobs
GET|POST /_resuma/webhooksWebhook targets

Guides