Skip to content
Emit logo

Emit

Reliable, ordered messaging for .NET. Batteries included.

Your service just processed a pizza order. You saved it to the database and, in the same breath, tried to publish an event to a message broker. The publish failed. Your database says the order exists. The kitchen heard nothing. Somewhere, a hungry customer is waiting.

This is the dual-write problem, and it corrupts systems in ways that are particularly fun to debug at 2am.

Emit is a .NET library for reliable, ordered messaging between services. At its core is the transactional outbox pattern: messages are written to a database table inside the same transaction as your business data, then delivered by a background worker that retries until the broker confirms. Your handler commits everything or nothing.

The outbox is one of several tools Emit provides. An in-process mediator, distributed coordination primitives, and deep Kafka integration all share the same layered middleware pipeline, so cross-cutting concerns like transactions, retries, and observability apply uniformly across every subsystem.

Transactional outbox with durable, ordered delivery and automatic retries. Messages never go missing because a broker hiccupped at the wrong moment.

In-process mediator for typed request/response dispatch. Useful for CQRS handlers that also need to publish events.

Kafka integration with typed producers, consumer groups, fan-out, content-based routing, dead-letter queues, circuit breakers, and rate limiting.

Pluggable persistence across MongoDB and PostgreSQL. You bring your own client; Emit handles the rest.

Cluster coordination with leader election for daemon scheduling and distributed locks available to your own code.

Observability through distributed tracing with W3C propagation, per-subsystem metrics, and structured logging throughout.

Ready to try it? Head to the installation guide and have a working outbox in minutes.

Emit is released under the Apache 2.0 License.