{"id":32164492,"url":"https://github.com/work-capital/workflow","last_synced_at":"2026-02-18T21:02:19.140Z","repository":{"id":57556862,"uuid":"70412021","full_name":"work-capital/workflow","owner":"work-capital","description":"Functional CQRS Eventsourcing Engine","archived":false,"fork":false,"pushed_at":"2017-01-23T21:50:49.000Z","size":148,"stargazers_count":24,"open_issues_count":2,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-26T07:37:35.003Z","etag":null,"topics":["cqrs","cqrs-framework","elixir","erlang","event-sourcing","eventsourcing","eventstore"],"latest_commit_sha":null,"homepage":"","language":"Elixir","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/work-capital.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-10-09T15:25:51.000Z","updated_at":"2025-03-12T06:39:18.000Z","dependencies_parsed_at":"2022-08-25T20:00:41.282Z","dependency_job_id":null,"html_url":"https://github.com/work-capital/workflow","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/work-capital/workflow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/work-capital%2Fworkflow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/work-capital%2Fworkflow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/work-capital%2Fworkflow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/work-capital%2Fworkflow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/work-capital","download_url":"https://codeload.github.com/work-capital/workflow/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/work-capital%2Fworkflow/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29490360,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-15T19:29:10.908Z","status":"ssl_error","status_checked_at":"2026-02-15T19:29:10.419Z","response_time":118,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["cqrs","cqrs-framework","elixir","erlang","event-sourcing","eventsourcing","eventstore"],"created_at":"2025-10-21T14:46:46.462Z","updated_at":"2026-02-18T21:02:19.134Z","avatar_url":"https://github.com/work-capital.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"CQRS Eventsourcing Workflow Engine\n==================================\n\n[![Join the chat at https://gitter.im/cqrs-engine/Lobby](https://badges.gitter.im/cqrs-engine/Lobby.svg)](https://gitter.im/cqrs-engine/Lobby?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\n### IMPORTANT\nOnly the data structures are working, for testing and collecting feedbacks. \nWe believe that at the begining of December 2016, the framework will be usable.\n\n\n### Pure functions data structures\nIn the folder engine \u003e types you will find the data structures, so you can write\nyour pure functions over them, under the \"side effects\" dimension. \n\n1. A pure function is given one or more input parameters.\n2. Its result is based solely off of those parameters and its algorithm. The algorithm will not be based on any hidden state in the class or object it’s contained in.\n3. It won’t mutate the parameters it’s given.\n4. It won’t mutate the state of its class or object.\n5. It doesn’t perform any I/O operations, such as reading from disk, writing to disk, prompting for input, or reading input.\n\n\n### Motivation\n\nAs aggregates listen for commands, process managers listen for events (sometimes commands also), and as aggregates emmits events, process managers dispatch commands.\n\n* pure functional data structures for aggregates and process managers\n* use monads (monadex) to simulate different business scenarios\n* one abstraction to implement side-effects\n* multiple data-stores\n* plugable message queue for publishing events\n* one gen_server implementation for aggregates and process managers\n* automatic process-manager creation based on correlation-ids (as suggested by Greg Young)\n* easy use of FSM on process managers\n\n### Develop\n\n```\nmix test.watch\n```\n\nSend events from the prompt:\n\n```\niex -S mix\nTODO: add example\n\n```\n\n\n### Eventstore\nRun a [docker](https://github.com/EventStore/eventstore-docker) instance in your machine. If you have mac, ask the sys-admin to start it in a linux server on you LAN or WAN. Access the web gui in http://localhost:2113 . User: admin, pass: changeit\n\n\n```\ndocker run --name eventstore-node -it -p 2113:2113 -p 1113:1113 eventstore/eventstore\n```\n\n#### Resources\nBelow you can see several resources I researched before writing this lib.\nSpecial thanks for Ben Smith, where many ideas were copied from\n[commanded](https://github.com/slashdotdash/commanded) library.\n\n* [burmajam](https://github.com/burmajam) for sharing the very \nwell written extreme driver to connect to Eventstore. \n* [slashdotdash](https://github.com/slashdotdash/commanded) for sharing the CQRS\nframework, where many parts of the code here are from his framework.\n* [cqrs-erlang](https://github.com/bryanhunter/cqrs-with-erlang) - A memory\n  model using standard spawn functions CQRS in erlang. \n* [gen-aggregate](https://github.com/burmajam/gen_aggregate/) - Macro for the\n  aggregate structure, using buffers. \n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwork-capital%2Fworkflow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwork-capital%2Fworkflow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwork-capital%2Fworkflow/lists"}