A cross-platform Meshtastic desktop client for Mac, Linux, and Windows.
Connect to your Meshtastic devices over Bluetooth, USB Serial, or WiFi — no python, no phone required.
Originally ported from Joey's (NV0N) Meshtastic Mac Client and the Denver Mesh community. This is a full rewrite in Electron + React + TypeScript to support all platforms.
Warning
This is an early release. A lot of things might be buggy. This may or may not be updated over the coming days/weeks. So far it has only been tested on a Mac with a T-Deck in Bluetooth Pairing Mode.
- Node.js 20+ (LTS recommended — download here)
- npm 9+ (included with Node.js)
- Build tools for compiling the native SQLite module:
- Mac: Xcode Command Line Tools — run
xcode-select --install - Linux:
sudo apt install build-essential python3(Debian/Ubuntu) - Windows: Visual Studio Build Tools with the "Desktop development with C++" workload
- Mac: Xcode Command Line Tools — run
- A Meshtastic device (any hardware running Meshtastic firmware)
git clone https://github.com/Denver-Mesh/meshtastic-client
cd meshtastic-client
npm install
npm startNote:
npm installautomatically compiles the native SQLite module for Electron viaelectron-rebuild. If it fails, make sure Xcode Command Line Tools are installed.
On first Bluetooth connection, macOS will show a system popup requesting Bluetooth permission — you must accept. If you accidentally denied it, go to System Settings > Privacy & Security > Bluetooth and toggle Electastic on.
git clone https://github.com/Denver-Mesh/meshtastic-client
cd meshtastic-client
npm install
npm startBLE requires BlueZ installed. If Bluetooth doesn't work, try launching with --enable-features=WebBluetooth. For serial access, add yourself to the dialout group:
sudo usermod -a -G dialout $USER
# Then log out and back ingit clone https://github.com/Denver-Mesh/meshtastic-client
cd meshtastic-client
npm install
npm startShould work out of the box. If serial isn't detected, make sure you have the correct USB drivers for your device (e.g., CP210x or CH340 drivers).
- Power on your Meshtastic device
- Put it in Bluetooth pairing mode (if connecting via BLE)
- Open Electastic and go to the Connection tab
- Select your connection type (Bluetooth / USB Serial / WiFi)
- Click Connect and select your device from the picker
- Wait for status to show Configured — you're connected!
# Build for your platform
npm run dist:mac # macOS → .dmg + .zip in release/
npm run dist:linux # Linux → .AppImage + .deb in release/
npm run dist:win # Windows → .exe installer in release/The distributable is output to the release/ directory.
- Bluetooth LE — pair wirelessly with nearby Meshtastic devices
- USB Serial — plug in via USB cable
- WiFi/HTTP — connect to network-enabled nodes
- Chat — send/receive messages across channels with delivery indicators (ACK/NAK) and emoji reactions (tapback)
- Channel Management — create and configure channels with custom names and PSK encryption
- Node List — all discovered nodes with SNR, battery, GPS, last heard
- Node Detail Modal — click any node or sender name for full info
- Map — interactive OpenStreetMap with node positions
- Telemetry — battery voltage and signal quality charts
- Radio Config — region, modem preset, device role, GPS, power, Bluetooth, display settings
- Admin — reboot, shutdown, factory reset, trace route, node removal, DB export/import/clear
- Persistent Storage — messages and nodes saved locally via SQLite
- Dark UI — custom scrollbar, tab icons, polished chat bubbles
| Platform | Bluetooth | Serial | HTTP |
|---|---|---|---|
| macOS | Yes | Yes | Yes |
| Windows | Yes | Yes | Yes |
| Linux | Partial | Yes | Yes |
| Component | Technology |
|---|---|
| Desktop | Electron |
| UI | React 19 + TypeScript |
| Styling | Tailwind CSS v4 |
| Meshtastic | @meshtastic/core (JSR) |
| Maps | Leaflet + OpenStreetMap |
| Charts | Recharts |
| Database | SQLite (better-sqlite3) |
| Build | esbuild + Vite + electron-builder |
src/
├── main/ # Electron main process (window, BLE handler, SQLite)
├── preload/ # Context bridge (IPC)
└── renderer/ # React app
├── components/ # All UI panels (Chat, Nodes, Map, Config, etc.)
├── hooks/ # useDevice — Meshtastic device state management
└── lib/ # Transport setup, TypeScript types
You're missing build tools for compiling the native SQLite module:
- Mac:
xcode-select --install - Linux:
sudo apt install build-essential python3 - Windows: Install Visual Studio Build Tools with the "Desktop development with C++" workload
- Make sure your device has Bluetooth enabled and is in pairing mode
- On macOS: Check System Settings > Privacy & Security > Bluetooth
- Try disconnecting fully first, then reconnecting
- If the device picker never appears, restart the app
- Ensure your USB drivers are installed for your device (CP210x, CH340, etc.)
- On Linux, add yourself to the
dialoutgroup:sudo usermod -a -G dialout $USER
- This may be a native module signing issue — try rebuilding:
npm run dist:mac - If building from source: make sure
npm installcompleted without errors
- The Bluetooth connection can drop silently. Click Disconnect, then Connect again
- For serial: the USB cable may have been bumped — reconnect
MIT — see LICENSE
See CREDITS.md. Special thanks to Joey (NV0N) for the original Meshtastic Mac Client that inspired this project, and the Denver Mesh community.