v0.9.12 (TDECK/HeltecV4)
This is v0.9.12 from 20.04.2026.
Actually this is the release for the TDECK & HeltecV4, the other devices will follow later!
NO ONLINE UPDATE possible right now.
[v0.9.12]
Elecrow CrowPanel 7" companion radio support added!
Upstream base upgraded: MeshCore v1.14.0 → v1.14.1
Upstream base upgraded: MeshCore v1.14.1 → v1.15.0
WebUI interface implemented, WIFI needs to be active (http://IP), usr: admin / pass: BLE-code
Changed / Improved
- WebUI message navigation and thread behavior refined
- Bottom tab presses now always return to the selected tab's root view, reducing stale nested-state confusion
- Message list navigation arrows are now visually consistent
- Channel/DM reply action labels now use "RPL" and signal badges display compact RSSI/SNR formatting
- WebUI message detail page redesigned for faster diagnostics
- Message detail now surfaces key delivery and route context first, including clearer hops vs repeats emphasis based on message direction
- Metadata and raw transport details remain available in a more structured layout
- WebUI channel management cleanup
- The extra key-format helper line was removed from the Regions section to reduce visual noise
- On-screen light color scheme readability overhaul
- Light mode now uses a bright white base with stronger contrast treatment for controls, improving legibility in heavy sunlight
- Buttons across the on-device UI were visually unified for outdoor use with clearer borders and higher-contrast label rendering
- Badge and accent colors were adjusted in light mode so critical status indicators remain easy to distinguish on bright backgrounds
- Contact list rows were tuned for light mode readability with clearer row separation and easier-to-read text treatment
- MAP marker and badge consistency improvements
- Map device hash badges now follow each device's advertised hash width (1-byte, 2-byte, or 3-byte) instead of the local multi-byte hash preference
- Map device badge colors now match device type coloring used in contact badges (for example SVR and RPT), improving consistency across the UI
- Management log readability improved — long entries wrap to available width
- More consistent device colors across the interface
- Channel and DM views stay responsive while browsing larger histories
- CrowPanel 7 list readability, alignment, and text size improved across all screens
- Build stability follow-up — stale platform overrides removed; all targets revalidated
- Contact route badges correctly decode 1-, 2-, and 3-byte multihash paths
- DM route hints now survive device restart
- Manual location setting now available in MCTerm via GPS menu
- WebUI displays 3-state mode selector: Off (no location), GPS (real-time), Manual (fixed coordinates)
- Set manual location via text input fields for latitude, longitude, altitude
- Set location from map view using "Use Map Center" button
- Clear location via "Clear Loc" button
- Uses existing firmware protocol (CMD_SET_ADVERT_LATLON) — no companion app protocol changes
- Matches official companion app behavior for manual location configuration
- HOWTO: Open Mgmt -> GPS. - Go to Manual Location. - Tap Edit on Manual Lat, enter latitude, confirm. - Tap Edit on Manual Lon, enter longitude, confirm. - Tap Edit on Manual Alt, enter altitude in meters, confirm. - Set Advert Location to Manual (cycle button until it shows Manual), so adverts use your manual coordinates.
Added
- Message detail can now jump directly to map route visualization
- Selecting the hop count in message detail opens the map and overlays the known hop path as connected lines between devices
- T-Deck Plus: Alt+S and SYM key now cycle input modes
- Pressing Alt+S on the hardware keyboard cycles through all four input modes: uppercase, lowercase, SYM1, and SYM2
- Pressing the standalone SYM key jumps directly to SYM1; pressing again advances to SYM2 and then back to normal
- The modifier detection was unreliable due to a hardware quirk; it now reads directly from the keyboard matrix for accurate results
- T-Deck Plus: SYM1 and SYM2 touch buttons added to the message send bar
- While composing a message, two buttons labelled SYM1 and SYM2 are now visible at the bottom of the input panel, allowing direct access to symbol input modes without using the hardware keyboard shortcut
- In symbol mode the full on-screen symbol picker is shown; the trackball navigates the grid and pressing the trackball button inserts the selected character
- Alt+S now jumps straight to SYM1 from any normal input mode and stepping it again moves to SYM2 then back
- WebUI: message hash codes replaced with contact names
- Hop-path hash codes (the short bracketed hex codes like [A3], [B2F1] etc.) in channel and DM messages are now automatically replaced by the matching contact name from your contact list, shown in that contact's color
- If no contact matches a hash code, it is shown dimmed so it remains readable but visually de-emphasised
- Can be turned off in Mgmt → Messages → Replace HashCodes
- On-device and WebUI naming behavior now stays aligned through the shared "Replace HashCodes" setting
- Default flood scope: persistent per-device send scope
- A default flood scope can now be stored in device preferences and applied automatically to all outgoing flood messages when no other scope is active
- Configurable from the browser node settings panel and the command-line interface
- Map: network tile load reliability improvements for hosted-WiFi targets
- Map tile loading is more reliable on devices that use a separate co-processor for WiFi bridging; timeouts are tighter and tile requests no longer collide with background state updates
- WebUI: full-featured browser interface via WebSocket
- Browser-hosted companion UI served directly from the device over WiFi — no app install required
- All screens (contacts, channels, DMs, map, management, repeater admin) update in real time via WebSocket without page reloads
- Repeater admin includes live device status readout (battery, uptime, RSSI/SNR, airtime, packet counters) bridged from the binary protocol -> WIP
- Transient status messages (e.g. sent confirmations, error notices) appear briefly in the header, matching the on-device display behavior
- Repeater status and clock refresh operations run quietly behind a single progress indicator instead of spamming the channel with individual commands
- Mgmt/Channels: region scope support with per-channel assignment
- Region scope definitions added using MeshCore's flood-scope system, with one scope assignable per channel
- Mgmt/Channels: new Regions and Scope overlay pickers
- The Regions section opens a dedicated overlay listing all defined scopes; each region can be toggled between allow-flood and deny-flood modes
- Channel rows open a scope picker directly; the currently assigned scope name is shown on the channel row button
- Mgmt/Date-Time: NTP timezone and server labels fully visible on CrowPanel 7
- Mgmt/WiFi: extended network diagnostics and static IP support
- WiFi management shows subnet, gateway, and both DNS server addresses; a new mode control switches between DHCP and static addressing
- GUI: contact list reachability badges condensed
- Direct-link badge is now "D" (green); flood-route badge is now "F" (blue)
- GUI: status-bar clock with quick Date/Time access
- A live clock is always shown in the status bar; tapping it jumps to Mgmt → Date/Time
- GUI: contact list badge reordering and new address-width badge
- Badge order from right: address-width, type, route, last-heard, favourite, GPS, unread mail
- GUI: unread message indicators moved to Msgs tab button
- The Msgs tab shows a white envelope for unread channel messages and a red envelope for unread DMs
- Duty-cycle display shows configured budget instead of lifetime airtime ratio
- Msgs: QuickR1 and QuickR2 custom reply presets
- Quick reply templates accept both
(VAR)and[VAR]syntax on touch and physical keyboards - Supported variables are
HP(hop path),HC(hop count),SNR(signal-to-noise ratio), andRSSI(received signal strength) - Both quick reply slots are editable in Mgmt → Messages; pre-filled with useful defaults on first boot
- Reply buttons expand hop path, hop count, SNR, and RSSI from the selected message
- Quick reply templates accept both
- Mgmt/Global: MCTerm firmware information section added
- Identity key management added across device UI and WebUI
- The management interface now exposes identity details directly on-device, including private-key visibility and guided save/load operations with SD card files
- Private keys can now be set manually, imported from SD card identity files, and applied without companion app tooling
- The browser interface now includes a full import/export flow with direct key export, identity bundle export, file-based import, and SD card save/load actions
Fixed
- WebUI "Load older messages" indicator now appears only when older pages are actually available
- The action no longer appears in states where there is nothing older to fetch, making history availability clearer
- Message history pruning now retains valid messages when the device clock is far ahead of message timestamps
- A faulty or unsynced real-time clock could cause all stored messages to appear expired and get pruned on boot; messages are now preserved whenever the clock has not yet been corrected
- Message ring counters stay accurate after a history prune pass
- Stored message counts shown in the UI and diagnostic views could drift from the actual ring contents after pruning; they now update correctly
- DM details no longer show fake hop paths for unreachable flood-routed messages
- Repeater forwards are now shown in the repeats section, and unknown routes no longer display an invalid high hop count
- DM delivery status now clearly follows the Mark Delivered Faster setting
- If Mark Delivered Faster is enabled, your reported behavior still happens by design.
- If Mark Delivered Faster is disabled, behavior matches your expected ACK-only Delivered semantics.
- Room server messages now show the original poster name
- Posts relayed through a room server are now attributed to the participant who sent them instead of showing the room server name as the sender
- WebUI: character counter no longer retains the previous count after a message is sent
- WebUI: opening a channel with unread messages now marks them as read immediately
- WebUI: management screen fields and dropdowns no longer lose their value mid-edit when a background status update arrives
- WebUI: saving a management setting now shows the confirmation status briefly instead of being immediately overwritten by a loading indicator
- WebUI: GPS status badge added to the header — shows green when a fix is acquired, gray when searching or disabled, and hidden when GPS is not available on the device; hovering shows the exact GPS status
- WebUI: route, signal, and action buttons in message rows now show descriptive tooltips on hover
- WebUI: channel view header buttons (back, scope, delete) now show descriptive tooltips on hover
- Channel region scope was never actually applied when sending
- A protocol framing mistake caused the flood-scope command to silently fail on every attempt; fixed so the scope is reliably applied before each send
- SD message store: all messages except the last were lost on reboot before compaction
- Journal was opened in truncate mode instead of append mode; fixed so all messages accumulate correctly between compaction cycles
- SD message store: history older than the last ~48 messages was silently discarded on compaction
- Idle compaction wrote only the in-memory ring back to the snapshot then cleared the journal, permanently losing older messages regardless of the retention setting; compaction now merges the full journal and existing snapshot so all retained messages survive
- SD message store: configured message retention days reverted to 15 after every reboot
- A byte-order mismatch between the save and load paths caused the setting to be read back from an unrelated field; value now survives reboots correctly
- SD message store: history could fail to compact after leaving a per-channel filtered view
- The pending-compaction flag was cleared when the channel filter blocked compaction; the retry was never attempted after returning to the combined view
- Region and scope definitions now survive device reboot
- Definitions and per-channel assignments were RAM-only; now saved to flash immediately on any change
- CrowPanel 7 hosted map downloads recover after connection errors
- CrowPanel 7 time sync no longer reports false NTP success from the boot clock
- Peer and GPS time sync rejects implausible timestamps
- Mgmt/WiFi: switching from static IP back to DHCP could keep stale lease values
- Mgmt/WiFi profiles now show saved password state before SSID is set
- Entering a password before SSID no longer shows "(not set)" in the management overview; both on-device and browser views now show that a password is stored
- GUI: Date/Time set dialog used wrong timezone
- GUI: contact data could become corrupted after malformed updates or bad stored names
- Contacts list Last Heard badge now avoids unitless large values
- Invalid or ambiguous timestamps that previously showed confusing numbers now display as N/A
- GUI: long-tap copy in message detail could paste only a partial line
- Management log truncation regression fixed
- Mgmt/Log timestamps no longer oscillate between adjacent minutes
- Log entry timestamps now remain stable once captured instead of flipping between two minute values
- Repeater login set the repeater clock to a near-zero timestamp
- Mgmt/Contacts: AutoAdd Max Hops display was off by one
- Map: repeater info popup did not open when tapping markers at higher zoom levels
- Marker tap detection now stays reliable across zoom levels, so repeater details open correctly
- Map marker contact opening no longer depends on tap timing
- Tapping a marker shows its info box, and tapping the info box opens contact detail for a more reliable interaction
- Mgmt/Advert scan: single-attempt scans missed nearby repeaters
- Mgmt/Advert Scan Rpts now handles prefix-only repeater matches correctly
- Known repeaters discovered by scan now show their saved contact names and open contact detail on row tap
- When only a short prefix is known and multiple contacts share it, the UI now explains the ambiguity instead of showing a generic key-missing message
- Repeaters that are not yet in Contacts can now be added directly when a unique full identity can be resolved from recent scan results
- Device: message read state now saved to storage when scrolling through messages on-device
- Previously read state was lost on reboot; now persisted immediately and browser unread counters stay in sync
- Elecrow CrowPanel 3.5: soft-SPI SD shim build fixed
- WebUI: "Jump to latest" button now stays visible while scrolling up in message history
- The button was placed at the end of the message list and scrolled out of view when reading older messages; it now sticks to the bottom of the visible conversation area so it is always reachable without scrolling back down first