Skip to main content

Define durable workflows in YAML

Run workflows with built-in retries, failure handling and long-running execution, powered by Temporal.

Write steps, not plumbing

Define your workflow as a sequence of named tasks in YAML. No SDK, no orchestration scaffolding, no boilerplate. Your workflow file is the entire implementation.

Durability out of the box

Every workflow runs on Temporal. Retries, crash recovery and execution history are handled for you, without any extra configuration.

Catch errors early

Zigflow validates your workflow file before execution starts. Invalid constructs and unsupported fields are rejected with clear, actionable error messages.

See how it works

Two steps. Fetch a user profile, then send a welcome email. If either step fails, Temporal retries it automatically using the retry policy defined in the YAML.

Your workflow is a single file. Validate it, run it and share it.

Try your first workflow
workflow.yaml
document:
dsl: 1.0.0
namespace: acme
name: onboard-user
version: 1.0.0
do:
- fetchProfile:
call: http
with:
method: get
endpoint: ${ "https://api.acme.com/users/" + ($input.userId | tostring) }
output:
as:
profile: ${ . }
- sendWelcome:
call: http
metadata:
activityOptions:
retryPolicy:
maximumAttempts: 3
with:
method: post
endpoint: https://api.acme.com/emails
body:
to: ${ .profile.email }
template: welcome

Every Zigflow workflow runs on Temporal, a battle-tested engine for durable execution. You get automatic retries, crash recovery and full execution history without writing SDK code.

Example workflows

A selection of real workflow patterns, each defined in YAML and ready to run. Full examples are also available in the GitHub repo.

Child Workflows

Define multiple workflows and call a child workflow from a parent

workflow.yaml
document:
dsl: 1.0.0
namespace: zigflow
name: childWorkflow
version: 0.0.1
title: Child Workflows
summary: Define multiple workflows and call a child workflow from a parent
timeout:
after:
minutes: 1
do:
- parentWorkflow:
do:
- wait:
wait:
seconds: 5
# Call child workflow as a single workflow - this will be run synchronously
- callChildWorkflow1:
run:
workflow:
name: child-workflow1
namespace: default
version: 0.0.0
# Do a fan-out child workflow - this will be run asynchronously
- fanOut:
fork:
compete: false
branches:
- callWorkflow1:
run:
workflow:
name: child-workflow1
namespace: default
version: 0.0.0
- callWorkflow2:
run:
workflow:
name: child-workflow2
namespace: default
version: 0.0.0
- wait:
output:
as:
completed: true
wait:
seconds: 5
- child-workflow1:
do:
- wait:
wait:
seconds: 10
- child-workflow2:
do:
- wait:
wait:
seconds: 3