You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Message delivery status — outgoing messages now show an end-to-end delivery marker, auto-scaled to the font (legible on landscape e-ink), in both the history list and the fullscreen view:
Direct messages (and room servers): pending → delivered (✓) → failed (✗), driven by the real end-to-end ACK. While pending, a row of dots shows one per send so auto-resend progress is visible.
Auto-resend — a pending DM whose ACK times out is re-sent automatically (reusing the original timestamp) until resends run out. Configurable count under Settings › Messages › Resend (0–5, default 2). Runs in the background, independent of which screen is open; incoming duplicates from retries are dropped.
Channels — ✓ appears only once a repeater echo confirms the message was relayed into the mesh. No echo is normal (flood has no recipient ACK), so no pending/fail is shown.
Auto-reply bot overhaul — the trigger/reply bot grows into a small auto-responder:
Query commands — a DM or monitored-channel message is scanned for ! tokens (!ping !batt !loc !time !temp !hops !status !help) and answered in one combined reply.
Away / reply-to-all — a lone * trigger replies to every message.
Separate DM and channel triggers, each with its own reply text.
Quiet hours — silence push replies during a chosen window (wraps midnight).
Throttling & anti-loop — per-contact DM throttle so one sender can't starve others; channel echo guard so the bot never answers itself; reply counter shown in the bot screen header.
Keyboard overhaul — one shared keyboard across all screens (reclaims duplicate RAM), icon keys (⇧ caps, ⎵ space, ⌫ delete, ✓ OK), and a second symbols page toggled with #@/abc.
UI refresh
Proportional scrollbar with up/down triangle caps replaces the old ^/v arrows, scaling with the font (1× OLED, 2× landscape e-ink); used by every scrollable list and the fullscreen message view. The redundant > selection marker is gone and rows shifted left to reclaim space.
Nearby Nodes reorganized — one list over two sources (stored contacts + live discover scan) with a unified detail/action menu. Type filter and sort are independent axes and persist across re-entry; the active filter is shown in the title and in empty-list messages.
Tools › Trail reorganized — a short two-level action menu (Hold Enter) replaces the flat ~12-item list; view-aware settings; a fitted square map grid; and the waypoint manager split out into its own component. No change to trail recording itself.
OTA updates — each solo release now ships a DFU .zip (solo-<ver>-<device>-ota.zip) for over-the-air / BLE-DFU updates, alongside the .uf2 for USB flashing.
Fixes
GPS battery drain on shutdown — GPS is powered off before SYSTEMOFF, and uses the correct active-level (!PIN_GPS_EN_ACTIVE) instead of a hardcoded level.
Buzzer octave 8 — the RTTTL parser now fully accepts octave 8 instead of clamping it away (which could leak a digit into the next note's duration).
Trail file robustness — Waypoint/trail readers check every header read, so a truncated file is rejected instead of using a garbage count.
Under the hood
OTA DFU zip is named and attached to releases by the _solo_dual build workflow; the per-build Actions artifact already carried it.
Large UI consolidation: shared drawList / header / key-decode helpers, deduplicated status-bar indicators, reusable scalable mini-icon facility (icons.h), and an audit-pass cleanup premoving dead code and redundant scroll-clamp logic.