Self-hosted HTTP message broker

Http Messaging
& Scheduling

Enqueue durable jobs over HTTP. Schedule execution, control throughput, deliver signed webhooks and recover from failure — all from a single service.

live broker — job lifecycle
POST /v1/enqueue
01
job accepted
02
durable write
03
priority assigned
04
delivery attempt
05
retry
06
success

100%

Free Forever · Fully open source

99.99%

Delivery success with retries

<5ms

Enqueue acknowledgement

0-9

Priority levels per queue

Built on dependable infrastructure

  • RocksDB
  • SlateDB
  • Raft
  • Prometheus
  • Docker
  • S3
  • Cloudflare R2
  • Any S3-compatible object storage

Why betterMQ

Reliable delivery shouldn't require a fleet of services

Most job systems require queues, schedulers, workers, retry systems and monitoring stitched together. BetterMQ combines these capabilities into a single deployable service.

Traditional Stack

  • 01Queue
  • 02Workers
  • 03Scheduler
  • 04Retry Logic
  • 05Rate Limiter
  • 06Webhook Sender
  • 07Monitoring

7 services. 7 deployments. 7 things to monitor.

betterMQ

betterMQ

1 binary. 1 deployment. Everything included.

How it works

Push jobs through a durable delivery pipeline

Every job follows the same lifecycle.

01

Accept

Job written durably before acknowledgement.

02

Schedule

Delay, cron or interval evaluation.

03

Control

Rate limits, parallelism and priority.

04

Deliver

Signed webhook dispatched.

05

Recover

Retries, backoff and DLQ.

#01Messaging

Durable HTTP queues

Store jobs safely and deliver them when ready.

  • Named queues

    Organize work into isolated queues with their own settings.

  • Fan-out groups

    Publish once, deliver to every subscribed endpoint.

  • At-least-once delivery

    Every accepted job is delivered or dead-lettered. Never lost.

  • Idempotency keys

    Duplicate publishes are deduplicated automatically.

enqueue.sh
curl -X POST http://localhost:8080/v1/enqueue \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "queue": "jobs",
    "key": "user-42",
    "body": { "task": "send_invoice", "invoice_id": 99 },
    "priority": 8,
    "idempotency_key": "inv-99",
    "sign": true
  }'

HTTP/1.1 202 Accepted
{ "message_id": "7c9e6679-…", "queue": "jobs", "duplicate": false }

#02Scheduling

Run jobs when they matter

One-time delays, recurring intervals and cron schedules.

  • Cron expressions

    Full cron syntax for precise recurring execution.

  • Recurring intervals

    Run every N seconds, minutes or hours without cron math.

  • One-time delays

    Defer a single job into the future with a simple delay.

schedules
  • 0 9 * * *Daily digest — every day at 09:00
  • every 30 secondsHealth probe — recurring interval
  • delay 60 secondsAbandoned cart — one-time delay

#03Flow Control

Control throughput before overload happens

Protect downstream systems from bursts.

  • Rate limits

    Cap requests per second on any queue or lane.

  • Parallelism

    Bound concurrent in-flight deliveries per destination.

  • Live lane updates

    Tune limits at runtime without redeploying anything.

  • Per-key isolation

    One noisy tenant never starves the rest.

flow controller
lane: default100 req/s
lane: stripe-api25 req/s
lane: email-provider10 req/s

bursts absorbed — downstream protected

#04Priority

Urgent work moves first

Priority 0-9 scheduling keeps critical jobs ahead of bulk traffic.

  • 10 priority levels

    Assign 0-9 per job. Lower numbers dispatch first.

  • Starvation-free

    Bulk traffic still progresses while urgent work leads.

  • Per-job override

    Set priority at enqueue time, not at queue creation.

priority lanes
  • p0payment.capture
  • p2order.confirmed
  • p5email.welcome
  • p9analytics.batch
  • p0 dispatched first — always

#05Reliability

Failures are expected

Automatic retries and recovery.

  • Exponential backoff

    Retries spread out automatically to let systems recover.

  • Dead letter queues

    Exhausted jobs are captured for inspection and replay.

  • Circuit breakers

    Failing destinations are paused before they cascade.

  • Idempotency

    Safe redelivery without double-processing side effects.

retry timeline — exponential backoff
  • +0sattempt 1503
  • +2sattempt 2503
  • +8sattempt 3timeout
  • +32sattempt 4200 OK
  • exhausted retries route to dead letter queue

#06Delivery

Every webhook is verifiable

