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.

6
capability areas
1
rust binary
30+
HTTP endpoints
MIT
/ apache-2.0

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.

Why it matters · Queue destinations are snapshotted at enqueue time, so editing a queue never corrupts in-flight jobs.

Named queues

A name → HTTPS destination + HMAC secret. Enqueue by stable id or name.

POST /v1/queues

1:1 publish

Deliver to any URL without registering a queue. Great for ad-hoc work.

POST /v1/publish

Fan-out groups

One publish to many member webhooks, each with its own limits.

POST /v1/groups/{group_id}/publish

Batch & gateway ingest

Many messages per request — no size cap self-hosted.

POST /v1/enqueue/batch

02 / scheduling

A scheduler in the broker

Delay a single job, run UTC cron, or fire on a fixed interval — each schedule individually pausable.

Why it matters · Hookdeck and Svix have no built-in cron — you'd bolt on a separate scheduler.

Delayed jobs

A delay in milliseconds on any publish or enqueue.

"delay": 60000

Cron

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": 30

03 / flow control

Protect fragile downstreams

Cap concurrency and rate per grouping key, prioritise hot work, and adjust live lanes without redeploying.

Why it matters · With parallelism: 1, higher priority jumps ahead — a real priority queue, not just rate limiting.

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}/pause

Live 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.

Why it matters · A flapping endpoint gets auto-blocked instead of consuming your entire retry budget.

Retries & backoff

Per message, queue, or default — fixed or exponential.

Dead-letter queue

Exhausted messages land on {queue}.__dlq.

GET /v1/dlq?queue=jobs

Idempotency 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/blocked

05 / delivery

Push-only by design

betterMQ sends your payload with the exact method, headers and body you choose — optionally signed.

Why it matters · There is deliberately no pull/consume API. Your service stays a plain HTTP receiver.

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.

Why it matters · The control panel and API reference ship inside the binary.

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.

data

Never leaves

Payloads sit on your disk / object storage. No third party sees a body.

cost

No metering

No per-message or per-event fees. It costs what your server costs.

limits

No size tax

No batch cap, no per-message size tier. Send what your hardware allows.

ops

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.