Your code dies when the process dies. Resonate makes that not happen. You write normal functions; Resonate persists each step so they survive crashes, restarts, and long waits — minutes, hours, or weeks.
That's durable execution: the function's progress is the source of truth. If the worker crashes mid-function, the next worker resumes at the last persisted step. No state-machine DSL, no orchestration glue. Because it's ordinary code, it works the same whether a human wrote it or an agent did — the SDKs, server, and protocol are shaped for both.
This org is the core platform — the SDKs, the server, the protocol spec, and the agent-facing skill files (tool definitions for Claude Code and similar). Runnable examples live next door at github.com/resonatehq-examples.
brew install resonatehq/tap/resonate # the server
npm install @resonatehq/sdk # or: pip install resonate-sdk · cargo add resonate-sdkDocumentation · Distributed async/await
A durable countdown — each yield* is a persisted checkpoint. If the worker crashes at Countdown: 2, the next worker resumes at Countdown: 1, not back at Countdown: 3.
// from example-quickstart-ts/countdown.ts
// https://github.com/resonatehq-examples/example-quickstart-ts/blob/6fa52e2/countdown.ts
import { Resonate, type Context } from "@resonatehq/sdk";
function* countdown(context: Context, count: number, delay: number) {
for (let i = count; i > 0; i--) {
// Run a function, persist its result
yield* context.run((context: Context) => console.log(`Countdown: ${i}`));
// Sleep
yield* context.sleep(delay * 1000);
}
console.log("Done!");
}
// Instantiate Resonate
const resonate = new Resonate({ url: "http://localhost:8001" });
// Register the function
resonate.register(countdown);What happens when the worker crashes mid-countdown:
sequenceDiagram
participant App as countdown
participant R as Resonate
App->>R: yield context.run (print Countdown 3)
R-->>App: persisted
App->>R: yield context.sleep (delay)
R-->>App: persisted
App->>R: yield context.run (print Countdown 2)
R-->>App: persisted
Note over App,R: process crashes
Note over App,R: a new worker starts later
R->>App: resume from last persisted step
App->>R: yield context.sleep (delay)
App->>R: yield context.run (print Countdown 1)
App->>App: Done
The sleep is durable, too. The generator's position is the state.
New to Resonate? Start with the docs, then pick a language.
- Documentation — install, quickstart, concepts
- TypeScript SDK · Python SDK · Rust SDK
- Learn by example — ~75 runnable patterns in the examples org
- resonate-sdk-ts — TypeScript, on npm as
@resonatehq/sdk - resonate-sdk-py — Python, on PyPI as
resonate-sdk - resonate-sdk-rs — Rust, on crates.io as
resonate-sdk
- resonate — the durable-promise server, in Rust.
brew install resonatehq/tap/resonateto install.
- distributed-async-await.io — the programming model Resonate implements, served at distributed-async-await.io
- docs.resonatehq.io — source for the documentation site
- resonate-skills — skill files (tool definitions) for Claude Code and similar agents
The rest of the catalog.
Plugins & adapters
- FaaS: aws · cloudflare · gcp · supabase
- Transport: kafka · webserver
- Observability: opentelemetry · telemetry · observability web ui
Additional specifications
- async-rpc.io — Async RPC spec, served at async-rpc.io
- durable-promise-specification — the lower-level durable-promise primitive that the SDKs and server agree on
- async-await-literature — curated papers informing the design
Distribution & tooling
- homebrew-tap —
brew install resonatehq/tap/resonate - templates — scaffolding templates for the Resonate CLI
- design — brand assets and visual guidelines
- durable-promise-test-harness — conformance harness for the durable-promise spec
- resonate-client-ts — TypeScript client for async RPC from the browser
- gocoro — Go coroutine library used by the legacy server
Legacy
- resonate-legacy-server — the Go server, maintenance-only; superseded by resonate
- 3 published specifications — Distributed Async Await (served), Async RPC, Durable Promise
- 3 SDKs speaking the same protocol — TypeScript, Python, Rust
- 23 Journal posts at journal.resonatehq.io — patterns, walkthroughs, design rationale
- Discord: https://resonatehq.io/discord
- X: https://x.com/resonatehqio
- LinkedIn: https://linkedin.com/company/resonatehq
- YouTube: https://youtube.com/@resonatehq
- Journal: https://journal.resonatehq.io
Every Resonate repository is licensed under Apache-2.0. Each repo carries its own LICENSE file; this one covers the org-profile content.
SDK and server contributions go on the repo where the change lands — resonate-sdk-ts / -py / -rs for SDK work, resonate for the server. See CONTRIBUTING.md for how to contribute code, file bugs, or propose an RFC. To report a bug or propose a change at the org level, open an issue using the templates at .github issues. Security issues: see SECURITY.md.