* fix(tdeck): improve display startup and brightness handling
* fix(energy-sweep): use instant RSSI and only lock LoRa while scanning
* feat(cardputer-zero): add linux shells and M5 SDK baseline
* feat(cardputer-zero): add linux runtime baseline and shell ui simulator
* feat(cardputer-zero): unify linux shell boot and polish simulator
* docs(cardputer-zero): define final-shape adaptation spec
* feat(cardputer-zero): integrate shared linux runtimes and pages
* fix(linux-sim): mount repo root in dev container
* Fix GPS runtime semantics and transport init
Add a GPS specification and align platform runtimes around explicit GPS enable, power, receiver configuration, and external NMEA export semantics.
Keep internal NMEA parsing independent from external export settings, stop treating gps_mode as an enable flag, and update phone/UI config paths to use gps_enabled.
Decouple board-level GPS transport readiness from UBX receiver probing on T-Deck, T-Deck Pro, and T-LoRa Pager, and let boards own UART teardown.
Verified with pio run -e tdeck, pio run -e tlora_pager_sx1262, pio run -e gat562_mesh_evb_pro, and pio run -e tdeck_pro_a7682e.
* Add Russian localization pack
Add an installable European Cyrillic Extended locale bundle with Russian translations, Cyrillic font metadata, and package catalog entry.
Credit polarikus for the Russian translations based on the polarikus/trail-mate localization PR.
* Prepare 0.1.23-alpha release
* Fix T-Watch Morse release build
* Format CI-checked sources
* Fix Cardputer Linux CI dependencies
* Fix WSL validation smoke target build
* Prepare 0.1.24-alpha release
* fix: unblock Cardputer Zero Linux CI
* feat(ui): add runtime English and Chinese localization
* fix(meshtastic): harden t-deck send and ack recovery
Align the T-Deck SX1262 setup with the reference firmware, switch critical radio SPI paths to blocking access, and share RX restart state between direct send paths and the radio task so TX-to-RX handoff cannot silently get stuck.
Also unify Meshtastic wire transmission through a single helper, keep wire packets for ACK-tracked sends, retry ACK timeouts up to three times, and document the issue #21 repair checklist.
Validation: local builds passed for tdeck, tlora_pager_sx1262, lilygo_twatch_s3, and gat562_mesh_evb_pro; clang-format check passed.
Testing status: not fully tested on hardware yet.
* Refactor LXMF runtime toward full Reticulum alignment
Split adapter runtime state into transport, link, and propagation domains.
Add pending path request tracking, stronger link teardown semantics, outbound link establishment, deferred link payload flushing, link keepalive/stale handling, and inbound split-resource assembly.
Document the authoritative Reticulum/LXMF runtime alignment plan and mark the older device-mode plan as historical context.
* feat(web): add pages site and web flasher release flow
Refactor the GAT562 board runtime by extracting dedicated GPS and input runtime components and routing config application through a focused runtime apply service.
Narrow the nRF52 BLE manager dependencies, rework the Meshtastic BLE transport to better match the Android client handshake, and harden the FromRadio/FromNum flow with improved staging, read pacing, diagnostics, and stack-safe config snapshot generation.
Also repair repository text encoding issues in docs and UI comments, and add Meshtastic BLE timing documentation to capture the expected Android/firmware interaction model for future debugging.
- migrate ESP board-specific implementations and runtime adapters into boards/*
- continue GAT562/Tab5/UI runtime alignment across app and board layers
- sync BLE and runtime integrations, and apply repository clang-format rules
- extract Meshtastic and MeshCore phone/business flows into shared core_chat BLE cores with owner hook seams for ESP and nRF backends
- replace nrf-specific lite adapters with board/platform adapters that consume shared cores and shared storage contracts
- extend nrf Meshtastic radio path with packet history dedupe, flooding rebroadcast, route discovery/traceroute responses, routing ACK/error handling, observed relay learning, retransmit queueing, and next-hop persistence
- persist nrf device identity and node metadata more explicitly, including next-hop state and node-id initialization support
- move nrf chat/contact/blob storage further toward InternalFS-backed persistence and update contact/node store behavior accordingly
- wire gat562 protocol/app facade pieces to the concrete nrf stores/adapters and add supporting app time-sync hooks used by platform runtimes
- add owner-hook split files and planning/status docs to document the ongoing alignment with the reference meshtastic-firmware multi-platform structure
* Implement TDeck touch-friendly home grid and power management updates
* Add initial M5Stack Tab5 ESP-IDF environment and board skeleton
* BLE/Meshtastic: apply config at runtime and fix Admin/Telemetry for app compatibility
Meshtastic Admin set_* immediate responses:
- After set_channel: respond with get_channel_response (echo applied channel).
- After set_config: respond with get_config_response for the config type that was set.
- After set_module_config: respond with get_module_config_response after saveModuleConfig().
- After store_ui_config: respond with get_ui_config_response.
This prevents the Meshtastic app from marking these operations as failed when the device applied config but did not send a reply.
DeviceMetrics and Telemetry:
- Add buildDeviceMetrics() in meshtastic_ble (battery from board, uptime_seconds from millis).
- Set has_device_metrics and device_metrics in buildSelfNodeInfo() so the app receives battery and uptime for the local node.
- Give Telemetry module config explicit defaults in loadModuleConfig() (device_update_interval, device_telemetry_enabled, etc.) so get_module_config returns a valid structure.
Apply config at runtime (so BLE-written config takes effect):
- Add AppContext::applyPositionConfig() to push gps_interval_ms and gps_mode to GpsService (setCollectionInterval, setGnssConfig). Call it from BLE set_config when position config is written.
- Add screen_sleep.h with getScreenSleepTimeout() / setScreenSleepTimeout() declarations (implemented in main.cpp). BLE display, device_ui, and store_ui_config now call setScreenSleepTimeout() instead of writing Preferences only, so the in-memory screen timeout updates immediately without reboot.
- Settings UI includes screen_sleep.h and uses the same API.
Other:
- BLE topbar asset and icon when BLE is enabled (ble_topbar.png/c, ui_status, LV_Helper).
- Node store: PersistedNodeEntry and INodeStore gain hw_model; mt_adapter and contact_service pass/store it for Meshtastic app compatibility.
- Variant env tweaks (tlora_pager, tdeck). Event bus and minor cleanups.
* feat: align Meshtastic BLE/iOS flow and add T-Deck keyboard support
- add BLE pairing popup and align more Meshtastic admin/status behavior with iOS expectations
- complete BLE MQTT client proxy bridge and persist OK-to-MQTT / ignore-MQTT channel settings
- add native T-Deck I2C keyboard input, backlight control, and SPACE-to-menu behavior
- fix chat bubble wrapping, contact removal sync, and pager wake/menu regressions
* fix: restore lilygo_twatch_s3 build
- remove duplicate M5Tab5Board isGPSReady declaration
- exclude M5Tab5Board.cpp from T-Watch S3 source filters to avoid duplicate board singletons
- verified with pio run -e lilygo_twatch_s3
- complete MeshCore protocol alignment work across chat/team/hostlink paths
- refactor Contacts Discover into a mode-based action list for consistent UI behavior
- add MeshCore identity/crypto persistence plumbing and related protocol handlers
- document Meshtastic + MeshCore dual-compatibility in README (EN/CN)
This commit closes the PC-to-device app-data send path and wires team location semantics end to end across protocol, service, and UI.
HostLink protocol and runtime:
- Add CMD_TX_APP_DATA (0x15) frame type and CapTxAppData capability bit.
- Implement command parsing for portnum/to/channel/flags/payload and validate payload bounds.
- Add a pending command queue and process commands from AppContext::update() to keep IO task light and avoid direct service execution in the USB thread.
- Route Team app portnums (300..304) to TeamController send paths, including Team mgmt wire decoding and plain/encrypted mgmt selection via flags.
- Preserve generic mesh sendAppData fallback for non-Team app portnums.
- Update hostlink protocol docs with CMD_TX_APP_DATA payload, flags, and Team source mapping/compat notes.
Team service/controller send path:
- Extend TeamController and TeamService send APIs with dest and want_ack parameters for mgmt/chat/position/waypoint/track.
- Add explicit send error mapping for hostlink result reporting and improve last_send_error assignment on encode/encrypt/mesh failures.
UI and data model for semantic location markers:
- Add TeamLocationMarker icon enum helpers and integrate source->icon mapping in UI rendering.
- Update team chat compose Position action to open a marker picker dialog with icon choices and cancel flow.
- Encode selected marker in TeamChatLocation.source, auto-fill label, and send as TEAM_CHAT location payload.
- Extend ChatMessage model with team_location_icon and geo fields so conversation and map can render marker semantics.
- Show semantic icon in team conversation message bubble when location source is a known marker.
- Add GPS map overlay for recent semantic team location markers with member/time labels and lifecycle cleanup.
Assets and docs:
- Add LVGL image assets for AreaCleared/BaseCamp/GoodFind/Rally/SOS markers and source PNGs.
- Update TEAM/HostLink docs with source enum mapping and unknown-value fallback guidance for PC clients.
Other platform-specific input adjustment:
- Refine T-Deck LVGL encoder data reset path to avoid stale state interactions in the input callback.
* feat: PA adjust
* feat: topbar status icon
* fix: settings bug
* feat: unify UI theme and node info link stats
* Improve mesh handling, input back actions, and keyboard alt symbols
- add IRQ/NVS diagnostics for radio and persistence
- refresh link stats and adjust NodeInfo/Position reply handling
- handle Backspace to trigger page back actions
- make Alt act as symbol modifier and rename GPS menu to Map
* fix: hostlink
* style: format
* draft
* Adjust IME candidate scrolling and space behavior
* Remove IME buffer label and update remaining counter
* Align Meshtastic handling and stabilize chat UI
- Align Meshtastic send/receive flow: add routing ACK decoding/log mapping, ack timeouts, channel tracking, and richer RX/TX diagnostics.
- Persist and manage PKI peer keys; add PKI backoff on NO_CHANNEL/UNKNOWN_PUBKEY and fall back to PSK when needed.
- Improve chat UI state handling: safer app switching with exit callbacks, active app clearing on menu return, and safer chat container cleanup.
- Fix Contacts → Compose parent selection to avoid UI tree mismatch; add broadcast compose support and refine action button behavior.
- Add UI debug logging for screen/parent validity and child counts to diagnose black-screen/stacking issues.
- Apply timezone offset helpers for display-time formatting and reuse in screenshot timestamps.
* Add changelog entry and time helpers