{"id":13416317,"url":"https://github.com/RailsEventStore/rails_event_store","last_synced_at":"2025-03-14T23:31:35.651Z","repository":{"id":29670298,"uuid":"33212527","full_name":"RailsEventStore/rails_event_store","owner":"RailsEventStore","description":"A Ruby implementation of an Event Store based on Active Record","archived":false,"fork":false,"pushed_at":"2024-10-28T18:35:04.000Z","size":14048,"stargazers_count":1418,"open_issues_count":76,"forks_count":121,"subscribers_count":37,"default_branch":"master","last_synced_at":"2024-10-29T11:28:03.146Z","etag":null,"topics":["aggregate-root","cqrs","cqrs-es","ddd","domain-driven-design","event-driven","event-driven-architecture","event-sourcing","rails","ruby"],"latest_commit_sha":null,"homepage":"http://railseventstore.org","language":"Ruby","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/RailsEventStore.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":"support/bundler/Gemfile.database","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-03-31T22:02:32.000Z","updated_at":"2024-10-23T07:34:32.000Z","dependencies_parsed_at":"2023-02-18T07:45:59.282Z","dependency_job_id":"75aa1387-42e2-49ed-ac34-b7142261b9f3","html_url":"https://github.com/RailsEventStore/rails_event_store","commit_stats":{"total_commits":6890,"total_committers":84,"mean_commits":82.02380952380952,"dds":0.5853410740203193,"last_synced_commit":"c2575facf7eeb881df3c436197aae51fb0f00134"},"previous_names":[],"tags_count":103,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RailsEventStore%2Frails_event_store","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RailsEventStore%2Frails_event_store/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RailsEventStore%2Frails_event_store/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RailsEventStore%2Frails_event_store/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RailsEventStore","download_url":"https://codeload.github.com/RailsEventStore/rails_event_store/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243663514,"owners_count":20327300,"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":["aggregate-root","cqrs","cqrs-es","ddd","domain-driven-design","event-driven","event-driven-architecture","event-sourcing","rails","ruby"],"created_at":"2024-07-30T21:00:56.982Z","updated_at":"2025-03-14T23:31:35.618Z","avatar_url":"https://github.com/RailsEventStore.png","language":"Ruby","readme":"# Rails Event Store\n\n[Rails Event Store (RES)](https://railseventstore.org/) is a library for publishing, consuming, storing and retrieving events. It's your best companion for going with an event-driven architecture for your Rails application.\n\nYou can use it:\n\n*   as your [Publish-Subscribe bus](https://railseventstore.org/docs/pubsub/)\n*   to decouple core business logic from external concerns in Hexagonal style architectures\n*   as [an alternative to ActiveRecord callbacks and Observers](https://blog.arkency.com/2016/05/domain-events-over-active-record-callbacks/)\n*   as a communication layer between loosely coupled components\n*   to react to published events synchronously or asynchronously\n*   to extract side-effects (notifications, metrics etc) from your controllers and services into event handlers\n*   to build an audit-log\n*   to create read-models\n*   to implement event-sourcing\n\n## Documentation\n\nDocumentation, tutorials and code samples are available at [https://railseventstore.org](https://railseventstore.org).\n\n## Code status\n\nThis single repository hosts several gems and website with documentation — see the [contribution guide](https://railseventstore.org/contributing/).\n\nWe're aiming for 100% mutation coverage in this project. This is why:\n\n- [Why I want to introduce mutation testing to the rails_event_store gem](https://blog.arkency.com/2015/04/why-i-want-to-introduce-mutation-testing-to-the-rails-event-store-gem/)\n- [Mutation testing and continuous integration](https://blog.arkency.com/2015/05/mutation-testing-and-continuous-integration/)\n\nWhenever you fix a bug or add a new feature, we require that the coverage doesn't go down.\n\n### RailsEventStore gems\n\n| Name                                                               | CI                                                                                                                                                                                                                                                                                    | Version                                                                                                                                             | Downloads                                                                                                                                            |\n|--------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------|\n| [rails_event_store](/rails_event_store)                            | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/rails_event_store_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/rails_event_store_test.yml)                            | [![Gem](https://img.shields.io/gem/v/rails_event_store?style=flat-square)](https://rubygems.org/gems/rails_event_store)                             | [![Gem](https://img.shields.io/gem/dt/rails_event_store?style=flat-square)](https://rubygems.org/gems/rails_event_store)                             |\n| [rails_event_store_active_record](/ruby_event_store/active_record)  | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-active_record_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-active_record_test.yml)  | [![Gem](https://img.shields.io/gem/v/rails_event_store_active_record?style=flat-square)](https://rubygems.org/gems/rails_event_store_active_record)   | [![Gem](https://img.shields.io/gem/dt/rails_event_store_active_record?style=flat-square)](https://rubygems.org/gems/rails_event_store_active_record)   |\n| [ruby_event_store-active_record](/ruby_event_store/active_record)  | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-active_record_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-active_record_test.yml)  | [![Gem](https://img.shields.io/gem/v/ruby_event_store-active_record?style=flat-square)](https://rubygems.org/gems/ruby_event_store-active_record)   | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-active_record?style=flat-square)](https://rubygems.org/gems/ruby_event_store-active_record)   |\n| [ruby_event_store](/ruby_event_store)                              | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store_test.yml)                              | [![Gem](https://img.shields.io/gem/v/ruby_event_store?style=flat-square)](https://rubygems.org/gems/ruby_event_store)                               | [![Gem](https://img.shields.io/gem/dt/ruby_event_store?style=flat-square)](https://rubygems.org/gems/ruby_event_store)                               |\n| [ruby_event_store-browser](/ruby_event_store-browser)              | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-browser_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-browser_test.yml)              | [![Gem](https://img.shields.io/gem/v/ruby_event_store-browser?style=flat-square)](https://rubygems.org/gems/ruby_event_store-browser)               | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-browser?style=flat-square)](https://rubygems.org/gems/ruby_event_store-browser)               |\n| [ruby_event_store-rspec](/ruby_event_store-rspec)                  | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-rspec_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-rspec_test.yml)                  | [![Gem](https://img.shields.io/gem/v/ruby_event_store-rspec?style=flat-square)](https://rubygems.org/gems/ruby_event_store-rspec)                   | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-rspec?style=flat-square)](https://rubygems.org/gems/ruby_event_store-rspec)                   |\n| [aggregate_root](/aggregate_root)                                  | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/aggregate_root_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/aggregate_root_test.yml)                                  | [![Gem](https://img.shields.io/gem/v/aggregate_root?style=flat-square)](https://rubygems.org/gems/aggregate_root)                                   | [![Gem](https://img.shields.io/gem/dt/aggregate_root?style=flat-square)](https://rubygems.org/gems/aggregate_root)                                   |\n\n### Contributed gems\n\n| Name                                                                              | CI                                                                                                                                                                                                                                                                                           | Version                                                                                                                                                   | Downloads                                                                                                                                                  |\n|-----------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| [ruby_event_store-outbox](/contrib/ruby_event_store-outbox)                       | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-outbox_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-outbox_test.yml)                       | [![Gem](https://img.shields.io/gem/v/ruby_event_store-outbox?style=flat-square)](https://rubygems.org/gems/ruby_event_store-outbox)                       | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-outbox?style=flat-square)](https://rubygems.org/gems/ruby_event_store-outbox)                       |\n| [ruby_event_store-protobuf](/contrib/ruby_event_store-protobuf)                   | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-protobuf_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-protobuf_test.yml)                   | [![Gem](https://img.shields.io/gem/v/ruby_event_store-protobuf?style=flat-square)](https://rubygems.org/gems/ruby_event_store-protobuf)                   | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-protobuf?style=flat-square)](https://rubygems.org/gems/ruby_event_store-protobuf)                   |\n| [ruby_event_store-profiler](/contrib/ruby_event_store-profiler)                   | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-profiler_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-profiler_test.yml)                   | [![Gem](https://img.shields.io/gem/v/ruby_event_store-profiler?style=flat-square)](https://rubygems.org/gems/ruby_event_store-profiler)                   | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-profiler?style=flat-square)](https://rubygems.org/gems/ruby_event_store-profiler)                   |\n| [ruby_event_store-flipper](/contrib/ruby_event_store-flipper)                     | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-flipper_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-flipper_test.yml)                     | [![Gem](https://img.shields.io/gem/v/ruby_event_store-flipper?style=flat-square)](https://rubygems.org/gems/ruby_event_store-flipper)                     | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-flipper?style=flat-square)](https://rubygems.org/gems/ruby_event_store-flipper)                     |\n| [ruby_event_store-transformations](/contrib/ruby_event_store-transformations)     | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-transformations_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-transformations_test.yml)     | [![Gem](https://img.shields.io/gem/v/ruby_event_store-transformations?style=flat-square)](https://rubygems.org/gems/ruby_event_store-transformations)     | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-transformations?style=flat-square)](https://rubygems.org/gems/ruby_event_store-transformations)     |\n| [ruby_event_store-rom](/contrib/ruby_event_store-rom)                             | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-rom_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-rom_test.yml)                             | [![Gem](https://img.shields.io/gem/v/ruby_event_store-rom?style=flat-square)](https://rubygems.org/gems/ruby_event_store-rom)                             | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-rom?style=flat-square)](https://rubygems.org/gems/ruby_event_store-rom)                             |\n| [ruby_event_store-sidekiq_scheduler](/contrib/ruby_event_store-sidekiq_scheduler) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-sidekiq_scheduler_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-sidekiq_scheduler_test.yml) | [![Gem](https://img.shields.io/gem/v/ruby_event_store-sidekiq_scheduler?style=flat-square)](https://rubygems.org/gems/ruby_event_store-sidekiq_scheduler) | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-sidekiq_scheduler?style=flat-square)](https://rubygems.org/gems/ruby_event_store-sidekiq_scheduler) |\n\n### Unreleased contributed gems\n| Name                                                              | CI                                                                                                                                                                                                                                                                         |\n|-------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| [ruby_event_store-newrelic](/contrib/ruby_event_store-newrelic)   | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-newrelic_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-newrelic_test.yml) |\n| [minitest-ruby_event_store](/contrib/minitest-ruby_event_store)   | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/minitest-ruby_event_store_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/minitest-ruby_event_store_test.yml) |\n| [dres_rails](/contrib/distributed_rails_event_store/dres_rails)   | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/dres_rails_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/dres_rails_test.yml)                               |\n| [dres_client](/contrib/distributed_rails_event_store/dres_client) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/dres_client_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/dres_client_test.yml)                             |\n\n## About\n\n\u003cimg src=\"https://arkency.com/logo.svg\" alt=\"Arkency\" height=\"48\" align=\"left\" /\u003e\n\nThis repository is funded and maintained by [arkency](https://arkency.com). Make sure to check out our [Rails Architect Masterclass training](https://arkademy.dev) and long-term [support plans](https://railseventstore.org/support/) available.\n","funding_links":[],"categories":["Ruby","Event Sourcing","Abstraction","Gems"],"sub_categories":["Articles"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FRailsEventStore%2Frails_event_store","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FRailsEventStore%2Frails_event_store","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FRailsEventStore%2Frails_event_store/lists"}