← Back to all sparks
V

VerneMQ

COMMS
Velocity0.0

Distributed MQTT message broker

A slow, careful MQTT broker that spent two years landing one breaking storage change.

mqttclusteringerlangrelease-candidatesbreaking-changesself-hosted
Current state
VerneMQ is in low-cadence maintenance on the 2.1.x line, with releases spaced months apart and a 2.1.3 release candidate open since April. The work is concentrated in the clustering metadata store (vmq_swc), the MQTT session state machine, and WebSocket listener behaviour — the parts operators actually file bugs against. Commercial binaries remain EULA-gated, so the open-source repo is the product surface and the packages are the business.
Where it's heading
The centre of gravity is correctness in clustered deployments, not new protocol capability. Recent releases keep tightening the same three areas — connection accounting under churn, proxy-header handling behind load balancers, and metadata sync for joining nodes — which reads as a broker being hardened for larger clusters rather than broadened. The RC-heavy release pattern (three RCs before 2.1.0, one open for 2.1.3) suggests a small team leaning on community testing before committing.
Prediction
2.1.3 ships as a fix-consolidation release absorbing the remaining open PRs, with the retain-expiry default change carried through. Nothing in these entries points to a new protocol or storage direction after that.

Recent moves

  1. 3mo ago

    2.1.3 RC1: socket-close accounting fix, retain-expiry check off by default

    An open release candidate that continues the cluster-hardening arc: a fix for connection counting when clients reconnect rapidly, ETS mirroring of event subscriptions in the SWC store for reload, and retain-expiry checking disabled by default. The notes explicitly say more open PRs will land before the final 2.1.3.

    View source ↗
  2. 4mo ago

    2.1.2 fixes WebSocket connection counts and X-Forwarded-For handling

    The clearest example of the operator-facing focus: active connection metrics now sum all WebSocket connections, X-Forwarded-For is read only from the actual proxy hop, and the session state machine sends SUBACKs on every error path. Routing-table memory management also moved off gen_server2.

    View source ↗
  3. 10mo ago

    2.1.1 fixes syslog boot, drops default local listeners

    A cleanup release that fixes a syslog boot failure, adds a syslog level setting, repairs an HTTPS config type regression introduced in 2.1.0, and stops auto-adding local MQTT and WebSocket listeners. The listener change is the one operators will notice on upgrade.

    View source ↗
  4. 1y ago

    2.1.0 lands a breaking on-disk metadata format

    ⚡ SPARK

    This is the release the whole 2.1.x line was built around: a breaking on-disk format change means a 2.1.0 node cannot read metadata state written by any earlier release. Everything since has been fixes settling on top of that foundation.

    View source ↗
  5. 1y ago

    2.1.0-rc3 makes inter-node connect options configurable

    The last RC before 2.1.0 fixes reconnect-after-failed-connect and keeps the patch directory first on the code load path, but the substantive change is making outgoing connect options configurable for inter-node connections — another knob for operators running across constrained networks.

    View source ↗
  6. 1y ago

    2.1.0-rc2: single init_sync flag fix

    A one-commit release candidate correcting the init_sync flag state when booting from disk. Visible only as a bug that no longer happens during the 2.1.0 metadata migration.

    View source ↗