Releases: cachebag/nmrs
nmrs 3.0.1
nmrs 3.0.0
nmrs 3.0.0
Published to crates.io.
nmrs 3.0 is a major expansion of the core library: OpenVPN support, broader VPN enumeration, per-interface Wi-Fi APIs, saved profile management, AP/BSSID detail, connectivity reporting, airplane mode, and a NetworkManager secret agent surface.
See CHANGELOG.md for the full technical changelog.
Highlights
- Added NetworkManager secret agent support for credential prompts over D-Bus.
- Added OpenVPN support, including builders,
.ovpnimport, inline certificate storage, auth handling, TLS hardening, compression, proxy, routing, and resilience options. - Added generic VPN enumeration for NetworkManager VPN plugins, including OpenVPN, OpenConnect, strongSwan, PPTP, L2TP, WireGuard, and a generic fallback.
- Added UUID/name-based activation and UUID-based disconnect for saved VPN profiles.
- Added per-interface Wi-Fi scoping for multi-radio systems via
WifiScope,list_wifi_devices(), and interface-aware scan/connect/disconnect APIs. - Added per-BSSID access point enumeration, security flag decoding, and
connect_to_bssid. - Added saved connection enumeration and management through NetworkManager Settings / Settings.Connection D-Bus APIs.
- Added connectivity state reporting,
check_connectivity(),connectivity_report(), and captive-portal URL detection. - Added airplane-mode helpers across Wi-Fi, WWAN, Bluetooth, and rfkill hardware state.
- Improved builder ergonomics by returning
Resultinstead of panicking on missing required fields. - Updated mdbook docs, README examples, and migration guidance for the 3.0 API.
Migration Notes
Most Wi-Fi methods now accept an optional interface argument. Pass None to preserve the old “any Wi-Fi device” behavior:
nm.list_networks(None).await?;
nm.scan_networks(None).await?;
nm.connect("MyNetwork", None, WifiSecurity::Open).await?;
nm.disconnect(None).await?;Use WifiScope for per-device operations:
let wlan0 = nm.wifi("wlan0");
wlan0.scan().await?;
wlan0.connect("MyNetwork", WifiSecurity::Open).await?;Other notable API changes:
set_wifi_enabled(bool)is now split into globalset_wireless_enabled(bool)and per-interfaceset_wifi_enabled(interface, bool).wifi_enabled()/wifi_hardware_enabled()are replaced bywifi_state().list_saved_connections()now returnsVec<SavedConnection>; uselist_saved_connection_ids()for the old name-list behavior.VpnTypeis now a rich metadata enum; the old tag-style role isVpnKind.VpnConfig::vpn_type()is nowvpn_kind().VpnConnectionInfo.vpn_typeis nowvpn_kind.VpnCredentialsBuilder::build()andEapOptionsBuilder::build()now returnResult.
What's Changed
Core 3.0 Features
- NetworkManager secret agent API by @cachebag in #370
- Airplane-mode surface and rfkill awareness by @cachebag in #372
- Per-BSSID access points, security decoding, and
connect_to_bssidby @cachebag in #373 - Per-interface Wi-Fi scoping for multi-radio systems by @cachebag in #375
- Saved connection enumeration through Settings / Settings.Connection proxies by @cachebag in #376
- Connectivity state and captive-portal URL surface by @cachebag in #377
- Generic VPN support with rich enumeration and UUID-based activation by @cachebag in #378
OpenVPN and VPN Work
VpnConfigtrait andconnect_vpnrefactor by @cachebag in #303- OpenVPN connection settings model expansion by @Dandiggas in #309
- Multi-VPN plumbing by @stoutes in #311
.ovpnlexer and parser by @cachebag in #314- OpenVPN compression and proxy support by @stoutes in #315
.ovpnparser tests and refactors by @cachebag in #316- Inline certificate storage for
.ovpnprofiles by @cachebag in #323 - OpenVPN builder with validation by @stoutes in #326
- Use
zvariant::Dictforvpn.dataandvpn.secretsD-Bus types by @cachebag in #337 - Parse
auth-user-passand infer OpenVPN auth type by @cachebag in #340 - Fix OpenVPN gateway extraction from
vpn.databy @cachebag in #344 - OpenVPN input validation by @cachebag in #345
- OpenVPN TLS hardening options by @cachebag in #346
NetworkManager::import_ovpn()andOpenVpnBuilder::from_ovpn_file()by @cachebag in #347VpnDetailsenum onVpnConnectionInfoby @cachebag in #348- OpenVPN routing, resilience, and NCP options by @cachebag in #349
Fixes and Polish
- Support selecting Bluetooth adapters in
BluetoothIdentityby @cachebag in #267 - Fill active Wi-Fi network device/IP fields by @cachebag in #368
- Fire network monitor callbacks on AP signal strength changes by @cachebag in #367
- Add
Sendbound to monitoring stream trait objects by @cachebag in #359 - Return
ResultfromVpnCredentialsandEapOptionsbuilders by @cachebag in #379 - Propagate disconnect errors and narrow Wi-Fi pre-connect teardown by @cachebag in #379
- Add missing public API annotations by @cachebag in #379
- Update mdbook for 3.0 per-interface Wi-Fi API and OpenVPN docs by @cachebag in #379
Maintenance
Contributors
Thank you to everyone who contributed code, docs, review, testing, bug reports, and release feedback for this cycle.
- @cachebag
- @stoutes
- @pluiee
- @JonnieCache
- @tristanmsct
- @Rifat-R
- @of-the-stars
- @okhsunrog
- @ruthwik-01
- @joncorv
- @AK78gz
- @pwsandoval
- @ritiek
- @shubhsingh5901
- @cinnamonstic
- @tuned-willow
Full Changelog: nmrs-v2.4.0...nmrs-v3.0.0
nmrs 2.4.0
nmrs 2.4.0
Published to crates.io
See CHANGELOG.md for details.
What's Changed
- chore: include
AGENTS.mdfile by @cachebag in #338 - fix(nmrs): add
Sendbound to monitoring stream trait objects by @cachebag in #359 - fix(#363): fire network monitor on signal strength changes by @cachebag in #367
- fix(#362): populate device and IP fields in list_networks by @cachebag in #368
- refactor: use
talk-e/install-actionfor semver checks by @cachebag in #369
Full Changelog: gui-v1.5.1...nmrs-v2.4.0
nmrs 2.3.0
nmrs 2.3.0
Published to crates.io
What's Changed
- chore(deps): update nix flake by @JonnieCache in #306
- fix(nmrs): add
Sendbound tofor_each_access_pointcallback future by @okhsunrog in #330 - fix: remove stale nmrs-aur submodule gitlink by @okhsunrog in #331
New Contributors
- @okhsunrog made their first contribution in #330
Full Changelog: gui-v1.5.0...nmrs-v2.3.0
nmrs-gui 1.5.1
nmrs-gui 1.5.1
A Wayland-compatible NetworkManager frontend built with GTK4.
Installation
Arch Linux (AUR)
yay -S nmrsManual Installation
Download the binary, extract, and move to your PATH:
tar -xzf nmrs-gui-1.5.1-x86_64-linux.tar.gz
sudo mv nmrs-gui /usr/local/bin/nmrsSee CHANGELOG.md for full details.
What's Changed
- fix(gui): change app.lock location#310 by @tristanmsct in #310
New Contributors
- @tristanmsct made their first contribution in #330
Full Changelog: gui-v1.5.0...gui-v1.5.1
nmrs-gui 1.5.0
[1.5.0] - 2026-03-19
Fixed
- Custom
~/.config/nmrs/style.cssis now applied after the saved theme, ensuring it always takes precedence over any predefined theme (#274) by @cachebag - Fixed header status label inflating natural width with long status strings (#279) by @pwsandoval
[1.1.0] - 2025-12-19
Fixed
- Corrected binary name for
.desktopfile +postInstallhook for Nix flake (#146) @JonnieCache
A Wayland-compatible NetworkManager frontend built with GTK4.
Installation
Arch Linux (AUR)
yay -S nmrsManual Installation
Download the binary, extract, and move to your PATH:
tar -xzf nmrs-gui-1.5.0-x86_64-linux.tar.gz
sudo mv nmrs-gui /usr/local/bin/nmrsSee CHANGELOG.md for full details.
Release nmrs 2.2.0
What's Changed
- refactor(nmrs):
#[must_use]added across public interface by @cachebag in #264 - refactor(nmrs-gui): elide use of
WiredDevicesContextand just useNetworksContextinstead by @cachebag in #265 - refactor(#223): convert bdaddr into bluez dbus object path by @cachebag in #266
- feat(#177): concurrency protection by @cachebag in #268
- fix(#273): user CSS now overrides selected theme by @cachebag in #274
- fix(#243) set proper package name and version in nix flake by @JonnieCache in #275
- fix(#278): header status label inflates natural width with long status strings by @pwsandoval in #279
- feat(#283): expose
WirelessHardwareEnabledthrough API by @cachebag in #284 - fix(ci): nix workflow hardening by @cachebag in #286
- chore(nmrs): bump to 2.2.0 by @cachebag in #285
New Contributors
- @pwsandoval made their first contribution in #279
Full Changelog: nmrs-v2.0.1...nmrs-v2.2.0
Release nmrs 2.0.1 - 'Hello, there!'
nmrs 2.0.1
Welcome to the 'Hello, there!' release.
See CHANGELOG.md for details.
What's Changed
- refactor: device type registry system for future extensibility summary by @cachebag in #172
- feat(nmrs): input validation by @cachebag in #173
- ci: auto-update nix hashes on PRs by @cachebag in #182
- fix(#175): race condition in signal subscription by @cachebag in #195
- fix(nmrs): signal stream cleanup by @cachebag in #197
- Release nmrs 2.0.0 by @cachebag in #198
- fix(network): Make forget() and forget_vpn() idempotent by @ruthwik-01 in #200
- fix(#180): wire fixsha into CI by @cachebag in #203
- fix(nmrs-gui): hyprland config steps in README + process name by @Rifat-R in #205
- chore: bump resolver + MSRV by @cachebag in #206
- fix(nmrs): complete ipv6 support by @cachebag in #208
- Update README.md by @cachebag in #209
- fix: replace magic number with named constant for device activation states by @AK78gz in #230
- fix(tests): idempotence enforcement for
forget_vpn()by @shubhsingh5901 in #232 - refactor(bluetooth): replace println! with debug! by @Rifat-R in #234
- docs: introduce mdbook by @cachebag in #236
- refactor: add context to D-Bus operation errors by @stoutes in #240
- refactor(#224): replace hardcoded root paths with Default impl by @pluiee in #242
- feat(#215): validate bluetooth address in
populate_bluez_info&BluetoothIdentity::newby @pluiee in #246 - feat(#260): new
WifiModeandmodetoWifiConnectionBuilderby @cachebag in #263
New Contributors
- @ruthwik-01 made their first contribution in #200
- @Rifat-R made their first contribution in #205
- @AK78gz made their first contribution in #230
- @shubhsingh5901 made their first contribution in #232
- @stoutes made their first contribution in #240
- @pluiee made their first contribution in #242
Full Changelog: nmrs-v1.3.5...nmrs-v2.0.1
Release nmrs 2.0.0 - 'Sleep is the Cousin of Death'
nmrs 2.0.0
Welcome to the 'Sleep is the Cousin of Death' release.
This marks a point of the project that's considerably more stable than 1.0.0, due to my mishaps around the extensibility of the public API's structs/enums.
Some things worth noting explicitly include the ability to develop nmrs on macOS or Windows via the Docker image provided, and extensive refactors made to make the code a bit more digestible and more importantly, maintainable in the future. And of course, Bluetooth support which is really nothing but a kick-starter to introduce more devices without breaking the API (thanks to those refactors).
Now, more than ever, I am happy to accept contributions to this project as my personal life is going to take priority for the following year as I get married and begin looking for a job before I graduate in the Fall.
I'll of course chip away at this whenever I get the time as it is my personal labor of love, but I can't promise that development from me be as continuous as it has been in the last few months.
Added
- Configurable timeout values for connection and disconnection operations (#185)
- Builder pattern for VpnCredentials and EapOptions (#188)
- Bluetooth device support (#198)
- Input validation before any D-Bus operations (#173)
CI: adjust workflow to auto-update nix hashes on PRs (#182)- More helpful methods to network_manager facade (#190)
- Explicitly clean up signal streams to ensure unsubscription (#197)
Fixed
Changed
- Various enums and structs marked non-exhaustive (#198)
- Expose NMWiredProxy and propogate speed through + write in field and display for BT device type (#198)
- refactor: device type registry system for future extensibility summary by @cachebag in #172
Full Changelog(1.0.0 to 2.0.0): nmrs-v1.0.0...nmrs-v2.0.0
Release nmrs 1.3.5 - 'Size Doesn't Matter'
nmrs 1.3.5
Welcome to the 'Size Doesn't Matter' release.
Changed
Full Changelog: nmrs-v1.3.0...nmrs-v1.3.5