mt is a native desktop client for Meshtastic radios designed to connect and manage devices via BLE, USB serial, or TCP. It provides feature parity with official web and mobile clients while offering a seamless experience across platforms.
Key Features:
Chat Functionality: Supports per-channel broadcasts, direct messages, and message delivery status indicators (queued, sent, acknowledged, or failed).
Node Management: Manages live and cached device rosters, including favorites, ignore lists, last-heard timestamps, SNR, RSSI, and battery levels.
Channel Controls: Configures up to 8 channels with role, name, and PSK settings (AES256, AES128, or preset keys), along with MQTT integration for remote messaging.
Admin Actions: Performs device operations like rebooting, shutting down, factory resetting, or NodeDB resets via secure confirmation dialogs.
Local Persistence: Maintains node rosters and chat history in SQLite during disconnects, ensuring data retention across sessions.
Audience & Benefit:
Ideal for users managing Meshtastic radios who require a reliable desktop interface. It offers comprehensive device management, real-time communication, and persistent data storage without reliance on web or mobile apps.
The application can be installed via winget for easy setup.
README
mt — native Meshtastic desktop client
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.
Features
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.
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).
Install
From source
git clone
cd mt
cargo build --release
Binary ends up at target/release/mt.
A minimal headless CLI for BLE connectivity testing is also built:
target/release/mt-cli.
Runtime requirements
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.bluez over D-Bus ( group or a polkit rule). USB serial
usually needs the user to be in the or group.
Windows: BLE works out of the box on Windows 10 21H2+. USB serial
needs the vendor CP210x / CH340 driver for the board.
Running
cargo run --release
On 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.
Development
cargo clippy --all-targets -- -D warnings must pass clean. The crate
enables clippy::pedantic, clippy::nursery, and denies unwrap_used,
expect_used, panic, indexing_slicing, integer_division, and
friends in production code.
cargo test runs the unit / integration test suite.
Protobuf definitions are vendored under vendor/meshtastic-protobufs
and regenerated at build time via build.rs.
See RELEASING.md for how to cut and ship a release build.
License
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.