Durable Workflows
Autonomous Agents
Connected Systems

Durable Workflows
Autonomous Agents
Connected Systems
The enterprise platform for workflow orchestration, service discovery and pub/sub, powered by Dapr. Build apps and AI agents that are compliant, secure and failure-proof.
Start for free

Battle-tested APIs for AI agents and cloud apps

A developer platform built on Dapr
Workflow
Orchestrate business transactions and AI agents
Durable, long-running executions
Fault-tolerant & automatic recovery of state
Scheduled reminders
& external events
Publish/Subscribe
Integrate and abstract  
any message broker
At-least-once guaranteed message delivery
Automatic CloudEvents support
Time-to-live message expiry
Service Connectivity
Cross-cloud, cross-region, cross-compute
Application and agentic identity
Zero trust, secure
communication
Discovery & registry
for apps and AI agents
Built on a foundation of open-source projects

Swappable services and LLMs

Dapr component integrations abstract away the complexity of back-end infrastructure
Pub/Sub Message Brokers
NATS
Jetstream
Solace AMQP
KubeMQ
Azure Event Hubs
MQTT
Apache Pulsar
Kafka
RabbitMQ
GCP Pub/Sub
Redis Streams
RocketMQ
Azure Service Bus
AWS SNS/SQS
Azure Service Bus Topics
Databases and Storage
CockroachDB
Hazelcast
CounchBase
etcd
CloudflareWorkers KV
Memcached
GCP Firestore
Azure Blob Storage
Aerospike
Microsoft
SQL Server
MySQL
Oracle DB
OracleCloud
MariaDB
Cassandra
Azure Table Storage
HashicorpConsul
NATS
Jetstream
MongoDB
PostgreSQL
Redis
RethinkDB
SQLite
ZooKeeper
AliCloud TableStore
AWSDynamo DB
AzureCosmosDB
Oracle Coherence
Secret Stores
AWS SSM Param Store
Tencent CloudSecrets Manager
HuaweiCloud CSMS
Alibaba OOS Param Store
AWS Secrets Mngr
HashicorpVault
Kubernetes
Secrets
GCP Secret Mngr
Azure Key Vault
Configuration Stores
Azure App Configuration
Redis
PostgreSQL
LLMs
DeepSeek
Google AI Gemini
Anthropic Claude
HuggingFace
Mistral
OpenAI
Ollama
AWS Bedrock
Azure Open AI
Middleware
OAuth2
OpenID Connect
OPA
Sentinel
Wasm 
(Wazero)

Durable execution for the agentic era

Code
// Workflow Definition
public class RequestEscalationWorkflow : Workflow<OrderRequest, object>
{
  public override async Task<object> RunAsync(WorkflowContext context, OrderRequest order)
  {
      // Auto-approve orders under $1000
      if (order.Amount < 1000)
      {
          await context.CallActivityAsync(nameof(AutoApproveActivity), order);
          return null;
      }

      // Orders $1000+ require human approval (7 days max)
      try
      {
          var approval = await context.WaitForExternalEventAsync<ApprovalResult>(
              eventName: "human_approval",
              timeout: TimeSpan.FromDays(7));

          // Handle approval event
          await context.CallActivityAsync(nameof(ProcessApprovalActivity), approval);
          return null;
      }
      catch (TaskCanceledException)
      {
          // Handle timeout - no approval received within 7 days
          await context.CallActivityAsync(nameof(HandleTimeoutActivity), order);
          return null;
      }
  }
}
Click to expand
Code
@wfr.workflow(name="request_escalation")
def request_escalation_workflow(ctx: DaprWorkflowContext, order_str: str):
   order = json.loads(order_str) if isinstance(order_str, str) else order_str
   amount = order.get("amount", 0)

   # Auto-approve orders under $1000
   if amount < 1000:
       yield ctx.call_activity(auto_approve_activity, input=order)
       return

   # Orders $1000+ require human approval (7 days max)
   approval_event = ctx.wait_for_external_event("human_approval")
   timeout = ctx.create_timer(timedelta(days=7))
   winner = yield when_any([approval_event, timeout])

   # Handle approval event or timeout
   if winner == timeout:
       yield ctx.call_activity(handle_timeout_activity, input=order)
       return

   approval_result = approval_event.get_result()
   yield ctx.call_activity(process_approval_activity, input=approval_result)

