A cross-platform desktop client for Meshtastic radios,
written in Rust with egui. Connects over BLE (primary), USB serial, or
TCP to a Meshtastic device and provides feature parity with the official
web / mobile clients for day-to-day operation.
- Transports: BLE (macOS / Linux / Windows via
btleplug), USB serial, TCP. - Chat: per-channel broadcast, direct messages, ack / nack with visual
delivery state (
○ queued · ◐ sent · ✓ acked · ✗ failed). - Nodes: live + cached roster, last-heard, SNR / RSSI / battery, favorites, ignore-list, traceroute with per-hop SNR.
- Channels: 8 slots, role / name / PSK controls (AES256, AES128, 1-byte
default preset, clear), MQTT uplink / downlink, position precision,
share URL import / export (compatible with the
meshtastic.org/e/#scheme used by web and mobile clients). - Settings: Owner / LoRa / Device / Position / Power / Network / Display / Bluetooth / MQTT / Telemetry / Neighbor Info / Store-and-Forward module configs, with tooltips on every field.
- Admin actions: reboot / shutdown / reboot-to-OTA / factory reset (device / config only) / NodeDB reset, gated by destructive-action confirmation modals.
- Local persistence: node roster and chat history survive disconnects (SQLite under the platform data dir). Messages scoped per-device.
- Status bar: connection state, link health, battery, channel utilization, airtime, relay count.
- Resilience: receive-side watchdog + metadata probe reconnect cleanly after the OS suspends the radio (e.g. laptop lid close / wake).
git clone <this repo>
cd mt
cargo build --releaseBinary ends up at target/release/mt.
A minimal headless CLI for BLE connectivity testing is also built:
target/release/mt-cli.
- macOS: first launch over BLE prompts for Bluetooth permission under System Settings → Privacy & Security → Bluetooth. Grant it, restart the app.
- Linux: requires BlueZ ≥ 5.56. The user must be able to access
org.bluezover D-Bus (bluetoothgroup or a polkit rule). USB serial usually needs the user to be in thedialoutoruucpgroup. - Windows: BLE works out of the box on Windows 10 21H2+. USB serial needs the vendor CP210x / CH340 driver for the board.
cargo run --releaseOn first launch you'll see the connection screen. Scan for BLE devices,
enter a TCP host:port, or select a serial port, then hit Connect.
The app remembers profiles in
~/Library/Application Support/mt/profiles.toml (macOS) /
~/.config/mt/profiles.toml (Linux) /
%APPDATA%\mt\profiles.toml (Windows).
Message history and the node roster are persisted in mt.sqlite alongside
the profiles file.
cargo clippy --all-targets -- -D warningsmust pass clean. The crate enablesclippy::pedantic,clippy::nursery, and deniesunwrap_used,expect_used,panic,indexing_slicing,integer_division, and friends in production code.cargo testruns the unit / integration test suite.- Protobuf definitions are vendored under
vendor/meshtastic-protobufsand regenerated at build time viabuild.rs.
See RELEASING.md for how to cut and ship a release build.
Dual-licensed under Apache 2.0 or MIT, at your option. The bundled DejaVu
Sans font is redistributed under its own permissive license — see
assets/DejaVuSans-LICENSE.txt.