{"id":35727272,"url":"https://github.com/cachebag/nmrs","last_synced_at":"2026-04-25T06:02:45.801Z","repository":{"id":316476910,"uuid":"1063554808","full_name":"cachebag/nmrs","owner":"cachebag","description":"Rust bindings for NetworkManager over D-Bus.","archived":false,"fork":false,"pushed_at":"2026-04-24T20:28:15.000Z","size":1100,"stargazers_count":224,"open_issues_count":30,"forks_count":21,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-04-24T21:09:24.950Z","etag":null,"topics":["dbus","linux","networkmanager","rust","wayland-compositor"],"latest_commit_sha":null,"homepage":"https://cachebag.github.io/nmrs/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cachebag.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE-APACHE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":"cachebag","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"thanks_dev":null,"custom":null}},"created_at":"2025-09-24T19:38:57.000Z","updated_at":"2026-04-24T19:16:47.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/cachebag/nmrs","commit_stats":null,"previous_names":["cachebag/netrs","cachebag/nmrs"],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/cachebag/nmrs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cachebag%2Fnmrs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cachebag%2Fnmrs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cachebag%2Fnmrs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cachebag%2Fnmrs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cachebag","download_url":"https://codeload.github.com/cachebag/nmrs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cachebag%2Fnmrs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32251812,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T04:23:17.126Z","status":"ssl_error","status_checked_at":"2026-04-25T04:21:53.360Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dbus","linux","networkmanager","rust","wayland-compositor"],"created_at":"2026-01-06T09:15:32.490Z","updated_at":"2026-04-25T06:02:45.795Z","avatar_url":"https://github.com/cachebag.png","language":"Rust","readme":"# \u003cp align=\"center\"\u003e nmrs 🦀 \n\n[![Crates.io](https://img.shields.io/crates/v/nmrs)](https://crates.io/crates/nmrs)\n[![Discord](https://img.shields.io/badge/chat-on%20discord-7289da?logo=discord\u0026logoColor=white)](https://discord.gg/Sk3VfrHrN4)\n[![Documentation](https://docs.rs/nmrs/badge.svg)](https://docs.rs/nmrs)\n[![User Guide](https://img.shields.io/badge/docs-mdBook-blue)](https://cachebag.github.io/nmrs/)\n[![CI](https://github.com/cachebag/nmrs/actions/workflows/ci.yml/badge.svg)](https://github.com/cachebag/nmrs/actions/workflows/ci.yml)\n[![License](https://img.shields.io/crates/l/nmrs)](LICENSE)\n\nAn async-first Rust API for [NetworkManager](https://networkmanager.dev/) over [D-Bus](https://dbus.freedesktop.org/doc/dbus-specification.html). The goal is to provide a safe and simple high-level API for managing Wi-Fi connections on Linux systems, built on [`zbus`](https://docs.rs/zbus) for reliable D-Bus communication.\n\nThe project is divided into the following crates:\n\n* `nmrs`: The core library providing NetworkManager bindings and Wi-Fi management API.\n* `nmrs-gui`: A Wayland-compatible GTK4 graphical interface for NetworkManager.\n\n[Jump to the GUI section of this repo](#installation)\n\n## Documentation\n\n- **[User Guide](https://cachebag.github.io/nmrs/)** - Comprehensive guide with tutorials and examples\n- **[API Documentation](https://docs.rs/nmrs)** - Complete API reference on docs.rs\n- **[Discord](https://discord.gg/Sk3VfrHrN4)** - Join our community for help and discussion\n\n## Getting Started\n\n_Please consider joining the [**Discord**](https://discord.gg/Sk3VfrHrN4). It's a welcoming community to both developers who want to contribute and/or learn about and discuss nmrs as well as users that would like to be engaged with the development process._\n\nThe best way to get started with `nmrs` is the [User Guide](https://cachebag.github.io/nmrs/), which includes comprehensive tutorials and examples. For detailed API information, see the [API documentation](https://docs.rs/nmrs).\n\n## Sample usage\nWe'll create a simple example that scans for available networks and connects to one. Note that these examples require NetworkManager to be running on your Linux system with D-Bus access, obviously.\n\n### Listing Networks\n\nScan for and display available Wi-Fi networks:\n\n```rust,no_run\nuse nmrs::NetworkManager;\n\n#[tokio::main]\nasync fn main() -\u003e nmrs::Result\u003c()\u003e {\n    let nm = NetworkManager::new().await?;\n    \n    // Scan for networks\n    let networks = nm.list_networks(None).await?;\n    \n    for net in networks {\n        println!(\n            \"{} - Signal: {}%, Security: {:?}\",\n            net.ssid,\n            net.strength.unwrap_or(0),\n            net.security\n        );\n    }\n    \n    Ok(())\n}\n```\n\n### Now let's connect to a network...\n\nConnect to a WPA-PSK protected network:\n\n```rust,no_run\nuse nmrs::{NetworkManager, WifiSecurity};\n\n#[tokio::main]\nasync fn main() -\u003e nmrs::Result\u003c()\u003e {\n    let nm = NetworkManager::new().await?;\n    \n    // Connect to a network\n    nm.connect(\"MyNetwork\", None, WifiSecurity::WpaPsk {\n        psk: \"password123\".into()\n    }).await?;\n    \n    // Check current connection\n    if let Some(ssid) = nm.current_ssid().await {\n        println!(\"Connected to: {}\", ssid);\n    }\n    \n    Ok(())\n}\n```\n\n### Error Handling\n\nAll operations return `Result\u003cT, ConnectionError\u003e` with specific error variants:\n\n```rust,no_run\nuse nmrs::{NetworkManager, WifiSecurity, ConnectionError};\n\n#[tokio::main]\nasync fn main() -\u003e nmrs::Result\u003c()\u003e {\n    let nm = NetworkManager::new().await?;\n    \n    match nm.connect(\"MyNetwork\", None, WifiSecurity::WpaPsk {\n        psk: \"wrong_password\".into()\n    }).await {\n        Ok(_) =\u003e println!(\"Connected successfully\"),\n        Err(ConnectionError::AuthFailed) =\u003e eprintln!(\"Authentication failed - wrong password\"),\n        Err(ConnectionError::NotFound) =\u003e eprintln!(\"Network not found or out of range\"),\n        Err(ConnectionError::Timeout) =\u003e eprintln!(\"Connection timed out\"),\n        Err(e) =\u003e eprintln!(\"Error: {}\", e),\n    }\n    \n    Ok(())\n}\n```\n\nTo follow and/or discuss the development of nmrs, you can join the [public Discord channel](https://discord.gg/Sk3VfrHrN4).\n \n# \u003cp align=\"center\"\u003e nmrs-gui \u003c/p\u003e\n\n[![Crates.io](https://img.shields.io/crates/v/nmrs-gui)](https://crates.io/crates/nmrs-gui)\n[![Nix](https://github.com/cachebag/nmrs/actions/workflows/nix.yml/badge.svg)](https://github.com/cachebag/nmrs/actions/workflows/nix.yml)\n\nThis repository also includes `nmrs-gui`, a Wayland-compatible NetworkManager frontend built with GTK4.\n\n\u003cp align=\"center\"\u003e\n\u003cimg width=\"1920\" height=\"1080\" alt=\"image\" src=\"https://github.com/user-attachments/assets/fc0fc636-2fa3-4d80-b43e-71f830b10053\" /\u003e\n\u003c/p\u003e\n\n### Installation\n\n**Arch Linux (AUR)**\n\n```bash\nyay -S nmrs\n# or\nparu -S nmrs\n```\n\n**Nix**\n\n```bash\nnix-shell -p nmrs\n```\n\n### Configuration\n\n**Waybar Integration**\n\n```json\n\"network\": {\n    \"on-click\": \"nmrs\"\n}\n```\n\n**Tiling Window Managers** (Hyprland, Sway, i3)\n\n```\nwindowrule = float 1, match:class org.nmrs.ui\n```\n\n**Custom Styling**\n\nEdit `~/.config/nmrs/style.css` to customize the interface. There are also pre-defined themes you can pick from in the interface itself.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eRoadmap / Implementation Status\u003c/strong\u003e\u003c/summary\u003e\n\n### Devices\n\n- [x] Generic  \n- [x] Wireless  \n- [ ] Any  \n- [X] Wired  \n- [ ] ADSL  \n- [X] Bluetooth  \n- [ ] Bond  \n- [ ] Bridge  \n- [ ] Dummy  \n- [ ] HSR *(NetworkManager ≥ 1.46)*  \n- [ ] Infiniband  \n- [ ] IP Tunnel  \n- [ ] IPVLAN *(NetworkManager ≥ 1.52)*  \n- [ ] Lowpan  \n- [ ] Loopback  \n- [ ] MACsec  \n- [ ] MACVLAN  \n- [ ] Modem  \n- [ ] OLPC Mesh  \n- [ ] OVS Bridge  \n- [ ] OVS Interface  \n- [ ] OVS Port  \n- [ ] PPP  \n- [ ] Statistics  \n- [ ] Team  \n- [ ] TUN/TAP  \n- [ ] VETH  \n- [ ] VLAN  \n- [ ] VRF  \n- [ ] VXLAN  \n- [ ] Wi-Fi P2P  \n- [ ] WiMAX  \n- [X] WireGuard  \n- [ ] WPAN  \n\n### Configurations\n\n- [x] IPv4  \n- [x] IPv6  \n- [x] DHCPv4  \n- [x] DHCPv6  \n\n### Core Interfaces\n\n- [x] NetworkManager *(partial)*  \n- [x] Device  \n- [x] Access Point  \n- [x] Active Connection  \n- [x] Settings  \n- [x] Settings Connection  \n- [x] Agent Manager  \n- [ ] Checkpoint  \n- [ ] DNS Manager  \n- [ ] PPP  \n- [x] Secret Agent  \n- [x] VPN Connection (WireGuard + plugin VPNs)  \n- [ ] VPN Plugin  \n- [ ] Wi-Fi P2P  \n- [ ] WiMAX NSP  \n\n\u003c/details\u003e\n\n## Contributing\n\nContributions are welcome. Please read [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines.\n\n## Requirements\n\n- **Rust**: 1.90.0+ for `nmrs`, 1.94.0+ for `nmrs-gui`\n- **NetworkManager**: Running and accessible via D-Bus\n- **Linux**: This library is Linux-specific\n\n## License\n\nThis project is dual-licensed under either of the following licenses, at your option:\n\n- MIT License  \n- Apache License, Version 2.0\n\nYou may use, copy, modify, and distribute this software under the terms of either license.\n\nSee the following files for full license texts:\n- [MIT License](./LICENSE-MIT)\n- [Apache License 2.0](./LICENSE-APACHE)\n\n## Contributors\n\nThank you to everyone who has helped build, test, document, and review `nmrs`.\n\n\u003c!-- readme: contributors -start --\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/cachebag\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/111914307?v=4\" width=\"100px;\" alt=\"cachebag\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ecachebag\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/stoutes\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/31317041?v=4\" width=\"100px;\" alt=\"stoutes\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003estoutes\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/pluiee\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/93393389?v=4\" width=\"100px;\" alt=\"pluiee\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003epluiee\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/JonnieCache\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/211093?v=4\" width=\"100px;\" alt=\"JonnieCache\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJonnieCache\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/tristanmsct\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/69300092?v=4\" width=\"100px;\" alt=\"tristanmsct\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003etristanmsct\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/Rifat-R\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/81259132?v=4\" width=\"100px;\" alt=\"Rifat-R\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRifat-R\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/of-the-stars\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/47869156?v=4\" width=\"100px;\" alt=\"of-the-stars\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eof-the-stars\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/okhsunrog\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/42293787?v=4\" width=\"100px;\" alt=\"okhsunrog\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eokhsunrog\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/ruthwik-01\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/235033610?v=4\" width=\"100px;\" alt=\"ruthwik-01\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eruthwik-01\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/joncorv\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/151096562?v=4\" width=\"100px;\" alt=\"joncorv\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ejoncorv\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/AK78gz\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/89071188?v=4\" width=\"100px;\" alt=\"AK78gz\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAK78gz\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/pwsandoval\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/15174704?v=4\" width=\"100px;\" alt=\"pwsandoval\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003epwsandoval\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/ritiek\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/20314742?v=4\" width=\"100px;\" alt=\"ritiek\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eritiek\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/shubhsingh5901\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/110416544?v=4\" width=\"100px;\" alt=\"shubhsingh5901\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eshubhsingh5901\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/cinnamonstic\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/182801542?v=4\" width=\"100px;\" alt=\"cinnamonstic\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ecinnamonstic\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/tuned-willow\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/250158319?v=4\" width=\"100px;\" alt=\"tuned-willow\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003etuned-willow\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\u003c!-- readme: contributors -end --\u003e\n","funding_links":["https://github.com/sponsors/cachebag"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcachebag%2Fnmrs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcachebag%2Fnmrs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcachebag%2Fnmrs/lists"}