dovecote
A holder. A recipient.
— Ursula K. Le Guin, “The Carrier Bag Theory of Fiction” (1986)
dovecote stores an event in the same database transaction as your application
change. Your worker claims it, sends it, then acknowledges delivery. Failed
attempts can be retried without losing the original event.
Dovecote is pre-1.0; API and schema changes may require migration. See the backend requirements and migration guide before deploying it.
A transaction
Build the event, then enqueue it in the transaction that owns the application change:
use ;
use PostgresDovecote;
use PgPool;
async
The commit makes the application change and event visible together. Publication happens later, through your worker. Delivery is at least once, so consumers must deduplicate by tenant, source and event ID. Leased claim tokens fence delivery updates; Dovecote does not promise FIFO or exactly-once delivery.
Try the complete SQLite example without setting up a server:
It covers enqueue, claim, acknowledgement, retry and bounded history paging.
The core dovecote crate is synchronous and has no runtime or SQLx dependency.
Its SQLx adapters support PostgreSQL, MySQL/MariaDB, and SQLite without hiding
their different transaction, locking, clock, or migration behaviour.
Documentation
- SPEC.md defines the contract.
- Operations, recovery, and the support matrix cover production use.
- Integration mappings cover HTTP, Kafka, NATS JetStream, Azure Event Grid, and Debezium.
- The migration runbook moves existing Keepsake and Gatekeep data into Dovecote.
- Contributing covers development; security explains private vulnerability reporting.
Development
The project uses the tools pinned in .mise.toml:
Licensed under MIT OR Apache-2.0.