<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
  <title>MeshCore Ninja — Releases</title>
  <link>https://dev.meshcore.ninja/releases/</link>
  <description>Newest MeshCore firmware and software releases across all projects.</description>
  <language>en</language>
  <lastBuildDate>Sat, 27 Jun 2026 21:10:25 GMT</lastBuildDate>
  <atom:link xmlns:atom="http://www.w3.org/2005/Atom" href="https://dev.meshcore.ninja/releases.xml" rel="self" type="application/rss+xml" />
  <item>
    <title>MeshCore Solo 1.21-rc2</title>
    <link>https://dev.meshcore.ninja/firmware/meshcore-solo/releases/#release-1.21-rc2</link>
    <guid isPermaLink="false">firmware-MeshCore Solo-1.21-rc2</guid>
    <pubDate>Fri, 26 Jun 2026 22:52:12 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h2>MeshCore Solo Companion Firmware v1.21 Release candidate 2</h2>
<h3>What's new</h3>
<ul>
<li><strong>Live Location Sharing</strong> — broadcast your position over the mesh as <code>[LOC]</code> messages, <strong>movement-gated</strong>, to a channel or a single contact. Others who share theirs show up as pins on the map with live <strong>distance/bearing in Nearby Nodes</strong>, and a <strong>status-bar indicator</strong> appears while your own share is active. <code>[LOC]</code> is parsed in DMs, channel messages <strong>and room messages</strong>; DM shares name the sender.</li>
<li><strong>Locator</strong> (geofence) — arm a geofence around a <strong>target</strong> — a saved waypoint <em>or</em> a person (their live <code>[LOC]</code> or last-known position) — and get an alert when you <strong>arrive/leave</strong> or they get <strong>near/far</strong>, with an optional <strong>homing beeper</strong> that ticks faster the closer you get (and overrides a muted buzzer). Arm it from <strong>Tools › Locator</strong> or straight from <strong>Nearby Nodes</strong> / <strong>Waypoints</strong>; pick the target from a list (favourites first, then any contact), and clear it via a <strong>"None"</strong> entry. The active target is drawn as a <strong>flag</strong> on the map.</li>
<li><strong>One active target across Locator / Navigate / Map</strong> — a single <strong>"Set as target"</strong> action everywhere, backed by a shared resolver that prefers a live <code>[LOC]</code> share over the last-advertised GPS, so the three features always agree on where you're headed.</li>
<li><strong>Follow live contacts</strong> — <strong>Navigate</strong> to a contact who is live-sharing and the view <strong>follows them as they move</strong>, adding an <strong>ETA</strong> line. <strong>Quick-share</strong> your own position straight from the Map.</li>
<li><strong>Map &amp; status-bar upgrades</strong> — the home mini-map gains a <strong>north marker</strong> and a <strong>scale tick</strong>; the status line shows the tracked-node count and, with a fix, an <strong>arrow + distance to the nearest tracked contact</strong> (e.g. <code>Track:3 →120m</code>); a <strong>GPS fix icon</strong> sits in the top status bar (boxed once a fix is valid, plain while searching), shown only on GPS boards while <strong>GPS</strong> is enabled in Settings.</li>
<li><strong>Trail auto-pause</strong> — recording <strong>freezes on stops</strong> (banking elapsed time and breaking the map line across the idle gap) and <strong>resumes on movement</strong> without ending the session; the home-screen blink keeps going while paused.</li>
<li><strong>Collapsible Tools</strong> — tools are grouped into fold-in-place <strong>Location / Comms / System</strong> sections, the same model as Settings (Tools always opens folded to the section list), and the home carousel now uses <strong>page-indicator icons</strong> instead of dots.</li>
<li><strong>Waypoint coordinate editor</strong> — add a waypoint by scroll-editing its latitude/longitude digit by digit.</li>
<li><strong>On-device room login with saved passwords</strong> — log in to a room server straight from the device (no phone app): pick the room and the password prompt appears automatically (a blank password works for open rooms), or re-login any time via the room's <strong>context-menu "Login…"</strong>. The password is <strong>remembered across reboots</strong>, so a room you've used before logs back in without retyping; a failed login (e.g. the server's password changed) forgets the stale password so the next attempt prompts again. Saved passwords are written with the same atomic, crash-safe persistence as contacts and channels.</li>
</ul>
<h3>Fixes</h3>
<ul>
<li><strong>Critical — low-heap hang and contact loss on RAM-tight builds.</strong> With <code>MAX_CONTACTS=350</code> and <code>OFFLINE_QUEUE_SIZE=256</code> the device ran with very little free heap; an allocation in the input/menu path could then fail and <strong>hang the UI</strong> (notably when entering Diagnostics), and a crash or reset mid-save could <strong>wipe all contacts</strong>. Fixed by two independent changes:<ul>
<li><strong>Right-sized message-history rings</strong> — the on-device scrollback rings were halved (96→48 channel, 64→32 DM), recovering <strong>~14 KB of free heap</strong> (measured 3 → 17 KB). History is RAM-only, so the only cost is shorter on-device scrollback.</li>
<li><strong>Atomic persistence</strong> — contacts, channels and prefs are now written to a temp file and <strong>atomically renamed</strong> into place; an interrupted save (crash, reset, full flash) leaves the previous good file intact instead of truncating it.</li>
</ul>
</li>
<li><strong>USB host stall</strong> — `Serial.write
…</li>
</ul>
]]></description>
  </item>
  <item>
    <title>Trail Mate 0.1.31-alpha</title>
    <link>https://dev.meshcore.ninja/firmware/trail-mate/releases/#release-0.1.31-alpha</link>
    <guid isPermaLink="false">firmware-Trail Mate-0.1.31-alpha</guid>
    <pubDate>Fri, 26 Jun 2026 19:05:53 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h2>[0.1.31-alpha] - 2026-06-27</h2>
<h3>Fixed / 修复</h3>
<ul>
<li>Fixed <a href="https://github.com/vicliu624/trail-mate/issues/64" target="_blank" rel="noopener noreferrer">#64</a> and <a href="https://github.com/vicliu624/trail-mate/issues/41" target="_blank" rel="noopener noreferrer">#41</a>. / 修复 <a href="https://github.com/vicliu624/trail-mate/issues/64" target="_blank" rel="noopener noreferrer">#64</a> 和 <a href="https://github.com/vicliu624/trail-mate/issues/41" target="_blank" rel="noopener noreferrer">#41</a>。</li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/vicliu624/trail-mate/compare/v0.1.30-alpha...v0.1.31-alpha" target="_blank" rel="noopener noreferrer">https://github.com/vicliu624/trail-mate/compare/v0.1.30-alpha...v0.1.31-alpha</a></p>
]]></description>
  </item>
  <item>
    <title>Wadamesh beta_18</title>
    <link>https://dev.meshcore.ninja/firmware/wadamesh/releases/#release-beta_18</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_18</guid>
    <pubDate>Fri, 26 Jun 2026 17:55:17 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h1>wadamesh beta_18</h1>
<p>A unified release across all three boards — <strong>LilyGo T-Deck</strong>, <strong>Heltec V4 TFT</strong>, and the <strong>Tanmatsu</strong> (ESP32-P4).</p>
<p>Flash it the easy way at <strong><a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">https://flasher.wadamesh.com</a></strong>, or grab a bin below. On a normally-flashed device you can also update straight from <strong>Settings → About</strong>.</p>
<h2>✨ New</h2>
<ul>
<li><strong>Topographic maps</strong> — turn on <em>Map → Options → Topographic map</em> for terrain-relief tiles; OpenStreetMap stays the default. Thanks to <strong>@samuelcoustet</strong> for the proxy work (#52).</li>
<li><strong>More emoji</strong> in the picker: ⚽ 🏈 🗿 🏳️‍⚧️.</li>
<li><strong>Contacts sorting</strong> gained ascending/descending and a new <strong>Nearest first</strong> distance sort; the <strong>Discovered</strong> list gets the same sort options.</li>
<li>The <strong>Chats header</strong> is tidied up — add / mark-read / share grouped on the left, with a proper QR icon for sharing your contact.</li>
</ul>
<h2>🐛 Fixed</h2>
<ul>
<li>The <strong>USB/PC companion connection</strong> no longer drops or throws <em>"bad state"</em> errors — also fixes repeater admin mode disconnecting and member-room login (#25, #54, #23).</li>
<li><strong>Map edge/corner tiles</strong> now fill in as you pan instead of needing a manual reload (#20).</li>
<li><strong>~41 KB of memory reclaimed</strong> (moved a large buffer to PSRAM) — fixes the <strong>Heltec V4 rebooting</strong> when loading map tiles, and frees headroom on every board.</li>
<li>The map's <strong>Show link lines</strong> toggle now survives a reboot. Thanks to <strong>@Yazutsu</strong> (#61).</li>
<li><strong>Settings</strong> category names fit on one line (no more mid-word splits); keyboard-nav toggling no longer jumps the list to the top (#45).</li>
<li><strong>Heltec V4</strong>: node name no longer covers the clock (#47a). <strong>T-Deck</strong>: keyboard backlight no longer stuck on after flashing (#33).</li>
<li>More reliable crash reporting and fewer stray reboots while saving settings.</li>
<li><strong>Tanmatsu</strong>: LoRa radio changes (frequency, etc.) now take effect immediately without a reboot, and the app's settings drive the radio.</li>
</ul>
<p><em>Everything from beta_16 (and the Tanmatsu's beta_17) is included.</em></p>
]]></description>
  </item>
  <item>
    <title>MeshCore Wio Tracker L1 Pro (sosprz) 1.16.87</title>
    <link>https://dev.meshcore.ninja/firmware/meshcore-wio-tracker-l1-pro-sosprz/releases/#release-1.16.87</link>
    <guid isPermaLink="false">firmware-MeshCore Wio Tracker L1 Pro (sosprz)-1.16.87</guid>
    <pubDate>Fri, 26 Jun 2026 15:59:56 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<ul>
<li><strong>Radio path hash setting</strong> - Added <code>Radio Settings -&gt; Path hash</code> so companion-radio devices can switch outgoing flood path hashes between <code>1B</code>, <code>2B</code>, and <code>3B</code> directly from the device UI.</li>
<li><strong>Wio Tracker L1 EINK viewport fix</strong> - The EINK companion build now reports the actual usable <code>128x90</code> logical viewport, so lists scroll when the visible rows are exhausted and text-entry keyboards stay within the visible screen area.</li>
<li><strong>Wio Tracker L1 EINK input reliability</strong> - EINK joystick, menu, and enter presses are now interrupt-queued while the display is refreshing, reducing missed inputs caused by slow e-paper update cycles.</li>
</ul>
]]></description>
  </item>
  <item>
    <title>Offband Mesh 1.1.1</title>
    <link>https://dev.meshcore.ninja/firmware/offband-mesh/releases/#release-1.1.1</link>
    <guid isPermaLink="false">firmware-Offband Mesh-1.1.1</guid>
    <pubDate>Fri, 26 Jun 2026 05:24:03 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>Urgent patch: the <strong>RAK3401 1W companion</strong> radio was dead on v1.1.0. Still on the
<strong>MeshCore 1.16.0</strong> base.</p>
<h3>Fixed</h3>
<ul>
<li><strong>RAK3401 1W companion radio dead on Offband (no TX/RX).</strong> Offband's GPS support
(#104) probed a pin that doubles as the radio's power-enable on the RAK3401; with no
GPS attached it left the radio unpowered, so it couldn't transmit or receive. GPS is
now disabled on the RAK3401 companion build until the probe is fixed. (#211)</li>
</ul>
<hr />
<h3>Which file do I download?</h3>
<table>
<thead>
<tr>
<th>File</th>
<th>What it is</th>
<th>When to use it</th>
</tr>
</thead>
<tbody><tr>
<td><code>*-merged.bin</code> (ESP32 — Heltec V3/V4, XIAO)</td>
<td><strong>Full image</strong> — bootloader + partition table + app in one, flashed at <code>0x0</code> after a chip erase. Self-contained, works on a blank chip.</td>
<td><strong>First install / clean setup.</strong> In a web flasher this is the <strong>"Full Firmware"</strong> option.</td>
</tr>
<tr>
<td><code>*.bin</code> (ESP32)</td>
<td><strong>App only</strong> — flashed at the app offset (<code>0x10000</code>); the bootloader must already be on the chip.</td>
<td><strong>Updating</strong> an existing node — OTA / <strong>"Update Only."</strong> Keeps the device identity + WiFi/MQTT config.</td>
</tr>
<tr>
<td><code>*.uf2</code> (nRF52 — RAK, T-Echo, XIAO nRF52)</td>
<td>Complete self-contained image.</td>
<td><strong>First install <em>and</em> updates</strong> — double-tap reset, then drag-drop onto the USB drive. (nRF52 has no merged/app split.)</td>
</tr>
</tbody></table>
<blockquote>
<p>⚠️ <strong>ESP32:</strong> the app-only <code>*.bin</code> will <strong>not boot</strong> if flashed at <code>0x0</code> — use <code>*-merged.bin</code> for a fresh install. A full erase / "Full Firmware" wipes the device's identity + saved config, so use it only for a first install or recovery, <strong>never</strong> a routine update.</p>
</blockquote>
<h2>What's Changed</h2>
<ul>
<li>docs(#192): Photon-1W (MeshSmith) support design-of-record by @Strycher in <a href="https://github.com/OffbandMesh/meshcore-firmware/pull/195" target="_blank" rel="noopener noreferrer">https://github.com/OffbandMesh/meshcore-firmware/pull/195</a></li>
<li>chore(#197): CLAUDE.md -- record no-upstream-merge policy by @Strycher in <a href="https://github.com/OffbandMesh/meshcore-firmware/pull/198" target="_blank" rel="noopener noreferrer">https://github.com/OffbandMesh/meshcore-firmware/pull/198</a></li>
<li>fix(#89): exclude SerialBLEInterface.cpp from Xiao_S3_WIO USB companion by @Strycher in <a href="https://github.com/OffbandMesh/meshcore-firmware/pull/200" target="_blank" rel="noopener noreferrer">https://github.com/OffbandMesh/meshcore-firmware/pull/200</a></li>
<li>fix(rak3401): companion GPS probe floats WB_IO2, killing the 1W radio (#211) by @Strycher in <a href="https://github.com/OffbandMesh/meshcore-firmware/pull/212" target="_blank" rel="noopener noreferrer">https://github.com/OffbandMesh/meshcore-firmware/pull/212</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/OffbandMesh/meshcore-firmware/compare/offband-v1.1.0...offband-v1.1.1" target="_blank" rel="noopener noreferrer">https://github.com/OffbandMesh/meshcore-firmware/compare/offband-v1.1.0...offband-v1.1.1</a></p>
]]></description>
  </item>
  <item>
    <title>EastMesh 2026.6.5</title>
    <link>https://dev.meshcore.ninja/firmware/eastmesh/releases/#release-2026.6.5</link>
    <guid isPermaLink="false">firmware-EastMesh-2026.6.5</guid>
    <pubDate>Fri, 26 Jun 2026 02:52:13 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>.</p>
<p>This release adds the <strong>Waev</strong> curated broker as a selectable MQTT uplink — with automatic short-lived auth tokens to satisfy Waev's requirements — and widens the Custom MQTT settings panel in the web panel.</p>
<h3>What's Changed</h3>
<ul>
<li>Added the <code>waev</code> curated broker (<code>wss://mqtt.waev.app:443/mqtt</code>) using WSS, verified TLS, and MeshCore JWT authentication with the broker host as the token audience.</li>
<li>Added <code>get mqtt.waev</code> and <code>set mqtt.waev on|off</code> to toggle the Waev broker, and added Waev to the <strong>Primary MQTT</strong> and <strong>Secondary MQTT</strong> dropdowns in the web panel.</li>
<li>Added per-broker JWT auth token lifetimes; Waev receives a 1-hour token to match its shorter maximum token lifetime, while the other brokers keep the existing lifetime.</li>
<li>Fixed the web panel so the <strong>Custom MQTT settings</strong> panel spans the full width of the MQTT Servers card when Custom is selected.</li>
<li>Updated the README and custom CLI guides for the Waev broker.</li>
</ul>
<h3>Breaking Changes</h3>
<ul>
<li>None in this release.</li>
</ul>
<blockquote>
<p>If you are upgrading from before <code>2026.6.4</code>, that release's changes still apply: <code>get mqtt.status</code> switched from per-broker fields to <code>p:</code>/<code>s:</code> broker slots, and saved LetsMesh EU/US selections are cleared once on upgrade.</p>
</blockquote>
<h3>Notes</h3>
<ul>
<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>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>MeshCore Solo 1.21-rc1</title>
    <link>https://dev.meshcore.ninja/firmware/meshcore-solo/releases/#release-1.21-rc1</link>
    <guid isPermaLink="false">firmware-MeshCore Solo-1.21-rc1</guid>
    <pubDate>Thu, 25 Jun 2026 17:17:12 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h2>MeshCore Solo Companion Firmware v1.21 Release candidate 1</h2>
<h3>What's new</h3>
<ul>
<li><strong>Live Location Sharing</strong> — broadcast your position over the mesh as <code>[LOC]</code> messages, <strong>movement-gated</strong>, to a channel or a single contact. Others who share theirs show up as pins on the map with live <strong>distance/bearing in Nearby Nodes</strong>, and a <strong>status-bar indicator</strong> appears while your own share is active. <code>[LOC]</code> is parsed in DMs, channel messages <strong>and room messages</strong>; DM shares name the sender.</li>
<li><strong>Locator</strong> (geofence) — arm a geofence around a <strong>target</strong> — a saved waypoint <em>or</em> a person (their live <code>[LOC]</code> or last-known position) — and get an alert when you <strong>arrive/leave</strong> or they get <strong>near/far</strong>, with an optional <strong>homing beeper</strong> that ticks faster the closer you get (and overrides a muted buzzer). Arm it from <strong>Tools › Locator</strong> or straight from <strong>Nearby Nodes</strong> / <strong>Waypoints</strong>; pick the target from a list (favourites first, then any contact), and clear it via a <strong>"None"</strong> entry. The active target is drawn as a <strong>flag</strong> on the map.</li>
<li><strong>One active target across Locator / Navigate / Map</strong> — a single <strong>"Set as target"</strong> action everywhere, backed by a shared resolver that prefers a live <code>[LOC]</code> share over the last-advertised GPS, so the three features always agree on where you're headed.</li>
<li><strong>Follow live contacts</strong> — <strong>Navigate</strong> to a contact who is live-sharing and the view <strong>follows them as they move</strong>, adding an <strong>ETA</strong> line. <strong>Quick-share</strong> your own position straight from the Map.</li>
<li><strong>Map &amp; status-bar upgrades</strong> — the home mini-map gains a <strong>north marker</strong> and a <strong>scale tick</strong>; the status line shows the tracked-node count and, with a fix, an <strong>arrow + distance to the nearest tracked contact</strong> (e.g. <code>Track:3 →120m</code>); a <strong>GPS fix icon</strong> sits in the top status bar (boxed once a fix is valid, plain while searching), shown only on GPS boards while <strong>GPS</strong> is enabled in Settings.</li>
<li><strong>Trail auto-pause</strong> — recording <strong>freezes on stops</strong> (banking elapsed time and breaking the map line across the idle gap) and <strong>resumes on movement</strong> without ending the session; the home-screen blink keeps going while paused.</li>
<li><strong>Collapsible Tools</strong> — tools are grouped into fold-in-place <strong>Location / Comms / System</strong> sections, the same model as Settings (Tools always opens folded to the section list), and the home carousel now uses <strong>page-indicator icons</strong> instead of dots.</li>
<li><strong>Waypoint coordinate editor</strong> — add a waypoint by scroll-editing its latitude/longitude digit by digit.</li>
</ul>
<h3>Fixes</h3>
<ul>
<li><strong>Critical — low-heap hang and contact loss on RAM-tight builds.</strong> With <code>MAX_CONTACTS=350</code> and <code>OFFLINE_QUEUE_SIZE=256</code> the device ran with very little free heap; an allocation in the input/menu path could then fail and <strong>hang the UI</strong> (notably when entering Diagnostics), and a crash or reset mid-save could <strong>wipe all contacts</strong>. Fixed by two independent changes:<ul>
<li><strong>Right-sized message-history rings</strong> — the on-device scrollback rings were halved (96→48 channel, 64→32 DM), recovering <strong>~14 KB of free heap</strong> (measured 3 → 17 KB). History is RAM-only, so the only cost is shorter on-device scrollback.</li>
<li><strong>Atomic persistence</strong> — contacts, channels and prefs are now written to a temp file and <strong>atomically renamed</strong> into place; an interrupted save (crash, reset, full flash) leaves the previous good file intact instead of truncating it.</li>
</ul>
</li>
<li><strong>USB host stall</strong> — <code>Serial.write()</code> is bounded so a stalled USB host can no longer hang the device indefinitely.</li>
</ul>
<h3>Under the hood</h3>
<ul>
<li><strong>Streaming trail simplification</strong> — GPS points are simplified as they're recorded via a fixed-corridor (Reumann–Witkam) pass: straight runs collapse to their two endpoints while curves stay bounded to within the <strong>Min dist</strong> tolerance of the real track, so the 512-point buffer covers a far longer route than a flat point budget would suggest.</li>
<li>A UITask-decoupled active-target resolver (<code>resolvePersonPos</code> / <code>activeTargetPos</code>) replaces the duplicated target-resolution logic that lived sepa
…</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MCLite 0.4.1</title>
    <link>https://dev.meshcore.ninja/firmware/mclite/releases/#release-0.4.1</link>
    <guid isPermaLink="false">firmware-MCLite-0.4.1</guid>
    <pubDate>Thu, 25 Jun 2026 11:41:04 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>MeshCore 1.16 upgrade, the full companion command set (status/trace, anon-req, explicit-unscoped), and companion message-sync fixes. Update over WiFi (Admin → WiFi → Check for updates) or via the web flasher.</p>
<h3>Added</h3>
<ul>
<li><p><strong>Manage rooms and channels from the companion app.</strong> The companion protocol gained the standard write/action
commands the official MeshCore app uses, so things that previously failed against MCLite now work:</p>
<ul>
<li><strong>Room login</strong> (<code>CMD_SEND_LOGIN</code>): log into a configured room or repeater from the app. A blank password field
uses the password already in the device config, and a wrong password instantly retries with the stored one.
Thanks to the reporters (#32).</li>
<li><strong>Add / remove channels</strong> (<code>CMD_SET_CHANNEL</code>): join a Public, hashtag, or private channel — or remove one —
from the app. <strong>Adding applies instantly with no reboot</strong> — the channel is usable right away and its share QR
shows the real key, not zeros, with the session staying connected. <strong>Removing a channel still reboots</strong> to
apply (a known limitation — MeshCore offers no way to remove a channel from the running radio, so the device
rebuilds its channel table from config at boot; the app reconnects on its own). Gated by the
<code>permissions.conversation_management</code> setting, so a locked-down device still refuses it (#31).</li>
<li><strong>Add / edit / remove contacts</strong> (<code>CMD_ADD_UPDATE_CONTACT</code>, <code>CMD_REMOVE_CONTACT</code>): add a contact, rename one,
or delete one (and its chat history) straight from the app. <strong>Adding and renaming apply instantly</strong> (the app
stays connected); <strong>removing reboots</strong> to apply (the app reconnects) — see the consistent add/remove model
below. Editing maps to the contact's <strong>display name</strong>; per-contact permission flags stay device-owner settings
(the config tool / on-device Admin), and the app's own contact flags remain app-local. Gated by
<code>permissions.conversation_management</code> (#33).</li>
<li><strong>Share a contact</strong> (<code>CMD_SHARE_CONTACT</code>) re-broadcasts a contact's advert so a nearby device can add them,
and <strong>reboot</strong> (<code>CMD_REBOOT</code>) is now honoured from the app's button.</li>
<li>The app's <strong>Local vs Flood</strong> advert buttons were already handled; confirmed during this work.
With this, the companion can fully manage rooms, channels, and contacts (#31, #32, #33 all closed). A consistent
rule across both contacts and channels: <strong>adding and editing apply instantly; removing reboots</strong> to apply (the
app reconnects on its own). The reboot on removal is required for channels — MeshCore has no way to drop a
channel from the running radio — and kept for contacts so the behaviour is uniform and predictable. Live changes
are reflected on the <strong>device's own UI</strong> too — a contact/channel added or renamed from the app shows up in the
on-device conversation list and Admin screens right away, no reboot. In-place editing of a contact's permission
flags / a channel's settings still arrives alongside on-device editing.</li>
</ul>
</li>
<li><p><strong>Change device settings from the companion app.</strong> With <code>permissions.settings</code> set to <code>full</code>, a connected app
can now set the <strong>device name</strong>, <strong>radio parameters</strong> (frequency / spreading factor / bandwidth / coding rate),
<strong>TX power</strong>, the <strong>BLE pairing PIN</strong>, and the <strong>path-hash mode</strong> (1/2/3 bytes per hop). Values are range-checked;
the device name applies instantly to mesh adverts (the Bluetooth scan name refreshes on the next reboot), while
radio / TX / PIN / path-hash save and apply on a quick reboot (the app reconnects). <strong>Path-hash mode</strong> is
especially useful on large meshes — it lets app users match a 3-byte network
without hand-editing <code>config.json</code> (see #36). A device left at <code>restricted</code> or <code>none</code> refuses these. Identity
keys, advert location (MCLite advertises GPS at the configured precision), and auto-add stay device-managed by
design and are rejected.</p>
</li>
<li><p><strong>Set the region/scope from the companion app.</strong> The companion now honours <code>CMD_SET_DEFAULT_FLOOD_SCOPE</code> (set the
persi
…</p>
</li>
</ul>
]]></description>
  </item>
  <item>
    <title>Offband Mesh 1.2.0-beta1</title>
    <link>https://dev.meshcore.ninja/firmware/offband-mesh/releases/#release-1.2.0-beta1</link>
    <guid isPermaLink="false">firmware-Offband Mesh-1.2.0-beta1</guid>
    <pubDate>Thu, 25 Jun 2026 04:37:13 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>Adds <strong>MeshSmith Photon‑1W support</strong> (both MCU flavors) plus a NimBLE build fix, on the
<strong>MeshCore 1.16.0</strong> base. Shipping in <code>-beta</code> until the Photon‑1W is bench‑verified on hardware.</p>
<h3>Added</h3>
<ul>
<li><strong>MeshSmith Photon‑1W support — ESP32‑C6 + nRF52 (#193, #194)</strong> — vendors MeshSmith's MIT Photon
variants (<code>meshsmith_photon_esp32c6</code>, <code>meshsmith_photon_nrf52</code>; Seeed XIAO ESP32‑C6 / XIAO nRF52840 +
Ebyte E22‑900M30S 1 W radio) and wires all roles into CI + the release pipeline. ESP32‑C6 needed
minimal MeshCore‑consistent base edits (antenna‑switch virtuals, protected <code>_gps_serial</code>, NimBLE dep);
nRF52 needed none. <strong>Not yet bench‑verified</strong> — vendored drivers kept for round‑1; review findings
tracked as bench checkpoints on #193/#194.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li><strong><code>Xiao_S3_WIO_companion_radio_usb</code> build (#89)</strong> — exclude <code>SerialBLEInterface.cpp</code> from the USB
companion env (it has no BLE), resolving the <code>NimBLEDevice.h</code> regression from the #288 NimBLE migration.</li>
</ul>
<h3>Changed</h3>
<ul>
<li><strong>CLAUDE.md: no‑upstream‑merge policy (#197)</strong> — Offband does not merge from upstream MeshCore; the
<code>upstream</code> remote stays fetch‑only for reference. Keep MeshCore nomenclature/coding‑standard consistency
for clean rebasing.</li>
</ul>
<hr />
<h3>Which file do I download?</h3>
<table>
<thead>
<tr>
<th>File</th>
<th>What it is</th>
<th>When to use it</th>
</tr>
</thead>
<tbody><tr>
<td><code>*-merged.bin</code> (ESP32 — Heltec V3/V4, XIAO)</td>
<td><strong>Full image</strong> — bootloader + partition table + app in one, flashed at <code>0x0</code> after a chip erase. Self-contained, works on a blank chip.</td>
<td><strong>First install / clean setup.</strong> In a web flasher this is the <strong>"Full Firmware"</strong> option.</td>
</tr>
<tr>
<td><code>*.bin</code> (ESP32)</td>
<td><strong>App only</strong> — flashed at the app offset (<code>0x10000</code>); the bootloader must already be on the chip.</td>
<td><strong>Updating</strong> an existing node — OTA / <strong>"Update Only."</strong> Keeps the device identity + WiFi/MQTT config.</td>
</tr>
<tr>
<td><code>*.uf2</code> (nRF52 — RAK, T-Echo, XIAO nRF52)</td>
<td>Complete self-contained image.</td>
<td><strong>First install <em>and</em> updates</strong> — double-tap reset, then drag-drop onto the USB drive. (nRF52 has no merged/app split.)</td>
</tr>
</tbody></table>
<blockquote>
<p>⚠️ <strong>ESP32:</strong> the app-only <code>*.bin</code> will <strong>not boot</strong> if flashed at <code>0x0</code> — use <code>*-merged.bin</code> for a fresh install. A full erase / "Full Firmware" wipes the device's identity + saved config, so use it only for a first install or recovery, <strong>never</strong> a routine update.</p>
</blockquote>
<h2>What's Changed</h2>
<ul>
<li>docs(#192): Photon-1W (MeshSmith) support design-of-record by @Strycher in <a href="https://github.com/OffbandMesh/meshcore-firmware/pull/195" target="_blank" rel="noopener noreferrer">https://github.com/OffbandMesh/meshcore-firmware/pull/195</a></li>
<li>chore(#197): CLAUDE.md -- record no-upstream-merge policy by @Strycher in <a href="https://github.com/OffbandMesh/meshcore-firmware/pull/198" target="_blank" rel="noopener noreferrer">https://github.com/OffbandMesh/meshcore-firmware/pull/198</a></li>
<li>fix(#89): exclude SerialBLEInterface.cpp from Xiao_S3_WIO USB companion by @Strycher in <a href="https://github.com/OffbandMesh/meshcore-firmware/pull/200" target="_blank" rel="noopener noreferrer">https://github.com/OffbandMesh/meshcore-firmware/pull/200</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/OffbandMesh/meshcore-firmware/compare/offband-v1.1.0...offband-v1.2.0-beta1" target="_blank" rel="noopener noreferrer">https://github.com/OffbandMesh/meshcore-firmware/compare/offband-v1.1.0...offband-v1.2.0-beta1</a></p>
]]></description>
  </item>
  <item>
    <title>MeshCoreNG 1.1.2</title>
    <link>https://dev.meshcore.ninja/firmware/meshcore-ng/releases/#release-1.1.2</link>
    <guid isPermaLink="false">firmware-MeshCoreNG-1.1.2</guid>
    <pubDate>Wed, 24 Jun 2026 14:43:27 GMT</pubDate>
    <category>firmware</category>
  </item>
  <item>
    <title>Trail Mate 0.1.30-alpha</title>
    <link>https://dev.meshcore.ninja/firmware/trail-mate/releases/#release-0.1.30-alpha</link>
    <guid isPermaLink="false">firmware-Trail Mate-0.1.30-alpha</guid>
    <pubDate>Wed, 24 Jun 2026 14:24:42 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h2>[0.1.30-alpha] - 2026-06-24</h2>
<h3>Added / 新增</h3>
<ul>
<li>Added support for the T-Echo Lite keyboard kit, including the nRF52 build target, e-paper mono UI adaptation, physical keypad input with EN/123/CN modes, T9-style Chinese candidate input, device I/O settings, 10px Fusion Pixel font support, and TrailMate logo sleep page / 新增 T-Echo Lite 键盘套件支持，包括 nRF52 构建目标、电子纸 mono UI 适配、实体键盘 EN/123/CN 输入、九宫格中文候选输入、设备 I/O 设置、10px Fusion Pixel 字库支持，以及 TrailMate logo 息屏页面</li>
<li>Added nRF52 MeshCore discover entry points and protocol-aware chat send eligibility, so MC/MT channels and contacts can be browsed across protocol modes while sends stay limited to the active protocol / 新增 nRF52 MeshCore Discover 入口与协议感知的聊天发送资格控制，使 MC/MT 频道和联系人可跨协议查看，但发送仍限制在当前活动协议内</li>
<li>Added issue #33 support for firmware-provided Emoji input/display candidates and issue #61 support for firmware-provided Symbol candidates, replacing the earlier extension-pack-only route with built-in candidate sets for constrained devices / 针对 issue #33 新增固件内置 Emoji 输入/显示候选支持，并针对 issue #61 新增固件内置 Symbol 候选支持，用内置候选集替代此前仅依赖扩展包的路线，适配受限设备</li>
<li>Added issue #57 Pager-only main-menu keyboard backlight control, including a bottom Help hint and Help-modal shortcut documentation for adjusting keyboard backlight from the Pager main menu / 针对 issue #57 新增仅限 Pager 的主菜单键盘背光控制，包括底部 Help 提示，以及在 Pager 主菜单 Help 弹窗中说明调节键盘背光的快捷键</li>
<li>Added the European Cyrillic Extended language bundle with Russian locale coverage, Cyrillic external font coverage, and a Russian Cyrillic keyboard IME; the package remains installable through Extensions with locale, font, and IME metadata in the Pages pack catalog / 新增欧洲西里尔扩展语言包，包含俄语 locale 覆盖、西里尔外部字体覆盖和俄语西里尔键盘输入法；该包仍通过 Extensions 安装，并在 Pages 包目录中保留语言、字体和输入法 metadata</li>
<li>Added Walkie monitor mode controls and top-bar modulation/listen indicators, including LoRa/FSK modulation badges and a persistent monitor state surfaced outside the Walkie page / 新增对讲机守听模式控制与顶部栏调制/守听状态指示，包括 LoRa/FSK 调制标记，并在对讲机页面之外展示持续守听状态</li>
</ul>
<h3>Changed / 变更</h3>
<ul>
<li>Moved the protocol runtime closer to the 0.1.30 architecture target by routing MeshCore/Meshtastic UI actions, discover, text send, node actions, position sharing, traceroute/reply handling, and protocol effects through shared runtime/facade boundaries / 按 0.1.30 架构目标继续收敛协议 runtime，将 MeshCore/Meshtastic 的 UI 动作、discover、文本发送、节点动作、位置共享、traceroute/reply 处理和协议 effect 统一路由到共享 runtime/facade 边界</li>
<li>Reworked ESP shared SPI and storage ownership around a single SdFat/SdFs runtime, retaining the legacy <code>/chat/index.bin</code> plus <code>/chat/*.log</code> chat layout while removing the new <code>/chat_messages.bin</code> bypass and Arduino <code>SD.h</code>/<code>FS.h</code> storage backend paths / 围绕单一 SdFat/SdFs runtime 重做 ESP shared SPI 与存储所有权，保留旧的 <code>/chat/index.bin</code> + <code>/chat/*.log</code> 聊天布局，同时移除新的 <code>/chat_messages.bin</code> 旁路和 Arduino <code>SD.h</code>/<code>FS.h</code> 存储后端路径</li>
<li>Retired the unused T-LoRa Pager NFC runtime, build dependencies, board facts, power path, and shared-SPI CS participation, because NFC has no active product feature and was verified to interfere with reliable high-speed SD startup on the shared SPI bus / 移除未使用的 T-LoRa Pager NFC runtime、构建依赖、板级事实、电源路径和 shared SPI CS 参与；NFC 当前没有 active 产品功能，并经实机验证会干扰 shared SPI 上高速 SD 启动稳定性</li>
<li>Refined localization, IME, and language-pack handling for the 0.1.30 UI surface, including external CJK font-pack loading, manual language-load busy overlays, settings/team copy, and keyboard layout descriptor decoupling / 调整 0.1.30 UI 表面的本地化、输入法和语言包处理，包括外部 CJK 字体包加载、语言加载 busy overlay、设置/Team 文案，以及键盘布局描述符解耦</li>
<li>Updated Team, Contacts, and Nearby presentation to prefer short names and last-seen age semantics instead of online/offline labels where the protocol does not provide a reliable online state / 更新 Team、Contacts 与 Nearby 展示逻辑，在协议没有可靠在线状态时优先展示短名和 last-seen 时间语义，不再使用误导性的 online/offline 标签</li>
<li>Reworked Pager Walkie layout and input focus behavior so monitor controls no longer trap the rotary encoder as a volume-only control / 调整 Pager 对讲机布局和输入焦点行为，使守听控制不再让滚轮被音量控件单独吞掉</li>
<li>Updated GitHub Pages release co
…</li>
</ul>
]]></description>
  </item>
  <item>
    <title>Wadamesh beta_16</title>
    <link>https://dev.meshcore.ninja/firmware/wadamesh/releases/#release-beta_16</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_16</guid>
    <pubDate>Wed, 24 Jun 2026 13:45:58 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p><strong>wadamesh beta_16</strong> — Heltec V4 Expansion Kit support, European keyboards, and Wi-Fi updates (with rollback) are back.</p>
<p>Flash or update at <strong><a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">https://flasher.wadamesh.com</a></strong>, or grab it on-device under <strong>Settings → About</strong> if you're on a normally-flashed board.</p>
<hr />
<h2>New</h2>
<h3>Heltec V4 Expansion Kit · thanks @samuelcoustet (#29)</h3>
<p>If you've got the sensor expansion board on a Heltec V4, there's finally a proper home for it: a dedicated <strong>Sensors</strong> tab (temperature, humidity, pressure, GPS and battery, each with a small history chart), an environment readout on the Home screen, and an on-device <strong>mesh console</strong> for poking at the radio directly. None of it shows up on a bare V4 — it only appears when a sensor board is actually detected, so nothing changes for everyone else.</p>
<p>Worth being honest about this one: it was a real grind to land. It came in as a big pull request built against an old beta, so getting it in cleanly meant re-doing most of it by hand against current code and carefully gating every piece so it can't bloat or destabilise the T-Deck and Tanmatsu builds. The original work is @samuelcoustet's — thank you.</p>
<h3>European keyboards · thanks @samuelcoustet (#29)</h3>
<p>French, Dutch, German, Spanish and Italian layouts, both on-screen and on the T-Deck's physical keyboard. Choose one of those as your interface language and the matching layout is selected automatically.</p>
<h3>Wi-Fi updates are back — and you can roll back</h3>
<p>On a normally-flashed device (not installed through the Launcher), firmware updates over Wi-Fi return: <strong>Settings → About</strong>, no cable needed. New this round: <strong>Install a previous version</strong> — pick one of the last few betas and reinstall it over Wi-Fi, with an "are you sure?" first since it's a downgrade.</p>
<h2>Fixed · thanks @tun0</h2>
<ul>
<li>Closing a dialog no longer lets a scroll carry through to the page behind it (#50).</li>
<li>The contact action sheet no longer overflows the screen in landscape (#49).</li>
<li>The per-channel region field now shows your default region as the hint, instead of a generic placeholder (#48).</li>
<li>The status-bar clock no longer overlaps the node name on the V4.</li>
</ul>
<hr />
<p>Everything from beta_15 is included. Thanks to @samuelcoustet and @tun0 for the contributions this round.</p>
]]></description>
  </item>
  <item>
    <title>Fennek 2.6.3</title>
    <link>https://dev.meshcore.ninja/firmware/fennek/releases/#release-2.6.3</link>
    <guid isPermaLink="false">firmware-Fennek-2.6.3</guid>
    <pubDate>Wed, 24 Jun 2026 13:45:28 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>App-Kacheln im Launcher zeigen jetzt selbst gezeichnete Icons statt Text (Note, Kopfhörer, Buch, Mesh, Zahnrad, Würfel, Ordner, Notizblatt, Wecker, Pin, Gyro, Operatoren, Karteikarten, Kalender, Todo).</p>
<p>OTA: firmware.bin angehängt.</p>
]]></description>
  </item>
  <item>
    <title>Fennek 2.6.2</title>
    <link>https://dev.meshcore.ninja/firmware/fennek/releases/#release-2.6.2</link>
    <guid isPermaLink="false">firmware-Fennek-2.6.2</guid>
    <pubDate>Wed, 24 Jun 2026 12:51:56 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>Rechnen-App: Schätz-Wertung + 20-s-Ziel (gedeckelte Zahlenbereiche, Toleranzfenster für große Produkte/Geld-Prozente/SHARE/GROWTH, Sekunden-Anzeige). Kalender: CalDAV-Abo (iCloud u. a.) via <code>caldav:</code>-Feed mit Basic-Auth, Zugangsdaten in Settings-App/Konsole.</p>
]]></description>
  </item>
  <item>
    <title>Wadamesh beta_15</title>
    <link>https://dev.meshcore.ninja/firmware/wadamesh/releases/#release-beta_15</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_15</guid>
    <pubDate>Wed, 24 Jun 2026 09:02:52 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p><strong>wadamesh beta_15</strong> ✨</p>
<p>Two new touches, a couple of satisfying fixes, and one sensible default change.</p>
<h3>✨ New</h3>
<ul>
<li><strong>Amber power-save battery</strong> — idle power-saving now tints the status-bar battery <strong>amber</strong>, just like iPhone's Low Power Mode, instead of showing a separate moon icon. (T-Deck)</li>
<li><strong>@-mention picker</strong> — type <strong><code>@</code></strong> in the message box to pick a contact from a list and drop their name in. Thanks <strong>@robinshizuyo-dev</strong> (#42).</li>
</ul>
<h3>🩹 Fixed</h3>
<ul>
<li><strong>Lists stay put</strong> — closing a settings item, menu or chat no longer snaps the list back to the top; it stays where you left it. Thanks <strong>@ZorkaTheDog</strong> (#45).</li>
<li><strong>App-sent messages appear on the device</strong> — a DM sent from the MeshCore companion app now also shows in the right conversation on-screen. Thanks <strong>@HonzaDandy</strong> (#46).</li>
<li><strong>Typing reliability</strong> (T-Deck / Tanmatsu) — tapping a text field, even one that's already highlighted, starts typing right away, and the accent pop-up no longer interrupts typing outside of chats.</li>
<li><strong>Cursor cue</strong> — the text cursor only appears when a field is actually ready for input, so it's a dependable "you can type now" hint.</li>
<li><strong>Smoother map panning</strong> — tile rendering no longer trips the watchdog and reboots during heavy scrolling.</li>
</ul>
<h3>⚙️ Changed</h3>
<ul>
<li><strong>Keyboard navigation is now OFF by default.</strong> Prefer driving the UI with the trackball / arrow keys? Turn it back on in <strong>Settings → Keyboard</strong> (your choice sticks until you change it). The <strong>Tanmatsu</strong> keeps it on, since it has no touchscreen.</li>
</ul>
<p><strong>Everything from <a href="https://github.com/ALLFATHER-BV/wadamesh/releases/tag/beta_14" target="_blank" rel="noopener noreferrer">beta_14</a> is included.</strong></p>
<p>▶️ <strong>Flash in the browser:</strong> <a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">https://flasher.wadamesh.com</a> — or install via the Launcher / on-device update. 🙏</p>
]]></description>
  </item>
  <item>
    <title>Offband Mesh 1.1.0</title>
    <link>https://dev.meshcore.ninja/firmware/offband-mesh/releases/#release-1.1.0</link>
    <guid isPermaLink="false">firmware-Offband Mesh-1.1.0</guid>
    <pubDate>Wed, 24 Jun 2026 04:41:17 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>The headline is <strong>Epic F: the companion-API config command</strong> — a WiFi observer can now be
configured entirely from the app (WiFi, the full MQTT broker pool, display) over BLE —
plus the observer config/NVS-layer hardening that came out of bench-validating it. Still
on the <strong>MeshCore 1.16.0</strong> base.</p>
<h3>Added</h3>
<ul>
<li><strong>Companion-API config command (Epic F, #159)</strong> — configure a WiFi observer from the
MeshCore/Offband app over BLE: WiFi credentials, the full MQTT broker pool (per-slot
url / port / transport / auth / JWT claims / CA-cert / topic-prefix / IATA),
enable / disable / clear a slot, and display settings. Wholly observer-gated and surfaced
behind a new <code>WIFI_OBSERVER_SUPPORT</code> capability bit + <code>FIRMWARE_VER_CODE 14</code>, so stock
companions are unaffected. (#160–#169)</li>
<li><strong>Per-broker live state in the broker read</strong> (#172) — each slot now reports its live
connection state (<code>connecting</code> / <code>up</code> / <code>backoff</code> / <code>held</code> …) + last-error class, so the
app shows whether a broker actually connected, not just that it's enabled.</li>
<li><strong>Resolved-default hints</strong> (#173, #186) — when <code>jwt_owner</code> / <code>iata_override</code> are unset,
the read shows the value the device will actually use at connect (its own pubkey / the
global IATA) as a placeholder instead of a confusing blank — in both the pool dump and
the per-field read.</li>
</ul>
<h3>Changed</h3>
<ul>
<li><strong>Honest observer config writes (SAFELANE §6, #181)</strong> — the config / NVS write path used
to silently swallow failures (a broker disable could ACK success while nothing changed).
Every writer, the live-reload path, and the crash logger itself now surface + log
failures with context. This is what root-caused #179.</li>
<li><strong>Compact broker config storage + seamless migration</strong> (#182) — broker config is stored
as small per-key entries (no blank fields) rather than one ~1 KB blob, so writes fit a
near-full NVS; a one-time <strong>invisible boot migration</strong> reclaims space on upgrade, so the
operator never sees a transient write error.</li>
<li><strong>CoreScope (okimesh) default broker</strong> → <code>mqtt://mqtt1.okimesh.org:1883</code> (#170).</li>
<li><strong>Offband tell in MQTT</strong> (#174) — observer nodes append a 📡 to their display name in
MQTT payloads, so feeds / maps can flag Offband observers.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li><strong>#179</strong> — a broker disable ACK'd success while the dump still reported <code>enabled=1</code>.
Root-caused as a near-full-NVS write failure the old code lied about; fixed by #181
(honest write) + #182 (storage that fits). Verified on hardware.</li>
<li><strong>Observer capped at 1 concurrent TLS broker</strong> (#171) — a heap guard stops the OOM reboot
when a 2nd TLS/wss broker's ~60 KB mbedTLS context exhausts the Heltec V3 heap. Measured
on hardware (1 wss ≈ 63 KB free, 2 wss ≈ crash).</li>
<li><strong>BLE connect survives the client's reconnect-thrash</strong> (#178) — a deeper ESP32 BLE frame
queue (4 → 12) + stream terminators on reconnect, so a mid-stream reconnect can't leave
the app's contact / settings sync hung. Affects companion <strong>and</strong> observer. (The root —
the client's uncapped reconnect retry — is paced client-side in meshcore-client.)</li>
<li><strong>Crash log reliable for the whole boot</strong> (#183) — the 1 Hz heartbeat was flooding the
4 KB RTC crash-ring (wrapped in ~50 s) and evicting real crash diagnostics; the heartbeat
now writes the ring every 30 s / on a sharp heap drop, so a post-reboot dump keeps the
evidence that explains a crash past boot+50 s.</li>
</ul>
<h3>CI / build</h3>
<ul>
<li><strong>Heltec T114</strong> (nRF52) companion added to the CI matrix (#185) — first nRF52-companion
build coverage (complements the existing RAK4631 repeater).</li>
</ul>
<hr />
<h3>Which file do I download?</h3>
<table>
<thead>
<tr>
<th>File</th>
<th>What it is</th>
<th>When to use it</th>
</tr>
</thead>
<tbody><tr>
<td><code>*-merged.bin</code> (ESP32 — Heltec V3/V4, XIAO)</td>
<td><strong>Full image</strong> — bootloader + partition table + app in one, flashed at <code>0x0</code> after a chip erase. Self-contained, works on a blank chip.</td>
<td><strong>First install / clean setup.</strong> In a web flasher this is the <strong>"Full Firmware"</strong> option.</td>
</tr>
<tr>
<td><code>*.bin</code> (ESP32)</td>
<td><strong>App only</strong> — flashed at the app offset (<code>0x10000</code>); the bootloader m</td>
<td></td>
</tr>
<tr>
<td>…</td>
<td></td>
<td></td>
</tr>
</tbody></table>
]]></description>
  </item>
  <item>
    <title>Offband Mesh 1.1.0-rc1</title>
    <link>https://dev.meshcore.ninja/firmware/offband-mesh/releases/#release-1.1.0-rc1</link>
    <guid isPermaLink="false">firmware-Offband Mesh-1.1.0-rc1</guid>
    <pubDate>Wed, 24 Jun 2026 04:24:07 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>The headline is <strong>Epic F: the companion-API config command</strong> — a WiFi observer can now be
configured entirely from the app (WiFi, the full MQTT broker pool, display) over BLE —
plus the observer config/NVS-layer hardening that came out of bench-validating it. Still
on the <strong>MeshCore 1.16.0</strong> base.</p>
<h3>Added</h3>
<ul>
<li><strong>Companion-API config command (Epic F, #159)</strong> — configure a WiFi observer from the
MeshCore/Offband app over BLE: WiFi credentials, the full MQTT broker pool (per-slot
url / port / transport / auth / JWT claims / CA-cert / topic-prefix / IATA),
enable / disable / clear a slot, and display settings. Wholly observer-gated and surfaced
behind a new <code>WIFI_OBSERVER_SUPPORT</code> capability bit + <code>FIRMWARE_VER_CODE 14</code>, so stock
companions are unaffected. (#160–#169)</li>
<li><strong>Per-broker live state in the broker read</strong> (#172) — each slot now reports its live
connection state (<code>connecting</code> / <code>up</code> / <code>backoff</code> / <code>held</code> …) + last-error class, so the
app shows whether a broker actually connected, not just that it's enabled.</li>
<li><strong>Resolved-default hints</strong> (#173, #186) — when <code>jwt_owner</code> / <code>iata_override</code> are unset,
the read shows the value the device will actually use at connect (its own pubkey / the
global IATA) as a placeholder instead of a confusing blank — in both the pool dump and
the per-field read.</li>
</ul>
<h3>Changed</h3>
<ul>
<li><strong>Honest observer config writes (SAFELANE §6, #181)</strong> — the config / NVS write path used
to silently swallow failures (a broker disable could ACK success while nothing changed).
Every writer, the live-reload path, and the crash logger itself now surface + log
failures with context. This is what root-caused #179.</li>
<li><strong>Compact broker config storage + seamless migration</strong> (#182) — broker config is stored
as small per-key entries (no blank fields) rather than one ~1 KB blob, so writes fit a
near-full NVS; a one-time <strong>invisible boot migration</strong> reclaims space on upgrade, so the
operator never sees a transient write error.</li>
<li><strong>CoreScope (okimesh) default broker</strong> → <code>mqtt://mqtt1.okimesh.org:1883</code> (#170).</li>
<li><strong>Offband tell in MQTT</strong> (#174) — observer nodes append a 📡 to their display name in
MQTT payloads, so feeds / maps can flag Offband observers.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li><strong>#179</strong> — a broker disable ACK'd success while the dump still reported <code>enabled=1</code>.
Root-caused as a near-full-NVS write failure the old code lied about; fixed by #181
(honest write) + #182 (storage that fits). Verified on hardware.</li>
<li><strong>Observer capped at 1 concurrent TLS broker</strong> (#171) — a heap guard stops the OOM reboot
when a 2nd TLS/wss broker's ~60 KB mbedTLS context exhausts the Heltec V3 heap. Measured
on hardware (1 wss ≈ 63 KB free, 2 wss ≈ crash).</li>
<li><strong>BLE connect survives the client's reconnect-thrash</strong> (#178) — a deeper ESP32 BLE frame
queue (4 → 12) + stream terminators on reconnect, so a mid-stream reconnect can't leave
the app's contact / settings sync hung. Affects companion <strong>and</strong> observer. (The root —
the client's uncapped reconnect retry — is paced client-side in meshcore-client.)</li>
<li><strong>Crash log reliable for the whole boot</strong> (#183) — the 1 Hz heartbeat was flooding the
4 KB RTC crash-ring (wrapped in ~50 s) and evicting real crash diagnostics; the heartbeat
now writes the ring every 30 s / on a sharp heap drop, so a post-reboot dump keeps the
evidence that explains a crash past boot+50 s.</li>
</ul>
<h3>CI / build</h3>
<ul>
<li><strong>Heltec T114</strong> (nRF52) companion added to the CI matrix (#185) — first nRF52-companion
build coverage (complements the existing RAK4631 repeater).</li>
</ul>
<hr />
<h3>Which file do I download?</h3>
<table>
<thead>
<tr>
<th>File</th>
<th>What it is</th>
<th>When to use it</th>
</tr>
</thead>
<tbody><tr>
<td><code>*-merged.bin</code> (ESP32 — Heltec V3/V4, XIAO)</td>
<td><strong>Full image</strong> — bootloader + partition table + app in one, flashed at <code>0x0</code> after a chip erase. Self-contained, works on a blank chip.</td>
<td><strong>First install / clean setup.</strong> In a web flasher this is the <strong>"Full Firmware"</strong> option.</td>
</tr>
<tr>
<td><code>*.bin</code> (ESP32)</td>
<td><strong>App only</strong> — flashed at the app offset (<code>0x10000</code>); the bootloader m</td>
<td></td>
</tr>
<tr>
<td>…</td>
<td></td>
<td></td>
</tr>
</tbody></table>
]]></description>
  </item>
  <item>
    <title>MeshCore Ninja 2026.6.0</title>
    <link>https://dev.meshcore.ninja/software/meshcore-ninja/releases/#release-2026.6.0</link>
    <guid isPermaLink="false">software-MeshCore Ninja-2026.6.0</guid>
    <pubDate>Wed, 24 Jun 2026 04:10:12 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<p><strong>Full Changelog</strong>: <a href="https://github.com/meshcore-cz/meshcore-ninja/compare/v0.2.0...v2026.6.0" target="_blank" rel="noopener noreferrer">https://github.com/meshcore-cz/meshcore-ninja/compare/v0.2.0...v2026.6.0</a></p>
]]></description>
  </item>
  <item>
    <title>MeshCoreNG 1.1.4</title>
    <link>https://dev.meshcore.ninja/firmware/meshcore-ng/releases/#release-1.1.4</link>
    <guid isPermaLink="false">firmware-MeshCoreNG-1.1.4</guid>
    <pubDate>Wed, 24 Jun 2026 01:46:26 GMT</pubDate>
    <category>firmware</category>
  </item>
  <item>
    <title>Wadamesh beta_14</title>
    <link>https://dev.meshcore.ninja/firmware/wadamesh/releases/#release-beta_14</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_14</guid>
    <pubDate>Tue, 23 Jun 2026 22:44:21 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p><strong>wadamesh beta_14 — hotfix</strong> 🩹</p>
<p>Fixes a beta_13 regression: with <strong>keyboard navigation turned off</strong> (Settings → Keyboard), the physical keyboard stopped typing into text fields entirely on the <strong>T-Deck</strong> and <strong>Tanmatsu</strong>. Typing now works again with keyboard-nav off; with it on, behaviour is unchanged. (The Heltec V4 was never affected — it has no keyboard navigation.)</p>
<p><strong>Everything from <a href="https://github.com/ALLFATHER-BV/wadamesh/releases/tag/beta_13" target="_blank" rel="noopener noreferrer">beta_13</a> is included</strong> — the community features from <strong>@Yazutsu</strong>, <strong>@tun0</strong>, <strong>@Vybo</strong> and <strong>@samuelcoustet</strong> (room-post author names, the Direct 0-hop filter, beer emoji / status-bar unread tap / new-contact toast toggle / Czech accents, trackball edge-scroll, and the companion/TCP/OTA fixes) plus the keyboard-nav, special-characters picker and 12-hour-clock work. See the <a href="https://github.com/ALLFATHER-BV/wadamesh/releases/tag/beta_13" target="_blank" rel="noopener noreferrer">beta_13 notes</a> for the full list and credits. 🙏</p>
<p>▶️ <strong>Flash in the browser:</strong> <a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">https://flasher.wadamesh.com</a> — or install via the Launcher / on-device update.</p>
]]></description>
  </item>
  <item>
    <title>Wadamesh beta_13</title>
    <link>https://dev.meshcore.ninja/firmware/wadamesh/releases/#release-beta_13</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_13</guid>
    <pubDate>Tue, 23 Jun 2026 22:03:59 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p><strong>wadamesh beta_13 — community drop</strong> 🎉</p>
<p>A big community release: most of the headline features came straight from contributor pull requests, alongside the keyboard, typing and quality-of-life fixes promised after beta_12. Huge thanks to everyone sending PRs, opening issues and reporting bugs — <strong>@Yazutsu</strong>, <strong>@tun0</strong>, <strong>@Vybo</strong> and <strong>@samuelcoustet</strong> all have their work in this build. 🙏</p>
<p>▶️ <strong>Flash in the browser:</strong> <a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">https://flasher.wadamesh.com</a> — or install via the Launcher / on-device update.</p>
<h2>From contributors</h2>
<h3>Room-server posts show the author — by @Yazutsu (#40, closes #32)</h3>
<p>Room-server messages now show the actual poster's name on each bubble instead of the room's own name.</p>
<h3>Direct (0-hop) filter — by @tun0 (#39)</h3>
<p>A new "Direct (0-hop)" filter for the contact list and the map: show only the nodes you're hearing directly, with no repeater hops in between.</p>
<h3>Trackball edge-scroll — by @tun0 (#38)</h3>
<p>Optional "edge scroll" — push the trackball cursor past a screen edge to scroll the list underneath it (off by default, under Settings → Keyboard).</p>
<h3>Emoji, unread tap, contact toast, Czech accents — by @Vybo (#22)</h3>
<p>Beer emoji baked in colour, tap the status-bar unread badge to jump to your Chats, a new "notify on new contact" toggle, and Czech accents in the accent pop-up.</p>
<h3>Companion / transport fixes — by @samuelcoustet (#29)</h3>
<p>TCP now restarts immediately after off → on, the OTA action is hidden when there's no update slot to use, and a TCP-toggle alert race is fixed. <em>(Cherry-picked from #29; the rest of that PR — the EU keyboards and the Expansion-Kit UI — will follow as focused PRs.)</em></p>
<h2>Typing &amp; keyboard navigation (T-Deck + Tanmatsu)</h2>
<ul>
<li>Open a chat or channel and the cursor is ready — type straight away. Every other field waits for Enter before it captures the keyboard, so the letter-navigation keys keep working.</li>
<li>Enter (or Esc / back) on an empty message box drops the cursor and re-selects the field, so you can navigate away with the buttons again.</li>
<li>The menu-bar letter shortcuts no longer jump you to another page while you're typing.</li>
<li>New <strong>"Show menu-bar letters"</strong> setting under Settings → Keyboard (off by default).</li>
<li>The accent pop-up no longer grabs the keyboard when it appears.</li>
</ul>
<h2>Composer &amp; clock</h2>
<ul>
<li>New dedicated <strong>"Special characters"</strong> picker for symbols that aren't on the keyboard (<code>% $ @ # &amp; =</code>, currency, maths, accents) — separate from the emoji picker.</li>
<li><strong>Long-press</strong> one of your sent messages to <strong>Resend</strong> it.</li>
<li>The <strong>12-hour clock</strong> setting now applies everywhere — top bar, chat bubbles and lock screen — not just the chat list.</li>
</ul>
<h2>Fixes</h2>
<ul>
<li><strong>Heltec V4:</strong> removed the after-crash report prompt — that board has no SD card or reachable storage to save the report to, so it was a dead end. (The T-Deck still offers it.)</li>
<li>When both Wi-Fi and GPS are off, the clock now sets itself from the timestamps on messages received over the mesh.</li>
</ul>
<hr />
<p>Full notes in <a href="https://github.com/ALLFATHER-BV/wadamesh/blob/HEAD/release-notes/beta_13.txt" target="_blank" rel="noopener noreferrer"><code>release-notes/beta_13.txt</code></a>. Thanks again to all contributors and bug reporters — keep it coming! 🚀</p>
]]></description>
  </item>
  <item>
    <title>Wadamesh beta_12</title>
    <link>https://dev.meshcore.ninja/firmware/wadamesh/releases/#release-beta_12</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_12</guid>
    <pubDate>Tue, 23 Jun 2026 06:52:16 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h2>wadamesh beta_12 — GPS hotfix</h2>
<p>A focused hotfix for the GPS slowdown several of you reported. Everything else from <strong>beta_11</strong> is unchanged — this release is GPS-only.</p>
<h3>🛰️ GPS fix</h3>
<p>On the T-Deck, getting a position fix had gone slow — minutes instead of about a minute — and for some it wouldn't acquire at all. The GPS streams its data over a small serial buffer, and on the busy touch UI a single heavy screen redraw could stall long enough to overflow that buffer and drop the satellite data mid-stream, forcing the receiver to start the fix over. The buffer is now <strong>16× larger</strong>, so redraws no longer cost you the fix. Confirmed on-device — acquisition is back to normal.</p>
<h3>💬 A note from Kaj</h3>
<p>More and more people are picking up wadamesh lately — which is genuinely awesome — and it's surfacing feature requests and bug reports fast, in big numbers. I can't get back to every post in every channel, but I'm on it: I'm prioritising the fixes and quality-of-life improvements, and I'll be working through them later today. Thanks for all the reports and for the patience! 🙏</p>
<hr />
<p><strong>Install:</strong> <a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">flasher.wadamesh.com</a> · grab the bins below · update on-device (Settings → check for update) · or via the Launcher store.</p>
<table>
<thead>
<tr>
<th>Board</th>
<th>Web-flash / fresh install</th>
<th>OTA / app-only</th>
</tr>
</thead>
<tbody><tr>
<td>LilyGo T-Deck</td>
<td><code>wadamesh-tdeck-merged.bin</code></td>
<td><code>wadamesh-tdeck.bin</code></td>
</tr>
<tr>
<td>Heltec V4 TFT</td>
<td><code>wadamesh-heltec-v4-tft-merged.bin</code></td>
<td><code>wadamesh-heltec-v4-tft.bin</code></td>
</tr>
</tbody></table>
]]></description>
  </item>
  <item>
    <title>EastMesh 2026.6.4</title>
    <link>https://dev.meshcore.ninja/firmware/eastmesh/releases/#release-2026.6.4</link>
    <guid isPermaLink="false">firmware-EastMesh-2026.6.4</guid>
    <pubDate>Tue, 23 Jun 2026 00:27:09 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>.</p>
<p>This release replaces the retired LetsMesh brokers with the new MeshMapper broker and reworks broker selection into Primary and Secondary slots.</p>
<h3>What's Changed</h3>
<ul>
<li>Added the <code>meshmapper</code> curated broker (<code>wss://mqtt.meshmapper.net:443/mqtt</code>) using WSS, verified TLS, and MeshCore JWT authentication with the broker host as the token audience.</li>
<li>Added <code>get mqtt.meshmapper</code> and <code>set mqtt.meshmapper on|off</code> to toggle the MeshMapper broker.</li>
<li>Reworked the web-panel broker section into <strong>Primary MQTT</strong> and <strong>Secondary MQTT</strong> dropdowns that enforce the two-broker maximum and reveal the custom host, username, and password fields when Custom is selected.</li>
<li>Retired the unmaintained LetsMesh EU/US brokers; they remain selectable but are marked retired, and saved selections are cleared once on upgrade so dead brokers stop retrying.</li>
<li>Shortened <code>get mqtt.status</code> to report the two active broker slots as <code>p:&lt;broker&gt;:&lt;state&gt;</code> and <code>s:&lt;broker&gt;:&lt;state&gt;</code> (for example <code>p:meshmapper:up</code>), keeping the reply within the LoRa text limit.</li>
<li>Custom MQTT remains username/password only; no JWT/web auth is used for custom brokers.</li>
<li>Updated the README, web panel, and custom CLI guides for MeshMapper and the Primary/Secondary broker layout.</li>
</ul>
<h3>Breaking Changes</h3>
<ul>
<li><code>get mqtt.status</code> output changed from per-broker fields to <code>p:</code>/<code>s:</code> broker slots; update anything that parses the previous format.</li>
<li>Saved LetsMesh EU/US broker selections are cleared once on upgrade; re-enable a broker such as MeshMapper if you need a second uplink.</li>
</ul>
<h3>Notes</h3>
<ul>
<li><code>eastmesh-au</code> remains the recommended MQTT endpoint once <code>mqtt.iata</code> is configured; <code>meshmapper</code> is available as a global second broker.</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>, etc.). A maximum of two brokers can be enabled at once.</li>
<li>LetsMesh EU/US are retired but still selectable for legacy use.</li>
<li>Custom MQTT is available for private broker deployments. 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>MeshMonitor 4.11.5</title>
    <link>https://dev.meshcore.ninja/software/meshmonitor/releases/#release-4.11.5</link>
    <guid isPermaLink="false">software-MeshMonitor-4.11.5</guid>
    <pubDate>Mon, 22 Jun 2026 21:19:46 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h2>🚑 Hotfix release — supersedes v4.11.4 (retracted)</h2>
<p><strong>v4.11.4 was pulled</strong> because migration 033 crashed startup on PostgreSQL and on fresh installs with <code>column "sourceId" does not exist</code> (#3657). v4.11.5 fixes that and carries everything that was in v4.11.4.</p>
<blockquote>
<p><strong>If you ran v4.11.4</strong>, update to v4.11.5. The boot crash is resolved.</p>
</blockquote>
<h3>🔴 Hotfix (#3657)</h3>
<ul>
<li>Migration 033's <code>channel_database</code> backfill is now guarded on the legacy <code>sourceId</code> column existing (it's global-by-design — migration 021 no longer adds it and 063 drops it). Fixes the PostgreSQL / fresh-install boot crash introduced in v4.11.4.</li>
</ul>
<h3>Also included (from the retracted v4.11.4)</h3>
<p><strong>Critical</strong></p>
<ul>
<li>PostgreSQL boot-loop fix (<code>tables can have at most 1600 columns</code>) (#3639)</li>
</ul>
<p><strong>Features</strong></p>
<ul>
<li>MeshCore role icons in the map + DM node lists (#3647)</li>
<li>MeshCore favorites pinned to the top of the DM list (#3620)</li>
<li>Marker spiderfying for overlapping nodes on Map Analysis + Unified maps (#3612)</li>
<li>Channel "overshadow" warning for same-key/different-name Channel Database entries (#3644)</li>
<li>Traceroute <code>packetId</code> for cross-source correlation (#3623)</li>
</ul>
<p><strong>Fixes</strong></p>
<ul>
<li>Node disconnects / TX failures since 4.11.x (#3637)</li>
<li>Custom-LoRa-config primary channel mislabeled "LongFast" (#3644)</li>
<li>TCP reconnect shows the real per-source address (#3611)</li>
<li>Fictitious traceroute segments removed; incoming traceroutes visible (#3622)</li>
<li>MeshCore hashtag <code>#channel</code> secrets over plain HTTP-via-IP + at save time (#3606, #3607)</li>
<li>MeshCore Last Heard preserved across reconnect (#3645)</li>
<li>MeshCore new nodes populate fully when heard live (#3646)</li>
<li>Unified-map neighbor lines follow the merged marker (#3642)</li>
<li>Adaptive node-type filter per source protocol (#3610)</li>
<li>Saner single-anchor position-estimate uncertainty (#3616)</li>
</ul>
<h2>🚀 MeshMonitor v4.11.5</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.11.5
</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>MeshCoreNG 1.1.3</title>
    <link>https://dev.meshcore.ninja/firmware/meshcore-ng/releases/#release-1.1.3</link>
    <guid isPermaLink="false">firmware-MeshCoreNG-1.1.3</guid>
    <pubDate>Mon, 22 Jun 2026 17:56:43 GMT</pubDate>
    <category>firmware</category>
  </item>
  <item>
    <title>MeshCore Ninja 0.2.0</title>
    <link>https://dev.meshcore.ninja/software/meshcore-ninja/releases/#release-0.2.0</link>
    <guid isPermaLink="false">software-MeshCore Ninja-0.2.0</guid>
    <pubDate>Mon, 22 Jun 2026 17:39:22 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<p><strong>Full Changelog</strong>: <a href="https://github.com/meshcore-cz/meshcore-ninja/commits/v0.2.0" target="_blank" rel="noopener noreferrer">https://github.com/meshcore-cz/meshcore-ninja/commits/v0.2.0</a></p>
]]></description>
  </item>
  <item>
    <title>Wadamesh beta_11</title>
    <link>https://dev.meshcore.ninja/firmware/wadamesh/releases/#release-beta_11</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_11</guid>
    <pubDate>Mon, 22 Jun 2026 17:17:51 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h2>wadamesh beta_11</h2>
<p><strong>Flash it:</strong> <a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">flasher.wadamesh.com</a> (Chrome/Edge, USB) · or pull it on-device via <strong>Settings → About → Check for updates</strong> · or side-load through the <strong>Launcher</strong> store.</p>
<p>The headline this round is <strong>full keyboard navigation</strong> — and every key is hotkey-bindable. This is the foundation for upcoming keyboard-first devices like the <strong>Tanmatsu T-Pager</strong> that have no touchscreen, and it already gives every <strong>T-Deck</strong> a fast, reliable way to drive wadamesh entirely from the keyboard.</p>
<hr />
<h3>⌨️ Keyboard navigation (new — on by default)</h3>
<ul>
<li>Drive the whole UI without the touchscreen: the <strong>WASDZ</strong> cluster moves the on-screen selection in the <em>actual direction</em> you press (W up, A left, Z down, D right), <strong>S</strong> selects, <strong>Q</strong> goes back.</li>
<li>Each bottom tab has its own hotkey — <strong>E</strong> Messages, <strong>R</strong> Contacts, <strong>T</strong> Home, <strong>U</strong> Map, <strong>I</strong> Settings — shown as a small letter on the tab icon. The Home hotkey mirrors tapping Home: press again to flip between Commander and the app drawer.</li>
<li>New <strong>scroll up / down</strong> keys (default <strong>F / C</strong>).</li>
<li><strong>Everything is remappable</strong> — directions, select, back, the per-tab hotkeys, and the scroll keys — under <strong>Settings → Keyboard</strong>. Toggle the whole feature off there too (the choice persists).</li>
<li>Cleaner focus: the selected item shows as reverse-video (a bright outline for switches) instead of a coloured border, and the highlight only appears while you're actually navigating with the keys.</li>
</ul>
<h3>🛡️ Stability</h3>
<ul>
<li>Fixed a reboot that could occur when <strong>receiving a message</strong>, especially during advert/message floods — a use-after-free while a list rebuilt mid-scroll (<strong>#27</strong>).</li>
<li>After a crash, the device now <strong>detects it on the next boot</strong> and offers to save the crash report so you can send it in — no more digging through Settings.</li>
</ul>
<h3>🗺️ Map</h3>
<ul>
<li>Map options can now switch the zoom control between the <strong>slider</strong> and a <strong>+/- button pair</strong>, like older builds (<strong>#26</strong>).</li>
<li><strong>Route replay</strong> now opens on a wide overview so you can see where the hops start and the whole path at a glance — and you can <strong>pan and zoom freely while it plays</strong>.</li>
</ul>
<h3>🏠 Home</h3>
<ul>
<li>New <strong>"App drawer as home"</strong> option (in the app drawer's cog) makes the launcher your home screen instead of the Commander view.</li>
</ul>
<h3>🔓 Open source</h3>
<ul>
<li>The in-progress <strong>Tanmatsu (ESP32-P4)</strong> port source is now part of the public tree.</li>
</ul>
<hr />
<p><strong>Boards:</strong> LilyGo T-Deck · Heltec V4 TFT. Use <code>*-merged.bin</code> for a fresh full-flash at <code>0x0</code>; the plain <code>.bin</code> is the app-only OTA/Launcher image.</p>
]]></description>
  </item>
  <item>
    <title>Fennek 2.6.0</title>
    <link>https://dev.meshcore.ninja/firmware/fennek/releases/#release-2.6.0</link>
    <guid isPermaLink="false">firmware-Fennek-2.6.0</guid>
    <pubDate>Mon, 22 Jun 2026 16:46:35 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h2>Änderungen</h2>
<ul>
<li><strong>Tic-Tac-Toe</strong>: Fennek macht mit 20 % Wahrscheinlichkeit einen zufälligen Zug statt Minimax — der Spieler hat jetzt eine echte Chance zu gewinnen</li>
<li><strong>Adaptives Polling</strong>: Eingabe-Polling drosselt sich nach 3 s Leerlauf von ~100 Hz auf ~30 Hz (spart Core-1-Wachzeit ohne spürbare Latenz)</li>
<li><strong>Tap-Log-Drossel</strong>: Gehaltener Finger flutete Serial-Konsole mit Dauer-Taps — jetzt max. 1 Log-Zeile alle 400 ms</li>
<li><strong><code>power::idleMs()</code></strong>: Neue Funktion gibt Millisekunden seit letzter Aktivität zurück</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshCoreNG 1.1.1</title>
    <link>https://dev.meshcore.ninja/firmware/meshcore-ng/releases/#release-1.1.1</link>
    <guid isPermaLink="false">firmware-MeshCoreNG-1.1.1</guid>
    <pubDate>Mon, 22 Jun 2026 16:21:57 GMT</pubDate>
    <category>firmware</category>
  </item>
  <item>
    <title>MeshCore Signal Tester 1.2.1</title>
    <link>https://dev.meshcore.ninja/software/meshcore-signal-tester/releases/#release-1.2.1</link>
    <guid isPermaLink="false">software-MeshCore Signal Tester-1.2.1</guid>
    <pubDate>Mon, 22 Jun 2026 15:32:24 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h3>Added</h3>
<ul>
<li><strong>Auto-reconnect</strong> — an optional toggle that automatically retries the last
device after an unexpected drop, before the disconnect alarm. Shown only
where it can actually work (not for Bluetooth in a mobile browser).</li>
<li><strong>Nicer packet sound</strong> — a pleasant bell whose pitch still tracks signal
strength, plus a new "disconnect only" sound mode. The disconnect alarm now
sounds on every unexpected drop.</li>
</ul>
<h3>Changed</h3>
<ul>
<li><strong>Location now starts automatically when you connect (Android)</strong> — no need to
tap the 3D map's "Enable location" button anymore.</li>
<li><strong>Steadier location on the 3D map</strong> — occasional GPS jumps (sudden ~200 m
hops) are filtered out.</li>
<li><strong>3D map zooms in to street level</strong> even on large maps, and deep zoom is
smoother.</li>
<li><strong>3D camera framing</strong> — "Center on me" no longer jerks at the end of its move,
and repeaters are framed with a little headroom above them.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>2D charts could stop updating with Display set to <strong>All</strong>, until you switched
the Display window and back.</li>
<li>Help (?) tooltips could appear away from their icon.</li>
<li>Seen Repeaters now shows the true last RSSI/SNR, not a rounded/averaged value.</li>
<li>Received Packets always lists every repeater as a column, not only the ones on
the current page.</li>
<li>3D map selection no longer clears itself on its own.</li>
<li>3D map tiles no longer flicker while panning or zooming.</li>
<li>Footer text now has proper contrast in light mode.</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MCLite 0.4.0</title>
    <link>https://dev.meshcore.ninja/firmware/mclite/releases/#release-0.4.0</link>
    <guid isPermaLink="false">firmware-MCLite-0.4.0</guid>
    <pubDate>Mon, 22 Jun 2026 14:47:00 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h2>What's Changed</h2>
<ul>
<li>Chat screen header buttons: contact's map, requesting telemetry, and info dialog. by @jason-s13r in <a href="https://github.com/laserir/MCLite/pull/30" target="_blank" rel="noopener noreferrer">https://github.com/laserir/MCLite/pull/30</a></li>
<li>Add more radio presets by @jason-s13r in <a href="https://github.com/laserir/MCLite/pull/29" target="_blank" rel="noopener noreferrer">https://github.com/laserir/MCLite/pull/29</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/laserir/MCLite/compare/v0.3.9...v0.4.0" target="_blank" rel="noopener noreferrer">https://github.com/laserir/MCLite/compare/v0.3.9...v0.4.0</a></p>
]]></description>
  </item>
  <item>
    <title>Meck 1.12.3</title>
    <link>https://dev.meshcore.ninja/firmware/meck/releases/#release-1.12.3</link>
    <guid isPermaLink="false">firmware-Meck-1.12.3</guid>
    <pubDate>Mon, 22 Jun 2026 10:04:17 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>v1.12.3 is a small patch release on top of <a href="https://github.com/pelgraine/Meck/releases/tag/v1.12.2" target="_blank" rel="noopener noreferrer">v1.12.2</a> for the <strong>T-Deck Max</strong>. It adds a configurable keyboard backlight brightness setting, and fixes the unread message counter bug on standalone (no BLE/WiFi) builds, where the home-screen count and channel unread badges never updated.</p>
<h2>What's Changed in v1.12.3</h2>
<h3>Keyboard LED -- adjustable brightness</h3>
<p>The keyboard backlight (toggled by pressing both <strong>Shift</strong> keys together) was previously fixed at a very dim level, too faint to be useful for some users. A new <strong>Keyboard LED</strong> setting now lets you choose the brightness.</p>
<ul>
<li>Found in <strong>Settings</strong>, directly below <strong>Backlight Brightness</strong>.</li>
<li>Adjustable from 5% to 100% in 5% steps, defaulting to 50% -- noticeably brighter than before.</li>
<li>The level takes effect the next time you toggle the keyboard backlight on.</li>
</ul>
<h3>Standalone unread counter -- now updates as expected</h3>
<p>On standalone builds (no BLE or WiFi companion), the <strong>MSG</strong> count on the home screen and the unread badges in the channel picker stayed at zero even as messages arrived and displayed normally. The device was effectively behaving as though a companion app were permanently connected, which marks each message as read the instant it arrives.</p>
<p>Standalone builds now track unread messages correctly:</p>
<ul>
<li>The home-screen <strong>MSG</strong> count and per-channel <code>*N</code> badges climb as messages come in.</li>
<li>Opening a channel clears its unread count, as before.</li>
<li>The direct-message counter and the new-message screen wake, which were suppressed by the same issue, work again.</li>
</ul>
<p>BLE and WiFi builds are unaffected -- they already track their real connection state, so on-device counts intentionally stay at zero while the companion app is connected and update once it disconnects.</p>
<p>Only the <strong>T-Deck Max</strong> build is updated in this release; all other devices remain on <a href="https://github.com/pelgraine/Meck/releases/tag/v1.12.2" target="_blank" rel="noopener noreferrer">v1.12.2</a>.</p>
<h2>First-Time Flashing</h2>
<p>Each build comes in two forms:</p>
<ul>
<li><p><strong><code>&lt;name&gt;-merged.bin</code></strong> -- bootloader, partition table, and firmware in a single image. Flash at address <code>0x0</code>. Use this for a first-time flash, when coming from other firmware, <strong>or if a device will not boot after an update</strong>.</p>
</li>
<li><p><strong><code>&lt;name&gt;.bin</code></strong> -- application firmware only. Use this to update an existing Meck install, including OTA updates from your phone (<strong>Settings -&gt; OTA Tools</strong>).</p>
</li>
</ul>
<p>The partition layout supports dual OTA slots, so the previous firmware remains on the inactive partition as an automatic rollback target if a new image fails to boot.</p>
<h2>MeshCore Companion Apps</h2>
<p><strong>BLE variants</strong> connect to the standard MeshCore companion apps:</p>
<ul>
<li>Web: <a href="https://app.meshcore.nz/" target="_blank" rel="noopener noreferrer">https://app.meshcore.nz/</a></li>
<li>Android: <a href="https://play.google.com/store/apps/details?id=com.liamcottle.meshcore.android" target="_blank" rel="noopener noreferrer">https://play.google.com/store/apps/details?id=com.liamcottle.meshcore.android</a></li>
<li>iOS: <a href="https://apps.apple.com/us/app/meshcore/id6742354151" target="_blank" rel="noopener noreferrer">https://apps.apple.com/us/app/meshcore/id6742354151</a></li>
</ul>
<p><strong>WiFi variants</strong> connect via TCP on port 5000:</p>
<ul>
<li>Web: <a href="https://app.meshcore.nz/" target="_blank" rel="noopener noreferrer">https://app.meshcore.nz/</a></li>
<li>meshcore.js: <a href="https://github.com/liamcottle/meshcore.js" target="_blank" rel="noopener noreferrer">https://github.com/liamcottle/meshcore.js</a></li>
<li>Python CLI: <a href="https://github.com/fdlamotte/meshcore-cli" target="_blank" rel="noopener noreferrer">https://github.com/fdlamotte/meshcore-cli</a></li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshCore Solo 1.20</title>
    <link>https://dev.meshcore.ninja/firmware/meshcore-solo/releases/#release-1.20</link>
    <guid isPermaLink="false">firmware-MeshCore Solo-1.20</guid>
    <pubDate>Mon, 22 Jun 2026 08:51:38 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h2>MeshCore Solo Companion Firmware v1.20</h2>
<h3>What's new</h3>
<ul>
<li><strong>Repeater mode</strong> — a solo companion can now opt in to relaying mesh traffic, configured from a dedicated <strong>Tools › Repeater</strong> screen that consolidates the toggle, the forwarding filters, live forwarding stats, and a separate radio profile:<ul>
<li><strong>Forwarding filters</strong> (all flood-only, off by default) — <em>skip-advert</em> (don't re-flood the highest-volume advert traffic), <em>max-hops</em> (drop a flood once it has travelled too far), <em>yield</em> (extra retransmit-delay so a mobile node defers to better-sited fixed repeaters), and <em>min-SNR</em> (don't re-flood marginal fringe packets). Plus <strong>overhear suppression</strong>, which cancels a queued retransmit if a peer relays the same packet first.</li>
<li><strong>Dedicated radio profile</strong> — an optional "Custom" Freq/SF/BW/CR used only while relaying, separate from the companion's own network and band-matched to the companion frequency by default. It's applied everywhere a radio change can happen (boot, on-device toggle, app-driven <code>CMD_SET_RADIO_PARAMS</code>, Settings edits) so the device never silently relays on the wrong params.</li>
<li>While relaying, <strong>Adaptive Power Control is pinned to the ceiling</strong> and <strong>duty-cycle RX is forced off</strong> — a repeater needs to hear and relay at consistent power.</li>
</ul>
</li>
<li><strong>Radio settings overhaul</strong> (Settings › Radio) — <strong>16 community-suggested presets</strong> plus manual Freq/SF/BW/CR tuning (digit-by-digit frequency editor), and <strong>4 persisted user preset slots</strong>. Presets and the manual editor are now <strong>shared between Settings and the Repeater screen</strong> — a preset saved from either place shows up in both, and you can <strong>save the current profile as a named preset</strong> or <strong>delete one</strong> from either screen.</li>
<li><strong>On-device Diagnostics</strong> (Tools › Diagnostics) — a single scrollable screen showing packet counts by category (RX/TX), radio noise floor / RSSI / SNR, packet-pool free count and outbound queue length, actually-forwarded packet count, uptime, and live heap/stack headroom, with a reset-counters popup.</li>
</ul>
<h3>Fixes</h3>
<ul>
<li><strong>Channel storage hardening</strong> — <code>saveChannels()</code> skips unused (all-zero) slots, so <code>/channels2</code> holds only configured channels instead of always writing ~2.7 KB; and <code>findChannelIdx()</code> rejects an all-zero secret so a corrupted/empty channel can't match an unused slot and misroute messages.</li>
<li><strong>e-ink UI scaling</strong> — self-sizing popup menu scaled for landscape e-ink (no stray header gap, tighter row tiling); popup menu uses the shared proportional scroll indicator instead of raw <code>^</code>/<code>v</code> glyphs and stops the selection bar before the scrollbar gutter; compass tape ticks/pointer and trail-map markers scale for e-ink, with wrap-around map navigation.</li>
<li><strong>Joystick rotation</strong> is now persisted on e-ink builds.</li>
<li><strong>Trail capacity guard</strong> — a <code>static_assert</code> fails the build if <code>TrailStore::CAPACITY</code> ever outgrows the <code>uint16_t</code> save-header count, instead of silently truncating.</li>
</ul>
<h3>Under the hood</h3>
<ul>
<li>Packet pool bumped 16 → 32 so queued retransmits no longer starve incoming-packet allocation while relaying.</li>
<li>Shared, UITask-decoupled <code>RadioPresetPicker</code> and <code>RadioParamsEditor</code> (plus <code>nearestBwIndex()</code> in <code>RadioPresets.h</code>) replace ~6 duplicated methods and several state fields per screen.</li>
<li>Mesh <code>Dispatcher</code> gains generic per-payload-type RX/TX counters and pool-free / queue-length getters; a new <code>DeviceDiag</code> helper reports nRF52 heap (linker-symbol + <code>sbrk</code>) and stack (FreeRTOS high-water-mark) headroom.</li>
<li><code>build.sh</code> tolerates control characters in <code>pio project config</code>'s JSON dump.</li>
</ul>
]]></description>
  </item>
  <item>
    <title>Wadamesh beta_10</title>
    <link>https://dev.meshcore.ninja/firmware/wadamesh/releases/#release-beta_10</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_10</guid>
    <pubDate>Sun, 21 Jun 2026 22:08:55 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p><strong>wadamesh beta_10</strong> — flash from <strong><a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">https://flasher.wadamesh.com</a></strong>, or update on-device (Settings → About).</p>
<h2>What's new</h2>
<h3>T-Deck input</h3>
<ul>
<li><strong>Trackball mode</strong> — switch the T-Deck trackball between a <strong>mouse cursor</strong> (the default) and <strong>D-pad navigation</strong> (roll to move the selection, click to choose), under <strong>Settings → Keyboard</strong>. Handy if you prefer button-style navigation.</li>
</ul>
<h3>Map — #20</h3>
<ul>
<li><strong>microSD tiles now fill in as you explore.</strong> With <em>Use microSD for tiles</em> on, the device also downloads any missing tiles over Wi-Fi and saves them straight onto the SD card, so your offline library <strong>grows</strong> instead of showing blank areas past its edge. Thanks @1nerdherder (<a href="https://github.com/ALLFATHER-BV/wadamesh/issues/20" target="_blank" rel="noopener noreferrer">#20</a>).</li>
</ul>
<h3>Power — by @Vybo (#19)</h3>
<ul>
<li><strong>Experimental battery saver (idle power-save).</strong> Throttles the CPU when the device is parked — screen off, on battery, no app connected and the mesh quiet — to trim idle power use, <strong>without ever missing a received packet</strong>. Off by default; enable under <strong>Settings → System → Battery</strong>. (<a href="https://github.com/ALLFATHER-BV/wadamesh/pull/19" target="_blank" rel="noopener noreferrer">#19</a>)</li>
</ul>
<h3>Settings</h3>
<ul>
<li><strong>New "Battery" section</strong> under Settings → System — opens the battery &amp; power-history screen (the same one you get by tapping the battery icon up top), and is where the battery saver now lives (it moved out of the Lock settings).</li>
</ul>
<hr />
<p>🙏 Thanks to <strong>Dan Vybiral (@Vybo)</strong> for the idle power-save feature (#19) and <strong>@1nerdherder</strong> for the microSD-tiles report (#20).</p>
<p><strong>Boards:</strong> LilyGo T-Deck · Heltec V4 TFT.</p>
]]></description>
  </item>
  <item>
    <title>Fennek 2.5.9</title>
    <link>https://dev.meshcore.ninja/firmware/fennek/releases/#release-2.5.9</link>
    <guid isPermaLink="false">firmware-Fennek-2.5.9</guid>
    <pubDate>Sun, 21 Jun 2026 19:36:11 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>Podcast-App deaktiviert (WLAN-Sync zu langsam).</p>
<ul>
<li>Auto-WLAN-Sync vor Standby (podcast::flushBeforeStandby) auskommentiert — brachte bei jedem Standby das WLAN über den 4-MHz-SD-Bus hoch</li>
<li>Launcher-Kachel + appmgr-Registrierung + podcast::begin() aus → App vom Gerät verschwunden, Slot 13 (Seite 2) bleibt leer</li>
<li>Code/Konsolen-Befehle/NVS-Toggle/i18n bewusst behalten (reaktivierbar)</li>
</ul>
]]></description>
  </item>
  <item>
    <title>Fennek 2.5.7</title>
    <link>https://dev.meshcore.ninja/firmware/fennek/releases/#release-2.5.7</link>
    <guid isPermaLink="false">firmware-Fennek-2.5.7</guid>
    <pubDate>Sun, 21 Jun 2026 19:05:52 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h2>Sudoku als fünftes Spiel</h2>
<p>Neues Spiel <strong>Sudoku</strong> in der Spiele-App (neben 2048, Minensucher, Schach, Tic-Tac-Toe).</p>
<ul>
<li>Arduino-freier Generator + Solver (<code>sudoku_core.h</code>, host-getestet): randomisiertes Backtracking für die Vollösung, dann eindeutigkeitsprüfendes Ausgraben — erzeugt nur Rätsel mit genau einer Lösung. Rekursionsfrei (iterativer Level-Stack).</li>
<li>9×9-Gitter à 26 px, Touch-Tap/WASD-Cursor, Zifferntasten 1–9 setzen, 0/Backspace/Mikrofon leeren, Konfliktzellen invertiert, „Gelöst"-Overlay mit Zeit.</li>
<li>Schwierigkeit Leicht/Mittel/Schwer (40/32/26 Vorgaben).</li>
<li>Beststände im NVS (gelöste Rätsel + Bestzeit), inkl. INI-Export/-Import.</li>
</ul>
<p><strong>OTA:</strong> <code>firmware.bin</code> angehängt.</p>
]]></description>
  </item>
  <item>
    <title>MeshMonitor 4.11.3</title>
    <link>https://dev.meshcore.ninja/software/meshmonitor/releases/#release-4.11.3</link>
    <guid isPermaLink="false">software-MeshMonitor-4.11.3</guid>
    <pubDate>Sun, 21 Jun 2026 18:25:56 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h1>MeshMonitor v4.11.3</h1>
<p>This release adds a <strong>Dead Drop / Mailbox</strong> auto-responder — asynchronous "mesh voicemail" where a node can leave a message for another node that need not be online, retrieved later with <code>inbox</code> commands — contributed by new contributor @TheWISPRer. It also brings <strong>MeshCore node favoriting</strong> (pin any MeshCore node to the top of the list, stored server-side), <strong>FEM LNA Mode</strong> LoRa configuration surfaced on both the Device Configuration and Remote Admin panels for amplified hardware, and the <strong>MeshCore CLI</strong> bundled into the Docker image alongside the Meshtastic CLI. On the fixes side, a PostgreSQL/MySQL crash in the MeshCore neighbor query is resolved by widening the <code>neighbor_info</code> timestamp columns to <code>BIGINT</code> (they overflowed signed int32 with millisecond-epoch values), and a proto3 boolean-elision bug that silently re-enabled <code>uplinkEnabled</code>/<code>downlinkEnabled</code> after a container restart is fixed. Position history now captures and displays SNR for directly-heard (0-hop) nodes, the intermittently-blank MeshCore auto-ack <code>{SNR}</code>/<code>{ROUTE}</code> tokens are corrected, mesh-request endpoints return a meaningful <code>503</code> (not a generic <code>500</code>) when the node is disconnected, and the macOS x64 desktop build no longer ships an arm64 <code>re2.node</code> that crashed on Intel Macs. Upgrades are automatic — three idempotent migrations (094–096) run on boot.</p>
<h2>Features</h2>
<ul>
<li><strong>Dead Drop / Mailbox auto-responder — async "mesh voicemail"</strong> (#3538, @TheWISPRer) — a fifth auto-responder type. DM <code>msg &lt;name&gt; &lt;text&gt;</code> to leave a message; retrieve with <code>inbox</code>, <code>inbox play [name]</code>, <code>inbox delete &lt;id&gt;</code>, <code>inbox clear</code>. Per-source, configured entirely through the Auto Responder UI, messages marked played only on delivery-success, expired rows purged by the maintenance sweep.</li>
<li><strong>MeshCore node favoriting — pin to top of list</strong> (#3595) — favorite any MeshCore node (Companion, Repeater, Room Server, …); stored server-side only (firmware has no native favorite concept), consistent with Meshtastic favorites.</li>
<li><strong>FEM LNA Mode LoRa configuration</strong> (#3600) — surfaces <code>Config.LoRaConfig.fem_lna_mode</code> (Disabled / Enabled / Not Present, firmware ≥ v2.7.20) on <strong>both</strong> the Device Configuration and Remote Admin LoRa panels.</li>
<li><strong>MeshCore CLI bundled in the Docker image</strong> (#3591) — ships <code>meshcore-cli</code> / <code>meshcli</code> alongside the Meshtastic Python CLI for a complete in-container toolkit.</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><strong>MeshCore neighbor query crashed on PostgreSQL/MySQL</strong> (#3602) — <code>meshcore_neighbor_info.timestamp</code> / <code>.createdAt</code> were 32-bit <code>INTEGER</code>/<code>INT</code> but store millisecond-epoch values that overflow int32; widened to <code>BIGINT</code> (migration 096).</li>
<li><strong><code>downlinkEnabled</code>/<code>uplinkEnabled: false</code> reverted to true after restart</strong> (#3598) — proto3 elides boolean <code>false</code>, and a <code>?? true</code> fallback re-inflated user-disabled channel flags on device reconnect; both now default to <code>false</code>.</li>
<li><strong>Position history dropped SNR for directly-heard (0-hop) nodes</strong> (#3593) — SNR is now captured per-fix and shown in the tooltip; the same 0 dB-drop guard was fixed on the central <code>snr_local</code> telemetry path.</li>
<li><strong>MeshCore auto-ack <code>{SNR}</code> / <code>{ROUTE}</code> tokens intermittently blank</strong> (#3592) — buffered SNR/route data is now correlated to the matching packet (freshness + <code>pathLen</code>, consumed once) instead of leaking across messages.</li>
<li><strong>macOS x64 (Intel) desktop crashed on launch</strong> (#3604) — the x64 DMG shipped an arm64 <code>re2.node</code> (<code>ERR_DLOPEN_FAILED</code>); the build now rebuilds <code>re2</code> from source as x86_64 and backfills the missing CI arch flags.</li>
<li><strong>Mesh-request endpoints return 503 (not 500) when disconnected</strong> (#3597) — <code>/api/traceroute</code>, <code>/api/position/request</code>, <code>/api/nodeinfo/request</code>, <code>/api/neighborinfo/request</code>, <code>/api/telemetry/request</code> now return a meaningful <code>503</code> with the v1-API error shape.</li>
</ul>
<h2>Internationalization</h2>
<ul>
<li><strong>Translations update from Hosted Weblate</strong> (#3579, @weblate)</li>
</ul>
<h2>Issues Resolved</h2>
<ul>
<li>#3587 — Add MeshCore CLI Python application to Docker image</li>
<li>#3588 — MeshCore node favoriting (pi</li>
</ul>
<p>…</p>
]]></description>
  </item>
  <item>
    <title>MeshCore Wio Tracker L1 Pro (sosprz) 1.16.86</title>
    <link>https://dev.meshcore.ninja/firmware/meshcore-wio-tracker-l1-pro-sosprz/releases/#release-1.16.86</link>
    <guid isPermaLink="false">firmware-MeshCore Wio Tracker L1 Pro (sosprz)-1.16.86</guid>
    <pubDate>Sun, 21 Jun 2026 15:48:50 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<ul>
<li><strong>EINK keyboard layout fix</strong></li>
</ul>
]]></description>
  </item>
  <item>
    <title>Fennek 2.5.6</title>
    <link>https://dev.meshcore.ninja/firmware/fennek/releases/#release-2.5.6</link>
    <guid isPermaLink="false">firmware-Fennek-2.5.6</guid>
    <pubDate>Sun, 21 Jun 2026 15:32:44 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>fix(power): Dateien-Modus am Kabel nicht einschlafen lassen</p>
<ul>
<li>battery::external() (DSG-Bit aus BatteryStatus 0x0A) erkennt Netzteil zuverlässig, auch bei vollem Akku (charging() fiel bei Strom ~0 auf false)</li>
<li>power::poll() nutzt external() statt charging() für die Dateien-Standby-Bremse</li>
</ul>
]]></description>
  </item>
  <item>
    <title>Fennek 2.5.5</title>
    <link>https://dev.meshcore.ninja/firmware/fennek/releases/#release-2.5.5</link>
    <guid isPermaLink="false">firmware-Fennek-2.5.5</guid>
    <pubDate>Sun, 21 Jun 2026 15:07:48 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>feat(wecker): Einmalig-Option für Wecker</p>
<ul>
<li>Neues Alarm-Feld <code>once</code> (NVS byte0 Bit4, abwärtskompatibel)</li>
<li>Einmalige Wecker feuern am nächsten hh:mm tageunabhängig und schalten sich danach selbst aus</li>
<li>Editor-Preset "Einmalig" im Feld Tage; Liste/Editor zeigen es an</li>
<li>Konsole: <code>alarm &lt;i&gt; &lt;hh:mm&gt; einmal</code> (once/1x)</li>
</ul>
<p>OTA: firmware.bin angehängt.</p>
]]></description>
  </item>
  <item>
    <title>Fennek 2.5.4</title>
    <link>https://dev.meshcore.ninja/firmware/fennek/releases/#release-2.5.4</link>
    <guid isPermaLink="false">firmware-Fennek-2.5.4</guid>
    <pubDate>Sun, 21 Jun 2026 15:00:17 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>OTA-Update-Fix + Ollama-Timeout.</p>
<ul>
<li><strong>OTA <code>-104</code> behoben:</strong> GitHub liefert für Release-Assets eine signierte Redirect-URL (<code>release-assets.githubusercontent.com</code>, ~900 Zeichen). Diese sprengte den 300-Byte-Puffer in <code>apply()</code> → abgeschnittene URL → <code>httpUpdate</code>-Fehler <code>-104</code> (wrong http code). Puffer auf 1400 Byte vergrößert.</li>
<li><strong>notes_ai (Ollama) Timeout:</strong> <code>HTTPClient::setTimeout()</code> nimmt <code>uint16_t</code> (max 65535 ms); der Wert 120000 lief still auf 54464 ms über. Konstante auf 65000 ms korrigiert.</li>
</ul>
<p>Erstes Release, mit dem OTA von einer früheren Version aus zuverlässig durchläuft.</p>
]]></description>
  </item>
  <item>
    <title>Fennek 2.5.3</title>
    <link>https://dev.meshcore.ninja/firmware/fennek/releases/#release-2.5.3</link>
    <guid isPermaLink="false">firmware-Fennek-2.5.3</guid>
    <pubDate>Sun, 21 Jun 2026 14:48:58 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p>perf(dateien): Request-Zähler-Refresh 10x seltener gegen E-Ink-Flackern</p>
<ul>
<li>Drosselung des Request-Zähler-Voll-Redraws im RUNNING-Zustand von 5 s auf 50 s</li>
<li>Zähler ist reine Info; seltenere Voll-Redraws sparen sichtbares E-Ink-Flackern</li>
</ul>
]]></description>
  </item>
  <item>
    <title>XIAO nRF52 Updater 1.2</title>
    <link>https://dev.meshcore.ninja/software/xiao-nrf52-updater/releases/#release-1.2</link>
    <guid isPermaLink="false">software-XIAO nRF52 Updater-1.2</guid>
    <pubDate>Sun, 21 Jun 2026 14:47:07 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<ul>
<li>introduced <code>wedge_cooldown</code> to fix cases when older bootloader gets stuck during update</li>
<li>bugfixes</li>
</ul>
]]></description>
  </item>
  <item>
    <title>Fennek 2.5.2</title>
    <link>https://dev.meshcore.ninja/firmware/fennek/releases/#release-2.5.2</link>
    <guid isPermaLink="false">firmware-Fennek-2.5.2</guid>
    <pubDate>Sun, 21 Jun 2026 14:29:15 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h2>Highlights</h2>
<ul>
<li><strong>On-Device-OTA-Knopf</strong> (Settings → Update → „Aktualisieren"): prüft GitHub-Releases und flasht direkt am Gerät mit Vollbild-Fortschritt (Phase + Balken + %). Kein Browser/Konsole mehr nötig.</li>
<li><strong>Notizen:</strong> Audionotiz-Player (Play/Pause, ±10 s, Region-Fortschritt) + hoch-scrollbarer Editor.</li>
<li><strong>Karteikarten:</strong> Übersicht mit Leitner-Fächer-Verteilung (fällig/bearbeitet).</li>
<li><strong>Kopfrechnen:</strong> adaptive Schwierigkeit, je-Modus persistierte Stufe.</li>
<li><strong>notes_ai:</strong> behutsamerer Korrektur-Prompt (nur Rechtschreibung/Umlaute, kein Umdichten).</li>
<li><strong>Tools:</strong> <code>maps_tiles.py</code> mit wählbaren Kachelquellen (<code>--preset standard|cyclosm|topo</code>).</li>
</ul>
<h2>OTA-Update</h2>
<p>Geräte ab v2.5.1 können direkt am Gerät auf diese Version aktualisieren (Settings → Update → „Aktualisieren") oder via Web-UI (<code>fennek.local</code>) / Konsole (<code>ota update</code>).</p>
<p><strong>Flashen (USB):</strong> <code>firmware.bin</code> in den inaktiven OTA-Slot bzw. via <code>pio run -e fennek -t upload</code>.</p>
]]></description>
  </item>
  <item>
    <title>Fennek 2.5.0</title>
    <link>https://dev.meshcore.ninja/firmware/fennek/releases/#release-2.5.0</link>
    <guid isPermaLink="false">firmware-Fennek-2.5.0</guid>
    <pubDate>Sun, 21 Jun 2026 10:11:51 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p><strong>Full Changelog</strong>: <a href="https://github.com/danst0/fennek/compare/v2.4.9...v2.5.0" target="_blank" rel="noopener noreferrer">https://github.com/danst0/fennek/compare/v2.4.9...v2.5.0</a></p>
]]></description>
  </item>
  <item>
    <title>MCLite 0.3.9</title>
    <link>https://dev.meshcore.ninja/firmware/mclite/releases/#release-0.3.9</link>
    <guid isPermaLink="false">firmware-MCLite-0.3.9</guid>
    <pubDate>Sun, 21 Jun 2026 08:09:35 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h3>Added</h3>
<ul>
<li><strong>Step-wise admin permissions.</strong> Beyond the existing <code>security.admin_enabled</code> (global on/off for the Admin
screen), a new <code>permissions</code> config block scopes what's reachable <em>inside</em> Admin: <code>permissions.settings</code>
(<code>full</code> / <code>restricted</code> / <code>none</code>) — <strong>restricted</strong> keeps only the basics editable (brightness, auto-dim, dim
brightness, keyboard brightness, theme) and shows everything else read-only (no chevron); <strong>none</strong> makes all
settings read-only. <code>permissions.companion</code> (default on) hides the Companion group (WiFi/USB/Bluetooth) when
off — configured services still run. <code>permissions.conversation_management</code> (default off) is reserved for a
future release (on-device add/edit/remove of contacts/channels/rooms; they stay read-only views for now). All
three are provisionable from the config tool. Defaults are fully permissive, so existing configs are unchanged.</li>
<li><strong>Settings reorganised into per-section screens + Admin is now a pure hub.</strong> The on-device Admin screen no
longer mixes settings, diagnostics and shortcuts — it's three labelled groups of links: <strong>Companion</strong> (WiFi /
USB / Bluetooth), <strong>Conversations</strong> (Contacts / Channels / Rooms, read-only views), and <strong>Settings</strong> (Device,
Radio, Display, Messaging, Sound, GPS, Battery, Security). Each section is its own screen mirroring the config
tool, with all of its editable settings <em>and</em> its read-only diagnostics in one place (no more duplicated rows
across Admin and Device Settings). Newly editable on-device: <strong>Radio</strong> (region preset picker — EU/UK/CH vs
US/Canada — plus a TX-power slider and an advert-interval picker; frequency/SF/BW/CR/scope/path-hash stay read-only),
<strong>Messaging</strong> (history, max-per-chat, location format, retries, telemetry request/badges/auto-refresh, canned
messages, allow-mute), and <strong>GPS</strong> (enable, location-advert precision, timezone, clock offset, last-known max
age). Offgrid mode and the live Heard-Adverts count now live at the top of the Radio screen. Each hub link
carries an icon (gear for settings; <code>@</code>/<code>#</code>/<code>R</code> for contacts/channels/rooms; Wi-Fi/USB/Bluetooth for
companion), and the 3rd-party licenses moved to an <em>About</em> block at the bottom of the hub. Radio/GPS changes
reboot once on exit (same batched-save model as theme/language). The old single "Device Settings" screen is
superseded by this layout.</li>
<li><strong>Selectable UI themes.</strong> Choose a color palette — <strong>Dark</strong> (default), <strong>Light</strong>, <strong>Amber</strong> (a "military"
night mode that preserves night vision), or <strong>High contrast</strong> — on-device (Admin → Theme, reboots to apply)
or via <code>display.theme</code> in config. Custom palettes can be defined under <code>display.themes</code> (start from a built-in
<code>base</code>, override any color with <code>#RRGGBB</code>). Default appearance is unchanged. On/off switches now use the
theme accent colour too. Thanks <a href="https://github.com/jason-s13r" target="_blank" rel="noopener noreferrer">@jason-s13r</a> (#24).</li>
<li><strong>Per-row Info + Map buttons on the Heard Adverts screen.</strong> Each heard node now has an explicit info (eye)
button that opens its detail dialog, and — when the advert carries a location — a map button that opens the
map centered on that node. Back now returns to the Admin screen. Thanks <a href="https://github.com/jason-s13r" target="_blank" rel="noopener noreferrer">@jason-s13r</a> (#15).</li>
<li><strong>Map screen pan buttons + windowed chrome.</strong> The map gains an on-screen D-pad (up/left/centre/right/down)
alongside the existing drag-to-pan. On the T-Deck the map now keeps the <strong>status bar visible</strong> and uses the
standard <code>lv_win</code> header with a back button (the T-Watch stays full-screen). Thanks <a href="https://github.com/jason-s13r" target="_blank" rel="noopener noreferrer">@jason-s13r</a> (#22, supersedes #20/#21).</li>
<li><strong>Uptime + last-charged in the Admin Battery section.</strong> Shows when the device booted (wall-clock + relative)
and when charging last stopped (with the level at the time). Thanks <a href="https://github.com/jason-s13r" target="_blank" rel="noopener noreferrer">@jason-s13r</a> (#23).</li>
<li><strong>On-device Device Settings.</strong> A new editable settings screen (Admin → Device Settings, behind the existing
<code>admin.enabled</code> gate) for changing device n
…</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshCore Low-Power 1.16.dev_0621</title>
    <link>https://dev.meshcore.ninja/firmware/meshcore-lowpower/releases/#release-1.16.dev_0621</link>
    <guid isPermaLink="false">firmware-MeshCore Low-Power-1.16.dev_0621</guid>
    <pubDate>Sun, 21 Jun 2026 07:24:05 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h3>v1.16_0621</h3>
<ul>
<li><p><strong>Configuration portal for Companion, Repeater, and Room Server — configure, back up, restore, and update firmware without the CLI.</strong> <em>(ESP32 devices only)</em></p>
<p>Open it the same way as before — <code>start ota</code> in the CLI, or <strong>Start OTA</strong> from the companion Settings menu. Previously this landed on a firmware-only upload page; it now opens the full configuration portal where you can configure, back up, restore, flash firmware, and reboot — all from one page in the browser.</p>
<p>The companion backup covers custom preferences (Quick Send presets, saved locations, channel hop limits, display settings, WiFi credentials,...) that upstream MeshCore doesn't have — handy when moving to a new device. For the Repeater and Room Server, this is the first time backup and restore are available at all — no more re-entering everything from scratch after a node failure or hardware swap.</p>
<p>The portal is password-protected. Companion: set one with <code>set portal.password</code> in the CLI. Repeater / Room Server: the existing admin password is used automatically.</p>
<p>The backup format is compatible with the official MeshCore app — upstream preferences in the backup can be restored by the app. Passwords are never written to backup files.</p>
</li>
<li><p><strong>Config portal AP: open network, login page, 1-client limit, 10-minute idle auto-shutdown.</strong></p>
<p>The WiFi AP is open (no AP password); access is gated by a browser login page using the portal password described above. Only one device can associate with the AP at a time. If no device connects within 10 minutes of the AP opening, it shuts down automatically.</p>
<img alt="config-portal" src="https://github.com/user-attachments/assets/92a088b9-49b3-40d1-8caa-fd3da634347b" /></li>
<li><p><strong>Fix: full-flash (<code>_merged.bin</code>) images for Vision Master E213 and E290 were built with the wrong flash size.</strong></p>
<p>Both boards have 16 MB of flash, but their merged full-flash images were generated with an 8 MB flash-size header. The pre-merged images are now built with the correct 16 MB size. If you previously flashed an E213 or E290 using a <code>_merged.bin</code>, re-flash with the corrected image. OTA (<code>.bin</code>) updates were not affected.</p>
</li>
</ul>
]]></description>
  </item>
  <item>
    <title>RemoteTerm for MeshCore 3.15.1</title>
    <link>https://dev.meshcore.ninja/software/remoteterm/releases/#release-3.15.1</link>
    <guid isPermaLink="false">software-RemoteTerm for MeshCore-3.15.1</guid>
    <pubDate>Sun, 21 Jun 2026 05:43:50 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h2>[3.15.1] - 2026-06-20</h2>
<ul>
<li>Feature: Per-message + analyzer region tag support</li>
<li>Feature: Sortable neighbor list in repeater pane</li>
<li>Feature: Option to disable autoscroll on packet feed</li>
<li>Feature: Bot globals</li>
<li>Feature: Add draft support for Open gifs + reactions</li>
<li>Bugfix: Use correct last-heard time for repeater recency</li>
<li>Bugfix: Configurable VAPID subject for iOS web push</li>
<li>Misc: Library updates, logging, test</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshMonitor 4.11.2</title>
    <link>https://dev.meshcore.ninja/software/meshmonitor/releases/#release-4.11.2</link>
    <guid isPermaLink="false">software-MeshMonitor-4.11.2</guid>
    <pubDate>Sun, 21 Jun 2026 00:02:00 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h2>Hotfix for 4.11.1 startup crash (PostgreSQL / MySQL)</h2>
<p>4.11.1 fails to boot on PostgreSQL/MySQL backends that have an existing Auto-Acknowledge configuration. Migration 093 (the Auto-Acknowledge 2×2 matrix backfill) inserted <code>settings</code> rows without the table's NOT NULL <code>createdAt</code>/<code>updatedAt</code> columns, aborting database initialization with <code>null value in column "createdAt" … violates not-null constraint</code> — a restart loop. On SQLite the violation was silently swallowed, so the matrix settings were never written.</p>
<h3>Fixed</h3>
<ul>
<li>Migration 093 now supplies <code>createdAt</code>/<code>updatedAt</code> in all three backends (SQLite / PostgreSQL / MySQL). A regression test runs the migration against a real settings table.</li>
</ul>
<h3>Recovery</h3>
<p>Affected instances recover automatically on upgrade to 4.11.2 — migration 093 was never marked complete (it threw before committing), so it re-runs and now succeeds, correctly migrating your auto-ack settings. No manual database changes are required.</p>
<p><strong>Full changelog:</strong> see CHANGELOG.md → [4.11.2].</p>
<h2>🚀 MeshMonitor v4.11.2</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.11.2
</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.42-RC4</title>
    <link>https://dev.meshcore.ninja/firmware/sigurdos-tdeck/releases/#release-0.1.42-RC4</link>
    <guid isPermaLink="false">firmware-SigurdOS T-Deck-0.1.42-RC4</guid>
    <pubDate>Sat, 20 Jun 2026 21:09:13 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<p><strong>SigurdOS T-Deck Firmware</strong> — beta-0.1.42-RC4</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 the manifest at <code>webflasher/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 (same bytes as merged)</td>
</tr>
</tbody></table>
<h2>What's Changed</h2>
<ul>
<li>fix: scope radio param force-override to dedicated debug flag by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/626" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/626</a></li>
<li>[codex] docs: remove completed roadmap items by @gadgethd in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/638" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/638</a></li>
<li>fix: bug sweep — display init, GPS baud timeout, DM name buffer, channel routing, save counter overflow by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/641" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/641</a></li>
<li>[codex] ci: serialize release asset uploads by @gadgethd in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/640" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/640</a></li>
<li>T13: SD lazy retry — single attempt at boot, retry on demand by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/642" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/642</a></li>
<li>fix: QIO→DIO flash mode for PSRAM compatibility + CI smoke matrix expansion by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/662" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/662</a></li>
<li>fix: HAL — battery Li-ion lookup, trackball LEFT deadtime, BLE state ordering by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/664" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/664</a></li>
<li>fix: mesh — static sender buffer race + path discovery race by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/665" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/665</a></li>
<li>fix: UI — chart data, nav stack, trace timer, brightness, search state by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/666" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/666</a></li>
<li>fix: reset cache_clock on map reinit (#661) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/667" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/667</a></li>
<li>fix: SPIFFS flush before device reset + NVS write dedup in radio setup by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/663" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/663</a></li>
<li>fix: roomserver double-send + UTF-8 emoji truncation by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/668" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/668</a></li>
<li>fix: free outgoing screen on navigation to stop LVGL pool leak / freeze (#670) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/671" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/671</a></li>
<li>fix: theme change refreshes current screen immediately (#654) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/669" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/669</a></li>
<li>fix: null guard getRTCClock() in updateSignalSample (fixes #675) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/676" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/676</a></li>
<li>docs: correct HARDWARE.md inaccuracies and fix touch comment (fixes #679) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/680" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/680</a></li>
<li>fix: add missing P_LORA_* build flags for MeshCore visibility (fixes #677) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/681" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/681</a></li>
<li>chore: update MeshCore submodule to latest dev (fixes #678) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/682" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/682</a></li>
<li>ci: add debug and remote_test_radio builds to PR matrix by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/684" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/684</a></li>
<li>fix: restore Settings back navigation by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/674" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/674</a></li>
<li>fix: resolve Launcher warm-handoff freeze + settings crash by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/685" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/685</a></li>
<li>fix: chat channel-state corruption + harden WiFi OTA auth by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/689" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/689</a></li>
<li>fix: SPIFFS warning spam (#683) + navigation hang (#672) by @hermes-gadget in <a href="https://github.com/hermes-gadget/SigurdOS-tdeck/pull/690" target="_blank" rel="noopener noreferrer">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/690</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/" target="_blank" rel="noopener noreferrer">https://github.com/</a>
…</p>
]]></description>
  </item>
  <item>
    <title>MeshMonitor 4.11.1</title>
    <link>https://dev.meshcore.ninja/software/meshmonitor/releases/#release-4.11.1</link>
    <guid isPermaLink="false">software-MeshMonitor-4.11.1</guid>
    <pubDate>Sat, 20 Jun 2026 20:17:15 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h2>[4.11.1] - 2026-06-20</h2>
<h3>Features</h3>
<ul>
<li><p><strong>Device notifications surfaced as toasts + firmware 2.8 favorite/ignore cap handling (#3548)</strong>: MeshMonitor now shows <code>ClientNotification</code> messages the connected node emits about its own operation — duplicate-key security warnings, invalid-config errors, duty-cycle limits, and more — as top-right toasts. These were always sent by the node but previously decoded and dropped. A server-side policy (<code>clientNotificationPolicy.ts</code>) suppresses the routine recurring ones (e.g. the power-saving "sleeping for N interval" message) and dedupes identical messages to at most once per minute per source, so the feed stays useful rather than noisy. On firmware <strong>2.8</strong>, when a Set Favorite / Ignore is refused because the device's protected-node list is full, MeshMonitor reverts its optimistic star/ignore toggle to match the device and surfaces the refusal (this warning is only emitted for the locally-connected node, not remote-admin targets). No protobuf changes were needed — the 2.8 NodeDB warm-tier restructure and the <code>snr_q4</code> on-disk field do not affect the over-the-air wire MeshMonitor reads (SNR stays a <code>float</code> in dB; a regression test guards this). See <code>docs/internal/dev-notes/MT28_NODEDB_SUPPORT_PLAN.md</code>.</p>
</li>
<li><p><strong>Auto-Acknowledge 2×2 matrix — message type × hop distance (discussion #3564)</strong>: Auto-Acknowledge previously tangled two concepts — its "Direct" toggles actually meant <em>0 hops</em> (not direct messages), tapback/reply were keyed only on hop distance (shared across channel &amp; DM), and a single global "Respond via DM" applied everywhere. It's now a clean <strong>{Channel, Direct} × {0-hop, Multi-hop}</strong> matrix: each of the four cells independently configures <strong>Message</strong> (reply), <strong>Tapback</strong> (emoji reaction), and <strong>Respond via DM</strong>. "Respond via DM" applies to the reply only (tapback-via-DM is unreliable) and is disabled until Message is enabled; for Direct cells, replies are inherently DMs. Existing configurations are migrated automatically (migration 093) so behavior is preserved on upgrade. MeshCore auto-ack is unchanged.</p>
</li>
<li><p><strong>MeshCore node-type icons &amp; filter on the source map (#3546, #3576)</strong>: The per-source MeshCore map now renders role-based marker glyphs by advert type — Repeater (tower), Room Server (server rack), Sensor (broadcast), Companion (person) — instead of the generic "MC" badge (kept as the fallback for standard/unknown nodes). The Map Features panel gains a <strong>Node Types</strong> filter (per-category checkboxes, persisted) to show/hide markers by role, and the legend gains a matching <strong>Node Types</strong> section when shown. This brings the MeshCore source map to parity with the Map Analysis workspace. The shared map legend opts into the new section via a <code>showNodeTypes</code> prop, so the Meshtastic maps are unchanged.</p>
</li>
</ul>
<h2>🚀 MeshMonitor v4.11.1</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.11.1
</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>Fennek 2.4.8</title>
    <link>https://dev.meshcore.ninja/firmware/fennek/releases/#release-2.4.8</link>
    <guid isPermaLink="false">firmware-Fennek-2.4.8</guid>
    <pubDate>Sat, 20 Jun 2026 19:59:52 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h2>Änderungen</h2>
<ul>
<li><strong>OTA:</strong> Semver-Vergleich für Update-Erkennung (<code>tag_name != FENNEK_VERSION</code> → korrekte Versionslogik)</li>
<li><strong>Akku:</strong> Batterieanzeige-Fix in der Statuszeile</li>
</ul>
<h2>Flashen</h2>
<pre><code>pio run -e fennek -t upload
</code></pre>
<p>oder OTA via <code>fennek.local</code> → Firmware-Update.</p>
]]></description>
  </item>
  <item>
    <title>Wadamesh beta_9</title>
    <link>https://dev.meshcore.ninja/firmware/wadamesh/releases/#release-beta_9</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_9</guid>
    <pubDate>Sat, 20 Jun 2026 13:18:47 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h1>wadamesh beta_9</h1>
<p>A reliability-focused drop — Wi-Fi recovery, a self-healing chat-history fix, crash-report export, plus room-server, map, contacts and app-drawer improvements.</p>
<p><strong>Install / update:</strong> flash from <a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">flasher.wadamesh.com</a>, grab it in LauncherHub, or use the on-device update check (Settings → About).</p>
<h2>Stability</h2>
<ul>
<li><strong>Wi-Fi now reconnects on its own</strong> after the link drops — no more rebooting to get back online.</li>
<li><strong>Fixed reboot-on-every-received-message:</strong> a corrupted chat-history file could make the device reboot whenever a message arrived (and hide your messages). The bad file is now detected and reset automatically, so it recovers on its own.</li>
<li><strong>Boot hardening:</strong> NULL-guards on the display draw buffer so a unit with quirky/limited memory degrades gracefully instead of getting stuck on the boot logo.</li>
</ul>
<h2>Crash reports</h2>
<ul>
<li>After a crash, <strong>Settings → About</strong> shows an <strong>"Export crash report"</strong> button that saves the crash dump to the <strong>microSD card</strong> — so you can send it to the devs and get the bug fixed.</li>
</ul>
<h2>Chat &amp; room servers</h2>
<ul>
<li>Room-server messages now show the <strong>time each message was actually sent</strong>, not when it arrived.</li>
<li>Room-server messages now show <strong>who sent them</strong>.</li>
<li><strong>Sharing your contact QR</strong> now produces a valid <code>meshcore://contact/add?…</code> code that the <strong>MeshCore phone app can scan and import</strong>.</li>
<li>Unread counts show <strong>"99+"</strong> instead of an alarming raw number on busy channels.</li>
</ul>
<h2>Map</h2>
<ul>
<li>The <strong>reload button for corrupt tiles</strong> now actually clears the cached tiles — <strong>including when you're offline</strong> — and the missing/blank "twilight zone" tiles re-download on their own.</li>
<li>Fixed tiles not re-fetching at <strong>zoom levels 13–15</strong>.</li>
</ul>
<h2>Contacts</h2>
<ul>
<li><strong>Favourited contacts always appear</strong> in the contact list now, even with hundreds of similarly-named contacts (they used to stay hidden until you searched).</li>
</ul>
<h2>App drawer</h2>
<ul>
<li><strong>New icon-size setting</strong> — tap the <strong>cog</strong> at the top-right of the app drawer to switch between <strong>Compact</strong> and <strong>Large</strong> (bigger icons + labels, easier to read).</li>
<li><strong>Smoother scrolling</strong> through the app list and the other scrollable lists.</li>
</ul>
<hr />
<p><strong>Assets:</strong> <code>*-merged.bin</code> = full image (flash at 0x0 / erase). Plain <code>*.bin</code> = app-only (OTA / Launcher side-load). T-Deck = <code>wadamesh-tdeck*</code>, Heltec V4 TFT = <code>wadamesh-heltec-v4-tft*</code>.</p>
]]></description>
  </item>
  <item>
    <title>MeshMonitor 4.11.0</title>
    <link>https://dev.meshcore.ninja/software/meshmonitor/releases/#release-4.11.0</link>
    <guid isPermaLink="false">software-MeshMonitor-4.11.0</guid>
    <pubDate>Fri, 19 Jun 2026 22:45:47 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<p>MeshMonitor 4.11.0 is the general-availability release of the 4.11 line (consolidating <code>v4.11.0-rc1</code> and <code>v4.11.0-rc2</code>). The headline is the <strong>MeshCore virtual node</strong> — connect the MeshCore mobile app to a MeshMonitor-managed MeshCore device over WiFi, the MeshCore counterpart to the existing Meshtastic Virtual Node Server. MeshCore also gains name-aware contact forwarding-path editing, role-based map icons, and a node-type map filter. Across both protocols, the map picks up a per-node <strong>Hide from Map</strong> toggle, and Node Details gets a 15m–7d telemetry time-range selector. This release also wires up newer AirQualityMetrics fields and lands a broad set of correctness fixes — most notably a replay guard that stops powered-off nodes from appearing "recently heard" via replayed/retained MQTT frames, a NodeInfo position-precision guard, RE2 hardening of user-supplied regexes, and per-source scoping fixes for traceroute history and neighbor-info display. Under the hood, <code>server.ts</code> was substantially decomposed into focused route modules and the test suite migrated onto a shared <code>createTestDb</code> helper. Upgrading is drop-in — no manual migration or configuration changes required.</p>
<h2>✨ Features</h2>
<ul>
<li><strong>MeshCore virtual node — connect the MeshCore app over WiFi</strong> (#3540, #3535) — expose a managed MeshCore device as a virtual node the MeshCore app connects to over TCP/WiFi (default port <code>5000</code>, per-source enablement, admin commands blocked by default, private-key export always blocked).</li>
<li><strong>MeshCore: define a contact's forwarding path by repeater name</strong> (#3550) — first-class, name-aware path editor, on by default.</li>
<li><strong>MeshCore node-type icons + map filtering</strong> (#3563, #3546) — role-based markers (repeater / room server / sensor / companion) and a Node Types filter with legend.</li>
<li><strong>Per-node "Hide from Map" toggle</strong> (#3565, #3549) — suppress a node's map marker everywhere while keeping it visible in lists, DMs, and the packet monitor.</li>
<li><strong>Node list export — CSV / HTML</strong> (#3537, #3499) — export the Nodes view (respecting current filters/sort) for mesh upgrade planning.</li>
<li><strong>Telemetry time-range selector in Node Details</strong> (#3530) — 15m–7d range buttons on the Node Details graphs, persisted and shared with Device Info.</li>
<li><strong>Position-history map: a marker at every fix, points-only mode, hover tooltip</strong> (#3495, #3492).</li>
<li><strong>Newer AirQualityMetrics fields wired up</strong> (#3517, #3507) — <code>particles_40um</code>, <code>pm40_standard</code>, formaldehyde trio, and PM-sensor extras now graphed.</li>
<li><strong>Native OIDC group → role mapping</strong> (#3489, #3485) — map IdP groups to admin/login via <code>OIDC_GROUPS_CLAIM</code> / <code>OIDC_ADMIN_GROUPS</code> / <code>OIDC_ALLOWED_GROUPS</code>.</li>
<li><strong>UI tweaks + map unification pass</strong> (#3561, #3557) — "Messages" → "Node Details" nav, clickable map-popup source rows, unified tile/legend/GeoJSON toggles, and more.</li>
</ul>
<h2>🐛 Bug Fixes</h2>
<ul>
<li><strong>Offline nodes kept appearing "recently heard" from replayed packets</strong> (#3569) — new replay guard ignores stale <code>lastHeard</code> refreshes from retained/replayed MQTT frames.</li>
<li><strong>NodeInfo could overwrite high-precision positions with lower-precision ones</strong> (#3516, #3513) — precision-downgrade guard added.</li>
<li><strong>User-supplied regexes hardened against ReDoS</strong> (#3544) — all user/admin regexes now compiled with RE2 (resolves 4 CodeQL alerts).</li>
<li><strong>Traceroute History mixed in rows from every source</strong> (#3566) — history now scoped to the active source.</li>
<li><strong>Map "Show Neighbor Info" disagreed with the Map Analysis Neighbors view</strong> (#3560) — freshness filters aligned.</li>
<li><strong>Per-node position override ignored on the multi-source dashboard map</strong> (#3559, #3551).</li>
<li><strong>SaveBar only saved the active section</strong> (#3558, #3552) — grouped sections now save together via "Save All".</li>
<li><strong>MeshCore DM contact list nearly empty while node/map view was full</strong> (#3554) — in-memory contacts seeded from the durable DB rows on connect.</li>
<li><strong>MeshCore node list intermittently collapsed to a single node</strong> (#3539).</li>
<li><strong>Link previews failed to load on MeshCore / first page visited</strong> (#3541) — swi
…</li>
</ul>
]]></description>
  </item>
  <item>
    <title>MeshCore Hub 0.14.0</title>
    <link>https://dev.meshcore.ninja/software/meshcore-hub/releases/#release-0.14.0</link>
    <guid isPermaLink="false">software-MeshCore Hub-0.14.0</guid>
    <pubDate>Fri, 19 Jun 2026 18:22:39 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<h2>What's Changed</h2>
<ul>
<li>ci: prune old untagged GHCR package versions by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/256" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/256</a></li>
<li>Add optional PostgreSQL backend (v0.14.0) by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/243" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/243</a></li>
<li>Added migrate service to overlay network by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/259" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/259</a></li>
<li>chore(deps): update postgres docker tag to v18 by @renovate[bot] in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/258" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/258</a></li>
<li>Reverted to Postgres 17 by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/260" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/260</a></li>
<li>fix: sink NULL last_seen nodes to bottom of node list by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/263" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/263</a></li>
<li>fix: normalize date-bucket keys for Postgres dashboard charts by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/264" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/264</a></li>
<li>fix: normalize packets feature flag check to !== false by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/265" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/265</a></li>
<li>Added explicit pull policies for core services by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/266" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/266</a></li>
<li>fix: ensure CI required checks run on all PRs by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/268" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/268</a></li>
<li>docs: tidy database docs and deprecate SQLite by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/267" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/267</a></li>
<li>chore(deps): update anomalyco/opencode action to v1.17.8 by @renovate[bot] in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/269" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/269</a></li>
<li>docs: centralise env vars and split deployment/observer/maintenance docs by @jinglemansweep in <a href="https://github.com/ipnet-mesh/meshcore-hub/pull/271" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/pull/271</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/ipnet-mesh/meshcore-hub/compare/v0.13.4...v0.14.0" target="_blank" rel="noopener noreferrer">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.13.4...v0.14.0</a></p>
]]></description>
  </item>
  <item>
    <title>Fennek 2.3.1</title>
    <link>https://dev.meshcore.ninja/firmware/fennek/releases/#release-2.3.1</link>
    <guid isPermaLink="false">firmware-Fennek-2.3.1</guid>
    <pubDate>Fri, 19 Jun 2026 14:27:33 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h2>Notizen / Audio</h2>
<ul>
<li><strong>Sprachnotiz-Liste</strong> zeigt jetzt <strong>Datum + HH:MM</strong> (statt HH:MM:SS bzw. generisch „Sprachnotiz").</li>
<li><strong>Aufnahme-Gain ×6</strong> mit Sättigung: das PDM-Mikro war ~−20 dBFS leise → Wiedergabe kaum hörbar. Neue Aufnahmen sitzen bei ~−7 dBFS (kein Clipping).</li>
<li><strong>Sauberer I2S0-Handover</strong> nach der Aufnahme: kein doppeltes <code>i2s_driver_uninstall</code> mehr (<code>endMic</code>/<code>MicResume</code> macht uninstall+install in einem Schritt).</li>
</ul>
<h2>Karten / GPS</h2>
<ul>
<li><strong>No-Fix-Fallback</strong> zentriert jetzt auf <strong>Düsseldorf</strong> (51.2277/6.7735); <code>DEFAULT_ZOOM</code> 15 → 13 (NRW-weit bekachelt).</li>
<li><strong>GPS-Zeit-Diagnose</strong>: Einmal-Log <code>[MAPS] GPS-Zeit empfangen …</code> pro Karten-Session.</li>
</ul>
<p>Enthält außerdem v2.3.0 (GPS-/WAV-Diagnose-Logs, Karten-Fallback, Notizen-Zeitlabel).</p>
]]></description>
  </item>
  <item>
    <title>Wadamesh beta_8</title>
    <link>https://dev.meshcore.ninja/firmware/wadamesh/releases/#release-beta_8</link>
    <guid isPermaLink="false">firmware-Wadamesh-beta_8</guid>
    <pubDate>Fri, 19 Jun 2026 12:39:54 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h1>wadamesh beta_8</h1>
<p>Polish + fixes for the touch UI — a faster chat acknowledgement, map readout controls, and an internal-memory trim.</p>
<p><strong>Install / update:</strong> flash from <a href="https://flasher.wadamesh.com/" target="_blank" rel="noopener noreferrer">flasher.wadamesh.com</a>, grab it in LauncherHub, or use the on-device update check (Settings → About).</p>
<h2>Chat</h2>
<ul>
<li><strong>Quick replies insert at the cursor</strong> instead of replacing whatever you'd already typed.</li>
<li><strong>New one-tap "Ack"</strong> — long-press any message and tap <em>Ack</em>. It drops a ready-to-send reply into the composer with that message's <strong>signal strength (SNR/RSSI)</strong> and the <strong>route</strong> it took (hop codes), so you can instantly confirm someone's test came through. On a channel it <code>@</code>-mentions the sender. You review and send — it's never auto-sent.</li>
<li>Fixed the message action menu (<strong>Ack / Copy / Info / Mention / Block</strong>) running off the bottom of the screen — it now fits, and scrolls if it ever needs to.</li>
</ul>
<h2>Map</h2>
<ul>
<li>The zoom button now shows a clear <strong>"+/-"</strong> icon.</li>
<li><strong>Show or hide each on-map readout independently</strong> in Map settings — the coordinates line, the tile x/y/z line, and the contact markers.</li>
<li>Map settings reorganised: the <strong>microSD-tiles</strong> switch sits at the top under its own heading, separated from the new visibility toggles.</li>
<li><strong>New auto-refresh button</strong> — turn it on and the map re-centres on you automatically whenever your position changes, with an on-screen <em>Auto-refresh on/off</em> confirmation.</li>
<li>Fixed the close (<strong>X</strong>) in Map settings overlapping the switches when the panel was scrolled.</li>
</ul>
<h2>Performance</h2>
<ul>
<li>Reclaimed <strong>~19 KB of internal RAM</strong> (scratch buffers moved to PSRAM), leaving more headroom for Wi-Fi and trimming the idle-memory growth seen in recent betas.</li>
</ul>
<hr />
<p><strong>Assets:</strong> <code>*-merged.bin</code> = full image (flash at 0x0 / erase). Plain <code>*.bin</code> = app-only (OTA / Launcher side-load). T-Deck = <code>wadamesh-tdeck*</code>, Heltec V4 TFT = <code>wadamesh-heltec-v4-tft*</code>.</p>
]]></description>
  </item>
  <item>
    <title>ZephCore 20260619.094253</title>
    <link>https://dev.meshcore.ninja/firmware/zephcore/releases/#release-20260619.094253</link>
    <guid isPermaLink="false">firmware-ZephCore-20260619.094253</guid>
    <pubDate>Fri, 19 Jun 2026 09:43:10 GMT</pubDate>
    <category>firmware</category>
    <description><![CDATA[<h1>ZephCore v1.16.3-zephyr</h1>
<blockquote>
<p>(re-re-re-release(last time I swear) with the "smearing fix on eink after the full update" and "automount error on a freshly formatted node")</p>
</blockquote>
<blockquote>
<p>[!IMPORTANT]</p>
<h2>Before you upgrade</h2>
<p><strong>Updating from v1.16.2</strong> — clean flash, no re-bond required, bonds survive.</p>
<p><strong>Updating from v1.16.1 or older</strong> — flash the firmware; the firmware detects the old installation on first boot and clears the BLE bond storage automatically. Your identity, contacts, channels, and prefs are preserved. You will need to <strong>re-bond</strong> your phone/desktop once (old pairings were stored in a different location that v1.16.2 moved away from). No formatter tool required.</p>
<p><strong>Coming from Arduino MeshCore</strong> — flash the firmware; it detects the incompatible filesystem on first boot and formats automatically. Everything starts fresh (new identity, clean storage). No formatter tool required.</p>
<p>Take this with a grain of salt tho… try the formatters if anything anomalous happens with your node.</p>
</blockquote>
<hr />
<p>This is a GPS-focused release: it stops a battery-killing bug on GPS trackers, puts the GPS duty cycle under your control, and follows up the v1.16.2 ESP32 pairing work with a fix for recent Android phones.</p>
<h2>Highlights</h2>
<h3>Fixed: ThinkNode M1 draining its battery in a day</h3>
<p>On the ThinkNode M1, the GPS module was never actually powered down between fixes — the reset line was mislabeled in the board definition and held permanently released, so the receiver kept drawing current even when the firmware thought it was asleep. A full battery could disappear in roughly a day with GPS enabled.</p>
<p>The M1 now asserts the GPS hardware reset on standby, so the GPS genuinely stops between fixes. If you run an M1 with GPS on, this is the fix you want.</p>
<h3>New: configurable GPS duty cycle — <code>set gps duty &lt;seconds&gt;</code></h3>
<p>You can now decide how your node handles GPS, instead of it being baked in:</p>
<ul>
<li><strong><code>set gps duty &lt;seconds&gt;</code></strong> — how long the GPS sleeps between fixes. Persists to flash and applies immediately.</li>
<li><strong><code>set gps duty 0</code></strong> — <strong>always-on</strong>: the GPS never sleeps. It streams fresh fixes (so telemetry is always current) and stays on long enough to download a full almanac.</li>
<li><strong><code>set gps duty default</code></strong> — reset to the role default.</li>
<li><strong><code>get gps duty</code></strong> — show the now-effective interval.</li>
</ul>
<p>This unifies repeaters and companions behind one knob. <strong>Repeaters default to 48 h</strong> (GPS wakes only for periodic time-sync) and <strong>companions to 5 minutes</strong> — both now adjustable. Existing repeaters are migrated automatically; nothing to do.</p>
<blockquote>
<p>Bad input is rejected with a usage hint, and the value is clamped to a sane range (10 s … 1 week, or 0 for always-on).</p>
</blockquote>
<h3>Fixed: GPS no longer pins itself on waiting for a first fix</h3>
<p>Previously, after enabling GPS a companion would keep the receiver powered <strong>indefinitely</strong> until it got its first fix — so a node left somewhere without sky view (indoors, in a bag) could quietly drain its battery forever. The first cold-start acquisition is now bounded (5 minutes by default, enough for a genuine cold start), after which the node drops into its normal duty cycle whether or not it got a fix.</p>
<h3>Fixed: ESP32 Secure Connections pairing (Pixel 7 / recent Android)</h3>
<p>Following the v1.16.2 ESP32 pairing fix, SC-capable centrals — notably recent Android phones like the Pixel 7 — still failed to bond: the controller's encryption table was left uninitialized because the relevant code was guarded on an ESP-IDF symbol that never exists in a Zephyr build, so the link dropped with a MIC failure at encryption start. The guard is corrected (carried as a managed <code>hal_espressif</code> patch), and SC pairing now completes. Legacy-pairing devices were unaffected and continue to work. Thanks @seagull9000.</p>
<h2>Other fixes and improvements</h2>
<ul>
<li><strong>Fixed: GPS always-on on a freshly flashed companion</strong> — a new install would default <code>gps_interval</code> to 0 (always-on) instead of the intended 5-minute duty cycle, causing the 
…</li>
</ul>
]]></description>
  </item>
  <item>
    <title>meshcore-go 0.5.1</title>
    <link>https://dev.meshcore.ninja/software/meshcore-go/releases/#release-0.5.1</link>
    <guid isPermaLink="false">software-meshcore-go-0.5.1</guid>
    <pubDate>Fri, 19 Jun 2026 06:07:28 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<p><strong>Full Changelog</strong>: <a href="https://github.com/meshcore-cz/meshcore-go/compare/v0.5.0...v0.5.1" target="_blank" rel="noopener noreferrer">https://github.com/meshcore-cz/meshcore-go/compare/v0.5.0...v0.5.1</a></p>
]]></description>
  </item>
  <item>
    <title>meshcore-go 0.5.0</title>
    <link>https://dev.meshcore.ninja/software/meshcore-go/releases/#release-0.5.0</link>
    <guid isPermaLink="false">software-meshcore-go-0.5.0</guid>
    <pubDate>Fri, 19 Jun 2026 05:55:48 GMT</pubDate>
    <category>software</category>
    <description><![CDATA[<p><strong>Full Changelog</strong>: <a href="https://github.com/meshcore-cz/meshcore-go/commits/v0.5.0" target="_blank" rel="noopener noreferrer">https://github.com/meshcore-cz/meshcore-go/commits/v0.5.0</a></p>
]]></description>
  </item>
</channel>
</rss>
