{"id":50682770,"url":"https://github.com/deveel/hermodr","last_synced_at":"2026-06-08T20:04:21.340Z","repository":{"id":305813202,"uuid":"774007614","full_name":"deveel/hermodr","owner":"deveel","description":"A simple framework to publish and events within an application","archived":false,"fork":false,"pushed_at":"2026-06-04T21:07:46.000Z","size":9947,"stargazers_count":3,"open_issues_count":34,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-04T21:32:35.256Z","etag":null,"topics":["aspnetcore","cloudevents","cloudevents-schema","ddd","domain-driven-design","dotnet","dotnetcore","event-driven","event-schema","events","masstransit","publisher","rabbitmq","schema"],"latest_commit_sha":null,"homepage":"","language":"C#","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/deveel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/contributing.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-03-18T19:29:17.000Z","updated_at":"2026-06-04T21:07:49.000Z","dependencies_parsed_at":"2025-07-22T06:45:52.208Z","dependency_job_id":"18d0ad65-a266-47a1-ae2e-1490968ea0ed","html_url":"https://github.com/deveel/hermodr","commit_stats":null,"previous_names":["deveel/deveel.events","deveel/hermodr"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/deveel/hermodr","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deveel%2Fhermodr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deveel%2Fhermodr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deveel%2Fhermodr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deveel%2Fhermodr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deveel","download_url":"https://codeload.github.com/deveel/hermodr/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deveel%2Fhermodr/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34078062,"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-06-08T02:00:07.615Z","response_time":111,"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":["aspnetcore","cloudevents","cloudevents-schema","ddd","domain-driven-design","dotnet","dotnetcore","event-driven","event-schema","events","masstransit","publisher","rabbitmq","schema"],"created_at":"2026-06-08T20:04:20.440Z","updated_at":"2026-06-08T20:04:21.331Z","avatar_url":"https://github.com/deveel.png","language":"C#","funding_links":["https://img.shields.io/badge/Buy%20Me-A%20Coffee!-FFDD00?style=flat\u0026logo=buy-me-a-coffee\u0026link=https%3A%2F%2Fbuymeacoffee.com%2Ftsutomi"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"hermodr-full-logo.png\" alt=\"Hermodr\" width=\"400\"/\u003e\n\u003c/p\u003e\n\n[![GitHub License](https://img.shields.io/github/license/deveel/hermodr)](https://github.com/deveel/hermodr/blob/main/LICENSE)\n[![GitHub Release](https://img.shields.io/github/v/release/deveel/hermodr)](https://github.com/deveel/hermodr/releases) [![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/deveel/hermodr/cicd.yml?logo=github)](https://github.com/deveel/hermodr/actions/workflows/cicd.yml)\n[![Codecov](https://img.shields.io/codecov/c/github/deveel/hermodr?logo=codecov)](https://codecov.io/gh/deveel/hermodr)\n[![.NET](https://img.shields.io/badge/-8%20%7C%209%20%7C%2010-512BD4?logo=dotnet)](https://dotnet.microsoft.com/download)\n[![Documentation](https://img.shields.io/badge/docs-hermodr.deveel.org-blue)](https://hermodr.deveel.org) ![Static Badge](https://img.shields.io/badge/Buy%20Me-A%20Coffee!-FFDD00?style=flat\u0026logo=buy-me-a-coffee\u0026link=https%3A%2F%2Fbuymeacoffee.com%2Ftsutomi)\n\n\u003e **Renamed:** This project was formerly called **Deveel Events** - as of **23 May 2026**, it has been renamed to **Hermodr** — named after the [messenger of the gods](https://no.wikipedia.org/wiki/Hermod) in Norse mythology — to better reflect its role as a message delivery framework and to distinguish it from the broader [Deveel](https://github.com/deveel) ecosystem.\n\u003e Existing NuGet packages (`Deveel.Events.*`) remain published and will be deprecated in favor of the new `Hermodr.*` packages.\n\n**Hermodr** is a lightweight, extensible framework for building event-driven .NET applications, built on top of the [CloudEvents](https://cloudevents.io/) standard.\n\nThe ambition of this framework is to implement a set of common patterns and practices for a simple and efficient event-driven architecture in .NET — from publishing domain events to consuming them, managing subscriptions, and validating event schemas — without reinventing the wheel every time a team needs to integrate across bounded contexts.\n\nThe current release focuses on the **publishing side**: a transport-agnostic layer that broadcasts domain events from a bounded context to any number of downstream consumers. Upcoming releases will introduce consumer adapters, persistent subscription registries, and additional transport channels. See the [roadmap](ROADMAP.md) for the full plan.\n\n## Domain Events and DDD\n\n[Domain-Driven Design (DDD)](https://martinfowler.com/bliki/DomainDrivenDesign.html) treats **domain events** as first-class citizens of the model — facts about something that _happened_ inside the domain, named in the ubiquitous language of domain experts (`OrderPlaced`, `InvoiceIssued`, `UserRegistered`).\n\nKey properties of domain events:\n\n- **Immutable facts** — they describe what happened, not what should happen.\n- **Decoupled producers and consumers** — the producing bounded context does not need to know who is listening.\n- **Cross-context integration** — events are the preferred way to share information across bounded contexts without tight coupling.\n- **Temporal decoupling** — consumers can process events asynchronously, at their own pace.\n\nHermodr implements the **publishing side** of this pattern: a transport-agnostic layer that broadcasts domain events from a bounded context to any number of downstream consumers, without prescribing how you model aggregates or build read models.\n\n## Event Schemas as Async API Contracts\n\nPublishing an event is only half the story. Consumers need to know the **shape** of each event — its properties, types, and constraints — to deserialise it correctly and build reliable integrations. Without a formal contract, field renames silently break consumers and integration knowledge lives only in tribal memory.\n\n**Event schemas** fill the same role for asynchronous messaging that OpenAPI/Swagger fills for REST APIs. The `Hermodr.Schema` package can derive a schema automatically from annotated data classes and export it as:\n\n- **JSON Schema** — for schema-registry integration and tooling.\n- **YAML** — for human-readable, version-controlled contract documents.\n- **AsyncAPI 2.x** — a complete, machine-readable async API specification. AsyncAPI tooling can generate documentation sites, client SDKs, and mock servers from it.\n\nTreat schemas as public API contracts: version them, prefer additive changes, and communicate breaking changes in advance.\n\n## Motivation\n\nApplications frequently need to notify other parts of the system about domain events. Teams end up rewriting the same boilerplate — serialising payloads, constructing envelopes, wiring up transport clients — over and over again.\n\nHermodr provides a single, consistent way to publish events across any transport, so teams can focus on domain logic instead of infrastructure plumbing.\n\n## Hermodr vs .NET Messaging Frameworks\n\nHermodr does not try to compete with other messaging frameworks in the .NET ecosystem: these frameworks solve different problems and can be complementary in the same architecture. The table below is a quick positioning guide, not a ranking.\n\n| Feature | `Hermodr` | `MassTransit` | `Wolverine` | `NServiceBus` | `Rebus` |\n|---------|-----------|---------------|--------------|---------------|-----------|\n| Event contract model | CloudEvents-first publish pipeline | Framework-native message contracts; CloudEvents not natively provided by the framework core | Framework-native message contracts; CloudEvents not natively provided by the framework core | Framework-native message contracts; CloudEvents not natively provided by the framework core | Framework-native message contracts; CloudEvents not natively provided by the framework core |\n| Event metadata annotations | Built-in attributes (`Hermodr.Annotations`, AMQP extensions) | Event metadata annotations not natively provided by the framework core | Event metadata annotations not natively provided by the framework core | Event metadata annotations not natively provided by the framework core | Event metadata annotations not natively provided by the framework core |\n| Schema export formats | JSON Schema, YAML, AsyncAPI packages | Schema export not natively provided by the framework core | Schema export not natively provided by the framework core | Schema export not natively provided by the framework core | Schema export not natively provided by the framework core |\n| AsyncAPI generation focus | Dedicated package (`Hermodr.Schema.AsyncApi`) | AsyncAPI generation not natively provided by the framework core | AsyncAPI generation not natively provided by the framework core | AsyncAPI generation not natively provided by the framework core | AsyncAPI generation not natively provided by the framework core |\n| Transport adapters included | Azure Service Bus, RabbitMQ, MassTransit, Webhook, Outbox, Dead-Letter | Native multi-transport broker integrations | Native multi-transport messaging endpoints | Native transport support via transport packages | Native transport integrations |\n| Transactional outbox support | Built-in channel + EF integration packages | Natively supported | Natively supported | Natively supported | Natively supported |\n| Dead-letter capture and replay | Dedicated dead-letter packages + replay worker model | Dead-letter handling available; replay workflow not natively standardized by the framework core | Dead-letter handling available; replay workflow not natively standardized by the framework core | Dead-letter handling available; replay workflow not natively standardized by the framework core | Dead-letter handling available; replay workflow not natively standardized by the framework core |\n| Deferred/scheduled delivery | Planned (`Event Scheduler \u0026 Deferred Publishing` on roadmap) | Natively supported (transport/scheduler dependent) | Natively supported (runtime/transport dependent) | Natively supported (transport dependent) | Natively supported (transport dependent) |\n| In-process subscription routing | Built-in subscriptions package (`Hermodr.Subscriptions`) | Native consumer/handler pipeline | Native local and remote handlers | Native message handler pipeline | Native message handler pipeline |\n| Middleware/extensibility pipeline | Built-in event middleware pipeline | Native filters/middleware/observers | Native middleware and handler pipeline extensions | Native pipeline behaviors and extensibility points | Native pipeline steps and extensibility points |\n| Testing support for publish flow | Dedicated in-memory test publisher package | Native test harness support | Native testing utilities | Native testing support | Native testing support |\n\nCapabilities evolve quickly across all projects, so validate details against each framework's current documentation.\n\n## CloudEvents Standard\n\nAll events are modelled as [`CloudEvent`](https://cloudevents.io/) objects, ensuring maximum interoperability with cloud platforms and services that implement the CNCF CloudEvents specification.\n\n## Requirements\n\nAll packages in this solution multi-target the following runtimes:\n\n| Runtime | Version |\n|---------|---------|\n| .NET | 8, 9, 10 |\n\n\u003e **Note:** `Hermodr.Schema.AsyncApi` also requires the **ASP.NET Core** shared framework (`Microsoft.AspNetCore.App`), since it integrates with the Saunter AsyncAPI middleware.\n\nEvery package requires the **Microsoft Dependency Injection** infrastructure (`Microsoft.Extensions.DependencyInjection`). Below are the additional per-package dependencies automatically pulled in as transitive NuGet references:\n\n| Package | Key Dependencies |\n|---------|-----------------|\n| `Hermodr.Annotations` | *(none — pure attribute library)* |\n| `Hermodr.Amqp.Annotations` | *(none — pure attribute library)* |\n| `Hermodr.Publisher` | `CloudNative.CloudEvents` · `Microsoft.Extensions.Options` · `Microsoft.Extensions.Logging.Abstractions` |\n| `Hermodr.Publisher.AzureServiceBus` | `Azure.Messaging.ServiceBus` ≥ 7.20 |\n| `Hermodr.Publisher.DeadLetter` | `Hermodr.Publisher` · `Microsoft.Extensions.Hosting.Abstractions` |\n| `Hermodr.Publisher.DeadLetter.EntityFramework` | `Hermodr.Publisher.DeadLetter` · `Microsoft.EntityFrameworkCore` |\n| `Hermodr.Publisher.RabbitMq` | `RabbitMQ.Client` ≥ 7.2 · `Hermodr.Amqp.Annotations` |\n| `Hermodr.Publisher.MassTransit` | `MassTransit` ≥ 9.1 |\n| `Hermodr.Publisher.Webhook` | `Microsoft.Extensions.Http.Resilience` ≥ 9.6 |\n| `Hermodr.Publisher.Outbox` | `Deveel.Repository.Manager` · `Microsoft.Extensions.Hosting.Abstractions` |\n| `Hermodr.Publisher.Outbox.EntityFramework` | `Hermodr.Publisher.Outbox` · `Deveel.Repository.EntityFramework` · `Microsoft.EntityFrameworkCore.Relational` |\n| `Hermodr.Publisher.DeliveryLog` | `Hermodr.Publisher` · `Microsoft.Extensions.Hosting.Abstractions` |\n| `Hermodr.Publisher.DeliveryLog.EntityFramework` | `Hermodr.Publisher.DeliveryLog` · `Microsoft.EntityFrameworkCore` |\n| `Hermodr.Publisher.OpenTelemetry` | `OpenTelemetry.API` · `Hermodr.Publisher` |\n| `Hermodr.Subscriptions` | `Hermodr.Publisher` · `Deveel.Filters` · `Microsoft.Extensions.Logging.Abstractions` |\n| `Hermodr.Schema` | `CloudNative.CloudEvents` |\n| `Hermodr.Schema.Yaml` | `YamlDotNet` ≥ 16.3 |\n| `Hermodr.Schema.AsyncApi` | `Saunter` ≥ 0.13 · `YamlDotNet` ≥ 16.3 · ASP.NET Core shared framework |\n| `Hermodr.TestPublisher` | `Hermodr.Publisher` |\n\n## Packages\n\n### Publishing\n\n| Package | Description | NuGet (Stable) | GitHub (Unstable) |\n|---------|-------------|---------------|-------------------|\n| `Hermodr.Annotations` | Attributes for describing event metadata on data classes | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Annotations.svg)](https://www.nuget.org/packages/Hermodr.Annotations) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Annotations.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Annotations) |\n| `Hermodr.Publisher` | Core publisher infrastructure (`EventPublisher`, DI helpers) | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Publisher.svg)](https://www.nuget.org/packages/Hermodr.Publisher) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Publisher.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Publisher) |\n| `Hermodr.Publisher.AzureServiceBus` | Publish events to Azure Service Bus | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Publisher.AzureServiceBus.svg)](https://www.nuget.org/packages/Hermodr.Publisher.AzureServiceBus) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Publisher.AzureServiceBus.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Publisher.AzureServiceBus) |\n| `Hermodr.Publisher.DeadLetter` | Dead-letter handling, persistent replay abstractions, and replay workers | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Publisher.DeadLetter.svg)](https://www.nuget.org/packages/Hermodr.Publisher.DeadLetter) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Publisher.DeadLetter.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Publisher.DeadLetter) |\n| `Hermodr.Publisher.DeadLetter.EntityFramework` | Entity Framework Core persistence for dead-letter messages | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Publisher.DeadLetter.EntityFramework.svg)](https://www.nuget.org/packages/Hermodr.Publisher.DeadLetter.EntityFramework) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Publisher.DeadLetter.EntityFramework.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Publisher.DeadLetter.EntityFramework) |\n| `Hermodr.Amqp.Annotations` | AMQP-specific routing attributes (exchange, routing key) | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Amqp.Annotations.svg)](https://www.nuget.org/packages/Hermodr.Amqp.Annotations) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Amqp.Annotations.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Amqp.Annotations) |\n| `Hermodr.Publisher.RabbitMq` | Publish events to a RabbitMQ exchange | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Publisher.RabbitMq.svg)](https://www.nuget.org/packages/Hermodr.Publisher.RabbitMq) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Publisher.RabbitMq.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Publisher.RabbitMq) |\n| `Hermodr.Publisher.MassTransit` | Publish events through a MassTransit bus | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Publisher.MassTransit.svg)](https://www.nuget.org/packages/Hermodr.Publisher.MassTransit) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Publisher.MassTransit.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Publisher.MassTransit) |\n| `Hermodr.Publisher.Webhook` | Deliver events to HTTP webhook endpoints | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Publisher.Webhook.svg)](https://www.nuget.org/packages/Hermodr.Publisher.Webhook) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Publisher.Webhook.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Publisher.Webhook) |\n| `Hermodr.Publisher.Outbox` | Persist events in a transactional outbox for later relay | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Publisher.Outbox.svg)](https://www.nuget.org/packages/Hermodr.Publisher.Outbox) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Publisher.Outbox.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Publisher.Outbox) |\n| `Hermodr.Publisher.Outbox.EntityFramework` | Entity Framework Core repository and helpers for the outbox channel | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Publisher.Outbox.EntityFramework.svg)](https://www.nuget.org/packages/Hermodr.Publisher.Outbox.EntityFramework) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Publisher.Outbox.EntityFramework.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Publisher.Outbox.EntityFramework) |\n| `Hermodr.Publisher.DeliveryLog` | Per-attempt operational record (channel, outcome, error code, latency, retry count) with pluggable storage backends | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Publisher.DeliveryLog.svg)](https://www.nuget.org/packages/Hermodr.Publisher.DeliveryLog) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Publisher.DeliveryLog.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Publisher.DeliveryLog) |\n| `Hermodr.Publisher.DeliveryLog.EntityFramework` | Entity Framework Core persistence for delivery log records | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Publisher.DeliveryLog.EntityFramework.svg)](https://www.nuget.org/packages/Hermodr.Publisher.DeliveryLog.EntityFramework) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Publisher.DeliveryLog.EntityFramework.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Publisher.DeliveryLog.EntityFramework) |\n| `Hermodr.Publisher.OpenTelemetry` | OpenTelemetry instrumentation for distributed tracing with W3C trace context propagation | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Publisher.OpenTelemetry.svg)](https://www.nuget.org/packages/Hermodr.Publisher.OpenTelemetry) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Publisher.OpenTelemetry.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Publisher.OpenTelemetry) |\n\n### Subscriptions\n\n| Package | Description | NuGet (Stable) | GitHub (Unstable) |\n|---------|-------------|---------------|-------------------|\n| `Hermodr.Subscriptions` | Event dispatcher and subscription management with pluggable resolvers | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Subscriptions.svg)](https://www.nuget.org/packages/Hermodr.Subscriptions) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Subscriptions.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Subscriptions) |\n\n### Schema\n\n| Package | Description | NuGet (Stable) | GitHub (Unstable) |\n|---------|-------------|---------------|-------------------|\n| `Hermodr.Schema` | Schema model, fluent builder, JSON writer, and validation | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Schema.svg)](https://www.nuget.org/packages/Hermodr.Schema) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Schema.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Schema) |\n| `Hermodr.Schema.Yaml` | Export an event schema as YAML | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Schema.Yaml.svg)](https://www.nuget.org/packages/Hermodr.Schema.Yaml) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Schema.Yaml.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Schema.Yaml) |\n| `Hermodr.Schema.AsyncApi` | Export schemas as an AsyncAPI 2.x document | [![NuGet](https://img.shields.io/nuget/v/Hermodr.Schema.AsyncApi.svg)](https://www.nuget.org/packages/Hermodr.Schema.AsyncApi) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.Schema.AsyncApi.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.Schema.AsyncApi) |\n\n### Testing\n\n| Package | Description | NuGet (Stable) | GitHub (Unstable) |\n|---------|-------------|---------------|-------------------|\n| `Hermodr.TestPublisher` | In-memory test channel for unit and integration tests | [![NuGet](https://img.shields.io/nuget/v/Hermodr.TestPublisher.svg)](https://www.nuget.org/packages/Hermodr.TestPublisher) | [![GitHub pre-release](https://img.shields.io/nuget/vpre/Hermodr.TestPublisher.svg?label=pre-release)](https://github.com/orgs/deveel/packages/nuget/package/Hermodr.TestPublisher) |\n\n## Documentation\n\nThe full documentation is published at **[hermodr.deveel.org](https://hermodr.deveel.org)** — including installation guides, concept references, channel adapters, schema export, and testing utilities.\n\nThe source of the documentation is also available in the [`docs/`](docs/README.md) folder of this repository\n| Section | Description |\n|---------|-------------|\n| [Getting Started](https://hermodr.deveel.org/getting-started/installation) | Installation and quick-start guide |\n| [Core Concepts](https://hermodr.deveel.org/concepts/) | Publisher, channels, and event annotations |\n| [Publisher Channels](https://hermodr.deveel.org/publishers/) | Azure Service Bus, RabbitMQ, MassTransit, Webhook, Outbox, and Dead-Letter Replay |\n| [Event Subscriptions](https://hermodr.deveel.org/subscriptions/) | Event dispatcher, filters, routing, and custom resolvers |\n| [Event Schema](https://hermodr.deveel.org/schema/) | Schema definition, export (JSON / YAML / AsyncAPI), and validation |\n| [Testing](https://hermodr.deveel.org/testing/) | Unit-testing event publishing |\n\n## Future Work\n\nThe framework is still evolving. See the [ROADMAP](ROADMAP.md) for the full description of every planned feature and the version milestone in which each is expected to ship.\n\n### v1.1 — Routing \u0026 Middleware ✅\n\n- [x] **Event Subscription \u0026 Routing** — subscribe to event types with attribute-based filtering and in-process routing\n- [x] **Event Middleware Pipeline** — composable cross-cutting hooks (logging, validation, correlation, tracing)\n\n### v1.2 — Reliability\n\n- [x] **Event Replay \u0026 Dead-Letter Handling** — capture and resubmit failed events with configurable retry and back-off\n- [x] **Outbox Pattern Integration** — guaranteed exactly-once publishing via a transactional outbox channel\n- [ ] **Event Scheduler \u0026 Deferred Publishing** — defer event publishing to a future point in time or after a delay\n\n### v1.3 — Observability\n\n- [x] **OpenTelemetry \u0026 Distributed Tracing Integration** — propagate W3C trace context as CloudEvents extensions for end-to-end traces\n- [ ] **Event Store \u0026 Audit Log Channel** — append-only persistence of every domain event for auditing and read-model rebuilding\n- [ ] **Schema Validation at Publish Time** — validate event payloads against their registered schema before channel dispatch\n- [x] **Publish Delivery Log** — per-attempt operational record (channel, outcome, error code, latency, retry count) across pluggable storage backends\n\n### v1.4 — Schema Governance\n\n- [ ] **Event Versioning \u0026 Compatibility** — breaking-change detection, upcasting pipeline, and version-aware routing\n- [ ] **AsyncAPI \u0026 Schema Export Improvements** — compile-time auto-discovery, dotnet CLI tool, OpenAPI 3.1 webhook export\n\n### v1.5 — New Transports\n\n- [ ] **CloudEvents HTTP Binding for the Webhook Publisher** — bring the existing Webhook publisher into full structured/binary content-mode compliance\n- [ ] **HTTP Publisher Channel** — lightweight, sign-free point-to-point delivery to statically-configured endpoints\n- [ ] **gRPC Publisher Channel** — low-latency service-to-service delivery using the CloudEvents gRPC protocol binding\n- [ ] **Apache Kafka Publisher Channel** — publish CloudEvents to Kafka topics with partition key control and Schema Registry support\n- [ ] **Amazon SQS Publisher Channel** — standard and FIFO queue delivery on AWS with batch publish and S3 offload\n- [ ] **Amazon SNS Publisher Channel** — fan-out to SQS queues, Lambda functions, and HTTP endpoints via SNS topics\n- [ ] **Google Cloud Pub/Sub Publisher Channel** — ordered delivery to GCP Pub/Sub topics with Workload Identity support\n- [ ] **NATS / JetStream Publisher Channel** — ultra-low-latency delivery to NATS subjects or durable JetStream streams\n\n### v1.6 — Code Generation\n\n- [ ] **CloudEvent Factory Source Generator** — Roslyn incremental generator that emits zero-reflection `IEventConvertible.ToCloudEvent()` implementations from `[Event]`-annotated `partial` classes, with compile-time diagnostics for annotation mistakes\n- [ ] **Schema Registration Source Generator** — generator that pre-constructs all `EventSchema` instances at build time and emits an `AddGeneratedEventSchemas(IServiceCollection)` DI extension, eliminating startup reflection and enabling schema export without a running host\n- [ ] **Typed Domain Publisher Generator** — generator that produces a strongly-typed `IXxxEventPublisher` interface and implementation per domain group, so services depend on a focused, mockable contract rather than the catch-all `IEventPublisher`\n\n### v1.7 — Compliance\n\n- [ ] **Data Compliance \u0026 Redaction Framework** — pluggable redaction pipeline built on `Microsoft.Extensions.Compliance.*` with schema-aware classification lookup, pluggable `IEventRedactor` (JSON in v1), and the `datasensitivity` CloudEvents extension attribute as the single sensitivity signal\n- [ ] **Audit Trail Compliance Support** — opt-in `Hermodr.AuditTrail.Compliance` package that decorates `IAuditTrailWriter` with a redacting writer, configured via a nested `Compliance` options block on the audit-trail publish options\n- [ ] **Delivery Log Compliance Support** — opt-in `Hermodr.Publisher.DeliveryLog.Compliance` package that decorates `IEventPublishDeliveryLog` with a redacting delivery log, enabled through `UseCompliance()` on the delivery-log builder\n- [ ] **In-Transit Event Redaction** — opt-in `Hermodr.Publisher.Compliance` package adding a redaction middleware to the publish pipeline and per-channel redaction profiles, so teams can choose where redaction happens in the publish flow (boundary-only by default, in-transit when enabled)\n\n### v2.0 — Event Consumers\n\n- [ ] **Webhook Consumer for ASP.NET Core** — receive inbound CloudEvents over HTTP with HMAC signature verification and automatic routing\n- [ ] **Pre-built Webhook Consumer Adapters** — ready-made payload mappers and signature verifiers for Facebook, SendGrid, Twilio, Stripe, GitHub, and Shopify\n- [ ] **RabbitMQ Consumer** — consume CloudEvents from RabbitMQ queues and route them through the subscription registry\n- [ ] **Azure Service Bus Consumer** — consume CloudEvents from Service Bus queues and topic subscriptions\n- [ ] **MassTransit Consumer Bridge** — expose Hermodr subscriptions as MassTransit consumers and vice versa\n\n### v2.1 — Testing \u0026 DX\n\n- [ ] **Expanded Testing Utilities** — fluent publish assertions (`AssertPublished`, `AssertNotPublished`), in-memory event bus, and consumer-side test helpers\n- [ ] **Local Development Console Sink** — zero-configuration channel that pretty-prints CloudEvents to the console during local development, with automatic exclusion in non-development environments\n- [ ] **.NET Aspire Integration** — surface publish channels as Aspire resources for dashboard visibility, automatic broker provisioning, and OTLP trace export out of the box\n- [ ] **`dotnet event` CLI Extension** — `dotnet` global tool adding `dotnet event new`, `schema export`, `schema validate`, `schema diff`, and `channel add` sub-commands for event scaffolding and schema governance\n- [ ] **Standalone `hermodr` CLI** — self-contained cross-platform executable and Docker image exposing the same command surface without requiring the .NET SDK, with GitHub Actions action and machine-readable SARIF output\n\n### v2.2 — Subscription Management\n\n- [ ] **Subscription Management Framework** — provider-agnostic `ISubscriptionStore` abstraction with in-memory default and runtime lifecycle operations\n- [ ] **Relational Registry Provider (Entity Framework Core)** — persist subscriptions in SQL Server, PostgreSQL, or SQLite with bundled migrations\n- [ ] **Document Registry Provider (MongoDB)** — persist subscriptions as MongoDB documents with real-time change-stream synchronisation\n- [ ] **Subscription Management REST API** — secured minimal-API endpoint group with OpenAPI metadata and change-notification webhooks\n\n### v2.3 — Framework Integrations\n\n- [ ] **MediatR Integration** — bridge `[Event]`-annotated `INotification` types to the CloudEvents publish pipeline and route inbound CloudEvents back as MediatR notifications\n- [ ] **Wolverine Integration** — emit CloudEvents as a Wolverine message side-effect and route inbound CloudEvents into the Wolverine runtime via `IMessageBus`\n- [ ] **Brighter Integration** — publish CloudEvents as a post-handler pipeline step for Brighter `ICommand` / `IEvent` types and bridge inbound CloudEvents into the Brighter command processor\n\nMonitor the [open issues](https://github.com/deveel/hermodr/issues) to see what is being actively worked on.\n\n## Contributors\n\nThanks go to all the people who have contributed to this project!\n\n[![Contributors](https://contrib.rocks/image?repo=deveel/hermodr)](https://github.com/deveel/hermodr/graphs/contributors)\n\n## Contributing\n\nWe welcome bug reports, feature requests, and pull requests. Please read the [Contributing Guidelines](docs/contributing.md) before submitting.\n\n## License\n\nReleased under the [MIT License](LICENSE).\n\n## Built With\n\n\u003cp\u003e\n  \u003ca href=\"https://dotnet.microsoft.com\"\u003e\u003cimg align=\"left\" src=\"https://raw.githubusercontent.com/devicons/devicon/master/icons/dotnetcore/dotnetcore-original.svg\" alt=\".NET\" width=\"48\" height=\"48\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"https://github.com\"\u003e\u003cimg align=\"left\" src=\"https://raw.githubusercontent.com/devicons/devicon/master/icons/github/github-original.svg\" alt=\"GitHub\" width=\"48\" height=\"48\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"https://www.jetbrains.com/rider/\"\u003e\u003cimg align=\"left\" src=\"https://raw.githubusercontent.com/devicons/devicon/master/icons/rider/rider-original.svg\" alt=\"Rider\" width=\"48\" height=\"48\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"https://testcontainers.com\"\u003e\u003cimg align=\"left\" src=\"https://avatars.githubusercontent.com/u/13393021\" alt=\"Testcontainers\" width=\"48\" height=\"48\"/\u003e\u003c/a\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeveel%2Fhermodr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeveel%2Fhermodr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeveel%2Fhermodr/lists"}