- TCPClientInterface overrides needs_transport_headers() so hops==1
packets get HEADER_2 wrapping through the hub
- Track savedCounter in LXMFMessage and use direct filename lookup
for status updates, fixing LoRa uptime-timestamp precision loss
that caused SENT status to revert to QUEUED on reload
- Remove timestamp-based re-sort in loadConversation() which broke
chronological order when mixing LoRa (uptime) and TCP (epoch)
timestamps; counter-based filenames already provide correct order
4-layer defense against 100+ node announce storms from rns.ratspeak.org:
- Transport-level rate limiter (5/sec) via filter_packet callback, before Ed25519 verify
- TCP frame processing time-boxed to 15ms per loop iteration
- Global announce rate limit (3/sec) in AnnounceManager
- UI rebuild throttled to once per 2 seconds
Also fixes message status not persisting to disk on queue drain.
- Evict highest-hop unsaved nodes first when peer list is full (nearby peers survive)
- Add first-boot SD data cleanup screen before name input
- Conversation summaries cache for faster message list rendering
- Optimize message view refresh with summary-based change detection
- Streamline unread tracking through MessageStore instead of LXMFManager
- Add NTP time sync on WiFi STA connect (fixes --:-- timestamps)
- Throttle LXMF send retries to 2s intervals, increase max to 30 (~60s window)
- Restore message status re-save to disk after send completes (QUEUED→SENT/FAILED)
- Update GitHub org URLs to ratspeak
- Fix LXMF wire format: standardize on opportunistic [src:16][sig:64][content]
- Fix LXMF signature: sign(dest||src||packed) per spec, remove message_hash
- Fix MsgPack interop: handle both str and bin types for title/content
- Radio defaults changed to Balanced preset (SF9/BW250k/CR5/TX14)
- Messages screen: sorted by most recent, preview with You:/Them:, green unread dot, timestamps
- Status bar: replace LoRa/BLE/WiFi text with signal bars (green=connected, red=offline)
- Home screen: remove Unread info (shown in Messages tab)
- Contacts screen added (Friends tab)
- Identity manager: multi-slot identity support with per-slot display names
- Message store: fix peer hash truncation, SD directory creation, .bak file leak
- Settings: check for updates, active identity display, info diagnostics
Stability fixes:
- Fix message duplication (8x repeat) via messageId-based filenames
- Fix message ordering with epoch timestamps (NTP-aware fallback)
- Fix device freezes: MessageView caches messages instead of reading
disk every frame at 20fps (now refreshes every 500ms)
- Fix .bak file cascade: filter all file ops to .json only, cleanup junk
- Fix radio presets not persisting across reboots (removed force-override)
Settings redesign:
- Collapsible category navigation (6 categories with summaries)
- Enter to drill into category, Backspace to return
- WiFi network scanner with signal bars and RSSI display
- WiFi SSID/Password fields for STA mode
- TCP server preset (None / Ratspeak Hub / Custom) with host/port
- Frequency selector (868/906/915/923 MHz) and Preamble setting
- Factory reset with confirmation step
- Reboot device action
- Merged small categories (Input into Display, Actions into System)
New features:
- TCP network support for rns.ratspeak.org connectivity
- Preamble stored/applied in config and radio at boot
- Version bumped to 1.3.0
- Add seen messageId set to processIncoming() to prevent duplicate
processing of the same message arriving via multiple callbacks
- Remove redundant save at QUEUED stage (only save after send attempt)
- Cap dedup set at 100 entries to prevent memory growth
- Remove boot display test (color bars + 1.5s delay)
- Show identity hashes on NodesScreen (colon-formatted, matching own identity display)
- Show node names in MessagesScreen and MessageView instead of raw hex
- Add message status indicators in chat (*/!/~ for sent/failed/queued)
- Fix LXMF send: retry Identity::recall() up to 5 times before failing
- Add LXMF logging throughout send/receive/queue drain
- Remove Alt+IJML arrow key mapping (obsolete with trackball)
- Filter own node from discovered nodes list
- Update troubleshooting docs with SetModulationParams STDBY fix