← Back to all sparks
V

VerneMQ

COMMS
Velocity2.5

Distributed MQTT message broker

VerneMQ's 2.2.0 collects a year of cluster and connection fixes into one release.

mqttmessage-brokerclusteringwebsocketserlang
Current state
VerneMQ ships infrequently — the six most recent releases span February 2025 to August 2026 — and 2.2.0 on 9 August gathers roughly a year of accumulated work. Its contents are broker internals: a socket-accounting fix for rapid connect/disconnect churn, MQTT v5 property handling in the Lua auth cache, ETS-mirrored event subscriptions in the SWC metadata store, parallelised inter-node readiness checks, and anonymous-override extended to WebSocket listeners. The 2.1.3 release candidate from April was folded in and the version renumbered.
Where it's heading
Work concentrates on cluster behaviour and connection churn — the failure modes large MQTT fleets actually hit — rather than on protocol surface. Defaults are being revisited alongside the fixes: the retain-expiry check is now off by default and SWC initial sync is set to off, both choices that favour predictable behaviour on busy clusters over automatic housekeeping. Development stays maintainer-paced, with dependency bumps making up a visible share of each changelog, and the commercial EULA on binary packages continues to sit alongside the open source.
Prediction
The next release is most likely another long-cycle collection of cluster and listener fixes rather than a feature line. Nothing in these entries points to a 3.0 direction.

Recent moves

  1. 9d ago

    Socket-count fix, WS(S) anonymous override, faster cluster readiness

    The year's substantive release: connection-counter correctness under rapid client churn, v5 property handling fixed in the Lua auth path, SWC event subscriptions mirrored in ETS for reload, parallel inter-node readiness checks, and anonymous-override support on WS/WSS listeners. Two defaults flip as well, retain-expiry checking and SWC initial sync both off.

    View source ↗
  2. 3mo ago

    Testing candidate later folded into 2.2.0

    A testing candidate whose PR list is a prefix of what eventually shipped as 2.2.0 — the release was renumbered rather than completed as 2.1.3. Nothing here reached general availability under this version.

    View source ↗
  3. 5mo ago

    SUBACK error-path fix and routing-table memory reduction

    SUBACKs are now sent on all error clauses in the session state machine, WebSocket connections are counted correctly in active-connection metrics, and X-Forwarded-For handling was tightened. The routing trie moved off gen_server2 for better memory behaviour — the same instrumentation-and-churn theme 2.2.0 continues.

    View source ↗
  4. 10mo ago

    Syslog boot fix and an HTTPS config regression from 2.1.0

    Fixes syslog boot with a new log.syslog.level setting, stops adding local MQTT and WS default listeners, and corrects an HTTPS config type regression introduced in 2.1.0. Mostly cleanup after the previous minor, with one genuinely new configuration knob.

    View source ↗
  5. 1y ago

    Breaking on-disk metadata format change

    The minor that carries a breaking on-disk format change — metadata state from earlier releases cannot be read, so upgrades are a migration rather than a restart. It also adds an experimental initial-sync round for empty joining nodes, the cluster-membership work that 2.2.0 later builds on.

    View source ↗
  6. 1y ago

    RC3: bridge reconnect and inter-node connect options

    A third release candidate on the way to 2.1.0, with a bridge reconnect fix, a patch-directory load-path fix, and configurable inter-node connect options. Superseded by the stable release four months later.

    View source ↗