<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
  <title>MeshCore Ninja — Releases</title>
  <link>https://meshcore.ninja/releases/</link>
  <description>Newest MeshCore firmware and software releases across all projects.</description>
  <language>en</language>
  <lastBuildDate>Tue, 21 Jul 2026 08:04:50 GMT</lastBuildDate>
  <atom:link xmlns:atom="http://www.w3.org/2005/Atom" href="https://meshcore.ninja/releases.xml" rel="self" type="application/rss+xml" />
  <item>
    <title>MeshPunk 0.2.8</title>
    <link>https://meshcore.ninja/firmware/meshpunk/releases/#release-0.2.8</link>
    <guid isPermaLink="false">firmware-MeshPunk-0.2.8</guid>
    <pubDate>Tue, 21 Jul 2026 01:58:13 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>added usb drive emulation so you can access your sd card by plugging the tdeck into a pc with a usb cable.
also renamed USB app to USB Host.</p>
]]></description>
  </item>
  <item>
    <title>mesh-client 5.24.1</title>
    <link>https://meshcore.ninja/software/mesh-client/releases/#release-5.24.1</link>
    <guid isPermaLink="false">software-mesh-client-5.24.1</guid>
    <pubDate>Tue, 21 Jul 2026 00:06:52 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h2>[v5.24.1] - 2026-07-20</h2>
