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
Nodes is now the single node hub. "Nearby Nodes" is renamed Nodes and gains on-device contact management — no phone app needed: Hold Enter on a row opens Add contact (for a scanned-but-unknown node), Favourite/Unfavourite (pins to the first free Favourites Dial slot, shown as a star in the list), and Delete contact (confirm first, defaults to Cancel). The filter strip (LEFT/RIGHT) is now a visible, wraparound tab carousel instead of a hidden mode. The old read-only Recent adverts home page is retired — its passively-heard nodes now simply show up in the Nodes list (All filter) — so there's one list instead of two.
On-device channel management. Messages › Channels gets a "+ Add channel" row and per-channel Edit/Delete — no phone app required. Adding a channel now starts with a type picker, matching the phone app: Public (re-adds the well-known default channel, no typing needed), Hashtag (type just a topic name, e.g. test — the channel name and secret are both derived from it, same convention as the app's #topic channels), or Private (manual Name + Secret, typing either a passphrase hashed to the channel secret, or the exact 32-hex-character key from a channel QR code).
Tools › Admin — administer a remote repeater/room from the device. Log into a node you have admin rights on (same self-healing saved-password handshake as room logins) and browse its settings in category tabs — System (name, owner info), Radio (Frequency/Bandwidth/Spreading factor/Coding rate/TX power), Routing (Repeat/Advert interval/Flood advert interval/Max hops), Actions (reboot, send advert, sync clock, …) — plus a free-text Custom command… escape hatch (with {}-key command-name completion) for anything not covered. Radio and Routing fields use a type-appropriate editor instead of raw text — a digit-cursor for Frequency (the same widget Settings' own Radio screen uses locally), discrete-set stepping for Bandwidth/Spreading factor/Coding rate, plain number steppers for the rest, and an ON/OFF toggle for Repeat — adjusting a value costs no mesh traffic until you actually confirm it with Enter (Cancel sends nothing). Reachable either from Tools › Admin (opens the same Nodes list to pick a target) or directly via a repeater/room's own Hold Enter › Admin action.
Auto-Reply Bot gains a third target: room servers, alongside DM and Channel, with its own trigger/reply/commands — the screen is redesigned as a circular tab carousel (Direct/Channel/Room/Other, LEFT/RIGHT to switch, UP/DOWN within a tab) instead of one long list. Each target's Enable and Commands toggle is now fully independent (they used to secretly share the DM tab's setting for Channel/Room too). New {name}/{hops} reply placeholders, a DM allow-list (all chat contacts or favourites only), and a dedicated stepper for Quiet Hours.
Keyboard: accent popup, selectable main script, better editing. Holding Enter on a Latin letter with accented variants (a c d e i l n o r s t u y z) now opens a one-row popup of that letter's accents — e.g. holding a offers á à â ã ä å ą — covering every European Latin-diacritic letter (Polish, Czech, Slovak, German, French, Spanish, Portuguese, Nordic, …) from one popup instead of a separate page per language. Settings › Keyboard splits Alphabet into Main and Additional: Main picks which script (Latin/Cyrillic/Greek) the keyboard opens on by default, Additional picks the second one reached via the #@/abc cycle key — so a Cyrillic or Greek typist can make their own script the default instead of always landing on Latin first. Shift is now one-shot by default (capitalises just the next letter; Hold Enter on Shift toggles the old sticky caps-lock back on), Hold Enter on Backspace clears the whole field, and UP from the top letter row enters a cursor-positioning mode (LEFT/RIGHT move; UP/DOWN jump to start/end, then continue on to the special row / letter grid if pressed again once already there) so you can edit or insert anywhere in what you've typed, not just at the end.
Messages get a messenger-style history. History bubbles are now sized to their content and anchored right (outgoing) / left (incoming); the list runs newest at the bottom, growing upward as you scroll into the past; the [+ send] compose button moved to the right edge to match.
Clock Tools: alarm repeat. The Alarm screen gains a Repeat row (Off/Daily/Weekdays/Weekends) — Hour/Minute merge into one Time row edited with an HH:MM digit cursor, and Repeat/Armed now respond to LEFT/RIGHT like every other Settings field instead of Enter-only.
Diagnostics becomes a tab carousel (Live/System/Font): System adds firmware version + build date, device model and the active radio parameters; Font is a rendering test card with one sample line per script the on-device font covers, so coverage can be eyeballed directly.
One unified display font. OLED and e-ink now both draw a single misc-fixed 6×9 font (full Latin/Greek/Cyrillic coverage) generated by a new BDF-to-GFX converter (tools/bdf2gfx.py), retiring the old Default/Lemon switch and the keyboard's per-render font-swap workaround.
Discoverable context menus. Every screen with a Hold Enter action menu now shows a small ≡ glyph in its header, which highlights while the menu is open — so the shortcut no longer has to be guessed.
Status bar and list polish — background-mode icons (Bluetooth/GPS fix/alarm/mute/auto-advert/trail/live-share/repeater/battery) now drop by priority once space runs out, instead of crushing the node name down to a couple of characters; unread counts everywhere are drawn as a filled pill badge; DM/Channel history headers match every other screen's header style; the default home-page carousel is trimmed to Clock/Tools/Shutdown/Favourites/Map (Recent/Radio/BT/Advert/GPS/Sensors are still available, just opt-in under Settings › Home Pages — existing users' saved layouts are unaffected).
On-device room Logout — Messages' room context menu gains a Logout entry (mirrors the app's own logout) alongside the existing Login…, forgetting the saved password so the next open prompts for one again.
Under the hood
Shared TabBar.h extracted from Nodes/Bot's independently duplicated tab-carousel rendering (Admin and Diagnostics are now the 3rd/4th consumers) — also fixes a tab that didn't quite fit vanishing outright instead of ellipsizing.
MyMesh::setChannelLocal() factors out the setChannel/saveChannels/onChannelRemoved sequence previously duplicated across the BLE app's two CMD_SET_CHANNEL branches, now shared with the new on-device channel editor.
One canonical Admin entry point — UITask::openAdminFor() / AdminScreen::startFor() — reached identically whether Admin is opened from Nodes' Hold-Enter action or the target picker.
KeyboardWidget reworked to UTF-8 codepoints throughout (insert, backspace, T9 in-place cycling), so a multi-byte alt-alphabet character can never be split.
NodePrefs schema grew twice this cycle — alarm_repeat_mask/keyboard_alt_alphabet, then the bot room-target/per-target-independence fields — each verified via a standalone host compile and sizeof/offsetof check, with the schema sentinel bumped both times; existing users' prefs upgrade in place with safe defaults.