{
  "id": "meshcore-solo",
  "name": "MeshCore Solo",
  "type": "fork",
  "maintainer": "MarekZegare4",
  "maintainers": [
    {
      "name": "MarekZegare4",
      "url": "https://github.com/MarekZegare4"
    }
  ],
  "maintainerUrl": "https://github.com/MarekZegare4",
  "repository": "https://github.com/MarekZegare4/MeshCore-Solo",
  "website": "https://marekzegare4.github.io/Solo-tools/",
  "license": "MIT",
  "description": "A fork of the official MeshCore companion radio firmware with extended features and UI enhancements. Adds GPS navigation (waypoints, compass, trail recording with GPX export), battery power-saving (hardware RX duty-cycle + adaptive power control), favourite contacts dial, extended language support with native Unicode rendering, message delivery status, screen lock, auto-reply bot, repeater mode with diagnostics, and more — all optimized for joystick-only navigation on small displays.\n",
  "status": "active",
  "lifecycle": "active",
  "maturity": "stable",
  "distribution": "community",
  "lineage": {
    "kind": "fork",
    "upstreamFirmwareId": "meshcore-official",
    "upstreamRepository": "https://github.com/meshcore-dev/MeshCore"
  },
  "runtime": {
    "framework": "arduino",
    "language": "cpp"
  },
  "roles": [
    "companion",
    "repeater",
    "standalone-ui"
  ],
  "features": [
    "Extended Unicode support with Lemon font and native input",
    "GPS navigation suite (waypoints, compass, backtrack, trail recording)",
    "GPX export via USB serial",
    "Screenshot capture over USB",
    "Favourites dial for pinned contacts",
    "Message delivery status indicators",
    "DM auto-resend and incoming deduplication",
    "Screen lock with time and sensor display",
    "Auto-reply bot with command responses",
    "Auto-advert for location sharing",
    "Battery power saving (RX duty-cycle + APC)",
    "Companion repeater mode with diagnostics",
    "Ping functionality in Nearby Nodes",
    "SOS broadcast with configurable target",
    "Quiet hours for sound suppression",
    "Mark-all-read at type level",
    "Lock-screen unread count",
    "Channel scanner home page",
    "Contact distance sorting",
    "Signal stats screen",
    "Display test pattern",
    "Power profile presets",
    "Solo Tools web app for screenshot capture and GPX export (https://marekzegare4.github.io/Solo-tools/)"
  ],
  "capabilities": {
    "protocol": {
      "meshcoreCompatible": true,
      "rawPacketSend": true,
      "rawPacketObserve": true
    },
    "transports": {
      "ble": true,
      "usbSerial": true,
      "nativeTcp": false,
      "wifiAp": false
    },
    "operations": {
      "webFlasher": false,
      "ota": false,
      "bleDfu": false,
      "configurationBackup": true
    },
    "networking": {
      "repeater": true,
      "roomServer": false,
      "observer": false,
      "mqtt": false,
      "kissModem": false
    },
    "hardware": {
      "gps": true,
      "display": true,
      "sensors": true,
      "lowPowerRx": true
    }
  },
  "changelog": {
    "source": "github",
    "repo": "MarekZegare4/MeshCore-Solo"
  },
  "devices": [
    {
      "id": "wio-tracker-l1",
      "status": "supported",
      "target": "wio-tracker-l1",
      "platformio_board": "seeed-wio-tracker-l1",
      "notes": "OLED variant (SSD1306/SH1106 128x64)"
    },
    {
      "id": "wio-tracker-l1-pro",
      "status": "supported",
      "target": "wio-tracker-l1",
      "platformio_board": "seeed-wio-tracker-l1",
      "notes": "OLED variant — same firmware target as wio-tracker-l1"
    },
    {
      "id": "wio-tracker-l1-eink",
      "status": "supported",
      "target": "wio-tracker-l1-eink",
      "platformio_board": "seeed-wio-tracker-l1",
      "notes": "E-ink variant (GxEPD2 250x122)"
    },
    {
      "id": "gatiot-gat562-30s",
      "status": "supported",
      "target": "gat562_30s_mesh_kit",
      "platformio_board": "rak4631",
      "notes": "GAT562 30S Mesh Kit"
    }
  ],
  "source": {
    "path": "data/firmwares/meshcore-solo/firmware.yaml",
    "updatedAt": "2026-06-22T21:31:07+02:00"
  },
  "latest_version": "1.20",
  "released": "2026-06-22",
  "releases": [
    {
      "version": "v1.20",
      "name": "Solo v1.20",
      "datetime": "2026-06-22T08:51:38Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/v1.20",
      "prerelease": false,
      "notes": "## MeshCore Solo Companion Firmware v1.20\r\n\r\n### What's new\r\n\r\n- **Repeater mode** — a solo companion can now opt in to relaying mesh traffic, configured from a dedicated **Tools › Repeater** screen that consolidates the toggle, the forwarding filters, live forwarding stats, and a separate radio profile:\r\n  - **Forwarding filters** (all flood-only, off by default) — *skip-advert* (don't re-flood the highest-volume advert traffic), *max-hops* (drop a flood once it has travelled too far), *yield* (extra retransmit-delay so a mobile node defers to better-sited fixed repeaters), and *min-SNR* (don't re-flood marginal fringe packets). Plus **overhear suppression**, which cancels a queued retransmit if a peer relays the same packet first.\r\n  - **Dedicated radio profile** — 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 `CMD_SET_RADIO_PARAMS`, Settings edits) so the device never silently relays on the wrong params.\r\n  - While relaying, **Adaptive Power Control is pinned to the ceiling** and **duty-cycle RX is forced off** — a repeater needs to hear and relay at consistent power.\r\n- **Radio settings overhaul** (Settings › Radio) — **16 community-suggested presets** plus manual Freq/SF/BW/CR tuning (digit-by-digit frequency editor), and **4 persisted user preset slots**. Presets and the manual editor are now **shared between Settings and the Repeater screen** — a preset saved from either place shows up in both, and you can **save the current profile as a named preset** or **delete one** from either screen.\r\n- **On-device Diagnostics** (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.\r\n\r\n### Fixes\r\n\r\n- **Channel storage hardening** — `saveChannels()` skips unused (all-zero) slots, so `/channels2` holds only configured channels instead of always writing ~2.7 KB; and `findChannelIdx()` rejects an all-zero secret so a corrupted/empty channel can't match an unused slot and misroute messages.\r\n- **e-ink UI scaling** — 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 `^`/`v` 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.\r\n- **Joystick rotation** is now persisted on e-ink builds.\r\n- **Trail capacity guard** — a `static_assert` fails the build if `TrailStore::CAPACITY` ever outgrows the `uint16_t` save-header count, instead of silently truncating.\r\n\r\n### Under the hood\r\n\r\n- Packet pool bumped 16 → 32 so queued retransmits no longer starve incoming-packet allocation while relaying.\r\n- Shared, UITask-decoupled `RadioPresetPicker` and `RadioParamsEditor` (plus `nearestBwIndex()` in `RadioPresets.h`) replace ~6 duplicated methods and several state fields per screen.\r\n- Mesh `Dispatcher` gains generic per-payload-type RX/TX counters and pool-free / queue-length getters; a new `DeviceDiag` helper reports nRF52 heap (linker-symbol + `sbrk`) and stack (FreeRTOS high-water-mark) headroom.\r\n- `build.sh` tolerates control characters in `pio project config`'s JSON dump.",
      "notesHtml": "<h2>MeshCore Solo Companion Firmware v1.20</h2>\n<h3>What's new</h3>\n<ul>\n<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>\n<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>\n<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>\n<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>\n</ul>\n</li>\n<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>\n<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>\n</ul>\n<h3>Fixes</h3>\n<ul>\n<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>\n<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>\n<li><strong>Joystick rotation</strong> is now persisted on e-ink builds.</li>\n<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>\n</ul>\n<h3>Under the hood</h3>\n<ul>\n<li>Packet pool bumped 16 → 32 so queued retransmits no longer starve incoming-packet allocation while relaying.</li>\n<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>\n<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>\n<li><code>build.sh</code> tolerates control characters in <code>pio project config</code>'s JSON dump.</li>\n</ul>\n"
    },
    {
      "version": "v1.19",
      "name": "Solo v1.19",
      "datetime": "2026-06-16T08:11:43Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/v1.19",
      "prerelease": false,
      "notes": "## MeshCore Solo Companion Firmware v1.19\r\n\r\n### What's new\r\n\r\n- **Message delivery status** — outgoing messages now show an end-to-end delivery marker, auto-scaled to the font (legible on landscape e-ink), in both the history list and the fullscreen view:\r\n  - **Direct messages** (and room servers): pending → delivered (✓) → failed (✗), driven by the real end-to-end ACK. While pending, a row of dots shows one per send so auto-resend progress is visible.\r\n  - **Auto-resend** — a pending DM whose ACK times out is re-sent automatically (reusing the original timestamp) until resends run out. Configurable count under Settings › Messages › Resend (0–5, default 2). Runs in the background, independent of which screen is open; incoming duplicates from retries are dropped.\r\n  - **Channels** — ✓ appears only once a repeater echo confirms the message was relayed into the mesh. No echo is normal (flood has no recipient ACK), so no pending/fail is shown.\r\n- **Auto-reply bot overhaul** — the trigger/reply bot grows into a small auto-responder:\r\n  - **Query commands** — a DM or monitored-channel message is scanned for `!` tokens (`!ping !batt !loc !time !temp !hops !status !help`) and answered in one combined reply.\r\n  - **Away / reply-to-all** — a lone `*` trigger replies to every message.\r\n  - **Separate DM and channel triggers**, each with its own reply text.\r\n  - **Quiet hours** — silence push replies during a chosen window (wraps midnight).\r\n  - **Throttling & anti-loop** — per-contact DM throttle so one sender can't starve others; channel echo guard so the bot never answers itself; reply counter shown in the bot screen header.\r\n- **Keyboard overhaul** — one shared keyboard across all screens (reclaims duplicate RAM), icon keys (⇧ caps, ⎵ space, ⌫ delete, ✓ OK), and a second **symbols page** toggled with `#@`/`abc`.\r\n- **UI refresh**\r\n  - Proportional **scrollbar** with up/down triangle caps replaces the old `^`/`v` arrows, scaling with the font (1× OLED, 2× landscape e-ink); used by every scrollable list and the fullscreen message view. The redundant `>` selection marker is gone and rows shifted left to reclaim space.\r\n  - Status-bar single-letter indicators (M/B/A/G) replaced with scalable **mini-icons** (mute, bluetooth, advert, trail).\r\n- **Nearby Nodes reorganized** — one list over two sources (stored contacts + live discover scan) with a unified detail/action menu. Type filter and sort are independent axes and persist across re-entry; the active filter is shown in the title and in empty-list messages.\r\n- **Tools › Trail reorganized** — a short two-level action menu (Hold Enter) replaces the flat ~12-item list; view-aware settings; a fitted **square map grid**; and the waypoint manager split out into its own component. No change to trail recording itself.\r\n- **OTA updates** — each solo release now ships a DFU `.zip` (`solo-<ver>-<device>-ota.zip`) for over-the-air / BLE-DFU updates, alongside the `.uf2` for USB flashing.\r\n\r\n### Fixes\r\n\r\n- **GPS battery drain on shutdown** — GPS is powered off before `SYSTEMOFF`, and uses the correct active-level (`!PIN_GPS_EN_ACTIVE`) instead of a hardcoded level.\r\n- **Buzzer octave 8** — the RTTTL parser now fully accepts octave 8 instead of clamping it away (which could leak a digit into the next note's duration).\r\n- **Trail file robustness** — `Waypoint`/trail readers check every header read, so a truncated file is rejected instead of using a garbage count.\r\n\r\n### Under the hood\r\n\r\n- OTA DFU zip is named and attached to releases by the `_solo_dual` build workflow; the per-build Actions artifact already carried it.\r\n- Large UI consolidation: shared `drawList` / header / key-decode helpers, deduplicated status-bar indicators, reusable scalable mini-icon facility (`icons.h`), and an audit-pass cleanup premoving dead code and redundant scroll-clamp logic.",
      "notesHtml": "<h2>MeshCore Solo Companion Firmware v1.19</h2>\n<h3>What's new</h3>\n<ul>\n<li><strong>Message delivery status</strong> — outgoing messages now show an end-to-end delivery marker, auto-scaled to the font (legible on landscape e-ink), in both the history list and the fullscreen view:<ul>\n<li><strong>Direct messages</strong> (and room servers): pending → delivered (✓) → failed (✗), driven by the real end-to-end ACK. While pending, a row of dots shows one per send so auto-resend progress is visible.</li>\n<li><strong>Auto-resend</strong> — a pending DM whose ACK times out is re-sent automatically (reusing the original timestamp) until resends run out. Configurable count under Settings › Messages › Resend (0–5, default 2). Runs in the background, independent of which screen is open; incoming duplicates from retries are dropped.</li>\n<li><strong>Channels</strong> — ✓ appears only once a repeater echo confirms the message was relayed into the mesh. No echo is normal (flood has no recipient ACK), so no pending/fail is shown.</li>\n</ul>\n</li>\n<li><strong>Auto-reply bot overhaul</strong> — the trigger/reply bot grows into a small auto-responder:<ul>\n<li><strong>Query commands</strong> — a DM or monitored-channel message is scanned for <code>!</code> tokens (<code>!ping !batt !loc !time !temp !hops !status !help</code>) and answered in one combined reply.</li>\n<li><strong>Away / reply-to-all</strong> — a lone <code>*</code> trigger replies to every message.</li>\n<li><strong>Separate DM and channel triggers</strong>, each with its own reply text.</li>\n<li><strong>Quiet hours</strong> — silence push replies during a chosen window (wraps midnight).</li>\n<li><strong>Throttling &amp; anti-loop</strong> — per-contact DM throttle so one sender can't starve others; channel echo guard so the bot never answers itself; reply counter shown in the bot screen header.</li>\n</ul>\n</li>\n<li><strong>Keyboard overhaul</strong> — one shared keyboard across all screens (reclaims duplicate RAM), icon keys (⇧ caps, ⎵ space, ⌫ delete, ✓ OK), and a second <strong>symbols page</strong> toggled with <code>#@</code>/<code>abc</code>.</li>\n<li><strong>UI refresh</strong><ul>\n<li>Proportional <strong>scrollbar</strong> with up/down triangle caps replaces the old <code>^</code>/<code>v</code> arrows, scaling with the font (1× OLED, 2× landscape e-ink); used by every scrollable list and the fullscreen message view. The redundant <code>&gt;</code> selection marker is gone and rows shifted left to reclaim space.</li>\n<li>Status-bar single-letter indicators (M/B/A/G) replaced with scalable <strong>mini-icons</strong> (mute, bluetooth, advert, trail).</li>\n</ul>\n</li>\n<li><strong>Nearby Nodes reorganized</strong> — one list over two sources (stored contacts + live discover scan) with a unified detail/action menu. Type filter and sort are independent axes and persist across re-entry; the active filter is shown in the title and in empty-list messages.</li>\n<li><strong>Tools › Trail reorganized</strong> — a short two-level action menu (Hold Enter) replaces the flat ~12-item list; view-aware settings; a fitted <strong>square map grid</strong>; and the waypoint manager split out into its own component. No change to trail recording itself.</li>\n<li><strong>OTA updates</strong> — each solo release now ships a DFU <code>.zip</code> (<code>solo-&lt;ver&gt;-&lt;device&gt;-ota.zip</code>) for over-the-air / BLE-DFU updates, alongside the <code>.uf2</code> for USB flashing.</li>\n</ul>\n<h3>Fixes</h3>\n<ul>\n<li><strong>GPS battery drain on shutdown</strong> — GPS is powered off before <code>SYSTEMOFF</code>, and uses the correct active-level (<code>!PIN_GPS_EN_ACTIVE</code>) instead of a hardcoded level.</li>\n<li><strong>Buzzer octave 8</strong> — the RTTTL parser now fully accepts octave 8 instead of clamping it away (which could leak a digit into the next note's duration).</li>\n<li><strong>Trail file robustness</strong> — <code>Waypoint</code>/trail readers check every header read, so a truncated file is rejected instead of using a garbage count.</li>\n</ul>\n<h3>Under the hood</h3>\n<ul>\n<li>OTA DFU zip is named and attached to releases by the <code>_solo_dual</code> build workflow; the per-build Actions artifact already carried it.</li>\n<li>Large UI consolidation: shared <code>drawList</code> / header / key-decode helpers, deduplicated status-bar indicators, reusable scalable mini-icon facility (<code>icons.h</code>), and an audit-pass cleanup premoving dead code and redundant scroll-clamp logic.</li>\n</ul>\n"
    },
    {
      "version": "v1.18",
      "name": "Solo v1.18",
      "datetime": "2026-06-14T08:22:51Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/v1.18",
      "prerelease": false,
      "notes": "## MeshCore Solo Companion Firmware v1.18\r\n\r\n### New device support\r\n\r\n- **GAT562 30S Mesh Kit** — the firmware now supports the GAT562 30S alongside the Wio Tracker L1 family. Pre-built `.uf2` files for all supported devices are published with each release — see the [Supported Devices](https://github.com/MarekZegare4/MeshCore-Solo#supported-devices) table.\r\n\r\n### What's new\r\n\r\n- **GAT562 30S Mesh Kit support** — see above.\r\n- **Battery saving (radio)** — two new independent toggles under Settings › Radio:\r\n  - **Pwr save** — hardware duty-cycle receive (SX126x `SetRxDutyCycle`): the radio cycles RX↔sleep autonomously and wakes on a preamble, cutting average RX current with only a small increase in receive latency\r\n  - **Auto pwr** — Adaptive Power Control: trims TX power on strong links (based on ACK SNR) and ramps back up on weak or lost links; the home screen shows the live transmit power\r\n- **BLE disconnect icon fix** — the BLE status icon now updates immediately when the connection drops (e.g. out of range, supervision timeout). Previously it could stay active until the next UI polling cycle.\r\n- **Bot trigger preserves case** — the auto-reply trigger phrase is now stored exactly as typed. Matching remains case-insensitive, so `Ping`, `ping` and `PING` all trigger the bot, but the trigger no longer gets silently lowercased when saved.\r\n- **Screenshot support in all solo builds** — `ENABLE_SCREENSHOT` is now enabled in every solo firmware build. No need to use a separate `_dev` environment. Use the [Solo Tools](https://marekzegare4.github.io/Solo-tools/) web app to capture screenshots directly from the browser.\r\n\r\n\r\n### Under the hood\r\n\r\n- CI matrix for solo firmware builds is now fully dynamic — new devices are picked up automatically from `platformio.ini` based on the `_solo_dual` env suffix, no workflow changes required.\r\n- `AbstractUITask::onBLEDisconnected()` virtual hook added — called by `setHasConnection()` on transition to disconnected; `UITask` overrides it to set `_next_refresh = 0`.\r\n- `build.sh` gains `build-solo-firmwares` command, backed by `build_all_firmwares_by_suffix \"_solo_dual\"`.",
      "notesHtml": "<h2>MeshCore Solo Companion Firmware v1.18</h2>\n<h3>New device support</h3>\n<ul>\n<li><strong>GAT562 30S Mesh Kit</strong> — the firmware now supports the GAT562 30S alongside the Wio Tracker L1 family. Pre-built <code>.uf2</code> files for all supported devices are published with each release — see the <a href=\"https://github.com/MarekZegare4/MeshCore-Solo#supported-devices\" target=\"_blank\" rel=\"noopener noreferrer\">Supported Devices</a> table.</li>\n</ul>\n<h3>What's new</h3>\n<ul>\n<li><strong>GAT562 30S Mesh Kit support</strong> — see above.</li>\n<li><strong>Battery saving (radio)</strong> — two new independent toggles under Settings › Radio:<ul>\n<li><strong>Pwr save</strong> — hardware duty-cycle receive (SX126x <code>SetRxDutyCycle</code>): the radio cycles RX↔sleep autonomously and wakes on a preamble, cutting average RX current with only a small increase in receive latency</li>\n<li><strong>Auto pwr</strong> — Adaptive Power Control: trims TX power on strong links (based on ACK SNR) and ramps back up on weak or lost links; the home screen shows the live transmit power</li>\n</ul>\n</li>\n<li><strong>BLE disconnect icon fix</strong> — the BLE status icon now updates immediately when the connection drops (e.g. out of range, supervision timeout). Previously it could stay active until the next UI polling cycle.</li>\n<li><strong>Bot trigger preserves case</strong> — the auto-reply trigger phrase is now stored exactly as typed. Matching remains case-insensitive, so <code>Ping</code>, <code>ping</code> and <code>PING</code> all trigger the bot, but the trigger no longer gets silently lowercased when saved.</li>\n<li><strong>Screenshot support in all solo builds</strong> — <code>ENABLE_SCREENSHOT</code> is now enabled in every solo firmware build. No need to use a separate <code>_dev</code> environment. Use the <a href=\"https://marekzegare4.github.io/Solo-tools/\" target=\"_blank\" rel=\"noopener noreferrer\">Solo Tools</a> web app to capture screenshots directly from the browser.</li>\n</ul>\n<h3>Under the hood</h3>\n<ul>\n<li>CI matrix for solo firmware builds is now fully dynamic — new devices are picked up automatically from <code>platformio.ini</code> based on the <code>_solo_dual</code> env suffix, no workflow changes required.</li>\n<li><code>AbstractUITask::onBLEDisconnected()</code> virtual hook added — called by <code>setHasConnection()</code> on transition to disconnected; <code>UITask</code> overrides it to set <code>_next_refresh = 0</code>.</li>\n<li><code>build.sh</code> gains <code>build-solo-firmwares</code> command, backed by <code>build_all_firmwares_by_suffix \"_solo_dual\"</code>.</li>\n</ul>\n"
    },
    {
      "version": "v1.17",
      "name": "Solo v1.17",
      "datetime": "2026-06-09T15:33:39Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/v1.17",
      "prerelease": false,
      "notes": "## Wio Tracker L1 — Solo Firmware v1.17\r\n\r\n### What's new\r\n\r\n- **Nearby Nodes — navigate & save waypoints from the list** — the context menu now exposes _Navigate_ and _Save waypoint_ directly from the Nearby list and detail view, so you no longer have to open the separate Tools → Waypoints screen. Long-press Options in the detail view also opens a _Ping_ submenu.\r\n- **Nearby Nodes — TIME sort filter** — a new `[TIME]` filter sorts contacts by last-seen time (most recent first) instead of distance, useful when GPS is unavailable.\r\n- **Battery indicator calibrated** — the 100 % ceiling of the LiPo discharge curve was corrected from 4200 mV to 4170 mV, matching what the board's charger actually delivers.\r\n- **Advert sound scope control** — a new _Sound → Advert_ setting lets you choose whether advert notifications play for all nodes or only direct (zero-hop) neighbours, cutting noise on busy meshes.\r\n- **Sound slot \"None\" option** — DM, channel and advert melody slots can now be set to _None_ to silence that notification category entirely without muting everything.\r\n- **Mark-as-read feedback** — marking messages read (per-contact or per-channel) now shows a brief _\"N marked read\"_ confirmation on screen.\r\n- **[Web tool] GPX Downloader** — a standalone web page for downloading saved GPX trails from the device over the browser's Web Serial API, no desktop app required.\r\n\r\n### Under the hood\r\n\r\n- `SoundNotifier` extracted from `UITask::notify()` — all buzzer/melody logic lives in one place, reducing future merge conflict surface with upstream.\r\n- `KeyboardWidget` is now a single shared instance across screens (saves ~1.5 KB heap).\r\n- `onDiscoveredAdvert` extracted as a separate virtual so upstream `onDiscoveredContact` keeps its original 4-parameter signature.",
      "notesHtml": "<h2>Wio Tracker L1 — Solo Firmware v1.17</h2>\n<h3>What's new</h3>\n<ul>\n<li><strong>Nearby Nodes — navigate &amp; save waypoints from the list</strong> — the context menu now exposes <em>Navigate</em> and <em>Save waypoint</em> directly from the Nearby list and detail view, so you no longer have to open the separate Tools → Waypoints screen. Long-press Options in the detail view also opens a <em>Ping</em> submenu.</li>\n<li><strong>Nearby Nodes — TIME sort filter</strong> — a new <code>[TIME]</code> filter sorts contacts by last-seen time (most recent first) instead of distance, useful when GPS is unavailable.</li>\n<li><strong>Battery indicator calibrated</strong> — the 100 % ceiling of the LiPo discharge curve was corrected from 4200 mV to 4170 mV, matching what the board's charger actually delivers.</li>\n<li><strong>Advert sound scope control</strong> — a new <em>Sound → Advert</em> setting lets you choose whether advert notifications play for all nodes or only direct (zero-hop) neighbours, cutting noise on busy meshes.</li>\n<li><strong>Sound slot \"None\" option</strong> — DM, channel and advert melody slots can now be set to <em>None</em> to silence that notification category entirely without muting everything.</li>\n<li><strong>Mark-as-read feedback</strong> — marking messages read (per-contact or per-channel) now shows a brief <em>\"N marked read\"</em> confirmation on screen.</li>\n<li><strong>[Web tool] GPX Downloader</strong> — a standalone web page for downloading saved GPX trails from the device over the browser's Web Serial API, no desktop app required.</li>\n</ul>\n<h3>Under the hood</h3>\n<ul>\n<li><code>SoundNotifier</code> extracted from <code>UITask::notify()</code> — all buzzer/melody logic lives in one place, reducing future merge conflict surface with upstream.</li>\n<li><code>KeyboardWidget</code> is now a single shared instance across screens (saves ~1.5 KB heap).</li>\n<li><code>onDiscoveredAdvert</code> extracted as a separate virtual so upstream <code>onDiscoveredContact</code> keeps its original 4-parameter signature.</li>\n</ul>\n"
    },
    {
      "version": "v1.16",
      "name": "Solo v1.16",
      "datetime": "2026-06-06T16:35:39Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/v1.16",
      "prerelease": false,
      "notes": "## Wio Tracker L1 — Solo Firmware v1.16\r\n\r\nRebases the Solo fork onto upstream MeshCore **v1.16.0** (254 commits)\r\n\r\n### What's new (from upstream)\r\n\r\n- **NRF52 power-saving** — the companion now puts the MCU to sleep whenever there's no pending work, instead of looping continuously between events.\r\n- **Better reception of longer messages at low spreading factors** — the LoRa preamble is now 32 (was 16) for SF below 9, which makes longer frames more reliable on weak links.\r\n- **More robust sensors** — the I²C sensor subsystem was rewritten to probe the bus before touching any device, so an absent or misbehaving sensor can no longer hang or crash the node.\r\n- **Charging-aware shutdown** — the device no longer auto-shuts-down on low battery while it's on external power, and shows a shutdown warning on OLED.\r\n- **New companion command** for sending raw packets, plus assorted CLI additions (`flood.max.advert`, `flood.max.unscoped`, region hierarchy) and bounds-checking fixes that the phone app and repeaters benefit from.\r\n- **Battery-voltage reading fix** carried in from upstream.",
      "notesHtml": "<h2>Wio Tracker L1 — Solo Firmware v1.16</h2>\n<p>Rebases the Solo fork onto upstream MeshCore <strong>v1.16.0</strong> (254 commits)</p>\n<h3>What's new (from upstream)</h3>\n<ul>\n<li><strong>NRF52 power-saving</strong> — the companion now puts the MCU to sleep whenever there's no pending work, instead of looping continuously between events.</li>\n<li><strong>Better reception of longer messages at low spreading factors</strong> — the LoRa preamble is now 32 (was 16) for SF below 9, which makes longer frames more reliable on weak links.</li>\n<li><strong>More robust sensors</strong> — the I²C sensor subsystem was rewritten to probe the bus before touching any device, so an absent or misbehaving sensor can no longer hang or crash the node.</li>\n<li><strong>Charging-aware shutdown</strong> — the device no longer auto-shuts-down on low battery while it's on external power, and shows a shutdown warning on OLED.</li>\n<li><strong>New companion command</strong> for sending raw packets, plus assorted CLI additions (<code>flood.max.advert</code>, <code>flood.max.unscoped</code>, region hierarchy) and bounds-checking fixes that the phone app and repeaters benefit from.</li>\n<li><strong>Battery-voltage reading fix</strong> carried in from upstream.</li>\n</ul>\n"
    },
    {
      "version": "v1.15.1",
      "name": "Solo v1.15.1",
      "datetime": "2026-06-05T11:31:47Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/v1.15.1",
      "prerelease": false,
      "notes": "## Wio Tracker L1 — Solo Firmware v1.15.1\r\n\r\nHotfix for Bluetooth pairing and buzzer regressions in v1.15 (introduced by the Advert-sound change). No schema change — upgrade in place from v1.15.\r\n\r\n### Fixes\r\n\r\n- **Bluetooth pairing PIN is shown again** — on the published OLED + e-ink (dual BLE+USB) builds the pairing PIN was never drawn, so the phone asked for a code that wasn't displayed and pairing failed. The PIN now appears on the **Bluetooth** home page while BLE is on and not yet bonded.\r\n- **Auto buzzer mute works again** — in v1.15 \"Auto\" was effectively always muted on dual builds (the connection state was hardcoded true). It now mutes only when a companion app is actually connected — **BLE bonded or a host holding the USB serial port open** — and stays audible on charge-only / no host. (Plain serial monitors that assert DTR count as connected.)\r\n- **Bluetooth status indicator** — the top-bar BT dot again reflects a real BLE connection instead of showing connected permanently.\r\n- **New-message display wake** — the screen wakes for an incoming message again when no app is connected.\r\n\r\n### Background\r\n\r\nv1.15's advert-sound feature broadened the internal \"connected\" flag from BLE-bonded to *any* transport, but the dual interface always reports its send-fallback as connected — so everything keyed off \"connected\" (PIN prompt, Auto mute, BT indicator, message-wake) misbehaved. This release splits the two notions: BLE-specific UI uses the BLE bond state, while Auto mute / message-wake use a new \"app connected over BLE or USB\" check (USB detected via the CDC DTR line).",
      "notesHtml": "<h2>Wio Tracker L1 — Solo Firmware v1.15.1</h2>\n<p>Hotfix for Bluetooth pairing and buzzer regressions in v1.15 (introduced by the Advert-sound change). No schema change — upgrade in place from v1.15.</p>\n<h3>Fixes</h3>\n<ul>\n<li><strong>Bluetooth pairing PIN is shown again</strong> — on the published OLED + e-ink (dual BLE+USB) builds the pairing PIN was never drawn, so the phone asked for a code that wasn't displayed and pairing failed. The PIN now appears on the <strong>Bluetooth</strong> home page while BLE is on and not yet bonded.</li>\n<li><strong>Auto buzzer mute works again</strong> — in v1.15 \"Auto\" was effectively always muted on dual builds (the connection state was hardcoded true). It now mutes only when a companion app is actually connected — <strong>BLE bonded or a host holding the USB serial port open</strong> — and stays audible on charge-only / no host. (Plain serial monitors that assert DTR count as connected.)</li>\n<li><strong>Bluetooth status indicator</strong> — the top-bar BT dot again reflects a real BLE connection instead of showing connected permanently.</li>\n<li><strong>New-message display wake</strong> — the screen wakes for an incoming message again when no app is connected.</li>\n</ul>\n<h3>Background</h3>\n<p>v1.15's advert-sound feature broadened the internal \"connected\" flag from BLE-bonded to <em>any</em> transport, but the dual interface always reports its send-fallback as connected — so everything keyed off \"connected\" (PIN prompt, Auto mute, BT indicator, message-wake) misbehaved. This release splits the two notions: BLE-specific UI uses the BLE bond state, while Auto mute / message-wake use a new \"app connected over BLE or USB\" check (USB detected via the CDC DTR line).</p>\n"
    },
    {
      "version": "v1.15",
      "name": "Solo v1.15",
      "datetime": "2026-06-04T15:35:06Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/v1.15",
      "prerelease": false,
      "notes": "## Wio Tracker L1 — Solo Firmware v1.15\r\n\r\nAdds a full **GPS navigation suite** on top of Solo v1.14 — the L1 becomes a standalone off-grid navigator, no phone required.\r\n\r\n### Highlights\r\n\r\n- **Waypoints** — mark your current spot or type coordinates, give it a short label, then get live bearing + distance back to it. Ideal for car / camp / water / a meeting point.\r\n- **GPS compass** — *Tools › Compass*: a heads-up heading tape derived from GPS course-over-ground. No magnetometer needed.\r\n- **Navigate to anything** — a saved waypoint, the start of your trail (backtrack), a node from Nearby Nodes, or a location someone texts you.\r\n- **Share & save locations over the mesh** — send a waypoint in a message; on the other end, navigate to or save any shared location with one menu.\r\n- **Global Units setting** — one Metric / Imperial switch (Settings › System) drives every distance and speed in the UI.\r\n- **Advert sound** — an optional audible \"in range\" heartbeat: the device chirps when it receives an advert from another node — pair it with Auto-Advert to keep tabs on a buddy hands-free.\r\n\r\n### Changes\r\n\r\n**Navigation (new)**\r\n\r\n- **Waypoints** — *Tools › Trail › Hold Enter*: **Mark here** drops one at the current GPS fix; **Waypoints** opens the list, which carries a synthetic **Trail start** backtrack row, a usage counter (`WAYPOINTS 3/16`), and a **+ Add by coords** row to enter a point by lat/lon/label with no fix required (hemisphere chosen with LEFT/RIGHT since the keyboard has no minus key). Per-waypoint **Rename / Delete / Send**, plus **Clear waypoints**. Stored in their own `/waypoints` file (16 max) — independent of the trail and **not** cleared by Reset trail.\r\n- **Navigate-to-point view** — distance plus two *absolute* bearings, **To:** (target) and **Hdg:** (your course over ground), compared by eye. Reused by waypoints, trail backtrack, Nearby-node navigation and message-shared locations.\r\n- **GPS compass** — *Tools › Compass*: a scrolling N..E..S..W heading tape under a fixed travel-direction pointer, with a large degrees + cardinal readout. Works whether or not a trail is recording.\r\n- **Navigate to a node** — Nearby Nodes detail → **Hold Enter** now opens an Options menu (**Navigate** / **Ping**); Navigate opens the bearing/distance view targeting the node's last-known position.\r\n- **Trail map as a live view** — the Map draws your current position and all waypoints continuously, even with no trail recording. While a trail exists it frames the recorded route and clamps far-off waypoints to the nearest edge (a distant mark can't blow up the scale); with no trail it auto-fits to your waypoints and position. Markers show the first two label characters, placed edge-aware so labels stay on-map.\r\n- **Navigate / save a shared location** — any message carrying a `lat,lon` (what `{loc}` inserts) or a `[WAY]lat,lon label` share offers **Navigate** and **Save waypoint** from its **Hold Enter** menu — on the history row or in fullscreen, for DMs and channels. **Send** on a waypoint shares it to a contact or channel, pre-filling the message to confirm.\r\n- **Waypoints in GPX** — the GPX export now includes saved waypoints as `<wpt>` elements (label → `<name>`, plus `<time>`) alongside the track, so they import as pins in OsmAnd / Garmin / GPX Studio.\r\n\r\n**Units**\r\n\r\n- **Global Metric / Imperial** (Settings › System) drives every distance and speed: Nearby Nodes, Trail (Summary, List deltas, waypoint distances), the navigate-to-point view, the trail min-distance gate (5/10/25/100 m ↔ 15/30/75/300 ft) and the map scale bar.\r\n- **Trail readout** — the action menu's old four-way km/h·mph·min/km·min/mi cycle is now a **Speed / Pace** toggle; the unit follows the global setting.\r\n\r\n**Notifications**\r\n\r\n- **Advert sound** — Settings › Sound gains an **AD sound** entry (built-in / Melody 1 / Melody 2). The device plays it whenever it receives an advert from any node; combined with Auto-Advert on both ends it acts as a hands-free \"still i\n…",
      "notesHtml": "<h2>Wio Tracker L1 — Solo Firmware v1.15</h2>\n<p>Adds a full <strong>GPS navigation suite</strong> on top of Solo v1.14 — the L1 becomes a standalone off-grid navigator, no phone required.</p>\n<h3>Highlights</h3>\n<ul>\n<li><strong>Waypoints</strong> — mark your current spot or type coordinates, give it a short label, then get live bearing + distance back to it. Ideal for car / camp / water / a meeting point.</li>\n<li><strong>GPS compass</strong> — <em>Tools › Compass</em>: a heads-up heading tape derived from GPS course-over-ground. No magnetometer needed.</li>\n<li><strong>Navigate to anything</strong> — a saved waypoint, the start of your trail (backtrack), a node from Nearby Nodes, or a location someone texts you.</li>\n<li><strong>Share &amp; save locations over the mesh</strong> — send a waypoint in a message; on the other end, navigate to or save any shared location with one menu.</li>\n<li><strong>Global Units setting</strong> — one Metric / Imperial switch (Settings › System) drives every distance and speed in the UI.</li>\n<li><strong>Advert sound</strong> — an optional audible \"in range\" heartbeat: the device chirps when it receives an advert from another node — pair it with Auto-Advert to keep tabs on a buddy hands-free.</li>\n</ul>\n<h3>Changes</h3>\n<p><strong>Navigation (new)</strong></p>\n<ul>\n<li><strong>Waypoints</strong> — <em>Tools › Trail › Hold Enter</em>: <strong>Mark here</strong> drops one at the current GPS fix; <strong>Waypoints</strong> opens the list, which carries a synthetic <strong>Trail start</strong> backtrack row, a usage counter (<code>WAYPOINTS 3/16</code>), and a <strong>+ Add by coords</strong> row to enter a point by lat/lon/label with no fix required (hemisphere chosen with LEFT/RIGHT since the keyboard has no minus key). Per-waypoint <strong>Rename / Delete / Send</strong>, plus <strong>Clear waypoints</strong>. Stored in their own <code>/waypoints</code> file (16 max) — independent of the trail and <strong>not</strong> cleared by Reset trail.</li>\n<li><strong>Navigate-to-point view</strong> — distance plus two <em>absolute</em> bearings, <strong>To:</strong> (target) and <strong>Hdg:</strong> (your course over ground), compared by eye. Reused by waypoints, trail backtrack, Nearby-node navigation and message-shared locations.</li>\n<li><strong>GPS compass</strong> — <em>Tools › Compass</em>: a scrolling N..E..S..W heading tape under a fixed travel-direction pointer, with a large degrees + cardinal readout. Works whether or not a trail is recording.</li>\n<li><strong>Navigate to a node</strong> — Nearby Nodes detail → <strong>Hold Enter</strong> now opens an Options menu (<strong>Navigate</strong> / <strong>Ping</strong>); Navigate opens the bearing/distance view targeting the node's last-known position.</li>\n<li><strong>Trail map as a live view</strong> — the Map draws your current position and all waypoints continuously, even with no trail recording. While a trail exists it frames the recorded route and clamps far-off waypoints to the nearest edge (a distant mark can't blow up the scale); with no trail it auto-fits to your waypoints and position. Markers show the first two label characters, placed edge-aware so labels stay on-map.</li>\n<li><strong>Navigate / save a shared location</strong> — any message carrying a <code>lat,lon</code> (what <code>{loc}</code> inserts) or a <code>[WAY]lat,lon label</code> share offers <strong>Navigate</strong> and <strong>Save waypoint</strong> from its <strong>Hold Enter</strong> menu — on the history row or in fullscreen, for DMs and channels. <strong>Send</strong> on a waypoint shares it to a contact or channel, pre-filling the message to confirm.</li>\n<li><strong>Waypoints in GPX</strong> — the GPX export now includes saved waypoints as <code>&lt;wpt&gt;</code> elements (label → <code>&lt;name&gt;</code>, plus <code>&lt;time&gt;</code>) alongside the track, so they import as pins in OsmAnd / Garmin / GPX Studio.</li>\n</ul>\n<p><strong>Units</strong></p>\n<ul>\n<li><strong>Global Metric / Imperial</strong> (Settings › System) drives every distance and speed: Nearby Nodes, Trail (Summary, List deltas, waypoint distances), the navigate-to-point view, the trail min-distance gate (5/10/25/100 m ↔ 15/30/75/300 ft) and the map scale bar.</li>\n<li><strong>Trail readout</strong> — the action menu's old four-way km/h·mph·min/km·min/mi cycle is now a <strong>Speed / Pace</strong> toggle; the unit follows the global setting.</li>\n</ul>\n<p><strong>Notifications</strong></p>\n<ul>\n<li><strong>Advert sound</strong> — Settings › Sound gains an <strong>AD sound</strong> entry (built-in / Melody 1 / Melody 2). The device plays it whenever it receives an advert from any node; combined with Auto-Advert on both ends it acts as a hands-free \"still i\n…</li>\n</ul>\n"
    },
    {
      "version": "v1.14",
      "name": "Solo v1.14",
      "datetime": "2026-05-29T10:59:08Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/v1.14",
      "prerelease": false,
      "notes": "## Wio Tracker L1 — Solo Firmware v1.14\r\n\r\nBased on MeshCore upstream v1.15.\r\n\r\n### Highlights\r\n\r\n- **Renamed Plus → Solo** — to better reflect that this firmware is designed for *off-grid, standalone* use without needing a companion app on the phone; release artefacts are now `solo-v1.14-oled.uf2` and `solo-v1.14-eink.uf2`\r\n- **E-ink screenshot support** — `tools/screenshot.py` now works with both OLED and the e-ink panel; auto-detects rotation 0–3 and uses GxEPD2's visible dimensions; build with `-D ENABLE_SCREENSHOT`\r\n- **Battery percentage field** — new `Batt %` option for the Clock page dashboard, now sharing the same LiPo discharge curve and `low_batt_mv` cutoff as the top-bar indicator (so both readings agree)\r\n- **Channel favourites** — mark individual channels as favourites from the channel context menu; new Settings › Contacts filter to hide non-favourite channels\r\n- **Context menu cycling unified** — LEFT/RIGHT now cycles values everywhere (Notif, Melody, Fav, Duration, BPM) without closing the popup; ENTER reserved for one-shot actions\r\n- **Popup menus expand to fit the screen** — on portrait e-ink up to 16 items fit without scrolling; on OLED items are now hard-capped to what physically fits\r\n\r\n### Changes\r\n\r\n**New features**\r\n- **E-ink screenshot** — `WioTrackerL1Eink_companion_dual_dev` env enables capture; protocol header widened to 11 bytes (display type, rotation, uint16 width/height/chunk fields) so it scales to any GxEPD2 panel and rotation\r\n- **Dashboard `Batt %` field** — new Clock-page option computed from the same piecewise LiPo curve used by the top-bar battery indicator\r\n- **Channel favourites** — `ch_fav_bitmask` in prefs; toggle from Channel context menu; Settings › Contacts › Channels filter (all / favourites only)\r\n- **GPS trail — scale grid on map** — toggle from the Trail action menu (Grid row); cycles with LEFT/RIGHT now (previously ENTER only)\r\n- **Ringtone editor migrated to PopupMenu** — Duration and BPM now cycle in-place with LEFT/RIGHT; separate BPM+/BPM- rows removed\r\n\r\n**Fixes**\r\n- **OLED joystick rotation** — enforce reset moved after prefs load, so stale e-ink rotation values no longer reverse joystick mapping on OLED builds (`FEAT_JOYSTICK_ROTATION_SETTING=0`)\r\n- **First melody note duration** — preview-only side effect that shortened the first note in `playMelody()` no longer corrupts the stored sequence\r\n- **Home pages migration** — pages added in this release (Favourites, Trail) are appended to stored `page_order` instead of being hidden; SHUTDOWN is evicted from a full order to make room for required pages\r\n- **Pin picker fallback** — pressing `+` on an empty Favourites tile with no starred contacts and no recent DMs now lists all chat contacts instead of showing \"No fav contacts\"\r\n- **Popup menus on OLED** — height-clamped to what fits on screen (max 4 items at 64 px), so long context menus no longer draw outside the panel\r\n- **Trail action menu** — Grid toggle now also works with LEFT/RIGHT (not just ENTER); Export labels shortened to `Export (live)` / `Export (saved)` to fit\r\n- **E-ink default font** — unknown-character fallback rectangle aligned with the text cell baseline instead of one pixel below\r\n- **Build** — added `DisplayDriver::getBuffer`/`getBufferSize` virtuals so MyMesh no longer needs to know about concrete display types",
      "notesHtml": "<h2>Wio Tracker L1 — Solo Firmware v1.14</h2>\n<p>Based on MeshCore upstream v1.15.</p>\n<h3>Highlights</h3>\n<ul>\n<li><strong>Renamed Plus → Solo</strong> — to better reflect that this firmware is designed for <em>off-grid, standalone</em> use without needing a companion app on the phone; release artefacts are now <code>solo-v1.14-oled.uf2</code> and <code>solo-v1.14-eink.uf2</code></li>\n<li><strong>E-ink screenshot support</strong> — <code>tools/screenshot.py</code> now works with both OLED and the e-ink panel; auto-detects rotation 0–3 and uses GxEPD2's visible dimensions; build with <code>-D ENABLE_SCREENSHOT</code></li>\n<li><strong>Battery percentage field</strong> — new <code>Batt %</code> option for the Clock page dashboard, now sharing the same LiPo discharge curve and <code>low_batt_mv</code> cutoff as the top-bar indicator (so both readings agree)</li>\n<li><strong>Channel favourites</strong> — mark individual channels as favourites from the channel context menu; new Settings › Contacts filter to hide non-favourite channels</li>\n<li><strong>Context menu cycling unified</strong> — LEFT/RIGHT now cycles values everywhere (Notif, Melody, Fav, Duration, BPM) without closing the popup; ENTER reserved for one-shot actions</li>\n<li><strong>Popup menus expand to fit the screen</strong> — on portrait e-ink up to 16 items fit without scrolling; on OLED items are now hard-capped to what physically fits</li>\n</ul>\n<h3>Changes</h3>\n<p><strong>New features</strong></p>\n<ul>\n<li><strong>E-ink screenshot</strong> — <code>WioTrackerL1Eink_companion_dual_dev</code> env enables capture; protocol header widened to 11 bytes (display type, rotation, uint16 width/height/chunk fields) so it scales to any GxEPD2 panel and rotation</li>\n<li><strong>Dashboard <code>Batt %</code> field</strong> — new Clock-page option computed from the same piecewise LiPo curve used by the top-bar battery indicator</li>\n<li><strong>Channel favourites</strong> — <code>ch_fav_bitmask</code> in prefs; toggle from Channel context menu; Settings › Contacts › Channels filter (all / favourites only)</li>\n<li><strong>GPS trail — scale grid on map</strong> — toggle from the Trail action menu (Grid row); cycles with LEFT/RIGHT now (previously ENTER only)</li>\n<li><strong>Ringtone editor migrated to PopupMenu</strong> — Duration and BPM now cycle in-place with LEFT/RIGHT; separate BPM+/BPM- rows removed</li>\n</ul>\n<p><strong>Fixes</strong></p>\n<ul>\n<li><strong>OLED joystick rotation</strong> — enforce reset moved after prefs load, so stale e-ink rotation values no longer reverse joystick mapping on OLED builds (<code>FEAT_JOYSTICK_ROTATION_SETTING=0</code>)</li>\n<li><strong>First melody note duration</strong> — preview-only side effect that shortened the first note in <code>playMelody()</code> no longer corrupts the stored sequence</li>\n<li><strong>Home pages migration</strong> — pages added in this release (Favourites, Trail) are appended to stored <code>page_order</code> instead of being hidden; SHUTDOWN is evicted from a full order to make room for required pages</li>\n<li><strong>Pin picker fallback</strong> — pressing <code>+</code> on an empty Favourites tile with no starred contacts and no recent DMs now lists all chat contacts instead of showing \"No fav contacts\"</li>\n<li><strong>Popup menus on OLED</strong> — height-clamped to what fits on screen (max 4 items at 64 px), so long context menus no longer draw outside the panel</li>\n<li><strong>Trail action menu</strong> — Grid toggle now also works with LEFT/RIGHT (not just ENTER); Export labels shortened to <code>Export (live)</code> / <code>Export (saved)</code> to fit</li>\n<li><strong>E-ink default font</strong> — unknown-character fallback rectangle aligned with the text cell baseline instead of one pixel below</li>\n<li><strong>Build</strong> — added <code>DisplayDriver::getBuffer</code>/<code>getBufferSize</code> virtuals so MyMesh no longer needs to know about concrete display types</li>\n</ul>\n"
    },
    {
      "version": "v1.13",
      "name": "Wio Tracker L1 Firmware v1.13",
      "datetime": "2026-05-26T14:00:21Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/v1.13",
      "prerelease": false,
      "notes": "## Wio Tracker L1 — Plus Firmware v1.13\r\n\r\nBased on MeshCore upstream v1.15.\r\n\r\n### Highlights\r\n\r\n- **Favourites dial** — new home page with a 2×3 grid of pinned contacts; Enter opens the DM directly, pin/unpin from the contact context menu in the DM list\r\n- **GPS trail** — Tools › Trail records your route in a RAM ring (512 points); three views cycle with LEFT/RIGHT: Summary (distance, time, avg speed/pace), Map (auto-fit with segment markers), List (per-point timestamps and deltas); Hold Enter for Start/Stop, Save/Load to flash, GPX export over USB Serial, and settings (min-distance gate, speed units)\r\n- **Mark-all-read** — Hold Enter on the DM / Channels / Rooms mode-select screen to mark everything in that category read at once\r\n- **Unicode messages on both displays** — Cyrillic, Greek, Polish, Czech, Baltic and other Latin Extended scripts now render correctly in messages, keyboard preview and reply prefix on both OLED and e-ink when the Lemon font is enabled\r\n- **E-ink full-refresh interval** — Settings › Display › Full rfsh lets you pick how many partial refreshes happen before a cleansing full refresh (off / 5 / 10 / 20 / 30); reduces visible ghosting on long sessions *(e-ink only)*\r\n- **Faster long-message rendering** — fullscreen message view now wraps text in O(n) instead of O(n²); noticeably snappier on long messages, especially with the Lemon font on e-ink\r\n\r\n### Changes\r\n\r\n**New features**\r\n- **Favourites dial home page** — 2×3 grid of pinned contacts; Enter on a filled tile opens the DM, Enter on an empty tile opens an in-place picker (upstream-favourited contacts first, then recent DMs); LEFT/RIGHT reorders in the Home Pages settings\r\n- **GPS trail** — background sampling with configurable min-distance gate (5 / 10 / 25 / 100 m); segments tracked across start/stop cycles; single flash slot `/trail` (binary, magic-versioned header); GPX 1.1 export streams live ring or saved file straight to USB Serial; `G` indicator in status bar blinks while active\r\n- **Mark-all-read** — Hold Enter on the message-type screen clears unread counters for the highlighted mode (DM / Channels / Rooms)\r\n- **Settings sections collapsible** — all sections start collapsed; Enter on a section header expands/collapses it, making long lists (Home Pages, Messages) much faster to navigate\r\n- E-ink: `Full rfsh` setting in Settings › Display — controls how many partial refreshes occur before a cleansing full panel refresh\r\n- Schema versioning of saved preferences — `/new_prefs` now carries a tail sentinel so older saves are detected and treated safely on load; file self-heals on next save\r\n\r\n**Fixes**\r\n- Sensors home page: Enter no longer accidentally toggles GPS on/off while viewing sensor readings\r\n- Upgrade from v1.11 with trail settings in flash: `trail_units_idx` was silently read from the old sentinel byte (giving \"min/mi\" instead of km/h default) — schema bumped to `0xC0DE0004`, corrupted value reset to 0 on mismatch\r\n- Lemon font now correctly decodes multi-byte UTF-8 on the e-ink display (Cyrillic, Greek, Polish accents, etc.); previously rendered as garbage glyphs\r\n- Keyboard preview translates UTF-8 through the active font path, so non-ASCII input shows correctly while typing\r\n- Reply path: the `@[nick]` prefix is now preserved verbatim — a nickname containing `{loc}` / `{time}` is no longer substituted as a placeholder\r\n- Home page order: validity flag prevents a junk byte in flash from being interpreted as a \"custom order\" state\r\n- E-ink: unknown-character fallback rectangle now aligns to the top of the text cell instead of sitting one pixel below the line\r\n- E-ink: Lemon glyphs at text size 2/3 (splash version, clock) no longer render at size 1 scale",
      "notesHtml": "<h2>Wio Tracker L1 — Plus Firmware v1.13</h2>\n<p>Based on MeshCore upstream v1.15.</p>\n<h3>Highlights</h3>\n<ul>\n<li><strong>Favourites dial</strong> — new home page with a 2×3 grid of pinned contacts; Enter opens the DM directly, pin/unpin from the contact context menu in the DM list</li>\n<li><strong>GPS trail</strong> — Tools › Trail records your route in a RAM ring (512 points); three views cycle with LEFT/RIGHT: Summary (distance, time, avg speed/pace), Map (auto-fit with segment markers), List (per-point timestamps and deltas); Hold Enter for Start/Stop, Save/Load to flash, GPX export over USB Serial, and settings (min-distance gate, speed units)</li>\n<li><strong>Mark-all-read</strong> — Hold Enter on the DM / Channels / Rooms mode-select screen to mark everything in that category read at once</li>\n<li><strong>Unicode messages on both displays</strong> — Cyrillic, Greek, Polish, Czech, Baltic and other Latin Extended scripts now render correctly in messages, keyboard preview and reply prefix on both OLED and e-ink when the Lemon font is enabled</li>\n<li><strong>E-ink full-refresh interval</strong> — Settings › Display › Full rfsh lets you pick how many partial refreshes happen before a cleansing full refresh (off / 5 / 10 / 20 / 30); reduces visible ghosting on long sessions <em>(e-ink only)</em></li>\n<li><strong>Faster long-message rendering</strong> — fullscreen message view now wraps text in O(n) instead of O(n²); noticeably snappier on long messages, especially with the Lemon font on e-ink</li>\n</ul>\n<h3>Changes</h3>\n<p><strong>New features</strong></p>\n<ul>\n<li><strong>Favourites dial home page</strong> — 2×3 grid of pinned contacts; Enter on a filled tile opens the DM, Enter on an empty tile opens an in-place picker (upstream-favourited contacts first, then recent DMs); LEFT/RIGHT reorders in the Home Pages settings</li>\n<li><strong>GPS trail</strong> — background sampling with configurable min-distance gate (5 / 10 / 25 / 100 m); segments tracked across start/stop cycles; single flash slot <code>/trail</code> (binary, magic-versioned header); GPX 1.1 export streams live ring or saved file straight to USB Serial; <code>G</code> indicator in status bar blinks while active</li>\n<li><strong>Mark-all-read</strong> — Hold Enter on the message-type screen clears unread counters for the highlighted mode (DM / Channels / Rooms)</li>\n<li><strong>Settings sections collapsible</strong> — all sections start collapsed; Enter on a section header expands/collapses it, making long lists (Home Pages, Messages) much faster to navigate</li>\n<li>E-ink: <code>Full rfsh</code> setting in Settings › Display — controls how many partial refreshes occur before a cleansing full panel refresh</li>\n<li>Schema versioning of saved preferences — <code>/new_prefs</code> now carries a tail sentinel so older saves are detected and treated safely on load; file self-heals on next save</li>\n</ul>\n<p><strong>Fixes</strong></p>\n<ul>\n<li>Sensors home page: Enter no longer accidentally toggles GPS on/off while viewing sensor readings</li>\n<li>Upgrade from v1.11 with trail settings in flash: <code>trail_units_idx</code> was silently read from the old sentinel byte (giving \"min/mi\" instead of km/h default) — schema bumped to <code>0xC0DE0004</code>, corrupted value reset to 0 on mismatch</li>\n<li>Lemon font now correctly decodes multi-byte UTF-8 on the e-ink display (Cyrillic, Greek, Polish accents, etc.); previously rendered as garbage glyphs</li>\n<li>Keyboard preview translates UTF-8 through the active font path, so non-ASCII input shows correctly while typing</li>\n<li>Reply path: the <code>@[nick]</code> prefix is now preserved verbatim — a nickname containing <code>{loc}</code> / <code>{time}</code> is no longer substituted as a placeholder</li>\n<li>Home page order: validity flag prevents a junk byte in flash from being interpreted as a \"custom order\" state</li>\n<li>E-ink: unknown-character fallback rectangle now aligns to the top of the text cell instead of sitting one pixel below the line</li>\n<li>E-ink: Lemon glyphs at text size 2/3 (splash version, clock) no longer render at size 1 scale</li>\n</ul>\n"
    },
    {
      "version": "v1.12",
      "name": "Wio Tracker L1 Firmware v1.12",
      "datetime": "2026-05-24T18:55:09Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/v1.12",
      "prerelease": false,
      "notes": "## Wio Tracker L1 — Plus Firmware v1.12\r\n\r\nBased on MeshCore upstream v1.15.\r\n\r\n### Highlights\r\n\r\n- **Unicode messages on both displays** — Cyrillic, Greek, Polish, Czech, Baltic and other Latin Extended scripts now render correctly in messages, keyboard preview and reply prefix on both OLED and e-ink when the Lemon font is enabled\r\n- **E-ink full-refresh interval** — Settings › Display › Full rfsh lets you pick how many partial refreshes happen before a cleansing full refresh (off / 5 / 10 / 20 / 30); reduces visible ghosting on long sessions *(e-ink only)*\r\n- **Faster long-message rendering** — fullscreen message view now wraps text in O(n) instead of O(n²); noticeably snappier on long messages, especially with the Lemon font on e-ink\r\n\r\n### Changes\r\n\r\n**New features**\r\n- E-ink: `Full rfsh` setting in Settings › Display — controls how many partial refreshes occur before a cleansing full panel refresh\r\n- Schema versioning of saved preferences — `/new_prefs` now carries a tail sentinel so older saves are detected and treated safely on load; file self-heals on next save\r\n\r\n**Fixes**\r\n- Lemon font now correctly decodes multi-byte UTF-8 on the e-ink display (Cyrillic, Greek, Polish accents, etc.); previously rendered as garbage glyphs\r\n- Keyboard preview translates UTF-8 through the active font path, so non-ASCII input shows correctly while typing\r\n- Reply path: the `@[nick]` prefix is now preserved verbatim — a nickname containing `{loc}` / `{time}` is no longer substituted as a placeholder\r\n- Home page order: validity flag prevents a junk byte in flash from being interpreted as a \"custom order\" state\r\n- E-ink: unknown-character fallback rectangle now aligns to the top of the text cell instead of sitting one pixel below the line\r\n- E-ink: Lemon glyphs at text size 2/3 (splash version, clock) no longer render at size 1 scale\r\n\r\n### Upgrade notes\r\n\r\n- Settings and message history are preserved across upgrades from v1.11\r\n- First boot after upgrade may log `prefs schema sentinel mismatch` over serial — expected, file is rewritten with the new sentinel on the next setting change",
      "notesHtml": "<h2>Wio Tracker L1 — Plus Firmware v1.12</h2>\n<p>Based on MeshCore upstream v1.15.</p>\n<h3>Highlights</h3>\n<ul>\n<li><strong>Unicode messages on both displays</strong> — Cyrillic, Greek, Polish, Czech, Baltic and other Latin Extended scripts now render correctly in messages, keyboard preview and reply prefix on both OLED and e-ink when the Lemon font is enabled</li>\n<li><strong>E-ink full-refresh interval</strong> — Settings › Display › Full rfsh lets you pick how many partial refreshes happen before a cleansing full refresh (off / 5 / 10 / 20 / 30); reduces visible ghosting on long sessions <em>(e-ink only)</em></li>\n<li><strong>Faster long-message rendering</strong> — fullscreen message view now wraps text in O(n) instead of O(n²); noticeably snappier on long messages, especially with the Lemon font on e-ink</li>\n</ul>\n<h3>Changes</h3>\n<p><strong>New features</strong></p>\n<ul>\n<li>E-ink: <code>Full rfsh</code> setting in Settings › Display — controls how many partial refreshes occur before a cleansing full panel refresh</li>\n<li>Schema versioning of saved preferences — <code>/new_prefs</code> now carries a tail sentinel so older saves are detected and treated safely on load; file self-heals on next save</li>\n</ul>\n<p><strong>Fixes</strong></p>\n<ul>\n<li>Lemon font now correctly decodes multi-byte UTF-8 on the e-ink display (Cyrillic, Greek, Polish accents, etc.); previously rendered as garbage glyphs</li>\n<li>Keyboard preview translates UTF-8 through the active font path, so non-ASCII input shows correctly while typing</li>\n<li>Reply path: the <code>@[nick]</code> prefix is now preserved verbatim — a nickname containing <code>{loc}</code> / <code>{time}</code> is no longer substituted as a placeholder</li>\n<li>Home page order: validity flag prevents a junk byte in flash from being interpreted as a \"custom order\" state</li>\n<li>E-ink: unknown-character fallback rectangle now aligns to the top of the text cell instead of sitting one pixel below the line</li>\n<li>E-ink: Lemon glyphs at text size 2/3 (splash version, clock) no longer render at size 1 scale</li>\n</ul>\n<h3>Upgrade notes</h3>\n<ul>\n<li>Settings and message history are preserved across upgrades from v1.11</li>\n<li>First boot after upgrade may log <code>prefs schema sentinel mismatch</code> over serial — expected, file is rewritten with the new sentinel on the next setting change</li>\n</ul>\n"
    },
    {
      "version": "v1.11",
      "name": "Wio Tracker L1 Firmware v1.11",
      "datetime": "2026-05-23T22:53:09Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/v1.11",
      "prerelease": false,
      "notes": "## Wio Tracker L1 — Plus Firmware v1.11\r\n\r\nBased on MeshCore upstream v1.15.\r\n\r\n### Highlights\r\n\r\n- **Joystick rotation** — joystick input mapping can now be rotated independently of the display, useful in custom enclosures *(e-ink only)*\r\n- **Home screen page ordering** — all home pages including Clock can now be reordered and toggled in Settings › Home Pages; position indicators are shown immediately on first render\r\n- **Unified firmware branch** — OLED and e-ink builds are now maintained in a single branch; firmware files renamed to `WioTrackerL1_companion_dual` and `WioTrackerL1Eink_companion_dual`\r\n\r\n### Changes\r\n\r\n**New features**\r\n- E-ink: runtime joystick rotation setting in Settings › Display — rotates directional input 0° / 90° / 180° / 270° independently of display rotation\r\n- Settings › Home Pages: LEFT/RIGHT reorders any page in the navigation sequence; ENTER toggles pages ON/OFF (Settings and Messages are always visible and cannot be disabled)\r\n\r\n**Fixes**\r\n- Home Pages: several visibility and ordering bugs fixed\r\n- Display: unknown-character block rendering unified across OLED and e-ink builds\r\n\r\n**Build / CI**\r\n- Firmware environments renamed: `WioTrackerL1_companion_radio_dual_settings` → `WioTrackerL1_companion_dual`, `WioTrackerL1Eink_companion_radio_dual` → `WioTrackerL1Eink_companion_dual`\r\n- Workflow now triggers on `plus_*` tags and correctly injects firmware version into both build jobs",
      "notesHtml": "<h2>Wio Tracker L1 — Plus Firmware v1.11</h2>\n<p>Based on MeshCore upstream v1.15.</p>\n<h3>Highlights</h3>\n<ul>\n<li><strong>Joystick rotation</strong> — joystick input mapping can now be rotated independently of the display, useful in custom enclosures <em>(e-ink only)</em></li>\n<li><strong>Home screen page ordering</strong> — all home pages including Clock can now be reordered and toggled in Settings › Home Pages; position indicators are shown immediately on first render</li>\n<li><strong>Unified firmware branch</strong> — OLED and e-ink builds are now maintained in a single branch; firmware files renamed to <code>WioTrackerL1_companion_dual</code> and <code>WioTrackerL1Eink_companion_dual</code></li>\n</ul>\n<h3>Changes</h3>\n<p><strong>New features</strong></p>\n<ul>\n<li>E-ink: runtime joystick rotation setting in Settings › Display — rotates directional input 0° / 90° / 180° / 270° independently of display rotation</li>\n<li>Settings › Home Pages: LEFT/RIGHT reorders any page in the navigation sequence; ENTER toggles pages ON/OFF (Settings and Messages are always visible and cannot be disabled)</li>\n</ul>\n<p><strong>Fixes</strong></p>\n<ul>\n<li>Home Pages: several visibility and ordering bugs fixed</li>\n<li>Display: unknown-character block rendering unified across OLED and e-ink builds</li>\n</ul>\n<p><strong>Build / CI</strong></p>\n<ul>\n<li>Firmware environments renamed: <code>WioTrackerL1_companion_radio_dual_settings</code> → <code>WioTrackerL1_companion_dual</code>, <code>WioTrackerL1Eink_companion_radio_dual</code> → <code>WioTrackerL1Eink_companion_dual</code></li>\n<li>Workflow now triggers on <code>plus_*</code> tags and correctly injects firmware version into both build jobs</li>\n</ul>\n"
    },
    {
      "version": "wio-tracker-v1.15-plus.1.10",
      "name": "Wio Tracker L1 Firmware v1.15-plus.1.10",
      "datetime": "2026-05-22T22:07:08Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/wio-tracker-v1.15-plus.1.10",
      "prerelease": false,
      "notes": "## Wio Tracker L1 — Plus Firmware v1.15-plus.1.10\r\n\r\nBased on MeshCore upstream v1.15.\r\n\r\n### Highlights\r\n\r\n- **E-ink display support** — the Wio Tracker L1 now has a dedicated e-ink firmware variant; all screens have been adapted for the 250 × 122 / 122 × 250 panel with full portrait and landscape support\r\n- **Home screen page ordering** — all home pages can now be reordered directly in Settings; Settings and Messages are always present and cannot be disabled\r\n- **Runtime font switcher** — choose between the default Adafruit font and the Lemon Unicode font in Settings › Display\r\n- **Single dual-serial firmware** — one build supports both BLE and USB serial; separate BLE/USB variants are retired\r\n- **Unified firmware** — the previously separate font-switcher build has been merged into the main firmware; there is now a single OLED build and a single e-ink build\r\n\r\n### Changes\r\n\r\n**New features**\r\n- E-ink firmware: new build target `WioTrackerL1Eink_companion_radio_dual` for Wio Tracker L1 with e-ink display\r\n- E-ink: all home screen pages (Clock, Recent, Radio, Bluetooth, Advert, Tools, Settings, Messages, Shutdown) adapted for the e-ink panel\r\n- E-ink: adaptive layout engine — all screens reflow correctly in both portrait (122 × 250) and landscape (250 × 122) orientations\r\n- E-ink: runtime display rotation setting in Settings › Display — applied immediately and persisted across reboots\r\n- E-ink: clock seconds suppressed by default to reduce panel refresh wear\r\n- E-ink: Lemon font support with pixel-accurate glyph scaling\r\n- Settings › Home Pages: LEFT/RIGHT reorders any page in the navigation sequence; ENTER toggles pages ON/OFF (except Settings and Messages, which are always visible)\r\n- Settings › Display: runtime font selection — Default (Adafruit) or Lemon (Unicode, pixel-accurate wrap)\r\n- Settings › Display: 12 h / 24 h clock format toggle (default 24 h)\r\n\r\n**Fixes**\r\n- MeshCore logo on splash screen is centre-cropped rather than overflowing in portrait mode\r\n- Lemon font glyphs now scale correctly with `setTextSize` on the lock screen clock\r\n- `use_lemon_font` preference is now persisted to flash and survives reboots\r\n- Strip `@[nick]` reply prefix from channel and DM history card previews\r\n\r\n**Build / CI**\r\n- Font-switcher firmware variant merged into the main OLED build — no separate download needed",
      "notesHtml": "<h2>Wio Tracker L1 — Plus Firmware v1.15-plus.1.10</h2>\n<p>Based on MeshCore upstream v1.15.</p>\n<h3>Highlights</h3>\n<ul>\n<li><strong>E-ink display support</strong> — the Wio Tracker L1 now has a dedicated e-ink firmware variant; all screens have been adapted for the 250 × 122 / 122 × 250 panel with full portrait and landscape support</li>\n<li><strong>Home screen page ordering</strong> — all home pages can now be reordered directly in Settings; Settings and Messages are always present and cannot be disabled</li>\n<li><strong>Runtime font switcher</strong> — choose between the default Adafruit font and the Lemon Unicode font in Settings › Display</li>\n<li><strong>Single dual-serial firmware</strong> — one build supports both BLE and USB serial; separate BLE/USB variants are retired</li>\n<li><strong>Unified firmware</strong> — the previously separate font-switcher build has been merged into the main firmware; there is now a single OLED build and a single e-ink build</li>\n</ul>\n<h3>Changes</h3>\n<p><strong>New features</strong></p>\n<ul>\n<li>E-ink firmware: new build target <code>WioTrackerL1Eink_companion_radio_dual</code> for Wio Tracker L1 with e-ink display</li>\n<li>E-ink: all home screen pages (Clock, Recent, Radio, Bluetooth, Advert, Tools, Settings, Messages, Shutdown) adapted for the e-ink panel</li>\n<li>E-ink: adaptive layout engine — all screens reflow correctly in both portrait (122 × 250) and landscape (250 × 122) orientations</li>\n<li>E-ink: runtime display rotation setting in Settings › Display — applied immediately and persisted across reboots</li>\n<li>E-ink: clock seconds suppressed by default to reduce panel refresh wear</li>\n<li>E-ink: Lemon font support with pixel-accurate glyph scaling</li>\n<li>Settings › Home Pages: LEFT/RIGHT reorders any page in the navigation sequence; ENTER toggles pages ON/OFF (except Settings and Messages, which are always visible)</li>\n<li>Settings › Display: runtime font selection — Default (Adafruit) or Lemon (Unicode, pixel-accurate wrap)</li>\n<li>Settings › Display: 12 h / 24 h clock format toggle (default 24 h)</li>\n</ul>\n<p><strong>Fixes</strong></p>\n<ul>\n<li>MeshCore logo on splash screen is centre-cropped rather than overflowing in portrait mode</li>\n<li>Lemon font glyphs now scale correctly with <code>setTextSize</code> on the lock screen clock</li>\n<li><code>use_lemon_font</code> preference is now persisted to flash and survives reboots</li>\n<li>Strip <code>@[nick]</code> reply prefix from channel and DM history card previews</li>\n</ul>\n<p><strong>Build / CI</strong></p>\n<ul>\n<li>Font-switcher firmware variant merged into the main OLED build — no separate download needed</li>\n</ul>\n"
    },
    {
      "version": "wio-tracker-v1.15-plus.1.9",
      "name": "Wio Tracker L1 Firmware v1.15-plus.1.9",
      "datetime": "2026-05-21T07:37:51Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/wio-tracker-v1.15-plus.1.9",
      "prerelease": false,
      "notes": "## Wio Tracker L1 — Plus Firmware v1.15-plus.1.9\r\n\r\nBased on MeshCore upstream v1.15.\r\n\r\n### Highlights\r\n\r\n- **Active node discovery** — the Nearby screen now sends a live discovery ping and displays responding nodes (repeaters, sensors, rooms) with RSSI, SNR and remote SNR. Tap Enter on a node for a full-screen detail view including the public key.\r\n\r\n### Changes\r\n\r\n**New features**\r\n- Nearby screen: active node discovery via `NODE_DISCOVER_REQ` replaces the old passive advert scan; nodes respond with name, type, RSSI and SNR data\r\n- Nearby screen: each discovered node is shown as a 2-line boxed card with RSSI, SNR and remote SNR\r\n- Nearby screen: navigate discovered nodes with UP/DOWN; press Enter to open a full-screen detail view showing name, public key (base64), RSSI, SNR, remote SNR and known/new status",
      "notesHtml": "<h2>Wio Tracker L1 — Plus Firmware v1.15-plus.1.9</h2>\n<p>Based on MeshCore upstream v1.15.</p>\n<h3>Highlights</h3>\n<ul>\n<li><strong>Active node discovery</strong> — the Nearby screen now sends a live discovery ping and displays responding nodes (repeaters, sensors, rooms) with RSSI, SNR and remote SNR. Tap Enter on a node for a full-screen detail view including the public key.</li>\n</ul>\n<h3>Changes</h3>\n<p><strong>New features</strong></p>\n<ul>\n<li>Nearby screen: active node discovery via <code>NODE_DISCOVER_REQ</code> replaces the old passive advert scan; nodes respond with name, type, RSSI and SNR data</li>\n<li>Nearby screen: each discovered node is shown as a 2-line boxed card with RSSI, SNR and remote SNR</li>\n<li>Nearby screen: navigate discovered nodes with UP/DOWN; press Enter to open a full-screen detail view showing name, public key (base64), RSSI, SNR, remote SNR and known/new status</li>\n</ul>\n"
    },
    {
      "version": "wio-tracker-v1.15-plus.1.8",
      "name": "Wio Tracker L1 Firmware v1.15-plus.1.8",
      "datetime": "2026-05-20T08:40:09Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/wio-tracker-v1.15-plus.1.8",
      "prerelease": false,
      "notes": "## Wio Tracker L1 — Plus Firmware v1.15-plus.1.8\r\n\r\nBased on MeshCore upstream v1.15.\r\n\r\n### Highlights\r\n\r\n- **Message age in history** — channel and DM history lists now show how old each message is (\"3m\", \"2h\", \">1d\") next to the sender name.\r\n- **Runtime font switcher** — the `font-switcher` build now lets you toggle between the default font and the Lemon font directly in Settings › Display, without flashing a separate firmware. Lemon covers PL, DE, CZ/SK, FR, NO, HU, HR, TR, LT, RU, GR character sets.\r\n\r\n### Changes\r\n\r\n**New features**\r\n- Message age indicator in DM and channel history lists: messages show a compact age string (\"3s\", \"5m\", \"2h\", \">1d\") derived from the RTC timestamp\r\n- Font switcher: `font-switcher` firmware build includes both the default Adafruit font and the Lemon bitmap font; toggle in Settings › Display › Font (saved to flash, takes effect immediately)\r\n\r\n**Bug fixes**\r\n- Missing space after \"Type:\" and \"Seen:\" labels in NearbyScreen detail view\r\n\r\n**Internal**\r\n- CI: `lemon-font` firmware build replaced by `font-switcher` build (from the `font-switcher` branch)",
      "notesHtml": "<h2>Wio Tracker L1 — Plus Firmware v1.15-plus.1.8</h2>\n<p>Based on MeshCore upstream v1.15.</p>\n<h3>Highlights</h3>\n<ul>\n<li><strong>Message age in history</strong> — channel and DM history lists now show how old each message is (\"3m\", \"2h\", \"&gt;1d\") next to the sender name.</li>\n<li><strong>Runtime font switcher</strong> — the <code>font-switcher</code> build now lets you toggle between the default font and the Lemon font directly in Settings › Display, without flashing a separate firmware. Lemon covers PL, DE, CZ/SK, FR, NO, HU, HR, TR, LT, RU, GR character sets.</li>\n</ul>\n<h3>Changes</h3>\n<p><strong>New features</strong></p>\n<ul>\n<li>Message age indicator in DM and channel history lists: messages show a compact age string (\"3s\", \"5m\", \"2h\", \"&gt;1d\") derived from the RTC timestamp</li>\n<li>Font switcher: <code>font-switcher</code> firmware build includes both the default Adafruit font and the Lemon bitmap font; toggle in Settings › Display › Font (saved to flash, takes effect immediately)</li>\n</ul>\n<p><strong>Bug fixes</strong></p>\n<ul>\n<li>Missing space after \"Type:\" and \"Seen:\" labels in NearbyScreen detail view</li>\n</ul>\n<p><strong>Internal</strong></p>\n<ul>\n<li>CI: <code>lemon-font</code> firmware build replaced by <code>font-switcher</code> build (from the <code>font-switcher</code> branch)</li>\n</ul>\n"
    },
    {
      "version": "wio-tracker-v1.15-plus.1.7",
      "name": "Wio Tracker L1 Firmware v1.15-plus.1.7",
      "datetime": "2026-05-19T14:00:44Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/wio-tracker-v1.15-plus.1.7",
      "prerelease": false,
      "notes": "## Wio Tracker L1 — Plus Firmware v1.15-plus.1.7\r\n\r\nBased on MeshCore upstream v1.15.\r\n\r\n### Highlights\r\n\r\n- **Reply to messages** — long-press Enter on any message in DM or channel history to reply. A \"Reply\" popup appears; confirming pre-fills the keyboard or quick message with `@[nick]` so the recipient is clearly addressed.\r\n- **Reply context in fullscreen view** — when opening a reply message fullscreen, a \"To: nick\" bar is shown under the sender name and the message body is displayed without the address prefix.\r\n- **New font build** - firmware with `lemon-font` name supports extended alphabet range: PL, DE, C/S, FR, NO, HU, HR, TR, LT, RU, GR\r\n\r\n### Changes\r\n\r\n**New features**\r\n- Reply action: long-press Enter on a selected message in DM or channel history to open the Reply popup; works from both the list view and the fullscreen view\r\n- Replying opens the standard message picker — compose via keyboard (pre-filled with `@[nick]`) or choose a quick message (prefix is prepended automatically)\r\n- Fullscreen message view: reply messages show a \"To: nick\" header below the sender; non-ASCII characters in nicks are correctly transliterated for the OLED font\r\n- In Tools menu Char Test lets  you preview all supported letters.\r\n\r\n**Bug fixes**\r\n- AutoLock setting was not persisted across reboots\r\n- Channel bot was responding even when the bot was disabled via `bot_enabled` flag\r\n- Quick-message template expansion buffer was 80 bytes — increased to 140 to match the maximum message length\r\n- Scroll arrows in fullscreen view no longer overlap the last character of wrapped text lines\r\n\r\n**Performance**\r\n- Lock screen sensor dashboard fields now share a single `querySensors()` I2C call per render",
      "notesHtml": "<h2>Wio Tracker L1 — Plus Firmware v1.15-plus.1.7</h2>\n<p>Based on MeshCore upstream v1.15.</p>\n<h3>Highlights</h3>\n<ul>\n<li><strong>Reply to messages</strong> — long-press Enter on any message in DM or channel history to reply. A \"Reply\" popup appears; confirming pre-fills the keyboard or quick message with <code>@[nick]</code> so the recipient is clearly addressed.</li>\n<li><strong>Reply context in fullscreen view</strong> — when opening a reply message fullscreen, a \"To: nick\" bar is shown under the sender name and the message body is displayed without the address prefix.</li>\n<li><strong>New font build</strong> - firmware with <code>lemon-font</code> name supports extended alphabet range: PL, DE, C/S, FR, NO, HU, HR, TR, LT, RU, GR</li>\n</ul>\n<h3>Changes</h3>\n<p><strong>New features</strong></p>\n<ul>\n<li>Reply action: long-press Enter on a selected message in DM or channel history to open the Reply popup; works from both the list view and the fullscreen view</li>\n<li>Replying opens the standard message picker — compose via keyboard (pre-filled with <code>@[nick]</code>) or choose a quick message (prefix is prepended automatically)</li>\n<li>Fullscreen message view: reply messages show a \"To: nick\" header below the sender; non-ASCII characters in nicks are correctly transliterated for the OLED font</li>\n<li>In Tools menu Char Test lets  you preview all supported letters.</li>\n</ul>\n<p><strong>Bug fixes</strong></p>\n<ul>\n<li>AutoLock setting was not persisted across reboots</li>\n<li>Channel bot was responding even when the bot was disabled via <code>bot_enabled</code> flag</li>\n<li>Quick-message template expansion buffer was 80 bytes — increased to 140 to match the maximum message length</li>\n<li>Scroll arrows in fullscreen view no longer overlap the last character of wrapped text lines</li>\n</ul>\n<p><strong>Performance</strong></p>\n<ul>\n<li>Lock screen sensor dashboard fields now share a single <code>querySensors()</code> I2C call per render</li>\n</ul>\n"
    },
    {
      "version": "wio-tracker-v1.15-plus.1.6",
      "name": "Wio Tracker L1 Firmware v1.15-plus.1.6",
      "datetime": "2026-05-17T16:44:12Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/wio-tracker-v1.15-plus.1.6",
      "prerelease": false,
      "notes": "## Wio Tracker L1 — Plus Firmware v1.15-plus.1.6\r\n\r\nBased on MeshCore upstream v1.15.\r\n\r\n### Highlights\r\n\r\n- **Screen lock** — hold Back + 3× Enter to lock/unlock the device. Locked screen ignores incoming messages, shows clock on button press, and can auto-lock when the display turns off.\r\n- **Extended diacritic support** — UTF-8 transliteration now covers Czech, Slovak, Scandinavian, Hungarian, Romanian, Croatian, Turkish, Baltic, and Icelandic characters in addition to existing Polish/Latin coverage.\r\n\r\n### Changes\r\n\r\n**New features**\r\n- Screen lock: hold Back and press Enter 3 times to lock/unlock; hint popup guides the user through the sequence\r\n- Lock screen displays clock, date, and two configurable sensor values (reuses Dashboard Config fields)\r\n- Settings: new AutoLock toggle — automatically locks when display turns off\r\n- Auto-advert: added 30-second minimum interval option\r\n\r\n**Performance**\r\n- Lock screen: sensor fields now share a single `querySensors()` I2C call per render instead of one call per field\r\n\r\n**Transliteration additions**\r\n- Czech/Slovak: č š ž ř ě ů ď ť ň ľ ĺ ŕ\r\n- Scandinavian: å ø æ\r\n- Hungarian: ő ű\r\n- Romanian: ă ș ț (plus legacy cedilla variant ţ)\r\n- Croatian: đ\r\n- Turkish: ğ ş ı\r\n- Baltic (Lithuanian/Latvian): ā ē ī ū ģ ķ ļ ņ ŗ ų ė į\r\n- Icelandic: ð þ",
      "notesHtml": "<h2>Wio Tracker L1 — Plus Firmware v1.15-plus.1.6</h2>\n<p>Based on MeshCore upstream v1.15.</p>\n<h3>Highlights</h3>\n<ul>\n<li><strong>Screen lock</strong> — hold Back + 3× Enter to lock/unlock the device. Locked screen ignores incoming messages, shows clock on button press, and can auto-lock when the display turns off.</li>\n<li><strong>Extended diacritic support</strong> — UTF-8 transliteration now covers Czech, Slovak, Scandinavian, Hungarian, Romanian, Croatian, Turkish, Baltic, and Icelandic characters in addition to existing Polish/Latin coverage.</li>\n</ul>\n<h3>Changes</h3>\n<p><strong>New features</strong></p>\n<ul>\n<li>Screen lock: hold Back and press Enter 3 times to lock/unlock; hint popup guides the user through the sequence</li>\n<li>Lock screen displays clock, date, and two configurable sensor values (reuses Dashboard Config fields)</li>\n<li>Settings: new AutoLock toggle — automatically locks when display turns off</li>\n<li>Auto-advert: added 30-second minimum interval option</li>\n</ul>\n<p><strong>Performance</strong></p>\n<ul>\n<li>Lock screen: sensor fields now share a single <code>querySensors()</code> I2C call per render instead of one call per field</li>\n</ul>\n<p><strong>Transliteration additions</strong></p>\n<ul>\n<li>Czech/Slovak: č š ž ř ě ů ď ť ň ľ ĺ ŕ</li>\n<li>Scandinavian: å ø æ</li>\n<li>Hungarian: ő ű</li>\n<li>Romanian: ă ș ț (plus legacy cedilla variant ţ)</li>\n<li>Croatian: đ</li>\n<li>Turkish: ğ ş ı</li>\n<li>Baltic (Lithuanian/Latvian): ā ē ī ū ģ ķ ļ ņ ŗ ų ė į</li>\n<li>Icelandic: ð þ</li>\n</ul>\n"
    },
    {
      "version": "wio-tracker-v1.15-plus.1.5",
      "name": "Wio Tracker L1 Firmware v1.15-plus.1.5",
      "datetime": "2026-05-16T22:21:11Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/wio-tracker-v1.15-plus.1.5",
      "prerelease": false,
      "notes": "## Wio Tracker L1 — Plus Firmware v1.15-plus.1.5\r\n\r\nBased on MeshCore upstream v1.15.\r\n\r\n### Highlights\r\n\r\n- **Polish and Latin diacritic support** — characters like ą, ć, ę, ł, ń, ó, ś, ź, ż (and French, German, Spanish equivalents) are now transliterated to their base ASCII letters instead of rendering as garbage on the display.\r\n- **Bug fixes** — several correctness issues from v1.4 addressed.\r\n\r\n### Changes\r\n\r\n**New features**\r\n- Bot: separate 10-second cooldown for DM replies and channel replies independently\r\n- UTF-8 transliteration in all text display paths (message list, fullscreen view, contact names, channel names)\r\n\r\n**Bug fixes**\r\n- Bot no longer triggers on the sender's nickname — trigger is matched against the message body only\r\n- \"Low Battery / Shutting Down\" text was rendered at size 2, overflowing the screen — fixed to size 1\r\n- Display brightness setting was not applied during the boot loading screen\r\n- Fullscreen message view: scroll arrows `^`/`v` no longer overlap the last characters of wrapped lines\r\n- `FS_LINE_H` corrected from 9 to 8 px to match the Adafruit font cell height (was cutting off the last line)\r\n- `with_sender` buffer in bot channel reply enlarged from 160 to 240 bytes to prevent overflow\r\n\r\n**Performance**\r\n- Static screens (Settings, Nearby, Tools, Bot, etc.) reduced render polling from 300 ms to 2000 ms, lowering unnecessary SPI and CPU activity during idle",
      "notesHtml": "<h2>Wio Tracker L1 — Plus Firmware v1.15-plus.1.5</h2>\n<p>Based on MeshCore upstream v1.15.</p>\n<h3>Highlights</h3>\n<ul>\n<li><strong>Polish and Latin diacritic support</strong> — characters like ą, ć, ę, ł, ń, ó, ś, ź, ż (and French, German, Spanish equivalents) are now transliterated to their base ASCII letters instead of rendering as garbage on the display.</li>\n<li><strong>Bug fixes</strong> — several correctness issues from v1.4 addressed.</li>\n</ul>\n<h3>Changes</h3>\n<p><strong>New features</strong></p>\n<ul>\n<li>Bot: separate 10-second cooldown for DM replies and channel replies independently</li>\n<li>UTF-8 transliteration in all text display paths (message list, fullscreen view, contact names, channel names)</li>\n</ul>\n<p><strong>Bug fixes</strong></p>\n<ul>\n<li>Bot no longer triggers on the sender's nickname — trigger is matched against the message body only</li>\n<li>\"Low Battery / Shutting Down\" text was rendered at size 2, overflowing the screen — fixed to size 1</li>\n<li>Display brightness setting was not applied during the boot loading screen</li>\n<li>Fullscreen message view: scroll arrows <code>^</code>/<code>v</code> no longer overlap the last characters of wrapped lines</li>\n<li><code>FS_LINE_H</code> corrected from 9 to 8 px to match the Adafruit font cell height (was cutting off the last line)</li>\n<li><code>with_sender</code> buffer in bot channel reply enlarged from 160 to 240 bytes to prevent overflow</li>\n</ul>\n<p><strong>Performance</strong></p>\n<ul>\n<li>Static screens (Settings, Nearby, Tools, Bot, etc.) reduced render polling from 300 ms to 2000 ms, lowering unnecessary SPI and CPU activity during idle</li>\n</ul>\n"
    },
    {
      "version": "wio-tracker-v1.15-plus.1.4",
      "name": "Wio Tracker L1 Firmware v1.15-plus.1.4",
      "datetime": "2026-05-15T22:40:38Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/wio-tracker-v1.15-plus.1.4",
      "prerelease": false,
      "notes": "## Wio Tracker L1 — Plus Firmware v1.15-plus.1.4\r\n\r\nBased on MeshCore upstream v1.15.\r\n\r\n### Highlights\r\n\r\n- **Dual ringtone slots** — compose and store two independent melodies on the device, assign them as notification sounds per message type or override individually per channel and per contact.\r\n- **Working buzzer volume** — volume control now works correctly on nRF52; a preview tone plays on each change so you hear the result immediately.\r\n- **Visual consistency** — buzzer volume bar now matches the display brightness bar in appearance.\r\n\r\n### Changes\r\n\r\n**New features**\r\n- Ringtone Editor: second melody slot (M2), switchable from within the editor\r\n- Settings: DM Melody and Channel Melody — choose built-in, M1, or M2 as notification sound\r\n- Per-channel melody override in channel context menu (long press) — global / M1 / M2\r\n- Per-contact melody override in DM context menu — global / M1 / M2\r\n- Settings: buzzer volume control (1–5) with live preview tone on each change\r\n- Quick reply templates renamed from M1–M10 to Q1–Q10 to avoid confusion with melody slot identifiers\r\n\r\n**Upstream**\r\n- `fix(mesh)`: widen TRACE offset to `uint16` to avoid narrowing conversion",
      "notesHtml": "<h2>Wio Tracker L1 — Plus Firmware v1.15-plus.1.4</h2>\n<p>Based on MeshCore upstream v1.15.</p>\n<h3>Highlights</h3>\n<ul>\n<li><strong>Dual ringtone slots</strong> — compose and store two independent melodies on the device, assign them as notification sounds per message type or override individually per channel and per contact.</li>\n<li><strong>Working buzzer volume</strong> — volume control now works correctly on nRF52; a preview tone plays on each change so you hear the result immediately.</li>\n<li><strong>Visual consistency</strong> — buzzer volume bar now matches the display brightness bar in appearance.</li>\n</ul>\n<h3>Changes</h3>\n<p><strong>New features</strong></p>\n<ul>\n<li>Ringtone Editor: second melody slot (M2), switchable from within the editor</li>\n<li>Settings: DM Melody and Channel Melody — choose built-in, M1, or M2 as notification sound</li>\n<li>Per-channel melody override in channel context menu (long press) — global / M1 / M2</li>\n<li>Per-contact melody override in DM context menu — global / M1 / M2</li>\n<li>Settings: buzzer volume control (1–5) with live preview tone on each change</li>\n<li>Quick reply templates renamed from M1–M10 to Q1–Q10 to avoid confusion with melody slot identifiers</li>\n</ul>\n<p><strong>Upstream</strong></p>\n<ul>\n<li><code>fix(mesh)</code>: widen TRACE offset to <code>uint16</code> to avoid narrowing conversion</li>\n</ul>\n"
    },
    {
      "version": "wio-tracker-v1.15-plus.1.3",
      "name": "Wio Tracker L1 Firmware plus.1.3",
      "datetime": "2026-05-14T18:39:13Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/wio-tracker-v1.15-plus.1.3",
      "prerelease": false,
      "notes": "## Wio Tracker L1 — Plus Firmware v1.15-plus.1.3\r\n\r\nBased on MeshCore upstream v1.15.\r\n\r\n### Highlights\r\n\r\n- **Auto-Advert** — new tool that periodically broadcasts a 0-hop advert with your GPS position.\r\n- **Nearby Nodes overhaul** — Favourites filter, cardinal bearing display (N/NE/E…), last-heard time in detail view, periodic detail refresh. Paired with auto-advert gives you possibility to easily locate your friends.\r\n- **Status bar polish** — node name is now ellipsized to fit, blinking **A** indicator appears left of the BT indicator when Auto-Advert is running.\r\n- **Clock dashboard** — 3 data fields give you ability to display the data you need\r\n- **Sensor placeholders** — keyboard picker and message placeholders now support all available sensor data.\r\n\r\n### Changes\r\n\r\n**New features**\r\n- Auto-Advert tool in Tools screen — periodic 0-hop advert with GPS coordinates\r\n- NearbyScreen: Favourites as default filter, ALL / Companion / Repeater / Room / Sensor filters\r\n- NearbyScreen: bearing shown as degrees + cardinal direction (e.g. `142d (SE)`)\r\n- NearbyScreen: last-heard time (`Seen: 3m ago`) in contact detail view\r\n- NearbyScreen: detail view auto-refreshes every 10 s; returns to list if contact disappears\r\n- Status bar: blinking **A** indicator \r\n- Status bar: node name ellipsized (`longni...`) when status icons would overlap\r\n- Clock dashboard: new \"Messages\" field (total unread DM + channel + room count)\r\n- DM fullscreen view: navigate between messages with left/right (left = newer, right = older)\r\n\r\n**Fixes**\r\n- When connected to the app, message counter is cleared.\r\n- Status bar icons (BT, mute) aligned to correct vertical position; battery icon height corrected\r\n- Channel message view: removed `#` prefix from channel name in title bar\r\n- Various internal refactors: reusable `PopupMenu`, `FullscreenMsgView`, `KeyboardWidget` modules",
      "notesHtml": "<h2>Wio Tracker L1 — Plus Firmware v1.15-plus.1.3</h2>\n<p>Based on MeshCore upstream v1.15.</p>\n<h3>Highlights</h3>\n<ul>\n<li><strong>Auto-Advert</strong> — new tool that periodically broadcasts a 0-hop advert with your GPS position.</li>\n<li><strong>Nearby Nodes overhaul</strong> — Favourites filter, cardinal bearing display (N/NE/E…), last-heard time in detail view, periodic detail refresh. Paired with auto-advert gives you possibility to easily locate your friends.</li>\n<li><strong>Status bar polish</strong> — node name is now ellipsized to fit, blinking <strong>A</strong> indicator appears left of the BT indicator when Auto-Advert is running.</li>\n<li><strong>Clock dashboard</strong> — 3 data fields give you ability to display the data you need</li>\n<li><strong>Sensor placeholders</strong> — keyboard picker and message placeholders now support all available sensor data.</li>\n</ul>\n<h3>Changes</h3>\n<p><strong>New features</strong></p>\n<ul>\n<li>Auto-Advert tool in Tools screen — periodic 0-hop advert with GPS coordinates</li>\n<li>NearbyScreen: Favourites as default filter, ALL / Companion / Repeater / Room / Sensor filters</li>\n<li>NearbyScreen: bearing shown as degrees + cardinal direction (e.g. <code>142d (SE)</code>)</li>\n<li>NearbyScreen: last-heard time (<code>Seen: 3m ago</code>) in contact detail view</li>\n<li>NearbyScreen: detail view auto-refreshes every 10 s; returns to list if contact disappears</li>\n<li>Status bar: blinking <strong>A</strong> indicator </li>\n<li>Status bar: node name ellipsized (<code>longni...</code>) when status icons would overlap</li>\n<li>Clock dashboard: new \"Messages\" field (total unread DM + channel + room count)</li>\n<li>DM fullscreen view: navigate between messages with left/right (left = newer, right = older)</li>\n</ul>\n<p><strong>Fixes</strong></p>\n<ul>\n<li>When connected to the app, message counter is cleared.</li>\n<li>Status bar icons (BT, mute) aligned to correct vertical position; battery icon height corrected</li>\n<li>Channel message view: removed <code>#</code> prefix from channel name in title bar</li>\n<li>Various internal refactors: reusable <code>PopupMenu</code>, <code>FullscreenMsgView</code>, <code>KeyboardWidget</code> modules</li>\n</ul>\n"
    },
    {
      "version": "wio-tracker-v1.15-plus.1.2",
      "name": "Wio Tracker L1 Firmware plus.1.2",
      "datetime": "2026-05-13T20:57:54Z",
      "url": "https://github.com/MarekZegare4/MeshCore-Solo/releases/tag/wio-tracker-v1.15-plus.1.2",
      "prerelease": false,
      "notes": "## Wio Tracker L1 — Plus Firmware v1.15-plus.1.2\r\n\r\nBased on MeshCore upstream v1.15.\r\n\r\n### Highlights\r\n\r\n- bug fixes and improvements of current features",
      "notesHtml": "<h2>Wio Tracker L1 — Plus Firmware v1.15-plus.1.2</h2>\n<p>Based on MeshCore upstream v1.15.</p>\n<h3>Highlights</h3>\n<ul>\n<li>bug fixes and improvements of current features</li>\n</ul>\n"
    }
  ],
  "changelogSource": "github",
  "changelogUpdatedAt": "2026-06-22T12:12:15.405Z"
}