<h3>Highlights</h3>
<ul>
<li>MeshCore repeater admin: paginated Neighbors with Load more, clearer disconnect toasts, and safer CLI quick commands.</li>
<li>Reticulum RNode: Wi‑Fi TCP keepalive so idle links stop dropping around ~6s, plus clearer macOS BLE pairing (in-panel PIN, 60s passkey window, less reconnect thrash).</li>
</ul>
<h3>What's Changed</h3>
<h3>Features</h3>
<ul>
<li><strong>MeshCore repeater admin</strong> — Paginated Neighbors with Load more (Repeaters panel + node detail), disconnect toasts for Status/Telemetry/Neighbors, and safer CLI quick pills (<code>clock</code>, <code>clock sync</code>, <code>clear stats</code>, <code>advert</code>, <code>board</code>) (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/697" target="_blank" rel="noopener noreferrer">#697</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>Reticulum RNode TCP keepalive</strong> — Overlay rsReticulum activity keepalive so Wi‑Fi RNodes do not idle-FIN around ~6s (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/698" target="_blank" rel="noopener noreferrer">#698</a>)</li>
<li><strong>macOS BLE RNode pairing UX</strong> — Surface Admin Start pairing PIN in-panel (never Meshtastic <code>123456</code>), extend connect grace/hints to ~60s for the OS passkey window, latch <code>blePairingTimedOut</code> into Connection + Diagnostics, and debounce pairing-transition reconnect thrash (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/698" target="_blank" rel="noopener noreferrer">#698</a>)</li>
<li><strong>Meshtastic node delete</strong> — Wire Node Detail Confirm delete to the Meshtastic runtime so the button actually removes the node (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/695" target="_blank" rel="noopener noreferrer">#695</a>)</li>
<li><strong>Meshtastic disconnect teardown</strong> — Abort inbound <code>fromDevice</code> pipe before awaiting <code>toDevice.close</code>, tolerate abrupt writable close errors, and reduce reconnect flakiness after serial/BLE disconnect (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/693" target="_blank" rel="noopener noreferrer">#693</a>)</li>
</ul>
<h3>Other Changes</h3>
<ul>
<li><strong>Faster pre-commit</strong> — Staged-related Vitest (<code>test:staged</code>), staged ESLint with cache, and path-gated <code>check:*</code> scanners; PR CI and <code>pnpm run release</code> still run the full suite (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/696" target="_blank" rel="noopener noreferrer">#696</a>)</li>
<li><strong>Patches / deps</strong> — Track upstream patch PRs in <code>patches/README.md</code> and Ratspeak overlay registry; sync <code>usb</code> MSVC C++17 build flags; routine dependency bumps (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/693" target="_blank" rel="noopener noreferrer">#693</a>, <a href="https://github.com/Colorado-Mesh/mesh-client/pull/694" target="_blank" rel="noopener noreferrer">#694</a>)</li>
</ul>
<h3>Breaking Changes</h3>
<p><em>(None)</em></p>
<h3>Full Changelog</h3>
<p><a href="https://github.com/Colorado-Mesh/mesh-client/compare/v5.24.0...v5.24.1" target="_blank" rel="noopener noreferrer"><code>v5.24.0...v5.24.1</code></a></p>
]]></description>
  </item>
  <item>
    <title>MeshCore Wio Tracker L1 Pro (sosprz) 1.16.91</title>
    <link>https://meshcore.ninja/firmware/meshcore-wio-tracker-l1-pro-sosprz/releases/#release-1.16.91</link>
    <guid isPermaLink="false">firmware-MeshCore Wio Tracker L1 Pro (sosprz)-1.16.91</guid>
    <pubDate>Mon, 20 Jul 2026 18:42:07 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<ul>
<li><strong>GPS home details</strong> - The Home GPS page now shows fix status, satellite count, DMS latitude/longitude, and altitude when GPS data is available.</li>
<li><strong>GPS DMS format</strong> - GPS data views now display coordinates in degrees, minutes, and seconds instead of decimal degrees.</li>
<li><strong>Wio Tracker L1 EINK input bounce fix</strong> - Bounced GPIO interrupt edges are now coalesced into one UI press, preventing a single physical joystick or button press from triggering multiple actions.</li>
<li><strong>Region scope settings</strong> - Added <code>System -&gt; Radio -&gt; Region scope</code> so companion-radio devices can view, set, and clear the persisted default flood scope name and 16-byte key without the companion app.</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshMonitor 4.13.1</title>
    <link>https://meshcore.ninja/software/meshmonitor/releases/#release-4.13.1</link>
    <guid isPermaLink="false">software-MeshMonitor-4.13.1</guid>
    <pubDate>Mon, 20 Jul 2026 16:45:09 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h1>MeshMonitor v4.13.1</h1>
<p>Building on 4.13's unified map core, this release adds a suite of <strong>Link Quality</strong> tools for the RF-minded, an <strong>early preview</strong> of several Meshtastic 2.8 features, and a broad round of map, MQTT, and messaging fixes.</p>
<p>Highlights: a <strong>Terrain Link Profile</strong> tool (elevation cross-section, Fresnel zone, and link-budget verdict) on Map Analysis; a per-node <strong>signal-trend / link-attenuation badge</strong>; <strong>Noise Floor</strong> on the Node Detail card; and <strong>position accuracy + location source</strong> surfaced in node popups. The Map Analysis toolbar is now icon-based with <strong>Show RF / UDP / MQTT</strong> transport toggles, and obscured markers offset intelligently by cell occupancy. On the 2.8 front (an <strong>early preview</strong> — 2.8 is not officially released yet, so this is built against the firmware development branch and is subject to change), MeshMonitor now decodes the <strong>XEdDSA signing shield</strong>, <strong>MeshBeacon</strong> packets, and the <strong>MEDIUM_TURBO</strong> preset. Also notable: telemetry requests now auto-recover from an upstream firmware NeighborInfo-hijack, a new noindex/robots.txt privacy toggle, and a gateway-aware <strong>MQTT Packet Monitor</strong>.</p>
<p>See the <a href="https://meshmonitor.org/blog/2026-07-20-v4-13-1-release" target="_blank" rel="noopener noreferrer">release blog post</a> for the narrative walkthrough.</p>
<h2>Link Quality &amp; Terrain Link Profile</h2>
<ul>
<li>Terrain Link Profile tool: elevation cross-section + Fresnel zone + link-budget verdict, auto-frequency by region, DEM-void handling, map-mirrored graph cursor (#4143, #4147, #4151, #4170, #4156)</li>
<li>Derived signal-trend / link-attenuation badge per node (#4204)</li>
<li>Noise Floor on the Node Detail quick-stats card (#4201)</li>
<li>Position accuracy + location source in node popups, map &amp; chat (#4188)</li>
<li>Latitude/longitude/elevation shown as text in Node Info / Node Details (#4134)</li>
</ul>
<h2>Map Analysis</h2>
<ul>
<li>Icon-based toolbar with labels in tooltips (#4171)</li>
<li>Show RF / UDP / MQTT transport toggles (#4135)</li>
<li>Occupancy-scaled, distance-capped obscured-node precision offset (#4164, #4168, #4181)</li>
<li>"Discard invalid positions" setting, honored on ingest and render (#4158, #4182)</li>
<li>Per-theme (light/dark) tileset preferences (#4118)</li>
<li>Keep router short-name visible in Official pin style (#4184)</li>
<li>Honor Default Map Center on Unified/Dashboard maps (#4128)</li>
<li>Fixes: spiderfy opens the correct node (#4203), SNR overlay pins to merged marker (#4169), no route/heatmap render for marker-less or deleted nodes (#4167, #4175)</li>
</ul>
<h2>Meshtastic 2.8 — Early Preview</h2>
<blockquote>
<p>⚠️ Meshtastic 2.8 is not officially released. This support is built against the firmware development branch and is subject to change as 2.8 evolves.</p>
</blockquote>
<ul>
<li>Pin 2.8-preview protobufs (<code>develop@ba16bfc</code>) with a 2.7 TrafficManagement compat shim (#4205)</li>
<li>XEdDSA packet-signing shield in the Packet Monitor (#4209)</li>
<li>MeshBeacon (<code>MESH_BEACON_APP</code>) decode + firmware-verified preset channel names (#4207)</li>
<li>MEDIUM_TURBO modem preset + 2.8 opt-in FAQ (#4200)</li>
</ul>
<h2>MQTT</h2>
<ul>
<li>Gateway-aware MQTT Packet Monitor — per-gateway reception capture + UI (#4127, #4138)</li>
<li>Geo-ignore epic: fail-open geo filter, per-source ignore list, retroactive purge/sweep, observability (#4123, #4131, #4132, #4136)</li>
<li>Route directed MQTT messages to the DM view, not their channel (#4161)</li>
<li>Guard MQTT POSITION ingestion against Null Island fixes (#4150)</li>
</ul>
<h2>Messages, Nodes &amp; Automation</h2>
<ul>
<li>Auto-retry telemetry requests hijacked by the firmware NeighborInfo behavior (#4214)</li>
<li>Stop unsynced-clock nodes rendering chat at ~1970 (#4208)</li>
<li>MeshCore own-node messages show name, not public key (#4197)</li>
<li>Short name shown alongside long name on message senders (#4196)</li>
<li>"Message anyway" override for unmessageable nodes (#4187), and clearer hidden-composer messaging (#4140)</li>
<li>Remote-admin (non-local) reboot target for the device-reboot automation (#4186)</li>
<li>Compose draft scoped per-conversation (#4185)</li>
<li>Reliably un-hide nodes from the map across sources (#4141)</li>
<li>Traceroute no longer sends on a DISABLED channel slot (#4180)</li>
<li>Reject precision-obscured Null Island fixes on ingest (#4149)</li>
</ul>
<h2></h2>
<p>…</p>
]]></description>
  </item>
  <item>
    <title>MeshCore Hub 0.16.2</title>
    <link>https://meshcore.ninja/software/meshcore-hub/releases/#release-0.16.2</link>
    <guid isPermaLink="false">software-MeshCore Hub-0.16.2</guid>
    <pubDate>Mon, 20 Jul 2026 14:13:53 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h2>What's Changed</h2>
<ul>
<li>feat(routes): add per-route max_path_length cap by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/321" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/321</a></li>
<li>chore(deps): update actions/setup-python action to v7 by @renovate[bot] in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/320" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/320</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/ipnet-mesh/meshcore-hub/compare/v0.16.1...v0.16.2" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.16.1...v0.16.2</a></p>
]]></description>
  </item>
  <item>
    <title>Wadamesh beta_48</title>
    <link>https://meshcore.ninja/firmware/wadamesh/releases/#release-beta_48</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_48</guid>
    <pubDate>Mon, 20 Jul 2026 09:33:01 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p><strong>wadamesh beta_48</strong> is a stability and bug-fix drop. A big batch of reported issues sorted.</p>
<blockquote>
<p>Test build. Turn on <strong>Get test builds (beta)</strong> on the device, use the <strong>Beta</strong> toggle on the <a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">web flasher</a>, or grab a <code>-merged.bin</code> below. Stable stays on beta_46.</p>
</blockquote>
<h2>Fixed</h2>
<ul>
<li>Crash that could reboot the device while typing in a chat (<a href="https://github.com/ALLFATHER-BV/wadamesh/issues/98" target="_blank" rel="noopener noreferrer">#98</a>).</li>
<li>Devices stuck on the boot screen after an update with a microSD card fitted. The boot-time copy of your data to the card could hang on a slow or damaged card; it is now guarded so the device always boots (<a href="https://github.com/ALLFATHER-BV/wadamesh/issues/142" target="_blank" rel="noopener noreferrer">#142</a>, <a href="https://github.com/ALLFATHER-BV/wadamesh/issues/148" target="_blank" rel="noopener noreferrer">#148</a>).</li>
<li>MQTT bridge settings not saving. They were going to the wrong storage; now they stick across reboots (<a href="https://github.com/ALLFATHER-BV/wadamesh/issues/128" target="_blank" rel="noopener noreferrer">#128</a>).</li>
<li>Message times showing 1910 or other wrong dates. They now match the clock at the top of the screen (<a href="https://github.com/ALLFATHER-BV/wadamesh/issues/100" target="_blank" rel="noopener noreferrer">#100</a>, <a href="https://github.com/ALLFATHER-BV/wadamesh/issues/152" target="_blank" rel="noopener noreferrer">#152</a>).</li>
<li>Dutch keyboard typing "ij" and "IJ" on the "1" and "!" keys (<a href="https://github.com/ALLFATHER-BV/wadamesh/issues/144" target="_blank" rel="noopener noreferrer">#144</a>, <a href="https://github.com/ALLFATHER-BV/wadamesh/issues/164" target="_blank" rel="noopener noreferrer">#164</a>).</li>
<li>Message box letting you type past the real send limit and silently dropping the end of a long message (<a href="https://github.com/ALLFATHER-BV/wadamesh/issues/119" target="_blank" rel="noopener noreferrer">#119</a>).</li>
<li>Copy and paste cutting off long text (<a href="https://github.com/ALLFATHER-BV/wadamesh/issues/120" target="_blank" rel="noopener noreferrer">#120</a>).</li>
<li>Quick messages list not scrolling when there were more entries than fit on screen (<a href="https://github.com/ALLFATHER-BV/wadamesh/issues/151" target="_blank" rel="noopener noreferrer">#151</a>).</li>
<li>Room server names starting with an unusual character showing an empty box on the Join screen (<a href="https://github.com/ALLFATHER-BV/wadamesh/issues/116" target="_blank" rel="noopener noreferrer">#116</a>).</li>
<li>Tanmatsu: only about half the emojis were reachable in the picker (<a href="https://github.com/ALLFATHER-BV/wadamesh/issues/141" target="_blank" rel="noopener noreferrer">#141</a>).</li>
<li>Tanmatsu: the last settings item (About) being unreachable was already fixed in an earlier build, so it is sorted here too (<a href="https://github.com/ALLFATHER-BV/wadamesh/issues/140" target="_blank" rel="noopener noreferrer">#140</a>).</li>
</ul>
<h2>Boards</h2>
<p>T-Deck · Heltec V4 TFT · Heltec V4-R8 · ThinkNode M9 · RAK TAP v2 · T-LoRa Pager (LR1121 / SX1262) · Attaky Core · T-Display P4. Flash <code>&lt;board&gt;-merged.bin</code> at <code>0x0</code> for a full install, or <code>&lt;board&gt;.bin</code> for an app-only update.</p>
]]></description>
  </item>
  <item>
    <title>MeshPunk 0.2.7</title>
    <link>https://meshcore.ninja/firmware/meshpunk/releases/#release-0.2.7</link>
    <guid isPermaLink="false">firmware-MeshPunk-0.2.7</guid>
    <pubDate>Mon, 20 Jul 2026 06:06:35 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>Usb drivers are now separate from the main firmware and apps that need that automatically download them when needed.
Gamepads and now supported and their drivers are downloaded with the Gamepad app found in the games category.
The Gameboy emulator now includes a tdeck driver to allow device to device usb connection.
The Gameboy emulator can now emulate a link cable connection via usb c cable to allow for 2 player link cable games!
A readme app is now included that gives details on how to use the firmware.</p>
]]></description>
  </item>
  <item>
    <title>LusoFW 2026.7.2-rc3-d164f95</title>
    <link>https://meshcore.ninja/firmware/lusofw/releases/#release-2026.7.2-rc3-d164f95</link>
    <guid isPermaLink="false">firmware-LusoFW-2026.7.2-rc3-d164f95</guid>
    <pubDate>Mon, 20 Jul 2026 03:21:50 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>Automated dev prerelease of dev@d164f95 for v2026.7.2-rc3.</p>
<p>Based on MeshCore v1.16.0
main@e8d3c53ba1ea863937081cd0caad759b832f3028</p>
<h3>Correções</h3>
<ul>
<li>CLIENTE: A página inicial do GPS agora fica oculta no carrossel quando nenhum GPS é detectado na porta série no arranque, em vez de aparecer sempre quando <code>ENV_INCLUDE_GPS</code> está ativado.</li>
<li>REPETIDOR: Corrigido envio de anúncios por inundação (flood adverts): agora respeita o <code>default_scope</code> e o modo de hash de caminho (<code>path_hash_mode</code> nas preferências).</li>
<li>REPETIDOR: Removida a redução probabilística de flood adverts.</li>
<li>REPETIDOR: Corrigido um <em>buffer overflow</em> no acumulador de comandos série.</li>
</ul>
<h4>Melhorias</h4>
<ul>
<li>CLI: Adicionada a leitura do motivo de arranque do ESP32 (<code>get pwrmgt.bootreason</code>).</li>
<li>CLI: Reforçada a cópia segura de strings no tratamento de comandos.</li>
<li>RÁDIO: Ajustado o atraso de retentativa CAD para intervalo entre 120 a 360 ms.</li>
</ul>
<h4>Observabilidade</h4>
<ul>
<li>DISPATCHER: Adicionados logs de debug para conclusão de TX.</li>
<li>ESTATÍSTICAS: Removidos parâmetros não usados na formatação de respostas.</li>
</ul>
<h4>Build e Configuração</h4>
<ul>
<li>BUILD: Adicionada a variável <code>DISABLE_DEBUG</code> ao processo de build.</li>
<li>BUILD: Reorganizadas as build flags no platformio.ini.</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshCore Hub 0.16.1</title>
    <link>https://meshcore.ninja/software/meshcore-hub/releases/#release-0.16.1</link>
    <guid isPermaLink="false">software-MeshCore Hub-0.16.1</guid>
    <pubDate>Sun, 19 Jul 2026 22:16:58 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h2>What's Changed</h2>
<ul>
<li>fix(routes): clearing observers in the edit modal now persists by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/319" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/319</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/ipnet-mesh/meshcore-hub/compare/v0.16.0...v0.16.1" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.16.0...v0.16.1</a></p>
]]></description>
  </item>
  <item>
    <title>MeshCore Hub 0.16.0</title>
    <link>https://meshcore.ninja/software/meshcore-hub/releases/#release-0.16.0</link>
    <guid isPermaLink="false">software-MeshCore Hub-0.16.0</guid>
    <pubDate>Sun, 19 Jul 2026 21:09:36 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h2>What's Changed</h2>
<ul>
<li>chore(deps): update anomalyco/opencode action to v1.17.18 by @renovate[bot] in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/303" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/303</a></li>
<li>chore(deps): update dependency daisyui to v5.6.16 by @renovate[bot] in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/302" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/302</a></li>
<li>Add GitHub funding link to FUNDING.yml by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/304" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/304</a></li>
<li>chore(deps): update dependency daisyui to v5.6.18 by @renovate[bot] in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/305" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/305</a></li>
<li>chore(deps): update tailwindcss monorepo to v4.3.3 by @renovate[bot] in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/309" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/309</a></li>
<li>chore(deps): update anomalyco/opencode action to v1.18.3 by @renovate[bot] in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/307" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/307</a></li>
<li>feat: Route Health Monitoring by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/308" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/308</a></li>
<li>feat: HTTP Cache-Control, dashboard TTL bump, and route event-hash dedup by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/310" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/310</a></li>
<li>fix: route_result not refreshing after route edit (plus cache invalidation infra) by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/311" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/311</a></li>
<li>chore(deps): update fontsource monorepo to v5.3.0 by @renovate[bot] in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/312" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/312</a></li>
<li>feat: dashboard route widgets + cache TTL consolidation by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/313" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/313</a></li>
<li>feat: precompute route health + consolidated migration + observer badge fix by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/314" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/314</a></li>
<li>UI polish: modal save spinners + route list sort by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/315" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/315</a></li>
<li>chore(routes): default window_hours=48 and max_hop_span=8 by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/316" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/316</a></li>
<li>chore(routes): default packet_count_threshold=5 and 3× clear multiplier by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/317" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/317</a></li>
<li>feat(dashboard): limit Route Health widget to community routes by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/318" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/318</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.10...v0.16.0" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.10...v0.16.0</a></p>
]]></description>
  </item>
  <item>
    <title>Meshtrax 1.7.0</title>
    <link>https://meshcore.ninja/software/meshtrax/releases/#release-1.7.0</link>
    <guid isPermaLink="false">software-Meshtrax-1.7.0</guid>
    <pubDate>Sun, 19 Jul 2026 19:38:16 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h2>What's New in 1.7.0</h2>
<h3>Room server</h3>
<p>If you're an admin on a room server, you can now manage it right from the room
chat — tap the manage icon to reach status, telemetry, settings, neighbors, and
the command line.</p>
<h3>Replies that point at the right message</h3>
<p>Replying in a channel now quotes the exact message you picked, instead of the
person's most recent one. Mentioning someone with @ no longer accidentally turns
your message into a reply, and quoted replies now appear correctly in other
MeshCore apps too.</p>
<h3>Smarter contact list</h3>
<p>Nodes with a broken clock no longer show nonsense ages like "755 days ago".
MeshTrax corrects the time and marks the contact with a small clock icon so you
know why.</p>
<h3>Notifications that go where you expect</h3>
<p>Tapping a notification now opens the right conversation, even if the app was
closed.</p>
<h3>Bug fixes</h3>
<p>Channel messages send more reliably over USB, message retries can be turned off,
a reconnecting status now shows in chat, notifications no longer appear for
unused channel slots, duplicate device info entries removed, and various fixes
for improved compatibility with the latest device firmware.</p>
<p><strong>Full Changelog</strong>: <a href="https://github.com/venamartin/meshtrax/compare/v1.6.3...v1.7.0" target="_blank" rel="noopener noreferrer">https://github.com/venamartin/meshtrax/compare/v1.6.3...v1.7.0</a></p>
]]></description>
  </item>
  <item>
    <title>Wadamesh beta_47</title>
    <link>https://meshcore.ninja/firmware/wadamesh/releases/#release-beta_47</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_47</guid>
    <pubDate>Sun, 19 Jul 2026 16:02:03 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p><strong>wadamesh beta_47</strong> — a new <strong>Discover</strong> app (find, list and map the nodes around you, plus wardriving), a new board, and pager + T-Display P4 additions.</p>
<blockquote>
<p>🧪 Test build. Flip <strong>Get test builds (beta)</strong> on-device, use the <strong>Beta</strong> toggle on the <a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">web flasher</a>, or grab a <code>-merged.bin</code> below. Stable stays on beta_46.</p>
</blockquote>
<p>🙏 <strong>Community contributions:</strong> thanks to <strong><a href="https://github.com/attakygit" target="_blank" rel="noopener noreferrer">@attakygit</a></strong> for the <strong>Attaky Core</strong> board port (<a href="https://github.com/ALLFATHER-BV/wadamesh/pull/158" target="_blank" rel="noopener noreferrer">#158</a>) and <strong><a href="https://github.com/codemonkeybr" target="_blank" rel="noopener noreferrer">@codemonkeybr</a></strong> (Tesso Codemonkey) for the <strong>T-LoRa Pager</strong> navigation fix (<a href="https://github.com/ALLFATHER-BV/wadamesh/pull/162" target="_blank" rel="noopener noreferrer">#162</a>).</p>
<h2>✨ Discover — find what's around you</h2>
<ul>
<li><strong>Active discovery</strong> — open the <strong>Discover</strong> app (app drawer → the ⟳ tile, next to Map): it sweeps for nearby nodes and lists every repeater / companion / room server that answers, <strong>ranked by signal</strong> — live RSSI/SNR, a green <strong>direct</strong> badge for anything in direct RF range, and a last-heard age.</li>
<li><strong>One-tap add</strong> — tap a node to add it straight to your contacts (it keeps the right type: repeater, companion or room).</li>
<li><strong>Wardriving</strong> — with a GPS fix it logs every node it hears against your position to a CSV on the SD card as you move, and paints your <strong>RF coverage on the map</strong> as a signal-coloured track (green = strong → red = weak). A standalone, on-device coverage mapper — no phone tethered.</li>
</ul>
<h2>📟 New boards</h2>
<ul>
<li><strong>Attaky Core</strong> (ESP32-S3, 16 MB flash / 8 MB PSRAM) — a new board <em>(by @attakygit, #158)</em>. Experimental: beta channel only while hardware verification finishes.</li>
<li><strong>LilyGo T-Display P4 — TFT-LCD variant</strong> — early support for the LCD screen model (the AMOLED variant was already supported). Experimental; the <code>wadamesh-tdisplay-p4-lcd-merged.bin</code> asset below is for LCD-screen units (flash at <code>0x0</code>).</li>
</ul>
<h2>🛠 Fixed</h2>
<ul>
<li><strong>LilyGo T-LoRa Pager</strong> — the rotary encoder now keeps its focus inside the chat message list, and the composer navigation keys are remapped so moving around and typing a message no longer collide <em>(by @codemonkeybr, #162)</em>.</li>
</ul>
<h2>📦 Boards</h2>
<p>T-Deck · Heltec V4 TFT · Heltec V4-R8 · ThinkNode M9 · RAK TAP v2 · T-LoRa Pager (LR1121 / SX1262) · Attaky Core · T-Display P4. Flash <code>&lt;board&gt;-merged.bin</code> at <code>0x0</code> (full install) or <code>&lt;board&gt;.bin</code> for an app-only/OTA update.</p>
]]></description>
  </item>
  <item>
    <title>MeshMonitor 4.13.1-rc4</title>
    <link>https://meshcore.ninja/software/meshmonitor/releases/#release-4.13.1-rc4</link>
    <guid isPermaLink="false">software-MeshMonitor-4.13.1-rc4</guid>
    <pubDate>Sun, 19 Jul 2026 13:15:34 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h1>MeshMonitor v4.13.1-rc4</h1>
<blockquote>
<p>⚠️ <strong>Pre-release (release candidate).</strong> This build is for testing ahead of the v4.13.1 stable release. Not recommended for production deployments.</p>
</blockquote>
<p>This fourth release candidate continues the Meshtastic 2.8 readiness work and lands a mix of node-detail and map improvements on top of rc3. It adds a <code>noIndexEnabled</code> privacy toggle so a publicly-exposed dashboard can serve <code>X-Robots-Tag: noindex, nofollow</code> headers plus a disallow-all <code>/robots.txt</code> (belt-and-suspenders for Cloudflare-tunnel setups that strip custom headers). On the 2.8 front, it decodes <code>MESH_BEACON_APP</code> with firmware-verified preset channel names, pins the 2.8-preview protobufs with a 2.7 TrafficManagement compat shim, adds an XEdDSA signature shield in the Packet Monitor, and ships the MEDIUM_TURBO preset with 2.8 opt-in docs. Node detail gains a derived signal-trend / link-attenuation badge and a Noise Floor quick-stat. Two bug fixes round it out: chat from unsynced-clock nodes no longer renders at ~1970, and cluster spiderfy no longer opens the popup for a nearby unrelated node.</p>
<h2>Features</h2>
<ul>
<li><strong>Privacy:</strong> <code>noIndexEnabled</code> toggle serving <code>X-Robots-Tag: noindex, nofollow</code> + disallow-all <code>/robots.txt</code> (#4212, closes #4202)</li>
<li><strong>2.8 / Packet Monitor:</strong> XEdDSA signature shield for firmware 2.8 packets (#4209)</li>
<li><strong>2.8 / MeshBeacon:</strong> decode <code>MESH_BEACON_APP</code> + firmware-verified preset channel names (#4207)</li>
<li><strong>2.8 / Protobufs:</strong> pin 2.8-preview <code>develop@ba16bfc</code> with 2.7 TrafficManagement compat shim (#4205)</li>
<li><strong>Nodes:</strong> derived signal-trend / link-attenuation badge per node (#4204, closes #4110)</li>
<li><strong>Nodes:</strong> show Noise Floor on the Node Detail quick-stats card (#4201, closes #4109)</li>
<li><strong>2.8:</strong> MEDIUM_TURBO preset, <code>MESH_BEACON_APP</code> portnum, traffic-management &amp; 2.8 opt-in docs (#4200)</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><strong>Messages:</strong> stop unsynced-RTC nodes rendering chat at ~1970 (rxTime now clamped to receipt time) (#4208, closes #4206)</li>
<li><strong>Map:</strong> spiderfy no longer selects a nearby unrelated node instead of fanning the cluster (#4203, closes #4199)</li>
</ul>
<h2>Issues Resolved</h2>
<ul>
<li>#4202 — [FEAT] Robots.txt / X-Robots-Tag toggle to discourage crawlers/bots</li>
<li>#4206 — [BUG] Chat from unsynced-clock nodes renders at ~1970</li>
<li>#4199 — [BUG] Spiderfy click opens popup for wrong nearby node</li>
<li>#4109 — [FEAT] Show Noise Floor on Node Detail quick-stats card</li>
<li>#4110 — [FEAT] Derived signal-trend / link-attenuation indicator per node</li>
<li>#4074 — Modem preset tables missing MEDIUM_TURBO (enum 16)</li>
<li>#3999 — [2.8 tracking] Position &amp; telemetry broadcast now opt-in by default</li>
<li>#3547 — Docs: Traffic Management module documentation</li>
</ul>
<p><strong>Full changelog:</strong> <a href="https://github.com/Yeraze/meshmonitor/compare/v4.13.1-rc3...v4.13.1-rc4" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/compare/v4.13.1-rc3...v4.13.1-rc4</a></p>
<h2>🚀 MeshMonitor v4.13.1-rc4</h2>
<h3>📦 Installation</h3>
<p><strong>Docker (recommended):</strong></p>
<pre><code>docker run -d \
  --name meshmonitor \
  -p 8080:3001 \
  -v meshmonitor-data:/data \
  ghcr.io/Yeraze/meshmonitor:4.13.1-rc4
</code></pre>
<h3>🧪 Testing</h3>
<p>✅ All tests passed
✅ TypeScript checks passed
✅ Docker images built for linux/amd64, linux/arm64, linux/arm/v7</p>
<h3>📋 Changes</h3>
<p>See commit history for detailed changes.</p>
]]></description>
  </item>
  <item>
    <title>pyMC Console 0.9.337</title>
    <link>https://meshcore.ninja/software/pymc-console/releases/#release-0.9.337</link>
    <guid isPermaLink="false">software-pyMC Console-0.9.337</guid>
    <pubDate>Sun, 19 Jul 2026 07:52:22 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<p>Automated release from pymc_console.</p>
<h2>Installation</h2>
<pre><code>sudo ./manage.sh install
</code></pre>
<h2>Upgrade</h2>
<pre><code>sudo ./manage.sh upgrade
</code></pre>
]]></description>
  </item>
  <item>
    <title>Fennek 2.7.1</title>
    <link>https://meshcore.ninja/firmware/fennek/releases/#release-2.7.1</link>
    <guid isPermaLink="false">firmware-Fennek-2.7.1</guid>
    <pubDate>Sun, 19 Jul 2026 07:33:31 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>Schach-Trainer-Modus: neuer Gegner bewertet jeden Zug offline (Einstufung + Begründung + Empfehlung). Zentraler WLAN-Multiprofil-Service (services/wifi.*) ersetzt die duplizierte WiFi.begin-Sequenz in 9 Diensten und wählt per Scan das stärkste bekannte Netz.</p>
]]></description>
  </item>
  <item>
    <title>Meck-P4 0.6.5</title>
    <link>https://meshcore.ninja/firmware/meck-p4/releases/#release-0.6.5</link>
    <guid isPermaLink="false">firmware-Meck-P4-0.6.5</guid>
    <pubDate>Sun, 19 Jul 2026 07:00:10 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>Short on time at the moment so no release notes for this one. Sorts out the rx duty cycle bug some users were having with v0.6.4.</p>
<p>If anyone needs the TFT version let me know via the discussions page, otherwise I'll add it as soon as I can.</p>
]]></description>
  </item>
  <item>
    <title>Fennek 2.7.0</title>
    <link>https://meshcore.ninja/firmware/fennek/releases/#release-2.7.0</link>
    <guid isPermaLink="false">firmware-Fennek-2.7.0</guid>
    <pubDate>Sun, 19 Jul 2026 06:29:18 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>Schach: Stufenname im Serial-Log wird jetzt übersetzt (i18n::tr statt Enum-Wert an %s).</p>
]]></description>
  </item>
  <item>
    <title>Fennek 2.6.9</title>
    <link>https://meshcore.ninja/firmware/fennek/releases/#release-2.6.9</link>
    <guid isPermaLink="false">firmware-Fennek-2.6.9</guid>
    <pubDate>Sun, 19 Jul 2026 06:28:17 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>Sperrbildschirm als Vollbild (große exakte Uhr, Datum, Akku, Now-Playing, Entsperr-Hinweis) + informativeres Standby-Banner (grobe Uhr "Nach HH:xx", nächster Wecker, Akku-Ladeanzeige). Wake-/Entsperr-Hinweise nennen den oberen Knopf.</p>
]]></description>
  </item>
  <item>
    <title>MeshCore Low-Power 1.16.dev_0719</title>
    <link>https://meshcore.ninja/firmware/meshcore-lowpower/releases/#release-1.16.dev_0719</link>
    <guid isPermaLink="false">firmware-MeshCore Low-Power-1.16.dev_0719</guid>
    <pubDate>Sun, 19 Jul 2026 05:04:56 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h3>v1.16_0719</h3>
<ul>
<li><p><strong>New: Sensors screen.</strong> <em>(Companion — all platforms)</em></p>
<p>A new <strong>Sensors</strong> page on the Home screen. <strong>Battery</strong> shows a 24-hour rolling battery-percentage history as a bar chart, one bar per hour. If an environment sensor is attached, long press cycles through its readings — temperature, humidity, pressure, altitude, voltage, current, power, distance, or gas resistance — as a plain value+unit grid (<code>°C</code>, <code>hPa</code>, <code>V</code>...). The header shows the sensor's actual name (e.g. "BME280") while viewing its page, and precise Vbat voltage while viewing "Battery". With only one sensor attached, the page title just reads "SENSOR"; with more than one, pages are numbered by detection order ("Sensor 1", "Sensor 2"...) rather than the raw LPP channel number.</p>
</li>
<li><p><strong>Message Persist setting now available in the WiFi Companion Portal, and included in backup/restore.</strong> <em>(Companion — WiFi transport, V3, V4, E213, E290, Wireless Paper, XIAO S3)</em></p>
<p>The Message Persist toggle (added in v1.16_0714) was previously only reachable via CLI or the on-device UI. It's now also a checkbox under General Settings in the Companion Portal, and its value round-trips through the portal's Backup/Restore.</p>
</li>
</ul>
]]></description>
  </item>
  <item>
    <title>EastMesh 2026.7.0</title>
    <link>https://meshcore.ninja/firmware/eastmesh/releases/#release-2026.7.0</link>
    <guid isPermaLink="false">firmware-EastMesh-2026.7.0</guid>
    <pubDate>Sun, 19 Jul 2026 04:09:45 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h2>MeshCore EastMesh Observer</h2>
<p>EastMesh <code>observer-eastmesh</code> firmware for MeshCore boards with secure MQTT uplink and optional local web management, based on MeshCore firmware <code>v1.16.0</code> plus upstream dev updates (as of 2026-07-09).</p>
<p>This release syncs with <strong>upstream MeshCore dev</strong> — bringing power-off/deep-sleep improvements, SX1262 LDO support, hardware channel-activity detection, and board/platform fixes — <strong>realigns saved settings storage</strong> with upstream so future syncs can't shift or corrupt EastMesh settings, and <strong>restores EastMesh/MeshMapper broker TLS trust</strong> after a server-side certificate change.</p>
<h3>What's Changed</h3>
<ul>
<li>Merged upstream MeshCore dev updates including power-off/deep-sleep improvements, SX1262 LDO support, hardware channel-activity detection, radio gain fixes, and board/platform fixes.</li>
<li>Realigned saved node settings to upstream byte offsets and moved EastMesh-specific fields behind a reserved gap so future upstream syncs no longer shift or corrupt them.</li>
<li>Restored EastMesh and MeshMapper broker TLS trust after <code>mqtt2.eastmesh.au</code> moved from Let's Encrypt to a Google Trust Services certificate.</li>
<li>Bumped CI build and docs workflows to Python 3.13.</li>
</ul>
<h3>Breaking Changes</h3>
<ul>
<li>The saved settings layout changed: devices upgrading from <code>2026.6.6</code> or earlier may need EastMesh-specific settings (such as fan control and bridge peer) and recently added radio settings reconfigured after the update.</li>
</ul>
<h3>Notes</h3>
<ul>
<li><strong>If your observer stopped uplinking to <code>eastmesh-au</code> or <code>meshmapper</code> with TLS certificate errors, this release is the fix</strong> — update and the connection will recover on its own.</li>
<li>After updating, check your fan control, bridge peer, and recently added radio settings (see Breaking Changes) and re-set any that came back at defaults.</li>
<li><code>eastmesh-au</code> remains the recommended MQTT endpoint once <code>mqtt.iata</code> is configured; <code>meshmapper</code> and <code>waev</code> are available as global second brokers.</li>
<li>Select brokers from the Primary and Secondary dropdowns in the web panel, or toggle them from the CLI (<code>set mqtt.eastmesh-au on</code>, <code>set mqtt.meshmapper on</code>, <code>set mqtt.waev on</code>, etc.). A maximum of two brokers can be enabled at once.</li>
<li><code>waev</code> (<code>mqtt.waev.app</code>) uses a 1-hour auth token that the firmware refreshes automatically, so no extra configuration is needed. Set your Waev account email with <code>set mqtt.email &lt;email&gt;</code> so Waev can link the observer to your account.</li>
<li>MQTT status messages report cumulative <code>packets_sent</code> and <code>packets_received</code> alongside the existing radio stats; both counters reset on reboot.</li>
<li>LetsMesh EU/US are retired but still selectable for legacy use.</li>
<li>Custom MQTT is available for private broker deployments and uses username/password auth only. For TCP custom MQTT, use the broker host and port as before. For WSS custom MQTT, set the host and port, select WSS transport, and the firmware connects using <code>wss://host:port/mqtt</code>.</li>
<li>WSS uses TLS encryption and validates against the ESP-IDF x509 root CA bundle.</li>
<li>For maximum heap headroom on busy observers, use the web panel for setup and troubleshooting, then disable it with <code>set web off</code>.</li>
<li>Browsers may still require accepting the self-signed certificate warning on first HTTPS access.</li>
<li><code>flood.max.unscoped</code> defaults to <code>64</code>; lower it only if you want to limit how far unscoped flood traffic repeats.</li>
<li><code>flood.max.advert</code> controls the hop limit for flooded advert packets.</li>
</ul>
<h3>Documentation</h3>
<p><a href="https://xjarid.github.io/MeshCore-EastMesh/" target="_blank" rel="noopener noreferrer">xjarid.github.io/MeshCore-EastMesh</a></p>
<h3>Flashing</h3>
<ul>
<li><a href="https://flasher.eastmesh.au/" target="_blank" rel="noopener noreferrer">flasher.eastmesh.au</a></li>
<li><a href="https://flasher.meshcore.io/" target="_blank" rel="noopener noreferrer">flasher.meshcore.io</a></li>
</ul>
<h3>Assets</h3>
<ul>
<li><code>.bin</code> - standard update image</li>
<li><code>-merged.bin</code> - full ESP32 image for flashing after erase</li>
</ul>
]]></description>
  </item>
  <item>
    <title>mesh-client 5.24.0</title>
    <link>https://meshcore.ninja/software/mesh-client/releases/#release-5.24.0</link>
    <guid isPermaLink="false">software-mesh-client-5.24.0</guid>
    <pubDate>Sun, 19 Jul 2026 00:29:23 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h2>[v5.24.0] - 2026-07-18</h2>
<h3>Highlights</h3>
<p>Reticulum grows into a full comms suite this release: a new <strong>Relay Chat (RRC)</strong> IRC-style multi-hub client, a <strong>Remote</strong> tab for <code>rnsh</code> shells and <code>rncp</code> file transfer, <strong>watch-folder Nomad hosting</strong> with an upgraded Micron renderer, <strong>identity slots</strong>, propagation-node rename/delete, and much faster <strong>Peers</strong> at large path-table sizes. A broad <strong>protocol-parity</strong> pass adds QR generation/scan, <code>lxm://</code> deep links, GPX export, LoRa signal metering, Meshtastic module event history, and per-send <strong>MeshCore flood-scope presets</strong> (now behind a split Send button). Messaging is more resilient (one-click location share, chat outbox drain on reconnect, extended reconnect budgets, humanized send-NAK errors), and cold-start BLE is serialized so an RNode connects before the RF radios. MeshCore MQTT now steers non-Colorado users to LetsMesh by default.</p>
<h3>What's Changed</h3>
<h3>Features</h3>
<ul>
<li><strong>Reticulum Remote tab (rnsh + rncp)</strong> — New Remote tab (Shell / Transfer / Saved / Settings) with an xterm shell, file send/fetch/listen, saved address book + inbound policy, and Chat DM <code>rncp</code> controls; trust-boundary hardening (picker-backed save dirs, size/offer caps, allow/block lists) (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/692" target="_blank" rel="noopener noreferrer">#692</a>, implements <a href="https://github.com/Colorado-Mesh/mesh-client/issues/688" target="_blank" rel="noopener noreferrer">#688</a>, <a href="https://github.com/Colorado-Mesh/mesh-client/issues/689" target="_blank" rel="noopener noreferrer">#689</a>)</li>
<li><strong>Reticulum Relay Chat (RRC)</strong> — IRC-style multi-pane client with up to 8 concurrent hub sessions, Favourites/Discovered hub picker, rooms + nicklist, <code>/</code>-command router, <code>@mention</code> unread badges + tray/toast notifications, and SQLite-persisted room history with retention pruning (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/680" target="_blank" rel="noopener noreferrer">#680</a>, fixes <a href="https://github.com/Colorado-Mesh/mesh-client/issues/648" target="_blank" rel="noopener noreferrer">#648</a>)</li>
<li><strong>Watch-folder Nomad hosting + Micron rendering</strong> — Host bounded static Nomad Network sites from a watched folder with auto-restore and filesystem watching; vendored RFnexus Micron parser adds table/anchor/partial support (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/683" target="_blank" rel="noopener noreferrer">#683</a>, closes <a href="https://github.com/Colorado-Mesh/mesh-client/issues/613" target="_blank" rel="noopener noreferrer">#613</a>)</li>
<li><strong>Protocol parity tools</strong> — Meshtastic module event history, LoRa signal metering, GPX export, MeshCore MCU temperature parsing, per-send flood-scope overrides, QR generation + camera/file ingest, custom <code>lxm://</code> deep links, cross-platform camera permissions, and Reticulum <strong>identity slots</strong> with restart-based switching + contact fingerprint verification (<a href="https://github.com/Colorado-Mesh/mesh-client/commit/9890611e" target="_blank" rel="noopener noreferrer"><code>9890611e</code></a>, fixes <a href="https://github.com/Colorado-Mesh/mesh-client/issues/218" target="_blank" rel="noopener noreferrer">#218</a>, <a href="https://github.com/Colorado-Mesh/mesh-client/issues/477" target="_blank" rel="noopener noreferrer">#477</a>)</li>
<li><strong>MeshCore flood-scope presets</strong> — User-managed scope list (seeded from the radio hashtag, cap 20) replacing Colorado/Denver hardcodes; scope now lives behind a chevron split-Send menu instead of an always-visible select (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/692" target="_blank" rel="noopener noreferrer">#692</a>)</li>
<li><strong>Messaging resilience</strong> — One-click chat location share (OSM text + optional Meshtastic waypoint) with outbox enqueue on failure, chat outbox drain on RF reconnect, extended BLE/serial reconnect budgets (8 attempts) with transport-aware "reconnecting N/M" banner, conservative/aggressive Store &amp; Forward catch-up setting, and a hung-only Reticulum sidecar health watchdog (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/692" target="_blank" rel="noopener noreferrer">#692</a>)</li>
<li><strong>Reticulum propagation node management</strong> — Rename/delete remote propagation nodes with confirm dialog and persistence guards (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/679" target="_blank" rel="noopener noreferrer">#679</a>)</li>
<li><strong>Scale Reticulum Peers</strong> — Incremental <code>peers_updated</code> patches, path-table TTL, forced <code>?refresh=1</code> dumps, batched Map updates, and retention parity (hard 100k ceiling / 50k user cap) keep the UI responsive at ~50k peers ([#677](<a href="https://github.com/Colorado-Mesh/mesh-client/pull/677" target="_blank" rel="noopener noreferrer">https://github.com/Colorado-Mesh/mesh-client/pull/677</a>
…</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshCore Cardputer-ADV 2026.7.2</title>
    <link>https://meshcore.ninja/firmware/meshcore-cardputer-adv/releases/#release-2026.7.2</link>
    <guid isPermaLink="false">firmware-MeshCore Cardputer-ADV-2026.7.2</guid>
    <pubDate>Sat, 18 Jul 2026 19:52:51 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<ul>
<li>Remove messages preview screen</li>
<li>Add "New message" screen that appears when a new message is received when screen is off or current page is main</li>
<li>Move unsynced messages count to the stats page</li>
<li>After selecting chat and pressing <code>Esc</code>, current page is restored to the previous one</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshMonitor 4.13.1-rc3</title>
    <link>https://meshcore.ninja/software/meshmonitor/releases/#release-4.13.1-rc3</link>
    <guid isPermaLink="false">software-MeshMonitor-4.13.1-rc3</guid>
    <pubDate>Sat, 18 Jul 2026 19:43:46 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h1>MeshMonitor v4.13.1-rc3</h1>
<blockquote>
<p>⚠️ <strong>Pre-release (release candidate).</strong> Rolls up 13 PRs merged since rc2 — position-quality &amp; Map Analysis refinements plus a cluster of messaging correctness fixes. Please test and report issues before the stable 4.13.1.</p>
</blockquote>
<h2>Highlights</h2>
<p>This RC sharpens <strong>position quality and node identity</strong>. Node popups now show position accuracy and GPS location source; the "Discard invalid positions" toggle is honored on the render side (not just ingest); and the obscured-node precision offset is occupancy-scaled and distance-capped. On the messaging side it fixes several real correctness bugs: compose drafts no longer leak across conversations (a message meant for one node could be sent to another), MeshCore own-node messages show the node's name instead of a raw public key, and message senders now display their short name alongside the long name. Rounding it out: automations can now target a remote node for admin reboot, unmessageable nodes get a "Message anyway" override, traceroute no longer fails with NO_CHANNEL on a disabled channel slot, and the v1 <code>default</code> source alias scopes correctly.</p>
<h2>Features</h2>
<ul>
<li><strong>#4188</strong> — Position accuracy + location source in node popups (chat &amp; map), migration 124</li>
<li><strong>#4187</strong> — "Message anyway" override for unmessageable-node DM banner</li>
<li><strong>#4186</strong> — Automation: remote-admin reboot target for the device-reboot action</li>
<li><strong>#4196</strong> — Show short name alongside long name on message senders (Unified Messages)</li>
<li><strong>#4182</strong> — Honor the "Discard invalid positions" toggle on the render side</li>
<li><strong>#4181</strong> — Occupancy-log-scaled, distance-capped precision offset for obscured nodes</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><strong>#4197</strong> — MeshCore: own node's messages show the name, not a public key</li>
<li><strong>#4191</strong> — v1 <code>default</code> source alias deep-scopes by the resolved id (mergeParams re-derivation)</li>
<li><strong>#4185</strong> — Scope the compose draft per-conversation (prevents wrong-recipient sends)</li>
<li><strong>#4184</strong> — Keep router short-name visible in the Official pin style</li>
<li><strong>#4180</strong> — Traceroute no longer sends on a DISABLED channel slot (NO_CHANNEL)</li>
<li><strong>#4175</strong> — Drop heatmap/coverage density for deleted nodes</li>
</ul>
<h2>Docs</h2>
<ul>
<li><strong>#4179</strong> — Meshview Link Responder added to the User Scripts Gallery</li>
</ul>
<p><strong>Full changelog:</strong> <a href="https://github.com/Yeraze/meshmonitor/compare/v4.13.1-rc2...v4.13.1-rc3" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/compare/v4.13.1-rc2...v4.13.1-rc3</a></p>
<h2>🚀 MeshMonitor v4.13.1-rc3</h2>
<h3>📦 Installation</h3>
<p><strong>Docker (recommended):</strong></p>
<pre><code>docker run -d \
  --name meshmonitor \
  -p 8080:3001 \
  -v meshmonitor-data:/data \
  ghcr.io/Yeraze/meshmonitor:4.13.1-rc3
</code></pre>
<h3>🧪 Testing</h3>
<p>✅ All tests passed
✅ TypeScript checks passed
✅ Docker images built for linux/amd64, linux/arm64, linux/arm/v7</p>
<h3>📋 Changes</h3>
<p>See commit history for detailed changes.</p>
]]></description>
  </item>
  <item>
    <title>SigurdOS T-Deck 0.1.45-RC7</title>
    <link>https://meshcore.ninja/firmware/sigurdos-tdeck/releases/#release-0.1.45-RC7</link>
    <guid isPermaLink="false">firmware-SigurdOS T-Deck-0.1.45-RC7</guid>
    <pubDate>Sat, 18 Jul 2026 09:27:15 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p><strong>SigurdOS T-Deck Firmware</strong> — beta-0.1.45-RC7</p>
<p>Release candidate 7 for the beta-0.1.45 cycle. 181 commits since beta-0.1.44-RC6.</p>
<h3>Flash with esptool</h3>
<pre><code># Full flash (first install):
esptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin

# App update (keep settings):
esptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x10000 firmware.bin
</code></pre>
<h3>Web Flasher</h3>
<p>Use <code>manifest.json</code> with <a href="https://espressif.github.io/esptool-js/" target="_blank" rel="noopener noreferrer">esptool.js</a>.</p>
<table>
<thead>
<tr>
<th>File</th>
<th>Use</th>
</tr>
</thead>
<tbody><tr>
<td><code>firmware.bin</code></td>
<td>App only (flash at 0x10000)</td>
</tr>
<tr>
<td><code>firmware-merged.bin</code></td>
<td>Full flash (flash at 0x0)</td>
</tr>
<tr>
<td><code>SigurdOS-tdeck-launcher.bin</code></td>
<td>For bmorcelli/Launcher install</td>
</tr>
<tr>
<td><code>manifest.json</code></td>
<td>Web flasher manifest</td>
</tr>
<tr>
<td><code>sigurdos-tdeck-bootloader.bin</code></td>
<td>Bootloader (web flasher)</td>
</tr>
<tr>
<td><code>sigurdos-tdeck-partitions.bin</code></td>
<td>Partitions (web flasher)</td>
</tr>
<tr>
<td><code>sigurdos-tdeck-boot_app0.bin</code></td>
<td>Boot app0 (web flasher)</td>
</tr>
</tbody></table>
<h3>Features</h3>
<ul>
<li>Companion protocol: binary peer requests (CMD_SEND_BINARY_REQ), anonymous requests (CMD_SEND_ANON_REQ), zero-hop control data (CMD_SEND_CONTROL_DATA), direct raw data (CMD_SEND_RAW_DATA)</li>
<li>UI: message detail sheet, contact list power tools, bounded field notifications, timestamped repeater CLI transcripts</li>
<li>GPS: demand-driven polling with time sync</li>
<li>Mesh: surface repeater session failures</li>
<li>CI: dependency scanning, CodeQL analysis gates, release evidence enforcement</li>
<li>Performance: virtualized message/packet lists, bounded sparse tile loading</li>
<li>Storage: unified message history store</li>
</ul>
<h3>Fixes</h3>
<ul>
<li>Companion/BLE: install private flood-scope keys, synchronize BLE callback/app state, BLE RX queue backpressure, time out unauthenticated connections, defer BLE init until enabled, migrate stale prefs, update pairing PIN, preserve CLI data semantics, accept time unconditionally, enable BLE by default, page full companion backlog, gate repeat by radio profile, align async push IDs</li>
<li>Mesh: clear login sessions on identity import, ACK drop counter, require durable mesh mutation commits, scoped flood interop proof, update MeshCore for race-free ISR, reject oversized hashtag names, preserve UTF-8 message boundaries</li>
<li>UI: restore textarea date/time inputs, accumulate home grid offsets, bound textarea inputs, route nested screens through nav history, free QR canvas on screen delete, always show repeater login status</li>
<li>System: clamp snprintf buffer (CodeQL), make deep sleep persistence-safe, OTA boot-health rollback, fail closed for GitHub OTA channels, support unknown-size multipart OTA, preflight/bound PNG tile decoding, handle HAL allocation failures</li>
<li>Build/CI: add -Wall -Wextra, expand sanitizer suite, compile every firmware env, reject stale warning budgets, pin transitive deps, consolidate PlatformIO cache, regenerate dep lock file</li>
<li>GPS: route RTC sync through tracked clock sources, preserve mesh clock handoff</li>
<li>SD: de-assert non-SD CS pins before mount</li>
<li>Various: encode advert path responses safely, validate NMEA semantics, complete message store recovery, expire pending binary requests, update companion delivery state, reject oversized companion pushes, wrap map tiles at antimeridian, propagate NVS write failures, decode trace SNR correctly, validate encoded path lengths</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Reconcile companion support and missing-features status with pinned MeshCore</li>
<li>Refresh README, screen guides, ROADMAP, FEATURES_OVERVIEW, Launcher docs</li>
<li>Add Noto Emoji license notice</li>
<li>Document companion message visibility limitation</li>
</ul>
<h3>Hardware Tested (beta-0.1.45-RC7)</h3>
<ul>
<li>Native tests: 1219/1220 passed</li>
<li>Production build: RAM 39.3%, Flash 40.0%</li>
<li>T-Deck boot verified: radio 869.525 MHz, noise floor -94 dBm</li>
<li>All 12 screens navigate without crashes</li>
<li>Soak: 420 seconds idle, zero crashes, heap stable at 146,808</li>
<li>RF transmission confirmed on #testingslopos</li>
<li>CI pre-existing: dep hash + golden frame pin fixed; remaining 2 test infra issues pre-date this release</li>
</ul>
<h3>Evidence</h3>
<p>Release evidence: <code>release-evidence/beta-0.1.45-RC7.json</code></p>
]]></description>
  </item>
  <item>
    <title>MeshCore mishmesh 1.1.0</title>
    <link>https://meshcore.ninja/firmware/meshcore-mishmesh/releases/#release-1.1.0</link>
    <guid isPermaLink="false">firmware-MeshCore mishmesh-1.1.0</guid>
    <pubDate>Fri, 17 Jul 2026 20:44:45 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<ul>
<li>Configurable path hash size, in Experimental settings.</li>
<li>System Info now shows the node's public key.</li>
<li>Piezo buzzer tone tuning.</li>
<li>Release firmware filenames now encode both versions:
<code>&lt;env&gt;_mm-&lt;mm&gt;_mc-&lt;mc&gt;-&lt;hash&gt;</code>.</li>
<li>Fix: empty preference file no longer causes a load error.</li>
<li>Fix: multibyte path hashes are now stored and displayed correctly.</li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>Fix multibyte path hash handling in MishMesh by @Bjorkan in <a href="https://github.com/burakcan/MeshCore-mishmesh/pull/9" target="_blank" rel="noopener noreferrer">https://github.com/burakcan/MeshCore-mishmesh/pull/9</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li>@Bjorkan made their first contribution in <a href="https://github.com/burakcan/MeshCore-mishmesh/pull/9" target="_blank" rel="noopener noreferrer">https://github.com/burakcan/MeshCore-mishmesh/pull/9</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/burakcan/MeshCore-mishmesh/compare/mishmesh-v1.0.0...mishmesh-v1.1.0" target="_blank" rel="noopener noreferrer">https://github.com/burakcan/MeshCore-mishmesh/compare/mishmesh-v1.0.0...mishmesh-v1.1.0</a></p>
]]></description>
  </item>
  <item>
    <title>MeshCore Solo 1.23</title>
    <link>https://meshcore.ninja/firmware/meshcore-solo/releases/#release-1.23</link>
    <guid isPermaLink="false">firmware-MeshCore Solo-1.23</guid>
    <pubDate>Fri, 17 Jul 2026 20:17:33 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h2>MeshCore Solo Companion Firmware v1.23</h2>
<h3>What's new</h3>
<ul>
<li><strong>Nodes is now the single node hub.</strong> "Nearby Nodes" is renamed <strong>Nodes</strong> and gains on-device contact management — no phone app needed: <strong>Hold Enter</strong> on a row opens <strong>Add contact</strong> (for a scanned-but-unknown node), <strong>Favourite/Unfavourite</strong> (pins to the first free Favourites Dial slot, shown as a star in the list), and <strong>Delete contact</strong> (confirm first, defaults to Cancel). The filter strip (<strong>LEFT/RIGHT</strong>) is now a visible, wraparound tab carousel instead of a hidden mode. The old read-only <strong>Recent adverts</strong> home page is retired — its passively-heard nodes now simply show up in the Nodes list (All filter) — so there's one list instead of two.</li>
<li><strong>On-device channel management.</strong> Messages › Channels gets a <strong>"+ Add channel"</strong> row and per-channel <strong>Edit</strong>/<strong>Delete</strong> — no phone app required. Adding a channel now starts with a <strong>type picker</strong>, matching the phone app: <strong>Public</strong> (re-adds the well-known default channel, no typing needed), <strong>Hashtag</strong> (type just a topic name, e.g. <code>test</code> — the channel name and secret are both derived from it, same convention as the app's <code>#topic</code> channels), or <strong>Private</strong> (manual Name + Secret, typing either a passphrase hashed to the channel secret, or the exact 32-hex-character key from a channel QR code).</li>
<li><strong>Tools › Admin — administer a remote repeater/room from the device.</strong> Log into a node you have admin rights on (same self-healing saved-password handshake as room logins) and browse its settings in category tabs — <strong>System</strong> (name, owner info), <strong>Radio</strong> (Frequency/Bandwidth/Spreading factor/Coding rate/TX power), <strong>Routing</strong> (Repeat/Advert interval/Flood advert interval/Max hops), <strong>Actions</strong> (reboot, send advert, sync clock, …) — plus a free-text <strong>Custom command…</strong> escape hatch (with <strong>{}</strong>-key command-name completion) for anything not covered. Radio and Routing fields use a type-appropriate editor instead of raw text — a digit-cursor for Frequency (the same widget Settings' own Radio screen uses locally), discrete-set stepping for Bandwidth/Spreading factor/Coding rate, plain number steppers for the rest, and an ON/OFF toggle for Repeat — adjusting a value costs no mesh traffic until you actually confirm it with <strong>Enter</strong> (<strong>Cancel</strong> sends nothing). Reachable either from <strong>Tools › Admin</strong> (opens the same Nodes list to pick a target) or directly via a repeater/room's own <strong>Hold Enter › Admin</strong> action.</li>
<li><strong>Auto-Reply Bot gains a third target: room servers</strong>, alongside DM and Channel, with its own trigger/reply/commands — the screen is redesigned as a circular tab carousel (<strong>Direct/Channel/Room/Other</strong>, <strong>LEFT/RIGHT</strong> to switch, <strong>UP/DOWN</strong> within a tab) instead of one long list. Each target's <strong>Enable</strong> and <strong>Commands</strong> toggle is now fully independent (they used to secretly share the DM tab's setting for Channel/Room too). New <code>{name}</code>/<code>{hops}</code> reply placeholders, a DM allow-list (all chat contacts or favourites only), and a dedicated stepper for Quiet Hours.</li>
<li><strong>Keyboard: accent popup, selectable main script, better editing.</strong> Holding <strong>Enter</strong> on a Latin letter with accented variants (<code>a c d e i l n o r s t u y z</code>) now opens a one-row popup of that letter's accents — e.g. holding <code>a</code> offers <code>á à â ã ä å ą</code> — covering every European Latin-diacritic letter (Polish, Czech, Slovak, German, French, Spanish, Portuguese, Nordic, …) from one popup instead of a separate page per language. <strong>Settings › Keyboard</strong> splits <strong>Alphabet</strong> into <strong>Main</strong> and <strong>Additional</strong>: Main picks which script (Latin/Cyrillic/Greek) the keyboard opens on by default, Additional picks the second one reached via the <strong>#@/abc</strong> cycle key — so a Cyrillic or Greek typist can make their own script the default instead of always landing on Latin first. Shift is now <strong>one-shot</strong> by default (capitalises just the next letter; <strong>Hold Enter</strong> on Shift toggles the old sticky caps-lock back on), <strong>Hold Enter</strong> on Backspace clears the whole field, and <strong>UP</strong> from th
…</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshMonitor 4.13.1-rc2</title>
    <link>https://meshcore.ninja/software/meshmonitor/releases/#release-4.13.1-rc2</link>
    <guid isPermaLink="false">software-MeshMonitor-4.13.1-rc2</guid>
    <pubDate>Fri, 17 Jul 2026 20:04:07 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h1>MeshMonitor v4.13.1-rc2</h1>
<blockquote>
<p>⚠️ <strong>Pre-release (release candidate).</strong> For testing ahead of the 4.13.1 final. No <code>:latest</code> Docker tags are published for RC builds.</p>
</blockquote>
<p>This RC is a <strong>Map Analysis release</strong>: it lands the full <strong>Terrain Link Profile</strong> tool and a wave of map-accuracy improvements on top of <code>v4.13.1-rc1</code>. Plan a link between two points and MeshMonitor now profiles the terrain between them, draws the Fresnel zone, computes a link budget, and colors a clear/marginal/obstructed verdict — with per-source auto-frequency and RX-sensitivity defaults. As you scrub the elevation graph, a marker now tracks the matching spot on the map so you can see exactly where a given point on the profile sits. Obscured-GPS (reduced <code>precision_bits</code>) markers are now decluttered intelligently — a node alone in its accuracy cell stays centered, and only nodes that actually share a cell are spread — applied consistently across the Dashboard, Nodes, and Map Analysis maps from one shared implementation. Position quality also got a hard look: Null Island (0,0) fixes are now rejected on ingest across Meshtastic, MeshCore, and MQTT (including the precision-obscured (0,0) fixes that used to slip through as ~0.013°), with a new <strong>Discard invalid positions</strong> Map setting to control it. The Map Analysis toolbar was tidied into icons (labels move to tooltips) to cut clutter, MQTT-sourced direct messages now render in the DM view instead of as broadcasts, and several map layers stopped drawing artifacts for marker-less nodes. Internally, the CI pipeline's Node-24 coverage hang was eliminated so future builds are faster and don't wedge.</p>
<h2>✨ Features</h2>
<ul>
<li><strong>Terrain Link Profile tool</strong> — profile terrain, Fresnel clearance, and link budget between two points, with clear/marginal/obstructed verdict coloring, per-source auto-frequency + RX-sensitivity defaults, DEM-void handling, and a settings UI (#4147, #4151)</li>
<li><strong>Link Profile graph → map hover marker</strong> — moving the cursor over the elevation graph drops a marker on the map at the corresponding geographic point along the link (#4170)</li>
<li><strong>Smarter obscured-node decluttering</strong> — the within-cell offset for low-<code>precision_bits</code> markers now only spreads nodes that actually share an accuracy cell; a lone node stays at its reported center (#4164, closes #4155)</li>
<li><strong>Discard invalid positions</strong> — a new global Map setting to control whether Null Island / invalid GPS fixes are discarded on ingest (default on = current behavior) (#4158)</li>
<li><strong>Icon toolbar for Map Analysis</strong> — action and layer buttons are now icons with the text as tooltip/aria-label, decluttering the top bar (#4171)</li>
</ul>
<h2>🐛 Bug Fixes</h2>
<ul>
<li>Reject <strong>precision-obscured Null Island</strong> fixes on Meshtastic ingest — a true-(0,0) node on a reduced-precision channel arrives re-centered as ~(0.013°, 0.013°) and used to slip past the filter (#4149, #4150, #3763)</li>
<li>Route <strong>MQTT-sourced direct messages</strong> to the DM view instead of rendering them as channel/broadcast messages (#4161, closes #4152)</li>
<li>Stop drawing <strong>route segments &amp; heatmap density</strong> for marker-less (position-stripped) nodes (#4167, closes #4162 / #4163)</li>
<li>Pin the <strong>SNR overlay</strong> dots to the merged marker position for multi-source nodes (#4169, closes #4166)</li>
</ul>
<h2>♻️ Refactoring</h2>
<ul>
<li>Consolidate the obscured-GPS within-cell offset into <strong>one shared occupancy-gated implementation</strong> used by every map surface — no more per-map "snowflake" behavior (#4168)</li>
</ul>
<h2>🔧 CI / DevOps</h2>
<ul>
<li>Remove the unused coverage/Codecov runner that <strong>hung <code>@vitest/coverage-v8</code> for 30+ min on Node 24</strong>, repeatedly blocking merges — CI is now faster and hang-free (#4172)</li>
</ul>
<h2>📝 Docs</h2>
<ul>
<li>Link Profile documentation accuracy pass — multi-source auto-frequency, REST API reference, anchor fixes (#4156)</li>
</ul>
<h2>Issues Resolved</h2>
<p>#4111 (Terrain Link Profile epic — Phases 2 &amp; 3) · #3763 (Null Island filtering) · #4152 (MQTT directed-message rendering) · #4155 (lone-node offset) · #4162 · #4163 · #4166</p>
<h2>Upgrade Notes</h2>
<p>No breaking changes and no manual migration
…</p>
]]></description>
  </item>
  <item>
    <title>Wadamesh beta_46</title>
    <link>https://meshcore.ninja/firmware/wadamesh/releases/#release-beta_46</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_46</guid>
    <pubDate>Thu, 16 Jul 2026 20:42:03 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p><strong>wadamesh beta_46 — now the stable release.</strong> This promotes beta_46 to stable; below is everything since the previous stable (<strong>beta_45</strong>).</p>
<blockquote>
<p>✅ Stable channel. Install via the <a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">web flasher</a> (Stable), the LauncherHub <strong>WADAMESH</strong> entry, or a <code>-merged.bin</code> below. Newer test builds live on the Beta channel.</p>
</blockquote>
<p>🙏 <strong>Community contribution:</strong> huge thanks to <strong><a href="https://github.com/codemonkeybr" target="_blank" rel="noopener noreferrer">@codemonkeybr</a></strong> (Tesso Codemonkey) for the <strong>Do Not Disturb</strong> feature (originally <a href="https://github.com/ALLFATHER-BV/wadamesh/pull/156" target="_blank" rel="noopener noreferrer">#156</a>).</p>
<h2>🛠 Fixed</h2>
<ul>
<li><strong>Contacts no longer go missing between reboots on microSD devices.</strong> Saves are now <strong>atomic</strong> — written to a temp file and swapped in only once fully written — so an interrupted write can never truncate your contact list, and the card is mounted far more reliably at boot. <em>(If you've ever lost repeaters/contacts overnight, this is the fix — update to it.)</em></li>
<li><strong>Heltec V4-R8</strong> — the microSD card now mounts, and the freeze when waking the device from sleep is fixed.</li>
<li><strong>LilyGo T-Pager</strong> — the map no longer shows a "storage error" under the launcher; it now caches tiles to the microSD card (like the T-Deck).</li>
<li><strong>Heltec V4 (portrait)</strong> — the Bluetooth icon no longer overlaps the clock, and control-center buttons no longer clip when tapped.</li>
</ul>
<h2>✨ New</h2>
<ul>
<li><strong>Redesigned control center</strong> — round quick-toggle buttons that spread to fill the panel, a frosted-glass look, real lock/bell glyphs, and a confirmation popup on every toggle.</li>
<li><strong>Do Not Disturb</strong> <em>(by @codemonkeybr, <a href="https://github.com/ALLFATHER-BV/wadamesh/pull/156" target="_blank" rel="noopener noreferrer">#156</a>)</em> — set quiet hours in <strong>Settings → Sound</strong> to silence the incoming-message chime during a daily window, with a bell in the status bar while it's active. Plus a matching control-center quick-toggle (a bell that gains a slash while quiet hours are on).</li>
</ul>
<h2>📦 Boards</h2>
<p>T-Deck · Heltec V4 TFT · Heltec V4-R8 · ThinkNode M9 · RAK TAP v2 · T-LoRa Pager (LR1121 / SX1262) · T-Display P4. Flash <code>&lt;board&gt;-merged.bin</code> at <code>0x0</code> (full install) or <code>&lt;board&gt;.bin</code> for an app-only/OTA update.</p>
]]></description>
  </item>
  <item>
    <title>LusoFW 2026.7.2-rc2-e56877e</title>
    <link>https://meshcore.ninja/firmware/lusofw/releases/#release-2026.7.2-rc2-e56877e</link>
    <guid isPermaLink="false">firmware-LusoFW-2026.7.2-rc2-e56877e</guid>
    <pubDate>Thu, 16 Jul 2026 20:10:13 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>Automated dev prerelease of dev@e56877e for v2026.7.2-rc2.</p>
<p>Based on MeshCore v1.16.0
main@e8d3c53ba1ea863937081cd0caad759b832f3028</p>
<h3>Correções</h3>
<ul>
<li>CLIENTE: A página inicial do GPS agora fica oculta no carrossel quando nenhum GPS é detectado na porta série no arranque, em vez de aparecer sempre quando <code>ENV_INCLUDE_GPS</code> está ativado.</li>
<li>REPETIDOR: Corrigido envio de anúncios por inundação (flood adverts): agora respeita o <code>default_scope</code> e o modo de hash de caminho (<code>path_hash_mode</code> nas preferências).</li>
<li>REPETIDOR: Removida a redução probabilística de flood adverts.</li>
<li>REPETIDOR: Corrigido um <em>buffer overflow</em> no acumulador de comandos série.</li>
</ul>
<h4>Melhorias</h4>
<ul>
<li>CLI: Adicionada a leitura do motivo de arranque do ESP32 (<code>get pwrmgt.bootreason</code>).</li>
<li>CLI: Reforçada a cópia segura de strings no tratamento de comandos.</li>
<li>RÁDIO: Ajustado o atraso de retentativa CAD para intervalo entre 120 a 360 ms.</li>
</ul>
<h4>Observabilidade</h4>
<ul>
<li>DISPATCHER: Adicionados logs de debug para conclusão de TX.</li>
<li>ESTATÍSTICAS: Removidos parâmetros não usados na formatação de respostas.</li>
</ul>
<h4>Build e Configuração</h4>
<ul>
<li>BUILD: Adicionada a variável <code>DISABLE_DEBUG</code> ao processo de build.</li>
<li>BUILD: Reorganizadas as build flags no platformio.ini.</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshMonitor 4.13.1-rc1</title>
    <link>https://meshcore.ninja/software/meshmonitor/releases/#release-4.13.1-rc1</link>
    <guid isPermaLink="false">software-MeshMonitor-4.13.1-rc1</guid>
    <pubDate>Thu, 16 Jul 2026 17:43:14 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h1>MeshMonitor v4.13.1-rc1</h1>
<blockquote>
<p>⚠️ <strong>Pre-release / Release Candidate.</strong> This build is for testing. It ships no <code>:latest</code> Docker tags. Please report any issues before the final 4.13.1 release.</p>
</blockquote>
<h2>Summary</h2>
<p>This release resolves the long-running #4115 investigation where specific nodes produced zero data over MQTT: the geo filter is rearchitected from a fail-closed membership gate (which permanently blackholed GPS-less nodes and froze on encrypted feeds) to a fail-open, per-source ignore-list model with retroactive purge, automatic reappearance when a node comes back in-bounds, and a start/config-change sweep — shipped across four phases (#4123, #4131, #4132, #4136). A new MQTT Packet Monitor lands (per-gateway reception capture backend #4127 plus a gateway-aware UI #4138). Map and node UX improvements include lat/lon/elevation shown as text in Node Info/Details (#4134), Show RF/UDP/MQTT transport toggles in Map Analysis (#4135), per-theme light/dark map tilesets (#4118), and a backend elevation service for upcoming terrain link profiles (#4143). Two reported bugs are fixed: nodes can now be reliably un-hidden from the map across sources (#4141), and the Conversation page explains why the DM composer is hidden for unmessageable nodes (#4140). Also fixed: a Default Map Center regression on the Unified/Dashboard map (#4128), MeshCore-only installs whose global schedulers never started (#4146), and a stale-config Docker armv7 build (#4122). Finally, two latent cross-platform bugs surfaced during release validation were fixed: a directory case-collision that broke the macOS/Windows desktop build (#4144), and a MySQL 8 collation mismatch that aborted a migration on MySQL deployments (#4145).</p>
<h2>Features</h2>
<ul>
<li><strong>MQTT geo-ignore rearchitecture (fixes #4115):</strong> fail-open ingestion with a per-source ignore list, retroactive purge, and auto-reappearance — #4123 (data layer), #4131 (fail-open gating), #4132 (retroactive sweep), #4136 (observability + docs)</li>
<li><strong>MQTT Packet Monitor:</strong> per-gateway packet reception capture — #4127 (backend), #4138 (gateway-aware UI)</li>
<li>Show latitude/longitude/elevation as text in Node Info &amp; Node Details — #4134</li>
<li>Map Analysis: Show RF / UDP / MQTT transport toggles — #4135</li>
<li>Per-theme (light/dark) map tileset preferences, including custom tiles — #4118</li>
<li>Backend elevation service for terrain link profiles (Phase 1) — #4143</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>Reliably un-hide nodes from the map across sources; consolidate orphaned rows from removed sources — #4141</li>
<li>Explain the hidden DM composer for unmessageable nodes — #4140</li>
<li>Honor the Default Map Center setting on the Unified/Dashboard map — #4128</li>
<li>Keep global schedulers alive on MeshCore-only installs — #4146</li>
<li>Migration 122: fix illegal collation mix on MySQL 8 — #4145</li>
<li>Consolidate <code>Mqtt/</code> into <code>MQTT/</code> to fix the desktop-build case-collision on macOS/Windows — #4144</li>
<li>Drop deleted watchdog scripts from the armv7 Dockerfile — #4122</li>
</ul>
<h2>Chore</h2>
<ul>
<li>Bump version to 4.13.1-rc1 — #4142</li>
</ul>
<h2>Issues Resolved</h2>
<p>#4115, #4137, #4139, #4130, #4129, #4125, #4124, #4096, #4020</p>
<p><strong>Full changelog:</strong> <a href="https://github.com/Yeraze/meshmonitor/compare/v4.13.0...v4.13.1-rc1" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/compare/v4.13.0...v4.13.1-rc1</a></p>
<h2>🚀 MeshMonitor v4.13.1-rc1</h2>
<h3>📦 Installation</h3>
<p><strong>Docker (recommended):</strong></p>
<pre><code>docker run -d \
  --name meshmonitor \
  -p 8080:3001 \
  -v meshmonitor-data:/data \
  ghcr.io/Yeraze/meshmonitor:4.13.1-rc1
</code></pre>
<h3>🧪 Testing</h3>
<p>✅ All tests passed
✅ TypeScript checks passed
✅ Docker images built for linux/amd64, linux/arm64, linux/arm/v7</p>
<h3>📋 Changes</h3>
<p>See commit history for detailed changes.</p>
]]></description>
  </item>
  <item>
    <title>ZephCore 1.16.5-zephcore</title>
    <link>https://meshcore.ninja/firmware/zephcore/releases/#release-1.16.5-zephcore</link>
    <guid isPermaLink="false">firmware-ZephCore-1.16.5-zephcore</guid>
    <pubDate>Thu, 16 Jul 2026 17:38:21 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h1>ZephCore 1.16.5-zephcore</h1>
<blockquote>
<p>[!IMPORTANT]</p>
<h2>Before you upgrade</h2>
<p><strong>ESP32-S3 / ESP32-C boards — one-time serial reflash required; WiFi-OTA cannot bridge this update.</strong>
This release moves the application to a new flash location (<code>0x10000</code>). A board on the old layout can't
update to this build over WiFi-OTA or the browser flasher — <strong>flash the <code>-merged.bin</code> once over USB/serial.</strong>
Affected boards: <em>Heltec V3 / V4 / V4.3, Station G2, Wireless Tracker / V2, XIAO ESP32-S3 / C3 / C6, LilyGo T-Lora C6.</em>
Your identity, contacts, channels, prefs, and BLE bonds are preserved. After this reflash, OTA and
app-updates work again.</p>
<p><strong>nRF52, classic ESP32 (T-Beam / PICO-D4 / TTGO LoRa32), STM32WL, and native Linux are unaffected</strong> — upgrade as usual.</p>
<p><strong>From v1.16.2 / v1.16.3 / v1.16.4</strong> — clean flash, no re-bond, bonds and data survive.</p>
<p><strong>From v1.16.1 or older</strong> — flash it; on first boot it clears BLE bonds automatically (identity, contacts, channels, prefs preserved). Re-bond your phone/desktop once.</p>
<p><strong>Coming from Arduino MeshCore</strong> — flash it; auto-formats on first boot (new identity, clean storage).</p>
<p>Take this with a grain of salt — try the formatters if anything anomalous happens with your node.</p>
</blockquote>
<hr />
<p>The headline of this release:
<strong>Adaptive CAD</strong>, a self-tuning listen-before-talk that calibrates itself to each site;
<strong>V-Contact</strong>, an in-app admin "channel" for companions; and a batch of LoRa-driver reliability fixes.</p>
<h2>Highlights</h2>
<h3>Fixed: ESP32 WiFi-OTA silently reverted — upload hit 100%, then booted the <em>old</em> firmware</h3>
<p>On ESP32-S3 / ESP32-C boards, the app and MCUboot bootloader were using different flash partition tables,
so each OTA update landed at an address the bootloader never checked. Every upload "succeeded" and then
quietly did nothing. Both images now share one partition map, and OTA works correctly. (The XIAO C3/C6 and
T-Lora C6 used the stock layout and were never affected.)</p>
<h3>ESP32 app slot moved to <code>0x10000</code></h3>
<p>The ESP32 app slot moved from <code>0x20000</code> to <code>0x10000</code> — matching the Arduino / ESP-IDF offset. This is the
change that fixes OTA above, and it also enables the configurator's fast <strong>app-only update</strong> (rewrites just
the app, keeps your settings). Requires the one-time serial reflash (see <em>Before you upgrade</em>).</p>
<h3>New: Adaptive CAD — listen-before-talk that tunes itself to your site</h3>
<p>Every transmission is preceded by a Channel Activity Detection (CAD) check that listens for other LoRa
traffic and holds off if the channel is busy. How sensitive that check is has always been a single
hardcoded number — but the right value depends on where the node lives. A quiet valley node and a
50-network hilltop need very different thresholds: too sensitive and the node keeps deferring for phantom
traffic (wasted airtime, latency); not sensitive enough and it transmits over real packets (collisions).</p>
<p>Nodes now <strong>measure their own RF environment and adjust automatically</strong>. In the background, between
transmissions, the radio runs short calibration probes, tracks how often each sensitivity level produces a
false "busy", and settles on the lowest false-positive threshold for <em>that</em> site — responding to a
changing environment within an hour or two. It runs on repeaters and companions, and it is <strong>on by
default</strong>; there is nothing to configure.</p>
<ul>
<li><code>get cad</code> — watch what it's doing: the current threshold and per-level false-positive statistics.</li>
<li><code>set cad.auto off</code> — turn off the auto-adjust to observe or hand-tune with <code>set cad.offset</code>.</li>
</ul>
<p>Quiet sites end up <em>more</em> sensitive than the old fixed default (fewer stomped packets); noisy sites back
off until the false alarms stop. CAD also now uses 4 detection symbols everywhere, which improves detection
of an in-progress packet's payload (not just its preamble). Full guide, including the honest limitation
that the "missed detection" side isn't locally observable, is in
**[ADAPTIVE_CAD.md](<a href="https://github.com/liquidraver/ZephCore/blob/master/zephcore/ADAPTIVE" target="_blank" rel="noopener noreferrer">https://github.com/liquidraver/ZephCore/blob/master/zephcore/ADAPTIVE</a>
…</p>
]]></description>
  </item>
  <item>
    <title>MeshOS 1.5.9</title>
    <link>https://meshcore.ninja/software/meshos/releases/#release-1.5.9</link>
    <guid isPermaLink="false">software-MeshOS-1.5.9</guid>
    <pubDate>Thu, 16 Jul 2026 15:09:53 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<p>Smoother UI on busy meshes, chat input box fixes, WiFi and GPS toggles now respected everywhere</p>
<p>Device firmware for LilyGo T-Deck and ThinkNode M9.
Install via SD card (firmware.bin) or the in-firmware updater.</p>
<p>SHA-256:</p>
<ul>
<li>TDeck: 2f9f587f41fc751e8f91900772f000c2aa1ef68eefd585bd604d407b2341a9d2</li>
<li>M9: a58f9a8b5cf2516022c26c8075d52ed97896c245945da519eeca40cd3c6420e7</li>
</ul>
]]></description>
  </item>
  <item>
    <title>Wadamesh beta_45</title>
    <link>https://meshcore.ninja/firmware/wadamesh/releases/#release-beta_45</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_45</guid>
    <pubDate>Wed, 15 Jul 2026 18:52:36 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p><strong>wadamesh beta_45 — now the stable release.</strong> This promotes beta_45 to stable; below is everything that landed since the previous stable (<strong>beta_40</strong>).</p>
<blockquote>
<p>✅ Stable channel. Install via the <a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">web flasher</a> (Stable), the LauncherHub <strong>WADAMESH</strong> entry, or a <code>-merged.bin</code> below. Newer test builds live on the Beta channel.</p>
</blockquote>
<p>🙏 <strong>Community:</strong> big thanks to <strong><a href="https://github.com/codemonkeybr" target="_blank" rel="noopener noreferrer">@codemonkeybr</a></strong> for the entire <strong>LilyGo T-LoRa Pager</strong> port (<a href="https://github.com/ALLFATHER-BV/wadamesh/pull/149" target="_blank" rel="noopener noreferrer">#149</a>).</p>
<h2>✨ Control wadamesh from a browser (over Wi-Fi — no app, account or cloud)</h2>
<ul>
<li><strong>Web control panel</strong> — run the device from a phone or laptop browser: full <strong>Chats, Contacts, Discovered, Terminal and Settings</strong> tabs, served by the device itself. Turn on the <strong>VNC</strong> app, then open <code>http://&lt;device-ip&gt;:8765/</code> on the same network.</li>
<li><strong>VNC</strong> mirrors the live screen and lets you drive it; <strong>REMOTE</strong> renders the whole UI at a larger, browser-friendly resolution with a Rotate button for desktop/phone layouts.</li>
<li>Web <strong>Contacts</strong> (search/sort/filter, distance + last-heard, per-contact actions, one-tap "Add" for Discovered nodes) and <strong>Chats</strong> (arrival pop-ups + beep, auto-refresh, acks + repeats-heard on messages you send from the browser).</li>
</ul>
<h2>🌐 On-device web browser + links in chat</h2>
<ul>
<li>New <strong>"Web" app</strong> (8 MB boards — T-Deck, Tanmatsu): open a URL and read the page as plain readable text — no proxy, tracking, JS or images — with tappable links and back/forward/refresh.</li>
<li><strong>Links in chat are tappable</strong> — "Open in web", or "Create QR" to scan the link onto your phone (works on every board, incl. the Heltec V4).</li>
</ul>
<h2>📟 New boards</h2>
<ul>
<li><strong>LilyGo T-LoRa Pager</strong> (ESP32-S3) — QWERTY + rotary-encoder handheld, no touchscreen; both radio variants (LR1121 / SX1262). <em>(by @codemonkeybr, #149)</em></li>
<li><strong>LilyGo T-Display P4</strong> (ESP32-P4) — AMOLED touchscreen handheld. Early port ("partially supported"): mesh, chat, map, GPS, phone-app companion work; BT pairing unavailable (stock coprocessor limit — use Wi-Fi/USB).</li>
<li><strong>Heltec V4-R8</strong> (8 MB PSRAM + Expansion Kit V2 microSD) — "partially supported" while hardware testing finishes.</li>
</ul>
<h2>🛠 Fixed</h2>
<ul>
<li><strong>Heltec V4</strong> map tiles now fill the whole map (2 MB-PSRAM tile-pool fix), and web/tile fetching is more resilient under memory pressure.</li>
<li><strong>Heltec V4-R8</strong> random hard-freezes (shared-I2C bus wedge) fixed.</li>
<li><strong>Tanmatsu / keyboard-only boards</strong> — the Wi-Fi name + password fields are selectable/editable again.</li>
<li><strong>T-Display P4</strong> clock sets over Wi-Fi even where NTP is blocked; no more stuck bad-date.</li>
<li><strong>French (AZERTY)</strong> on-screen keyboard spacebar restored in the normal letter view.</li>
<li><strong>REMOTE</strong> works on the Heltec V4 (and 2 MB boards); keyboard-less boards leave it by holding the screen ~3 s, and the web page has an "Exit remote" button.</li>
</ul>
<h2>📦 Boards</h2>
<p>T-Deck · Heltec V4 TFT · Heltec V4-R8 · ThinkNode M9 · RAK TAP v2 · T-LoRa Pager (LR1121 / SX1262) · T-Display P4.</p>
]]></description>
  </item>
  <item>
    <title>MeshMonitor 4.13.0</title>
    <link>https://meshcore.ninja/software/meshmonitor/releases/#release-4.13.0</link>
    <guid isPermaLink="false">software-MeshMonitor-4.13.0</guid>
    <pubDate>Wed, 15 Jul 2026 18:35:53 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h1>MeshMonitor v4.13.0</h1>
<p>MeshMonitor 4.13.0 is the largest release of the 4.x line, stabilized through three release candidates. The headline is the <strong>Map Consolidation epic</strong>: every map surface — Dashboard, Nodes, Map Analysis, MeshCore, Unified, and embeds — now shares one rendering core, one layer library, and one popup family, so features and fixes land everywhere at once. On top of that come node selection and Follow mode, a distance-measurement tool, a polar grid overlay, and a long list of map interaction fixes. MeshCore gains message delete/purge, automatic send retries, Auto-Pathfinding target filtering, a configurable CLI timeout, and a completed Virtual Node command surface. Automations pick up multi-channel triggers, a scheduled device-reboot action, and per-source tapback routing. The long-standing "low-battery alerts silently never fire" bug — reported five separate times — is fixed at its root. Under the hood, a major architecture remediation unified the source-manager registry, moved fresh installs to migration-replay bootstrap, and deleted the legacy synchronous database API. Three deliberate breaking changes ship in this release: auto-upgrade is retired, <code>TRUST_PROXY</code> defaults to <code>false</code>, and source-scoped API endpoints require an explicit <code>sourceId</code> — see Upgrade Notes below. Docker users: <code>:latest</code> now only moves on stable releases like this one; RCs publish to <code>:dev</code>.</p>
<p>📖 <a href="https://yeraze.github.io/meshmonitor/blog/2026-07-15-v4.13.0-release" target="_blank" rel="noopener noreferrer">Release announcement</a> · <a href="https://github.com/Yeraze/meshmonitor/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer">Full changelog</a></p>
<h2>Features</h2>
<p><strong>Maps</strong></p>
<ul>
<li>Map Consolidation epic: shared BaseMap shell, layer library, unified node-marker factory, one popup family, canonical traceroute rendering on all maps including embeds — #4049, #4051, #4057, #4060, #4064, #4065, #4066, #4067, #4068 (epic #4047)</li>
<li>Node selection, emphasis &amp; Follow mode with auto-zoom on Map Analysis — #4010, #4012 (#3788)</li>
<li>Node-to-node line-of-sight distance measurement tool on all maps — #4013 (#3636)</li>
<li>Polar grid overlay (Map Analysis, Unified, MeshCore) — #3983, #4071 (#3971)</li>
<li>Pan/zoom/spiderfy interaction polish: zoom clamp, scaled animations, zoom-gated spiderfy — #4072 (#4046)</li>
</ul>
<p><strong>MeshCore</strong></p>
<ul>
<li>Delete/purge messages: per-message, per-conversation, purge-all — #3984 (#3981)</li>
<li>Automatic DM retry via same-path + flood cadence; opt-in auto-retry for automated channel sends — #3980, #3988 (#3977, #3979)</li>
<li>Auto-Pathfinding target filtering: allowlist, name regex, last-heard, hops, signal — #4039 (#4024)</li>
<li>Configurable remote/local CLI reply timeout — #4033 (#4027), honored in VN relay via #4107</li>
<li>Virtual Node: relay status requests &amp; neighbour queries — #3991, #3993 (#3904)</li>
<li>Collapsible node list for mobile map access — #4079</li>
</ul>
<p><strong>Automation</strong></p>
<ul>
<li>Multi-channel message trigger OR-list — #3982 (#3974)</li>
<li>Scheduled device-reboot action — #4002 (#3995)</li>
<li>"Send via sources" selector on the tapback action — #3997 (#3996)</li>
</ul>
<p><strong>Other</strong></p>
<ul>
<li>UDP Broadcast network setting (<code>enabled_protocols</code>) exposed — #4113 (#4112)</li>
<li>Update-available notifications with per-deployment upgrade instructions (replaces auto-upgrade) — #4108</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>Low-battery/inactive-node alerts lost to split per-source notification preferences — #4035 (#3417, #3462, #3671, #3884, #4020); leftover <code>UNIQUE(user_id)</code> autoindex dropped — #4045 (#4044)</li>
<li>Map: popup/spiderfy decoupling + obscured-marker declutter on all maps — #4022, #4028 (#4015, #4016)</li>
<li>Map: click no longer snaps view back or freezes interaction; wheel zoom, zoom-to-node, chunk-reload self-heal — #4071, #4080, #4082, #4098</li>
<li>Map: Null Island / out-of-range positions filtered from markers and line endpoints — #4077, #4078, #4099, #4101, #4103</li>
<li>Map: ROUTER_LATE renders as repeater tower — #4076 (#4075); tileset switch no longer remounts/flickers the raster layer — #4097</li>
<li>Dashboard map: neighbor lines honor the configured map endpoint — #4055 (#4042), thanks @temalo</li>
<li>MeshCore: automation DM triggers populate
…</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshCore Cardputer-ADV 2026.7.1</title>
    <link>https://meshcore.ninja/firmware/meshcore-cardputer-adv/releases/#release-2026.7.1</link>
    <guid isPermaLink="false">firmware-MeshCore Cardputer-ADV-2026.7.1</guid>
    <pubDate>Tue, 14 Jul 2026 16:40:53 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<ul>
<li>Multiple direct message sending attempts</li>
<li>Press <code>Ctrl+T</code> to break resending</li>
<li>Press <code>Ctrl+Up</code> to insert last sent message into the text field</li>
<li>Add arrows to font</li>
<li>Fix screen not updated on new message</li>
</ul>
]]></description>
  </item>
  <item>
    <title>LusoFW 2026.7.2-rc1-f22a2ba</title>
    <link>https://meshcore.ninja/firmware/lusofw/releases/#release-2026.7.2-rc1-f22a2ba</link>
    <guid isPermaLink="false">firmware-LusoFW-2026.7.2-rc1-f22a2ba</guid>
    <pubDate>Tue, 14 Jul 2026 15:57:34 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>Automated dev prerelease of dev@f22a2ba for v2026.7.2-rc1.</p>
<p>Based on MeshCore v1.16.0
main@e8d3c53ba1ea863937081cd0caad759b832f3028</p>
<h3>Correções</h3>
<ul>
<li>CLIENTE: A página inicial do GPS agora fica oculta no carrossel quando nenhum GPS é detectado na porta série no arranque, em vez de aparecer sempre quando <code>ENV_INCLUDE_GPS</code> está ativado.</li>
<li>REPETIDOR: Corrigido envio de anúncios por inundação (flood adverts): agora respeita o <code>default_scope</code> e o modo de hash de caminho (<code>path_hash_mode</code> nas preferências).</li>
<li>REPETIDOR: Melhorada a rotina de sleep com rearmar de wake sources. (upstream v1.16.0 bug)</li>
<li>REPETIDOR: Removida a redução probabilística de flood adverts.</li>
</ul>
<h4>Melhorias</h4>
<ul>
<li>CLI: Adicionada a leitura do motivo de arranque do ESP32 (<code>get pwrmgt.bootreason</code>).</li>
<li>CLI: Reforçada a cópia segura de strings no tratamento de comandos.</li>
<li>RÁDIO: Ajustado o atraso de retentativa CAD para intervalo entre 120 a 360 ms.</li>
</ul>
<h4>Observabilidade</h4>
<ul>
<li>DISPATCHER: Adicionados logs de debug para conclusão de TX.</li>
<li>ESTATÍSTICAS: Removidos parâmetros não usados na formatação de respostas.</li>
</ul>
<h4>Build e Configuração</h4>
<ul>
<li>BUILD: Adicionada a variável <code>DISABLE_DEBUG</code> ao processo de build.</li>
<li>BUILD: Reorganizadas as build flags no platformio.ini.</li>
</ul>
]]></description>
  </item>
  <item>
    <title>mesh-client 5.23.0</title>
    <link>https://meshcore.ninja/software/mesh-client/releases/#release-5.23.0</link>
    <guid isPermaLink="false">software-mesh-client-5.23.0</guid>
    <pubDate>Tue, 14 Jul 2026 14:48:08 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h2>[v5.23.0] - 2026-07-14</h2>
<h3>Important: Reticulum contacts cleanup (one-time)</h3>
<p>If you use Reticulum and see <strong>non-contacts</strong> (peers / announce-only destinations) listed under <strong>Contacts</strong>, that comes from an earlier bug that promoted announces into the contact list. This release stops that pollution going forward, but <strong>existing bad rows are not removed automatically</strong>.</p>
<p><strong>One-time fix:</strong> App tab → <strong>Danger Zone</strong> (Reticulum) → <strong>Clear all LXMF contacts</strong>.<br />Peers stay on the Peers tab with their names; chat history is kept. Real contacts return when you message someone or use <strong>Save as contact</strong>.</p>
<hr />
<h3>Highlights</h3>
<p>Reticulum gets much more reliable LXMF DMs (delivery announces, Direct/path-aware sends, saturation hardening), a safer contacts model, faster Peers at large path-table sizes, and interface UX fixes (TCP/UDP/I2P auto-restart, copy LXMF hash, mic for voice clips). Official macOS builds can now be <strong>Developer ID signed and notarized</strong>. Chat hop badges for MeshCore and Meshtastic are fixed, packaging/smoke and long-session stability are hardened, and several flasher / i18n / BT PIN nits land with it.</p>
<h3>What's Changed</h3>
<h3>Features</h3>
<ul>
<li><strong>Apple code signing and notarization</strong> — Official macOS artifacts can be Developer ID signed and notarized when repo secrets are set; fork/local builds still skip gracefully (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/657" target="_blank" rel="noopener noreferrer">#657</a>)</li>
<li><strong>Reticulum interfaces and chat UX</strong> — Auto-restart stack after TCP/UDP/I2P/pipe (and host/port) interface changes; copy full LXMF hash from Network identity; microphone permission path for LXMF voice clips; clearer DM egress badges; DM pills promoted into the main chat row; quieter propagation sync (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/674" target="_blank" rel="noopener noreferrer">#674</a>)</li>
<li><strong>Reticulum DM path reachability</strong> — Active DM destination probe / reachability indicator when the stack is live (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/672" target="_blank" rel="noopener noreferrer">#672</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>Reticulum LXMF delivery and inbound receive</strong> — Emit LXMF delivery announces, register inbound destinations, prefer Direct/path-aware signed sends, mark stale queued rows failed (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/672" target="_blank" rel="noopener noreferrer">#672</a>)</li>
<li><strong>Reticulum contacts vs announces</strong> — Named announces no longer create contacts; App Danger Zone can clear all LXMF contacts while keeping Peers and chat (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/672" target="_blank" rel="noopener noreferrer">#672</a>)</li>
<li><strong>Reticulum under transport saturation</strong> — Path-request backoff, diagnostics for link/timeouts/<code>share_instance</code> conflicts, stuck Sending → failed, propagation-node Chat notice (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/669" target="_blank" rel="noopener noreferrer">#669</a>)</li>
<li><strong>Reticulum identity / Peers / Nomad</strong> — Restore Reticulum tab on launch; header shows Network display name; faster Peers at large tables and after announces; JSON/msgpack peer name parsing; stack restart race fixes (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/672" target="_blank" rel="noopener noreferrer">#672</a>, <a href="https://github.com/Colorado-Mesh/mesh-client/pull/666" target="_blank" rel="noopener noreferrer">#666</a>, <a href="https://github.com/Colorado-Mesh/mesh-client/pull/667" target="_blank" rel="noopener noreferrer">#667</a>)</li>
<li><strong>Reticulum chat polish</strong> — Unread badges clear after reading DMs; hop count restoration; identity/announce defaults (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/674" target="_blank" rel="noopener noreferrer">#674</a>, <a href="https://github.com/Colorado-Mesh/mesh-client/pull/667" target="_blank" rel="noopener noreferrer">#667</a>)</li>
<li><strong>Chat hop badges (MeshCore + Meshtastic)</strong> — Companion <code>pathLen</code> → hop count; wider raw-log correlation fallback; Meshtastic <code>viaMqtt</code> / <code>hopStart===0</code> aligned with node/diagnostics semantics (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/670" target="_blank" rel="noopener noreferrer">#670</a>)</li>
<li><strong>RNode flasher resilience</strong> — KISS command timeouts, ESP32/nRF52 stall watchdogs, BT pairing timeout, humanized errors (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/664" target="_blank" rel="noopener noreferrer">#664</a>, <a href="https://github.com/Colorado-Mesh/mesh-client/pull/665" target="_blank" rel="noopener noreferrer">#665</a>)</li>
<li><strong>Packaging / CI smoke</strong> — ZIP+DMG verification (mount before validate), AppImage extract cwd, no raw <code>.app</code> CI uploads, CodeQ
…</li>
</ul>
]]></description>
  </item>
  <item>
    <title>Fennek 2.6.5</title>
    <link>https://meshcore.ninja/firmware/fennek/releases/#release-2.6.5</link>
    <guid isPermaLink="false">firmware-Fennek-2.6.5</guid>
    <pubDate>Tue, 14 Jul 2026 11:26:25 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>feat(calibre): E-Book-Pull-Sync von Calibre-Web via OPDS</p>
<ul>
<li>Neuer Service services/calibre_books: zieht das Buecherregal "Fennek" (Shelf, Name oder ID) von Calibre-Web via OPDS und laedt neue EPUBs nach /books (Basic-Auth, Dateiname aus Content-Disposition)</li>
<li>Nur-hinzufuegend: Manifest /.fennek/calibre.tsv, max. 8 Downloads/Lauf</li>
<li>Auto-Sync vor dem Auto-Standby hoechstens alle 6 h + RTC-Back-off</li>
<li>Konsole: calibre url/user/pass/shelf/on/off/sync + Status</li>
</ul>
<p>🤖 Generated with <a href="https://claude.com/claude-code" target="_blank" rel="noopener noreferrer">Claude Code</a></p>
]]></description>
  </item>
  <item>
    <title>ZephCore 20260714.095706</title>
    <link>https://meshcore.ninja/firmware/zephcore/releases/#release-20260714.095706</link>
    <guid isPermaLink="false">firmware-ZephCore-20260714.095706</guid>
    <pubDate>Tue, 14 Jul 2026 09:57:21 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h1>ZephCore v1.16.5-zephyr</h1>
<p>(re-release because vContact caused regression in settings import / update)</p>
<blockquote>
<p>[!IMPORTANT]</p>
<h2>Before you upgrade</h2>
<p><strong>ESP32-S3 / ESP32-C boards — one-time serial reflash required; WiFi-OTA cannot bridge this update.</strong>
This release moves the application to a new flash location (<code>0x10000</code>). A board on the old layout can't
update to this build over WiFi-OTA or the browser flasher — <strong>flash the <code>-merged.bin</code> once over USB/serial.</strong>
Affected boards: <em>Heltec V3 / V4 / V4.3, Station G2, Wireless Tracker / V2, XIAO ESP32-S3 / C3 / C6, LilyGo T-Lora C6.</em>
Your identity, contacts, channels, prefs, and BLE bonds are preserved. After this reflash, OTA and
app-updates work again.</p>
<p><strong>nRF52, classic ESP32 (T-Beam / PICO-D4 / TTGO LoRa32), STM32WL, and native Linux are unaffected</strong> — upgrade as usual.</p>
<p><strong>From v1.16.2 / v1.16.3 / v1.16.4</strong> — clean flash, no re-bond, bonds and data survive.</p>
<p><strong>From v1.16.1 or older</strong> — flash it; on first boot it clears BLE bonds automatically (identity, contacts, channels, prefs preserved). Re-bond your phone/desktop once.</p>
<p><strong>Coming from Arduino MeshCore</strong> — flash it; auto-formats on first boot (new identity, clean storage).</p>
<p>Take this with a grain of salt — try the formatters if anything anomalous happens with your node.</p>
</blockquote>
<hr />
<p>The headline of this release:</p>
<h3>New: flash ZephCore from your browser — Mesh America configurator</h3>
<p>ZephCore is now a listed provider in the <strong><a href="https://apps.meshamerica.com/" target="_blank" rel="noopener noreferrer">Mesh America Device Configurator</a></strong>.
Pick your board and flash directly — companion (BLE and USB) or repeater — no toolchain, no drag-and-drop.</p>
<p><strong>Adaptive CAD</strong>, a self-tuning listen-before-talk that calibrates itself to each site;</p>
<p><strong>V-Contact</strong>, an in-app admin "channel" for companions; and a batch of LoRa-driver reliability fixes.</p>
<h2>Highlights</h2>
<h3>Fixed: ESP32 WiFi-OTA silently reverted — upload hit 100%, then booted the <em>old</em> firmware</h3>
<p>On ESP32-S3 / ESP32-C boards, the app and MCUboot bootloader were using different flash partition tables,
so each OTA update landed at an address the bootloader never checked. Every upload "succeeded" and then
quietly did nothing. Both images now share one partition map, and OTA works correctly. (The XIAO C3/C6 and
T-Lora C6 used the stock layout and were never affected.)</p>
<h3>ESP32 app slot moved to <code>0x10000</code></h3>
<p>The ESP32 app slot moved from <code>0x20000</code> to <code>0x10000</code> — matching the Arduino / ESP-IDF offset. This is the
change that fixes OTA above, and it also enables the configurator's fast <strong>app-only update</strong> (rewrites just
the app, keeps your settings). Requires the one-time serial reflash (see <em>Before you upgrade</em>).</p>
<h3>New: Adaptive CAD — listen-before-talk that tunes itself to your site</h3>
<p>Every transmission is preceded by a Channel Activity Detection (CAD) check that listens for other LoRa
traffic and holds off if the channel is busy. How sensitive that check is has always been a single
hardcoded number — but the right value depends on where the node lives. A quiet valley node and a
50-network hilltop need very different thresholds: too sensitive and the node keeps deferring for phantom
traffic (wasted airtime, latency); not sensitive enough and it transmits over real packets (collisions).</p>
<p>Nodes now <strong>measure their own RF environment and adjust automatically</strong>. In the background, between
transmissions, the radio runs short calibration probes, tracks how often each sensitivity level produces a
false "busy", and settles on the lowest false-positive threshold for <em>that</em> site — responding to a
changing environment within an hour or two. It runs on repeaters and companions, and it is <strong>on by
default</strong>; there is nothing to configure.</p>
<ul>
<li><code>get cad</code> — watch what it's doing: the current threshold and per-level false-positive statistics.</li>
<li><code>set cad.auto off</code> — turn off the auto-adjust to observe or hand-tune with <code>set cad.offset</code>.</li>
</ul>
<p>Quiet sites end up <em>more</em> sensitive tha
…</p>
]]></description>
  </item>
  <item>
    <title>Fennek 2.6.4</title>
    <link>https://meshcore.ninja/firmware/fennek/releases/#release-2.6.4</link>
    <guid isPermaLink="false">firmware-Fennek-2.6.4</guid>
    <pubDate>Tue, 14 Jul 2026 07:44:33 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>Schutznetze gegen stille Akku-Tiefentladung im Standby:</p>
<ul>
<li>Schlaf-Diagnose im RTC-RAM (Phase-Breadcrumb + Wake-Historie, beim nächsten Vollboot ins battlog)</li>
<li>Task-Watchdog um Timer-Wake-Minimalpfad (30 s) und enterStandby (60 s), Loslass-Warteschleife mit 10-s-Timeout</li>
<li>Crash-Loop-Bremse: 3 abnormale Resets in Folge → Not-Standby (nur Knopf-Wake), Crash-Boots flushen sofort auf SD</li>
<li>Tiefentladeschutz: ≤5 % auf Akku → sofort Standby, im Schlaf keine Stunden-Wakes mehr (Wecker bis 3 %)</li>
<li>GPIO42 (Tastatur-Backlight-Gate) über Deep Sleep gehalten, E-Ink-Controller vor Deep Sleep in hibernate()</li>
<li>Launcher: Kachel-Icons links + Text-Label, Lage/Gyro-App deaktiviert</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshPunk 0.2.6</title>
    <link>https://meshcore.ninja/firmware/meshpunk/releases/#release-0.2.6</link>
    <guid isPermaLink="false">firmware-MeshPunk-0.2.6</guid>
    <pubDate>Tue, 14 Jul 2026 02:01:18 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>you can now add your own fonts!
themes can have internal fonts as well.
small gps improvements
map memory fragmentation fixes</p>
]]></description>
  </item>
  <item>
    <title>MeshCore Low-Power 1.16.dev_0714</title>
    <link>https://meshcore.ninja/firmware/meshcore-lowpower/releases/#release-1.16.dev_0714</link>
    <guid isPermaLink="false">firmware-MeshCore Low-Power-1.16.dev_0714</guid>
    <pubDate>Tue, 14 Jul 2026 01:38:51 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h3>v1.16_0714</h3>
<ul>
<li><p><strong>New setting: choose whether unsynced messages are saved to flash.</strong> <em>(Companion — all platforms)</em></p>
<p>Companion → Settings → <strong>Message Persist</strong>, or CLI <code>get/set msg.persist</code>. Off by default — unsynced messages only live in RAM until the app syncs them. Turn on to also persist them to flash so they survive a crash, reboot, or dead battery before the app catches up. Turning off immediately clears any already-persisted copy from flash.</p>
<p>On NRF52 boards (T096, RAK4631), each persisted message costs one physical flash-page erase, on a small 100KB partition shared with contacts — fine for normal personal use, but sustained heavy traffic (hundreds to 1000+ msgs/day) wears against that partition's erase-cycle lifetime faster than typical usage. ESP32 boards aren't affected: SPIFFS appends into already-erased space and only erases a block during garbage collection, not on every message write.</p>
</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshMonitor 4.13.0-rc3</title>
    <link>https://meshcore.ninja/software/meshmonitor/releases/#release-4.13.0-rc3</link>
    <guid isPermaLink="false">software-MeshMonitor-4.13.0-rc3</guid>
    <pubDate>Mon, 13 Jul 2026 18:11:37 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h1>MeshMonitor v4.13.0-rc3</h1>
<blockquote>
<p>⚠️ <strong>Pre-release (Release Candidate).</strong> This build is for testing the 4.13.0 map-consolidation and MeshCore work ahead of the stable release. Not recommended for production; back up your database before upgrading.</p>
</blockquote>
<p>This release candidate builds on rc2 with a focused round of map interaction fixes and a MeshCore Virtual Node correctness fix. The map work resolves several regressions from the map-consolidation epic: click-to-pan now targets the actual node marker instead of the raw center, user gestures (zoom/pan) correctly cancel node-centering instead of snapping back and freezing, and raster tile layers no longer remount and flicker when the tileset changes. Null Island (0,0) coordinates are now filtered from both markers and line endpoints, and out-of-range/invalid node positions are detected and trimmed. Pan/zoom/spiderfy behavior was polished with a zoom clamp, scaled animations, and zoom-gated spiderfy. ROUTER_LATE nodes again render as repeater-tower icons on the NodesTab and Dashboard maps. On MeshCore, the Virtual Node login now relays the admin flag and firmware level, and the mobile node list is collapsible so the map is reachable without selecting a node. This candidate also folds in a large batch of dependency updates and a translations refresh.</p>
<h2>Features</h2>
<ul>
<li><strong>Map:</strong> pan/zoom/spiderfy interaction polish — zoom clamp, scaled animations, zoom-gated spiderfy, re-spiderfy on zoom (#4072, resolves #4046)</li>
<li><strong>MeshCore:</strong> collapsible node list — reach the map on mobile without selecting a node (#4079)</li>
</ul>
<h2>Bug Fixes</h2>
<h3>Map</h3>
<ul>
<li>Click pans to the node marker, not the raw center, for obscured nodes (#4082)</li>
<li>User gesture cancels node-centering — zoom no longer snaps back (#4098)</li>
<li>Fixed map snapping back to node on click and freezing interaction (#4080)</li>
<li>Stopped raster tile layer remounting on tileset change (abort/flicker) (#4097)</li>
<li>Detect and trim out-of-range (invalid) node positions (#4099)</li>
<li>Widen Null Island radius + skip it in the unified merge (#4077)</li>
<li>Null-island filter for line endpoints — routes + neighbors no longer run to 0,0 (#4078)</li>
<li>ROUTER_LATE renders as a repeater-tower icon on NodesTab + Dashboard maps (#4076, resolves #4075)</li>
<li>Integrate <code>resolveMapEndpoint</code> into DashboardMap neighbor lines (#4055, resolves #4042)</li>
<li>Post-epic fixes: wheel zoom, zoom-to-node, chunk-reload self-heal; MeshCore polar grid + map loading states (#4071)</li>
</ul>
<h3>MeshCore</h3>
<ul>
<li>Relay admin flag + firmware level in Virtual Node login (#4095, resolves #4094)</li>
</ul>
<h2>Translations</h2>
<ul>
<li>Translations update from Hosted Weblate (#4006)</li>
</ul>
<h2>Dependencies</h2>
<ul>
<li>Bump the production-dependencies group with 9 updates (#4084)</li>
<li>Bump the development-dependencies group with 3 updates — @types/node, eslint, vitest (#4083)</li>
<li>Bump protobufjs 8.6.6 → 8.7.0 (#4090)</li>
<li>Bump helmet 8.2.0 → 8.3.0 (#4092)</li>
<li>Bump lucide-react 1.22.0 → 1.24.0 (#4085)</li>
<li>Bump re2 1.25.0 → 1.26.0 (#4088)</li>
<li>Bump @typescript-eslint/eslint-plugin 8.62.1 → 8.63.0 (#4089)</li>
<li>Bump @typescript-eslint/parser 8.62.1 → 8.63.0 (#4087)</li>
</ul>
<h2>Issues Resolved</h2>
<ul>
<li>#4094 — MeshCore: Virtual Node functionality still does not work correctly</li>
<li>#4093 — MeshCore: Channels no longer marked unread</li>
<li>#4075 — ROUTER_LATE renders as generic pin (not repeater tower icon) on NodesTab and Dashboard maps</li>
<li>#4046 — Map UI: improve pan/zoom-to-center behavior and its interaction with marker spiderfy</li>
<li>#4042 — Dashboard Unified map: neighbor-info lines don't follow merged node marker position</li>
</ul>
<p><strong>Full changelog:</strong> <a href="https://github.com/Yeraze/meshmonitor/compare/v4.13.0-rc2...v4.13.0-rc3" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/compare/v4.13.0-rc2...v4.13.0-rc3</a></p>
<h2>🚀 MeshMonitor v4.13.0-rc3</h2>
<h3>📦 Installation</h3>
<p><strong>Docker (recommended):</strong></p>
<pre><code>docker run -d \
  --name meshmonitor \
  -p 8080:3001 \
  -v meshmonitor-data:/data \
  ghcr.io/Yeraze/meshmonitor:4.13.0-rc3
</code></pre>
<h3>🧪 Testing</h3>
<p>✅ All tests passed
✅ TypeScript checks passed
✅ Docker images built for linux/amd64, linux/arm64, linux/arm/v7</p>
<h3>📋 Changes</h3>
<p>See commit history for detailed changes.</p>
]]></description>
  </item>
  <item>
    <title>MeshOS 1.5.8</title>
    <link>https://meshcore.ninja/software/meshos/releases/#release-1.5.8</link>
    <guid isPermaLink="false">software-MeshOS-1.5.8</guid>
    <pubDate>Mon, 13 Jul 2026 16:07:20 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<p>New Control Centre: quick-settings panel with WiFi, Sound, Bluetooth and GPS toggles plus brightness and volume sliders. Persistent WiFi switch. Software updater reliability fixes.</p>
<p>Device firmware for LilyGo T-Deck and ThinkNode M9.
Install via SD card (firmware.bin) or the in-firmware updater.</p>
<p>SHA-256:</p>
<ul>
<li>TDeck: 5a7da903153d2ba4790585b1a692ad443021f85c47798afe18015ac3a7115622</li>
<li>M9: b44357a68874adc43e9b0d3a579006d8a5d7e726b61df39ce81510878dfe003b</li>
</ul>
]]></description>
  </item>
  <item>
    <title>Wadamesh beta_44</title>
    <link>https://meshcore.ninja/firmware/wadamesh/releases/#release-beta_44</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_44</guid>
    <pubDate>Mon, 13 Jul 2026 15:30:35 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p><strong>wadamesh beta_44</strong> (test channel) adds an on-device text web browser, makes links in chat tappable, and fixes the French keyboard's missing spacebar.</p>
<p>Flash it from <strong><a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">flasher.wadamesh.com</a></strong> (flip the <strong>Beta</strong> toggle), or grab a <code>-merged.bin</code> below (flash at <code>0x0</code>). On the device, beta testers can also enable <strong>Settings → Get test builds (beta)</strong>.</p>
<h2>New - on-device web browser</h2>
<p>A new <strong>Web</strong> app opens a URL and shows the page as plain, readable text - articles, wikis, docs, plain sites - right on the device. No proxy, no tracking, no JavaScript or images: just the words. Links are tappable, with back / forward / refresh.</p>
<p>The browser needs the RAM only the 8 MB boards have (T-Deck, Tanmatsu), so it is <strong>hidden on the 2 MB Heltec V4</strong> - that board can't complete an on-device HTTPS handshake.</p>
<h2>New - tappable links in chat</h2>
<p>Links in a chat now render in blue. Tap one for a small menu:</p>
<ul>
<li><strong>Open in web</strong> - loads the page in the on-device browser (8 MB boards).</li>
<li><strong>Create QR</strong> - shows a scannable QR code so you can open the link on your phone. This works on <strong>every</strong> board, including the Heltec V4 - so even where the browser isn't available, you can still bounce a link to your phone.</li>
</ul>
<h2>Fixed</h2>
<ul>
<li><strong>French (AZERTY) on-screen keyboard</strong>: the spacebar (and the OK / keyboard-switch keys) are back in the normal letter view. You no longer have to switch to the symbols page just to type a space. (A stray empty entry was cutting the keyboard map short.)</li>
<li><strong>Heltec V4</strong>: web page fetching and map tiles are more resilient when memory is tight.</li>
<li><strong>Home signal &amp; traffic box</strong>: the "tap for details" cue is back at the top of the box.</li>
</ul>
<hr />
<p>This is a <strong>test-channel</strong> (beta) build. Devices on the beta update feed will offer it; stable stays on beta_40.</p>
]]></description>
  </item>
  <item>
    <title>MeshCore One 1.2.1</title>
    <link>https://meshcore.ninja/software/meshcore-one/releases/#release-1.2.1</link>
    <guid isPermaLink="false">software-MeshCore One-1.2.1</guid>
    <pubDate>Mon, 13 Jul 2026 06:10:08 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h2>What's Changed</h2>
<ul>
<li>Debug logs are now kept locally for 7 days instead of 24 hours. Logs are kept on your device.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>Fixed an issue where a momentary gap during automatic reconnect could silently drop the radio connection until the app returned to the foreground.</li>
<li>Reduced unnecessary re-pair prompts. A brief encryption hiccup at the edge of Bluetooth range no longer tells you to re-pair a radio whose pairing still works.</li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/Avi0n/MeshCoreOne/compare/v1.2.0...v1.2.1" target="_blank" rel="noopener noreferrer">https://github.com/Avi0n/MeshCoreOne/compare/v1.2.0...v1.2.1</a></p>
]]></description>
  </item>
  <item>
    <title>MeshCore Wardrive 1.0.42</title>
    <link>https://meshcore.ninja/software/meshcore-wardrive/releases/#release-1.0.42</link>
    <guid isPermaLink="false">software-MeshCore Wardrive-1.0.42</guid>
    <pubDate>Sun, 12 Jul 2026 22:37:16 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h1>Changelog</h1>
<h2>v1.0.42 - 2026-07-12</h2>
<h3>Added</h3>
<ul>
<li><strong>Tropospheric Ducting Forecast</strong>: View 6-day VHF/UHF ducting forecast maps from dxinfocentre.com. Select from 23 global regions, scrub through 28 forecast frames (3h intervals for first 36h, 6h intervals after), pinch to zoom, and animate with playback controls. Region selection persists between sessions. Access from Settings under the Atmospheric Ducting section.</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshCore One 1.2.0</title>
    <link>https://meshcore.ninja/software/meshcore-one/releases/#release-1.2.0</link>
    <guid isPermaLink="false">software-MeshCore One-1.2.0</guid>
    <pubDate>Sun, 12 Jul 2026 22:28:15 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h2>What's Changed</h2>
<ul>
<li>Link/image preview settings are now easier to understand. Both images and link previews are now under "Show Link Content" in Chat settings.</li>
<li>Repeater neighbors can now be viewed on a map. In Telemetry &gt; Neighbors, tap "View on Map" to see a full-screen map of its neighbors and signal strength to each.</li>
<li>Message path maps now display the total hop count and path distance.</li>
<li>Map controls are now cleaner and simpler across all map screens.</li>
<li>Contact nicknames are now shown in channels</li>
<li>Visual tweaks to channel/chat/contact info pages to make them more uniform.</li>
<li>Theme aware QR code.</li>
<li>Scanning MeshCore contact QR codes with the system camera app now offers to open MC1.</li>
<li>Telemetry now shows Direct/Flood for Packet metrics. Packet graphs now show both metrics. NOTE that this will start a new chart because it graphs both direct and flood packets.</li>
<li>Opening the Nodes tab now defaults to Favorites if you have at least one favorited node.</li>
<li>In Trace Path tool, removed 10x batch option and defaulted to 3x.</li>
<li>In Trace Path tool results, now shows a percentage of successful batch traces.</li>
<li>Added a Chile community radio preset.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>Fixed sent messages not listening long enough for heard repeats</li>
<li>Fixed an "item not found on device" error when logging into a repeater whose contact was missing from the radio (for example after a backup restore or radio reset). The app now restores the contact and retries automatically.</li>
<li>You can now enter negative latitude and longitude for remote nodes, and comma decimal separators no longer break coordinate entry.</li>
<li>Remote-node coordinates and names are now validated before saving, so out-of-range values or over-long names are caught up front instead of being silently altered by the firmware.</li>
<li>Fixed incorrect centering on the message path, neighbor, and trace path maps.</li>
<li>Fixed duplicate chat messages that could appear when a repeated broadcast arrived after the previous match window.</li>
<li>Fixed inability to remove a nickname</li>
<li>Fixed Repeat Mode not enabling correctly for 869.495 Mhz</li>
<li>Fixed zero hop ping timeout being too long</li>
<li>Fixed BLE not reconnecting in the background in some situations</li>
<li>In Telemetry Neighbors, neighbors no longer have a "New" tag when they weren't actually new.</li>
<li>Fixed some website image preview cards not loading</li>
<li>Fixed Repeater Management not getting the correct TX value from repeaters running ZephCore</li>
</ul>
<h2>New Contributors</h2>
<ul>
<li>@mabahamo made their first contribution in <a href="https://github.com/Avi0n/MeshCoreOne/pull/336" target="_blank" rel="noopener noreferrer">https://github.com/Avi0n/MeshCoreOne/pull/336</a></li>
<li>@bwees made their first contribution in <a href="https://github.com/Avi0n/MeshCoreOne/pull/342" target="_blank" rel="noopener noreferrer">https://github.com/Avi0n/MeshCoreOne/pull/342</a></li>
<li>Full list of @bwees contributions:<ul>
<li><a href="https://github.com/Avi0n/MeshCoreOne/pull/342" target="_blank" rel="noopener noreferrer">https://github.com/Avi0n/MeshCoreOne/pull/342</a></li>
<li><a href="https://github.com/Avi0n/MeshCoreOne/pull/344" target="_blank" rel="noopener noreferrer">https://github.com/Avi0n/MeshCoreOne/pull/344</a></li>
<li><a href="https://github.com/Avi0n/MeshCoreOne/pull/352" target="_blank" rel="noopener noreferrer">https://github.com/Avi0n/MeshCoreOne/pull/352</a></li>
<li><a href="https://github.com/Avi0n/MeshCoreOne/pull/353" target="_blank" rel="noopener noreferrer">https://github.com/Avi0n/MeshCoreOne/pull/353</a></li>
<li><a href="https://github.com/Avi0n/MeshCoreOne/pull/354" target="_blank" rel="noopener noreferrer">https://github.com/Avi0n/MeshCoreOne/pull/354</a></li>
<li><a href="https://github.com/Avi0n/MeshCoreOne/pull/358" target="_blank" rel="noopener noreferrer">https://github.com/Avi0n/MeshCoreOne/pull/358</a></li>
<li><a href="https://github.com/Avi0n/MeshCoreOne/pull/359" target="_blank" rel="noopener noreferrer">https://github.com/Avi0n/MeshCoreOne/pull/359</a></li>
<li><a href="https://github.com/Avi0n/MeshCoreOne/pull/360" target="_blank" rel="noopener noreferrer">https://github.com/Avi0n/MeshCoreOne/pull/360</a></li>
<li><a href="https://github.com/Avi0n/MeshCoreOne/pull/361" target="_blank" rel="noopener noreferrer">https://github.com/Avi0n/MeshCoreOne/pull/361</a></li>
</ul>
</li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/Avi0n/MeshCoreOne/compare/v1.0.1...v1.2.0" target="_blank" rel="noopener noreferrer">https://github.com/Avi0n/MeshCoreOne/compare/v1.0.1...v1.2.0</a></p>
]]></description>
  </item>
  <item>
    <title>MeshOS 1.5.7</title>
    <link>https://meshcore.ninja/software/meshos/releases/#release-1.5.7</link>
    <guid isPermaLink="false">software-MeshOS-1.5.7</guid>
    <pubDate>Sun, 12 Jul 2026 17:40:58 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<p>WiFi cold-scan reliability fix and connect-dialog improvements. New map tools: drop a pin to navigate back to a saved spot, and show where the last mesh signal came from. JPG wallpaper support with large images and faster boot. Room server bug fixes.</p>
<p>Device firmware for LilyGo T-Deck and ThinkNode M9.
Install via SD card (firmware.bin) or the in-firmware updater.</p>
<p>SHA-256:</p>
<ul>
<li>TDeck: a96356b479cce107d6359546592a49e88a61782e0407e42ade909513fb47c25a</li>
<li>M9: 576925cf23254c60fa877a664116742302b4ca6d8f8474669124e1a3d5413a2d</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshPunk 0.2.5</title>
    <link>https://meshcore.ninja/firmware/meshpunk/releases/#release-0.2.5</link>
    <guid isPermaLink="false">firmware-MeshPunk-0.2.5</guid>
    <pubDate>Sun, 12 Jul 2026 16:13:08 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>This update focused on separating the app development from the firmware dev.
Only system apps live with the firmware now and other apps are found in the app library.
<a href="https://github.com/PhilMo6/meshpunk-apps" target="_blank" rel="noopener noreferrer">https://github.com/PhilMo6/meshpunk-apps</a>
The app library app can be used with wifi to download apps onto your tdeck or the sd card. the sd card is recommended since the filesystem gets erased on firmware flashing.
Only the system apps are pre installed so you will have to redownload any others you want.
Themes are also downloadable from the themes settings but the preinstalled ones are all still included.
The BLE implementation was rewritten to better work with the android app.
USB keyboard and USB thumb drive support with the correct 2 in 1 powered OTG y splitter cable 
Also includes a some error fixes and a security fix.</p>
]]></description>
  </item>
  <item>
    <title>Wadamesh beta_43</title>
    <link>https://meshcore.ninja/firmware/wadamesh/releases/#release-beta_43</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_43</guid>
    <pubDate>Sun, 12 Jul 2026 14:35:48 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p><strong>wadamesh beta_43</strong> (test channel) turns the browser control panel into a full remote app and fixes map tiles on the Heltec V4.</p>
<p>Flash it from <strong><a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">flasher.wadamesh.com</a></strong>, or grab a <code>-merged.bin</code> below (flash at <code>0x0</code>). Boards: LilyGo T-Deck and Heltec V4 TFT.</p>
<h2>New - web control panel</h2>
<p>The browser panel is now a full remote app, so you can run the device from a phone or laptop without picking up the T-Deck. Proper <strong>Chats</strong>, <strong>Contacts</strong>, <strong>Terminal</strong> and <strong>Settings</strong> tabs.</p>
<ul>
<li><strong>Contacts</strong>: search, sort and filter; each contact shows distance, coordinates and last-heard age; tap for the same actions as on the device (favourite, block, reset path, remove).</li>
<li><strong>Discovered nodes</strong> appear in the browser with a one-tap <strong>Add</strong> to save them as contacts, so you can build your whole contact list from the web app.</li>
<li><strong>Chats</strong>: pop-up notifications (with an optional beep) on a new message, and the open chat refreshes on its own as replies come in.</li>
<li><strong>Acknowledgements and repeats-heard</strong> now show for messages sent from the web app.</li>
<li>A <strong>Settings</strong> page for the everyday options that make sense remotely, including live radio changes.</li>
<li>A <strong>quick-command</strong> button in the Terminal that drops common commands into the input.</li>
</ul>
<h2>Fixed</h2>
<ul>
<li><strong>Heltec V4 map tiles</strong>: tiles downloaded but only the top of the map rendered (the rest stayed black). The 2 MB-PSRAM V4 was running out of contiguous memory for the tile grid; tiles now reuse a small fixed pool and only load what is on screen, so the whole map fills in smoothly again.</li>
<li><strong>Heltec V4 remote/VNC</strong>: typing from a physical keyboard in the browser now works (it previously only worked on the T-Deck).</li>
<li><strong>Remote-access screen</strong> on the device is clearer: the IP address is at the top, the explanation is shorter and more accurate, the toggles sit above it, and the address box only appears once remote access is on.</li>
<li><strong>Terminal <code>help</code></strong> now lists every command, on both the device and the web terminal.</li>
</ul>
<h2>Changed</h2>
<ul>
<li>The web app header shows the same signal, Wi-Fi, Bluetooth and battery icons as the device status bar, and the title reads <strong>WADAMESH</strong>.</li>
<li>Contact and chat sort/filter controls open a menu to pick an option instead of cycling on each tap.</li>
<li>New developer <strong>Tile debug overlay</strong> toggle in Map options (off by default) for diagnosing map-tile issues.</li>
</ul>
<hr />
<p>This is a <strong>test-channel</strong> (beta) build. Devices on the beta update feed will offer it; stable stays on beta_40.</p>
]]></description>
  </item>
  <item>
    <title>SigurdOS T-Deck 0.1.44-RC6</title>
    <link>https://meshcore.ninja/firmware/sigurdos-tdeck/releases/#release-0.1.44-RC6</link>
    <guid isPermaLink="false">firmware-SigurdOS T-Deck-0.1.44-RC6</guid>
    <pubDate>Sun, 12 Jul 2026 12:37:19 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p><strong>SigurdOS T-Deck Firmware</strong> — beta-0.1.44-RC6</p>
<h3>Flash with esptool</h3>
<pre><code># Full flash (first install):
esptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin

# App update (keep settings):
esptool.py --chip esp32s3 --port /dev/ttyACM0 \
  write_flash 0x10000 firmware.bin
</code></pre>
<h3>Web Flasher</h3>
<p>Use <code>manifest.json</code> with <a href="https://espressif.github.io/esptool-js/" target="_blank" rel="noopener noreferrer">esptool.js</a>.</p>
<table>
<thead>
<tr>
<th>File</th>
<th>Use</th>
</tr>
</thead>
<tbody><tr>
<td><code>firmware.bin</code></td>
<td>App only (flash at 0x10000)</td>
</tr>
<tr>
<td><code>firmware-merged.bin</code></td>
<td>Full flash (flash at 0x0)</td>
</tr>
<tr>
<td><code>SigurdOS-tdeck-launcher.bin</code></td>
<td>For bmorcelli/Launcher install</td>
</tr>
<tr>
<td><code>firmware-debug.bin</code></td>
<td>Debug build with verbose logging</td>
</tr>
<tr>
<td><code>manifest.json</code></td>
<td>Web flasher manifest</td>
</tr>
<tr>
<td><code>sigurdos-tdeck-bootloader.bin</code></td>
<td>Bootloader (web flasher)</td>
</tr>
<tr>
<td><code>sigurdos-tdeck-partitions.bin</code></td>
<td>Partition table (web flasher)</td>
</tr>
<tr>
<td><code>sigurdos-tdeck-boot_app0.bin</code></td>
<td>Boot app0 (web flasher)</td>
</tr>
<tr>
<td><code>sigurdos-tdeck-firmware.bin</code></td>
<td>App firmware (web flasher)</td>
</tr>
<tr>
<td><code>sigurdos-tdeck-full.bin</code></td>
<td>Full image (web flasher)</td>
</tr>
</tbody></table>
<h2>What's Changed</h2>
<ul>
<li>fix: safe SPIFFS init with erased-partition auto-format (closes #750) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/751" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/751</a></li>
<li>Phase 1: Switch keyboard to key mode for multi-model T-Deck compatibility (#752) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/753" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/753</a></li>
<li>Phase 2: Multi-language keyboard layout system (12 layouts) — #752 by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/754" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/754</a></li>
<li>Phase 3: I2C robustness improvements — #752 by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/755" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/755</a></li>
<li>fix: keyboard doesn't work — I2C timeout kills cold boot (#752) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/756" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/756</a></li>
<li>[codex] use C3 key mode for multi-model keyboards by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/757" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/757</a></li>
<li>[codex] Add persisted international keyboard layouts by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/758" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/758</a></li>
<li>[codex] Harden shared I2C initialization and recovery by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/759" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/759</a></li>
<li>Fork Merge: Radio profiles, diagnostics, RX-only mode, CI fixes by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/760" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/760</a></li>
<li>fix: battery -% on menu nav, cursor visibility, RSSI chart labels by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/766" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/766</a></li>
<li>fix(ci): exclude LauncherCompatibility.md from doc reference check by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/767" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/767</a></li>
<li>docs: comprehensive repository-wide audit (audit.md) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/770" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/770</a></li>
<li>fix(gps): correct GPS-to-Unix-epoch conversion (BUG-001) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/771" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/771</a></li>
<li>fix(ui): prevent dangling g_wifi_icon use-after-free (BUG-002) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/772" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/772</a></li>
<li>fix(hw): guard deep-sleep RTC-GPIO calls on non-RTC DIO1 pin (HW-001) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/773" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/773</a></li>
<li>fix(mesh): hoist sender_buf out of if-block to prevent use-after-scope (BUG-003) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/774" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/774</a></li>
<li>fix(mesh): return correct contact in processAck instead of contact[0] (BUG-004) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/775" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/775</a></li>
<li>fix: batch of low-severity fixes (HW-002, DEAD-002..004, DOC-001, BUILD-001) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/776" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/776</a></li>
<li>fix(security): add OTA PIN brute-force rate limiting (SEC-001) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/777" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/777</a></li>
<li>docs: add remediation status to audit.md (7 PRs submitted) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/778" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/778</a></li>
<li>perf(display): lazy-allocate emergency buffer, reclaim 12.8KB DRAM (PERF-
…</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshCore Low-Power 1.16.dev_0712</title>
    <link>https://meshcore.ninja/firmware/meshcore-lowpower/releases/#release-1.16.dev_0712</link>
    <guid isPermaLink="false">firmware-MeshCore Low-Power-1.16.dev_0712</guid>
    <pubDate>Sun, 12 Jul 2026 04:44:29 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h3>v1.16_0712</h3>
<ul>
<li><p><strong>New: reach Companion via mDNS hostname instead of typing an IP.</strong> <em>(Companion — WiFi transport, V3, V4, E213, E290, Wireless Paper, XIAO S3)</em></p>
<p>When connected over WiFi, the node is now reachable at <code>meshcore-xxxx.local</code> (<code>xxxx</code> = the first 2 bytes of its public key, unique per node) instead of needing to know its DHCP-assigned IP. Confirmed working with the official MeshCore app.</p>
</li>
<li><p><strong>New: unsynced messages now survive a crash or reboot.</strong> <em>(Companion)</em></p>
<p>Previously, any message received while the app wasn't connected only lived in RAM — a crash, reboot, or dead battery before the app had a chance to sync meant it was gone for good. Unsynced messages are now also saved to flash and restored automatically on boot, along with the on-device unread indicator. USB-connected companions are covered too, since USB has no reliable way to detect whether the app is actually listening — messages are saved as they arrive rather than waiting for a disconnect that may never be seen in time.</p>
</li>
<li><p><strong>New: e-ink ghost-clearing.</strong> <em>(Companion, Repeater, Room Server — E213, E290, Wireless Paper)</em></p>
<p>Each boot now runs a quick black/white flush to prevent ghosting from building up, Companion adds a <strong>Settings → Clear Ghost</strong> action for a deeper manual clean, and a static screen gets an automatic full refresh every 5 minutes of idle to prevent burn-in.</p>
</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshMonitor 4.13.0-rc2</title>
    <link>https://meshcore.ninja/software/meshmonitor/releases/#release-4.13.0-rc2</link>
    <guid isPermaLink="false">software-MeshMonitor-4.13.0-rc2</guid>
    <pubDate>Sun, 12 Jul 2026 04:36:21 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h1>MeshMonitor v4.13.0-rc2</h1>
<blockquote>
<p>⚠️ <strong>Pre-release</strong> — release candidate for testing; not recommended for production deployments. Docker images are not tagged <code>:latest</code>.</p>
</blockquote>
<h2>Summary</h2>
<p>This release candidate lands the <strong>Map Consolidation epic (#4047)</strong>: MeshMonitor's ten independent Leaflet map implementations are now one shared <code>BaseMap</code> shell, one composable layer library, one popup family, and one marker-icon factory. Traceroutes render identically on every surface — one canonical 4-band SNR color scale (previously three different scales), unified MQTT dashing and coloring, and the Dashboard finally renders return legs. Node markers, popups, neighbor links, and accuracy regions are likewise single-sourced, so future fixes apply to every map at once, and public embed maps now show the same canonical traceroute visuals as the app. The epic also surfaced and fixed several latent bugs, including a hidden-node position leak in the public embed traceroutes endpoint and Dashboard coloring segments with unscaled SNR values. On top of the epic, this RC brings map interaction polish (#4046): center-on-node never zooms out and its target zoom is user-configurable, pan/zoom animations scale with distance, clicking a marker at low zoom now zooms in instead of exploding a giant spiderfy fan, and open fans survive zoom changes. Live testing fixes include restored wheel/double-click zoom, correct zoom-to-node for one-way traceroutes, loading indicators on initial map data fetch, a polar grid for MeshCore maps, and a self-healing reload when a stale cached page requests rotated asset chunks after an upgrade.</p>
<h2>Map Consolidation Epic (#4047)</h2>
<ul>
<li>#4068 — Epic integration: one shell, one layer library, one popup family (phases below)<ul>
<li>#4049 Phase 1 — shared <code>BaseMap</code> shell; pickers and editors migrated</li>
<li>#4051 Phase 2 — Map Analysis legend/polar-grid/trails reconciliation</li>
<li>#4057 Phase 3 — unified traceroute rendering across all app maps</li>
<li>#4060 Phase 4 — unified node-marker factory + shared <code>NodeMarkersLayer</code></li>
<li>#4064 Phase 5 — one popup family with composable source-tech sections</li>
<li>#4065 Phase 6 — public embeds adopt canonical traceroute rendering (includes a hidden-node position leak fix 🔒)</li>
<li>#4066 / #4067 Phase 7 — shared neighbor-links/accuracy/waypoints layers; all maps on <code>BaseMap</code></li>
</ul>
</li>
</ul>
<h2>Features</h2>
<ul>
<li>#4072 — Map interaction polish: zoom clamp with configurable target (default 17), distance-scaled animations, zoom-gated spiderfy with zoom-in-first clicks, re-spiderfy after zoom (#4046)</li>
<li>#4071 — MeshCore map polar grid; map loading indicators during initial fetch</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li>#4071 — Wheel/double-click zoom restored on all maps; zoom-to-node no longer hijacked by route-fit on one-way traceroutes; one-time reload on stale-chunk load failures after upgrades</li>
<li>#4055 — Dashboard neighbor-info lines follow the merged node marker position (#4042) — thanks @temalo!</li>
<li>#4045 — Notifications: drop inline autoindex <code>UNIQUE(user_id)</code> missed by migration 079 (#4044)</li>
</ul>
<h2>Issues Resolved</h2>
<ul>
<li>#4047 — Consolidate 10 independent Leaflet maps into a shared BaseMap shell + composable layer library</li>
<li>#4046 — Map UI: improve pan/zoom-to-center behavior and its interaction with marker spiderfy</li>
<li>#4042 — Dashboard Unified map: neighbor-info lines don't follow merged node marker position</li>
<li>#4044 — Can't configure Apprise Notifications for a second source</li>
</ul>
<h2>Upgrade Notes</h2>
<ul>
<li>Map visuals converge to one canonical look: the per-source Nodes map moves from a 3-band to the 4-band SNR color scale, no-data segments render dashed gray, the Dashboard gains traceroute return legs, the traceroute widget's legs use the theme color, and embeds show SNR-colored traceroutes instead of uniform mauve.</li>
<li>New per-user setting: Settings → Map → center-on-node target zoom (default 17).</li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/Yeraze/meshmonitor/compare/v4.13.0-rc1...v4.13.0-rc2" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/compare/v4.13.0-rc1...v4.13.0-rc2</a></p>
<h2>🚀 MeshMonitor v4.13.0-rc2</h2>
<h3>📦 Installation</h3>
<p><strong>Docker (recommended):</strong></p>
<pre><code>docker run
…
</code></pre>
]]></description>
  </item>
  <item>
    <title>Meshtrax 1.6.3</title>
    <link>https://meshcore.ninja/software/meshtrax/releases/#release-1.6.3</link>
    <guid isPermaLink="false">software-Meshtrax-1.6.3</guid>
    <pubDate>Sun, 12 Jul 2026 00:20:30 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h2>What's Changed</h2>
<ul>
<li>Fixed bug on showing repeaters farther that 50 miles away as unknown. by @venamartin in <a href="https://github.com/venamartin/meshtrax/pull/24" target="_blank" rel="noopener noreferrer">https://github.com/venamartin/meshtrax/pull/24</a></li>
<li>Bugfix: DM duplicate message by @venamartin in <a href="https://github.com/venamartin/meshtrax/pull/25" target="_blank" rel="noopener noreferrer">https://github.com/venamartin/meshtrax/pull/25</a></li>
<li>Chore/flutter analyze cleanup by @venamartin in <a href="https://github.com/venamartin/meshtrax/pull/26" target="_blank" rel="noopener noreferrer">https://github.com/venamartin/meshtrax/pull/26</a></li>
<li>Feature/auto connect last by @venamartin in <a href="https://github.com/venamartin/meshtrax/pull/27" target="_blank" rel="noopener noreferrer">https://github.com/venamartin/meshtrax/pull/27</a></li>
<li>chore: add Google Play Store icon and feature graphic by @venamartin in <a href="https://github.com/venamartin/meshtrax/pull/28" target="_blank" rel="noopener noreferrer">https://github.com/venamartin/meshtrax/pull/28</a></li>
<li>Feature/UI improvements by @venamartin in <a href="https://github.com/venamartin/meshtrax/pull/29" target="_blank" rel="noopener noreferrer">https://github.com/venamartin/meshtrax/pull/29</a></li>
<li>chore: remove dead code files by @venamartin in <a href="https://github.com/venamartin/meshtrax/pull/30" target="_blank" rel="noopener noreferrer">https://github.com/venamartin/meshtrax/pull/30</a></li>
<li>Play Store readiness: moderation, terms, notifications, and defaults by @venamartin in <a href="https://github.com/venamartin/meshtrax/pull/31" target="_blank" rel="noopener noreferrer">https://github.com/venamartin/meshtrax/pull/31</a></li>
<li>Fix/notification tap and names by @venamartin in <a href="https://github.com/venamartin/meshtrax/pull/32" target="_blank" rel="noopener noreferrer">https://github.com/venamartin/meshtrax/pull/32</a></li>
<li>Docs/readme screenshots by @venamartin in <a href="https://github.com/venamartin/meshtrax/pull/33" target="_blank" rel="noopener noreferrer">https://github.com/venamartin/meshtrax/pull/33</a></li>
<li>chore: set Play Store package name to com.vena.meshtrax by @venamartin in <a href="https://github.com/venamartin/meshtrax/pull/34" target="_blank" rel="noopener noreferrer">https://github.com/venamartin/meshtrax/pull/34</a></li>
<li>Lost ble notification by @venamartin in <a href="https://github.com/venamartin/meshtrax/pull/35" target="_blank" rel="noopener noreferrer">https://github.com/venamartin/meshtrax/pull/35</a></li>
<li>fix: resolve ack-queue race that falsely marked USB channel sends as failed by @venamartin in <a href="https://github.com/venamartin/meshtrax/pull/36" target="_blank" rel="noopener noreferrer">https://github.com/venamartin/meshtrax/pull/36</a></li>
<li>chore: bump version to 1.6.2+2 by @venamartin in <a href="https://github.com/venamartin/meshtrax/pull/37" target="_blank" rel="noopener noreferrer">https://github.com/venamartin/meshtrax/pull/37</a></li>
<li>Fix/channel reply wire format by @venamartin in <a href="https://github.com/venamartin/meshtrax/pull/38" target="_blank" rel="noopener noreferrer">https://github.com/venamartin/meshtrax/pull/38</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/venamartin/meshtrax/compare/v1.5.5...v1.6.3" target="_blank" rel="noopener noreferrer">https://github.com/venamartin/meshtrax/compare/v1.5.5...v1.6.3</a></p>
]]></description>
  </item>
  <item>
    <title>Wadamesh beta_42</title>
    <link>https://meshcore.ninja/firmware/wadamesh/releases/#release-beta_42</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_42</guid>
    <pubDate>Sat, 11 Jul 2026 21:35:50 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h2>wadamesh beta_42 (test build)</h2>
<p>Fixes for the REMOTE mode introduced in beta_41.</p>
<p>Install from the web flasher at <a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">https://flasher.wadamesh.com</a> (test channel), or grab a bin below.</p>
<h3>Fixed</h3>
<ul>
<li><strong>REMOTE mode now works on the Heltec V4 TFT</strong> (and other 2 MB-PSRAM boards) instead of showing a black screen in the browser. Its off-screen renderer needed more free memory than those boards had, so nothing streamed; the buffers are sized to fit now, and the render is a bit smaller and faster as a result. VNC was never affected and already worked.</li>
<li><strong>Keyboard-less touch boards (Heltec V4, RAK WisMesh Tap) can leave REMOTE mode</strong> again: touch and hold the device screen for about 3 seconds. Those boards have no SPACE key, which used to be the only on-device way out.</li>
</ul>
<h3>New</h3>
<ul>
<li>The web page has an <strong>"Exit remote"</strong> button (with a confirmation) that leaves REMOTE mode from any browser, on any board.</li>
</ul>
<p>Boards in this build: LilyGo T-Deck, Heltec V4 TFT, ThinkNode M9, RAK WisMesh Tap V2.</p>
]]></description>
  </item>
  <item>
    <title>Wadamesh beta_41</title>
    <link>https://meshcore.ninja/firmware/wadamesh/releases/#release-beta_41</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_41</guid>
    <pubDate>Sat, 11 Jul 2026 20:33:02 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h2>wadamesh beta_41 (test build)</h2>
<p>Experimental web control: view and drive the wadamesh UI from a phone or desktop browser over Wi-Fi. Two new apps, VNC and REMOTE.</p>
<p>Install from the web flasher at <a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">https://flasher.wadamesh.com</a> (test channel), or grab a bin below.</p>
<h3>New</h3>
<ul>
<li><strong>VNC app</strong> (app drawer, between Advertise and Signal): mirrors the live device screen into a web browser over Wi-Fi and lets you drive it. Taps and typing in the browser control the device, and anything that changes on the device shows up in the browser. Turn it on, then open <code>http://&lt;device-ip&gt;:8765/</code> from any browser on the same network. The app page itself is scrollable.</li>
<li><strong>REMOTE app</strong>: a headless mode that renders the whole UI at a larger, browser-friendly resolution and serves it over Wi-Fi, while the device's own screen drops to a placeholder showing the address to open. Turning it on or off reboots the device. On the web page a Rotate button flips between landscape (desktop) and portrait (phone); on the device, double-tap the space bar to leave remote mode.</li>
<li>Both are served by the device itself over plain Wi-Fi, no phone app, no account, no cloud.</li>
</ul>
<h3>Note</h3>
<p>This is an experimental first cut, and an honest heads-up from Kaj: for me the remote UI still feels too slow, and I will most likely move toward a dedicated, lighter remote client instead of streaming the entire live UI. It is in this test build mainly because community feedback on it would be genuinely useful. If you try it, let us know how it runs for you and what you would actually want from a web or remote client.</p>
<p>Boards in this build: LilyGo T-Deck, Heltec V4 TFT, ThinkNode M9, RAK WisMesh Tap V2.</p>
]]></description>
  </item>
  <item>
    <title>mesh-client 5.22.0</title>
    <link>https://meshcore.ninja/software/mesh-client/releases/#release-5.22.0</link>
    <guid isPermaLink="false">software-mesh-client-5.22.0</guid>
    <pubDate>Sat, 11 Jul 2026 15:01:25 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h2>[v5.22.0] - 2026-07-11</h2>
<h3>Highlights</h3>
<p>This release adds <strong>Reticulum RMAP v4 discovery</strong> (publish, per-interface controls, and a local discovery map tab), <strong>unified Reticulum identity import</strong>, and a much more scannable <strong>Sniffer</strong> tab across all protocols. It also fixes Meshtastic MQTT messages landing on the wrong channel tab, hardens <strong>triple-protocol BLE coexistence</strong> when Reticulum uses a Noble RNode alongside Meshtastic/MeshCore, and migrates the Colorado Mesh MQTT preset to <strong>port 443</strong>.</p>
<h3>What's Changed</h3>
<h3>Features</h3>
<ul>
<li><strong>Reticulum RMAP v4 discovery</strong> — Publish enabled interfaces to RMAP v4 using App GPS coordinates; per-interface discoverable toggles for RNode, KISS, BLE peer, I2P, UDP, and pipe; Connection tab status strip and sync badges; default hub sync with skip/repair/add; new <strong>Map</strong> tab with local discovery map (Leaflet), filters, path-table reachability, and link to <a href="https://rmap.world/" target="_blank" rel="noopener noreferrer">rmap.world</a> (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/649" target="_blank" rel="noopener noreferrer">#649</a>)</li>
<li><strong>Reticulum identity unification and import</strong> — Single unified identity apply path in the sidecar; backup JSON and private key import (hex/base64/file) on the Network tab with replace confirmation (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/651" target="_blank" rel="noopener noreferrer">#651</a>)</li>
<li><strong>Sniffer tab scanability</strong> — MeshCore on-air hop chains and path display; Meshtastic collapsed hops and transport/type badges; sortable columns, quick-filter chips, relative timestamps, and hover tooltips across all protocols (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/643" target="_blank" rel="noopener noreferrer">#643</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>Meshtastic MQTT channel routing</strong> — Prefer MQTT topic channel name over sender-local <code>MeshPacket.channel</code> slot for inbound text; add <code>@index</code> hint in Connection panel for MQTT-only setups (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/644" target="_blank" rel="noopener noreferrer">#644</a>)</li>
<li><strong>Triple-protocol BLE coexistence</strong> — Suspend Noble for Reticulum RNode pairing on macOS/Windows; paired yield lifecycle so the scan mutex releases on connect, grace expiry, or sidecar stop; reconnect hardening and quieter logs when Meshtastic/MeshCore resume after yield (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/645" target="_blank" rel="noopener noreferrer">#645</a>, <a href="https://github.com/Colorado-Mesh/mesh-client/pull/653" target="_blank" rel="noopener noreferrer">#653</a>, <a href="https://github.com/Colorado-Mesh/mesh-client/pull/655" target="_blank" rel="noopener noreferrer">#655</a>)</li>
<li><strong>Colorado Mesh MQTT preset</strong> — Align MeshCore broker preset to TLS WebSocket on port <strong>443</strong>; migrate saved settings off legacy port 1883 (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/647" target="_blank" rel="noopener noreferrer">#647</a>, <a href="https://github.com/Colorado-Mesh/mesh-client/pull/651" target="_blank" rel="noopener noreferrer">#651</a>)</li>
<li><strong>Reticulum discovery map resilience</strong> — Cap discovery rows (2,000) with 7-day TTL eviction; preserve last-good data on fetch failure; clear stores on disconnect; partial-failure toasts for RMAP apply/disable (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/650" target="_blank" rel="noopener noreferrer">#650</a>)</li>
<li><strong>Meshtastic TCP connect</strong> — 20s timeout aligned with other transports; disconnect orphaned sockets on failed connect (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/644" target="_blank" rel="noopener noreferrer">#644</a>)</li>
<li><strong>Channel PSK validation</strong> — Reject keys shorter than 16 bytes; accept 1-byte default PSK and bare decrypt-only lengths consistent with MQTT manager (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/646" target="_blank" rel="noopener noreferrer">#646</a>, <a href="https://github.com/Colorado-Mesh/mesh-client/pull/651" target="_blank" rel="noopener noreferrer">#651</a>)</li>
<li><strong>Reticulum diagnostics</strong> — Omit expected SharedInstanceServer runtime note from actionable faults (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/652" target="_blank" rel="noopener noreferrer">#652</a>)</li>
<li><strong>I2P peer validation</strong> — Accept official 60-char testnet <code>.b32.i2p</code> addresses (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/649" target="_blank" rel="noopener noreferrer">#649</a>)</li>
<li><strong>MeshCore waiting-messages poll</strong> — Gate idle 5-minute safety poll; treat silent sync timeouts as empty queue (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/655" target="_blank" rel="noopener noreferrer">#655</a>)</li>
<li><strong>Connection banner accessibility</strong> — Status region labels, decorative reconnect pulse layer, improved contrast (<a href="https://github.com/Colorado-Mesh/mesh-client/pull/655" target="_blank" rel="noopener noreferrer">#655</a>)</li>
</ul>
<h3>Othe</h3>
<p>…</p>
]]></description>
  </item>
  <item>
    <title>MeshMonitor 4.13.0-rc1</title>
    <link>https://meshcore.ninja/software/meshmonitor/releases/#release-4.13.0-rc1</link>
    <guid isPermaLink="false">software-MeshMonitor-4.13.0-rc1</guid>
    <pubDate>Sat, 11 Jul 2026 13:09:26 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h2>What's Changed</h2>
<ul>
<li>docs: remediation plan + epic status doc (#3962) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3966" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3966</a></li>
<li>feat(server): process-level safety net for unhandledRejection/uncaughtException (#3962) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3967" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3967</a></li>
<li>fix(security)!: default trust proxy to false when TRUST_PROXY is unset (#3962) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3968" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3968</a></li>
<li>chore(deps): pin meshcore.js fork to commit SHA (#3962) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3969" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3969</a></li>
<li>fix(security): strip hot-path console logging and CSRF token exposure in api.ts (#3962) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3970" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3970</a></li>
<li>chore(lint): enable @typescript-eslint/no-floating-promises as error (#3962) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3972" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3972</a></li>
<li>feat(db)!: withSourceScope fails closed — omitting sourceId throws, ALL_SOURCES sentinel for intentional cross-source (#3962) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3976" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3976</a></li>
<li>feat(automations): multi-channel message trigger OR-list (#3974) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3982" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3982</a></li>
<li>feat(map): add polar grid overlay to Map Analysis and Unified maps (#3971) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3983" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3983</a></li>
<li>fix(meshcore): auto-retry DM via same-path + flood cadence on ack timeout by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3980" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3980</a></li>
<li>ci(types): type-check test files via tsconfig.tests.json, non-blocking first (#3962) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3985" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3985</a></li>
<li>fix(meshcore): populate fromName on DM automation triggers, clarify trigger.from vs fromName by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3978" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3978</a></li>
<li>feat(meshcore): delete/purge messages — per-message, per-conversation, purge-all (#3981) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3984" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3984</a></li>
<li>test(routes): integration-grade route-test harness with real auth middleware (#3962) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3986" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3986</a></li>
<li>fix(meshcore): exact decrypt-and-match for channel 'repeaters relayed' echo (#3979 pt1) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3987" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3987</a></li>
<li>feat(meshcore): opt-in auto-retry for automated channel sends (#3979 Part 2) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3988" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3988</a></li>
<li>chore(lint): count-based lint ratchet — new violations block, existing debt baselined; CI lint now blocking (#3962) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3989" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3989</a></li>
<li>feat(server): codify the { success, error, code } response envelope in ok()/fail() helpers (#3962) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3990" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3990</a></li>
<li>feat(meshcore-vn): relay SendStatusReq(27) status requests to the physical node (#3904) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3991" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3991</a></li>
<li>test(db): schema-drift tripwire — CI fails on createTables vs migration-replay divergence (#3962) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3992" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3992</a></li>
<li>feat(meshcore-vn): relay GetNeighbours via SendBinaryReq(50) to the physical node (#3904) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3993" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3993</a></li>
<li>chore(logging): trim default log volume — reclassify routine info→debug, add trace tier by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3994" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3994</a></li>
<li>refactor(registry)!: MeshCoreManager implements ISourceManager — one unified source registry (#3962) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/4004" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/4004</a></li>
<li>Fix Virtual Node Server boot race and listen-error zombie state by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/4001" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/4001</a></li>
<li>feat(automation): add "Send via sources" selector to the tapback action by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/3997" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/3997</a></li>
<li>feat(automation): add scheduled device-reboot action (#3995) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/4002" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/4002</a></li>
<li>fix(meshcore): match-scope replies unscoped for unnameable trigger scope (#3998) by @Yeraze in <a href="https://github.com/Yeraze/meshmonitor/pull/4003" target="_blank" rel="noopener noreferrer">https://github.com/Yeraze/meshmonitor/pull/4003</a></li>
<li></li>
</ul>
<p>…</p>
]]></description>
  </item>
  <item>
    <title>MeshOS 1.5.6</title>
    <link>https://meshcore.ninja/software/meshos/releases/#release-1.5.6</link>
    <guid isPermaLink="false">software-MeshOS-1.5.6</guid>
    <pubDate>Sat, 11 Jul 2026 12:03:47 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<p>License key now backed up to SD and auto-restored after flash erase. WiFi scanner and connect dialog fixes. Bluetooth-off persists across reboots.</p>
<p>Device firmware for LilyGo T-Deck and ThinkNode M9.
Install via SD card (firmware.bin) or the in-firmware updater.</p>
<p>SHA-256:</p>
<ul>
<li>TDeck: af26586a4d6f7c991c5390827d7d80d0b3479f1b86e02d6054a180a2fec7d78a</li>
<li>M9: 6f80d53b4d7b7743096a40331aedd261a6efeff8887921b540cdb00778553876</li>
</ul>
]]></description>
  </item>
</channel>
</rss>
