Live MQTT dashboard for node presence, retained traffic analysis, roles, and broker telemetry.
- Release notes: CHANGES.MD
- Current version:
v1.3.2 - Preview: https://mcmqttdashboard.bostonme.sh/
- Docker image:
yellowcooln/meshcore-mqtt-dashboard
git clone https://github.com/yellowcooln/meshcore-mqtt-dashboard
cd meshcore-mqtt-dashboard
cp .env.example .env
docker compose up -d --buildOpen http://localhost:8081 (or set WEB_PORT).
Published image examples:
docker pull yellowcooln/meshcore-mqtt-dashboard:latestRun the published image directly:
docker run -d \
--name mqtt-dashboard \
--env-file .env \
-p 8081:8081 \
-v "$(pwd)/data:/data" \
yellowcooln/meshcore-mqtt-dashboard:latestUse the published image in Compose:
services:
mqtt-dashboard:
image: yellowcooln/meshcore-mqtt-dashboard:latest
container_name: mqtt-dashboard
env_file:
- .env
ports:
- "8081:8081"
volumes:
- ./data:/data
restart: unless-stoppedgit clone https://github.com/yellowcooln/meshcore-mqtt-dashboard
cd meshcore-mqtt-dashboard/backend
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app:app --reload --host 0.0.0.0 --port 8081pip install -r requirements-dev.txt
pytest -qCI runs the same suite in GitHub Actions on pull requests and pushes to main/dev.
Docker images are published from main to Docker Hub as yellowcooln/meshcore-mqtt-dashboard.
- Public:
/(dashboard page)/traffic(retention-backed traffic page)/batteryinfo(optional decoded battery telemetry page)/ws(live dashboard websocket)
- Protected when
DASH_API_TOKENis set:/snapshot/stats/packets
- Token can be sent by:
- header
X-Dashboard-Token(orDASH_API_TOKEN_HEADER) Authorization: Bearer <token>- query
?token=<token>
- header
Copy .env.example and set what you need.
docker-compose.yaml loads the container environment from .env.
WEB_PORTDASH_TITLEDASH_BROKER_HOST(optional broker endpoint shown in the UI; for examplebroker.example.netorbroker.example.net:443)DASH_LOGO_URL(favicon only;.png,.jpg,.jpeg)DASH_EXTERNAL_URL(optional header button URL;http/https)DASH_EXTERNAL_LABELDASH_API_TOKENDASH_API_TOKEN_HEADER
MQTT_HOST,MQTT_PORTMQTT_USERNAME,MQTT_PASSWORDMQTT_TRANSPORT(tcporwebsockets)MQTT_WS_PATHMQTT_TLS,MQTT_TLS_INSECURE,MQTT_CA_CERTMQTT_CLIENT_IDMQTT_AUTH_TOKEN,MQTT_AUTH_TOKEN_HEADER,MQTT_AUTH_TOKEN_SCHEME
MQTT_TOPIC(comma-separated topics supported)MQTT_SYS_TOPICSYS_TOPICS_ENABLEDMQTT_ONLINE_SECONDSNODE_PURGE_SECONDSSYS_TOPICS_LIMITSTATS_WINDOW_SECONDS
PACKET_DB_PATH(default/data/packets.db)PACKET_RETENTION_SECONDS(max 24 hours)ROLE_OVERRIDES_FILE
BATTERYINFO_ENABLED(defaultfalse)BATTERYINFO_CHANNEL_NAMEBATTERYINFO_SHOW_CHANNEL_NAMEBATTERYINFO_RETENTION_SECONDS(default172800, 48 hours)BATTERYINFO_CHANNEL_KEY
- The backend prints the running app version to the console on startup.
$SYSpanel is hidden whenSYS_TOPICS_ENABLED=false.- Sensitive IP/MAC values are redacted before UI/API exposure.
client_versiondotted versions (for example1.0.8.0-e52c5ed) are preserved.- The traffic page uses retained packet history from SQLite across the full
PACKET_RETENTION_SECONDSwindow. - Traffic history is rebuilt from
packetsintotraffic_eventswhen needed and persists across restarts. /trafficincludes retained packet rates, route/payload charts, top talkers, and burst bins./batteryinfois optional, disabled by default, and only appears whenBATTERYINFO_ENABLED=true.- Battery telemetry is persisted in
batteryinfo_eventsand uses its own retention window viaBATTERYINFO_RETENTION_SECONDS. - Battery decode uses the official
@michaelhart/meshcore-decoderpackage with the configured channel key. - Role inference uses explicit payload roles first, then payload hints from
/statusand/internal, then name hints. - Retained
*/internalMQTT messages are ignored for node presence so startup replay does not create ghost online nodes. - Node presence is in-memory and repopulates from fresh traffic after restart.
- Share/embed metadata uses:
- title from
DASH_TITLE - description
Live node presence, roles, and broker telemetry.
- title from
MQTT_HOSTandMQTT_PORTcontrol the actual connection target;DASH_BROKER_HOSTonly changes what the dashboard displays.- If
DASH_BROKER_HOSTis set, the dashboard shows it exactly as provided. - Favicon is rendered only when
DASH_LOGO_URLis valid and supported.
