SubnetDesk
A LAN-first remote desktop for fast, private, direct connections.
An independently maintained RustDesk fork built for LANs, routed private networks, and VPNs.
English · 简体中文
Why SubnetDesk · Features · Download · Quick start · Build
💡 Why SubnetDesk
SubnetDesk focuses on one clear use case: remote control between devices that can already reach each other. It removes the public device-ID, rendezvous, relay, cloud account, proxy, and automatic public-update paths from RustDesk, replacing them with direct endpoint connections and local device discovery.
That makes it a good fit for home labs, offices, classrooms, on-site support, and private networks connected by WireGuard, Tailscale, OpenVPN, or another VPN.
| SubnetDesk | Typical RustDesk deployment | |
|---|---|---|
| Connection | Direct IP address or hostname | Device ID through rendezvous, with optional relay |
| Discovery | Automatic mDNS discovery on the LAN | Device ID or address book |
| Server dependency | No coordination server required | Public or self-hosted rendezvous/relay server |
| Best suited for | LANs, routed private networks, and VPNs | Internet and cross-NAT access |
Important
SubnetDesk does not provide Internet rendezvous or relay services. The two devices must be reachable through the same LAN, a routed private network, or a VPN.
✨ Features
| Capability | Details | |
|---|---|---|
| 🔎 | Local discovery | Find nearby devices automatically over mDNS. |
| ⚡ | Direct connections | Connect by IP address or hostname using a configurable TCP port. |
| 🔐 | Access protection | Authenticate with a username and password; passwords are stored as Argon2id hashes. |
| 🛡️ | Device verification | Verify and remember endpoint fingerprints before trusting a device. |
| 🌐 | Network allowlist | Restrict incoming connections to selected CIDR networks. |
| ⭐ | Fast reconnection | Keep recent devices, favorites, and stable device identities. |
| 🖥️ | RustDesk experience | Retain remote control, clipboard, audio, and file-transfer capabilities without a public coordination server. |
📦 Download
Download stable packages from GitHub Releases. For the newest changes, use the nightly release or artifacts from GitHub Actions.
| Platform | Architectures | Packages |
|---|---|---|
| Windows | x86_64, ARM64 | .msi installer (recommended), portable/no-install .exe |
| macOS | Intel, Apple Silicon | .dmg |
| Linux | x86_64, ARM64 | .deb, .rpm, .AppImage, .flatpak; Arch package on x86_64 |
| Android | ARM64, ARMv7, x86_64, universal | .apk |
Note
Nightly packages are development builds. Prefer the latest stable release for daily use.
🚀 Quick start
- Install and open SubnetDesk on both devices.
- On the controlled device, open LAN settings, set a username and password, and enable LAN discovery. The default port is
21118. - On the controller, select a discovered device or enter
hostname:port/IP:portmanually. - Verify the device fingerprint on first connection, then connect.
Network checklist
- Both devices can route to each other.
- TCP port
21118(or your configured port) is allowed by the host firewall. - mDNS is available when automatic discovery is needed; direct address entry still works without it.
- The controlled device's CIDR allowlist includes the controller's network.
- On Linux, see host readiness notes for SELinux, Wayland, and login-screen guidance.
🔒 Security model
- Traffic stays on the network path between your devices; SubnetDesk does not require a public coordination service.
- Passwords are persisted as Argon2id hashes rather than plaintext.
- Device fingerprints provide trust-on-first-use verification and help detect an unexpected endpoint identity change.
- CIDR allowlists let the controlled device limit which source networks may connect.
As with any remote-control software, expose the listening port only to trusted networks, use a strong unique password, and verify fingerprints through a separate trusted channel when possible.
🛠️ Build from source
Clone the repository with its submodules, then run the Flutter desktop build:
git clone --recurse-submodules https://github.com/zibo-chen/SubnetDesk.git
cd SubnetDesk
./build.py --flutter --hwcodecThe build requires Rust, Flutter, and platform-specific native dependencies. The native package workflow is the source of truth for pinned tool versions, target architectures, and packaging steps.
🤝 Contributing
Bug reports, feature ideas, and pull requests are welcome. Before opening a change, check the existing issues and keep changes focused on the LAN/VPN-first product scope.
💬 Community
Join the SubnetDesk Discord community, or scan the QR code below to add me on WeChat. Mention SubnetDesk, and I will invite you to the WeChat group.
🙏 Credits and license
SubnetDesk is based on RustDesk and retains its open-source foundations. SubnetDesk is an independent project and is not an official RustDesk release.
Licensed under the GNU Affero General Public License v3.0. Use remote-control software only on systems you own or are authorized to administer.