Click to expand
Code
const requestEscalationWorkflow: TWorkflow = async function* (
 ctx: WorkflowContext,
 order: OrderRequest
): any {
 // Auto-approve orders under $1000
 if (order.amount < 1000) {
   yield ctx.callActivity(autoApproveActivity, order);
   return;
 }

 // Orders $1000+ require human approval (7 days max)
 const approvalEvent = ctx.waitForExternalEvent("human_approval");
 const timeout = ctx.createTimer(7 * 24 * 60 * 60);
 const winner = yield ctx.whenAny([approvalEvent, timeout]);

 // Handle approval event or timeout
 if (winner == timeout) {
   yield ctx.callActivity(handleTimeoutActivity, order);
   return;
 }

 const approvalResult = approvalEvent.getResult();
 yield ctx.callActivity(processApprovalActivity, approvalResult);
};
Click to expand
Code
 // Workflow Definition
 @Component
 public static class RequestEscalationWorkflow implements Workflow {
   @Override
   public WorkflowStub create() {
     return ctx -> {
       OrderRequest order = ctx.getInput(OrderRequest.class);
      
       // Auto-approve orders under $1000
       if (order.amount < 1000) {
         ctx.callActivity("AutoApproveActivity", order).await();
         ctx.complete("approved");
         return;
       }
      
       // Orders $1000+ require human approval (7 days max)
       try {
         ApprovalResult approval = ctx.waitForExternalEvent("human_approval", Duration.ofDays(7), ApprovalResult.class).await();
         ctx.callActivity("ProcessApprovalActivity", approval).await();
       } catch (TaskCanceledException e) {
   	// Handle timeout
         ctx.callActivity("HandleTimeoutActivity", order).await();
       }
       ctx.complete("order completed");
     };
   }
 }
Click to expand
Code
// Workflow Definition
func RequestEscalationWorkflow(ctx *workflow.WorkflowContext) (any, error) {
   var order OrderRequest
   if err := ctx.GetInput(&order); err != nil {
       return nil, err
   }

   // Auto-approve orders under $1000
   if order.Amount < 1000 {
       return nil, ctx.CallActivity(AutoApproveActivity, workflow.WithActivityInput(order)).Await(nil)
   }

   // Orders $1000+ require human approval (7 days max)
   var approval ApprovalResult
   err := ctx.WaitForExternalEvent("human_approval", time.Hour*24*7).Await(&approval)

   // Handle approval event or timeout
   if err == nil {
       return nil, ctx.CallActivity(ProcessApprovalActivity, workflow.WithActivityInput(approval)).Await(nil)
   }
   return nil, ctx.CallActivity(HandleTimeoutActivity, workflow.WithActivityInput(order)).Await(nil)
}
Click to expand

Author workflows in code to automate complex business processes that are stateful, durable, and long-running.

  • Automatic handling of failures and errors

  • Support for task chaining, fan-out/fan-in, monitor and external system interaction

  • Workflow state can be stored in your database

Code
async def main():
   order_processor = DurableAgent(
       name="OrderProcessingAgent",
       role="Order Processing Specialist",
       goal="Process customer orders with appropriate approval workflows",
       instructions=[
           "You are an order processing specialist that handles customer orders.",
           "For orders under $1000, automatically approve them.",
           "For orders $1000 or more, escalate them for manual approval.",
           "Use the process_order tool to handle order processing.",
           "Provide clear status updates to customers."
       ],
       tools=[process_order],
      
       # Dapr conversation api for LLM interactions
       llm=DaprChatClient(),

       # Execution state (workflow progress, retries, failure recovery)
       state_store_name="statestore",
       state_key="execution-orders",

       # Long-term memory (order history, customer preferences)
       memory=ConversationDaprStateMemory(
           session_id=f"session-orders-{uuid.uuid4().hex[:8]}"
       ),

       # Pub/Sub input for real-time interaction
       message_bus_name="message-pubsub",

       # Agent discovery store
       agents_registry_store_name="registry-state",
   )
