{"id":13509176,"url":"https://github.com/indeedeng/iwf","last_synced_at":"2026-01-07T23:11:22.011Z","repository":{"id":49808695,"uuid":"518169634","full_name":"indeedeng/iwf","owner":"indeedeng","description":"iWF is a Workflow-As-Code microservice orchestration platform offering an orchestration coding framework and service for building resilient, fault-tolerant, scalable long-running processes","archived":false,"fork":false,"pushed_at":"2025-05-06T21:24:03.000Z","size":13091,"stargazers_count":567,"open_issues_count":73,"forks_count":54,"subscribers_count":21,"default_branch":"main","last_synced_at":"2025-05-06T21:26:06.906Z","etag":null,"topics":["distributed-process","distributed-system","distributed-transactions","durable-timer","golang","java","message-queue","microservice","orchestration","orchestrator","persistence","process","python","timer","workflow","workflow-as-code","workflow-engine"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/indeedeng.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-07-26T18:11:41.000Z","updated_at":"2025-05-06T21:24:07.000Z","dependencies_parsed_at":"2022-09-05T23:40:53.390Z","dependency_job_id":"b58de270-dde5-4543-a18f-d317dd7b0f3c","html_url":"https://github.com/indeedeng/iwf","commit_stats":null,"previous_names":["cadence-oss/iwf-server"],"tags_count":50,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indeedeng%2Fiwf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indeedeng%2Fiwf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indeedeng%2Fiwf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/indeedeng%2Fiwf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/indeedeng","download_url":"https://codeload.github.com/indeedeng/iwf/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254310502,"owners_count":22049471,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["distributed-process","distributed-system","distributed-transactions","durable-timer","golang","java","message-queue","microservice","orchestration","orchestrator","persistence","process","python","timer","workflow","workflow-as-code","workflow-engine"],"created_at":"2024-08-01T02:01:04.085Z","updated_at":"2026-01-07T23:11:22.006Z","avatar_url":"https://github.com/indeedeng.png","language":"Go","readme":"# iWF project - main \u0026 server repo\n\n[![Slack Status](https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack\u0026style=social)](http://iworkflow-slack.work)\n[![Go Reference](https://pkg.go.dev/badge/github.com/indeedeng/iwf.svg)](https://pkg.go.dev/github.com/indeedeng/iwf)\n[![Go Report Card](https://goreportcard.com/badge/github.com/indeedeng/iwf)](https://goreportcard.com/report/github.com/indeedeng/iwf)\n[![Coverage Status](https://codecov.io/github/indeedeng/iwf/coverage.svg?branch=main)](https://app.codecov.io/gh/indeedeng/iwf/branch/main)\n[![Static Badge for Temporal Code Exchange](https://img.shields.io/badge/Temporal-Code_Exchange_Featured-blue?style=flat-square\u0026logo=temporal\u0026labelColor=141414\u0026color=444CE7)](https://temporal.io/code-exchange/indeed-workflow-framework-iwf)\n\n[![Build status](https://github.com/indeedeng/iwf/actions/workflows/ci-cadence-integ-test.yml/badge.svg?branch=main)](https://github.com/indeedeng/iwf/actions/workflows/ci-cadence-integ-test.yml)\n[![Build status](https://github.com/indeedeng/iwf/actions/workflows/ci-temporal-integ-test.yml/badge.svg?branch=main)](https://github.com/indeedeng/iwf/actions/workflows/ci-temporal-integ-test.yml)\n\n\n# What is iWF\nIndeed Workflow Framework(iWF) is a coding framework with service to streamlines workflows that involve waiting on external events, handling timeouts, \nand persisting state over long durations. With iWF, developers can build scalable, maintainable workflows that adapt to real-time events and integrate seamlessly with external systems. \n\n## What Makes iWF Unique \n* **Workflow-As-Code** uses native code to define everything: branching, looping, parallel threads, variables, schema etc.\n* **Structured Programming** provides well-orginized structure to maintain workflow that is natural and easy to read.\n* **Durable Timer** provides timer that is durable, resilient to system failure.\n* **Automatic Retry** the background execution units(WorkflowState) are inherently resilient to failure, with built in distributed backoff retry using durable timer.\n* **Simplified Architecture** iWF applications are all REST based micro-services which are easy to deploy, monitor, scale, maintain(version) and operate with industry standards.\n* **Simplicity and explicitness of APIs** uses as few concepts as possible to model complex logic. It uses clear abstractions to defines workflows in terms of discrete states, with waitUntil conditions and execute actions, declarative schema for data and search attributes for persistence, and RPC for external interaction for both read and write.\n* **Dynamic Interactions** allows external applications to interact with running workflows through RPC, signals, and internal channels.\n* **Extensive tooling** provides tooling to look up running state definitions, skipping timers, enhanced resetting etc.\n\n## Use case study/examples\n* [SAGA pattern](https://medium.com/@qlong/saga-pattern-deep-dive-with-indeed-workflow-engine-b7e82c59e51f?sk=672abd70b0e092d4cda7788276c5a241)\n  * [Java samples](https://github.com/indeedeng/iwf-java-samples/tree/main/src/main/java/io/iworkflow/workflow/money/transfer), [Golang samples](https://github.com/indeedeng/iwf-golang-samples/tree/main/workflows/moneytransfer), [Python samples](https://github.com/indeedeng/iwf-python-samples/tree/main/moneytransfer)\n* [User sign-up/registry in Python/Java](https://github.com/indeedeng/iwf/wiki/Use-case-study-%E2%80%90%E2%80%90-user-signup-workflow)\n* [Abstracted microservice orchestration in Java/Golang](https://github.com/indeedeng/iwf/wiki/Use-case-study-%E2%80%90%E2%80%90-Microservice-Orchestration)\n* Employer \u0026 JobSeeker engagement in [Java](https://github.com/indeedeng/iwf-java-samples/tree/main/src/main/java/io/iworkflow/workflow/engagement) or [Golang](https://github.com/indeedeng/iwf-golang-samples/blob/main/workflows/engagement)\n* Subscription Workflow in [Java](https://github.com/indeedeng/iwf-java-samples/tree/main/src/main/java/io/iworkflow/workflow/subscription) or [Golang](https://github.com/indeedeng/iwf-golang-samples/blob/main/workflows/subscription)\n* [Design Patterns](https://medium.com/@qlong/iwf-design-patterns-936a48336766)\n\n## Basic concepts\n* [Basic concepts overview](https://github.com/indeedeng/iwf/wiki/Basic-concepts-overview)\n* [WorkflowState](https://github.com/indeedeng/iwf/wiki/WorkflowState)\n* [RPC](https://github.com/indeedeng/iwf/wiki/RPC)\n* [Persistence](https://github.com/indeedeng/iwf/wiki/Persistence)\n\nSee more in [iWF wiki](https://github.com/indeedeng/iwf/wiki).\n\n# How to use\n\nAs a coding framework, iWF provides three SDKs to use with:\n\n* [iWF Java SDK](https://github.com/indeedeng/iwf-java-sdk) and [samples](https://github.com/indeedeng/iwf-java-samples)\n* [iWF Golang SDK](https://github.com/indeedeng/iwf-golang-sdk) and [samples](https://github.com/indeedeng/iwf-golang-samples)\n* [iWF Python SDK](https://github.com/indeedeng/iwf-python-sdk) and [samples](https://github.com/indeedeng/iwf-python-samples)\n\nThe iWF SDKs required a server to run against. See below options to run the server locally. See [iWF wiki](https://github.com/indeedeng/iwf/wiki) for production \n\n## Using all-in-one docker image\n\nThis is the simplest option to run the server locally for development.\n\nRun the docker command to start the container for:\n* IWF service: http://localhost:8801/\n* Temporal WebUI: http://localhost:8233/\n* Temporal service: localhost:7233\n```shell\ndocker pull iworkflowio/iwf-server-lite:latest \u0026\u0026 docker run -p 8801:8801 -p 7233:7233 -p 8233:8233 -e AUTO_FIX_WORKER_URL=host.docker.internal --add-host host.docker.internal:host-gateway -it iworkflowio/iwf-server-lite:latest\n```\n\n## Using docker image \u0026 docker-compose\n\nThis option runs Temporal in separate container with slightly more power (more search attributes allowed).\n\nCheckout this repo, and run:\n\n```shell\ndocker pull iworkflowio/iwf-server:latest \u0026\u0026 docker-compose -f ./docker-compose/docker-compose.yml up\n```\n\nThis by default will run Temporal server with it, again:\n* IWF service: http://localhost:8801/\n* Temporal WebUI: http://localhost:8233/\n* Temporal service: localhost:7233\n\n## Production\nCheck the [wiki](https://github.com/indeedeng/iwf/wiki/iWF-Server-Operations#how-to-deploy).\n\n# Support\n\nJoin our Slack channel! [![Slack Status](https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack\u0026style=social)](http://iworkflow-slack.work)\n\nYou can also post in our [Discussion](https://github.com/indeedeng/iwf/discussions), or raise an issue.\n\n# Contributing\n\nCheck out our [CONTRIBUTING](https://github.com/indeedeng/iwf/blob/main/CONTRIBUTING.md) page.\n\n\n# Posts \u0026 Articles \u0026 Reference\n* [Why I created Indeed Workflow Framework](https://medium.com/@qlong/a-letter-to-cadence-temporal-and-workflow-tech-community-b32e9fa97a0c)\n* [iWF on Temporal CodeExchange](https://temporal.io/code-exchange/indeed-workflow-framework-iwf)\n* [14 “Modern” Backend Software Design Patterns with Indeed Workflow Framework(iWF) on Temporal](https://medium.com/@qlong/iwf-design-patterns-936a48336766)\n* [iWF Overview for Temporal Users](https://medium.com/@qlong/iwf-overview-for-temporal-users-part1-programming-model-difference-9f58e4793cfa)\n* [Build Reliable AI Agents with Indeed Workflow Framework on Temporal](https://medium.com/@qlong/build-reliable-ai-agents-with-iwf-on-temporal-7f1a101e000b)\n* Cadence community spotlights\n  * [#1](https://cadenceworkflow.io/blog/2023/01/31/community-spotlight-january-2023/)\n  * [#2](https://cadenceworkflow.io/blog/2023/11/30/community-spotlight-update-november-2023/)\n  * [#3](https://cadenceworkflow.io/blog/2023/08/31/community-spotlight-august-2023/)\n* iWF is an abstracted Temporal [framework](https://github.com/temporalio/awesome-temporal). Same for [Cadence](https://github.com/uber/cadence#cadence).\n* [How ContinueAsNew is built in iWF](https://medium.com/@qlong/guide-to-continueasnew-in-cadence-temporal-workflow-using-iwf-as-an-example-part-1-c24ae5266f07)\n","funding_links":[],"categories":["Web Frameworks","Go","Frameworks","workflow","Web框架","Full fledged product","\u003ca name=\"Go\"\u003e\u003c/a\u003eGo"],"sub_categories":["Utility/Miscellaneous","Terraform Providers","实用程序/Miscellaneous"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Findeedeng%2Fiwf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Findeedeng%2Fiwf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Findeedeng%2Fiwf/lists"}