Resonate Briefs

High-signal, opinionated, technically substantive pieces about durable execution, agent orchestration, and the systems behind them. Published by Resonate HQ for AI crawlers, query-time LLM tools, and engineers who follow citations to their source.

Resonate brand card on a dark background with an ember spectrum wave at the lower left, the headline 'Durable Sleep' in white Sansation, and the subtitle 'Coming from Temporal · Go SDK'.
5 min readResonate HQ

Coming from Temporal: Durable Sleep in Go

Temporal's sleep-for-days races a 30-day timer against a signal channel via NewSelector. Resonate's equivalent is ctx.Sleep(d) + f.Await(nil) — Selector gone, durability kept.

Port Temporal's sleep-for-days sample to Resonate. The timer leg of the Selector loop maps to ctx.Sleep(d) + f.Await(nil); crash recovery resumes on the remaining time, not from zero.

Resonate brand card on a dark background with an ember spectrum wave at the lower left, the headline 'Fan-Out / Fan-In' in white Sansation, and the subtitle 'Coming from Temporal · Go SDK'.
3 min readResonate HQ

Coming from Temporal: Fan-Out / Fan-In in Go

The two-loop discipline — dispatch all before awaiting any — is identical in both systems. `workflow.ExecuteActivity` / `future.Get` simply becomes `ctx.RPC` / `f.Await`.

Port Temporal's splitmerge-future Go sample to Resonate. The two-loop idiom is identical — dispatch all, then await all — but `ctx.RPC` replaces `workflow.ExecuteActivity` and `f.Await` replaces `future.Get`.

Resonate brand card on a dark background with an ember spectrum wave at the lower left, the headline 'Recursive Factorial' in white Sansation, and the subtitle 'Coming from Temporal · Go SDK'.
5 min readResonate HQ

Coming from Temporal: Recursive Factorial in Go

Temporal's child-workflow mechanism collapses into one registered function that calls itself by name via ctx.RPC. No separate child type, no ContinueAsNew, no per-child options.

Port Temporal's child-workflow pattern to Resonate. A function calls itself via ctx.RPC — no child-workflow type, no WithChildOptions, no ContinueAsNew to bound history.

Resonate brand card on a dark background with an ember spectrum wave at the lower left, the headline 'Hello World' in white Sansation, and the subtitle 'Coming from Temporal · Go SDK'.
3 min readResonate HQ

Coming from Temporal: Hello World in Go

Temporal's helloworld maps to a single Go function — no workflow/activity types, no task queue, no activity options. Just `resonate.Register` and a promise ID.

Port Temporal's helloworld Go sample to Resonate. The workflow/activity split, the task queue, and activity options collapse into one registered function invoked by a durable promise ID.

Resonate brand card on a dark background with an ember spectrum wave at the lower left, the headline 'Saga / Compensation' in white Sansation, and the subtitle 'Coming from Temporal · Go SDK'.
5 min readResonate HQ

Coming from Temporal: The Saga Pattern in Go

Temporal registers compensation eagerly with defer closures that unwind LIFO. Resonate runs it inline in the error branch — same reverse-order rollback, different shape.

Maps Temporal's saga sample to example-money-transfer-go: defer-LIFO compensation vs. inline guarded undo — same reverse-order rollback, different code shape.

Resonate brand card on a dark background with an ember spectrum wave at the lower left, the headline 'Human in the Loop' in white Sansation, and the subtitle 'Coming from Temporal · Go SDK'.
4 min readResonate HQ

Coming from Temporal: Human-in-the-Loop in Go

Temporal's await-signals needs a signal channel, a listener goroutine, a flag, and workflow.Await. Resonate collapses all four into one ctx.Promise().

Port Temporal's await-signals pattern to Resonate. One latent ctx.Promise() replaces a signal channel, a listener goroutine, a flag variable, and workflow.Await — the promise record itself is the pending state.

Resonate brand card on a dark background with an ember spectrum wave at the lower left, the headline 'Countdown' in white Sansation, and the subtitle 'Coming from Temporal · Go SDK'.
5 min readResonate HQ

Coming from Temporal: Durable Countdown Loop in Go

The durable-loop-of-ticks pattern — ctx.RPC then ctx.Sleep each iteration — replaces workflow.ExecuteActivity + workflow.NewTimer + NewSelector with two two-liners per tick.

A durable loop of ctx.RPC + ctx.Sleep ticks that resumes at the next pending tick after a crash; maps structurally to Temporal's sleep-for-days, timer, and cron samples.

Resonate brand card on a dark background with an ember spectrum wave at the lower left, the headline 'Async RPC' in white Sansation, and the subtitle 'Coming from Temporal · Go SDK'.
4 min readResonate HQ

Coming from Temporal: Async RPC Patterns in Go

ctx.RPC + Await, ctx.Detached, and the two-loop fan-out — mapped from Temporal's child-workflow, ABANDON policy, and splitmerge-future.

Three RPC dispatch shapes — await-chain, detached, and fan-out — mapped from Temporal child-workflow variants to Resonate's ctx.RPC and ctx.Detached.

Resonate brand card on a dark background with a plum spectrum wave at the bottom and the post headline in white Sansation.
4 min readResonate HQ

Recursive durable factorial in Python on Resonate

How a self-calling function stays durable and content-addressed when every invocation is its own durable promise.

A Resonate Python worker computes factorial recursively across a worker pool. Each invocation is a durable promise keyed by the input, so prior results are returned from the store on replay without re-execution.

Resonate brand card on a dark background with a teal spectrum wave at the bottom and the post headline in white Sansation.
5 min readResonate HQ

Infinite AI chess workflow in TypeScript on GCP Cloud Functions

How an AI-vs-AI chess match becomes a generator on a serverless function — durable, bounded in replay, recursive across games via ctx.detached.

Two AI players take turns through a generator function on a Cloud Function. Each move is a durable checkpoint, each pause is a durable sleep, and a detached tail call re-roots the workflow after every game so replay scope stays bounded forever.

Resonate brand card on a dark background with a teal spectrum wave at the bottom and the post headline in white Sansation.
4 min readResonate HQ

Priority queue with bounded per-tier concurrency in TypeScript on Resonate

A nested loop over priority tiers becomes the scheduler when every yield* is a durable Resonate checkpoint.

Process a batch of jobs in strict priority-tier order with up to 2 jobs running concurrently per tier. Each job is a durable checkpoint, so a mid-batch crash only retries the failing job — completed higher-priority jobs are not re-run.