All apps · 0 apps
MeshDash
Docker app from Uirel's Repository
Overview
Readme
View on GitHub
MeshDash
Open-source self-hosted Meshtastic Command & Control dashboard
Manage, monitor, and automate your mesh network locally
Website · Documentation · REST API · Plugins
What is MeshDash?
MeshDash is a self-hosted command and control platform for Meshtastic mesh radio networks. It runs entirely on your hardware — Raspberry Pi, Linux server, or WSL2 — and connects to your Meshtastic radios via Serial, TCP, BLE, MQTT, MeshCore, or WebSerial. No cloud dependency. No port forwarding required for remote access. Your data stays on your network unless you choose otherwise.
It provides a real-time web dashboard with instant Server-Sent Events (SSE) updates — no polling lag — and a comprehensive REST API with 100+ endpoints for integrations, automation, and scripting.
Installation
Option 1 — C2 Setup Wizard (recommended)
The fastest way to get MeshDash running. The setup wizard generates a personalised one-liner installer configured for your radio connection, network, and preferences.
- Go to https://meshdash.co.uk and use the Setup Wizard
- Enter your radio connection details and preferences
- Copy the generated install command
- Run it on your machine
# Example — your command will be customised by the wizard
curl -sL https://meshdash.co.uk/versions/R3.1.9/install.sh | bash
The wizard handles:
- Radio connection type selection (Serial, TCP, BLE, MQTT, MeshCore, WebSerial)
- Network configuration and web server port
- Automatic Python venv setup and dependency installation
- systemd service creation for auto-start on boot
- Migration from existing R2.x installations with timestamped backups
- C2-provisioned flag for seamless first login
Option 2 — Manual Installation
Clone the repository and set up MeshDash yourself. Full control, no wizard dependencies.
# Clone the repository
git clone https://github.com/ruspea/MeshDash.git
cd MeshDash
# Create a Python virtual environment
python3 -m venv mesh-dash_venv
source mesh-dash_venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# Run the initial setup
python3 meshtastic_dashboard.py
Then open http://localhost:8181/setup in your browser to complete the first-time configuration.
Requirements: Python 3.9+, a Meshtastic radio (or MQTT observer mode), Linux / Raspberry Pi / WSL2.
Docker is supported via the official
rusjpmd/meshdash-runnerimage — see Docker setup below.
Docker
Cloud Setup (with MD_SETUP_KEY)
Generate your install command at meshdash.co.uk and run it:
docker run -d \
--name meshdash \
--restart always \
--network host \
--privileged \
--log-opt max-size=10m --log-opt max-file=3 \
-v /dev:/dev \
-v meshdash_data:/app/data \
-e MD_SETUP_KEY="MD-YOUR-KEY-HERE" \
-e MD_SETUP_URL="https://meshdash.co.uk/setup" \
rusjpmd/meshdash-runner:latest
The container auto-downloads the latest MeshDash version, installs dependencies, fetches your config, and starts the dashboard. Updates happen automatically on restart.
Standalone (no account needed)
No setup key? No problem. Just run the container and configure everything through the built-in web wizard:
docker run -d \
--name meshdash \
--restart always \
--network host \
--privileged \
--log-opt max-size=10m --log-opt max-file=3 \
-v /dev:/dev \
-v meshdash_data:/app/data \
rusjpmd/meshdash-runner:latest
Then open http://localhost:8000/setup in your browser to configure your radio connection and create an admin account. The runner defaults to port 8000; C2-provisioned installs use 8181.
Required flags
| Flag | Purpose |
|---|---|
--network host |
Access host networking for local Meshtastic device discovery |
--privileged |
Required for Serial/USB access to the radio |
-v /dev:/dev |
Maps host device tree so the container can see serial hardware |
-v meshdash_data:/app/data |
Persists database, logs, and settings across container updates |
CARTO basemap API key
Map views that use CARTO raster tiles can load an API key from either the
CARTO_BASEMAP_API_KEY environment variable or a file named by
CARTO_BASEMAP_KEY_FILE. For Docker, mounting a read-only key file keeps the
key out of the Compose environment:
-v /path/to/carto_basemap_key:/run/secrets/carto_basemap_key:ro
The default key-file path is /run/secrets/carto_basemap_key.
Core Features
Live Node C2
Real-time node monitoring updated instantly via Server-Sent Events — no polling lag.
- Battery level, SNR, RSSI, GPS coordinates, and signal quality bars
- Source detection (RF / MQTT / LOCAL) with confidence scoring
- Node cards with online/offline status and last-seen timestamps
- Link quality scoring and fleet overview
Interactive Mapping
Leaflet-based GPS map with rich visualisation options.
- Node positions with live GPS tracking
- Trajectory paths and movement history
- RF neighbour link overlays showing mesh topology
- Multiple tile styles (street, satellite, topographic)
- Polar grid overlay with azimuth lines and range rings (via plugin)
- Geofencing with unlimited zones — circle, polygon, corridor, node-relative triggers (via plugin)
- ISS tracker overlay (via plugin)
Messaging
Full mesh messaging from the dashboard.
- Direct P2P messages to any node
- Channel broadcasting to all listeners
- Live ACK delivery tracking and unread counters
- 230-character message limit enforcement
- Emoji picker integration (via plugin)
MeshShark Analyser
Wireshark-style packet capture and analysis — built directly into the dashboard.
- BPF syntax filtering for targeted packet inspection
- Three-pane detail view: packet list, decoded metadata, raw JSON
- Packet type filtering (all types, or filter by protocol)
- Source evidence scoring (RF / MQTT / LOCAL attribution)
- Live capture mode with real-time packet ingestion
Network Diagnostics
Live traceroute and mesh health tools.
- Hop-by-hop bidirectional SNR measurement
- Traceroute results plotted on the map
- Historical traceroute log
- Path statistics and analysis
Analytics
Comprehensive telemetry charting across your entire mesh.
- 9 telemetry metrics: Battery %, SNR dB, Channel Utilisation %, Voltage, Position, Routing, Neighbour count, Power, Temperature
- Time ranges from 1 hour to 30 days
- Network-wide averages
- Side-by-side comparison for up to 4 nodes with linked Y-axes
Automation & Rules
Event-driven automation engine — no scripting required.
- Task Scheduler: Cron-based message broadcasts with 3-retry logic and web sensor ingress
- Auto-Reply Engine: Regex-powered matching with 20+ dynamic placeholders, per-sender cooldowns, and hierarchical menu trees
- Telemetry Threshold Alerts: Battery, voltage, SNR, temperature, and uptime triggers with configurable thresholds
- Web Telemetry Ingress: Extract data from websites and broadcast over mesh
Radio Management
Direct radio configuration from the dashboard — no CLI needed.
- Full protobuf config read/write to radio flash memory
- Up to 16 simultaneous radio slots with isolated databases
- Each slot has its own SQLite database, SSE stream, and connection config
- Mix Serial, TCP, BLE, MQTT, and MeshCore on one dashboard
- Radio slot switching from the topbar
- Automatic reboot after config write
Extensibility — Plugin System
Drop-in plugin architecture. Add features without touching core code.
- FastAPI router integration for custom API endpoints
- Static file server for plugin UI assets
- Sidebar navigation hooks
- Plugin lifecycle management (install, enable, disable, remove)
- 30+ community plugins available in the built-in store
Connectivity
MeshDash supports every way to talk to a Meshtastic radio:
| Method | Description |
|---|---|
| Serial | USB serial connection to a local radio |
| TCP | Network connection over TCP (direct to node) |
| BLE | Bluetooth Low Energy connection |
| MQTT | Connect to mqtt.meshtastic.org as an observer — no physical radio required. Filter by region and channel |
| MeshCore | Alternative protocol via the meshcore Python library over Serial, TCP, or BLE |
| WebSerial | Browser-based USB serial — configure and disconnect from the dashboard settings page |
Remote Access
Access your MeshDash dashboard from any network — no port forwarding, dynamic DNS, or VPN required. Your server polls meshdash.co.uk for queued commands using HMAC-signed outbound-only connections.
Five configurable access tiers (default: off):
| Tier | Name | Permissions |
|---|---|---|
| 0 | Off | No remote access |
| 1 | Heartbeat Only | Server appears on the community map at meshdash.co.uk. No inbound commands |
| 2 | Read-Only Telemetry | Node list, packet stats, telemetry query. No write access |
| 3 | Messaging | All Tier 2 + send messages to any node or channel |
| 4 | Operator | Full dashboard access — all API endpoints, task management, auto-reply, config read-write |
| 5 | Full C2 | All Tier 4 + system restart, config file write, slot management, plugin control |
Security
MeshDash implements a layered security model:
- JWT tokens stored in HttpOnly, SameSite cookies — not accessible to JavaScript
- Bcrypt password hashing with automatic salt generation
- CSRF double-submit cookie protection on all state-changing requests
- TOTP two-factor authentication (optional, via pyotp)
- HMAC-signed remote access with rate limiting
- API key authentication for programmatic access with per-key node-ID locking
- Automatic IP blocking after repeated authentication failures
- Rate limiting with configurable windows and block durations
- Request body size limits (2MB default)
- Prepared statement caching to prevent SQL injection
Data never leaves the local network unless you explicitly enable remote access or community features.
REST API
100+ endpoints across 8 API groups:
| API Group | Coverage |
|---|---|
| Core | Nodes, messages, heartbeats, mesh data, node activity |
| Authentication | API key CRUD, auth logs, session management |
| Monitor | Node monitoring, telemetry thresholds, alerts |
| Tasks | Cron scheduler, outbox management, retry logic |
| Auto-Reply | Regex rules, cooldowns, menu trees |
| Plugins | Install, enable, disable, configure, store browse |
| System | Server stats, config, diagnostics, queue management |
| WebSerial | Browser serial connection management |
Full documentation: meshdash.co.uk/docs/?page=api-core
# Example — get all nodes
curl -H "X-Api-Key: YOUR_API_KEY" \
https://your-meshdash-host/api/nodes
# Example — broadcast a message
curl -X POST -H "X-Api-Key: YOUR_API_KEY" \
-d '{"message": "Hello mesh"}' \
https://your-meshdash-host/api/broadcast
Plugin Ecosystem
Core Plugins (included)
| Plugin | Description |
|---|---|
| Apprise Notifications | Send mesh events to 130+ services — Discord, Telegram, Slack, Email, and more |
| Auto-Reply | Hierarchical auto-reply with slot/channel/DM filtering, smart reply routing, per-rule cooldowns |
| Auto-Responder | Automatic DM replies with anti-spam cooldown |
| Channel Vault | Server-side PSK vault for unlimited channel configurations beyond the radio's 8 slots |
| Cold Nodes | Detects and badges stale nodes not heard within a configurable period |
| Emoji Picker | Adds emoji picker to all message input fields |
| Geo Fence | Advanced geofencing — unlimited zones (circle, polygon, corridor, node-relative) with triggers |
| Google Translate | Site-wide Google Translate widget integration |
| Hello Mesh | Interactive API explorer & plugin development tutorial |
| ISS Tracker | Real-time International Space Station position on the map with crew details |
| Medi AI | Medical advice via local offline models or external hosted LLMs |
| Mesh Analytics | Comprehensive mesh analytics — node scoring, RF analysis, topology mapping |
| Mesh BB | Fully-featured mesh-native bulletin board system |
| Mesh Chat AI | AI chatbot with dynamically selectable personality modes |
| Mesh Ping | Active round-trip ping sessions with RTT measurement, launch from UI or trigger via DM |
| Mesh Traceroute | Dedicated traceroute plugin (placeholder for expanded implementation) |
| Mesh Visualizer | 3D mesh network visualiser — interactive rendering of nodes and links |
| Network Intelligence | Per-node Link Quality Scores, Smart Hops, and network Entropy computation |
| Node Admin | Complete remote node management — identity, role, LoRa radio, position, channels |
| Node Analytics | Per-node telemetry analysis with charts for power, RF, network metrics |
| Node Comparison | Side-by-side node comparison (placeholder) |
| Node Ignore | Persistent per-node ignore list — ignored nodes hidden from all dashboard views |
| Node Monitor | Telemetry threshold alerting — battery, voltage, SNR, temperature, uptime |
| PKI Alerts | Trust On First Use (TOFU) security with RF anomaly profiling and spoofing detection |
| Polar Grid | Azimuth lines and range rings centred on your node, interactive distance measurement |
| Proximity Pruner | Automatically purge nodes beyond a configurable radius from the database |
| Push Notifications | Real-time Web Push alerts via SSE bridge — DMs, channels, keyword triggers |
| Share Map | Create public embeddable widgets — live maps, node stat cards, network stats |
| TCP Proxy | Virtual Meshtastic TCP server — connect official mobile apps, Python CLI, or other clients |
| Theme Editor | Live CSS variable theming — pick accent colours, backgrounds, and styles |
| Weather | Fetch current weather from Open-Meteo and broadcast to the mesh |
| Web Telemetry | Extract data from websites and broadcast over mesh — one-time or scheduled |
| Welcome New Nodes | Automatically DM newly discovered nodes with a configurable welcome message |
Build Your Own
Plugins are self-contained Python packages dropped into the plugins_core/ directory. Each plugin gets:
- A FastAPI router for custom API endpoints
- A static file server for UI assets
- Sidebar navigation entries
- Lifecycle management (install, enable, disable, remove)
C2 Admin Dashboard
MeshDash includes a full admin dashboard for managing your C2 infrastructure:
- Node registry — active nodes, path analysis, activity logs
- API key management — create, rotate, toggle, and delete API keys from the UI
- Command queue — add, cancel, and monitor pending commands and outbox
- Auth logging — all authentication attempts with IP blocking and rate limit stats
- Security overview — real-time security posture dashboard
- Heartbeat monitoring — trend analysis and reset controls
- Data dumps — request and result management with volume analytics
- Server stats — live system metrics
Technology Stack
| Layer | Technologies |
|---|---|
| Backend | Python, FastAPI, SQLite, asyncio, meshtastic Python library |
| Frontend | HTML/JS, Server-Sent Events (SSE), Web Serial API, Leaflet |
| Security | JWT, bcrypt, HttpOnly cookies, CSRF double-submit, TOTP 2FA, HMAC |
| Connectivity | Serial, TCP, BLE, MQTT, MeshCore, WebSerial |
| Multi-Radio | Up to 16 simultaneous radio slots with isolated databases |
| Database | SQLite (per-slot isolation), prepared statement caching |
Documentation
| Topic | Link |
|---|---|
| Installation Guide | meshdash.co.uk/?p=install |
| Security & Authentication | meshdash.co.uk/?p=security |
| Multi-Radio Slots | meshdash.co.uk/?p=multiradio |
| Remote Access | meshdash.co.uk/?p=remote |
| Hardware Guide | meshdash.co.uk/?p=hardware |
| REST API Reference | meshdash.co.uk/docs/?page=api-core |
| Plugin Development | meshdash.co.uk/docs/?page=plugin-development |
| Database Schema | meshdash.co.uk/docs/?page=database-schema |
| C2 Terminal | meshdash.co.uk/docs/?page=c2-terminal |
| Connection Manager | meshdash.co.uk/docs/?page=connection-manager |
| Troubleshooting | meshdash.co.uk/docs/?page=troubleshooting |
| Changelog | meshdash.co.uk/?p=changelog |
Requirements
- Python 3.9+
- OS — Linux (Debian/Ubuntu), Raspberry Pi OS, or WSL2
- Radio — Any Meshtastic-compatible radio, or MQTT observer mode (no physical radio needed)
- Network — Local network access to the radio
License
MeshDash is licensed under GPL-3.0-only. It is free to use, modify, and distribute under the terms of the GNU General Public License v3.
Built for operators who run their own infrastructure.
Install MeshDash on Unraid in a few clicks.
Find MeshDash in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.
Categories
Download Statistics
Related apps
Explore more like this
Explore allDetails
rusjpmd/meshdash-runner:latestRuntime arguments
- Web UI
http://[IP]:[PORT:8000]/- Network
bridge- Shell
bash- Privileged
- false
Template configuration
Database (SQLite), logs, plugin data, and the settings file written by the /setup wizard -- persists across the runner's automatic MeshDash version updates. Mounted as a folder, not a file mapping. The image always runs as root with no PUID/PGID support (verified in docker/runner/Dockerfile), so no ownership fix-up is needed or possible.
- Target
- /app/data
- Default
- /mnt/user/appdata/meshdash
- Value
- /mnt/user/appdata/meshdash
MeshDash's web dashboard and /setup wizard. Verified against the runner's entrypoint.sh (28 Sep 2026): defaults to port 8000 unless WEBSERVER_PORT is set. Note: rusjpmd/meshdash-runner's own Docker Hub description claims R3.1+ moved the default to 8181, which contradicts the entrypoint script actually shipped in the current :latest image -- if the WebUI doesn't respond after first boot, check docker logs for the 'Starting MeshDash on port' line and adjust this mapping (and WEBSERVER_PORT below) to match.
- Target
- 8000
- Default
- 8000
- Value
- 8000
Overrides the port MeshDash listens on inside the container -- see the WebUI port note above about the 8000 vs 8181 discrepancy. Change this and the WebUI port mapping together.
- Default
- 8000
- Value
- 8000
Only needed to opt into meshdash.co.uk's cloud C2 setup/remote-management service. Leave blank (default) to run fully standalone with no account -- everything is configured locally via the /setup wizard instead. Setting this alone does nothing: the runner also requires an MD_SETUP_URL variable (deliberately not included in this template) before it will contact meshdash.co.uk for C2 provisioning -- add both yourself via 'Add another Path, Port, Variable...' if you want that feature.