Temporal
ActiveDescription
Temporal is a distributed durable execution platform that turns agent workflows from ad-hoc scripts into observable production systems through automatic retries and state management.
Key Features
- Durable workflow execution — workflows are event-sourced and resumable from any point after a crash
- Automatic retries and timeouts — built-in configurable retry policies, timeouts, and exponential backoff
- Multi-language SDKs — official SDKs for Go, Java, TypeScript, Python, .NET, PHP and more
- Activity and child workflow composition — supports Activity, child workflows, Saga, and compensation patterns
- Visualization and history replay — Web UI for inspecting workflow execution history, state, and call stacks
- Cross-service transactions — Saga/Compensation patterns for distributed transaction consistency
Use Cases
💡 Reliably orchestrating multi-step LLM agent tasks in production with automatic timeout and rate-limit handling
💡 Defining long-running workflows as code that survive days or weeks of execution
💡 Calling external APIs from Activities with automatic retry on transient failures
💡 Composing multiple microservices as Sagas with automatic compensation for failed downstream calls
💡 Replaying any historical workflow execution via the Web UI to debug production issues
Strengths & Limitations
✅ Strengths
- • Actively maintained, recent updates
- • High community interest (22.3k stars)
- • Permissive open-source license (MIT)
Categories
Quick Start
# Start a local Temporal dev server
brew install temporal
temporal server start-dev
# Install the Go SDK
go get go.temporal.io/sdk
# Define a workflow (workflow.go)
package workflow
import (
"time"
"go.temporal.io/sdk/workflow"
)
func GreetingWorkflow(ctx workflow.Context, name string) (string, error) {
ao := workflow.ActivityOptions{StartToCloseTimeout: time.Second * 10}
ctx = workflow.WithActivityOptions(ctx, ao)
var result string
err := workflow.ExecuteActivity(ctx, ComposeGreeting, name).Get(ctx, &result)
return result, err
}
# Start a Worker and trigger a workflow execution
go run worker/main.go
temporal workflow start --task-queue greeting-tasks --type GreetingWorkflow --input '"World"'