Click to expand
Python

Write agents that have built-in reliability, observability and identity. Use CNCF’s Dapr Agents framework or bring your own.

  • Built-in reliability, observability and identity

  • Support for task chaining, fan-out/fan-in, monitor, and external system interaction

  • Secure Agent-to-Agent communication using HTTP, gRPC or Pub/Sub

What Catalyst helps you achieve

Orchestrate and understand complex processes
Guarantee your applications execute workflows to completion, irrespective of crashes, outages or full cluster shutdowns. Visualize and observe every activity from start to finish.
Build autonomous AI agents without sacrificing reliability
Bring resiliency and flexibility to your agentic applications, with the LLMs of your choice.
Connect and secure apps across any platform
Safely connect all your apps and agents across clouds and regions, with no new code. Keep connectivity simple as your application scales.
Accelerate development
Achieve 30% to 50% developer velocity gains, bringing applications to production faster.
Enforce governance, enable collaboration
With enterprise access control and project structures, foster collaboration while reducing risk.
Integrate and swap cloud services and LLMs without rewrites
Abstract away the storage and state concerns to speed up development and maintain portability.

Deliver on critical use cases

Process orchestration
Easily coordinate complex business processes, connecting services and APIs into reliable, scalable workflows without the heavy lifting of managing distributed systems.
Agentic Applications
Build resilient agentic AI applications that can reason, act, and collaborate—delivering innovation without the infrastructure overhead, controlling your LLM costs and enforcing high levels of security.
Human-in-the-Loop Workflows
No workflow is an island. Blend automation with human decision-making by enabling approvals, escalations, and inputs directly in your workflows.
Event-Driven Microservices
Applications need communication and choreography. Build agile, resilient systems with event-driven microservices that decouple dependencies and scale effortlessly.
Architecture Modernization
Incrementally migrate from legacy systems to modern cloud-native architectures with Catalyst providing service discovery, messaging, observability, resiliency, state management and orchestration.

Focus on business logic

Code with Dapr, let Catalyst handle the rest
Start for free
Your App. Your Compute
SDKs
Workflows
AI Agents
Dapr APIs
APIs for agents and microservices
Workflows
Service Invocation
Pub/Sub
State
Integration
Conversation
Jobs
Secrets
Your Infrastructure and LLMs
Databases
& Storage
Message
Brokers
Secrets
LLMs
 Dapr SDKs
Build connected applications, workflows and agents
Unified microservices programming model
Build applications and workflows with Dapr APIs including service invocation, pub/sub, secrets, jobs, and state.
Code-first workflow
Write workflows using familiar patterns in any programming language. Generate workflows from diagrams with Workflow Composer.
Any language, any framework, any cloud
Dapr is built to run with any framework or language and provides SDK support for Spring, Spring AI, .NET Aspire, ASP .NET Core, JS Express, FastAPI, and more.
Secure, durable agents
Use an agentic SDK that ensures non-deterministic, complex AI workflows run to completion and recover from failures.  Enable secure communication between agents using open standards.
Catalyst Platform
Orchestrate workflows and agents
Centralized Dapr, distributed workflows
Run workflows that span across Kubernetes, VMs, bare metal, and hybrid environments. Implement durable timers, child workflows, human-in-the-loop scenarios, and more.
Bring governance to your projects
Ensure proper structure and access control across all your applications.
Optimized workflow engine performance
Execute long-running, stateful processes reliably without managing infrastructure concerns or scaling.
Orchestrate long-lived agents with memory
Durable execution layer for AI-powered applications running anywhere with immediate insight into your agent’s actions and tool calls.

Catalyst deployment models

Get started today

Catalyze an application in under five minutes
Get Started for Free
1
Sign up for
Catalyst
2
Download the
Diagrid CLI
3
Clone a
quickstart app