Mesh-Plug + Meshtastic
Known-Good Baseline Checklist
(with Hard Reset Playbook) Download PDF
Part 1; Known-Good Baseline (start here)
Use this baseline whenever you want predictable behavior.
Hardware
- One Meshtastic radio acting as gateway (Heltec v4, RAK, etc.)
- GPS optional but recommended
- Stable power source (USB or battery)
Controller App (IMPORTANT)
- Use Android as the authoritative controller
- Do not run macOS and Android simultaneously
- Fully close unused Meshtastic apps
Why: Meshtastic gateways do not reliably support multi-controller MQTT sessions yet.
MQTT Broker
- Broker reachable via WSS or TLS
- No auth errors
- Root topic is consistent (example:
msh) - No retained test junk from previous experiments
Recommended:
msh/#
Radio Configuration (via Android)
MQTT
- Enabled: ✅
- Root topic:
msh - JSON enabled: ✅
- Downlink enabled: ✅
- TLS / WSS configured correctly
Channels
Create a channel with exact name:
mqtt
Settings:
- Uplink: ✅
- Downlink: ✅
- Encryption: default (does not matter for JSON)
Mesh-Plug Settings
- MQTT URL correct (example:
wss://mqtt.example.com:9001) - Root topic:
msh - Gateway Hex set manually if on macOS or if auto-detect fails
- Charts / maps enabled
Expected “Healthy” Behavior
Within 30–60 seconds you should see:
- NodeInfo packets
- Nodes table populated
- Chat messages flowing
- Position updates visible on map
If this happens, stop changing things. This is your baseline.
Part 2; Hard Reset Playbook (use when things go weird)
Use this any time you see:
- Connected but no nodes
- Chat not responding
- Send Position ignored
- Switching Android ↔ macOS breaks everything
STEP 1; Power-cycle the radio (mandatory)
This is not optional.
- Unplug USB or disconnect battery
- Wait 10–15 seconds
- Plug back in
Why:
- Clears stale MQTT session state
- Resets gateway role
- Forces fresh NodeInfo broadcast
STEP 2; Choose ONE controller
- Pick Android OR macOS
- Close the other app completely
- Do not background it
Rule:
One radio, one controller, one MQTT brain
STEP 3; Let the controller fully initialize
After reconnect:
- Wait at least 30 seconds
- Watch for:
- NodeInfo
- User info
- Position packets
Do not open Mesh-Plug yet.
STEP 4; Verify MQTT traffic (optional but helpful)
Use MQTT Explorer or mosquitto_sub:
- Confirm uplinks appear under:
msh/+/json/# - Confirm NodeInfo is present
If NodeInfo is missing; stop and repeat Step 1.
STEP 5; Open Mesh-Plug
Now load the WordPress page:
- Nodes should populate immediately
- Map should no longer be blank
- Chat should render
If Mesh-Plug does not populate now, the problem is upstream.
Part 3; macOS-Specific Reality Check
macOS Meshtastic app quirks:
- NodeInfo often not broadcast
- Downlink unreliable
- Send Position frequently ignored
- Gateway hex often unknown
Workaround:
- Manually set Gateway Hex in Mesh-Plug
- Treat macOS as:
- Viewer
- Config editor
- NOT the primary gateway controller
Part 4; Rules That Prevent 90% of Problems
- ❌ Do not hot-swap Android ↔ macOS without rebooting the radio
- ❌ Do not change root topics mid-session
- ❌ Do not rely on retained NodeInfo
- ✅ Always power-cycle when changing roles
- ✅ Keep one “known-good” config and return to it
Part 5; Why Mesh-Plug Feels “Strict” (and why that’s good)
Mesh-Plug intentionally:
- Refuses ghost nodes
- Requires NodeInfo trust
- Blocks ambiguous downlink
- Avoids MQTT replay pollution
This prevents:
- Node drift
- Jumping markers
- Incorrect chat attribution
- Security issues on shared brokers
It surfaces Meshtastic edge cases instead of hiding them.
TL;DR Quick Recovery
If anything breaks:
- Power-cycle radio
- Use Android only
- Wait for NodeInfo
- Then open Mesh-Plug
