{"id":122,"date":"2026-01-11T21:30:20","date_gmt":"2026-01-11T21:30:20","guid":{"rendered":"https:\/\/michaelwinchester.com\/mesh-plug\/?page_id=122"},"modified":"2026-01-11T21:50:14","modified_gmt":"2026-01-11T21:50:14","slug":"known-good-baseline-checklist","status":"publish","type":"page","link":"https:\/\/michaelwinchester.com\/mesh-plug\/known-good-baseline-checklist\/","title":{"rendered":"Known-Good Baseline Checklist"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Mesh-Plug + Meshtastic<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Known-Good Baseline Checklist<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">(with Hard Reset Playbook) <a href=\"https:\/\/michaelwinchester.com\/mesh-plug\/wp-content\/uploads\/2026\/01\/Mesh-Plug_Meshtastic_Branded_Playbook.pdf\">Download PDF<\/a><\/h3>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Part 1; Known-Good Baseline (start here)<\/h2>\n\n\n\n<p>Use this baseline whenever you want <strong>predictable behavior<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Hardware<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>One Meshtastic radio acting as gateway (Heltec v4, RAK, etc.)<\/li>\n\n\n\n<li>GPS optional but recommended<\/li>\n\n\n\n<li>Stable power source (USB or battery)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Controller App (IMPORTANT)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Use Android as the authoritative controller<\/strong><\/li>\n\n\n\n<li>Do <strong>not<\/strong> run macOS and Android simultaneously<\/li>\n\n\n\n<li>Fully close unused Meshtastic apps<\/li>\n<\/ul>\n\n\n\n<p>Why: Meshtastic gateways do not reliably support multi-controller MQTT sessions yet.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">MQTT Broker<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Broker reachable via WSS or TLS<\/li>\n\n\n\n<li>No auth errors<\/li>\n\n\n\n<li>Root topic is consistent (example: <code>msh<\/code>)<\/li>\n\n\n\n<li>No retained test junk from previous experiments<\/li>\n<\/ul>\n\n\n\n<p>Recommended:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>msh\/#\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Radio Configuration (via Android)<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">MQTT<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Enabled: \u2705<\/li>\n\n\n\n<li>Root topic: <code>msh<\/code><\/li>\n\n\n\n<li>JSON enabled: \u2705<\/li>\n\n\n\n<li>Downlink enabled: \u2705<\/li>\n\n\n\n<li>TLS \/ WSS configured correctly<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Channels<\/h4>\n\n\n\n<p>Create a channel with <strong>exact name<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mqtt\n<\/code><\/pre>\n\n\n\n<p>Settings:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Uplink: \u2705<\/li>\n\n\n\n<li>Downlink: \u2705<\/li>\n\n\n\n<li>Encryption: default (does not matter for JSON)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Mesh-Plug Settings<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>MQTT URL correct (example: <code>wss:\/\/mqtt.example.com:9001<\/code>)<\/li>\n\n\n\n<li>Root topic: <code>msh<\/code><\/li>\n\n\n\n<li><strong>Gateway Hex set manually<\/strong> if on macOS or if auto-detect fails<\/li>\n\n\n\n<li>Charts \/ maps enabled<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Expected \u201cHealthy\u201d Behavior<\/h3>\n\n\n\n<p>Within 30\u201360 seconds you should see:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>NodeInfo packets<\/li>\n\n\n\n<li>Nodes table populated<\/li>\n\n\n\n<li>Chat messages flowing<\/li>\n\n\n\n<li>Position updates visible on map<\/li>\n<\/ul>\n\n\n\n<p>If this happens, <strong>stop changing things<\/strong>. This is your baseline.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Part 2; Hard Reset Playbook (use when things go weird)<\/h2>\n\n\n\n<p>Use this <strong>any time you see<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Connected but no nodes<\/li>\n\n\n\n<li>Chat not responding<\/li>\n\n\n\n<li>Send Position ignored<\/li>\n\n\n\n<li>Switching Android \u2194 macOS breaks everything<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">STEP 1; Power-cycle the radio (mandatory)<\/h3>\n\n\n\n<p>This is <strong>not optional<\/strong>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Unplug USB or disconnect battery<\/li>\n\n\n\n<li>Wait <strong>10\u201315 seconds<\/strong><\/li>\n\n\n\n<li>Plug back in<\/li>\n<\/ul>\n\n\n\n<p>Why:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Clears stale MQTT session state<\/li>\n\n\n\n<li>Resets gateway role<\/li>\n\n\n\n<li>Forces fresh NodeInfo broadcast<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">STEP 2; Choose ONE controller<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pick <strong>Android OR macOS<\/strong><\/li>\n\n\n\n<li>Close the other app completely<\/li>\n\n\n\n<li>Do not background it<\/li>\n<\/ul>\n\n\n\n<p>Rule:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>One radio, one controller, one MQTT brain<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">STEP 3; Let the controller fully initialize<\/h3>\n\n\n\n<p>After reconnect:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wait at least <strong>30 seconds<\/strong><\/li>\n\n\n\n<li>Watch for:\n<ul class=\"wp-block-list\">\n<li>NodeInfo<\/li>\n\n\n\n<li>User info<\/li>\n\n\n\n<li>Position packets<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>Do <strong>not<\/strong> open Mesh-Plug yet.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">STEP 4; Verify MQTT traffic (optional but helpful)<\/h3>\n\n\n\n<p>Use MQTT Explorer or <code>mosquitto_sub<\/code>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Confirm uplinks appear under: <code>msh\/+\/json\/#<\/code><\/li>\n\n\n\n<li>Confirm NodeInfo is present<\/li>\n<\/ul>\n\n\n\n<p>If NodeInfo is missing; stop and repeat Step 1.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">STEP 5; Open Mesh-Plug<\/h3>\n\n\n\n<p>Now load the WordPress page:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Nodes should populate immediately<\/li>\n\n\n\n<li>Map should no longer be blank<\/li>\n\n\n\n<li>Chat should render<\/li>\n<\/ul>\n\n\n\n<p>If Mesh-Plug does not populate <strong>now<\/strong>, the problem is upstream.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Part 3; macOS-Specific Reality Check<\/h2>\n\n\n\n<p>macOS Meshtastic app quirks:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>NodeInfo often not broadcast<\/li>\n\n\n\n<li>Downlink unreliable<\/li>\n\n\n\n<li>Send Position frequently ignored<\/li>\n\n\n\n<li>Gateway hex often unknown<\/li>\n<\/ul>\n\n\n\n<p>Workaround:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Manually set <strong>Gateway Hex<\/strong> in Mesh-Plug<\/li>\n\n\n\n<li>Treat macOS as:\n<ul class=\"wp-block-list\">\n<li>Viewer<\/li>\n\n\n\n<li>Config editor<\/li>\n\n\n\n<li>NOT the primary gateway controller<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Part 4; Rules That Prevent 90% of Problems<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u274c Do not hot-swap Android \u2194 macOS without rebooting the radio<\/li>\n\n\n\n<li>\u274c Do not change root topics mid-session<\/li>\n\n\n\n<li>\u274c Do not rely on retained NodeInfo<\/li>\n\n\n\n<li>\u2705 Always power-cycle when changing roles<\/li>\n\n\n\n<li>\u2705 Keep one \u201cknown-good\u201d config and return to it<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Part 5; Why Mesh-Plug Feels \u201cStrict\u201d (and why that\u2019s good)<\/h2>\n\n\n\n<p>Mesh-Plug intentionally:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Refuses ghost nodes<\/li>\n\n\n\n<li>Requires NodeInfo trust<\/li>\n\n\n\n<li>Blocks ambiguous downlink<\/li>\n\n\n\n<li>Avoids MQTT replay pollution<\/li>\n<\/ul>\n\n\n\n<p>This prevents:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Node drift<\/li>\n\n\n\n<li>Jumping markers<\/li>\n\n\n\n<li>Incorrect chat attribution<\/li>\n\n\n\n<li>Security issues on shared brokers<\/li>\n<\/ul>\n\n\n\n<p>It surfaces Meshtastic edge cases instead of hiding them.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">TL;DR Quick Recovery<\/h2>\n\n\n\n<p>If anything breaks:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Power-cycle radio<\/li>\n\n\n\n<li>Use Android only<\/li>\n\n\n\n<li>Wait for NodeInfo<\/li>\n\n\n\n<li>Then open Mesh-Plug<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>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 Controller App (IMPORTANT) Why: Meshtastic gateways do not reliably support multi-controller MQTT sessions yet. MQTT Broker Recommended: Radio Configuration (via Android) MQTT Channels Create a channel with exact [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-122","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/pages\/122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/comments?post=122"}],"version-history":[{"count":2,"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/pages\/122\/revisions"}],"predecessor-version":[{"id":127,"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/pages\/122\/revisions\/127"}],"wp:attachment":[{"href":"https:\/\/michaelwinchester.com\/mesh-plug\/wp-json\/wp\/v2\/media?parent=122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}