- 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