Renamed: This project was formerly called Deveel Events. As of 23 May 2026, the NuGet packages have been renamed from
Deveel.Events.*toHermodr.*. The old packages remain published and will be deprecated.
Packages
The framework is split into focused NuGet packages so you only take what you need.
Core packages
| Package | Description |
|---|---|
Hermodr.Annotations | Attributes for describing event metadata on your data classes |
Hermodr.Publisher | Core publisher infrastructure (EventPublisher, EventPublisherBuilder, DI helpers) |
Channel packages
| Package | Description |
|---|---|
Hermodr.Publisher.AzureServiceBus | Publish events to an Azure Service Bus queue or topic |
Hermodr.Publisher.RabbitMq | Publish events to a RabbitMQ exchange |
Hermodr.Publisher.MassTransit | Publish events through a MassTransit bus |
Hermodr.Publisher.Webhook | Deliver events to HTTP webhook endpoints |
Hermodr.Publisher.Outbox | Persist events to a transactional outbox for later relay |
Hermodr.Publisher.Outbox.EntityFramework | Entity Framework Core repository and helpers for the outbox channel |
Hermodr.Amqp.Annotations | AMQP-specific attributes (exchange name, routing key) |
Subscriptions package
| Package | Description |
|---|---|
Hermodr.Subscriptions | In-process event subscription registry and dispatcher |
Observability package
| Package | Description |
|---|---|
Hermodr.Publisher.OpenTelemetry | Distributed tracing with W3C trace context propagation via CloudEvents extensions |
Audit Trail packages
| Package | Description |
|---|---|
Hermodr.AuditTrail | Core contracts for an append-only audit trail (IAuditTrailWriter, IAuditTrailReader<T>, AuditTrailBuilder, AuditTrailStreamQuery) |
Hermodr.Publisher.AuditTrail | Publisher integration: AuditTrailPublishChannel and AddAuditTrail() extension method |
Hermodr.AuditTrail.InMemory | In-memory storage backend for testing and development |
Hermodr.AuditTrail.EntityFramework | Entity Framework Core storage backend (SQL Server, PostgreSQL, SQLite) |
Hermodr.AuditTrail.NDJson | NDJson file storage backend with pluggable filesystem (Azure Blob, S3, local disk) |
Schema packages
| Package | Description |
|---|---|
Hermodr.Schema | Core schema model, fluent builder, JSON writer, and schema validation |
Hermodr.Schema.Yaml | Export an event schema as a YAML document |
Hermodr.Schema.AsyncApi | Export schemas as an AsyncAPI 2.x document (JSON or YAML) |
Test package
| Package | Description |
|---|---|
Hermodr.TestPublisher | In-memory test channel and helpers for unit tests |
Package Details
Hermodr.Annotations
Contains the [Event] and [EventProperty] attributes used to annotate data-transfer classes with event type metadata. No dependencies except the .NET BCL.
dotnet add package Hermodr.Annotations
Hermodr.Publisher
The heart of the framework. Provides:
EventPublisherIEventPublishChannelandIBatchEventPublishChannelEventPublisherBuilderfor fluent DI registrationIEventFactory,IEventIdGenerator, andIEventSystemTimeextensibility pointsEventPublisherOptionsfor global defaults- named publisher pipelines resolved through keyed DI
dotnet add package Hermodr.Publisher
Hermodr.Publisher.AzureServiceBus
Azure Service Bus channel implementation. Serialises CloudEvent objects as ServiceBusMessage instances and sends them to a configured queue or topic.
dotnet add package Hermodr.Publisher.AzureServiceBus
Hermodr.Publisher.RabbitMq
RabbitMQ channel implementation using the official RabbitMQ.Client library. Supports AMQP exchange/routing-key annotations, publisher confirms, and persistent messages.
dotnet add package Hermodr.Publisher.RabbitMq
Hermodr.Publisher.MassTransit
Wraps MassTransit's IPublishEndpoint / ISendEndpointProvider so events can be routed through any MassTransit-supported transport.
dotnet add package Hermodr.Publisher.MassTransit
Hermodr.Publisher.Webhook
Delivers events over HTTP to a webhook endpoint. Features HMAC signing (SHA-256/384/512), exponential-backoff retries, configurable headers, and pluggable serialisers.
dotnet add package Hermodr.Publisher.Webhook
Hermodr.Publisher.Outbox
Implements the transactional outbox pattern for event publishing. It adds the AddOutbox<TMessage>() builder entry point, outbox relay services, repository abstractions, and message-factory hooks for persisting events before relaying them to a transport-specific publisher pipeline.
dotnet add package Hermodr.Publisher.Outbox
Hermodr.Publisher.Outbox.EntityFramework
Adds Entity Framework Core integration for the outbox channel, including DbOutboxMessage, OutboxDbContext, and the WithEntityFramework() registration helper that wires an IOutboxMessageRepository<TMessage> backed by EF Core.
dotnet add package Hermodr.Publisher.Outbox.EntityFramework
Hermodr.Amqp.Annotations
Adds [AmqpExchange] and [AmqpRoutingKey] attributes to let you declare per-event-type AMQP routing metadata directly on your data classes. See RabbitMQ — AMQP Annotations for usage details.
dotnet add package Hermodr.Amqp.Annotations
Hermodr.Subscriptions
Adds an in-process event subscription registry and dispatcher middleware to the EventPublisher pipeline. Includes:
IEventSubscriptionandEventSubscription— the subscription modelIEventSubscriptionRegistry— default in-memory registryIEventSubscriptionResolver— extensibility point for database- or remote-backed resolversEventDispatcher— middleware that queries resolvers and invokes matched handlersEventFilter/EventFilterBuilder— composableFilterExpressionfactory for envelope and data-payload filtering
dotnet add package Hermodr.Subscriptions
Hermodr.Publisher.OpenTelemetry
Adds OpenTelemetry instrumentation to the event publishing pipeline. Creates producer and consumer Activity spans, injects W3C traceparent/tracestate as CloudEvents extension attributes on publish, and extracts them on the subscription side to enable end-to-end distributed tracing across service boundaries.
dotnet add package Hermodr.Publisher.OpenTelemetry
See OpenTelemetry Instrumentation for the full guide.
Hermodr.Schema
Core schema model. Includes EventSchema, EventSchemaBuilder (fluent API), EventSchemaCreator (reflection-based), IEventSchemaFactory, IEventSchemaWriter, and IEventSchemaValidator.
dotnet add package Hermodr.Schema
Hermodr.Schema.Yaml
Adds EventSchemaYamlWriter, which serialises an IEventSchema to a YAML stream using YamlDotNet.
dotnet add package Hermodr.Schema.Yaml
Hermodr.Schema.AsyncApi
Exports single or multiple event schemas as a complete AsyncAPI 2.x document (JSON or YAML).
dotnet add package Hermodr.Schema.AsyncApi
Hermodr.TestPublisher
An in-memory publish channel for use in unit and integration tests. Invokes a user-supplied callback whenever an event is published, so you can assert on published events without a real transport.
dotnet add package Hermodr.TestPublisher
Hermodr.AuditTrail
Core contracts for an append-only audit trail. Provides IAuditTrailWriter, IAuditTrailReader<TEntry>, AuditTrailEntry, AuditTrailStreamQuery, and the AuditTrailBuilder used by the publisher integration.
dotnet add package Hermodr.AuditTrail
Hermodr.Publisher.AuditTrail
Publisher integration: AuditTrailPublishChannel and the AddAuditTrail() extension method. Use it together with one of the audit trail storage backends (Hermodr.AuditTrail.InMemory, Hermodr.AuditTrail.EntityFramework, or Hermodr.AuditTrail.NDJson).
dotnet add package Hermodr.Publisher.AuditTrail
Hermodr.AuditTrail.InMemory
In-memory storage backend for the audit trail. Suitable for testing and development.
dotnet add package Hermodr.AuditTrail.InMemory
Hermodr.AuditTrail.EntityFramework
Entity Framework Core storage backend for the audit trail. Supports SQL Server, PostgreSQL, and SQLite.
dotnet add package Hermodr.AuditTrail.EntityFramework
Hermodr.AuditTrail.NDJson
Newline-delimited JSON (NDJSON) file storage backend for the audit trail, with automatic file rolling by size or time interval and retention policies. All I/O is performed through the IFileSystem abstraction from System.IO.Abstractions, so the local disk can be replaced with Azure Blob Storage, Amazon S3, or any other compatible filesystem by registering a different IFileSystem implementation. Reads are asynchronous and non-blocking: files are opened with FileShare.ReadWrite and streamed line-by-line, so a concurrent writer is never blocked and the full file content is never loaded into memory.
builder.Services.AddEventPublisher(o => o.Source = new Uri("https://example.com"))
.AddAuditTrail(audit => audit.UseNDJson(o =>
{
o.DirectoryPath = "./audit-trail";
o.MaxFileSizeBytes = 10 * 1024 * 1024;
o.RollInterval = TimeSpan.FromHours(1);
o.MaxFileCount = 100;
o.ReadBufferSize = 65_536; // optional: tune for large files
}));
dotnet add package Hermodr.AuditTrail.NDJson
See the Audit Trail with NDJson Files sample for a full walkthrough.