Signed deliveries with timestamp validation and HMAC verification.

  • HMAC signatures

    Every payload is signed with your endpoint secret.

  • Timestamp validation

    Replay attacks rejected outside the tolerance window.

  • Key rotation

    Rotate secrets with zero delivery downtime.

signature inspector
BetterMQ-Timestamp: 1717189200
BetterMQ-Signature: v1=9f2ab8…e41c

// verify on your server
const expected = hmacSHA256(
  secret,
  `${timestamp}.${rawBody}`
)

✓ signature valid — within tolerance

#07 — Operations

Everything operators need

Control Panel

Inspect queues, jobs and deliveries from a built-in UI.

Metrics

Prometheus endpoint with broker and queue metrics.

Health Checks

Liveness and readiness probes for orchestrators.

OpenAPI

Complete spec for every endpoint, ready for codegen.

Scalar Docs

Interactive API reference served by the broker itself.

HA Cluster

Raft-backed replication for zero-downtime operation.

Developer Experience

Just HTTP

No client lifecycle. No worker runtime. No protocol lock-in.

POST /v1/enqueue
Authorization: Bearer $TOKEN
Content-Type: application/json

{
  "queue": "jobs",
  "key": "user-42",
  "body": { "task": "send_invoice", "invoice_id": 99 },
  "priority": 8,
  "sign": true
}

# → 202 { "message_id": "…", "queue": "jobs", … }

Architecture

A modern broker built from proven components

Battle-tested storage engines, consensus-backed clustering and a delivery core designed for failure — packaged in a single deployable binary.

1

Binary

0

Per-message fees

100%

Infrastructure ownership

Scale potential

API Layer

RESTOpenAPI

Broker Core

SchedulerPriority EngineFlow ControllerDelivery Engine

Storage

RocksDBSlateDB

Cluster

Raft

Comparison

How betterMQ compares

FeaturebetterMQQStashHookdeckSvixKafka
Self-hostedYesNoNoPartialYes
HTTP-native APIYesYesYesYesNo
Cron & interval schedulingYesYesNoNoNo
Priority queues (0-9)YesNoNoNoNo
Fan-out groupsYesYesYesYesYes
Flow control & rate limitsYesYesYesPartialPartial
Signed webhook deliveryYesYesYesYesNo
Dead letter queuesYesYesYesYesPartial
No per-message feesYesNoNoNoYes
Single binary deployYesNoNoNoNo

SupportedPartial / limitedNot available

Competitor capabilities reflect publicly documented behavior and may change.

Installation

Running in under a minute

One binary. No external dependencies. Your first durable job delivered before your coffee cools.

macOS · Linux

curl -fsSL https://bettermq.com/install | bash

Windows, Docker Compose and source builds — all install options →

  1. 1Run the install command
  2. 2Create token
  3. 3Send first job
  4. 4Configure scheduling
  5. 5Monitor deliveries
terminal
$ curl -fsSL https://bettermq.com/install | bash
✓ betterMQ installed — running at http://localhost:8080

$ curl -X POST http://localhost:8080/v1/enqueue \
  -H "Authorization: Bearer sk_local_…" \
  -H "Content-Type: application/json" \
  -d '{
    "queue": "jobs",
    "key": "user-42",
    "body": { "task": "send_invoice" },
    "sign": true
  }'

✓ 202 Accepted — delivery in progress

FAQ

Frequently asked questions

How is betterMQ different from Kafka or RabbitMQ?

betterMQ is HTTP-native: producers enqueue with a POST request and consumers receive signed webhooks. There is no client library, consumer group protocol or broker-specific wire format. It also bundles scheduling, retries, rate limiting and priority — features that traditionally require extra services around a raw broker.

Do I need to run workers or consumers?

No. betterMQ pushes jobs to your HTTP endpoints. Your existing web servers are your workers — any service that can receive an HTTP request can process jobs.

What happens when my endpoint is down?

Deliveries retry automatically with exponential backoff. If a destination keeps failing, the circuit breaker pauses it, and jobs that exhaust their retries land in a dead letter queue where they can be inspected and replayed.

Is it really a single binary?

Yes. The API, scheduler, delivery engine, storage (RocksDB/SlateDB) and control panel ship in one binary or Docker image. For high availability you run multiple nodes clustered with Raft.

How do I verify webhook authenticity?

Every delivery carries an HMAC-SHA256 signature and timestamp header. Verify the signature against your endpoint secret and reject requests outside the timestamp tolerance window.

What does it cost?

betterMQ is self-hosted with no per-message fees. You pay only for the infrastructure you run it on, and your data never leaves your network.

Build reliable delivery infrastructure in minutes

Deploy BetterMQ and start running durable jobs, schedules and webhook workflows on infrastructure you control.