{
  "id": "meshcore-cardputer-adv-sosprz",
  "name": "MeshCore Cardputer ADV (sosprz)",
  "type": "fork",
  "maintainer": "sosprz",
  "description": "Binary-distributed MeshCore UI fork for the M5Stack Cardputer ADV, packaged as flashable ESP32-S3 images for its keyboard-and-screen interface.\n",
  "repository": "https://github.com/sosprz/meshcore-cardputer-adv",
  "license_type": "proprietary",
  "status": "active",
  "lifecycle": "active",
  "maturity": "beta",
  "distribution": "personal",
  "lineage": {
    "kind": "fork",
    "upstreamFirmwareId": "meshcore-official"
  },
  "roles": [
    "companion",
    "standalone-ui"
  ],
  "features": [
    "Cardputer ADV keyboard and display UI",
    "Prebuilt ESP32-S3 firmware images"
  ],
  "capabilities": {
    "protocol": {
      "meshcoreCompatible": true
    },
    "transports": {
      "ble": true,
      "usbSerial": true
    },
    "hardware": {
      "display": true
    }
  },
  "devices": [
    {
      "id": "m5stack-cardputer-adv",
      "status": "supported"
    }
  ],
  "verification": {
    "sourceAvailable": false,
    "releasesAvailable": true,
    "hasDocumentation": false,
    "lastChecked": "2026-06-24",
    "notes": [
      "The repository contains release binaries and flashing notes but no firmware source or license."
    ]
  },
  "source": {
    "path": "data/firmwares/meshcore-cardputer-adv-sosprz/firmware.yaml",
    "updatedAt": "2026-06-24T05:45:40+02:00"
  },
  "latest_version": "1.15.81",
  "released": "2026-06-05",
  "releases": [
    {
      "version": "v1.15.81",
      "name": "v1.15.81",
      "datetime": "2026-06-05T09:28:23Z",
      "url": "https://github.com/sosprz/meshcore-cardputer-adv/releases/tag/v1.15.81",
      "prerelease": false,
      "notes": "- **Time settings GPS sync now** - Added `Settings -> Time -> Sync now from GPS` to request a one-off GPS time sync on demand, with progress stages.\r\n- **GPS boot time sync** - Added `Settings -> GPS -> Boot time sync`; when enabled, startup temporarily turns GPS on, waits for GPS time to sync the RTC, shows `GPS time synced`, and silently turns GPS back off if it was only enabled for the boot sync attempt.",
      "notesHtml": "<ul>\n<li><strong>Time settings GPS sync now</strong> - Added <code>Settings -&gt; Time -&gt; Sync now from GPS</code> to request a one-off GPS time sync on demand, with progress stages.</li>\n<li><strong>GPS boot time sync</strong> - Added <code>Settings -&gt; GPS -&gt; Boot time sync</code>; when enabled, startup temporarily turns GPS on, waits for GPS time to sync the RTC, shows <code>GPS time synced</code>, and silently turns GPS back off if it was only enabled for the boot sync attempt.</li>\n</ul>\n"
    },
    {
      "version": "v1.15.76",
      "name": "v1.15.76",
      "datetime": "2026-05-21T19:43:07Z",
      "url": "https://github.com/sosprz/meshcore-cardputer-adv/releases/tag/v1.15.76",
      "prerelease": false,
      "notes": "- **Repeater blank-password login** - Repeater guest login now opens a choice between `Blank password` and `Enter password`; the blank option sends an empty login directly for ACL-only re-login to repeaters that already know the companion device.",
      "notesHtml": "<ul>\n<li><strong>Repeater blank-password login</strong> - Repeater guest login now opens a choice between <code>Blank password</code> and <code>Enter password</code>; the blank option sends an empty login directly for ACL-only re-login to repeaters that already know the companion device.</li>\n</ul>\n"
    },
    {
      "version": "v1.15.75",
      "name": "v1.15.75",
      "datetime": "2026-05-17T18:37:47Z",
      "url": "https://github.com/sosprz/meshcore-cardputer-adv/releases/tag/v1.15.75",
      "prerelease": false,
      "notes": "- **Mainstream sync (v1.15 backend)** - Integrated upstream companion protocol/backend changes for v1.15 without adding new on-device UI screens.\r\n- **Default flood scope compatibility** - Added persisted default flood scope name/key handling and companion protocol commands for get/set default scope, while keeping scope editing out of the local UI.\r\n- **GROUP_DATA binary packets** - Added backend send/receive support for channel binary datagrams (`CMD_SEND_CHANNEL_DATA` / `RESP_CODE_CHANNEL_DATA_RECV`) so companion apps can use the new group-data protocol.\r\n- **Protocol/version update** - Bumped companion protocol metadata to firmware protocol code `11` / `v1.15.0` and aligned radio frequency validation with upstream lower-frequency support.",
      "notesHtml": "<ul>\n<li><strong>Mainstream sync (v1.15 backend)</strong> - Integrated upstream companion protocol/backend changes for v1.15 without adding new on-device UI screens.</li>\n<li><strong>Default flood scope compatibility</strong> - Added persisted default flood scope name/key handling and companion protocol commands for get/set default scope, while keeping scope editing out of the local UI.</li>\n<li><strong>GROUP_DATA binary packets</strong> - Added backend send/receive support for channel binary datagrams (<code>CMD_SEND_CHANNEL_DATA</code> / <code>RESP_CODE_CHANNEL_DATA_RECV</code>) so companion apps can use the new group-data protocol.</li>\n<li><strong>Protocol/version update</strong> - Bumped companion protocol metadata to firmware protocol code <code>11</code> / <code>v1.15.0</code> and aligned radio frequency validation with upstream lower-frequency support.</li>\n</ul>\n"
    },
    {
      "version": "v1.14.1.74",
      "name": "v1.14.1.74",
      "datetime": "2026-04-21T06:04:56Z",
      "url": "https://github.com/sosprz/meshcore-cardputer-adv/releases/tag/v1.14.1.74",
      "prerelease": false,
      "notes": "- **Cardputer ADV: safer LoRa Cap init** - Removed the incorrect `GPIO 46` drive from Cardputer ADV board startup, so firmware no longer treats that pin as LoRa-cap power enable.\r\n- **Cardputer ADV: RF switch supply fix** - Corrected PI4IOE (`0x43`) setup to enable only expander pin `0` for the LoRa cap RF switch supply, while leaving TX/RX switching on `SX1262 DIO2` as configured for this target.",
      "notesHtml": "<ul>\n<li><strong>Cardputer ADV: safer LoRa Cap init</strong> - Removed the incorrect <code>GPIO 46</code> drive from Cardputer ADV board startup, so firmware no longer treats that pin as LoRa-cap power enable.</li>\n<li><strong>Cardputer ADV: RF switch supply fix</strong> - Corrected PI4IOE (<code>0x43</code>) setup to enable only expander pin <code>0</code> for the LoRa cap RF switch supply, while leaving TX/RX switching on <code>SX1262 DIO2</code> as configured for this target.</li>\n</ul>\n"
    },
    {
      "version": "v1.14.0.71",
      "name": "v1.14.0.71",
      "datetime": "2026-03-19T16:42:39Z",
      "url": "https://github.com/sosprz/meshcore-cardputer-adv/releases/tag/v1.14.0.71",
      "prerelease": false,
      "notes": "- **Cardputer ADV: Display themes** - Added `System -> Display -> Theme` with multiple TFT color presets for Cardputer ADV, including `Amber Dark`, `Amber Paper` (amber background + dark text), `Blue/Yellow`, `Green`, `Cyan`, `Paper`, and `Mono`.",
      "notesHtml": "<ul>\n<li><strong>Cardputer ADV: Display themes</strong> - Added <code>System -&gt; Display -&gt; Theme</code> with multiple TFT color presets for Cardputer ADV, including <code>Amber Dark</code>, <code>Amber Paper</code> (amber background + dark text), <code>Blue/Yellow</code>, <code>Green</code>, <code>Cyan</code>, <code>Paper</code>, and <code>Mono</code>.</li>\n</ul>\n"
    },
    {
      "version": "v1.14.0.70",
      "name": "v1.14.0.70",
      "datetime": "2026-03-19T16:07:31Z",
      "url": "https://github.com/sosprz/meshcore-cardputer-adv/releases/tag/v1.14.0.70",
      "prerelease": false,
      "notes": "- **Cardputer ADV: GPS time sync fix** - CP-ADV GPS now passes `rtc_clock` into the GPS provider, so valid GPS time can update the device RTC on this target.\r\n- **Cardputer ADV: GPS startup** - BLE companion build now starts CP-ADV GPS at `115200` baud and sends a minimal ATGM336H init/config sequence on startup (`probe + rate + RMC/GGA enable`).\r\n- **FAQ clarification: APP vs GPS time** - Added docs note explaining that `APP/GPS` in the Time screen is a runtime status hint, not a permanent source selector.",
      "notesHtml": "<ul>\n<li><strong>Cardputer ADV: GPS time sync fix</strong> - CP-ADV GPS now passes <code>rtc_clock</code> into the GPS provider, so valid GPS time can update the device RTC on this target.</li>\n<li><strong>Cardputer ADV: GPS startup</strong> - BLE companion build now starts CP-ADV GPS at <code>115200</code> baud and sends a minimal ATGM336H init/config sequence on startup (<code>probe + rate + RMC/GGA enable</code>).</li>\n<li><strong>FAQ clarification: APP vs GPS time</strong> - Added docs note explaining that <code>APP/GPS</code> in the Time screen is a runtime status hint, not a permanent source selector.</li>\n</ul>\n"
    },
    {
      "version": "v1.14.0.69",
      "name": "v1.14.0.69",
      "datetime": "2026-03-18T11:21:54Z",
      "url": "https://github.com/sosprz/meshcore-cardputer-adv/releases/tag/v1.14.0.69",
      "prerelease": false,
      "notes": "- **Mainstream sync (v1.14.0)** - Merged upstream \r\n- **Screen lock hardening (3x PREV bug fix)** - Triple-click `PREV` no longer cycles `Sound` levels while `Screen lock` is active.\r\n- **Mobile favorites toggle fix** - Favorites can now be added/removed from the mobile app again. External contact updates still keep overwrite protection by default, but explicit app favorite changes are now accepted.\r\n- **Channel unread total consistency fix** - Hidden/removed channels no longer inflate visible unread totals. Home `Channels` unread and the shared unread aggregate now count only currently active visible channels, matching the channel list.\r\n- **ROOM send gate hardening** - Sending to ROOM now requires an active transport session (not only short post-login fallback state), reducing cases where UI showed delivered `*` but the room server did not publish the message.\r\n- **ROOM send/read session alignment** - ROOM send now also accepts recent confirmed ROOM traffic as a valid send-session signal, reducing cases where reading/receiving worked but compose still asked for the password again.\r\n- **ROOM send grace after login** - After a successful ROOM login, compose now gets a short send window immediately, so sending right after auth does not re-prompt for the room password while transport/session flags catch up.\r\n- **Remote Admin (repeaters + rooms)** - Added one shared `Admin` submenu for repeaters and room servers with admin login, remote tools (`Sync time`, `Show time`, `Stats`, `Telemetry`, `Send advert`, `Owner info`, `Neighbours`), saved-password hint, proper scrolling, popup-based progress/results, and clearer neighbour list / empty-state handling.\r\n- **Radio Settings bug fix** - `Power` now changes directly with `LEFT/RIGHT` when highlighted (instead of page up/down taking over)\r\n- **Incoming message auto-jump guard** - New DM/channel traffic and serial sync queue updates no longer kick the UI out of active workflows (password entry, settings, contact actions, etc.). Auto-switch / forced Home return is now limited to passive landing screens only.\r\n- **Contact Actions: Reset path (all contacts)** - Added `Reset path` for every contact type (`contacts`, `repeaters`, `rooms`, `sensors`) to clear cached route and force path relearn.\r\n- **Per-contact saved login passwords** - Login passwords are now stored by contact `pubkey` and mode (`guest/admin/room`) instead of one global value per mode.\r\n- **Room auto-login policy update** - Auto-login now uses only saved per-contact password (no automatic `hello` fallback).\r\n- **ROOM history scope clarified** - Opening ROOM shows local cached history plus new traffic; full server-side backfill is not pulled automatically in this build.\r\n- **Contacts load stability fix** - Boot-time contact load now restores all persisted contacts (auto-add type filter no longer drops saved entries), preventing partial/short lists after reboot/sync.\r\n- **Manual contact add/update hardening** - `Add/Update Contact` path now always applies updates/additions from app/UI (not blocked by auto-add type filter), fixing cases where removed contacts could not be added back.\r\n- **Favorites overwrite protection** - Favorite flag is now preserved during external contact updates, reducing accidental eviction when `Overwrite oldest` is enabled.\r\n- **Companion contacts limit (optimization)** - Wio/Cardputer companion builds use `MAX_CONTACTS=200` by design (memory/stability optimization), instead of `350`.\r\n- **Rooms support (new)** - Added full ROOM flow in `Contacts`/`DM`: `Login / Open room`, auto-login with default `hello` + password fallback, reliable send after login, and sender name visibility in room messages.\r\n- **Quick compose safety: Free text first** - In DM/Channel compose quick menu, `Free text` is now always first, so accidental immediate send of newest preset is less likely.\r\n- **Quick compose clarity: Send labels** - Saved quick presets are now shown as `Send: ...`, making it explicit that selecting that r\n…",
      "notesHtml": "<ul>\n<li><strong>Mainstream sync (v1.14.0)</strong> - Merged upstream </li>\n<li><strong>Screen lock hardening (3x PREV bug fix)</strong> - Triple-click <code>PREV</code> no longer cycles <code>Sound</code> levels while <code>Screen lock</code> is active.</li>\n<li><strong>Mobile favorites toggle fix</strong> - Favorites can now be added/removed from the mobile app again. External contact updates still keep overwrite protection by default, but explicit app favorite changes are now accepted.</li>\n<li><strong>Channel unread total consistency fix</strong> - Hidden/removed channels no longer inflate visible unread totals. Home <code>Channels</code> unread and the shared unread aggregate now count only currently active visible channels, matching the channel list.</li>\n<li><strong>ROOM send gate hardening</strong> - Sending to ROOM now requires an active transport session (not only short post-login fallback state), reducing cases where UI showed delivered <code>*</code> but the room server did not publish the message.</li>\n<li><strong>ROOM send/read session alignment</strong> - ROOM send now also accepts recent confirmed ROOM traffic as a valid send-session signal, reducing cases where reading/receiving worked but compose still asked for the password again.</li>\n<li><strong>ROOM send grace after login</strong> - After a successful ROOM login, compose now gets a short send window immediately, so sending right after auth does not re-prompt for the room password while transport/session flags catch up.</li>\n<li><strong>Remote Admin (repeaters + rooms)</strong> - Added one shared <code>Admin</code> submenu for repeaters and room servers with admin login, remote tools (<code>Sync time</code>, <code>Show time</code>, <code>Stats</code>, <code>Telemetry</code>, <code>Send advert</code>, <code>Owner info</code>, <code>Neighbours</code>), saved-password hint, proper scrolling, popup-based progress/results, and clearer neighbour list / empty-state handling.</li>\n<li><strong>Radio Settings bug fix</strong> - <code>Power</code> now changes directly with <code>LEFT/RIGHT</code> when highlighted (instead of page up/down taking over)</li>\n<li><strong>Incoming message auto-jump guard</strong> - New DM/channel traffic and serial sync queue updates no longer kick the UI out of active workflows (password entry, settings, contact actions, etc.). Auto-switch / forced Home return is now limited to passive landing screens only.</li>\n<li><strong>Contact Actions: Reset path (all contacts)</strong> - Added <code>Reset path</code> for every contact type (<code>contacts</code>, <code>repeaters</code>, <code>rooms</code>, <code>sensors</code>) to clear cached route and force path relearn.</li>\n<li><strong>Per-contact saved login passwords</strong> - Login passwords are now stored by contact <code>pubkey</code> and mode (<code>guest/admin/room</code>) instead of one global value per mode.</li>\n<li><strong>Room auto-login policy update</strong> - Auto-login now uses only saved per-contact password (no automatic <code>hello</code> fallback).</li>\n<li><strong>ROOM history scope clarified</strong> - Opening ROOM shows local cached history plus new traffic; full server-side backfill is not pulled automatically in this build.</li>\n<li><strong>Contacts load stability fix</strong> - Boot-time contact load now restores all persisted contacts (auto-add type filter no longer drops saved entries), preventing partial/short lists after reboot/sync.</li>\n<li><strong>Manual contact add/update hardening</strong> - <code>Add/Update Contact</code> path now always applies updates/additions from app/UI (not blocked by auto-add type filter), fixing cases where removed contacts could not be added back.</li>\n<li><strong>Favorites overwrite protection</strong> - Favorite flag is now preserved during external contact updates, reducing accidental eviction when <code>Overwrite oldest</code> is enabled.</li>\n<li><strong>Companion contacts limit (optimization)</strong> - Wio/Cardputer companion builds use <code>MAX_CONTACTS=200</code> by design (memory/stability optimization), instead of <code>350</code>.</li>\n<li><strong>Rooms support (new)</strong> - Added full ROOM flow in <code>Contacts</code>/<code>DM</code>: <code>Login / Open room</code>, auto-login with default <code>hello</code> + password fallback, reliable send after login, and sender name visibility in room messages.</li>\n<li><strong>Quick compose safety: Free text first</strong> - In DM/Channel compose quick menu, <code>Free text</code> is now always first, so accidental immediate send of newest preset is less likely.</li>\n<li><strong>Quick compose clarity: Send labels</strong> - Saved quick presets are now shown as <code>Send: ...</code>, making it explicit that selecting that r\n…</li>\n</ul>\n"
    },
    {
      "version": "v1.13.0.62",
      "name": "v1.13.0.62",
      "datetime": "2026-02-24T20:17:58Z",
      "url": "https://github.com/sosprz/meshcore-cardputer-adv/releases/tag/v1.13.0.62",
      "prerelease": false,
      "notes": "- **Channels counter clarity (messages vs lines)** - Channel header counter now shows message position within the currently renderable message window (`1/N`), not wrapped-line position. This makes counter behavior easier to understand when long messages consume many screen lines.\r\n- **Counter behavior explained** - Message buffers are still `DM=20` and `Channels=100`, but visible navigation depends on render cache (`160` wrapped lines). With long texts, oldest buffered messages may be outside the current renderable window.\r\n- **Sound popup readability** - Sound level popup shown on quick level cycling now stays longer on screen, so `OFF/ON/LOW/MEDIUM/HIGH` is easier to read.\r\n- **Sound cycle consistency** - Added guard against accidental ultra-fast repeated toggles during triple-click bursts, making sound-level stepping more stable.\r\n- **Cyrillic read fallback** - Incoming `RU/UA/BY` plus selected `SR/MK` Cyrillic text now has readable Latin fallback in UI (instead of disappearing characters), improving message readability on current fonts.\r\n\r\n# v1.13.0.61\r\n- **DM open responsiveness fix** - Opening a DM now shows RAM messages immediately; heavy QSPI history load is deferred after enter.\r\n- **DM refresh after deferred hydrate** - After deferred QSPI hydrate completes, DM view performs one automatic refresh.\r\n- **DM header favorite optimization** - Favorite contact marker (`*`) is now cached per opened contact instead of rescanning contacts on each render.\r\n- **Discover Repeaters auto-scan list UI** - Entering `Tools -> Discover Repeaters` now starts zero-hop scan immediately and shows live discovered repeaters as a scrollable list under `Scanning Zero Hop...`.\r\n- **Discover Repeaters list polish** - Repeater entries now use two lines (`Name [ID]` + `SNR`), with highlight and scroll on currently selected item.\r\n\r\n# v1.13.0.60\r\n- **DM history consistency fix** - Direct messages no longer disappear after leaving/reopening chat. DM view now restores from one stable thread source.\r\n- **DM delivery marker stability** - Pending (`..`) and delivered (`*`) status now stays consistent after leaving and reopening DM chat.\r\n\r\n# v1.13.0.59\r\n- **DM/Channels start from unread** - On open, conversation/channel view now anchors to the first unread message (when available) instead of always starting from the newest tail line.\r\n- **Input filter granularity update** - `System -> UI -> Input filter` now supports `OFF` plus `10-500ms` in `10ms` steps (instead of fixed presets).\r\n- **DM counter semantics update** - DM header counter now shows position within currently loaded window (RAM page), avoiding misleading `x/total` values when older history is not loaded.\r\n- **Contacts tabs highlight polish** - In Contacts, tab highlight (`favs/contacts/repeaters/rooms/sensors`) is now shown only when tab row is focused.\r\n- **DM/Channels vertical layout alignment** - Chat area now starts closer to top bar and uses consistent row height, fixing bottom-line clipping/crowding on message rows.\r\n- **Channels mention display polish** - Channel mention payloads now render as `sender >> target ...` instead of raw `@[target]` token.\r\n\r\n# v1.13.0.58\r\n- **Ping bot trigger fix** - Ping bot no longer replies to mention-only messages. In DM it now replies only to `ping`; in channels it replies only to `@[nickname]` + `ping`.\r\n- **Screen lock unlock UX polish** - Unlock popup now shows live step progress (`HODL PREV 3s`, `ENTER x2`) with clearer framing and final `UNLOCKED` confirmation in the same popup flow.\r\n- **Companion send local echo** - Messages sent from companion command path are now injected into local DM/channel views immediately after successful send.",
      "notesHtml": "<ul>\n<li><strong>Channels counter clarity (messages vs lines)</strong> - Channel header counter now shows message position within the currently renderable message window (<code>1/N</code>), not wrapped-line position. This makes counter behavior easier to understand when long messages consume many screen lines.</li>\n<li><strong>Counter behavior explained</strong> - Message buffers are still <code>DM=20</code> and <code>Channels=100</code>, but visible navigation depends on render cache (<code>160</code> wrapped lines). With long texts, oldest buffered messages may be outside the current renderable window.</li>\n<li><strong>Sound popup readability</strong> - Sound level popup shown on quick level cycling now stays longer on screen, so <code>OFF/ON/LOW/MEDIUM/HIGH</code> is easier to read.</li>\n<li><strong>Sound cycle consistency</strong> - Added guard against accidental ultra-fast repeated toggles during triple-click bursts, making sound-level stepping more stable.</li>\n<li><strong>Cyrillic read fallback</strong> - Incoming <code>RU/UA/BY</code> plus selected <code>SR/MK</code> Cyrillic text now has readable Latin fallback in UI (instead of disappearing characters), improving message readability on current fonts.</li>\n</ul>\n<h1>v1.13.0.61</h1>\n<ul>\n<li><strong>DM open responsiveness fix</strong> - Opening a DM now shows RAM messages immediately; heavy QSPI history load is deferred after enter.</li>\n<li><strong>DM refresh after deferred hydrate</strong> - After deferred QSPI hydrate completes, DM view performs one automatic refresh.</li>\n<li><strong>DM header favorite optimization</strong> - Favorite contact marker (<code>*</code>) is now cached per opened contact instead of rescanning contacts on each render.</li>\n<li><strong>Discover Repeaters auto-scan list UI</strong> - Entering <code>Tools -&gt; Discover Repeaters</code> now starts zero-hop scan immediately and shows live discovered repeaters as a scrollable list under <code>Scanning Zero Hop...</code>.</li>\n<li><strong>Discover Repeaters list polish</strong> - Repeater entries now use two lines (<code>Name [ID]</code> + <code>SNR</code>), with highlight and scroll on currently selected item.</li>\n</ul>\n<h1>v1.13.0.60</h1>\n<ul>\n<li><strong>DM history consistency fix</strong> - Direct messages no longer disappear after leaving/reopening chat. DM view now restores from one stable thread source.</li>\n<li><strong>DM delivery marker stability</strong> - Pending (<code>..</code>) and delivered (<code>*</code>) status now stays consistent after leaving and reopening DM chat.</li>\n</ul>\n<h1>v1.13.0.59</h1>\n<ul>\n<li><strong>DM/Channels start from unread</strong> - On open, conversation/channel view now anchors to the first unread message (when available) instead of always starting from the newest tail line.</li>\n<li><strong>Input filter granularity update</strong> - <code>System -&gt; UI -&gt; Input filter</code> now supports <code>OFF</code> plus <code>10-500ms</code> in <code>10ms</code> steps (instead of fixed presets).</li>\n<li><strong>DM counter semantics update</strong> - DM header counter now shows position within currently loaded window (RAM page), avoiding misleading <code>x/total</code> values when older history is not loaded.</li>\n<li><strong>Contacts tabs highlight polish</strong> - In Contacts, tab highlight (<code>favs/contacts/repeaters/rooms/sensors</code>) is now shown only when tab row is focused.</li>\n<li><strong>DM/Channels vertical layout alignment</strong> - Chat area now starts closer to top bar and uses consistent row height, fixing bottom-line clipping/crowding on message rows.</li>\n<li><strong>Channels mention display polish</strong> - Channel mention payloads now render as <code>sender &gt;&gt; target ...</code> instead of raw <code>@[target]</code> token.</li>\n</ul>\n<h1>v1.13.0.58</h1>\n<ul>\n<li><strong>Ping bot trigger fix</strong> - Ping bot no longer replies to mention-only messages. In DM it now replies only to <code>ping</code>; in channels it replies only to <code>@[nickname]</code> + <code>ping</code>.</li>\n<li><strong>Screen lock unlock UX polish</strong> - Unlock popup now shows live step progress (<code>HODL PREV 3s</code>, <code>ENTER x2</code>) with clearer framing and final <code>UNLOCKED</code> confirmation in the same popup flow.</li>\n<li><strong>Companion send local echo</strong> - Messages sent from companion command path are now injected into local DM/channel views immediately after successful send.</li>\n</ul>\n"
    },
    {
      "version": "v1.13.0.57",
      "name": "v1.13.0.57",
      "datetime": "2026-02-21T22:34:49Z",
      "url": "https://github.com/sosprz/meshcore-cardputer-adv/releases/tag/v1.13.0.57",
      "prerelease": false,
      "notes": "- **DM/Channels counter start fix** - Conversation and channel views now render from latest message tail window, so header position counter starts from current/latest context instead of jumping to oldest slice (`1/N`).\r\n- **Sound behavior aligned when phone connected** - All buzzer notifications are now muted while app/phone link is active (consistent with previous DM behavior).\r\n- **Splash link mode label** - Boot splash now shows active companion build mode under the MeshCore logo (`USB` / `BLE` / `WiFi`).\r\n- **List wrap consistency fix** - Pressing `Down` on last item now wraps to top (and `Up` from top wraps to bottom) in affected menus: `System > Radio > Local stats`, `System > Telemetry`, `Contacts > Settings`, `DM Contact Actions`, and `Channel Actions`.\r\n- **System Radio return flow fix** - When Radio is opened from `System`, leaving Radio now returns to `System` instead of drifting to Home carousel pages (e.g. `Sound`).\r\n- **Input filter option** - Added `System -> UI -> Input filter` with selectable click guard (`OFF / 40ms / 80ms / 120ms`) to reduce accidental double-clicks on worn joystick/buttons.\r\n- **Unread counters survive reboot** - DM/channels unread counters remain after restart",
      "notesHtml": "<ul>\n<li><strong>DM/Channels counter start fix</strong> - Conversation and channel views now render from latest message tail window, so header position counter starts from current/latest context instead of jumping to oldest slice (<code>1/N</code>).</li>\n<li><strong>Sound behavior aligned when phone connected</strong> - All buzzer notifications are now muted while app/phone link is active (consistent with previous DM behavior).</li>\n<li><strong>Splash link mode label</strong> - Boot splash now shows active companion build mode under the MeshCore logo (<code>USB</code> / <code>BLE</code> / <code>WiFi</code>).</li>\n<li><strong>List wrap consistency fix</strong> - Pressing <code>Down</code> on last item now wraps to top (and <code>Up</code> from top wraps to bottom) in affected menus: <code>System &gt; Radio &gt; Local stats</code>, <code>System &gt; Telemetry</code>, <code>Contacts &gt; Settings</code>, <code>DM Contact Actions</code>, and <code>Channel Actions</code>.</li>\n<li><strong>System Radio return flow fix</strong> - When Radio is opened from <code>System</code>, leaving Radio now returns to <code>System</code> instead of drifting to Home carousel pages (e.g. <code>Sound</code>).</li>\n<li><strong>Input filter option</strong> - Added <code>System -&gt; UI -&gt; Input filter</code> with selectable click guard (<code>OFF / 40ms / 80ms / 120ms</code>) to reduce accidental double-clicks on worn joystick/buttons.</li>\n<li><strong>Unread counters survive reboot</strong> - DM/channels unread counters remain after restart</li>\n</ul>\n"
    },
    {
      "version": "v1.12.0.46",
      "name": "v1.12.0.46",
      "datetime": "2026-02-12T23:18:59Z",
      "url": "https://github.com/sosprz/meshcore-cardputer-adv/releases/tag/v1.12.0.46",
      "prerelease": false,
      "notes": "- **UI: Auto‑off timeout** - Screen timeout fix \r\n- **Channels: Share key (DM)** - Added “Share key” action to send private channel key via DM only (KEY tag).\r\n- **Messages: Key invite split** - Key DM renders as two lines: “Join to priv channel.” (Enter joins) and “You got invite to priv channel.” (Enter composes).\r\n- **Channels: Private key** - Long-press on a private channel shows its key in hex\r\n- **Channels: Join label** - “+Join a # channel” renamed to “+Join #channel”.\r\n- **Adverts: Settings layout** - Share position now shows ON/OFF in the right column (label stays left).\r\n- **System: Input/Joystick rows** - Text input and joystick rotation now show value only and change on Enter (no L/R hints).\r\n- **Channels: Private key tip** - After creating a private channel, a tip explains long-pressing the channel name to show the key.\r\n- **Keyboard: Layout** - Soft keyboard moved `DEL` to top right and `SPC` to bottom center.\r\n- **Keyboard: Highlight** - Selection highlight now fills key cells and adds padding for `SPC`/`DEL`.\r\n- **Text entry: Cursor** - Added blinking `|` cursor in T9, soft keyboard, and hardware keyboard input views.\r\n- **Repeater admin login** - T9 admin login now shows typed characters instead of a `Len:` count.\r\n- **T9: Cursor edit mode** - Added MOV/END cursor workflow to edit text in the middle without losing the right‑side content.\r\n- **UI: List wrap** - Tools, System, Radio menus, Adverts list, and Channels list now wrap around on Up/Down.\r\n- **Adverts: Settings screen** - Moved Share Position and Advert rate into a dedicated Adverts Settings page; removed Advert rate from GPS settings.\r\n- **Channels: Join input** - Join `#` channel input now pre-fills `#` for keyboard mode and saves from text model.\r\n- **Splash: Skip** - Splash nickname/matrix screen can be skipped by pressing any key.\r\n- **System: Device name input** - Name edit now pre-fills correctly in all input modes (T9/soft KB/hardware KB).\r\n- **System: Device name input** - Fixed T9 OK submit path so names save correctly when using T9 mode.\r\n- **GPS: Data screen** - GPS details now show compact two-column diagnostics (Detected/Active, Fix/Sats) plus Baud+Alt and Lat/Lon layout updates.\r\n- **Radio: Carousel preset name** - Radio home carousel now prefers the last applied preset name when multiple presets share the same params.\r\n- **Adverts: Settings screen** - Moved Share Position and Advert rate into a dedicated Adverts Settings page; removed Advert rate from GPS settings.\r\n- **UI: Sound levels (Home)** - Sound page now cycles and displays `OFF -> ON -> LOW -> MEDIUM -> HIGH` for unified settings on Wio/Cardputer.",
      "notesHtml": "<ul>\n<li><strong>UI: Auto‑off timeout</strong> - Screen timeout fix </li>\n<li><strong>Channels: Share key (DM)</strong> - Added “Share key” action to send private channel key via DM only (KEY tag).</li>\n<li><strong>Messages: Key invite split</strong> - Key DM renders as two lines: “Join to priv channel.” (Enter joins) and “You got invite to priv channel.” (Enter composes).</li>\n<li><strong>Channels: Private key</strong> - Long-press on a private channel shows its key in hex</li>\n<li><strong>Channels: Join label</strong> - “+Join a # channel” renamed to “+Join #channel”.</li>\n<li><strong>Adverts: Settings layout</strong> - Share position now shows ON/OFF in the right column (label stays left).</li>\n<li><strong>System: Input/Joystick rows</strong> - Text input and joystick rotation now show value only and change on Enter (no L/R hints).</li>\n<li><strong>Channels: Private key tip</strong> - After creating a private channel, a tip explains long-pressing the channel name to show the key.</li>\n<li><strong>Keyboard: Layout</strong> - Soft keyboard moved <code>DEL</code> to top right and <code>SPC</code> to bottom center.</li>\n<li><strong>Keyboard: Highlight</strong> - Selection highlight now fills key cells and adds padding for <code>SPC</code>/<code>DEL</code>.</li>\n<li><strong>Text entry: Cursor</strong> - Added blinking <code>|</code> cursor in T9, soft keyboard, and hardware keyboard input views.</li>\n<li><strong>Repeater admin login</strong> - T9 admin login now shows typed characters instead of a <code>Len:</code> count.</li>\n<li><strong>T9: Cursor edit mode</strong> - Added MOV/END cursor workflow to edit text in the middle without losing the right‑side content.</li>\n<li><strong>UI: List wrap</strong> - Tools, System, Radio menus, Adverts list, and Channels list now wrap around on Up/Down.</li>\n<li><strong>Adverts: Settings screen</strong> - Moved Share Position and Advert rate into a dedicated Adverts Settings page; removed Advert rate from GPS settings.</li>\n<li><strong>Channels: Join input</strong> - Join <code>#</code> channel input now pre-fills <code>#</code> for keyboard mode and saves from text model.</li>\n<li><strong>Splash: Skip</strong> - Splash nickname/matrix screen can be skipped by pressing any key.</li>\n<li><strong>System: Device name input</strong> - Name edit now pre-fills correctly in all input modes (T9/soft KB/hardware KB).</li>\n<li><strong>System: Device name input</strong> - Fixed T9 OK submit path so names save correctly when using T9 mode.</li>\n<li><strong>GPS: Data screen</strong> - GPS details now show compact two-column diagnostics (Detected/Active, Fix/Sats) plus Baud+Alt and Lat/Lon layout updates.</li>\n<li><strong>Radio: Carousel preset name</strong> - Radio home carousel now prefers the last applied preset name when multiple presets share the same params.</li>\n<li><strong>Adverts: Settings screen</strong> - Moved Share Position and Advert rate into a dedicated Adverts Settings page; removed Advert rate from GPS settings.</li>\n<li><strong>UI: Sound levels (Home)</strong> - Sound page now cycles and displays <code>OFF -&gt; ON -&gt; LOW -&gt; MEDIUM -&gt; HIGH</code> for unified settings on Wio/Cardputer.</li>\n</ul>\n"
    },
    {
      "version": "v1.12.0.45",
      "name": "v1.12.0.45",
      "datetime": "2026-02-12T06:38:11Z",
      "url": "https://github.com/sosprz/meshcore-cardputer-adv/releases/tag/v1.12.0.45",
      "prerelease": false,
      "notes": "- **System: Device name input** - Fixed T9 OK submit path so names save correctly when using T9 mode.\r\n- **GPS: Data screen** - GPS details now show compact two-column diagnostics (Detected/Active, Fix/Sats) plus Baud+Alt and Lat/Lon layout updates.\r\n- **Cardputer: Display margins** - Adjusted Cardputer UI scaling and offsets (no overscan, small left/top inset) to avoid clipping inside the enclosure.",
      "notesHtml": "<ul>\n<li><strong>System: Device name input</strong> - Fixed T9 OK submit path so names save correctly when using T9 mode.</li>\n<li><strong>GPS: Data screen</strong> - GPS details now show compact two-column diagnostics (Detected/Active, Fix/Sats) plus Baud+Alt and Lat/Lon layout updates.</li>\n<li><strong>Cardputer: Display margins</strong> - Adjusted Cardputer UI scaling and offsets (no overscan, small left/top inset) to avoid clipping inside the enclosure.</li>\n</ul>\n"
    },
    {
      "version": "v1.12.0.44",
      "name": "v1.12.0.44",
      "datetime": "2026-02-11T15:50:11Z",
      "url": "https://github.com/sosprz/meshcore-cardputer-adv/releases/tag/v1.12.0.44",
      "prerelease": false,
      "notes": "- **UI: Sound levels (Home)** - Sound page now cycles and displays `OFF -> ON -> LOW -> MEDIUM -> HIGH` for unified \r\n- All changes from https://github.com/sosprz/Meshcore-Wio-Tracker-L1-Pro/releases",
      "notesHtml": "<ul>\n<li><strong>UI: Sound levels (Home)</strong> - Sound page now cycles and displays <code>OFF -&gt; ON -&gt; LOW -&gt; MEDIUM -&gt; HIGH</code> for unified </li>\n<li>All changes from <a href=\"https://github.com/sosprz/Meshcore-Wio-Tracker-L1-Pro/releases\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/sosprz/Meshcore-Wio-Tracker-L1-Pro/releases</a></li>\n</ul>\n"
    },
    {
      "version": "v1.11.0.5",
      "name": "companion-v1.11.0.5 Cardputer ADV + LoRa868 Cap",
      "datetime": "2026-01-13T12:14:36Z",
      "url": "https://github.com/sosprz/meshcore-cardputer-adv/releases/tag/v1.11.0.5",
      "prerelease": false,
      "notes": "🆕 New Features\r\n✅ Send messages to channels (press Enter in channel view)\r\n✅ BLE pairing preserved during updates\r\n✅ GPS acquisition status display\r\n🐛 Bug Fixes\r\n✅ Channel messages now appear correctly (index mismatch fixed)\r\n✅ Correct message timestamps (was using wrong clock)\r\n✅ GPS detection works on cold start\r\n✅ Better message text display (full width)\r\n✅ Improved scrolling behavior\r\n🎨 UI Improvements\r\n✅ Removed 'm'/'c' hotkeys (arrow navigation only)\r\n✅ Better text ellipsis handling\r\n✅ Color-coded sent vs received messages\r\n✅ Helpful GPS status messages",
      "notesHtml": "<p>🆕 New Features\n✅ Send messages to channels (press Enter in channel view)\n✅ BLE pairing preserved during updates\n✅ GPS acquisition status display\n🐛 Bug Fixes\n✅ Channel messages now appear correctly (index mismatch fixed)\n✅ Correct message timestamps (was using wrong clock)\n✅ GPS detection works on cold start\n✅ Better message text display (full width)\n✅ Improved scrolling behavior\n🎨 UI Improvements\n✅ Removed 'm'/'c' hotkeys (arrow navigation only)\n✅ Better text ellipsis handling\n✅ Color-coded sent vs received messages\n✅ Helpful GPS status messages</p>\n"
    },
    {
      "version": "v1.11.0.4",
      "name": "companion-v1.11.0.4 Cardputer ADV + LoRa868 Cap",
      "datetime": "2026-01-12T22:32:52Z",
      "url": "https://github.com/sosprz/meshcore-cardputer-adv/releases/tag/v1.11.0.4",
      "prerelease": false,
      "notes": "Latest updates:\r\n- On‑device channel view + compose (Public/other channels) from Cardputer\r\n- Keyboard wake in compose screen + ` for back\r\n- Local channel history stored and scrollable\r\n- GPS auto‑baud + persistent GPS\r\n- ST7789 display/backlight + keyboard fixes for Cardputer ADV",
      "notesHtml": "<p>Latest updates:</p>\n<ul>\n<li>On‑device channel view + compose (Public/other channels) from Cardputer</li>\n<li>Keyboard wake in compose screen + ` for back</li>\n<li>Local channel history stored and scrollable</li>\n<li>GPS auto‑baud + persistent GPS</li>\n<li>ST7789 display/backlight + keyboard fixes for Cardputer ADV</li>\n</ul>\n"
    },
    {
      "version": "v1.11.0.3",
      "name": "companion-v1.11.0.3 Cardputer ADV + LoRa868 Cap",
      "datetime": "2026-01-12T13:41:19Z",
      "url": "https://github.com/sosprz/meshcore-cardputer-adv/releases/tag/v1.11.0.3",
      "prerelease": false,
      "notes": "🎹 Keyboard Text Messaging for M5Stack Cardputer + Fixed keyboard\r\n\r\nPress m to compose messages directly on your Cardputer using the physical keyboard!\r\n\r\nQuick Start\r\n\r\nPress m on home screen\r\nSelect recipient with arrow keys\r\nType your message\r\nPress Enter to send\r\nFeatures\r\n\r\n✅ Native keyboard text input\r\n✅ Contact selection from recent mesh nodes\r\n✅ Real-time message preview\r\n✅ Direct LoRa mesh transmission",
      "notesHtml": "<p>🎹 Keyboard Text Messaging for M5Stack Cardputer + Fixed keyboard</p>\n<p>Press m to compose messages directly on your Cardputer using the physical keyboard!</p>\n<p>Quick Start</p>\n<p>Press m on home screen\nSelect recipient with arrow keys\nType your message\nPress Enter to send\nFeatures</p>\n<p>✅ Native keyboard text input\n✅ Contact selection from recent mesh nodes\n✅ Real-time message preview\n✅ Direct LoRa mesh transmission</p>\n"
    },
    {
      "version": "v1.11.0",
      "name": "companion-v1.11.0 Cardputer ADV + LoRa868 Cap",
      "datetime": "2026-01-12T11:28:10Z",
      "url": "https://github.com/sosprz/meshcore-cardputer-adv/releases/tag/v1.11.0",
      "prerelease": false,
      "notes": "- Cardputer ADV: ST7789 display enabled with correct backlight\r\n- Keyboard navigation: W/A/S/D plus , / . ; and ` mappings\r\n- LoRa Cap: PI4IOE power init on I2C, stable after reset\r\n- GPS: auto‑baud + persistent GPS, RX=13 TX=15\r\n- BLE companion radio UI",
      "notesHtml": "<ul>\n<li>Cardputer ADV: ST7789 display enabled with correct backlight</li>\n<li>Keyboard navigation: W/A/S/D plus , / . ; and ` mappings</li>\n<li>LoRa Cap: PI4IOE power init on I2C, stable after reset</li>\n<li>GPS: auto‑baud + persistent GPS, RX=13 TX=15</li>\n<li>BLE companion radio UI</li>\n</ul>\n"
    }
  ],
  "changelogSource": "github",
  "changelogUpdatedAt": "2026-06-24T03:22:54.082Z"
}
