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.47-RC9
- Released
- 2026-08-02
- 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
Features
- Standalone direct and channel messaging
- Touch, trackball and keyboard controls
- Maps, GPS and signal diagnostics
- Wi-Fi and GitHub OTA updates
Project signals
- GitHub stars
- 19
- Forks
- 4
- Watchers
- 0
- Open issues
- 5
- Contributors
- 6
- Release downloads
- 1,393
- Latest downloads
- 10
- Source available
- Yes
- Releases available
- Yes
- CI builds
- Yes
Releases
from GitHub · updated 2026-08-02v0.1.47-RC9 # Latest Pre-release 6 days ago · 2026-08-02 16:49 UTC
SigurdOS T-Deck Firmware — beta-0.1.47-RC9
Release candidate 9. 25 audit fixes + review follow-ups + CI fix.
Flash with esptool
esptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 firmware-merged.bin esptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x10000 firmware.binChanges since beta-0.1.46-RC8
- 25 audit fixes (#1466–#1490): security, data integrity, concurrency, radio/map, build infra
- #1468: Diagnostic writer Serial I/O moved outside ESP32 critical section
- #1466: SPIFFS remount on factory reset failure
- #1470: Capped OTA saveState retries
- #1474: Non-Home PIN cancellation test
- #1483: SBOM captures URL-based PIO requirements
- Dependabot: gcovr 8.4→8.6, 9 GitHub Actions pins
Verification
- Native tests: 1,587 passed, 1 skipped
- CI: green
Full Changelog: https://github.com/hermes-gadget/SigurdOS-tdeck/compare/beta-0.1.46-RC8...beta-0.1.47-RC9
v0.1.46-RC8 # Pre-release 8 days ago · 2026-07-31 15:25 UTC
SigurdOS T-Deck Firmware — beta-0.1.46-RC8
Release candidate 8. 116 commits since beta-0.1.45-RC7.
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
- UI: SD card file browser, mesh health dashboard, message search screen, GPS track log breadcrumbs
- Navigation: pin-locked screen gate enforcement, unified nav state validation
Security
- Remove all efuse-burning risk from build and CI paths
- P1 OTA authenticity enforcement + orderly sleep hardware path
- Protect persisted credentials in NVS
- PIN lockout persistence and identity key guarding
- Reject security epoch downgrades in OTA
- Harden mesh input validation and proximity scopes
- Revoke BLE bonds on PIN rotation and factory reset
Fixes
- Mesh: durable transactional mutations (#1428), transactional radio config (#1427), transactionally persist flood scopes (#1429), reclaim timed-out operations (#1425), stable contact IDs (#1443), parse complete node status (#1413), harden message store recovery (#1430)
- OTA: keep transfers off loop watchdog (#1436), enforce boot health and safe sleep failure (#1213), gate every firmware environment (#1392)
- WiFi: make scans async and cancellable (#1435), arbitrate radio ownership (#1414)
- Map: move tile loading off LVGL task (#1434), incremental tile discovery (#1422), refresh sparse tile media safely (#1373)
- Companion/BLE: MTU-safe delivery (#1217), ownership revocation on factory reset (#1415), USB CDC data stream binding (#1219), close dependency gaps (#1172)
- GPS: independent UART drain from publication (#1216), expire fixes and resync clock (#1361)
- UI: terminal and system action hardening (#1409), persist named chat scopes (#1380), preserve DM conversations (#1225), generation-safe lifecycle (#1214)
- Storage: preserve SPIFFS unless fully erased (#1215), bound diagnostic telemetry (#1386)
- Build/CI: harden firmware supply chain gates (#1390), bound warning budgets, validate HAL/NVS/UI allocations (#1371), resolve all doc drift
- Crash telemetry core dump enforcement (#1220), hardware entropy for mesh identities (#1176)
Tests
- WiFi icon lifetime reuse (#1423), behavior-to-production linking (#1417), native coverage policy enforcement (#1431), T-Deck sleep orchestration (#1426), OTA partial-write unwind (#1424), production mesh integration (#1421), remote delivery truthfulness (#1419), UI screen load lifecycle (#1412)
Evidence
Release evidence:
release-evidence/beta-0.1.46-RC8.jsonv0.1.45-RC7 # Pre-release 21 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.json
Device compatibility (1)
| Device | MCU | Radio | Status | Notes |
|---|---|---|---|---|
| LilyGo T-Deck | esp32-s3 | Semtech SX1262 | ✓ Supported | The project reports successful beta flashes by several users. |