Skip to content

mrsimonemms/zigflow

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Zigflow: Declarative workflows for Temporal

Contributions Welcome Licence GitHub Release Go Report Card

Zigflow provides a simple and declarative way to define and manage Temporal workflows using the CNCF Serverless Workflow specification. It enables low-code and no-code workflow creation that's easy to visualise, share, and maintain, without sacrificing the power and reliability of Temporal.


πŸ›Ÿ Help


✨ Features

  • βœ… CNCF Standard – fully aligned with Serverless Workflow v1.0+
  • βœ… Low-code & Visual-ready – ideal for UI workflow builders and orchestration tools
  • βœ… Powered by Temporal – battle-tested reliability, retries, and state management
  • βœ… Kubernetes-native – includes a Helm chart for easy deployment
  • βœ… Open & Extensible – customize, extend, and contribute easily

⚑️ ZigFlow?

Ziggy is a tardigrade and Temporal's official mascot. They're a microscopic animal that is basically indestructible.

Sound familiar?


🧩 Example

Define a workflow declaratively in YAML:

document:
  dsl: 1.0.0
  namespace: MoneyTransfer # Mapped to the task queue
  name: AccountTransferWorkflow # Workflow name
  version: 0.0.1
  title: Money Transfer Demo
  summary: Temporal's world-famous Money Transfer Demo, in DSL form
do:
  - queryState:
      listen:
        to:
          one:
            with:
              # ID maps to the query name in Temporal
              id: transferStatus
              # Temporal query - used to make read requests
              type: query
              # The data returned from the query - for application/json, this must be a string so Go interpolation works correctly
              data:
                approvalTime: ${ .data.stateApprovalTime }
                chargeResult:
                  chargeId: ${ .data.stateChargeId }
                progressPercentage: ${ .data.stateProgressPercentage }
                transferState: ${ .data.stateTransferState }
                workflowStatus: ${ .data.stateWorkflowStatus }
  - setup:
      set:
        idempotencyKey: ${ uuid }
        stateApprovalTime: 30
        stateChargeId: ${ uuid }
        stateProgressPercentage: 0
        stateTransferState: starting
        stateWorkflowStatus: ""
  - validate:
      call: http
      with:
        method: post
        endpoint: http://server:3000/validate
  - updateState:
      set:
        stateProgressPercentage: 25
        stateTransferState: running
  - withdraw:
      call: http
      with:
        method: post
        endpoint: http://server:3000/withdraw
        headers:
          content-type: application/json
        body:
          amount: ${ .input.amount }
          attempt: ${ .data.activity.attempt }
          idempotencyKey: ${ .data.idempotencyKey }
          name: ${ .data.workflow.workflow_type_name }
  - updateState:
      set:
        stateProgressPercentage: 50
  - deposit:
      call: http
      with:
        method: post
        endpoint: http://server:3000/deposit
        headers:
          content-type: application/json
        body:
            amount: ${ .input.amount }
            attempt: ${ .data.activity.attempt }
            idempotencyKey: ${ .data.idempotencyKey }
            name: ${ .data.workflow.workflow_type_name }
  - updateState:
      set:
        stateProgressPercentage: 75
  - sendNotification:
      call: http
      with:
        method: post
        endpoint: http://server:3000/notify
        headers:
          content-type: application/json
        body:
          amount: ${ .input.amount }
          fromAccount: ${ .input.fromAccount }
          toAccount: ${ .input.toAccount }
  - updateState:
      set:
        stateProgressPercentage: 100
        stateTransferState: finished

Run it through Zigflow:

zigflow -f ./path/to/workflow.yaml

This builds your Temporal workflow and runs the workers β€” no additional Go boilerplate required.

You can now run it with any Temporal SDK.


πŸ“ˆ Telemetry

Telemetry helps us understand if people are actually using Zigflow. Stars are great, but a tiny bit of usage data gives us a clearer picture of what’s happening out there.

Zigflow creates a UUID (stored in ~/.config/zigflow) and sends just two things:

  • that anonymous ID
  • the Zigflow version you’re running

That's it.

Telemetry is optional and easy to turn off. You can disable it by setting the environment variable:

DISABLE_TELEMETRY=true

or by running Zigflow with:

--disable-telemetry

🧭 Related Projects


🀝 Contributing

Contributions are welcome!

Open in a container

Commit style

All commits must be done in the Conventional Commit format.

<type>[optional scope]: <description>

[optional body]

[optional footer(s)]

⭐️ Contributors

Contributors

Made with contrib.rocks.

Star History Chart


πŸͺͺ License

Distributed under the Apache-2.0 license

Β© 2025 Zigflow authors

About

Turn your declarative YAML into production-ready Temporal workflows

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Sponsor this project

  •  

Packages

 
 
 

Contributors 3

  •  
  •  
  •