Resonate Skills
Agent skills for building with Resonate — a durable execution platform for long-running, crash-safe workflows.
Each skill teaches a coding agent (Claude Code, Cursor, or any skill-aware agent) how to reason about and write Resonate code for a specific task: deploying servers, building HTTP services, implementing sagas, coordinating human-in-the-loop approvals, and more.
What's in this repo today
- 12 foundational (language-agnostic) skills — concepts, mental models, the server-install guides, the ScyllaDB, NATS, and Postgres provider guides, the CLI reference, the cross-SDK defaults reference, the Temporal and DBOS migration playbooks, and the
resonate-bashMCP tool guide that apply across every Resonate SDK. - 16 TypeScript per-SDK skills — idiomatic usage of the TypeScript SDK.
- 8 Python per-SDK skills — basic usage + debugging + patterns (saga, recursive fan-out, human-in-the-loop, external system of record) + HTTP service design for the Python SDK.
- 8 Rust per-SDK skills — basic usage + debugging + patterns (saga, recursive fan-out, durable-sleep-scheduled-work, human-in-the-loop, external system of record) for the early-development Rust SDK (v0.6.0, on crates.io); every Rust skill carries an explicit SDK-in-active-development note.
- 8 Go per-SDK skills — basic usage (ephemeral + durable) + debugging + patterns (saga, recursive fan-out, durable-sleep, human-in-the-loop, external system of record) for the Go SDK, tagged
0.1.0(installgo get github.com/resonatehq/[email protected]— see the Go section below for why@latestdoesn't resolve to it); every Go skill carries a version caveat and documents the directPromises()/Schedules()sub-clients the0.1.0tag shipped. - 8 Java per-SDK skills — basic usage (ephemeral + durable) + debugging + patterns (saga, recursive fan-out, durable-sleep-scheduled-work, human-in-the-loop, external system of record) for the Java SDK. Unlike Go, the Java SDK is published on Maven Central (
io.resonatehq:resonate-sdk-java:0.1.1) and ships the fuller surface —r.promisesandr.schedulessub-clients plus a top-levelr.schedule(...)cron API — so the Java skills use those directly rather than documenting a gap. Requires Java 21+ (virtual threads); every Java skill carries a light prerelease note (API may change before1.0) and is compile-verified against0.1.1.
That is 12 foundational + 48 per-SDK = 60 skills (16 TypeScript, 8 Python, 8 Rust, 8 Go, 8 Java).
What is a skill?
A skill is a directory with a SKILL.md file (and optional references/, scripts/, assets/). The frontmatter tells the agent when to load it:
---
name: resonate-saga-pattern-typescript
description: Implement saga patterns for distributed transactions with compensation logic. Use when coordinating multi-step processes that need to maintain consistency across failures by unwinding completed steps.
license: Apache-2.0
---
Skills follow Anthropic's Agent Skills convention and work with Claude Code, the Anthropic SDK, and other skill-aware tools.
Taxonomy
Every skill falls into one of two categories.
Foundational skills are language-agnostic. They teach concepts, mental models, or operational patterns that apply across every Resonate SDK. Their directory names carry no SDK suffix.
Per-SDK skills teach idiomatic usage of a specific Resonate SDK. Their directory names and frontmatter carry an SDK suffix: -typescript, -python, -rust, -go, or -java. When the same concept applies across SDKs (e.g. sagas, HTTP services, debugging), each SDK gets its own skill — the per-SDK version expresses the pattern in the SDK's natural idioms rather than translating mechanically.
Foundational
Start here:
resonate-philosophy— The foundational mindset. Read this first.durable-execution— The core concept and Resonate's approach.resonate-migrate-from-temporal— Coming from Temporal? Port your app pattern by pattern; mapstemporalio/samples-*to Resonate examples across all four SDKs, with per-SDK API notes and honest coverage gaps.resonate-migrate-from-dbos— Coming from DBOS? Port your app pattern by pattern; mapsdbos-incexamples (demo apps + the SDK repos) to Resonate equivalents across all four SDKs, with per-SDK API notes and honest coverage gaps.
Operations:
resonate-cli— Drive the Resonate server from the shell:serve/dev, promise CRUD + search, schedules,invoke,tree, tasks, and the MCP shim. Covers every subcommand and flag as ofresonate 0.9.8, plus the small set of docs-vs-binary deltas an agent will trip on.resonate-server-deployment— Install and configure the Resonate server on Linux with systemd.resonate-server-deployment-cloud-run— Deploy the Resonate server to Google Cloud Run with Cloud SQL Postgres storage.resonate-server-scylladb— Run the protocol on ScyllaDB viaresonate-on-scylladb, a separate Go server rather than a backend of the core server. Its ownSCYLLADB_/SERVER_env model (notRESONATE_), the six-table schema, the BUSL-1.1 constraint, and the current gaps. Drop-in: existing SDKs work unchanged.resonate-server-nats— Run the protocol on NATS JetStream viaresonate-on-nats, where NATS is both storage and transport and there is no HTTP interface at all. Partitioning across instances, wiring workers with theNatsNetworkclient (TypeScript and Python only), the subject layout, the lowercasegroup/pidtrap, and the current gaps.resonate-server-postgres— Run the protocol inside Postgres viaresonate-pg: one SQL file of stored procedures, no server process at all. Not the same thing as the core server on Postgres. Thepg_crontimer dependency and its silent-failure mode,resonate_rpc,invoke's 24-hour default timeout, theresonate_workergrant surface, GC and id idempotency, the Deno-only client, and the current gaps. Apache 2.0, unlike the other two providers.resonate-bash— Run shell scripts as durable, asynchronous tasks via theresonate-bashMCP tool. What it's good at, how to install the local Resonate server + Claude Code MCP wiring, tool reference (params, target addresses, env vars, failure semantics).
Reference:
resonate-defaults— Cross-SDK default values for retry policies,ctx.runoptions, init, env vars, and server flags. Read this when asked "what's the default for X" instead of deflecting to "check the SDK source."
Per-SDK: TypeScript
Core SDK usage:
resonate-basic-ephemeral-world-usage-typescript— Client APIs: initialization, registration, top-level invocations, Postgres-backed setup, and token auth.resonate-basic-durable-world-usage-typescript— Context APIs insidefunction*bodies.resonate-async-await-engine-typescript— Async/await execution engine (@resonatehq/sdk/async):async functionworkflows, eagerctx.runfan-out,Never-default retries,ctx.promisefor HITL, and when to choose async vs generator engine. v0.11.0+.resonate-basic-debugging-typescript— Investigating stuck workflows, error codes, unexpected replays.
Reasoning:
resonate-advanced-reasoning-typescript— Mapping the resonatehq/resonate-specification abstract machine to TypeScript SDK patterns and verifying correctness/durability/failure semantics.
Patterns:
resonate-saga-pattern-typescript— Distributed transactions with compensation logic.resonate-recursive-fan-out-pattern-typescript— Parallel workflow execution via recursive fan-out.resonate-human-in-the-loop-pattern-typescript— Approval gates and manual review workflows.resonate-external-system-of-record-pattern-typescript— Consistency across systems without distributed transactions.resonate-durable-sleep-scheduled-work-typescript— Timers, countdowns, and delayed execution viactx.sleep().resonate-state-bus-pattern-typescript— Stream durable workflow state to browsers via an external realtime bus (Firestore, Supabase Realtime, Pub/Sub) when the worker is short-lived.
HTTP & authentication:
resonate-http-service-design-typescript— HTTP services with Resonate behind route handlers.resonate-token-authentication-typescript— JWT auth and prefix-based authorization.
Deployments:
resonate-gcp-deployments-typescript— Deploy TypeScript workers to Google Cloud Functions.resonate-supabase-deployments-typescript— Resonate workflows on Supabase Edge Functions.resonate-lovable-usage-prompt-typescript— Building Resonate apps in Lovable.dev (Node.js/React/TypeScript).
Per-SDK: Python
Core SDK usage:
resonate-basic-ephemeral-world-usage-python— Client APIs: initialization (Resonate(url=...)), registration viar.register(fn), top-level invocations (r.run/r.rpc), dependencies (r.with_dependency), external promises.resonate-basic-durable-world-usage-python— Context APIs insideasync defdurable functions (await ctx.run/rpc/sleep/promise), determinism rules, and Python-specific deltas from TypeScript.resonate-basic-debugging-python— Python-specific failure modes: async/await pitfalls, v0.7.0 SDK + Rust server v0.9.x, Python ≥ 3.12 pin, non-determinism regressions.
Patterns:
resonate-saga-pattern-python— Distributed transactions with compensation viatry/exceptand reverse-order cleanup.resonate-recursive-fan-out-pattern-python— Parallel execution via list-comprehension overctx.run/ctx.rpchandles, recursion, bounded parallelism.resonate-human-in-the-loop-pattern-python— Workflow steps that block onctx.promise()until a webhook, UI, or operator resolves.resonate-external-system-of-record-pattern-python— Coordinate writes to an external SoR (Postgres, TigerBeetle, Stripe) with idempotency keys.
HTTP & service design:
resonate-http-service-design-python— FastAPI/Flask/Django route handlers that start or await durable workflows; worker-group separation; webhook-driven promise resolution.
Not yet available for Python: token-based authentication (Python SDK doesn't yet support it — planned for a future release per the docs); GCP Cloud Functions / Supabase Edge deployments (no Python shim; Supabase Edge runtime is Deno-only). Durable-sleep-scheduled-work is not a separate Python skill because ctx.sleep(timedelta(...)) is covered in basic-durable-world; a top-level r.schedule(...) cron API is available in v0.7.0 (see basic-ephemeral-world skill).
Per-SDK: Rust
SDK note: the Rust SDK is in active development (v0.6.0, published on crates.io). APIs may change between releases; every Rust skill carries this note at the top.
Core SDK usage:
resonate-basic-ephemeral-world-usage-rust— Client APIs:Resonate::new(ResonateConfig)/Resonate::local(),#[resonate::function]attribute macro, registration,.run()/.rpc()/.schedule(), promises API.resonate-basic-durable-world-usage-rust— Context APIs inside#[resonate::function]-decorated async functions:ctx.run,ctx.rpc,ctx.sleep,.spawn()for parallelism, function kinds (Workflow / Leaf with Info / Pure leaf).resonate-basic-debugging-rust— Rust-specific failure modes: serde derive errors,ctxvsinfoconfusion,.spawn()synchronous return (use?not.await?), tokio runtime mismatches, v0.6.0 SDK.
Patterns:
resonate-saga-pattern-rust— Distributed transactions withResult<T>+ match-based compensation dispatch via enum; forward path uses?propagation.resonate-recursive-fan-out-pattern-rust— Parallel execution via.spawn()?(synchronous) then await eachDurableFuture; recursion; bounded parallelism via slice.chunks(n).resonate-human-in-the-loop-pattern-rust— Workflow steps that block onctx.promise::<T>()until a webhook, UI, or operator settles viaresonate.promises.resolve/reject/cancel.resonate-external-system-of-record-pattern-rust— Coordinate writes to an external SoR (Postgres, TigerBeetle, Stripe) with idempotency keys; type-dispatched DI viactx.get_dependency::<T>().resonate-durable-sleep-scheduled-work-rust—ctx.sleep(Duration)for in-workflow durable sleep +resonate.schedule()cron-registered ephemeral-world scheduling.
Docs-vs-source note: ctx.promise::<T>(), ctx.get_dependency::<T>(), ctx.info(), and resonate.with_dependency::<T>() all exist in the v0.6.0 SDK source but are not yet covered in docs/develop/rust.mdx. The Rust skills above use these APIs with source-path citations; docs are expected to catch up in a future release.
Not yet written for Rust: HTTP service design + deployment skills. These track SDK stability and will land when the source/docs validate the relevant paths.
Per-SDK: Go
Version note: the Go SDK's first tagged release is 0.1.0. The tag itself is 0.1.0, not v0.1.0, so Go's module proxy does not resolve @latest to it (@latest walks main and returns a newer pseudo-version instead) — install with the tag pinned explicitly: go get github.com/resonatehq/[email protected]. That resolves to the pseudo-version the proxy mints for that exact commit (confirm any install line against https://proxy.golang.org/github.com/resonatehq/resonate-sdk-go/@v/0.1.0.info before shipping it). APIs may still change before a 1.0; every Go skill carries this caveat at the top, verified against the 0.1.0 tag source and the resonatehq-examples/*-go repos.
Core SDK usage:
resonate-basic-ephemeral-world-usage-go— Client APIs:resonate.New(Config), the package-level genericresonate.Register, top-levelRegisteredFunc.Run,Resonate.RPC/Resonate.Get, typed vs untyped handles,RunOptions,Stopsemantics (don't Stop a worker), and the directResonate.Promises()/Resonate.Schedules()sub-clients.resonate-basic-durable-world-usage-go— Context APIs inside durable functions:ctx.Run/ctx.RPC/ctx.Sleep/ctx.Promise/ctx.Detached,Future.Await, option structs, accessors, the bounded 3-attempt default retry, and the replay model.resonate-basic-debugging-go— Go-specific failure modes: thelocalnet+NoopHeartbeat{}requirement,ctx.Run's uncheckedanyleaf signatures, replay double-fires, the manual-encoding trap on the low-levelSender().PromiseSettlepath, andr.Stop()silently killing a live worker.
Patterns:
resonate-saga-pattern-go— Distributed transactions with explicit(T, error)returns, a trackedcompletedslice, and reverse-order compensation dispatched viatype Step string+switch.resonate-recursive-fan-out-pattern-go— Parallel execution via the dispatch-all-then-await-all[]*resonate.Futurepattern; recursivectx.RPCself-dispatch; worker-group separation.resonate-human-in-the-loop-pattern-go— Workflow steps that park onctx.Promise()until an external actor settles, preferably via theResonate.Promises().Resolve/Reject/Cancelsub-client (shipped in0.1.0); the CLI and the low-levelSender().PromiseSettleremain as alternates.resonate-external-system-of-record-pattern-go— Coordinate writes to an external SoR by wrapping every interaction in its own idempotentctx.Run; idempotency keys derived fromctx.ID().resonate-durable-sleep-scheduled-work-go—ctx.Sleep(time.Duration)for in-workflow durable sleep, countdowns, and long-horizon delays, plus the directResonate.Schedules()sub-client (create/get/delete cron schedules) shipped in0.1.0. There is still no top-levelresonate.Schedule(id, cron, fn, args)convenience wrapper like Python/TypeScript/Rust have — recurring function dispatch still composesSchedules().Createwith manualresonate:targettagging, or falls back to in-workflowctx.Sleeploops / external cron →RPC.
Not yet written for Go: HTTP service design, token-authentication, and deployment skills. The Go SDK can drive net/http services today (see example-node-drain-orchestrator-go), but the dedicated skill waits on a stable API surface; deployment skills track validated paths. 0.1.0 shipped the Promises() and Schedules() sub-clients; the remaining gap is a top-level resonate.Schedule(...) convenience wrapper that dispatches a registered function by name (Python/TypeScript/Rust have one, Go doesn't yet) — the relevant skills note the workaround rather than inventing the API.
Per-SDK: Java
Prerelease note: the Java SDK is published on Maven Central — pin io.resonatehq:resonate-sdk-java:0.1.1 (the only release; confirmed against maven-metadata.xml, not the lagging search box). The API mirrors the Python SDK and may change before a stable 1.0; every Java skill carries a light prerelease note. Requires Java 21+ (virtual threads). Every code block is compile-verified against 0.1.1 (Java 21 toolchain) and cross-checked against develop/java.mdx (docs PR #230) and the resonatehq-examples/*-java repos.
Core SDK usage:
resonate-basic-ephemeral-world-usage-java— Client APIs: the fluentResonate.builder()(ornew Resonate()for local mode),registervia method references, top-levelr.run/r.rpc/r.get, typed vs untyped handles, thepromisesandschedulessub-clients, per-call options, andstopsemantics (don't stop a worker).resonate-basic-durable-world-usage-java— Context APIs inside durable functions:ctx.run/ctx.rpc/ctx.sleep/ctx.promise/ctx.detached,ResonateFuture.await, the immutableOptsrecord,ctx.infoaccessors, type-keyed DI (ctx.getDependency), the four retry policies, and the replay model.resonate-basic-debugging-java— Java-specific failure modes: the Java 21 requirement, untyped-handleIntegervsLongdecoding (read throughNumber), CLI positional-argument arity (one parameter per--arg), thedetachedby-name-only constraint, rejected-promiseApplicationErrorhandling, andr.stop()silently killing a live worker.
Patterns:
resonate-saga-pattern-java— Distributed transactions with atry/catchforward path, a trackedList<Step>, reverse-order compensation via an exhaustiveenum+switch; retries controlled by the policy (Retry.Never) since Java has no non-retryable error wrapper. CatchException(await sneaky-throws).resonate-recursive-fan-out-pattern-java— Parallel execution via the dispatch-all-then-await-allList<ResonateFuture<T>>pattern; recursivectx.rpcself-dispatch to a named worker group; worker/client builder split withgroup(...).resonate-human-in-the-loop-pattern-java— Workflow steps that park onctx.promise()until an external actor settles. Java has anr.promisessub-client, so resolution is a cleanr.promises.resolve(id, new Value(null, data))— no manual base64 encoding needed. Go's0.1.0Promises().Resolve(...)sub-client now handles the same codec encoding automatically; the manualJSON → base64 → quoted stringdance is only needed on Go's low-levelSender().PromiseSettlefallback path.resonate-external-system-of-record-pattern-java— Coordinate writes to an external SoR by wrapping every interaction in its own idempotentctx.run; reach the SoR client via type-keyed DI (r.withDependency/ctx.getDependency); idempotency keys fromctx.info().id().resonate-durable-sleep-scheduled-work-java—ctx.sleep(Duration)for in-workflow durable sleep, countdowns, and long-horizon delays, plus the top-levelr.schedule(...)cron API and ther.schedulessub-client. Java ships a top-levelschedule(fn, ...)convenience wrapper; Go's0.1.0Schedules()sub-client covers create/get/delete but not that same one-call function-dispatch wrapper yet.
Not yet written for Java: HTTP service design, token-authentication, and deployment skills. The Java SDK supports token auth (builder().token(...)) and can sit behind HTTP route handlers today, but the dedicated skills wait on a stable API surface and validated deployment paths — mirroring the Rust/Go deferral.
Using these skills
With Claude Code
Clone this repo into your project's .claude/skills/ directory (or your user-level ~/.claude/skills/):
cd your-project
mkdir -p .claude/skills
git clone https://github.com/resonatehq/resonate-skills .claude/skills/resonate
Claude Code will automatically discover them. Invoke one explicitly with Use the resonate-saga-pattern-typescript skill to..., or let the agent pick based on the description field.
With the Anthropic SDK
Load SKILL.md files as context when you want the model to apply that skill. See Anthropic's Agent Skills docs for loading patterns.
With other agents
Skills are plain Markdown. Any agent framework that supports prompt injection or context loading can use them.
Contributing
Where does a new skill belong?
Decision tree:
- Is it a concept, mental model, or framework-agnostic principle that applies equally across every Resonate SDK? → Foundational. No SDK suffix. Describe the idea in language-agnostic terms and link to per-SDK skills for concrete syntax.
- Is it idiomatic usage of a specific SDK's API? → Per-SDK. Suffix the directory name and frontmatter
namewith the SDK:-typescript,-python,-rust,-go, or-java. - Is it operational or deployment knowledge? → Per-SDK if the SDK shapes the deployment (e.g. Cloud Functions runtime, worker registration). Foundational if the operation is truly language-independent (e.g. installing the Resonate server binary).
Default to per-SDK. Promote a skill to foundational only when it contains no SDK-specific APIs, syntax, or runtime idioms. Debug skills, for example, are per-SDK: error codes, replay tells, and diagnostic tooling differ enough across SDKs that a single unified debug skill would either read as abstract or balloon past an agent's working context. The concept of replay and durability lives in durable-execution; the SDK-specific tells live in each SDK's debug and advanced-reasoning skills.
Same concept, multiple SDKs
When a pattern translates across SDKs (e.g. saga with compensation), each SDK gets its own skill — written idiomatically for that SDK, not find-and-replaced from another. If the natural expression differs materially (async/await vs generator syntax, Result vs exceptions), the skill reflects that. If the expressions are genuinely identical, consider whether the shared logic belongs in a foundational skill with the per-SDK skills covering only the surface syntax.
Out of scope
- Mirroring SDK reference documentation. Skills are behaviour-oriented ("when would I reach for this?") — the per-SDK guides at docs.resonatehq.io/docs/develop/ are the reference. Skills cite them.
- New deployment targets without SDK validation. A new deployment skill requires the target to have validated SDK support. Currently covered: GCP Cloud Functions, Supabase Edge Functions, and the Linux/systemd server install. Requests for AWS, Cloudflare, Fly, and others are tracked separately and land once an SDK and a benchmark cycle confirm the deployment path.
- Frontmatter changes. The Anthropic Agent Skills spec (
name,description,license) is fixed. Only skill content is up for discussion.
Submitting a skill
- Create
your-skill-name[-typescript|-python|-rust|-go|-java]/SKILL.mdwith the frontmatter block. - Keep the
descriptionspecific — it's what agents use to decide when to load the skill. - Put example snippets inline; put long-form references under
your-skill-name/references/. - Keep prose tight: skills are read by LLMs with finite context.
- One skill per PR unless they're tightly coupled (e.g. the TypeScript and Python variants of the same pattern).
License
Apache License 2.0. See LICENSE.
No comments yet
Be the first to share your take.