NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #3607 most downloaded on crates.io
An efficient and robust mqtt client for your connected devices
Last release 10 months ago
21 Nov 2025
Ships unpredictably
gaps range from 2 weeks to 1.5 years
Most releases are documented
notes for 25 of 35 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
35 releases · first in 2020
One column per quarter.
This patch release focuses on fixing the broken WebSocket feature and includes dependency updates.
This patch release focuses on fixing the broken WebSocket feature and includes dependency updates.
WebSocket Fix: This release resolves a build issue that occurred when the websocket feature was enabled, caused by incompatibility with ws_stream_tungstenite v0.14.0. The dependency has been updated to v0.15.0, restoring full WebSocket functionality.
websocket feature enabled (#999)use-rustls-no-provider feature for more flexible TLS configuration (#988)Welcome to our new contributors:
Full Changelog: [rumqttc-0.25.0...rumqttc-0.25.1]
use-rustls-no-provider feature flag to allow choosing crypto backend without being forced to compile aws_lc_rsSpecial recognition goes to contributors who tackled complex issues like MQTT v5 protocol implementation, security vulnerabilities, and critical subsc…
We're excited to announce the release of rumqttc v0.25.0! This release brings significant improvements, new features, and important bug fixes that enhance the stability and functionality of your MQTT applications.
session_expiry_interval in MQTT v5 connections, giving you better control over session persistenceAuth packet support for enhanced authentication flowsDisconnectProperties struct public for better disconnect handlingDuration::MAX instead of zero for better connection handlingTlsConnector support for more flexible secure connectionsset_client_id method in MqttOptions for easier client ID managementpoll() method for more predictable behaviorsubscribe_many always caused EmptySubscription errorswrite operations return correct byte countsWe've updated several critical dependencies for security and performance:
Network implementation with Framed<.., Codec>Login in MqttOptionsWhile we've maintained backward compatibility where possible, please note:
A huge thank you to our 16 new contributors who made this release possible! We're thrilled to welcome these developers to the rumqtt community:
New Contributors:
This diverse group of contributors brought improvements ranging from security enhancements and performance optimizations to API improvements and documentation fixes. Their combined efforts have made rumqttc more robust, secure, and user-friendly.
Special recognition goes to contributors who tackled complex issues like MQTT v5 protocol implementation, security vulnerabilities, and critical subscription handling bugs.
For most users, upgrading should be straightforward:
Cargo.toml to use rumqttc = "0.25.0"This release represents months of community effort and testing. We're confident it will provide a more stable, secure, and feature-rich MQTT experience for your applications.
Happy coding! 🦀
size() method on Packet calculates size once serialized.read() and write() methods on Packet.ConnectionAborted variant on StateError type to denote abrupt end to a connectionset_session_expiry_interval and session_expiry_interval methods on MqttOptions.Auth packet as per MQTT5 standardsnodelay property of underlying TCP client with the tcp_nodelay field in NetworkOptionsset_client_id method on MqttOptionsN as AsyncReadWrite to describe usage.Framed to encode/decode MQTT packets.Login to store credentialsDisconnectProperties struct public.Vec<Option<u16>> with FixedBitSet for managing packet ids of released QoS 2 publishes and incoming QoS 2 publishes in MqttState.native_tls::TlsConnector as input for Transport::tls_with_config.thiserror to 2.0.8, tokio-rustls to 0.26.0, rustls-webpki to 0.102.8, rustls-pemfile to 2.2.0, rustls-native-certs to 0.8.1, async-tungstenite to 0.28.0, ws_stream_tungstenite to 0.14.0, native-tls to 0.2.12 and tokio-stream to 0.1.16.rumqttc::v5::Connection publicState.events related to QoS > 0 publishesCONNACK with session_present == 1.StateError and log warnings on these failures.…to 0.12.0 and http to 1.0.0 . This is a breaking change as types from some of these crates are part of the public API in
EventLoop::clean to allow triggering shutdown and subsequent storage of pending requests by @de-sh in #741You can now shutdown the Eventloop and drain Requests, which weren't received from the channel and keep them in pending while doing cleanup to prevent any data loss. Example usage in bytebeamio/uplink.
PKCS#1, PKCS#8, RFC5915 and new TLS Error variants: NoValidClientCertInChain, NoValidKeyInChain by @ijager in #752 and #752With this, we now practically support all RSA and ECC keys in DER/SEC1 encoding.
A websocket request modifier for v4 client by @swanandx in #772
Surfaced AsyncClient's from_senders method to the Client as from_sender by @BKDaugherty in #779
MqttOptions::new now accepts empty client_id and MqttOptions::set_clean_session panics if client_id is empty and clean_session flag is set to false.
Synchronous client methods take &self instead of &mut self by @BKDaugherty in #646
Users do not need to specify the TLS key variant in the TlsConfiguration anymore, this is inferred automatically. To update your code simply remove Key::ECC() or Key::RSA() from the initialization.
With this, the der & password fields are replaced by client_auth.
Make v5 RetainForwardRule public, in order to allow setting it when constructing Filter values by @brianmay in #767
Use VecDeque instead of IntoIter to fix unintentional drop of pending requests on EventLoop::clean by @de-sh in #780
Fix typo - StateError::IncommingPacketTooLarge => StateError::IncomingPacketTooLarge by @swanandx in #786
Update tokio-rustls to 0.25.0, rustls-native-certs to 0.7.0, rustls-webpki to 0.102.1, rusttls-pemfile to 2.0.0, async-tungstenite to 0.24.0, ws_stream_tungstenite to 0.12.0 and http to 1.0.0. This is a breaking change as types from some of these crates are part of the public API in
Full Changelog: rumqttd-0.19.0...rumqttc-0.24.0
EventLoop::clean to allow triggering shutdown and subsequent storage of pending requestsPKCS#1, PKCS#8, RFC5915. In practice we should now support all RSA keys and ECC keys in DER and SEC1 encoding. Previously only PKCS#1 and PKCS#8 where supported.NoValidClientCertInChain, NoValidKeyInChain.Requests, which weren't received by eventloop, from channel and put them in pending while doing cleanup to prevent data loss.AsyncClient's from_senders method to the Client as from_senderMqttOptions::new now accepts empty client id.MqttOptions::set_clean_session now panics if client ID is empty and clean_session flag is set to false.&self instead of &mut self (#646)Key enum: users do not need to specify the TLS key variant in the TlsConfiguration anymore, this is inferred automatically.
To update your code simply remove Key::ECC() or Key::RSA() from the initialization.der & password fields are replaced by client_auth.RetainForwardRule public, in order to allow setting it when constructing Filter values.VecDeque instead of IntoIter to fix unintentional drop of pending requests on EventLoop::clean (#780)StateError::IncommingPacketTooLarge is now StateError::IncomingPacketTooLarge.tokio-rustls to 0.25.0, rustls-native-certs to 0.7.0, rustls-webpki to 0.102.1,
rusttls-pemfile to 2.0.0, async-tungstenite to 0.24.0, ws_stream_tungstenite to 0.12.0
and http to 1.0.0. This is a breaking change as types from some of these crates are part of
the public API.Removed dependency vulnerability, see rustsec . Update of tungstenite dependency.
bind_device to NetworkOptions to enable TCPSocket.bind_device()MqttOptions::set_request_modifier for setting a handler for modifying a websocket request before sending it.tungstenite dependency.flume dependency by @domenicquirl in #653ws_stream_tungstenite to remove webpki by @swanandx in #704bind_device to NetworkOptions to enable TCPSocket.bind_device()MqttOptions::set_request_modifier for setting a handler for modifying a websocket request before sending it.tungstenite dependency.Added outgoing_inflight_upper_limit to MQTT5 MqttOptions. This sets the upper bound for the number of outgoing publish messages
outgoing_inflight_upper_limit to MQTT5 MqttOptions. This sets the upper bound for the number of outgoing publish messages (#615)proxy feature gateeventloop::network_connect to allow setting proxyMqttOptionsrustls to 0.21 and tokio-rustls to 0.24 (#606)
MqttState::new takes max_outgoing_packet_size which was set in MqttOptions but not used (#622)max_outgoing_packet_size on v4 client (#622)Added support for MQTT5 features to v5 client
publish_with_props etcMqttOptions to use ConnectProperties for some fieldsBox on Event::IncomingConnect packet returning wrong size on write()
NetworkOptions added to provide a way to configure low level network configurations
NetworkOptions added to provide a way to configure low level network configurations (#545)options in Eventloop now is called mqtt_options (#545)ConnectionError now has specific variant for type of Timeout, FlushTimeout and NetworkTimeout instead of generic Timeout for both (#545)conn_timeout is moved into NetworkOptions (#545)Old changelog entries can be found at CHANGELOG.md
Nothing published for this version
Removed Link and its implementation which were deprecated by @swanandx in #684
This release fixes retained and will messages and adds support for will delay interval in MQTTv5. Rumqttd now have an enhanced release profile in Cargo.toml which would improve performance while reducing the binary size! Here are some of the other changes:
Full Changelog: rumqttd-0.17.0...rumqttd-0.18.0
Nothing published for this version
Blog Post discussing this release - https://bytebeam.io/blog/qos2-and-websockets-support-rumqttd/
Blog Post discussing this release - https://bytebeam.io/blog/qos2-and-websockets-support-rumqttd/
Nothing published for this version
Timeouts moved up to connect() call
connect() call (#408)version = "1" (#412)ClientError to not expose dependence on flume/SendError (#420)EventLoop.poll() mid execution (#421)Add code in rumqttc::v5, moving towards support for operating the client with MQTT 5 (#351, #393, #398)
rumqttc::v5, moving towards support for operating the client with MQTT 5 (#351, #393, #398)self.inflight += 1 in MqttState.save_pubrel() (#389)rumqttc::client::Iter (#402)Enable compilation without rustls as a dependency using --no-default-features
rustls as a dependency using --no-default-features (#365)ConnectionError (#370)MqttOptions::parse() using url (#379)get_mut() instead of index based access to ensure no panic (#384)Enable compilation without rustls as a dependency using --no-default-features
--no-default-features (#365)tokio_rustls upgraded to 0.23.2
tokio_rustls upgraded to 0.23.2NOTE: mqttbytes moved into separate repo, dependency on the same from rumqtt client and broker crates are hence forth removed.
- Use updated mqttbytes ### R9 ----------------
- Add server side password check ### R8 ----------------
changed Update to mqttbytes 0.4
* More public fields in v5
Make username and password public in connect packet
* Make publish len public
len publicfix Connack and suback packet mixup during mqtt 5 implementation [breaking]
feature Complete mqtt 5 implementation
Move integration tests outside eventloop
Nothing published for this version
changed Deprecate mqtt4/5bytes to combine them in mqttbytes
Nothing published for this version
Manually setup 1 router thread and 1 io thread
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →