Durable Execution for Python & TypeScript
By developers, for developers.
Focus on your product.
Evaluating durable execution options? Here's what makes Resonate different from other workflow engines.
Simple operations
Resonate Server is one binary that runs on Postgres. No clusters to manage, no complex deployments. Start with SQLite locally, scale to Postgres in production.
Familiar patterns
No new DSLs or workflow definitions. Write normal Python or TypeScript with async/await. Your existing mental model works—we just make it durable.
Battle-tested correctness
The Resonate protocol is modeled in Quint and tested with deterministic simulation. We find bugs before they reach production.
Truly open
Apache 2.0 licensed. Self-host for free, forever. No per-execution pricing, no surprise bills, no platform dependency.
| Feature | Resonate | Traditional workflow engines |
|---|---|---|
| Deployment complexity | Single binary + Postgres | Multi-service cluster |
| Programming model | Native async/await | Custom DSL or decorators |
| Learning curve | Hours (if you know async) | Days to weeks |
| Self-hosted cost | Free, Apache 2.0 | Free tier limits or paid |
| Local development | Same code, SQLite | Docker compose or cloud |
Comparing to similar tools. Read the coming from guides →
Implements the open Distributed Async Await spec and the Async RPC protocol so discovery, load balancing, and recovery are transparent.
See it in action
Write sequential code that survives crashes. Each step is checkpointed, so if your process fails, it resumes exactly where it left off.
from resonate import Resonate, Context
resonate = Resonate()
@resonate.register
def process_order(ctx: Context, order_id: str):
# Each step is checkpointed - won't re-run on recovery
order = yield ctx.run(fetch_order, order_id)
payment = yield ctx.run(charge_card, order)
shipment = yield ctx.run(create_shipment, order)
yield ctx.run(send_confirmation, order["email"])
return {"payment": payment, "shipment": shipment}
def fetch_order(ctx: Context, order_id: str):
return {"id": order_id, "total": 99.99, "email": "[email protected]"}
def charge_card(ctx: Context, order: dict):
return {"transaction_id": "txn_123", "amount": order["total"]}
def create_shipment(ctx: Context, order: dict):
return {"tracking": "1Z999AA1", "carrier": "UPS"}
def send_confirmation(ctx: Context, email: str):
print(f"Confirmation sent to {email}")
# Start a workflow
result = resonate.run("order-123", process_order, "123")
print(result)Real feedback from engineers in the community
This was my first time with a concrete, real-world use case for Resonate. After reaching out, Dominik and the team immediately took the time to jump on a call to walk through the requirements. I'm genuinely impressed by both the quality of thinking and the speed of execution. 'Going above and beyond' doesn't do it justice.
Yassin
Building distributed scraping infrastructure
I've been reading and playing with durable execution and found Resonate's approach to be awesome. Love the simplicity of the mental model and the DX!
Muniter
AI agents and data workflows
At my current job I've implemented many pipelines to generate vectors, wait for model execution, etc. and we use NATS with Jetstream for the async tasks. It adds a lot of complexity and overhead for such simple tasks. I think Resonate could be a great alternative. I'm reading the docs and this is incredibly great.
chrlie__
ML pipeline orchestration
The documentation is just excellent overall. I haven't looked at this for a while and I see it was updated—the 'Why Resonate' page really nails the systems engineering perspective.
Brad
Building workflow systems
Whether it's a greenfield project, an existing codebase, or just an exploration — Using Resonate is delightful every step of the way.
Spin up your first worker with zero extra services (No Resonate Server required). Keep local development dependency-free while you explore the APIs.
Use a local Resonate Server to enable reliability and scalability features.
Enable your workers to survive restarts and crashes simply by connecting to the server.
Call functions in other services as easily as local functions, synchronously or asynchronously.
Use Resonate's defaults or swap in your own message transport layer, such as Kafka, RabbitMQ, or AWS SQS.
Deploy your Resonate workers in serverless environments like AWS Lambda or Google Cloud Functions for automatic scaling and reduced operational overhead.
Make use of out-of-the-box observability, privacy, and security tools and features for production-level deployments.
Deploy as many Resonate Servers as your application needs. Both workers and servers can be added or removed dynamically to match demand.
Connect with the engineers building resilient systems today. Share feedback, see what's shipping next, and learn how teams are scaling with Resonate in production.
Deep dives, release notes, and field reports from the team.
Share ideas, swap implementation patterns, and hang out with engineers shipping Resonate in production.
Active right now
…
Check in for live threads and real-time support
Stars help us reach more developers and signal which SDKs matter most. Plus, you'll stay in the loop as we ship new features.
Provided by Kapa.ai, the leading AI developer support system, helps helps you ship faster with Resonate.