{"id":46780995,"url":"https://github.com/zigflow/zigflow","last_synced_at":"2026-05-30T20:01:11.470Z","repository":{"id":308401698,"uuid":"1030452575","full_name":"zigflow/zigflow","owner":"zigflow","description":"Define durable workflows in YAML, powered by Temporal","archived":false,"fork":false,"pushed_at":"2026-05-29T22:22:35.000Z","size":52061,"stargazers_count":157,"open_issues_count":19,"forks_count":15,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-05-30T00:12:30.226Z","etag":null,"topics":["developer-tools","dsl","durable-execution","low-code","no-code","orchestration","serverless-workflow","temporal","temporal-dsl","workflow-management-system","workflow-orchestration","workflows","yaml","zigflow"],"latest_commit_sha":null,"homepage":"http://zigflow.dev/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zigflow.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":["mrsimonemms"],"buy_me_a_coffee":"mrsimonemms"}},"created_at":"2025-08-01T17:01:42.000Z","updated_at":"2026-05-29T14:38:45.000Z","dependencies_parsed_at":"2026-05-05T19:06:03.909Z","dependency_job_id":null,"html_url":"https://github.com/zigflow/zigflow","commit_stats":null,"previous_names":["mrsimonemms/temporal-serverless-workflow","mrsimonemms/temporal-dsl","mrsimonemms/zigflow","zigflow/zigflow"],"tags_count":51,"template":false,"template_full_name":null,"purl":"pkg:github/zigflow/zigflow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zigflow%2Fzigflow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zigflow%2Fzigflow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zigflow%2Fzigflow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zigflow%2Fzigflow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zigflow","download_url":"https://codeload.github.com/zigflow/zigflow/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zigflow%2Fzigflow/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33707328,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["developer-tools","dsl","durable-execution","low-code","no-code","orchestration","serverless-workflow","temporal","temporal-dsl","workflow-management-system","workflow-orchestration","workflows","yaml","zigflow"],"created_at":"2026-03-10T00:01:30.665Z","updated_at":"2026-05-30T20:01:11.463Z","avatar_url":"https://github.com/zigflow.png","language":"Go","funding_links":["https://github.com/sponsors/mrsimonemms","https://buymeacoffee.com/mrsimonemms"],"categories":[],"sub_categories":[],"readme":"\u003c!-- markdownlint-disable MD041 --\u003e\n[![Zigflow](./designs/zigflow.png \"Zigflow\")](https://zigflow.dev?utm_source=github\u0026utm_medium=readme\u0026utm_campaign=header)\n\n[![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/zigflow/zigflow/build.yml?style=flat\u0026label=Build)](https://github.com/zigflow/zigflow/actions/workflows/build.yml)\n[![GitHub Release](https://img.shields.io/github/v/release/zigflow/zigflow?label=Release)](https://github.com/zigflow/zigflow/releases/latest)\n[![GitHub Repo stars](https://img.shields.io/github/stars/zigflow/zigflow?style=flat\u0026label=Stars)](https://github.com/zigflow/zigflow)\n[![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/zigflow/zigflow/total?label=Downloads)](https://github.com/zigflow/zigflow/releases)\n[![Licence](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/zigflow/zigflow/blob/main/LICENSE)\n[![Go Report Card](https://goreportcard.com/badge/github.com/zigflow/zigflow)](https://goreportcard.com/report/github.com/zigflow/zigflow)\n[![Docs](https://img.shields.io/badge/Docs-zigflow.dev-blue)](https://zigflow.dev)\n\n**Declarative YAML workflows on Temporal. No SDK boilerplate.**\n\nZigflow lets you define and run [Temporal](https://temporal.io) workflows using\nYAML, built on the [CNCF Serverless Workflow](https://serverlessworkflow.io)\nspecification. You write a workflow definition; Zigflow compiles it into a\nfully-featured Temporal workflow with retries, state management and\ndeterministic execution. No Go, Java or TypeScript workflow code required.\n\n\u003e If this looks useful, a ⭐ helps others find the project.\n\n---\n\n## Quick start\n\nRun your first workflow in a few minutes and see the result.\n\n1. Install Zigflow\n\n   ```sh\n   brew tap zigflow/tap\n   brew install --cask zigflow\n   ```\n\n   For other options, see [installation docs](https://zigflow.dev/docs/getting-started/installation).\n\n2. Start a Temporal server\n\n   \u003e Requires the [Temporal CLI](https://docs.temporal.io/cli)\n\n   ```sh\n   temporal server start-dev\n   ```\n\n   The Temporal UI will be available at \u003chttp://localhost:8233\u003e.\n\n3. Create a workflow\n\n   Save this as `workflow.yaml`:\n\n   ```yaml\n   document:\n     dsl: 1.0.0\n     taskQueue: zigflow\n     workflowType: hello-world\n     version: 1.0.0\n   do:\n     - greet:\n         output:\n           as:\n             data: ${ . }\n         set:\n           message: Hello from Ziggy\n   ```\n\n4. Run it\n\n   ```sh\n   zigflow run -f workflow.yaml\n   ```\n\n5. Trigger the workflow\n\n   ```sh\n   temporal workflow start \\\n     --type hello-world \\\n     --task-queue zigflow \\\n     --workflow-id my-first-workflow\n\n   temporal workflow result \\\n     --workflow-id my-first-workflow\n   ```\n\n   You should see the workflow output in the CLI.\n\n### Next steps\n\n- [Documentation](https://zigflow.dev/docs)\n- [Examples](https://zigflow.dev/docs/examples)\n- [CLI reference](https://zigflow.dev/docs/cli/commands/zigflow_run)\n\n⭐ Star the repo if this was useful\n\n---\n\n## Why Zigflow exists\n\nWriting Temporal workflows in code is powerful, but it comes with overhead:\nlearning the SDK, wiring up workers and keeping workflow code deterministic.\nZigflow provides an opinionated declarative layer on top of Temporal, built\naround proven workflow patterns to simplify common orchestration use cases\nwhile retaining Temporal’s reliability and execution model.\n\n---\n\n## How it compares\n\nZigflow is an opinionated, declarative layer on top of Temporal. It trades some\nSDK-level flexibility for faster development and consistent workflow structure.\n\n| Capability | \u003cimg src=\"./designs/temporal.png#gh-light-mode-only\" alt=\"Temporal SDKs\" height=\"50px\" /\u003e\u003cimg src=\"./designs/temporal-dark.png#gh-dark-mode-only\" alt=\"Temporal SDKs\" height=\"50px\" /\u003e | Custom DSL | \u003cimg src=\"./designs/zigflow.png \" alt=\"Zigflow\" height=\"50px\" /\u003e |\n| --- | :--: | :--: | :--: |\n| **Workflow definition model** | Imperative code | Declarative | Declarative |\n| **Control and flexibility** | Maximum | Depends on implementation | Opinionated and constrained |\n| **Retries and durability** | ✅ Native Temporal | ⚠️ You build it | ✅ Native Temporal |\n| **Continue-as-new** | ✅ Supported (you implement and tune it) | ⚠️ You build it | ✅ Automatic (Zigflow continues as new for you) |\n| **CNCF spec alignment** | ❌ | ❌ Usually bespoke | ✅ Serverless Workflow v1.0+ |\n| **Validation before execution** | Manual or custom | Depends on implementation | ✅ Built-in validation |\n| **Boilerplate and worker setup** | Required | Depends on implementation | Minimal |\n| **Kubernetes deployment** | Manual | Manual | ✅ Helm chart included |\n| **Multi-language activities** | ✅ | Depends on implementation | ✅ Any Temporal SDK |\n\nUse the SDK when you need maximum flexibility. Use Zigflow when you want\nconsistent, declarative orchestration with less boilerplate.\n\n---\n\n## Who is Zigflow for?\n\nZigflow is designed for teams who value speed, consistency and declarative\norchestration over maximum SDK flexibility.\n\n- **Teams who want to ship workflows faster**: Zigflow removes SDK boilerplate\n  and worker wiring, so you can define, validate and run workflows in minutes.\n- **Platform teams building an internal orchestration layer**: centralise workflow\n  execution without requiring every team to learn or embed a Temporal SDK.\n- **Teams who prefer opinionated, declarative guardrails**: Zigflow constrains\n  workflow structure in useful ways, reducing accidental complexity.\n- **Workflow-as-configuration adopters**: store, version and review workflow\n  definitions as data rather than application code.\n- **Organisations already using Temporal** who want a simpler path for\n  straightforward orchestration without sacrificing reliability.\n- **Tool builders and automation platforms** that need a spec-compliant\n  execution engine behind a UI or higher-level abstraction.\n\n---\n\n## When not to use Zigflow\n\n- **You need advanced Temporal workflow APIs and fine tuning**: if you rely on\n  nuanced child workflow behaviour, rich per-call options, or patterns that are\n  easier to express directly in code, the Temporal SDK gives you the most\n  flexibility.\n- **You are building a deeply customised Temporal platform layer**: if your\n  architecture depends heavily on SDK-level interceptors, custom middleware, or\n  tight framework integrations, an SDK-first approach provides the broadest\n  control surface.\n- **Your workflows are highly dynamic at runtime**: if the structure of the\n  workflow is generated as it runs, or you are effectively building an execution\n  engine for arbitrary user logic, a code-first workflow is often a better fit.\n- **Your team prefers workflow development as application code**: if stepping\n  through workflow logic in a debugger, refactoring with compiler guarantees,\n  and unit testing workflow functions directly are central to your development\n  process, the SDK model may feel more natural.\n- **Your workflow contains substantial domain logic rather than orchestration**:\n  Zigflow excels at the declarative orchestration of activities and services. If\n  most of your business logic lives inside the workflow itself, with complex\n  in-memory decision making or algorithmic behaviour, writing workflows directly\n  in an SDK may be clearer.\n\nIn those cases, use Temporal directly. Zigflow is an opinionated layer on top of\nTemporal, not a replacement for its full SDK capabilities.\n\n---\n\n## How it works\n\n1. You define a workflow using YAML based on the Serverless Workflow spec.\n2. Zigflow validates the definition before execution.\n3. Zigflow compiles the definition into a Temporal workflow implementation.\n4. A worker is started for the configured namespace and task queue.\n5. Activities are executed by your existing Temporal workers.\n\nZigflow handles orchestration while your services execute the work.\n\n---\n\n## Examples\n\n### Send a monthly email\n\nSends an email every 30 days for 12 months using an HTTP endpoint.\n\n```yaml\ndocument:\n  dsl: 1.0.0\n  taskQueue: zigflow\n  workflowType: send-email\n  version: 0.0.1\ndo:\n  - for:\n      for:\n        in: ${ 12 } # repeat 12 times (once per month)\n      do:\n        - sendEmail:\n            call: http\n            with:\n              method: POST\n              endpoint: https://example.com/send-email\n              headers:\n                Content-Type: application/json\n              body:\n                to: user@example.com\n                subject: Hello\n                message: Hello from Zigflow\n        - wait30Days:\n            wait:\n              days: 30\n```\n\n```bash\nzigflow run -f ./workflow.yaml\n```\n\nZigflow starts the worker. You can then trigger the workflow from any\n[Temporal SDK](https://docs.temporal.io/encyclopedia/temporal-sdks), the\n[Temporal UI](https://docs.temporal.io/web-ui#workflow-actions) or the\n[Temporal CLI](https://docs.temporal.io/cli/workflow#start).\n\n- [**Task Queue**](https://docs.temporal.io/task-queue): `zigflow`\n- [**Workflow Type**](https://docs.temporal.io/workflows#intro-to-workflows): `send-email`\n\n---\n\n### Activity call\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eActivity call example (click to expand)\u003c/strong\u003e\u003c/summary\u003e\n\n\u003e Runnable version: [examples/activity-call](./examples/activity-call)\n\nCall external Temporal activities from a declarative definition. Input is\nvalidated against a JSON Schema before the workflow runs.\n\n```yaml\ndocument:\n  dsl: 1.0.0\n  taskQueue: zigflow\n  workflowType: activity-call\n  version: 0.0.1\n  metadata:\n    activityOptions:\n      startToCloseTimeout:\n        minutes: 1\ninput:\n  schema:\n    format: json\n    document:\n      type: object\n      required:\n        - userId\n      properties:\n        userId:\n          type: string\ndo:\n  - captureInput:\n      set:\n        requestedUserId: ${ $input.userId }\n        requestId: ${ uuid }\n  - fetchProfile:\n      call: activity\n      with:\n        name: activitycall.FetchProfile\n        arguments:\n          - ${ $data.requestedUserId }\n          - ${ $data.requestId }\n        taskQueue: activity-call-worker\n  - generateWelcome:\n      call: activity\n      with:\n        name: activitycall.GenerateWelcome\n        arguments:\n          - ${ $data.fetchProfile }\n        taskQueue: activity-call-worker\n  - finalize:\n      set:\n        workflowId: ${ $data.requestId }\n        profile: ${ $data.fetchProfile }\n        message: ${ $data.generateWelcome.message }\n```\n\nActivity workers can be written in any language with a Temporal SDK: Go,\nPython, TypeScript, Java and more. Zigflow handles the workflow orchestration;\nyour existing services handle the work.\n\n\u003e If you find these examples useful, consider giving the repo a ⭐. It helps\n\u003e the project grow.\n\n\u003c/details\u003e\n\n---\n\nMore examples (child workflows, fork/fan-out, signals, queries, try-catch,\nschedules and more) are in [examples/](./examples).\n\n---\n\n## Features\n\n- **Temporal DSL**: declarative YAML definitions that compile to Temporal workflows\n- **CNCF standard**: aligned with Serverless Workflow v1.0+\n- **Validation first**: definitions are validated before execution; invalid or\n  unsupported constructs are rejected with actionable errors\n- **Multi-language activities**: activity workers can use any Temporal SDK\n- **Low-code and visual-ready**: suitable for UI workflow builders and\n  orchestration tools\n- **Kubernetes-native**: Helm chart included for cluster deployments\n- **Open source**: Apache 2.0 licence, contributions welcome\n\n---\n\n## ⚡ What's with the name?\n\nZigflow is named after Ziggy, [Temporal's official mascot](https://temporal.io/blog/temporal-in-space).\n\nZiggy is a tardigrade, a microscopic animal that is\n[basically indestructible](https://en.wikipedia.org/wiki/Environmental_tolerance_in_tardigrades).\nSound familiar?\n\nAlso, the colours are based on the Ziggy Stardust lightning bolt.\n\n---\n\n## Telemetry\n\nTelemetry helps the maintainers understand whether Zigflow is being used in\nreal production environments. No personal or identifiable user data is collected.\n\nWhen a worker starts, Zigflow sends:\n\n- an anonymous installation ID (generated locally on first run, or derived from\n  the container hostname)\n- the Zigflow version\n- basic runtime information (OS, architecture, container detection)\n- approximate server country (2-letter code, derived once at startup)\n\nThe country value is derived once at startup and is not tied to any identity. No\nIP addresses are stored.\n\nWhen workflows are executed, Zigflow sends a periodic heartbeat (once per minute)\ncontaining:\n\n- the total number of workflow runs since the worker started\n- the worker uptime in seconds\n\nHeartbeats are only sent when the run count changes. Idle workers do not\nemit repeated telemetry.\n\nZigflow does **not** collect:\n\n- workflow definitions\n- workflow inputs or outputs\n- execution IDs\n- task names\n- hostnames\n- environment variable values\n- organisation identifiers\n- IP addresses or precise location data\n\nTelemetry exists solely to understand real-world adoption and usage.\n\n**Opting out** is straightforward:\n\n```sh\n# Environment variable\nDISABLE_TELEMETRY=true\n\n# CLI flag\n--disable-telemetry\n```\n\n---\n\n## Project status\n\nZigflow is under active development and evolving steadily.\n\n- The core execution engine and validation pipeline are stable.\n- The DSL schema follows semantic versioning.\n- Kubernetes deployment via Helm is supported.\n- Backwards compatibility is maintained within major versions.\n- Zigflow is actively used in internal tooling and early adopter environments.\n\nZigflow is designed for long-term use as the declarative orchestration layer on\ntop of Temporal.\n\nBug reports, feedback and contributions are welcome.\n\n---\n\n## Related projects\n\n- [Temporal](https://temporal.io)\n- [CNCF Serverless Workflow](https://serverlessworkflow.io)\n- [Helm chart](./charts/zigflow)\n\n---\n\n## Contributing\n\nContributions are welcome. See [CONTRIBUTING.md](./CONTRIBUTING.md) for\nguidelines on naming conventions, dev setup and commit style.\n\n---\n\n## Contributors\n\n\u003ca href=\"https://github.com/zigflow/zigflow/graphs/contributors\"\u003e\n  \u003cimg alt=\"Contributors\"\n    src=\"https://contrib.rocks/image?repo=zigflow/zigflow\u0026v=1769433596\" /\u003e\n\u003c/a\u003e\n\nMade with [contrib.rocks](https://contrib.rocks/preview?repo=zigflow%2Fzigflow).\n\n[![Star History Chart](https://api.star-history.com/svg?repos=zigflow/zigflow\u0026type=date\u0026legend=top-left)](https://www.star-history.com/#zigflow/zigflow\u0026type=date\u0026legend=top-left)\n\n---\n\n## For AI assistants\n\nUse \u003chttps://zigflow.dev/llms.txt\u003e for structured information about Zigflow for\nAI assistants and tooling.\n\n---\n\n## Licence\n\nDistributed under the [Apache-2.0](./LICENSE) licence.\n\n© 2025 - 2026 [Zigflow authors](https://github.com/zigflow/zigflow/graphs/contributors)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzigflow%2Fzigflow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzigflow%2Fzigflow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzigflow%2Fzigflow/lists"}