{
  "id": "sigurdos-tdeck",
  "name": "SigurdOS T-Deck",
  "type": "custom",
  "maintainer": "hermes-gadget",
  "description": "Standalone off-grid MeshCore messaging firmware for the LilyGo T-Deck, with a launcher-style touch UI, persistent conversations, maps, diagnostics and Wi-Fi or GitHub-based update support.\n",
  "repository": "https://github.com/hermes-gadget/SigurdOS-tdeck",
  "license": "GPL-3.0",
  "status": "active",
  "scope": "device-specific",
  "lifecycle": "active",
  "maturity": "beta",
  "distribution": "community",
  "runtime": {
    "framework": "arduino",
    "language": "C++"
  },
  "roles": [
    "companion",
    "standalone-ui"
  ],
  "features": [
    "Standalone direct and channel messaging",
    "Touch, trackball and keyboard controls",
    "Maps, GPS and signal diagnostics",
    "Wi-Fi and GitHub OTA updates"
  ],
  "capabilities": {
    "protocol": {
      "meshcoreCompatible": true
    },
    "transports": {
      "ble": true,
      "usbSerial": true,
      "wifiAp": true
    },
    "operations": {
      "ota": true
    },
    "hardware": {
      "gps": true,
      "display": true
    }
  },
  "devices": [
    {
      "id": "lilygo-t-deck",
      "status": "supported",
      "notes": "The project reports successful beta flashes by several users."
    }
  ],
  "popularity": {
    "githubStars": 18,
    "githubForks": 5,
    "githubWatchers": 0,
    "githubOpenIssues": 21,
    "githubContributors": 4,
    "releaseDownloads": 1228,
    "latestReleaseDownloads": 9,
    "lastChecked": "2026-07-21"
  },
  "verification": {
    "sourceAvailable": true,
    "releasesAvailable": true,
    "ciBuilds": true,
    "lastChecked": "2026-07-21"
  },
  "source": {
    "path": "data/firmwares/sigurdos-tdeck/firmware.yaml",
    "updatedAt": "2026-07-21T08:04:18Z"
  },
  "latest_version": "0.1.45-RC7",
  "released": "2026-07-18",
  "releases": [
    {
      "version": "beta-0.1.45-RC7",
      "name": "beta-0.1.45-RC7",
      "datetime": "2026-07-18T09:27:15Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.45-RC7",
      "prerelease": true,
      "notes": "**SigurdOS T-Deck Firmware** — beta-0.1.45-RC7\n\nRelease candidate 7 for the beta-0.1.45 cycle. 181 commits since beta-0.1.44-RC6.\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse `manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `SigurdOS-tdeck-launcher.bin` | For bmorcelli/Launcher install |\n| `manifest.json` | Web flasher manifest |\n| `sigurdos-tdeck-bootloader.bin` | Bootloader (web flasher) |\n| `sigurdos-tdeck-partitions.bin` | Partitions (web flasher) |\n| `sigurdos-tdeck-boot_app0.bin` | Boot app0 (web flasher) |\n\n### Features\n- Companion protocol: binary peer requests (CMD_SEND_BINARY_REQ), anonymous requests (CMD_SEND_ANON_REQ), zero-hop control data (CMD_SEND_CONTROL_DATA), direct raw data (CMD_SEND_RAW_DATA)\n- UI: message detail sheet, contact list power tools, bounded field notifications, timestamped repeater CLI transcripts\n- GPS: demand-driven polling with time sync\n- Mesh: surface repeater session failures\n- CI: dependency scanning, CodeQL analysis gates, release evidence enforcement\n- Performance: virtualized message/packet lists, bounded sparse tile loading\n- Storage: unified message history store\n\n### Fixes\n- Companion/BLE: install private flood-scope keys, synchronize BLE callback/app state, BLE RX queue backpressure, time out unauthenticated connections, defer BLE init until enabled, migrate stale prefs, update pairing PIN, preserve CLI data semantics, accept time unconditionally, enable BLE by default, page full companion backlog, gate repeat by radio profile, align async push IDs\n- Mesh: clear login sessions on identity import, ACK drop counter, require durable mesh mutation commits, scoped flood interop proof, update MeshCore for race-free ISR, reject oversized hashtag names, preserve UTF-8 message boundaries\n- UI: restore textarea date/time inputs, accumulate home grid offsets, bound textarea inputs, route nested screens through nav history, free QR canvas on screen delete, always show repeater login status\n- System: clamp snprintf buffer (CodeQL), make deep sleep persistence-safe, OTA boot-health rollback, fail closed for GitHub OTA channels, support unknown-size multipart OTA, preflight/bound PNG tile decoding, handle HAL allocation failures\n- Build/CI: add -Wall -Wextra, expand sanitizer suite, compile every firmware env, reject stale warning budgets, pin transitive deps, consolidate PlatformIO cache, regenerate dep lock file\n- GPS: route RTC sync through tracked clock sources, preserve mesh clock handoff\n- SD: de-assert non-SD CS pins before mount\n- Various: encode advert path responses safely, validate NMEA semantics, complete message store recovery, expire pending binary requests, update companion delivery state, reject oversized companion pushes, wrap map tiles at antimeridian, propagate NVS write failures, decode trace SNR correctly, validate encoded path lengths\n\n### Documentation\n- Reconcile companion support and missing-features status with pinned MeshCore\n- Refresh README, screen guides, ROADMAP, FEATURES_OVERVIEW, Launcher docs\n- Add Noto Emoji license notice\n- Document companion message visibility limitation\n\n### Hardware Tested (beta-0.1.45-RC7)\n- Native tests: 1219/1220 passed\n- Production build: RAM 39.3%, Flash 40.0%\n- T-Deck boot verified: radio 869.525 MHz, noise floor -94 dBm\n- All 12 screens navigate without crashes\n- Soak: 420 seconds idle, zero crashes, heap stable at 146,808\n- RF transmission confirmed on #testingslopos\n- CI pre-existing: dep hash + golden frame pin fixed; remaining 2 test infra issues pre-date this release\n\n### Evidence\nRelease evidence: `release-evidence/beta-0.1.45-RC7.json`",
      "notesHtml": "<p><strong>SigurdOS T-Deck Firmware</strong> — beta-0.1.45-RC7</p>\n<p>Release candidate 7 for the beta-0.1.45 cycle. 181 commits since beta-0.1.44-RC6.</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use <code>manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>SigurdOS-tdeck-launcher.bin</code></td>\n<td>For bmorcelli/Launcher install</td>\n</tr>\n<tr>\n<td><code>manifest.json</code></td>\n<td>Web flasher manifest</td>\n</tr>\n<tr>\n<td><code>sigurdos-tdeck-bootloader.bin</code></td>\n<td>Bootloader (web flasher)</td>\n</tr>\n<tr>\n<td><code>sigurdos-tdeck-partitions.bin</code></td>\n<td>Partitions (web flasher)</td>\n</tr>\n<tr>\n<td><code>sigurdos-tdeck-boot_app0.bin</code></td>\n<td>Boot app0 (web flasher)</td>\n</tr>\n</tbody></table>\n<h3>Features</h3>\n<ul>\n<li>Companion protocol: binary peer requests (CMD_SEND_BINARY_REQ), anonymous requests (CMD_SEND_ANON_REQ), zero-hop control data (CMD_SEND_CONTROL_DATA), direct raw data (CMD_SEND_RAW_DATA)</li>\n<li>UI: message detail sheet, contact list power tools, bounded field notifications, timestamped repeater CLI transcripts</li>\n<li>GPS: demand-driven polling with time sync</li>\n<li>Mesh: surface repeater session failures</li>\n<li>CI: dependency scanning, CodeQL analysis gates, release evidence enforcement</li>\n<li>Performance: virtualized message/packet lists, bounded sparse tile loading</li>\n<li>Storage: unified message history store</li>\n</ul>\n<h3>Fixes</h3>\n<ul>\n<li>Companion/BLE: install private flood-scope keys, synchronize BLE callback/app state, BLE RX queue backpressure, time out unauthenticated connections, defer BLE init until enabled, migrate stale prefs, update pairing PIN, preserve CLI data semantics, accept time unconditionally, enable BLE by default, page full companion backlog, gate repeat by radio profile, align async push IDs</li>\n<li>Mesh: clear login sessions on identity import, ACK drop counter, require durable mesh mutation commits, scoped flood interop proof, update MeshCore for race-free ISR, reject oversized hashtag names, preserve UTF-8 message boundaries</li>\n<li>UI: restore textarea date/time inputs, accumulate home grid offsets, bound textarea inputs, route nested screens through nav history, free QR canvas on screen delete, always show repeater login status</li>\n<li>System: clamp snprintf buffer (CodeQL), make deep sleep persistence-safe, OTA boot-health rollback, fail closed for GitHub OTA channels, support unknown-size multipart OTA, preflight/bound PNG tile decoding, handle HAL allocation failures</li>\n<li>Build/CI: add -Wall -Wextra, expand sanitizer suite, compile every firmware env, reject stale warning budgets, pin transitive deps, consolidate PlatformIO cache, regenerate dep lock file</li>\n<li>GPS: route RTC sync through tracked clock sources, preserve mesh clock handoff</li>\n<li>SD: de-assert non-SD CS pins before mount</li>\n<li>Various: encode advert path responses safely, validate NMEA semantics, complete message store recovery, expire pending binary requests, update companion delivery state, reject oversized companion pushes, wrap map tiles at antimeridian, propagate NVS write failures, decode trace SNR correctly, validate encoded path lengths</li>\n</ul>\n<h3>Documentation</h3>\n<ul>\n<li>Reconcile companion support and missing-features status with pinned MeshCore</li>\n<li>Refresh README, screen guides, ROADMAP, FEATURES_OVERVIEW, Launcher docs</li>\n<li>Add Noto Emoji license notice</li>\n<li>Document companion message visibility limitation</li>\n</ul>\n<h3>Hardware Tested (beta-0.1.45-RC7)</h3>\n<ul>\n<li>Native tests: 1219/1220 passed</li>\n<li>Production build: RAM 39.3%, Flash 40.0%</li>\n<li>T-Deck boot verified: radio 869.525 MHz, noise floor -94 dBm</li>\n<li>All 12 screens navigate without crashes</li>\n<li>Soak: 420 seconds idle, zero crashes, heap stable at 146,808</li>\n<li>RF transmission confirmed on #testingslopos</li>\n<li>CI pre-existing: dep hash + golden frame pin fixed; remaining 2 test infra issues pre-date this release</li>\n</ul>\n<h3>Evidence</h3>\n<p>Release evidence: <code>release-evidence/beta-0.1.45-RC7.json</code></p>\n"
    },
    {
      "version": "beta-0.1.44-RC6",
      "name": "beta-0.1.44-RC6",
      "datetime": "2026-07-12T12:37:19Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.44-RC6",
      "prerelease": true,
      "notes": "**SigurdOS T-Deck Firmware** — beta-0.1.44-RC6\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse `manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `SigurdOS-tdeck-launcher.bin` | For bmorcelli/Launcher install |\n| `firmware-debug.bin` | Debug build with verbose logging |\n| `manifest.json` | Web flasher manifest |\n| `sigurdos-tdeck-bootloader.bin` | Bootloader (web flasher) |\n| `sigurdos-tdeck-partitions.bin` | Partition table (web flasher) |\n| `sigurdos-tdeck-boot_app0.bin` | Boot app0 (web flasher) |\n| `sigurdos-tdeck-firmware.bin` | App firmware (web flasher) |\n| `sigurdos-tdeck-full.bin` | Full image (web flasher) |\n\n\n## What's Changed\n* fix: safe SPIFFS init with erased-partition auto-format (closes #750) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/751\n* Phase 1: Switch keyboard to key mode for multi-model T-Deck compatibility (#752) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/753\n* Phase 2: Multi-language keyboard layout system (12 layouts) — #752 by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/754\n* Phase 3: I2C robustness improvements — #752 by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/755\n* fix: keyboard doesn't work — I2C timeout kills cold boot (#752) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/756\n* [codex] use C3 key mode for multi-model keyboards by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/757\n* [codex] Add persisted international keyboard layouts by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/758\n* [codex] Harden shared I2C initialization and recovery by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/759\n* Fork Merge: Radio profiles, diagnostics, RX-only mode, CI fixes by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/760\n* fix: battery -% on menu nav, cursor visibility, RSSI chart labels by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/766\n* fix(ci): exclude LauncherCompatibility.md from doc reference check by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/767\n* docs: comprehensive repository-wide audit (audit.md) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/770\n* fix(gps): correct GPS-to-Unix-epoch conversion (BUG-001) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/771\n* fix(ui): prevent dangling g_wifi_icon use-after-free (BUG-002) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/772\n* fix(hw): guard deep-sleep RTC-GPIO calls on non-RTC DIO1 pin (HW-001) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/773\n* fix(mesh): hoist sender_buf out of if-block to prevent use-after-scope (BUG-003) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/774\n* fix(mesh): return correct contact in processAck instead of contact[0] (BUG-004) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/775\n* fix: batch of low-severity fixes (HW-002, DEAD-002..004, DOC-001, BUILD-001) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/776\n* fix(security): add OTA PIN brute-force rate limiting (SEC-001) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/777\n* docs: add remediation status to audit.md (7 PRs submitted) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/778\n* perf(display): lazy-allocate emergency buffer, reclaim 12.8KB DRAM (PERF-\n…",
      "notesHtml": "<p><strong>SigurdOS T-Deck Firmware</strong> — beta-0.1.44-RC6</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use <code>manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>SigurdOS-tdeck-launcher.bin</code></td>\n<td>For bmorcelli/Launcher install</td>\n</tr>\n<tr>\n<td><code>firmware-debug.bin</code></td>\n<td>Debug build with verbose logging</td>\n</tr>\n<tr>\n<td><code>manifest.json</code></td>\n<td>Web flasher manifest</td>\n</tr>\n<tr>\n<td><code>sigurdos-tdeck-bootloader.bin</code></td>\n<td>Bootloader (web flasher)</td>\n</tr>\n<tr>\n<td><code>sigurdos-tdeck-partitions.bin</code></td>\n<td>Partition table (web flasher)</td>\n</tr>\n<tr>\n<td><code>sigurdos-tdeck-boot_app0.bin</code></td>\n<td>Boot app0 (web flasher)</td>\n</tr>\n<tr>\n<td><code>sigurdos-tdeck-firmware.bin</code></td>\n<td>App firmware (web flasher)</td>\n</tr>\n<tr>\n<td><code>sigurdos-tdeck-full.bin</code></td>\n<td>Full image (web flasher)</td>\n</tr>\n</tbody></table>\n<h2>What's Changed</h2>\n<ul>\n<li>fix: safe SPIFFS init with erased-partition auto-format (closes #750) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/751\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/751</a></li>\n<li>Phase 1: Switch keyboard to key mode for multi-model T-Deck compatibility (#752) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/753\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/753</a></li>\n<li>Phase 2: Multi-language keyboard layout system (12 layouts) — #752 by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/754\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/754</a></li>\n<li>Phase 3: I2C robustness improvements — #752 by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/755\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/755</a></li>\n<li>fix: keyboard doesn't work — I2C timeout kills cold boot (#752) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/756\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/756</a></li>\n<li>[codex] use C3 key mode for multi-model keyboards by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/757\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/757</a></li>\n<li>[codex] Add persisted international keyboard layouts by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/758\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/758</a></li>\n<li>[codex] Harden shared I2C initialization and recovery by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/759\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/759</a></li>\n<li>Fork Merge: Radio profiles, diagnostics, RX-only mode, CI fixes by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/760\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/760</a></li>\n<li>fix: battery -% on menu nav, cursor visibility, RSSI chart labels by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/766\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/766</a></li>\n<li>fix(ci): exclude LauncherCompatibility.md from doc reference check by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/767\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/767</a></li>\n<li>docs: comprehensive repository-wide audit (audit.md) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/770\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/770</a></li>\n<li>fix(gps): correct GPS-to-Unix-epoch conversion (BUG-001) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/771\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/771</a></li>\n<li>fix(ui): prevent dangling g_wifi_icon use-after-free (BUG-002) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/772\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/772</a></li>\n<li>fix(hw): guard deep-sleep RTC-GPIO calls on non-RTC DIO1 pin (HW-001) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/773\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/773</a></li>\n<li>fix(mesh): hoist sender_buf out of if-block to prevent use-after-scope (BUG-003) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/774\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/774</a></li>\n<li>fix(mesh): return correct contact in processAck instead of contact[0] (BUG-004) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/775\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/775</a></li>\n<li>fix: batch of low-severity fixes (HW-002, DEAD-002..004, DOC-001, BUILD-001) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/776\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/776</a></li>\n<li>fix(security): add OTA PIN brute-force rate limiting (SEC-001) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/777\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/777</a></li>\n<li>docs: add remediation status to audit.md (7 PRs submitted) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/778\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/778</a></li>\n<li>perf(display): lazy-allocate emergency buffer, reclaim 12.8KB DRAM (PERF-\n…</li>\n</ul>\n"
    },
    {
      "version": "beta-0.1.43-RC5",
      "name": "beta-0.1.43-RC5",
      "datetime": "2026-06-28T13:56:23Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.43-RC5",
      "prerelease": true,
      "notes": "**SigurdOS T-Deck Firmware** — beta-0.1.43-RC5\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse `manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `SigurdOS-tdeck-launcher.bin` | For bmorcelli/Launcher install |\n| `firmware-debug.bin` | Debug build with verbose logging |\n| `manifest.json` | Web flasher manifest |\n| `sigurdos-tdeck-bootloader.bin` | Bootloader (web flasher) |\n| `sigurdos-tdeck-partitions.bin` | Partition table (web flasher) |\n| `sigurdos-tdeck-boot_app0.bin` | Boot app0 (web flasher) |\n| `sigurdos-tdeck-firmware.bin` | App firmware (web flasher) |\n| `sigurdos-tdeck-full.bin` | Full image (web flasher) |\n\n\n## What's Changed\n* fix: add click button deadtime enforcement by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/696\n* fix: prevent trace timer UAF on rapid contact taps by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/697\n* fix: use sender timestamp for incoming messages by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/698\n* fix: add div-by-zero guard to battery percentage lookup by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/699\n* docs: remove stale binary and add audit documentation by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/700\n* fix: move I2C clock to shared init at 400 kHz by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/705\n* fix: use 4-byte blob key prefix to prevent hash collisions (Closes #706) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/716\n* fix: clear companion bridge signing state on BLE disconnect (Closes #712) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/720\n* fix: use atomic rename for message store updates to prevent data loss on power failure (Closes #713) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/721\n* fix: use modulo arithmetic for save_counter to prevent 22-day persistence gap (Closes #707) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/717\n* fix: strip orphaned UTF-8 multi-byte start byte after truncation (Closes #708) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/718\n* fix: use lv_obj_del_async() and add lv_obj_is_valid() guard in chat screen (Closes #711, Closes #714) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/719\n* [codex] Add companion compatibility audit by @gadgethd in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/723\n* Fix reproducible WebServer security patches in CI by @gadgethd in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/725\n* fix: use millis() for PIN grace timing instead of mesh epoch (Closes #740) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/741\n* fix: generate random per-device BLE PIN instead of hardcoded 123456 (Closes #742) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/743\n* fix: use SPIFFS.begin(false) and remove nvs_flash_erase from factory reset (Closes #744) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/745\n* fix: input and small-screen reliability improvements (Closes #746) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/747\n* fix: per-message companion delivery tracking and metadata preservation (Closes #726) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/727\n* fix: reload contact crypto state after companion private-key import (Closes #728) by @hermes-gadget in https://github.com/hermes-gadget/S\n…",
      "notesHtml": "<p><strong>SigurdOS T-Deck Firmware</strong> — beta-0.1.43-RC5</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use <code>manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>SigurdOS-tdeck-launcher.bin</code></td>\n<td>For bmorcelli/Launcher install</td>\n</tr>\n<tr>\n<td><code>firmware-debug.bin</code></td>\n<td>Debug build with verbose logging</td>\n</tr>\n<tr>\n<td><code>manifest.json</code></td>\n<td>Web flasher manifest</td>\n</tr>\n<tr>\n<td><code>sigurdos-tdeck-bootloader.bin</code></td>\n<td>Bootloader (web flasher)</td>\n</tr>\n<tr>\n<td><code>sigurdos-tdeck-partitions.bin</code></td>\n<td>Partition table (web flasher)</td>\n</tr>\n<tr>\n<td><code>sigurdos-tdeck-boot_app0.bin</code></td>\n<td>Boot app0 (web flasher)</td>\n</tr>\n<tr>\n<td><code>sigurdos-tdeck-firmware.bin</code></td>\n<td>App firmware (web flasher)</td>\n</tr>\n<tr>\n<td><code>sigurdos-tdeck-full.bin</code></td>\n<td>Full image (web flasher)</td>\n</tr>\n</tbody></table>\n<h2>What's Changed</h2>\n<ul>\n<li>fix: add click button deadtime enforcement by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/696\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/696</a></li>\n<li>fix: prevent trace timer UAF on rapid contact taps by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/697\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/697</a></li>\n<li>fix: use sender timestamp for incoming messages by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/698\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/698</a></li>\n<li>fix: add div-by-zero guard to battery percentage lookup by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/699\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/699</a></li>\n<li>docs: remove stale binary and add audit documentation by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/700\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/700</a></li>\n<li>fix: move I2C clock to shared init at 400 kHz by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/705\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/705</a></li>\n<li>fix: use 4-byte blob key prefix to prevent hash collisions (Closes #706) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/716\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/716</a></li>\n<li>fix: clear companion bridge signing state on BLE disconnect (Closes #712) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/720\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/720</a></li>\n<li>fix: use atomic rename for message store updates to prevent data loss on power failure (Closes #713) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/721\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/721</a></li>\n<li>fix: use modulo arithmetic for save_counter to prevent 22-day persistence gap (Closes #707) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/717\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/717</a></li>\n<li>fix: strip orphaned UTF-8 multi-byte start byte after truncation (Closes #708) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/718\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/718</a></li>\n<li>fix: use lv_obj_del_async() and add lv_obj_is_valid() guard in chat screen (Closes #711, Closes #714) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/719\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/719</a></li>\n<li>[codex] Add companion compatibility audit by @gadgethd in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/723\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/723</a></li>\n<li>Fix reproducible WebServer security patches in CI by @gadgethd in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/725\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/725</a></li>\n<li>fix: use millis() for PIN grace timing instead of mesh epoch (Closes #740) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/741\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/741</a></li>\n<li>fix: generate random per-device BLE PIN instead of hardcoded 123456 (Closes #742) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/743\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/743</a></li>\n<li>fix: use SPIFFS.begin(false) and remove nvs_flash_erase from factory reset (Closes #744) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/745\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/745</a></li>\n<li>fix: input and small-screen reliability improvements (Closes #746) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/747\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/747</a></li>\n<li>fix: per-message companion delivery tracking and metadata preservation (Closes #726) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/727\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/727</a></li>\n<li>fix: reload contact crypto state after companion private-key import (Closes #728) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/S\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/S</a>\n…</li>\n</ul>\n"
    },
    {
      "version": "beta-0.1.42-RC4",
      "name": "beta-0.1.42-RC4",
      "datetime": "2026-06-20T21:09:13Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.42-RC4",
      "prerelease": true,
      "notes": "**SigurdOS T-Deck Firmware** — beta-0.1.42-RC4\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse the manifest at `webflasher/manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `SigurdOS-tdeck-launcher.bin` | For bmorcelli/Launcher install (same bytes as merged) |\n\n\n## What's Changed\n* fix: scope radio param force-override to dedicated debug flag by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/626\n* [codex] docs: remove completed roadmap items by @gadgethd in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/638\n* fix: bug sweep — display init, GPS baud timeout, DM name buffer, channel routing, save counter overflow by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/641\n* [codex] ci: serialize release asset uploads by @gadgethd in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/640\n* T13: SD lazy retry — single attempt at boot, retry on demand by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/642\n* fix: QIO→DIO flash mode for PSRAM compatibility + CI smoke matrix expansion by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/662\n* fix: HAL — battery Li-ion lookup, trackball LEFT deadtime, BLE state ordering by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/664\n* fix: mesh — static sender buffer race + path discovery race by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/665\n* fix: UI — chart data, nav stack, trace timer, brightness, search state by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/666\n* fix: reset cache_clock on map reinit (#661) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/667\n* fix: SPIFFS flush before device reset + NVS write dedup in radio setup by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/663\n* fix: roomserver double-send + UTF-8 emoji truncation by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/668\n* fix: free outgoing screen on navigation to stop LVGL pool leak / freeze (#670) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/671\n* fix: theme change refreshes current screen immediately (#654) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/669\n* fix: null guard getRTCClock() in updateSignalSample (fixes #675) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/676\n* docs: correct HARDWARE.md inaccuracies and fix touch comment (fixes #679) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/680\n* fix: add missing P_LORA_* build flags for MeshCore visibility (fixes #677) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/681\n* chore: update MeshCore submodule to latest dev (fixes #678) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/682\n* ci: add debug and remote_test_radio builds to PR matrix by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/684\n* fix: restore Settings back navigation by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/674\n* fix: resolve Launcher warm-handoff freeze + settings crash by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/685\n* fix: chat channel-state corruption + harden WiFi OTA auth by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/689\n* fix: SPIFFS warning spam (#683) + navigation hang (#672) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/690\n\n\n**Full Changelog**: https://github.com/\n…",
      "notesHtml": "<p><strong>SigurdOS T-Deck Firmware</strong> — beta-0.1.42-RC4</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use the manifest at <code>webflasher/manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>SigurdOS-tdeck-launcher.bin</code></td>\n<td>For bmorcelli/Launcher install (same bytes as merged)</td>\n</tr>\n</tbody></table>\n<h2>What's Changed</h2>\n<ul>\n<li>fix: scope radio param force-override to dedicated debug flag by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/626\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/626</a></li>\n<li>[codex] docs: remove completed roadmap items by @gadgethd in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/638\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/638</a></li>\n<li>fix: bug sweep — display init, GPS baud timeout, DM name buffer, channel routing, save counter overflow by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/641\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/641</a></li>\n<li>[codex] ci: serialize release asset uploads by @gadgethd in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/640\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/640</a></li>\n<li>T13: SD lazy retry — single attempt at boot, retry on demand by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/642\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/642</a></li>\n<li>fix: QIO→DIO flash mode for PSRAM compatibility + CI smoke matrix expansion by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/662\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/662</a></li>\n<li>fix: HAL — battery Li-ion lookup, trackball LEFT deadtime, BLE state ordering by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/664\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/664</a></li>\n<li>fix: mesh — static sender buffer race + path discovery race by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/665\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/665</a></li>\n<li>fix: UI — chart data, nav stack, trace timer, brightness, search state by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/666\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/666</a></li>\n<li>fix: reset cache_clock on map reinit (#661) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/667\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/667</a></li>\n<li>fix: SPIFFS flush before device reset + NVS write dedup in radio setup by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/663\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/663</a></li>\n<li>fix: roomserver double-send + UTF-8 emoji truncation by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/668\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/668</a></li>\n<li>fix: free outgoing screen on navigation to stop LVGL pool leak / freeze (#670) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/671\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/671</a></li>\n<li>fix: theme change refreshes current screen immediately (#654) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/669\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/669</a></li>\n<li>fix: null guard getRTCClock() in updateSignalSample (fixes #675) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/676\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/676</a></li>\n<li>docs: correct HARDWARE.md inaccuracies and fix touch comment (fixes #679) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/680\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/680</a></li>\n<li>fix: add missing P_LORA_* build flags for MeshCore visibility (fixes #677) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/681\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/681</a></li>\n<li>chore: update MeshCore submodule to latest dev (fixes #678) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/682\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/682</a></li>\n<li>ci: add debug and remote_test_radio builds to PR matrix by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/684\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/684</a></li>\n<li>fix: restore Settings back navigation by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/674\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/674</a></li>\n<li>fix: resolve Launcher warm-handoff freeze + settings crash by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/685\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/685</a></li>\n<li>fix: chat channel-state corruption + harden WiFi OTA auth by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/689\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/689</a></li>\n<li>fix: SPIFFS warning spam (#683) + navigation hang (#672) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/690\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/690</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/</a>\n…</p>\n"
    },
    {
      "version": "beta-0.1.41.1",
      "name": "beta-0.1.41.1",
      "datetime": "2026-06-14T22:52:34Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.41.1",
      "prerelease": true,
      "notes": "**SigurdOS T-Deck Firmware** — beta-0.1.41.1\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse the manifest at `webflasher/manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `SigurdOS-tdeck-launcher.bin` | For bmorcelli/Launcher install (same bytes as merged) |\n\n\n**Full Changelog**: https://github.com/hermes-gadget/SigurdOS-tdeck/compare/beta-0.1.41...beta-0.1.41.1",
      "notesHtml": "<p><strong>SigurdOS T-Deck Firmware</strong> — beta-0.1.41.1</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use the manifest at <code>webflasher/manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>SigurdOS-tdeck-launcher.bin</code></td>\n<td>For bmorcelli/Launcher install (same bytes as merged)</td>\n</tr>\n</tbody></table>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/compare/beta-0.1.41...beta-0.1.41.1\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/compare/beta-0.1.41...beta-0.1.41.1</a></p>\n"
    },
    {
      "version": "beta-0.1.41",
      "name": "beta-0.1.41",
      "datetime": "2026-06-13T13:03:30Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.41",
      "prerelease": true,
      "notes": "**SigurdOS T-Deck Firmware** — beta-0.1.41\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse the manifest at `webflasher/manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `SigurdOS-tdeck-launcher.bin` | For bmorcelli/Launcher install (same bytes as merged) |\n\n\n## What's Changed\n* Fix fresh-install GPS defaults in prefs load by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/517\n* refactor: split 1707-line sigurd_mesh_v2.h into declaration header + .cpp implementation (#521) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/532\n* fix: replace delay(0) with delay(1) in tile scan loops to feed TWDT (#518) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/525\n* fix: apply consistent NVS getString return-value guards to all string fields (#523) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/529\n* fix: stop onAnonDataRecv from mutating packet buffer in-place; increase anon name entropy (#522, #524) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/527\n* maintainability: replace unsafe strcpy with strncpy; replace hardcoded buffer sizes with sizeof (#520) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/528\n* feat: multibyte path hash support (1/2/3-byte adverts & messages) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/533\n* fix: correct test module table syntax in README.md by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/534\n* docs: update README screenshots by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/535\n* feat: duration-limited auto-advert (24h/72h/168h) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/537\n* fix: auto-advert sends one advert per interval (24h/72h/168h), not every 30min by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/538\n* fix: forward channel messages to logged-in room servers by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/539\n* fix: correct guest permission display and hide admin-only controls by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/540\n* fix: use INPUT_PULLUP for trackball center click GPIO 0 (#549) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/554\n* fix: zero-initialize NVS string buffer in repeater password functions (#548) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/555\n* fix: increase SignalSample key from 2 to 4 bytes to prevent RSSI/SNR aliasing (#544) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/556\n* fix: stack buffer overflow in DM name formatting (#543) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/553\n* fix: add nvs_flash_erase() to factory reset for complete NVS wipe (#551) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/557\n* fix: block trackball events during PIN entry to prevent back-swipe bypass (#541) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/558\n* fix: stop I2C clock tug-of-war between touch (GT911) and keyboard (#547) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/559\n* docs: add OUT OF DATE warning to TELEMETRY_ARCHITECTURE.md (#550) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/560\n* fix: clamp append_channel_message capacity to actual buffer size to prevent OOB write (#542) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/561\n\n…",
      "notesHtml": "<p><strong>SigurdOS T-Deck Firmware</strong> — beta-0.1.41</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use the manifest at <code>webflasher/manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>SigurdOS-tdeck-launcher.bin</code></td>\n<td>For bmorcelli/Launcher install (same bytes as merged)</td>\n</tr>\n</tbody></table>\n<h2>What's Changed</h2>\n<ul>\n<li>Fix fresh-install GPS defaults in prefs load by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/517\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/517</a></li>\n<li>refactor: split 1707-line sigurd_mesh_v2.h into declaration header + .cpp implementation (#521) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/532\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/532</a></li>\n<li>fix: replace delay(0) with delay(1) in tile scan loops to feed TWDT (#518) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/525\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/525</a></li>\n<li>fix: apply consistent NVS getString return-value guards to all string fields (#523) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/529\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/529</a></li>\n<li>fix: stop onAnonDataRecv from mutating packet buffer in-place; increase anon name entropy (#522, #524) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/527\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/527</a></li>\n<li>maintainability: replace unsafe strcpy with strncpy; replace hardcoded buffer sizes with sizeof (#520) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/528\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/528</a></li>\n<li>feat: multibyte path hash support (1/2/3-byte adverts &amp; messages) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/533\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/533</a></li>\n<li>fix: correct test module table syntax in README.md by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/534\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/534</a></li>\n<li>docs: update README screenshots by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/535\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/535</a></li>\n<li>feat: duration-limited auto-advert (24h/72h/168h) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/537\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/537</a></li>\n<li>fix: auto-advert sends one advert per interval (24h/72h/168h), not every 30min by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/538\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/538</a></li>\n<li>fix: forward channel messages to logged-in room servers by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/539\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/539</a></li>\n<li>fix: correct guest permission display and hide admin-only controls by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/540\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/540</a></li>\n<li>fix: use INPUT_PULLUP for trackball center click GPIO 0 (#549) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/554\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/554</a></li>\n<li>fix: zero-initialize NVS string buffer in repeater password functions (#548) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/555\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/555</a></li>\n<li>fix: increase SignalSample key from 2 to 4 bytes to prevent RSSI/SNR aliasing (#544) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/556\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/556</a></li>\n<li>fix: stack buffer overflow in DM name formatting (#543) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/553\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/553</a></li>\n<li>fix: add nvs_flash_erase() to factory reset for complete NVS wipe (#551) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/557\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/557</a></li>\n<li>fix: block trackball events during PIN entry to prevent back-swipe bypass (#541) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/558\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/558</a></li>\n<li>fix: stop I2C clock tug-of-war between touch (GT911) and keyboard (#547) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/559\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/559</a></li>\n<li>docs: add OUT OF DATE warning to TELEMETRY_ARCHITECTURE.md (#550) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/560\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/560</a></li>\n<li>fix: clamp append_channel_message capacity to actual buffer size to prevent OOB write (#542) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/561\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/561</a></li>\n</ul>\n<p>…</p>\n"
    },
    {
      "version": "beta-0.1.40",
      "name": "beta-0.1.40",
      "datetime": "2026-06-07T14:38:27Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.40",
      "prerelease": true,
      "notes": "**SigurdOS T-Deck Firmware** — beta-0.1.40\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse the manifest at `webflasher/manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n\n\n## What's Changed\n* fix: remove double-queue of received mesh messages by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/336\n* fix: PIN screen crash on unlock — three bugs by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/337\n* fix: persist custom RF settings to NVS on apply by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/338\n* fix: DM navigation crash when opening from Heard/Contacts by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/339\n* feat: structured telemetry for AI agent monitoring by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/340\n* fix: RC1 feedback — UI stability, validation, crash fixes by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/335\n* docs: companion-only Regions (flood-scope) implementation plan by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/342\n* feat: Regions — companion flood scope (transport-code scoped flooding) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/343\n* fix: regions UX — auto-prefix bare names + Alt+R shortcut by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/346\n* docs: Companion BLE — connect to the official MeshCore phone app (plan) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/345\n* [codex] harden channel name boundaries by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/362\n* [codex] filter invalid keyboard injection bytes by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/366\n* [codex] reject invalid injected trackball events by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/368\n* [codex] harden emoji search output bounds by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/370\n* [codex] harden UTF-8 truncation byte limits by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/372\n* [codex] fix telemetry heartbeat ring wrap indexing by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/374\n* [codex] reject invalid telemetry trackball directions by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/376\n* [codex] bound telemetry crash backtrace counts by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/378\n* [codex] guard telemetry task watermark output by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/380\n* [codex] guard telemetry packet log fields by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/382\n* [codex] expose battery conversion helpers by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/384\n* [codex] harden SD-card path validation by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/386\n* [codex] expose GT911 touch point parser by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/388\n* [codex] expose buzzer pattern helpers by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/390\n* [codex] guard QR canvas layout bounds by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/394\n* [codex] expose map renderer math helpers by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/396\n* [codex] expose T-Deck battery threshold helper by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/398\n* [codex] harden WiFi scan result ordering by @n30nex \n…",
      "notesHtml": "<p><strong>SigurdOS T-Deck Firmware</strong> — beta-0.1.40</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use the manifest at <code>webflasher/manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n</tbody></table>\n<h2>What's Changed</h2>\n<ul>\n<li>fix: remove double-queue of received mesh messages by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/336\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/336</a></li>\n<li>fix: PIN screen crash on unlock — three bugs by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/337\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/337</a></li>\n<li>fix: persist custom RF settings to NVS on apply by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/338\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/338</a></li>\n<li>fix: DM navigation crash when opening from Heard/Contacts by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/339\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/339</a></li>\n<li>feat: structured telemetry for AI agent monitoring by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/340\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/340</a></li>\n<li>fix: RC1 feedback — UI stability, validation, crash fixes by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/335\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/335</a></li>\n<li>docs: companion-only Regions (flood-scope) implementation plan by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/342\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/342</a></li>\n<li>feat: Regions — companion flood scope (transport-code scoped flooding) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/343\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/343</a></li>\n<li>fix: regions UX — auto-prefix bare names + Alt+R shortcut by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/346\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/346</a></li>\n<li>docs: Companion BLE — connect to the official MeshCore phone app (plan) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/345\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/345</a></li>\n<li>[codex] harden channel name boundaries by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/362\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/362</a></li>\n<li>[codex] filter invalid keyboard injection bytes by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/366\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/366</a></li>\n<li>[codex] reject invalid injected trackball events by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/368\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/368</a></li>\n<li>[codex] harden emoji search output bounds by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/370\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/370</a></li>\n<li>[codex] harden UTF-8 truncation byte limits by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/372\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/372</a></li>\n<li>[codex] fix telemetry heartbeat ring wrap indexing by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/374\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/374</a></li>\n<li>[codex] reject invalid telemetry trackball directions by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/376\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/376</a></li>\n<li>[codex] bound telemetry crash backtrace counts by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/378\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/378</a></li>\n<li>[codex] guard telemetry task watermark output by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/380\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/380</a></li>\n<li>[codex] guard telemetry packet log fields by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/382\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/382</a></li>\n<li>[codex] expose battery conversion helpers by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/384\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/384</a></li>\n<li>[codex] harden SD-card path validation by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/386\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/386</a></li>\n<li>[codex] expose GT911 touch point parser by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/388\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/388</a></li>\n<li>[codex] expose buzzer pattern helpers by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/390\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/390</a></li>\n<li>[codex] guard QR canvas layout bounds by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/394\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/394</a></li>\n<li>[codex] expose map renderer math helpers by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/396\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/396</a></li>\n<li>[codex] expose T-Deck battery threshold helper by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/398\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/398</a></li>\n<li>[codex] harden WiFi scan result ordering by @n30nex \n…</li>\n</ul>\n"
    },
    {
      "version": "beta-0.1.39",
      "name": "beta-0.1.39",
      "datetime": "2026-06-03T00:52:43Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.39",
      "prerelease": true,
      "notes": "**SigurdOS T-Deck Firmware** — beta-0.1.39\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse the manifest at `webflasher/manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `webflasher/sigurdos-tdeck-firmware.bin` | App update |\n| `webflasher/sigurdos-tdeck-full.bin` | Full flash |\n| `webflasher/sigurdos-tdeck-bootloader.bin` | Bootloader |\n| `webflasher/sigurdos-tdeck-partitions.bin` | Partition table |\n| `webflasher/manifest.json` | Web flasher manifest |\n\n\n## What's Changed\n* feat: Factory reset from Settings System screen (#274) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/275\n* feat: Node stats diagnostics panel (#276) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/277\n* docs: audit ROADMAP against MeshCore companion firmware v1.15.0 by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/279\n* docs: reconcile MISSING_FEATURES.md with companion firmware v1.15.0 (protected file) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/281\n* docs: code-audit findings for KNOWN_ISSUES.md (protected file) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/283\n* fix: defer factory-reset Cancel dialog deletion (use-after-free) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/285\n* fix: add confirmation dialog before channel deletion (Closes #287) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/289\n* fix: remove dead V1 mesh class sigurd_mesh.h (Closes #286) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/290\n* fix: add byte counter to chat input, block at 149 bytes (Closes #288) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/291\n* docs: sync MISSING_FEATURES.md with current firmware, decouple from roadmap by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/293\n* feat: add Multi-ACK reliability toggle to Radio Setup by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/296\n* feat: add Node type selector to Settings > Radio/Mesh by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/298\n* feat: add buzzer notification on message arrival by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/300\n* feat: add Reboot button to Settings > System (Closes #313) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/314\n* feat: add storage usage display to Node Stats panel (Closes #309) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/315\n* feat: show hop count in contact detail path display (Closes #308) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/316\n* feat: add message signing via Terminal sign command (Closes #307) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/317\n* feat: telemetry answer in SigurdMeshV2::onContactRequest (#301) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/318\n* feat: implement client-repeat mode (#306) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/319\n* feat: add identity backup via Terminal exportkey/importkey (Closes #303) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/320\n* feat: render contact locations as markers on Map screen (Closes #302) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/321\n* feat: add meshcore:// URI import via Terminal command by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/322\n* \n…",
      "notesHtml": "<p><strong>SigurdOS T-Deck Firmware</strong> — beta-0.1.39</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use the manifest at <code>webflasher/manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>webflasher/sigurdos-tdeck-firmware.bin</code></td>\n<td>App update</td>\n</tr>\n<tr>\n<td><code>webflasher/sigurdos-tdeck-full.bin</code></td>\n<td>Full flash</td>\n</tr>\n<tr>\n<td><code>webflasher/sigurdos-tdeck-bootloader.bin</code></td>\n<td>Bootloader</td>\n</tr>\n<tr>\n<td><code>webflasher/sigurdos-tdeck-partitions.bin</code></td>\n<td>Partition table</td>\n</tr>\n<tr>\n<td><code>webflasher/manifest.json</code></td>\n<td>Web flasher manifest</td>\n</tr>\n</tbody></table>\n<h2>What's Changed</h2>\n<ul>\n<li>feat: Factory reset from Settings System screen (#274) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/275\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/275</a></li>\n<li>feat: Node stats diagnostics panel (#276) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/277\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/277</a></li>\n<li>docs: audit ROADMAP against MeshCore companion firmware v1.15.0 by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/279\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/279</a></li>\n<li>docs: reconcile MISSING_FEATURES.md with companion firmware v1.15.0 (protected file) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/281\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/281</a></li>\n<li>docs: code-audit findings for KNOWN_ISSUES.md (protected file) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/283\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/283</a></li>\n<li>fix: defer factory-reset Cancel dialog deletion (use-after-free) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/285\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/285</a></li>\n<li>fix: add confirmation dialog before channel deletion (Closes #287) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/289\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/289</a></li>\n<li>fix: remove dead V1 mesh class sigurd_mesh.h (Closes #286) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/290\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/290</a></li>\n<li>fix: add byte counter to chat input, block at 149 bytes (Closes #288) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/291\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/291</a></li>\n<li>docs: sync MISSING_FEATURES.md with current firmware, decouple from roadmap by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/293\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/293</a></li>\n<li>feat: add Multi-ACK reliability toggle to Radio Setup by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/296\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/296</a></li>\n<li>feat: add Node type selector to Settings &gt; Radio/Mesh by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/298\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/298</a></li>\n<li>feat: add buzzer notification on message arrival by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/300\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/300</a></li>\n<li>feat: add Reboot button to Settings &gt; System (Closes #313) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/314\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/314</a></li>\n<li>feat: add storage usage display to Node Stats panel (Closes #309) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/315\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/315</a></li>\n<li>feat: show hop count in contact detail path display (Closes #308) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/316\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/316</a></li>\n<li>feat: add message signing via Terminal sign command (Closes #307) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/317\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/317</a></li>\n<li>feat: telemetry answer in SigurdMeshV2::onContactRequest (#301) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/318\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/318</a></li>\n<li>feat: implement client-repeat mode (#306) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/319\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/319</a></li>\n<li>feat: add identity backup via Terminal exportkey/importkey (Closes #303) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/320\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/320</a></li>\n<li>feat: render contact locations as markers on Map screen (Closes #302) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/321\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/321</a></li>\n<li>feat: add meshcore:// URI import via Terminal command by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/322\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/322</a></li>\n<li></li>\n</ul>\n<p>…</p>\n"
    },
    {
      "version": "beta-0.1.38",
      "name": "beta-0.1.38",
      "datetime": "2026-06-01T21:42:22Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.38",
      "prerelease": true,
      "notes": "**SigurdOS T-Deck Firmware** — beta-0.1.38\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse the manifest at `webflasher/manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `webflasher/sigurdos-tdeck-firmware.bin` | App update |\n| `webflasher/sigurdos-tdeck-full.bin` | Full flash |\n| `webflasher/sigurdos-tdeck-bootloader.bin` | Bootloader |\n| `webflasher/sigurdos-tdeck-partitions.bin` | Partition table |\n| `webflasher/manifest.json` | Web flasher manifest |\n\n\n## What's Changed\n* feat: generic binary-request framework with tagged response dispatch (Phase 4.1) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/252\n* feat: status request — REQ_TYPE_GET_STATUS with UI (Phase 4.2) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/254\n* Phase 4.3: Telemetry request with CayenneLPP parsing + TelemetryScreen by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/256\n* Phase 4.4: Path discovery request via flood-force routing by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/257\n* feat: repeater/room login with admin commands (Phase 4.5) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/259\n* feat: anonymous message send/receive (Phase 4.7) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/260\n* feat: room server message fetch (Phase 4.6) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/263\n* feat: group data datagrams (Phase 4.8) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/265\n* chore: enable mesh debug logging in remote_test_radio build by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/271\n* feat: home screen DMs/ROOMS icons with chat/contacts filtering by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/269\n* fix: address Claude Code review findings by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/273\n* Update README.md by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/261\n* test: cover RX boost preference behavior by @n30nex in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/267\n* feat: repeater login UI with password persistence, compact layout, and recent-first sort by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/266\n\n\n**Full Changelog**: https://github.com/hermes-gadget/SigurdOS-tdeck/compare/beta-0.1.37...beta-0.1.38",
      "notesHtml": "<p><strong>SigurdOS T-Deck Firmware</strong> — beta-0.1.38</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use the manifest at <code>webflasher/manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>webflasher/sigurdos-tdeck-firmware.bin</code></td>\n<td>App update</td>\n</tr>\n<tr>\n<td><code>webflasher/sigurdos-tdeck-full.bin</code></td>\n<td>Full flash</td>\n</tr>\n<tr>\n<td><code>webflasher/sigurdos-tdeck-bootloader.bin</code></td>\n<td>Bootloader</td>\n</tr>\n<tr>\n<td><code>webflasher/sigurdos-tdeck-partitions.bin</code></td>\n<td>Partition table</td>\n</tr>\n<tr>\n<td><code>webflasher/manifest.json</code></td>\n<td>Web flasher manifest</td>\n</tr>\n</tbody></table>\n<h2>What's Changed</h2>\n<ul>\n<li>feat: generic binary-request framework with tagged response dispatch (Phase 4.1) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/252\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/252</a></li>\n<li>feat: status request — REQ_TYPE_GET_STATUS with UI (Phase 4.2) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/254\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/254</a></li>\n<li>Phase 4.3: Telemetry request with CayenneLPP parsing + TelemetryScreen by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/256\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/256</a></li>\n<li>Phase 4.4: Path discovery request via flood-force routing by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/257\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/257</a></li>\n<li>feat: repeater/room login with admin commands (Phase 4.5) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/259\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/259</a></li>\n<li>feat: anonymous message send/receive (Phase 4.7) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/260\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/260</a></li>\n<li>feat: room server message fetch (Phase 4.6) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/263\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/263</a></li>\n<li>feat: group data datagrams (Phase 4.8) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/265\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/265</a></li>\n<li>chore: enable mesh debug logging in remote_test_radio build by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/271\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/271</a></li>\n<li>feat: home screen DMs/ROOMS icons with chat/contacts filtering by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/269\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/269</a></li>\n<li>fix: address Claude Code review findings by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/273\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/273</a></li>\n<li>Update README.md by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/261\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/261</a></li>\n<li>test: cover RX boost preference behavior by @n30nex in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/267\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/267</a></li>\n<li>feat: repeater login UI with password persistence, compact layout, and recent-first sort by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/pull/266\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/pull/266</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/hermes-gadget/SigurdOS-tdeck/compare/beta-0.1.37...beta-0.1.38\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SigurdOS-tdeck/compare/beta-0.1.37...beta-0.1.38</a></p>\n"
    },
    {
      "version": "beta-0.1.37",
      "name": "beta-0.1.37",
      "datetime": "2026-05-30T17:05:11Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.37",
      "prerelease": true,
      "notes": "**SlopOS T-Deck Firmware** — beta-0.1.37\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse the manifest at `webflasher/manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `webflasher/slopos-tdeck-firmware.bin` | App update |\n| `webflasher/slopos-tdeck-full.bin` | Full flash |\n| `webflasher/slopos-tdeck-bootloader.bin` | Bootloader |\n| `webflasher/slopos-tdeck-partitions.bin` | Partition table |\n| `webflasher/manifest.json` | Web flasher manifest |\n\n\n## What's Changed\n* feat: Phase 0 — SlopMeshV2 (BaseChatMesh migration infrastructure) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/223\n* feat: Phase 0 cutover — SlopMeshV2 is now the default by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/224\n* fix: UI cleanup — remove #channels top bar, eye icon, scrollbars by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/225\n* docs: mark Phase 0 and Phase 1 completed in ROADMAP.md by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/226\n* feat: GPS enable/read-interval controls (Phase 2.5) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/227\n* feat: auto-add contact type config (Phase 2.3) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/228\n* feat: custom variables key-value store (Phase 2.6) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/229\n* docs: mark Phase 2 completed in roadmap by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/230\n* feat: message delivery status (ACK ticks) in chat bubbles by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/232\n* feat: message search in chat by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/234\n* feat: per-contact RSSI/SNR history with sparkline chart by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/236\n* fix: ACK checkmark not visible on DM messages by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/238\n* feat: persist contacts list across reboots and flashes by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/240\n* Fix: hide delete button on synthetic DM channel entries by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/242\n* feat: runtime theme system with NVS persistence by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/244\n* feat: organize settings into category submenus by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/246\n* fix: meaningful home screen icons for ADVERTISE, TRACE, SETUP by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/248\n* Fix: PendingAck in_use init and persist 4 unpersisted NodePrefs fields by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/250\n\n\n**Full Changelog**: https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.36...beta-0.1.37",
      "notesHtml": "<p><strong>SlopOS T-Deck Firmware</strong> — beta-0.1.37</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use the manifest at <code>webflasher/manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-firmware.bin</code></td>\n<td>App update</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-full.bin</code></td>\n<td>Full flash</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-bootloader.bin</code></td>\n<td>Bootloader</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-partitions.bin</code></td>\n<td>Partition table</td>\n</tr>\n<tr>\n<td><code>webflasher/manifest.json</code></td>\n<td>Web flasher manifest</td>\n</tr>\n</tbody></table>\n<h2>What's Changed</h2>\n<ul>\n<li>feat: Phase 0 — SlopMeshV2 (BaseChatMesh migration infrastructure) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/223\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/223</a></li>\n<li>feat: Phase 0 cutover — SlopMeshV2 is now the default by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/224\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/224</a></li>\n<li>fix: UI cleanup — remove #channels top bar, eye icon, scrollbars by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/225\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/225</a></li>\n<li>docs: mark Phase 0 and Phase 1 completed in ROADMAP.md by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/226\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/226</a></li>\n<li>feat: GPS enable/read-interval controls (Phase 2.5) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/227\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/227</a></li>\n<li>feat: auto-add contact type config (Phase 2.3) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/228\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/228</a></li>\n<li>feat: custom variables key-value store (Phase 2.6) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/229\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/229</a></li>\n<li>docs: mark Phase 2 completed in roadmap by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/230\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/230</a></li>\n<li>feat: message delivery status (ACK ticks) in chat bubbles by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/232\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/232</a></li>\n<li>feat: message search in chat by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/234\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/234</a></li>\n<li>feat: per-contact RSSI/SNR history with sparkline chart by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/236\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/236</a></li>\n<li>fix: ACK checkmark not visible on DM messages by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/238\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/238</a></li>\n<li>feat: persist contacts list across reboots and flashes by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/240\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/240</a></li>\n<li>Fix: hide delete button on synthetic DM channel entries by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/242\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/242</a></li>\n<li>feat: runtime theme system with NVS persistence by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/244\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/244</a></li>\n<li>feat: organize settings into category submenus by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/246\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/246</a></li>\n<li>fix: meaningful home screen icons for ADVERTISE, TRACE, SETUP by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/248\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/248</a></li>\n<li>Fix: PendingAck in_use init and persist 4 unpersisted NodePrefs fields by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/250\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/250</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.36...beta-0.1.37\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.36...beta-0.1.37</a></p>\n"
    },
    {
      "version": "beta-0.1.36",
      "name": "beta-0.1.36",
      "datetime": "2026-05-29T16:56:03Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.36",
      "prerelease": true,
      "notes": "**SlopOS T-Deck Firmware** — beta-0.1.36\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse the manifest at `webflasher/manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `webflasher/slopos-tdeck-firmware.bin` | App update |\n| `webflasher/slopos-tdeck-full.bin` | Full flash |\n| `webflasher/slopos-tdeck-bootloader.bin` | Bootloader |\n| `webflasher/slopos-tdeck-partitions.bin` | Partition table |\n| `webflasher/manifest.json` | Web flasher manifest |\n\n\n## What's Changed\n* fix: mesh and UI layer bug fixes (10 issues) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/192\n* fix: HAL driver layer bug fixes (7 issues) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/193\n* fix: map tile discovery truncation and update KNOWN_ISSUES.md by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/194\n* feat: add SlopOS_TDeck_remote_test_radio — hybrid build with radio + test controller by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/195\n* docs: audit MISSING_FEATURES.md + add ROADMAP.md by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/197\n* feat: Channel removal from UI (#198) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/199\n* fix: chat channel list layout — scrollbars, overlap, preview truncation by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/206\n* feat: Contact removal from UI (#200) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/201\n* feat: Reset path to a contact (#202) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/203\n* fix: guard display serial reader behind !SLOPOS_REMOTE_TEST by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/208\n* feat: auto-scroll chat to new messages only when at bottom by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/209\n* fix: strdup contact name for Reset Path button to prevent use-after-free (#210) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/216\n* fix: restore DM conversation history on reboot by creating pseudo-channels on load (#211) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/217\n* fix: sendTrace() passes encoded path_len to sendDirect(), matching sendTextTo() (#212) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/218\n* fix: use temp buffer for NVS node_name load to preserve default (#213) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/219\n* perf: allocate fallback display buffer dynamically instead of static (#214) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/220\n* fix: add LORA_TX_PWR build flag to actually control TX power (#215) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/221\n* chore: code cleanup batch from audit info items by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/222\n\n\n**Full Changelog**: https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.35...beta-0.1.36",
      "notesHtml": "<p><strong>SlopOS T-Deck Firmware</strong> — beta-0.1.36</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use the manifest at <code>webflasher/manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-firmware.bin</code></td>\n<td>App update</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-full.bin</code></td>\n<td>Full flash</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-bootloader.bin</code></td>\n<td>Bootloader</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-partitions.bin</code></td>\n<td>Partition table</td>\n</tr>\n<tr>\n<td><code>webflasher/manifest.json</code></td>\n<td>Web flasher manifest</td>\n</tr>\n</tbody></table>\n<h2>What's Changed</h2>\n<ul>\n<li>fix: mesh and UI layer bug fixes (10 issues) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/192\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/192</a></li>\n<li>fix: HAL driver layer bug fixes (7 issues) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/193\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/193</a></li>\n<li>fix: map tile discovery truncation and update KNOWN_ISSUES.md by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/194\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/194</a></li>\n<li>feat: add SlopOS_TDeck_remote_test_radio — hybrid build with radio + test controller by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/195\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/195</a></li>\n<li>docs: audit MISSING_FEATURES.md + add ROADMAP.md by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/197\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/197</a></li>\n<li>feat: Channel removal from UI (#198) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/199\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/199</a></li>\n<li>fix: chat channel list layout — scrollbars, overlap, preview truncation by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/206\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/206</a></li>\n<li>feat: Contact removal from UI (#200) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/201\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/201</a></li>\n<li>feat: Reset path to a contact (#202) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/203\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/203</a></li>\n<li>fix: guard display serial reader behind !SLOPOS_REMOTE_TEST by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/208\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/208</a></li>\n<li>feat: auto-scroll chat to new messages only when at bottom by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/209\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/209</a></li>\n<li>fix: strdup contact name for Reset Path button to prevent use-after-free (#210) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/216\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/216</a></li>\n<li>fix: restore DM conversation history on reboot by creating pseudo-channels on load (#211) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/217\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/217</a></li>\n<li>fix: sendTrace() passes encoded path_len to sendDirect(), matching sendTextTo() (#212) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/218\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/218</a></li>\n<li>fix: use temp buffer for NVS node_name load to preserve default (#213) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/219\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/219</a></li>\n<li>perf: allocate fallback display buffer dynamically instead of static (#214) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/220\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/220</a></li>\n<li>fix: add LORA_TX_PWR build flag to actually control TX power (#215) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/221\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/221</a></li>\n<li>chore: code cleanup batch from audit info items by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/222\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/222</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.35...beta-0.1.36\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.35...beta-0.1.36</a></p>\n"
    },
    {
      "version": "beta-0.1.35",
      "name": "beta-0.1.35",
      "datetime": "2026-05-28T18:42:23Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.35",
      "prerelease": true,
      "notes": "**SlopOS T-Deck Firmware** — beta-0.1.35\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse the manifest at `webflasher/manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `webflasher/slopos-tdeck-firmware.bin` | App update |\n| `webflasher/slopos-tdeck-full.bin` | Full flash |\n| `webflasher/slopos-tdeck-bootloader.bin` | Bootloader |\n| `webflasher/slopos-tdeck-partitions.bin` | Partition table |\n| `webflasher/manifest.json` | Web flasher manifest |\n\n\n## What's Changed\n* fix: LVGL focus indicators — blue ACCENT on textareas (trackball/keyboard) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/172\n* fix: radio stays powered on when not configured by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/173\n* fix: show radio setup warning in home top bar, remove channel hashtags by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/175\n* fix: cache scan_y_range results to halve map tile discovery SD ops during boot by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/178\n* feat: contact details screen (Phase 1) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/180\n* feat: two-column layout for Signal screen by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/183\n* fix: clamp chat scroll at first/last message boundaries by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/185\n* feat: replace signal bars with iOS-style signal dots by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/187\n* feat: add setrf, reboot, and advert serial test commands by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/189\n* docs: cleanup KNOWN_ISSUES.md, update README test counts and module list by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/191\n\n\n**Full Changelog**: https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.34...beta-0.1.35",
      "notesHtml": "<p><strong>SlopOS T-Deck Firmware</strong> — beta-0.1.35</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use the manifest at <code>webflasher/manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-firmware.bin</code></td>\n<td>App update</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-full.bin</code></td>\n<td>Full flash</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-bootloader.bin</code></td>\n<td>Bootloader</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-partitions.bin</code></td>\n<td>Partition table</td>\n</tr>\n<tr>\n<td><code>webflasher/manifest.json</code></td>\n<td>Web flasher manifest</td>\n</tr>\n</tbody></table>\n<h2>What's Changed</h2>\n<ul>\n<li>fix: LVGL focus indicators — blue ACCENT on textareas (trackball/keyboard) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/172\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/172</a></li>\n<li>fix: radio stays powered on when not configured by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/173\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/173</a></li>\n<li>fix: show radio setup warning in home top bar, remove channel hashtags by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/175\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/175</a></li>\n<li>fix: cache scan_y_range results to halve map tile discovery SD ops during boot by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/178\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/178</a></li>\n<li>feat: contact details screen (Phase 1) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/180\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/180</a></li>\n<li>feat: two-column layout for Signal screen by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/183\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/183</a></li>\n<li>fix: clamp chat scroll at first/last message boundaries by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/185\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/185</a></li>\n<li>feat: replace signal bars with iOS-style signal dots by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/187\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/187</a></li>\n<li>feat: add setrf, reboot, and advert serial test commands by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/189\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/189</a></li>\n<li>docs: cleanup KNOWN_ISSUES.md, update README test counts and module list by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/191\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/191</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.34...beta-0.1.35\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.34...beta-0.1.35</a></p>\n"
    },
    {
      "version": "beta-0.1.34",
      "name": "beta-0.1.34",
      "datetime": "2026-05-27T21:42:31Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.34",
      "prerelease": true,
      "notes": "**SlopOS T-Deck Firmware** — beta-0.1.34\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse the manifest at `webflasher/manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `webflasher/slopos-tdeck-firmware.bin` | App update |\n| `webflasher/slopos-tdeck-full.bin` | Full flash |\n| `webflasher/slopos-tdeck-bootloader.bin` | Bootloader |\n| `webflasher/slopos-tdeck-partitions.bin` | Partition table |\n| `webflasher/manifest.json` | Web flasher manifest |\n\n\n## What's Changed\n* fix: debug/test build improvements — #ifndef guards, mesh::loop in remote_test, SEND command, sendchannel, auto-reply by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/144\n* feat: graceful power-off from Settings screen (#145) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/146\n* feat: unread message badges on home screen (#149) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/150\n* feat: display brightness control in Settings (#151) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/152\n* feat: auto-backlight timeout control in Settings (#153) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/154\n* feat: flood max hops setting (#157) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/158\n* feat: GPS location sharing policy toggle in Settings (#155) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/156\n* feat: contact SNR display in Contacts and Repeaters screens by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/159\n* feat: TX/RX delay tuning in Settings by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/161\n* feat: TX/RX airtime display on Signal screen by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/163\n* feat: packet statistics display on Signal screen by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/165\n* feat: GPS clock sync on first valid fix by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/167\n* feat: PSK channel import via Add Channel dialog (Closes #168) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/169\n\n\n**Full Changelog**: https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.33...beta-0.1.34",
      "notesHtml": "<p><strong>SlopOS T-Deck Firmware</strong> — beta-0.1.34</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use the manifest at <code>webflasher/manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-firmware.bin</code></td>\n<td>App update</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-full.bin</code></td>\n<td>Full flash</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-bootloader.bin</code></td>\n<td>Bootloader</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-partitions.bin</code></td>\n<td>Partition table</td>\n</tr>\n<tr>\n<td><code>webflasher/manifest.json</code></td>\n<td>Web flasher manifest</td>\n</tr>\n</tbody></table>\n<h2>What's Changed</h2>\n<ul>\n<li>fix: debug/test build improvements — #ifndef guards, mesh::loop in remote_test, SEND command, sendchannel, auto-reply by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/144\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/144</a></li>\n<li>feat: graceful power-off from Settings screen (#145) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/146\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/146</a></li>\n<li>feat: unread message badges on home screen (#149) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/150\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/150</a></li>\n<li>feat: display brightness control in Settings (#151) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/152\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/152</a></li>\n<li>feat: auto-backlight timeout control in Settings (#153) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/154\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/154</a></li>\n<li>feat: flood max hops setting (#157) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/158\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/158</a></li>\n<li>feat: GPS location sharing policy toggle in Settings (#155) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/156\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/156</a></li>\n<li>feat: contact SNR display in Contacts and Repeaters screens by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/159\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/159</a></li>\n<li>feat: TX/RX delay tuning in Settings by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/161\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/161</a></li>\n<li>feat: TX/RX airtime display on Signal screen by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/163\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/163</a></li>\n<li>feat: packet statistics display on Signal screen by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/165\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/165</a></li>\n<li>feat: GPS clock sync on first valid fix by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/167\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/167</a></li>\n<li>feat: PSK channel import via Add Channel dialog (Closes #168) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/169\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/169</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.33...beta-0.1.34\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.33...beta-0.1.34</a></p>\n"
    },
    {
      "version": "beta-0.1.33",
      "name": "beta-0.1.33",
      "datetime": "2026-05-27T08:01:30Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.33",
      "prerelease": true,
      "notes": "**SlopOS T-Deck Firmware** — beta-0.1.33\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse the manifest at `webflasher/manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `webflasher/slopos-tdeck-firmware.bin` | App update |\n| `webflasher/slopos-tdeck-full.bin` | Full flash |\n| `webflasher/slopos-tdeck-bootloader.bin` | Bootloader |\n| `webflasher/slopos-tdeck-partitions.bin` | Partition table |\n| `webflasher/manifest.json` | Web flasher manifest |\n\n\n## What's Changed\n* fix: batch resolve 8 potential bugs from code audit by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/51\n* fix: properly truncate channel preview text to avoid timestamp/badge overlap by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/55\n* feat: add term-submit and term-log for remote test controller by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/57\n* feat: add help command with detail lookup to terminal screen by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/58\n* Signal bars: per-node RSSI pixel-art indicator by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/60\n* Debug: log RSSI/SNR on received packets by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/62\n* feat: add debug level system and display-always-on for debug builds by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/53\n* fix: UTF-8 safe truncation for emoji multi-byte codepoints in send path by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/68\n* docs: audit KNOWN_ISSUES.md — remove fixed entries, add 5 new bugs by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/70\n* fix: address 5 bugs from KNOWN_ISSUES audit by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/72\n* fix: add stub implementations for term_* functions (fixes remote_test build) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/74\n* Add pull request CI for firmware build and native tests by @n30nex in https://github.com/hermes-gadget/SlopOS-tdeck/pull/52\n* docs: remove fixed/stale entries from KNOWN_ISSUES.md by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/76\n* Universal trackball back-swipe (two-swipe commit) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/78\n* Fix: dangling s_back_btn pointer causes crash on screen navigation by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/80\n* feat: per-feature debug flags with independent compile-time and runtime control by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/82\n* fix: call mesh::init() in remote_test to prime shared SPI bus for SD card by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/87\n* docs: add MISSING_FEATURES.md — MeshCore capability gap reference by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/85\n* docs: add MISSING_FEATURES.md references to agent onboarding and contributing guide by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/88\n* reorg: move reference docs into docs/ folder by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/89\n* fix: ensure correct I2C clock speed per device (touch 400kHz, keyboard 100kHz) by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/91\n* fix: add rate limiting to sendAdvert() at API layer by @hermes-gadget in https://github.com/hermes-gadget/SlopOS-tdeck/pull/93\n* fix: compare full 32-byte channel hash instead of first byte only by @hermes-gadge\n…",
      "notesHtml": "<p><strong>SlopOS T-Deck Firmware</strong> — beta-0.1.33</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use the manifest at <code>webflasher/manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-firmware.bin</code></td>\n<td>App update</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-full.bin</code></td>\n<td>Full flash</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-bootloader.bin</code></td>\n<td>Bootloader</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-partitions.bin</code></td>\n<td>Partition table</td>\n</tr>\n<tr>\n<td><code>webflasher/manifest.json</code></td>\n<td>Web flasher manifest</td>\n</tr>\n</tbody></table>\n<h2>What's Changed</h2>\n<ul>\n<li>fix: batch resolve 8 potential bugs from code audit by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/51\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/51</a></li>\n<li>fix: properly truncate channel preview text to avoid timestamp/badge overlap by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/55\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/55</a></li>\n<li>feat: add term-submit and term-log for remote test controller by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/57\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/57</a></li>\n<li>feat: add help command with detail lookup to terminal screen by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/58\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/58</a></li>\n<li>Signal bars: per-node RSSI pixel-art indicator by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/60\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/60</a></li>\n<li>Debug: log RSSI/SNR on received packets by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/62\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/62</a></li>\n<li>feat: add debug level system and display-always-on for debug builds by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/53\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/53</a></li>\n<li>fix: UTF-8 safe truncation for emoji multi-byte codepoints in send path by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/68\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/68</a></li>\n<li>docs: audit KNOWN_ISSUES.md — remove fixed entries, add 5 new bugs by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/70\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/70</a></li>\n<li>fix: address 5 bugs from KNOWN_ISSUES audit by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/72\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/72</a></li>\n<li>fix: add stub implementations for term_* functions (fixes remote_test build) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/74\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/74</a></li>\n<li>Add pull request CI for firmware build and native tests by @n30nex in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/52\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/52</a></li>\n<li>docs: remove fixed/stale entries from KNOWN_ISSUES.md by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/76\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/76</a></li>\n<li>Universal trackball back-swipe (two-swipe commit) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/78\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/78</a></li>\n<li>Fix: dangling s_back_btn pointer causes crash on screen navigation by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/80\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/80</a></li>\n<li>feat: per-feature debug flags with independent compile-time and runtime control by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/82\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/82</a></li>\n<li>fix: call mesh::init() in remote_test to prime shared SPI bus for SD card by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/87\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/87</a></li>\n<li>docs: add MISSING_FEATURES.md — MeshCore capability gap reference by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/85\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/85</a></li>\n<li>docs: add MISSING_FEATURES.md references to agent onboarding and contributing guide by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/88\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/88</a></li>\n<li>reorg: move reference docs into docs/ folder by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/89\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/89</a></li>\n<li>fix: ensure correct I2C clock speed per device (touch 400kHz, keyboard 100kHz) by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/91\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/91</a></li>\n<li>fix: add rate limiting to sendAdvert() at API layer by @hermes-gadget in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/93\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/93</a></li>\n<li>fix: compare full 32-byte channel hash instead of first byte only by @hermes-gadge\n…</li>\n</ul>\n"
    },
    {
      "version": "beta-0.1.32",
      "name": "beta-0.1.32",
      "datetime": "2026-05-24T21:56:04Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.32",
      "prerelease": true,
      "notes": "**SlopOS T-Deck Firmware** — beta-0.1.32\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse the manifest at `webflasher/manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `webflasher/slopos-tdeck-firmware.bin` | App update |\n| `webflasher/slopos-tdeck-full.bin` | Full flash |\n| `webflasher/slopos-tdeck-bootloader.bin` | Bootloader |\n| `webflasher/slopos-tdeck-partitions.bin` | Partition table |\n| `webflasher/manifest.json` | Web flasher manifest |\n\n\n## What's Changed\n* fix: reduce trackball sensitivity and improve left direction reliability by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/20\n* feat: make chat screen navigable via trackball with selection highlights by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/21\n* fix: preserve DIO bootloader mode for web flasher compatibility by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/22\n* feat: onboarding wizard with 3-step setup (name, time, frequency) by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/23\n* feat: turn off keyboard backlight when display auto-offs by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/24\n* feat: add emoji support with LVGL font fallback and emoji picker by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/25\n* feat: persist channels and messages across reboots and power loss by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/26\n* fix: delay USB CDC init to avoid power cycle needed after web flash by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/27\n* Harden channel string formatting and add advertise status cooldown by @n30nex in https://github.com/hermes-gadget/SlopOS-tdeck/pull/29\n* fix: screen tearing and chat input/scroll limits by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/30\n* fix: theme contrast for Contacts/Trace screens, tap contact opens DM by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/32\n* feat: replace Heard screen with raw packet log (Packets screen) by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/34\n* feat: standardize map tile path to /tiles/ matching Ripple convention by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/36\n* fix: enforce MeshCore character limits in UI inputs by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/38\n* feat(ui): add configurable chat message history cap by @n30nex in https://github.com/hermes-gadget/SlopOS-tdeck/pull/40\n* feat: custom RF parameters dialog with +/- dial controls by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/41\n* fix: render offline map tiles from SD by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/42\n\n\n**Full Changelog**: https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.31...beta-0.1.32",
      "notesHtml": "<p><strong>SlopOS T-Deck Firmware</strong> — beta-0.1.32</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use the manifest at <code>webflasher/manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-firmware.bin</code></td>\n<td>App update</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-full.bin</code></td>\n<td>Full flash</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-bootloader.bin</code></td>\n<td>Bootloader</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-partitions.bin</code></td>\n<td>Partition table</td>\n</tr>\n<tr>\n<td><code>webflasher/manifest.json</code></td>\n<td>Web flasher manifest</td>\n</tr>\n</tbody></table>\n<h2>What's Changed</h2>\n<ul>\n<li>fix: reduce trackball sensitivity and improve left direction reliability by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/20\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/20</a></li>\n<li>feat: make chat screen navigable via trackball with selection highlights by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/21\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/21</a></li>\n<li>fix: preserve DIO bootloader mode for web flasher compatibility by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/22\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/22</a></li>\n<li>feat: onboarding wizard with 3-step setup (name, time, frequency) by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/23\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/23</a></li>\n<li>feat: turn off keyboard backlight when display auto-offs by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/24\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/24</a></li>\n<li>feat: add emoji support with LVGL font fallback and emoji picker by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/25\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/25</a></li>\n<li>feat: persist channels and messages across reboots and power loss by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/26\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/26</a></li>\n<li>fix: delay USB CDC init to avoid power cycle needed after web flash by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/27\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/27</a></li>\n<li>Harden channel string formatting and add advertise status cooldown by @n30nex in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/29\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/29</a></li>\n<li>fix: screen tearing and chat input/scroll limits by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/30\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/30</a></li>\n<li>fix: theme contrast for Contacts/Trace screens, tap contact opens DM by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/32\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/32</a></li>\n<li>feat: replace Heard screen with raw packet log (Packets screen) by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/34\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/34</a></li>\n<li>feat: standardize map tile path to /tiles/ matching Ripple convention by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/36\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/36</a></li>\n<li>fix: enforce MeshCore character limits in UI inputs by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/38\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/38</a></li>\n<li>feat(ui): add configurable chat message history cap by @n30nex in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/40\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/40</a></li>\n<li>feat: custom RF parameters dialog with +/- dial controls by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/41\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/41</a></li>\n<li>fix: render offline map tiles from SD by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/42\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/42</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.31...beta-0.1.32\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.31...beta-0.1.32</a></p>\n"
    },
    {
      "version": "beta-0.1.31",
      "name": "beta-0.1.31",
      "datetime": "2026-05-24T13:38:18Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.31",
      "prerelease": true,
      "notes": "**SlopOS T-Deck Firmware** — beta-0.1.31\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse the manifest at `webflasher/manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `webflasher/slopos-tdeck-firmware.bin` | App update |\n| `webflasher/slopos-tdeck-full.bin` | Full flash |\n| `webflasher/slopos-tdeck-bootloader.bin` | Bootloader |\n| `webflasher/slopos-tdeck-partitions.bin` | Partition table |\n| `webflasher/manifest.json` | Web flasher manifest |\n\n\n## What's Changed\n* fix: reduce trackball sensitivity and improve left direction reliability by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/20\n* feat: make chat screen navigable via trackball with selection highlights by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/21\n* fix: preserve DIO bootloader mode for web flasher compatibility by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/22\n* feat: onboarding wizard with 3-step setup (name, time, frequency) by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/23\n* feat: turn off keyboard backlight when display auto-offs by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/24\n* feat: add emoji support with LVGL font fallback and emoji picker by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/25\n* feat: persist channels and messages across reboots and power loss by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/26\n* fix: delay USB CDC init to avoid power cycle needed after web flash by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/27\n\n\n**Full Changelog**: https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.30...beta-0.1.31",
      "notesHtml": "<p><strong>SlopOS T-Deck Firmware</strong> — beta-0.1.31</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use the manifest at <code>webflasher/manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-firmware.bin</code></td>\n<td>App update</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-full.bin</code></td>\n<td>Full flash</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-bootloader.bin</code></td>\n<td>Bootloader</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-partitions.bin</code></td>\n<td>Partition table</td>\n</tr>\n<tr>\n<td><code>webflasher/manifest.json</code></td>\n<td>Web flasher manifest</td>\n</tr>\n</tbody></table>\n<h2>What's Changed</h2>\n<ul>\n<li>fix: reduce trackball sensitivity and improve left direction reliability by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/20\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/20</a></li>\n<li>feat: make chat screen navigable via trackball with selection highlights by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/21\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/21</a></li>\n<li>fix: preserve DIO bootloader mode for web flasher compatibility by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/22\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/22</a></li>\n<li>feat: onboarding wizard with 3-step setup (name, time, frequency) by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/23\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/23</a></li>\n<li>feat: turn off keyboard backlight when display auto-offs by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/24\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/24</a></li>\n<li>feat: add emoji support with LVGL font fallback and emoji picker by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/25\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/25</a></li>\n<li>feat: persist channels and messages across reboots and power loss by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/26\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/26</a></li>\n<li>fix: delay USB CDC init to avoid power cycle needed after web flash by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/27\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/27</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.30...beta-0.1.31\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.30...beta-0.1.31</a></p>\n"
    },
    {
      "version": "beta-0.1.30",
      "name": "beta-0.1.30",
      "datetime": "2026-05-24T01:25:25Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.30",
      "prerelease": true,
      "notes": "**SlopOS T-Deck Firmware** — beta-0.1.30\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse the manifest at `webflasher/manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `webflasher/slopos-tdeck-firmware.bin` | App update |\n| `webflasher/slopos-tdeck-full.bin` | Full flash |\n| `webflasher/slopos-tdeck-bootloader.bin` | Bootloader |\n| `webflasher/slopos-tdeck-partitions.bin` | Partition table |\n| `webflasher/manifest.json` | Web flasher manifest |\n\n\n## What's Changed\n* fix: GT911 touch orientation — SWAP_XY, sensor bounds, remove calibration by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/1\n* ui: remove icon tile borders, smaller font on home grid by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/2\n* ui: full-screen grid layout, centered content, smaller fonts by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/3\n* fix: restore display state after wake by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/4\n* Fix chat rendering and MeshCore text payload follow-ups by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/12\n* Add themed back buttons to secondary screens by @gadgethd in https://github.com/hermes-gadget/SlopOS-tdeck/pull/13\n\n## New Contributors\n* @gadgethd made their first contribution in https://github.com/hermes-gadget/SlopOS-tdeck/pull/1\n\n**Full Changelog**: https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.29...beta-0.1.30",
      "notesHtml": "<p><strong>SlopOS T-Deck Firmware</strong> — beta-0.1.30</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use the manifest at <code>webflasher/manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-firmware.bin</code></td>\n<td>App update</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-full.bin</code></td>\n<td>Full flash</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-bootloader.bin</code></td>\n<td>Bootloader</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-partitions.bin</code></td>\n<td>Partition table</td>\n</tr>\n<tr>\n<td><code>webflasher/manifest.json</code></td>\n<td>Web flasher manifest</td>\n</tr>\n</tbody></table>\n<h2>What's Changed</h2>\n<ul>\n<li>fix: GT911 touch orientation — SWAP_XY, sensor bounds, remove calibration by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/1\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/1</a></li>\n<li>ui: remove icon tile borders, smaller font on home grid by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/2\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/2</a></li>\n<li>ui: full-screen grid layout, centered content, smaller fonts by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/3\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/3</a></li>\n<li>fix: restore display state after wake by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/4\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/4</a></li>\n<li>Fix chat rendering and MeshCore text payload follow-ups by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/12\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/12</a></li>\n<li>Add themed back buttons to secondary screens by @gadgethd in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/13\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/13</a></li>\n</ul>\n<h2>New Contributors</h2>\n<ul>\n<li>@gadgethd made their first contribution in <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/pull/1\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/pull/1</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.29...beta-0.1.30\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.29...beta-0.1.30</a></p>\n"
    },
    {
      "version": "beta-0.1.29",
      "name": "beta-0.1.29",
      "datetime": "2026-05-23T16:17:05Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.29",
      "prerelease": true,
      "notes": "**SlopOS T-Deck Firmware** — beta-0.1.29\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse the manifest at `webflasher/manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `webflasher/slopos-tdeck-firmware.bin` | App update |\n| `webflasher/slopos-tdeck-full.bin` | Full flash |\n| `webflasher/slopos-tdeck-bootloader.bin` | Bootloader |\n| `webflasher/slopos-tdeck-partitions.bin` | Partition table |\n| `webflasher/manifest.json` | Web flasher manifest |\n\n\n**Full Changelog**: https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.28...beta-0.1.29",
      "notesHtml": "<p><strong>SlopOS T-Deck Firmware</strong> — beta-0.1.29</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use the manifest at <code>webflasher/manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-firmware.bin</code></td>\n<td>App update</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-full.bin</code></td>\n<td>Full flash</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-bootloader.bin</code></td>\n<td>Bootloader</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-partitions.bin</code></td>\n<td>Partition table</td>\n</tr>\n<tr>\n<td><code>webflasher/manifest.json</code></td>\n<td>Web flasher manifest</td>\n</tr>\n</tbody></table>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.28...beta-0.1.29\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.28...beta-0.1.29</a></p>\n"
    },
    {
      "version": "beta-0.1.28",
      "name": "beta-0.1.28",
      "datetime": "2026-05-23T15:57:47Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.28",
      "prerelease": true,
      "notes": "**SlopOS T-Deck Firmware** — beta-0.1.28\n\n### Flash with esptool\n```bash\n# Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n```\n\n### Web Flasher\nUse the manifest at `webflasher/manifest.json` with [esptool.js](https://espressif.github.io/esptool-js/).\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | App only (flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (flash at 0x0) |\n| `webflasher/slopos-tdeck-firmware.bin` | App update |\n| `webflasher/slopos-tdeck-full.bin` | Full flash |\n| `webflasher/slopos-tdeck-bootloader.bin` | Bootloader |\n| `webflasher/slopos-tdeck-partitions.bin` | Partition table |\n| `webflasher/manifest.json` | Web flasher manifest |\n\n\n**Full Changelog**: https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.27...beta-0.1.28",
      "notesHtml": "<p><strong>SlopOS T-Deck Firmware</strong> — beta-0.1.28</p>\n<h3>Flash with esptool</h3>\n<pre><code># Full flash (first install):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin\n\n# App update (keep settings):\nesptool.py --chip esp32s3 --port /dev/ttyACM0 \\\\\n  write_flash 0x10000 firmware.bin\n</code></pre>\n<h3>Web Flasher</h3>\n<p>Use the manifest at <code>webflasher/manifest.json</code> with <a href=\"https://espressif.github.io/esptool-js/\" target=\"_blank\" rel=\"noopener noreferrer\">esptool.js</a>.</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>App only (flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (flash at 0x0)</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-firmware.bin</code></td>\n<td>App update</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-full.bin</code></td>\n<td>Full flash</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-bootloader.bin</code></td>\n<td>Bootloader</td>\n</tr>\n<tr>\n<td><code>webflasher/slopos-tdeck-partitions.bin</code></td>\n<td>Partition table</td>\n</tr>\n<tr>\n<td><code>webflasher/manifest.json</code></td>\n<td>Web flasher manifest</td>\n</tr>\n</tbody></table>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.27...beta-0.1.28\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.27...beta-0.1.28</a></p>\n"
    },
    {
      "version": "beta-0.1.27",
      "name": "beta-0.1.27",
      "datetime": "2026-05-19T19:54:39Z",
      "url": "https://github.com/hermes-gadget/SigurdOS-tdeck/releases/tag/beta-0.1.27",
      "prerelease": true,
      "notes": "**SlopOS T-Deck Firmware** — beta-0.1.27\n\n| File | Use |\n|------|-----|\n| `firmware.bin` | OTA update (app only, flash at 0x10000) |\n| `firmware-merged.bin` | Full flash (bootloader + partitions + app, flash at 0x0) |\n\n\n**Full Changelog**: https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.26...beta-0.1.27",
      "notesHtml": "<p><strong>SlopOS T-Deck Firmware</strong> — beta-0.1.27</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>firmware.bin</code></td>\n<td>OTA update (app only, flash at 0x10000)</td>\n</tr>\n<tr>\n<td><code>firmware-merged.bin</code></td>\n<td>Full flash (bootloader + partitions + app, flash at 0x0)</td>\n</tr>\n</tbody></table>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.26...beta-0.1.27\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/hermes-gadget/SlopOS-tdeck/compare/beta-0.1.26...beta-0.1.27</a></p>\n"
    }
  ],
  "changelogSource": "github",
  "changelogUpdatedAt": "2026-07-18T09:28:53.267Z",
  "deviceFamilies": [
    {
      "id": "lilygo-t-deck",
      "label": "LilyGo T-Deck"
    }
  ],
  "primaryFamily": {
    "id": "lilygo-t-deck",
    "label": "LilyGo T-Deck"
  },
  "scopeGroup": "LilyGo T-Deck"
}
