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 visualize, share, and maintain, without sacrificing the power and reliability of Temporal.


✨ 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 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.


🧭 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.


🪪 License

Distributed under the Apache-2.0 license

© 2025 Zigflow authors