the complete feature map
Everything you'd stitch together — in one binary
A durable queue, a scheduler, a rate limiter, a webhook signer and a dead-letter store usually mean five services. betterMQ is all of it, self-hosted, behind one HTTP API.
01 / messaging
Four ways to enqueue
Register a named queue, fire a one-off publish, fan out to a group, or ingest in batches. All return 202 only after a durable write.
Named queues
A name → HTTPS destination + HMAC secret. Enqueue by stable id or name.
POST /v1/queues1:1 publish
Deliver to any URL without registering a queue. Great for ad-hoc work.
POST /v1/publishFan-out groups
One publish to many member webhooks, each with its own limits.
POST /v1/groups/{group_id}/publishBatch & gateway ingest
Many messages per request — no size cap self-hosted.
POST /v1/enqueue/batch02 / scheduling
A scheduler in the broker
Delay a single job, run UTC cron, or fire on a fixed interval — each schedule individually pausable.
Delayed jobs
A delay in milliseconds on any publish or enqueue.
"delay": 60000Cron
Standard 5-field UTC expressions to a queue or URL.
"cron": "0 9 * * *"Intervals + pause
Every N seconds. Pause and resume any schedule without deleting it.
"every_seconds": 3003 / flow control
Protect fragile downstreams
Cap concurrency and rate per grouping key, prioritise hot work, and adjust live lanes without redeploying.
Flow profiles
Reusable parallelism, rate & period — by id or inline.
Priority 0–9
Default 5. Combine with single-slot parallelism for strict ordering.
Runtime admin
Pause, resume, pin, unpin and reset the rate window on live lanes.
POST /v1/flow/{key}/pauseLive introspection
Wait-list size, in-flight count and the current rate window.
GET /v1/flow/{key}04 / reliability
At-least-once you can trust
Retries with backoff, a DLQ you can inspect, idempotent accepts, and a breaker that quarantines bad hosts.
Retries & backoff
Per message, queue, or default — fixed or exponential.
Dead-letter queue
Exhausted messages land on {queue}.__dlq.
GET /v1/dlq?queue=jobsIdempotency keys
Re-send safely; duplicate accepts return the original.
"idempotency_key": "inv-99"Circuit breaker
Auto-block failing hosts; list and override manually.
GET /v1/destinations/blocked05 / delivery
Push-only by design
betterMQ sends your payload with the exact method, headers and body you choose — optionally signed.
HMAC-signed webhooks
With sign: true, each request carries BetterMQ-Signature + BetterMQ-Timestamp headers your receiver verifies.
curl-style outbound
Custom method, headers and raw body — talk to any endpoint, not just JSON ones.
06 / operations
Everything an operator needs
A panel, interactive docs, health and metrics endpoints, Compose files, and multi-node HA — all served by the same process.
Embedded control panel
Setup wizard, queues, schedules, infra and live docs at /panel/.
OpenAPI 3.1 + Scalar
Interactive reference at /docs; spec at /openapi.json.
Health, metrics & HA
/healthz · /readyz · /metrics, Docker Compose, Raft-backed cluster.
{ the advantage }
What the hosted tools can't give you
The features above exist elsewhere too. These properties are what set a self-hosted broker apart.
Never leaves
Payloads sit on your disk / object storage. No third party sees a body.
No metering
No per-message or per-event fees. It costs what your server costs.
No size tax
No batch cap, no per-message size tier. Send what your hardware allows.
One process
Queue + scheduler + limiter + signer + DLQ in one Rust binary.
Try every feature locally
One command brings up the broker, the panel and the docs. No account, no card.