MeshRadar
Modern web interface for Meshtastic mesh network nodes. Supports Serial/TCP connection, real-time messaging, channels, DM, traceroute, telemetry.
Install / Use
/learn @curlysasha/MeshRadarREADME
📡 MeshRadar
Modern web interface for Meshtastic mesh network management

📥 Download Latest Release for Windows
Features • Quick Start • API • Technologies
</div>📸 Interface

Traceroute Visualization

✨ Features
| Feature | Description | | ------------------- | -------------------------------------------------------------- | | 🔌 Connection | Serial (USB), TCP (WiFi), and BLE (Bluetooth) to Meshtastic nodes | | 💬 Chat | Channels and direct messages with delivery confirmation (✓ ✓✓) | | 📊 Node List | All mesh nodes with telemetry (battery, SNR, position) | | 🗺️ Network Map | Interactive map visualization of all nodes | | 🛤️ Traceroute | Message route visualization between nodes | | 💾 History | Messages stored in SQLite database | | ⚡ Real-time | WebSocket for instant updates | | 🌍 Multilingual | Russian and English with switcher |
🚀 Quick Start
Requirements
- Python 3.10+
- Node.js 18+
- Meshtastic node (optional for UI testing)
Backend
cd backend
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
python main.py
Backend will start at http://localhost:8000
Frontend
cd frontend
npm install
npm run dev
Frontend will start at http://localhost:5173
📦 Portable Version
To build a standalone .exe file:
# Run in project root
build.bat
Output file: dist/MeshRadar.exe
🐳 Docker Deployment
For complete Docker setup and configuration guide, see DOCKER.md
Quick start:
docker-compose up -d
Then open http://localhost:5173 and connect to your Meshtastic device through the UI.
Note: USB connection is optional. By default, Docker runs without USB device mapping. To enable USB, uncomment the
devicessection indocker-compose.yml.
🔌 API
REST Endpoints
| Method | Endpoint | Description |
| ------ | ---------------------- | ------------------ |
| POST | /api/connect | Connect to node |
| POST | /api/disconnect | Disconnect |
| GET | /api/status | Connection status |
| GET | /api/ble-scan | Scan BLE devices |
| GET | /api/nodes | List of nodes |
| GET | /api/node/{id} | Node information |
| GET | /api/channels | List of channels |
| POST | /api/message | Send message |
| POST | /api/traceroute/{id} | Traceroute to node |
| GET | /api/messages | Message history |
WebSocket Events
// Connection
ws://localhost:8000/ws
// Events (server → client)
{ type: "connection_status", data: { connected: boolean, ... } }
{ type: "message", data: { sender, text, channel, ... } }
{ type: "ack", data: { packet_id, status: "ack"|"nak" } }
{ type: "node_update", data: { id, user, position, ... } }
{ type: "traceroute", data: { route: [...], snr_towards: [...] } }
<details>
<summary><b>📝 API Usage Examples</b></summary>
TCP Connection:
curl -X POST http://localhost:8000/api/connect \
-H "Content-Type: application/json" \
-d '{"type": "tcp", "address": "192.168.1.100:4403"}'
Serial Connection:
curl -X POST http://localhost:8000/api/connect \
-H "Content-Type: application/json" \
-d '{"type": "serial", "address": "/dev/ttyUSB0"}'
BLE Connection (scan first):
# Scan for available BLE devices
curl http://localhost:8000/api/ble-scan
# Connect to BLE device
curl -X POST http://localhost:8000/api/connect \
-H "Content-Type: application/json" \
-d '{"type": "ble", "address": "F4:12:FA:D0:45:AB"}'
Note: BLE scanning may not work with all firmware versions. Known working versions: up to v2.7.14. If you experience issues with BLE scanning on firmware v2.7.15 or newer, consider downgrading to v2.7.14.
Send Message:
curl -X POST http://localhost:8000/api/message \
-H "Content-Type: application/json" \
-d '{"text": "Hello mesh!", "channel_index": 0}'
</details>
🛠 Technologies
<table> <tr> <td width="50%">Backend
- FastAPI — async web framework
- meshtastic — Python library
- aiosqlite — async SQLite
- websockets — real-time
Frontend
- React 18 + TypeScript
- Tailwind CSS — styling
- Zustand — state management
- Radix UI — accessible components
📁 Project Structure
meshradar/
├── backend/
│ ├── main.py # FastAPI application
│ ├── meshtastic_manager.py # Connection management
│ ├── websocket_manager.py # WebSocket broadcast
│ ├── database.py # SQLite operations
│ └── schemas.py # Pydantic models
│
├── frontend/
│ ├── src/
│ │ ├── components/ # React components
│ │ ├── hooks/ # React hooks
│ │ ├── store/ # Zustand state
│ │ └── locales/ # i18n translations
│ └── package.json
│
└── assets/ # README images
👨💻 Development
# Backend with hot-reload
cd backend && uvicorn main:app --reload
# Frontend with hot-reload
cd frontend && npm run dev
# Production build
cd frontend && npm run build
<div align="center">
📄 License
GPLv3 + Commons Clause © 2024
This project is licensed under GPLv3 with Commons Clause - see the LICENSE file for details.
Note: The Commons Clause means you can use, modify, and distribute this software freely, but you cannot sell it or offer it as a paid service.
💝 Support the Project
If you find MeshRadar useful, please consider supporting its development:
Crypto donations:
- USDT TRC20:
TL2rEf6iNzhC9Mb2grm6S5iq5JrMxYDEZG - USDT TON:
UQDyYPHzm6tb4KbpLIMo-KEWC2PmPHnU2Zj4tndLg9O70-w8
Made with ❤️ for Meshtastic community
</div>