SigurdOS T-Deck
CustomStandalone 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.
- Maintainer
- hermes-gadget ↗
- Status
- Active
- Maturity
- Beta
- Lifecycle
- Active
- Latest version
- 0.1.45-RC7
- Released
- 2026-07-18
- Runtime
- Arduino · C++
- Distribution
- Community
- Licensing
- Open source
- License
- GPL-3.0
Capabilities
Transports
- ✓ BLE
- ✓ USB serial
- ✓ Wi-Fi AP
Operations
- ✓ OTA updates
Hardware
- ✓ GPS
- ✓ Display
Protocol
- ✓ MeshCore compatible
Node role
CompanionStandalone UI
Features
- Standalone direct and channel messaging
- Touch, trackball and keyboard controls
- Maps, GPS and signal diagnostics
- Wi-Fi and GitHub OTA updates
Project signals
popularity 2026-07-20 verification 2026-07-20
- GitHub stars
- 18
- Forks
- 5
- Watchers
- 0
- Open issues
- 21
- Contributors
- 4
- Release downloads
- 1,224
- Latest downloads
- 9
- Source available
- Yes
- Releases available
- Yes
- CI builds
- Yes
Releases
from GitHub · updated 2026-07-18v0.1.45-RC7 # Latest Pre-release 3 days ago · 2026-07-18 09:27 UTC
SigurdOS T-Deck Firmware — beta-0.1.45-RC7
Release candidate 7 for the beta-0.1.45 cycle. 181 commits since beta-0.1.44-RC6.
Flash with esptool
# Full flash (first install): esptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin # App update (keep settings): esptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x10000 firmware.binWeb Flasher
Use
manifest.jsonwith esptool.js.File Use firmware.binApp only (flash at 0x10000) firmware-merged.binFull flash (flash at 0x0) SigurdOS-tdeck-launcher.binFor bmorcelli/Launcher install manifest.jsonWeb flasher manifest sigurdos-tdeck-bootloader.binBootloader (web flasher) sigurdos-tdeck-partitions.binPartitions (web flasher) sigurdos-tdeck-boot_app0.binBoot app0 (web flasher) Features
- 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)
- UI: message detail sheet, contact list power tools, bounded field notifications, timestamped repeater CLI transcripts
- GPS: demand-driven polling with time sync
- Mesh: surface repeater session failures
- CI: dependency scanning, CodeQL analysis gates, release evidence enforcement
- Performance: virtualized message/packet lists, bounded sparse tile loading
- Storage: unified message history store
Fixes
- 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
- 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
- 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
- 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
- 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
- GPS: route RTC sync through tracked clock sources, preserve mesh clock handoff
- SD: de-assert non-SD CS pins before mount
- 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
Documentation
- Reconcile companion support and missing-features status with pinned MeshCore
- Refresh README, screen guides, ROADMAP, FEATURES_OVERVIEW, Launcher docs
- Add Noto Emoji license notice
- Document companion message visibility limitation
Hardware Tested (beta-0.1.45-RC7)
- Native tests: 1219/1220 passed
- Production build: RAM 39.3%, Flash 40.0%
- T-Deck boot verified: radio 869.525 MHz, noise floor -94 dBm
- All 12 screens navigate without crashes
- Soak: 420 seconds idle, zero crashes, heap stable at 146,808
- RF transmission confirmed on #testingslopos
- CI pre-existing: dep hash + golden frame pin fixed; remaining 2 test infra issues pre-date this release
Evidence
Release evidence:
release-evidence/beta-0.1.45-RC7.jsonv0.1.44-RC6 # Pre-release 8 days ago · 2026-07-12 12:37 UTC
SigurdOS T-Deck Firmware — beta-0.1.44-RC6
Flash with esptool
# Full flash (first install): esptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin # App update (keep settings): esptool.py --chip esp32s3 --port /dev/ttyACM0 \ write_flash 0x10000 firmware.binWeb Flasher
Use
manifest.jsonwith esptool.js.File Use firmware.binApp only (flash at 0x10000) firmware-merged.binFull flash (flash at 0x0) SigurdOS-tdeck-launcher.binFor bmorcelli/Launcher install firmware-debug.binDebug build with verbose logging manifest.jsonWeb flasher manifest sigurdos-tdeck-bootloader.binBootloader (web flasher) sigurdos-tdeck-partitions.binPartition table (web flasher) sigurdos-tdeck-boot_app0.binBoot app0 (web flasher) sigurdos-tdeck-firmware.binApp firmware (web flasher) sigurdos-tdeck-full.binFull image (web flasher) What's Changed
- fix: safe SPIFFS init with erased-partition auto-format (closes #750) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/751
- 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
- Phase 2: Multi-language keyboard layout system (12 layouts) — #752 by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/754
- Phase 3: I2C robustness improvements — #752 by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/755
- fix: keyboard doesn't work — I2C timeout kills cold boot (#752) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/756
- [codex] use C3 key mode for multi-model keyboards by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/757
- [codex] Add persisted international keyboard layouts by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/758
- [codex] Harden shared I2C initialization and recovery by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/759
- Fork Merge: Radio profiles, diagnostics, RX-only mode, CI fixes by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/760
- fix: battery -% on menu nav, cursor visibility, RSSI chart labels by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/766
- fix(ci): exclude LauncherCompatibility.md from doc reference check by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/767
- docs: comprehensive repository-wide audit (audit.md) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/770
- fix(gps): correct GPS-to-Unix-epoch conversion (BUG-001) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/771
- 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
- 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
- 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
- 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
- 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
- fix(security): add OTA PIN brute-force rate limiting (SEC-001) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/777
- docs: add remediation status to audit.md (7 PRs submitted) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/778
- perf(display): lazy-allocate emergency buffer, reclaim 12.8KB DRAM (PERF- …
v0.1.43-RC5 # Pre-release 22 days ago · 2026-06-28 13:56 UTC
SigurdOS T-Deck Firmware — beta-0.1.43-RC5
Flash with esptool
# Full flash (first install): esptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin # App update (keep settings): esptool.py --chip esp32s3 --port /dev/ttyACM0 \ write_flash 0x10000 firmware.binWeb Flasher
Use
manifest.jsonwith esptool.js.File Use firmware.binApp only (flash at 0x10000) firmware-merged.binFull flash (flash at 0x0) SigurdOS-tdeck-launcher.binFor bmorcelli/Launcher install firmware-debug.binDebug build with verbose logging manifest.jsonWeb flasher manifest sigurdos-tdeck-bootloader.binBootloader (web flasher) sigurdos-tdeck-partitions.binPartition table (web flasher) sigurdos-tdeck-boot_app0.binBoot app0 (web flasher) sigurdos-tdeck-firmware.binApp firmware (web flasher) sigurdos-tdeck-full.binFull image (web flasher) What's Changed
- fix: add click button deadtime enforcement by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/696
- fix: prevent trace timer UAF on rapid contact taps by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/697
- fix: use sender timestamp for incoming messages by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/698
- fix: add div-by-zero guard to battery percentage lookup by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/699
- docs: remove stale binary and add audit documentation by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/700
- fix: move I2C clock to shared init at 400 kHz by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/705
- 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
- fix: clear companion bridge signing state on BLE disconnect (Closes #712) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/720
- 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
- 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
- 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
- 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
- [codex] Add companion compatibility audit by @gadgethd in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/723
- Fix reproducible WebServer security patches in CI by @gadgethd in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/725
- 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
- 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
- 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
- fix: input and small-screen reliability improvements (Closes #746) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/747
- fix: per-message companion delivery tracking and metadata preservation (Closes #726) by @hermes-gadget in https://github.com/hermes-gadget/SigurdOS-tdeck/pull/727
- fix: reload contact crypto state after companion private-key import (Closes #728) by @hermes-gadget in https://github.com/hermes-gadget/S …
Device compatibility (1)
✓ 1 Supported
| Device | MCU | Radio | Status | Notes |
|---|---|---|---|---|
| LilyGo T-Deck | esp32-s3 | Semtech SX1262 | ✓ Supported | The project reports successful beta flashes by several users. |