This commit is contained in:
MarekZegare4
2026-08-12 21:51:42 +00:00
parent 8cf6e2fc8d
commit 30e65a353a
7 changed files with 52 additions and 52 deletions
File diff suppressed because one or more lines are too long
@@ -1851,8 +1851,8 @@
<p><strong>Press Enter</strong> (short press) on the Clock page to open <strong>Clock Tools</strong>, a small menu with three time utilities. <strong>Cancel</strong> backs out one level (tool → menu → home). The same menu also has an entry under <strong>Tools System</strong>, so it's reachable without the Clock page.</p>
<h4 id="alarm">Alarm</h4>
<p>A wake alarm with an optional repeat. Rows: <strong>Hour</strong>, <strong>Minute</strong>, <strong>Repeat</strong> and <strong>Armed</strong>. <strong>Enter</strong> on Hour or Minute opens the digit editor (LEFT/RIGHT moves between the tens/units, UP/DOWN changes the digit); <strong>Enter</strong> on Repeat cycles <strong>OFF → Daily → Weekdays → Weekends → OFF</strong>; <strong>Enter</strong> on Armed toggles ON/OFF. The configured time is shown next to the <strong>Alarm</strong> menu row when armed, and the setting persists across reboots.</p>
<p>While an alarm is armed a bell icon signals it in two places: the top-left corner of the <strong>Clock page</strong> itself, and the <strong>top status bar</strong> of the other home pages (the status bar is hidden on the Clock page, which is why the clock face carries its own indicator). The bell is icon-only — the exact alarm time is on the <strong>Alarm</strong> row inside Clock Tools.</p>
<p>The alarm is scheduled as an absolute fire instant, so it is <strong>robust to clock re-syncs</strong> — the mesh (every inbound packet), the companion app, GPS and the CLI can all jump the device clock at any moment. A correction that moves the clock a little still fires at the right wall-clock time; a jump that skips over the alarm time still fires (late). With <strong>Repeat</strong> set to OFF (the default) the alarm disarms itself after firing once, same as before; with a repeat pattern set, it stays armed and re-schedules itself for the next matching day instead.</p>
<p>While armed, a bell icon shows in the Clock page's top-left corner and in the status bar on other home pages (hidden on the Clock page itself, hence its own indicator). Icon-only — the exact time is on the <strong>Alarm</strong> row in Clock Tools.</p>
<p>The alarm fires at an absolute instant, so it survives clock re-syncs (mesh packets, companion app, GPS and the CLI can all jump the device clock). A jump past the alarm time still fires it, just late. With <strong>Repeat</strong> OFF (default) it disarms after firing once; with a pattern set, it re-arms for the next matching day.</p>
<p>The alarm only fires while the device is <strong>awake</strong> (it keeps running with the display off or locked). It cannot wake the device from a full <strong>Shutdown</strong> (the CPU and RAM are powered down), and needs a valid time source — it stays pending until the clock is synced.</p>
<h4 id="timer-countdown">Timer (countdown)</h4>
<p>A large <strong>HH:MM:SS</strong> readout with one digit underlined. <strong>LEFT/RIGHT</strong> moves the cursor one digit at a time, <strong>Up/Down</strong> changes the digit under it (minute/second tens cap at 5, hours at 23), and <strong>Enter</strong> starts the countdown. While running it shows <strong>H:MM:SS</strong><strong>Enter</strong> stops it, <strong>Cancel</strong> returns to the menu and leaves it counting. When it reaches zero the device rings, even if you have navigated to another screen.</p>
+6 -6
View File
@@ -1668,9 +1668,9 @@
<h2 id="external-keyboard-joystick">External Keyboard &amp; Joystick</h2>
<p><a href="../../README.md">Go back</a></p>
<p>Two optional hardware add-ons, both auto-detected and both entirely optional — a
build with them enabled runs exactly the same with nothing plugged in. Two of
the newer boards also ship with their own <strong>built-in</strong> keypad instead —
<p>Two optional, auto-detected hardware add-ons — a build with them enabled runs
the same with nothing plugged in. Two of the newer boards also ship with
their own <strong>built-in</strong> keypad instead —
see <a href="#built-in-keyboards-cardputer-adv-t-echo-lite--keyshield">Built-in keyboards</a>.</p>
<ul>
<li><strong>CardKB</strong> — an M5Stack I2C QWERTY keyboard (address <code>0x5F</code>), for typing
@@ -1808,9 +1808,9 @@ a CardKB is doing the typing.</p>
</tr>
</tbody>
</table>
<p><strong>Compact is designed to need no joystick at all</strong>, which makes it the right
choice on a board where CardKB is the only input device — for example a Heltec
V3/V4 with no joystick soldered on. In that case set it once and forget it.</p>
<p><strong>Compact is designed to need no joystick at all</strong> — the right choice when
CardKB is the only input device, e.g. a Heltec V3/V4 with no joystick
soldered on.</p>
<p>Cursor mode and the accent / placeholder popups draw their own visible feedback,
so they behave identically in both modes.</p>
<hr />
@@ -1739,7 +1739,7 @@
<li><strong>Custom message</strong> — opens the on-screen keyboard</li>
<li><strong>Q1Q10</strong> — quick reply templates editable in Settings Messages</li>
</ul>
<p>While typing, <strong>UP</strong> from the top letter row enters cursor mode (LEFT/RIGHT move the insertion point; UP/DOWN jump to start/end, then continue on to the special row / letter grid if pressed again once already there; Enter/Cancel exit immediately from anywhere) so you can edit or insert in the middle of what you've typed instead of only at the end. <strong>Hold Enter</strong> on a Latin letter with accented variants (e.g. a, e, c, n, o, s, z…) instead opens a one-row popup of that letter's accents — LEFT/RIGHT to pick, Enter to insert, Cancel to dismiss. See the on-screen keyboard section of the <a href="../../../design/solo_ui_framework/">UI framework guide</a> for the full key set (Shift, T9 multi-tap, Cyrillic/Greek).</p>
<p>While typing, <strong>UP</strong> from the top letter row enters cursor mode LEFT/RIGHT move the insertion point, UP/DOWN jump to start/end (then to the grid on a second press), Enter/Cancel exit from anywhere so you can edit mid-text, not just at the end. <strong>Hold Enter</strong> on a letter with accented variants (a, e, c, n, o, s, z…) opens a one-row accent popup instead — LEFT/RIGHT picks, Enter inserts, Cancel dismisses. Full key set (Shift, T9, Cyrillic/Greek) in the <a href="../../../design/solo_ui_framework/">UI framework guide</a>.</p>
<p>The keyboard supports placeholders that insert live data at send time:</p>
<table>
<thead>
@@ -1795,12 +1795,12 @@
<p>Sensor placeholders appear automatically in the placeholder picker when the corresponding sensor is active. <code>{time}</code> and <code>{loc}</code> are always shown.</p>
<hr />
<h3 id="rooms-logging-in">Rooms — logging in</h3>
<p>Posting to a <strong>room server</strong> requires a login handshake first, so the device can log in on its own no phone app needed. The first time you press <strong>Enter</strong> on a room, a password prompt opens automatically; type the room's password and press the <strong></strong> key (leave it empty and submit for open / no-password rooms). Once the login succeeds the room's chat <strong>opens automatically</strong> no second Enter needed (as long as you're still on that room in the list).</p>
<p>Posting to a <strong>room server</strong> needs a login handshake the device does this on its own, no phone app needed. First <strong>Enter</strong> on a room opens a password prompt automatically; type it and press <strong></strong> (empty for no-password rooms). On success the chat opens automatically, no second Enter needed.</p>
<ul>
<li><strong>Passwords are remembered across reboots.</strong> After a successful login the password is saved on the device, so picking that room again — even after a power cycle — logs back in silently and drops you straight into the chat.</li>
<li><strong>A wrong or changed password self-heals.</strong> If a saved password stops working (e.g. the server's password was changed), the failed login forgets it, so the next <strong>Enter</strong> prompts you to type a new one.</li>
<li><strong>Re-login any time</strong> with <strong>Hold Enter</strong> on the room → <strong>Login…</strong> (see the room context menu below) — useful to switch to a new password without waiting for a failure.</li>
<li><strong>Log out</strong> with <strong>Hold Enter</strong> on a room you're currently logged into<strong>Logout</strong> (only offered once logged in). Forgets the saved password on the device, so the next time you open that room it prompts for one again instead of silently reusing the old one.</li>
<li><strong>Passwords are remembered across reboots.</strong> After a successful login it's saved on the device, so picking that room again — even after a power cycle — logs back in silently.</li>
<li><strong>A wrong or changed password self-heals.</strong> A failed login forgets the saved password, so the next <strong>Enter</strong> prompts for a new one.</li>
<li><strong>Re-login any time</strong> with <strong>Hold Enter</strong> on the room → <strong>Login…</strong> — useful to switch passwords without waiting for a failure.</li>
<li><strong>Log out</strong> with <strong>Hold Enter</strong><strong>Logout</strong> (only offered once logged in). Forgets the saved password, so the next open prompts for one again.</li>
<li>Passwords set from the <strong>phone app</strong> are saved on the device too, so it can post to that room standalone after a reboot.</li>
</ul>
<blockquote>
@@ -1822,7 +1822,7 @@
</tr>
</tbody>
</table>
<p>Messages are drawn as chat bubbles sized to fit their content, anchored <strong>right</strong> for your own outgoing messages and <strong>left</strong> for incoming ones (like a typical messenger), with the sender name and a compact age indicator (<code>3m</code>, <code>2h</code>, <code>&gt;1d</code>) in the top-right corner of each bubble. The list runs <strong>newest at the bottom</strong> opening a history starts you at the latest message, and scrolling <strong>up</strong> goes further into the past.</p>
<p>Messages appear as chat bubbles sized to their content <strong>right</strong>-anchored for outgoing, <strong>left</strong> for incoming with sender name and a compact age indicator (<code>3m</code>, <code>2h</code>, <code>&gt;1d</code>) in the top-right corner. List runs <strong>newest at the bottom</strong>; opening a history starts at the latest message, scrolling up goes further back.</p>
<p><strong>Short Enter</strong> on a message opens it in fullscreen. <strong>Hold Enter</strong> — on a history row or in fullscreen — opens the same options menu: Reply, plus <strong>Navigate</strong> / <strong>Save waypoint</strong> when the message contains a location (see Fullscreen message view). You don't need to open the message first.</p>
<hr />
<h3 id="fullscreen-message-view">Fullscreen message view</h3>
@@ -1978,11 +1978,11 @@
</table>
<hr />
<h3 id="adding-editing-a-channel">Adding / editing a channel</h3>
<p>Joining a new community channel, or creating one to share with others, no longer needs the phone app. The <strong>Channels</strong> list ends with a <strong>"+ Add channel"</strong> row — press <strong>Enter</strong> on it to pick a channel type, or use <strong>Edit</strong> from the context menu above to change an existing channel's name or secret (Edit skips the type picker and opens the Name/Secret form directly).</p>
<p><strong>+ Add channel</strong> first asks which type of channel to create — the same three types the phone app offers:</p>
<p>Joining or creating a community channel no longer needs the phone app. The <strong>Channels</strong> list ends with <strong>"+ Add channel"</strong> <strong>Enter</strong> picks a channel type; <strong>Edit</strong> from the context menu changes an existing channel's name/secret directly, skipping the type picker.</p>
<p><strong>+ Add channel</strong> first asks which type to create — the same three the phone app offers:</p>
<ul>
<li><strong>Public</strong> — instantly re-adds the well-known default public channel (no fields to fill in). Useful if it was deleted and you want it back without remembering its key.</li>
<li><strong>Hashtag</strong> — type a topic name (e.g. <code>test</code>); the channel's name and secret are both derived from it (name becomes <code>#test</code>, secret is the first 16 bytes of <code>sha256("#test")</code>). A topic-based public group chat — anyone who types the same topic elsewhere ends up on the same channel separate from the default Public channel.</li>
<li><strong>Public</strong> — instantly re-adds the well-known default public channel, no fields needed. Useful if it was deleted and you don't remember its key.</li>
<li><strong>Hashtag</strong> — type a topic (e.g. <code>test</code>); name (<code>#test</code>) and secret (first 16 bytes of <code>sha256("#test")</code>) are both derived from it. A topic-based public chat — anyone typing the same topic elsewhere lands on the same channel, separate from the default Public one.</li>
<li><strong>Private</strong> — the manual Name + Secret form:</li>
</ul>
<table>
@@ -2004,10 +2004,10 @@
</tbody>
</table>
<ul>
<li><strong>Passphrase</strong> (default) — type any text; the device hashes it down to the channel's 16-byte secret. Easiest to agree on verbally, the same idea as a room password — two people who type the same passphrase end up on the same channel.</li>
<li><strong>Hex key</strong> type the exact 32-hex-character secret (the format used by channel QR codes, see <a href="../../../qr_codes/">QR Codes</a>), for joining a channel whose precise secret you were given rather than agreeing on a new passphrase. An all-zero secret (<code>00…0</code>) is rejected ("Invalid secret") — that value is reserved internally to mark an empty channel slot.</li>
<li><strong>Passphrase</strong> (default) — type any text; the device hashes it to the channel's 16-byte secret. Easiest to agree on verbally same idea as a room password.</li>
<li><strong>Hex key</strong> — the exact 32-hex-character secret (channel QR code format, see <a href="../../../qr_codes/">QR Codes</a>), for joining with a secret you were given rather than a new passphrase. An all-zero secret (<code>00…0</code>) is rejected reserved internally for an empty slot.</li>
</ul>
<p>Select <strong>[Save]</strong> to commit. The secret can't be redisplayed once saved (only the derived key is kept) — editing it later means typing a new passphrase or hex key, the same as re-logging into a room with a new password.</p>
<p>Select <strong>[Save]</strong> to commit. The secret can't be redisplayed once saved (only the derived key is kept) — editing later means typing a new one, same as re-logging into a room.</p>
<hr />
<h3 id="mark-all-read">Mark all read</h3>
<p><strong>Hold Enter</strong> on the DM / Channels / Rooms mode-select screen to clear all unread counters for the highlighted category at once.</p>
@@ -1611,7 +1611,7 @@
<hr />
<h3 id="locking-and-unlocking">Locking and unlocking</h3>
<p><strong>Hold Back</strong> and press <strong>Enter</strong> three times within 3 seconds. The sequence works in both directions — the same combination locks and unlocks.</p>
<p>On boards with an optional CardKB (I2C keyboard) attached, a single <strong>Fn+Esc</strong> does the same thing, in either direction — no repetition needed, since Fn+Esc is already a deliberate two-key combo. Esc rather than the adjacent Backspace, since Fn and Backspace sit right next to each other on CardKB's layout and would be too easy to hit by accident.</p>
<p>On boards with a CardKB attached, <strong>Fn+Esc</strong> does the same thing in one press. Esc rather than the adjacent Backspace — those two keys sit next to each other on CardKB's layout and would be too easy to hit by accident.</p>
<p>If the display is off when the sequence begins, it turns on automatically so the hint is visible. Each press in the physical sequence extends the display-on timer by 5 seconds.</p>
<p>The hint popup at the bottom of the lock screen guides through the physical sequence:</p>
<table>
@@ -1662,7 +1662,7 @@
<p>The display turns off again automatically after 5 seconds of inactivity (or 2 seconds immediately after locking).</p>
<hr />
<h3 id="auto-lock">Auto-lock</h3>
<p>Enable <strong>Auto-lock</strong> in <strong>Settings Display</strong> to lock the device automatically whenever the display turns off due to auto-off timeout. With auto-lock on, the device is always locked after the screen goes dark — no manual lock needed.</p>
<p>Enable <strong>Auto-lock</strong> in <strong>Settings Display</strong> to lock the device automatically whenever the display turns off due to auto-off timeout.</p>
@@ -1887,12 +1887,12 @@
<tr>
<td>Pwr save</td>
<td>ON / OFF</td>
<td><strong>Battery saver.</strong> Hardware duty-cycle receive: the SX126x cycles RX↔sleep on its own and wakes on a preamble, cutting average RX current. Trades a little receive latency; leave OFF for lowest-latency reception. Requires an SX126x radio (otherwise stays on continuous RX). <strong>Forced off (shown as <code>--</code>) while the repeater is on</strong>a repeater must listen continuously; your setting is restored when the repeater is switched off. A background watchdog recovers automatically if the duty-cycle sequencer ever gets stuck (soft re-arm, then a full radio reset) — see Tools Diagnostics for the recovery counts.</td>
<td><strong>Battery saver.</strong> Hardware duty-cycle receive (SX126x only): cycles RX↔sleep, wakes on preamble, cuts average RX current at the cost of some latency. <strong>Forced off (<code>--</code>) while the repeater is on</strong>restored once it's switched off. A background watchdog auto-recovers if the sequencer gets stuck (soft re-arm, then a full reset) — see Tools Diagnostics for the counts.</td>
</tr>
<tr>
<td>Auto pwr</td>
<td>ON / OFF</td>
<td><strong>Adaptive Power Control.</strong> Lowers actual TX power on strong links to save energy, ramping back up — to the <strong>TX Pwr</strong> ceiling on weak or lost links. Link quality comes from direct-message ACK SNR and, for channel messages (no ACK), from hearing a repeater rebroadcast your packet. The radio page / name bar shows the live power. Default OFF (fixed TX power). <strong>Suppressed (shown as <code>--</code>) while the repeater is on</strong>a repeater holds full TX power for consistent relay reach; your setting is restored when the repeater is switched off.</td>
<td><strong>Adaptive Power Control.</strong> Lowers TX power on strong links, ramps back to the <strong>TX Pwr</strong> ceiling on weak/lost ones. Link quality from DM ACK SNR, or — for channels (no ACK) a repeater's rebroadcast. Live power shown on the radio page/name bar. Default OFF. <strong>Suppressed (<code>--</code>) while the repeater is on</strong>restored once it's switched off.</td>
</tr>
</tbody>
</table>
@@ -1942,7 +1942,7 @@
<tr>
<td>GPS pwr <em>(if GPS detected)</em></td>
<td>OFF / 1 min / 5 min / 15 min / 30 min / 1 h</td>
<td><strong>Battery saver.</strong> Cycles GPS off between fixes instead of running it continuously; each wake waits for a fix (up to 60 s) before sleeping again for the chosen interval. Automatically stays continuously on regardless of this setting whenever something needs a live position — an active Trail recording, Map Live share, an armed Locator, the Compass / Nearby navigate view, or an in-flight <code>!gps fix</code> bot request. <code>OFF</code> (default) matches earlier releases: GPS runs continuously whenever enabled. The GPS status icon blinks while napping between fixes.</td>
<td><strong>Battery saver.</strong> Cycles GPS off between fixes; each wake waits up to 60 s for a fix before sleeping again. Stays continuously on whenever something needs a live position — Trail recording, Live share, an armed Locator, Compass/Nearby, or an in-flight <code>!gps fix</code>. <code>OFF</code> (default) = always-on, as before. Status icon blinks while napping.</td>
</tr>
<tr>
<td>Units</td>
@@ -1970,17 +1970,17 @@
<tr>
<td>Layout</td>
<td>ABC / T9</td>
<td>On-screen keyboard style. <strong>ABC</strong>: an a-b-c…z grid, one key per letter (the original layout). <strong>T9</strong>: phone-keypad multi-tap — each key is labelled with its <strong>digit</strong> and a letter group (e.g. <code>2abc</code>); repeated <strong>Enter</strong> presses cycle through the letters and then the digit itself. Applies to whichever script page is active (see Main/Additional below), not just Latin.</td>
<td>On-screen keyboard style. <strong>ABC</strong>: a-b-c…z grid, one key per letter. <strong>T9</strong>: phone-keypad multi-tap — each key labelled digit+letters (e.g. <code>2abc</code>); repeated <strong>Enter</strong> cycles the letters then the digit. Applies to whichever script page is active, not just Latin.</td>
</tr>
<tr>
<td>Main</td>
<td>Latin / Cyrillic / Greek</td>
<td>Which script the keyboard <strong>opens on by default</strong>. <strong>Latin</strong> (default) matches earlier releases; pick <strong>Cyrillic</strong> or <strong>Greek</strong> here instead to make that script the one you land on every time, with Latin becoming the one reached via cycling (see Additional below) instead of the other way round.</td>
<td>Which script the keyboard opens on by default. <strong>Latin</strong> is the default; picking <strong>Cyrillic</strong> or <strong>Greek</strong> makes that the one you land on, with Latin moving to the Additional cycle instead.</td>
</tr>
<tr>
<td>Additional</td>
<td>Latin / Cyrillic / Greek</td>
<td>The second script added to the same <strong>#@/abc</strong> key's cycle (Main → Additional → Symbols → Main) — no separate key to switch scripts. Setting Additional to the <strong>same</strong> script as Main drops the cycle back to just that script plus Symbols (no second script page at all). <strong>Greek</strong> covers the 24-letter alphabet plus final sigma (<code>ς</code>) but not the tonos stress accents used in proper Modern Greek spelling. Every script's letters render natively — the display font (a single unified Unicode font used everywhere on-screen) covers all of them, no separate toggle needed.</td>
<td>The second script in the <strong>#@/abc</strong> key's cycle (Main → Additional → Symbols → Main). Setting it to the same script as Main drops the cycle to just that script plus Symbols. <strong>Greek</strong> covers the 24-letter alphabet plus final sigma (<code>ς</code>), not the tonos stress accents. Every script renders natively via one shared Unicode font — no separate toggle needed.</td>
</tr>
</tbody>
</table>
@@ -2404,7 +2404,7 @@ The <strong>Map</strong> view is also reachable directly from the home carousel
<p><strong>Auto-pause</strong> — when set, a recording trail automatically <strong>pauses</strong> after the device has stayed within ~15 m of one spot for the chosen delay: the elapsed timer and point sampling both freeze, and the map line breaks across the idle gap. It <strong>resumes on its own</strong> as soon as you move again. This keeps a stop (a break, a meal, parking) out of your distance and average-speed stats without you having to remember to stop and restart tracking. A paused trail is still "on" (the <strong>G</strong> marker keeps blinking) — the Summary <strong>Status</strong> row shows <code>paused</code>. The stop is detected with its own coarse movement gate, independent of <strong>Min dist</strong>, so GPS jitter while you're parked doesn't keep it awake.</p>
<p><strong>Auto-save</strong> — with this on (default off), the live trail is written to flash automatically when the device powers off, so a <strong>low-battery auto-shutdown</strong> no longer discards the whole route. It saves to the same <code>/trail</code> file as the manual <strong>Trail file… → Save</strong>, and only writes when the trail actually has points — an empty trail can't overwrite a previously saved one. Off by default so a normal shutdown doesn't silently overwrite a saved trail you meant to keep.</p>
<h3 id="track-back">Track back</h3>
<p><strong>Hold Enter → Track back</strong> retraces the trail you just recorded, back to where you started — useful for returning the same way in poor visibility or unfamiliar ground. It reuses the navigation view (distance + two absolute bearings; see <em>Waypoints Navigating</em>), but instead of a single fixed target it walks the recorded breadcrumbs in reverse: it snaps onto the route at the <strong>nearest recorded point</strong>, guides you to it, then automatically advances to the next earlier point as you reach each one (within ~20 m). The header shows how many points remain (<code>Back: 12 pt</code>), reading <code>Trail start</code> on the final leg; arriving there shows <code>Back at start</code> and exits. <strong>Cancel</strong> leaves track-back at any time. It needs a trail with at least two points and a GPS fix; it doesn't require tracking to still be running.</p>
<p><strong>Hold Enter → Track back</strong> retraces your recorded trail back to the start — useful in poor visibility or unfamiliar ground. It reuses the navigation view (distance + two absolute bearings; see <em>Waypoints Navigating</em>), but walks the recorded breadcrumbs in reverse: snaps to the <strong>nearest recorded point</strong>, guides you to it, then advances to the next earlier point as you reach each one (within ~20 m). The header shows points remaining (<code>Back: 12 pt</code>), reading <code>Trail start</code> on the final leg; arriving shows <code>Back at start</code> and exits. <strong>Cancel</strong> leaves track-back at any time. Needs a trail with at least two points and a GPS fix; tracking doesn't need to still be running.</p>
<h3 id="waypoints">Waypoints</h3>
<p>A waypoint is a saved spot — your car, camp, a water source — that you can navigate back to later. Waypoints are <strong>independent of the trail</strong>: they live in their own flash file (<code>/waypoints</code>), survive a reboot, and are <strong>not</strong> cleared by <em>Reset trail</em>. Up to 16 can be stored — the Waypoints list header shows how many are in use (e.g. <code>WAYPOINTS 3/16</code>).</p>
<p><strong>Dropping a waypoint</strong><strong>Hold Enter → Mark here</strong>. This captures the current GPS fix and opens the on-screen keyboard for a short label (up to 11 characters — e.g. <code>CAR</code>, <code>CAMP</code>, <code>H2O</code>). Leaving it blank auto-names it <code>WP1</code>, <code>WP2</code>, … Marking works whether or not the trail is being recorded; it needs a GPS fix (otherwise it reports <em>No GPS fix</em>).</p>
@@ -2431,7 +2431,7 @@ The <strong>Map</strong> view is also reachable directly from the home carousel
<li><strong>Label</strong><strong>Enter</strong> to type a name (blank → auto <code>WP&lt;n&gt;</code>).</li>
<li><strong>Save</strong> — validates the range and stores the waypoint. Missing or out-of-range values report a brief error.</li>
</ul>
<p><strong>On the map</strong> — saved waypoints show on the Trail Map view as a hollow diamond with the label's first two characters beside it (enough to tell nearby waypoints apart). Waypoints and your current GPS position are drawn continuously even with no trail recording in progress — so the Map view doubles as a live "you + your marks" view, not just a recorded-track plot. With <strong>no trail</strong>, the view auto-fits to your waypoints and position. <strong>While a trail exists</strong>, the view frames the recorded route instead, and any waypoint that falls outside it is clamped to the nearest map edge a distant mark can't blow up the scale and squash the trail.</p>
<p><strong>On the map</strong> — saved waypoints show as a hollow diamond with the label's first two characters beside it. Waypoints and your GPS position are drawn continuously, even with no trail recording, so the Map view doubles as a live "you + your marks" view. With <strong>no trail</strong>, it auto-fits to waypoints and position; <strong>with a trail</strong>, it frames the route instead, clamping any out-of-frame waypoint to the nearest edge so a distant mark can't blow up the scale.</p>
<p><strong>Navigating</strong><strong>Hold Enter → Waypoints</strong> opens the list (each row shows the label and live distance). The list always begins with a synthetic <strong>Trail start</strong> row whenever a trail exists, so you can backtrack to where you began without having marked it. Select a row and press <strong>Enter</strong> to open the navigation view:</p>
<pre><code> CAMP ← target label
1.4 km ← distance to target
@@ -2474,7 +2474,7 @@ The <strong>Map</strong> view is also reachable directly from the home carousel
<li><strong>macOS/Linux</strong><code>cat /dev/tty.usbmodem* &gt; track.gpx</code> (stop with Ctrl-C after the dump finishes)</li>
<li><strong>Windows</strong> — PuTTY (Serial, 115200) or Arduino IDE Serial Monitor with no line ending; copy the text from <code>&lt;?xml</code> to <code>&lt;/gpx&gt;</code> into a <code>.gpx</code> file</li>
</ul>
<p>Saved <strong>waypoints are included</strong> in the export as GPX <code>&lt;wpt&gt;</code> elements (with their label as <code>&lt;name&gt;</code>), alongside the track — so they show as pins in OsmAnd, Garmin BaseCamp, GPX Studio, Google Earth, etc. Either way, the resulting file imports into all of those.</p>
<p>Saved <strong>waypoints are included</strong> in the export as GPX <code>&lt;wpt&gt;</code> elements (with their label as <code>&lt;name&gt;</code>), alongside the track — so they show as pins in OsmAnd, Garmin BaseCamp, GPX Studio, Google Earth, etc.</p>
<blockquote>
<p>[!NOTE]
If the companion app is connected via <strong>BLE</strong>, the export is safe — BLE and USB operate independently. If connected via <strong>USB</strong>, disconnect the app before exporting.</p>
@@ -2484,7 +2484,7 @@ If the companion app is connected via <strong>BLE</strong>, the export is safe
<p>Periodically broadcasts a 0-hop advert with your GPS position. Configurable interval: OFF / 30 s / 1 min / 2 min / 5 min / 10 min / 30 min / 1 h. A blinking <strong>A</strong> appears in the status bar while active.</p>
<blockquote>
<p>[!TIP]
<strong>Audible connection heartbeat</strong> — the device chirps each time it <em>receives</em> an advert from any node (sound chosen in <strong>Settings Sound AD sound</strong>). With Auto-Advert running on both ends (e.g. two people on a hike), each hearing the other's periodic advert becomes a hands-free "in range" beep — no need to look at the screen. It fires for <strong>every</strong> received advert, so in a busy mesh it can get chatty; choose <code>None</code> in <strong>Settings Sound AD sound</strong> to silence just this event, or set <strong>Settings Sound Advert scope</strong> to <code>Zero-hop</code> to limit it to local adverts only. You can also set <strong>Settings Sound Buzzer</strong> to <em>OFF</em> (or <em>Auto</em>, which mutes while a companion app is connected) to silence all buzzer output.</p>
<strong>Audible connection heartbeat</strong> — the device chirps on every <em>received</em> advert (sound in <strong>Settings Sound AD sound</strong>). With Auto-Advert on both ends (e.g. two hikers), each hears the other's periodic advert as a hands-free "in range" beep. It fires on <strong>every</strong> received advert, so a busy mesh gets chattyset <code>None</code> in <strong>AD sound</strong> to silence just this, or <strong>Advert scope</strong> to <code>Zero-hop</code> to limit it to local adverts. <strong>Settings Sound Buzzer</strong> = <em>OFF</em> (or <em>Auto</em>, mutes while a companion app is connected) silences all buzzer output.</p>
</blockquote>
<hr />
<h2 id="live-share">Live Share</h2>
@@ -2548,7 +2548,7 @@ If the companion app is connected via <strong>BLE</strong>, the export is safe
</tr>
</tbody>
</table>
<p><strong>How auto-share decides to send.</strong> With <strong>Auto share</strong> on, the device checks a few times a minute: it transmits when you've moved at least <strong>Move</strong> metres <em>and</em> at least <strong>Min gap</strong> has passed since the last send — so a stationary device stays silent unless a <strong>Heartbeat</strong> is set. It also sends once immediately when you enable sharing (or change the target), so the other end gets a fresh fix right away.</p>
<p><strong>How auto-share decides to send.</strong> The device checks a few times a minute and transmits once you've moved at least <strong>Move</strong> metres <em>and</em> <strong>Min gap</strong> has passed since the last send — a stationary device stays silent unless <strong>Heartbeat</strong> is set. It also sends once immediately on enabling sharing (or changing the target).</p>
<p><strong>Receiving.</strong> With <strong>Track loc</strong> on, incoming <code>[LOC]</code> messages update a small live table (up to 16 nodes, entries expire ~20 min after the last update). DM shares are keyed by the sender's public key (reliable); channel and room-server shares are keyed by name (best-effort, since channel names are unsigned and a room post only carries a short sender prefix). Tracked nodes appear on the <strong>Trail Map</strong> as a filled diamond with the first two characters of their name, and in <strong>Nearby Nodes</strong> with their live distance/bearing.</p>
<p><strong>One-shot share.</strong> To send your position once without enabling auto-share, use <strong>Tools Trail → Hold Enter → Share my pos</strong> — it builds a <code>[LOC]</code> message and hands it to the Messages screen to pick a recipient. There's also a shortcut from the home <strong>Map</strong> page: <strong>Hold Enter</strong> sends an immediate position update to your Live Share target while auto-sharing is on (toast <code>Position shared</code>), or opens the recipient picker if it isn't — so you never broadcast to a default channel by accident.</p>
<hr />
@@ -2569,7 +2569,7 @@ If the companion app is connected via <strong>BLE</strong>, the export is safe
</table>
<!-- screenshot pending: Locator screen with a target set (e.g. "@Bob (5m)"), radius/mode/beeper rows -->
<p>A single <strong>geofence</strong> that beeps and shows an alert when you cross <strong>into</strong> or <strong>out of</strong> a radius. The target can be a <strong>saved waypoint</strong> (a fixed place — "tell me when I'm back at camp") or a <strong>live contact</strong> (a person sharing their position via Live Share — "alert me when my friend gets near / falls behind"). A waypoint target is a <strong>snapshot</strong> (coordinate + label copied), so it keeps working even if you later edit that waypoint; a contact target follows the person's latest shared position. <strong>Deleting</strong> the target's waypoint, or the target contact being removed from the contacts list, clears the Locator target back to <code>none</code> instead of leaving it pointed at something that's gone.</p>
<p>A single <strong>geofence</strong> that beeps and alerts when you cross <strong>into</strong> or <strong>out of</strong> a radius. The target is either a <strong>saved waypoint</strong> (a fixed place — "tell me when I'm back at camp") or a <strong>live contact</strong> ("alert me when my friend gets near / falls behind"). A waypoint target is a <strong>snapshot</strong> it keeps working even if you edit that waypoint later; a contact target follows their latest shared position. If the target waypoint or contact is deleted, the Locator target clears back to <code>none</code>.</p>
<p>Navigate with <strong>UP/DOWN</strong>, change a value with <strong>LEFT/RIGHT</strong> (or <strong>Enter</strong>); <strong>Cancel/Back</strong> saves and returns to Tools.</p>
<table>
<thead>
@@ -2608,8 +2608,8 @@ If the companion app is connected via <strong>BLE</strong>, the export is safe
</tbody>
</table>
<p><strong>Crossing alert.</strong> When armed with a target, the device watches its own GPS fix and fires the alert (a short melody plus an on-screen message) the moment you cross the radius, according to <strong>Mode</strong>. The wording adapts to the target — <code>Arrived</code> / <code>Left</code> for a waypoint, <code>Near</code> / <code>Away</code> for a person. The edge has a little hysteresis so a fix hovering right on the boundary doesn't chatter, and the first reading after arming only seeds the in/out state — it won't fire spuriously just because you armed it while already inside.</p>
<p><strong>Following a person.</strong> Pick a <strong>favourite</strong> (or any contact with a known position) as the target and the geofence tracks the distance <em>between you and them</em>, so it works even while both of you move. The position is resolved with a fixed precedence: an <strong>active live <code>[LOC]</code> share</strong> wins, and with no current share it <strong>falls back to the contact's last-advertised GPS position</strong> — so a rarely-updating but stationary node (a repeater, or someone who shared a fix once) still works as a target. You can arm it <strong>ahead of time</strong> — choosing a favourite locks onto their identity (pubkey), and the alert starts working as soon as a position is known. Live following requires a <strong>DM</strong> share (a channel share carries no stable identity to lock onto); the last-advertised fallback works for any contact regardless.</p>
<p><strong>Proximity beeper.</strong> With <strong>Beeper</strong> on, the device also ticks while you're inside the radius and <strong>shortens the gap between ticks the closer you get to the target</strong> — slow near the edge, rapid near the centre — like a homing beeper guiding you to the exact spot. It's silent outside the radius. Because the beeper is its own opt-in toggle, turning it on <strong>overrides the global buzzer mute</strong> (<strong>Settings Sound Buzzer</strong>) — it's an explicit "I want to hear this". Since homing only makes sense while you're approaching a target, the <strong>Beeper</strong> row appears only in <strong>Arrive</strong> or <strong>Both</strong> mode — it's hidden in <strong>Leave</strong>-only mode, and stays silent there even if it was switched on earlier. Otherwise it's independent of the crossing alert (which does follow the mute), so you can use either or both.</p>
<p><strong>Following a person.</strong> Pick a <strong>favourite</strong> (or any contact with a known position) as the target and the geofence tracks the distance <em>between you and them</em>, working while both of you move. Position resolves with a fixed precedence: an active live <code>[LOC]</code> share wins, falling back to the contact's last-advertised position otherwise — so a stationary node (a repeater, or a one-time fix) still works. You can arm ahead of time a favourite locks onto their pubkey, and the alert starts once a position is known. Live following needs a <strong>DM</strong> share (a channel share has no stable identity); the last-advertised fallback works for any contact.</p>
<p><strong>Proximity beeper.</strong> With <strong>Beeper</strong> on, the device ticks while inside the radius, shortening the gap as you get closer — slow near the edge, rapid near the centre — like a homing beeper. Silent outside the radius. As an opt-in toggle, it <strong>overrides the global buzzer mute</strong> — an explicit "I want to hear this." It only appears in <strong>Arrive</strong>/<strong>Both</strong> mode (hidden and silent in <strong>Leave</strong>-only). Independent of the crossing alert, which does follow the mute use either or both.</p>
<p><strong>Setting the target from anywhere.</strong> Besides this screen's picker, the <em>same</em> active target can be set in one step with <strong>Set as target</strong> from <strong>Nearby Nodes</strong>' or <strong>Waypoints</strong>' own <strong>Hold Enter</strong> menu — handy so you don't need a detour through Tools. Picking from this screen's picker saves on exit (so <strong>LEFT/RIGHT</strong> cycling stays cheap); the per-item shortcuts save immediately and confirm with a <code>Target set</code> toast.</p>
<p><strong>On the map.</strong> Whatever the active target is — person or waypoint — it's drawn as a <strong>flag marker</strong> on both the home <strong>Map</strong> preview and the full <strong>Trail Map</strong>, on top of any waypoint/contact it overlaps and folded into the frame so it never sits off-screen. This shows even when the <strong>Alert</strong> master switch is off, so a target you set purely to navigate to still appears.</p>
<table>
@@ -2666,8 +2666,8 @@ Mark the spot first with <strong>Tools Trail → Hold Enter → Mark here</s
</table>
<!-- screenshot pending: Compass — scrolling heading tape with centre pointer + large degrees/cardinal readout -->
<p>A heads-up GPS compass. The L1 has no magnetometer, so the heading is the <strong>course over ground</strong> — derived from how your GPS position moves over the last few seconds. The display is a horizontal <strong>heading tape</strong>: a fixed travel-direction pointer sits at the centre and the N..E..S..W scale scrolls underneath it as you turn, so whatever is under the pointer is your current course. A large numeric readout below shows that course in degrees and cardinal (e.g. <code>145° SE</code>).</p>
<p>Because the heading comes from movement, it only updates while you are actually moving: standing still shows <em>move to set heading</em> (and navigation's <strong>Hdg</strong> line reads <code>--</code>). Gross GPS jumps are rejected so a single bad fix can't swing the heading. The heading source runs whenever there's a GPS fix recording a trail is <strong>not</strong> required.</p>
<p>A heads-up GPS compass. No magnetometer, so heading is <strong>course over ground</strong> — derived from how your GPS position moved over the last few seconds. Display is a horizontal <strong>heading tape</strong>: a fixed pointer at centre, N..E..S..W scrolling underneath as you turn, so whatever's under the pointer is your course. A large numeric readout below shows it in degrees and cardinal (e.g. <code>145° SE</code>).</p>
<p>Since heading comes from movement, it only updates while moving standing still shows <em>move to set heading</em> (navigation's <strong>Hdg</strong> reads <code>--</code>). Gross GPS jumps are rejected so one bad fix can't swing it. Runs on any GPS fix; recording a trail is <strong>not</strong> required.</p>
<hr />
<h2 id="ringtone-editor">Ringtone Editor</h2>
<table>
@@ -2790,8 +2790,8 @@ Mark the spot first with <strong>Tools Trail → Hold Enter → Mark here</s
</table>
<!-- screenshots pending: these predate the tab-carousel layout below (still show the old flat grouped list) -->
<p>Automatically replies to incoming messages that contain a configured trigger word (case-insensitive, contains match). Multiple trigger phrases can be packed into one Trigger field, comma-separated (e.g. <code>hi,hello there,yo</code>) — matching any one of them is enough; spaces around each phrase are trimmed, so <code>hi, hello there</code> and <code>hi,hello there</code> behave the same. The bot has three independent targets — <strong>DM</strong>, a monitored <strong>Channel</strong>, and a monitored <strong>Room</strong> — each with its own trigger/reply pair.</p>
<p>The screen is a <strong>circular tab carousel</strong>, the same style as Tools Nearby Nodes' filter tabs: <strong>LEFT/RIGHT</strong> switches between the <strong>Channel</strong> / <strong>Room</strong> / <strong>Direct</strong> / <strong>Other</strong> tabs (opens on Channel), <strong>UP/DOWN</strong> moves between the rows within the active tab, and <strong>Enter</strong> acts on the selected row (LEFT/RIGHT is reserved entirely for tab-switching, so every row's value is changed via Enter, not by cycling it in place).</p>
<p>Automatically replies to incoming messages containing a configured trigger word (case-insensitive, contains match). Pack multiple phrases into one Trigger field, comma-separated (<code>hi,hello there,yo</code>) — any one matches; spaces around each phrase are trimmed. Three independent targets — <strong>DM</strong>, a monitored <strong>Channel</strong>, and a monitored <strong>Room</strong> — each with its own trigger/reply pair.</p>
<p>The screen is a <strong>circular tab carousel</strong> (same style as Nearby Nodes' filter tabs): <strong>LEFT/RIGHT</strong> switches between <strong>Channel</strong> / <strong>Room</strong> / <strong>Direct</strong> / <strong>Other</strong> (opens on Channel), <strong>UP/DOWN</strong> moves within the active tab, <strong>Enter</strong> acts on the selected row (LEFT/RIGHT is reserved for tab-switching every value changes via Enter, not in-place cycling).</p>
<p>Each target has its own <strong>Enable</strong> toggle on its own tab, and they're fully independent — you can run only a channel bot, only a room bot, only DM, or any combination, with no need to also switch on the others.</p>
<p>Each target also has its own <strong>Commands</strong> toggle (see below) — DM, channel and room can each independently answer <code>!</code> queries or stay quiet, same as Enable.</p>
<h4 id="channel-tab">Channel tab</h4>
@@ -2909,7 +2909,7 @@ Mark the spot first with <strong>Tools Trail → Hold Enter → Mark here</s
<p>The DM, channel and room triggers are independent, so you can run e.g. an away-message (<code>*</code>) in DMs while the channel or room reacts only to a specific keyword (or vice-versa).</p>
<p><code>{name}</code> (the triggering sender's name) and <code>{hops}</code> (<code>direct</code> or <code>N hops</code>) are only meaningful when replying to an actual incoming message, so — unlike <code>{time}</code>/<code>{loc}</code>/the sensor placeholders — they're offered only while editing a <strong>Reply</strong> field here, not on the general message-compose keyboard.</p>
<p>The header shows a running count of auto-replies sent since boot, alongside the tab bar.</p>
<p><strong>Room posting requires a login.</strong> The room bot reuses whatever session the device already has with that room server (Messages Rooms <strong>Login…</strong>, or a password saved from an earlier login/the phone app) — it has no way to prompt for a password itself in the background. If the saved password stops working, the room bot just silently stops posting there, the same as a manual post would; log back in from Messages to fix it.</p>
<p><strong>Room posting requires a login.</strong> The room bot reuses whatever session the device already has with that server (Messages Rooms <strong>Login…</strong>, or a password saved earlier / from the phone app) — it can't prompt for one itself in the background. If the saved password stops working, it silently stops posting there; log back in from Messages to fix it.</p>
<p><strong>Throttle.</strong> DM auto-replies are rate-limited <strong>per contact</strong> (10 s), so a second sender is never starved while one contact is on cooldown. The channel and room bots each keep their own single 10 s cooldown and won't echo a message identical to their own reply (so two bots running the same reply text on one channel/room can't ping-pong); the cooldown caps any residual back-and-forth.</p>
<p><strong>Quiet hours</strong> suppress the push (trigger) replies between the configured local hours; a window where <em>from</em> is later than <em>to</em> wraps past midnight. Commands are a pull (explicitly requested), so they answer even during quiet hours.</p>
<h3 id="commands">Commands</h3>
@@ -2978,7 +2978,7 @@ Mark the spot first with <strong>Tools Trail → Hold Enter → Mark here</s
</tr>
<tr>
<td><code>!gps fix [seconds]</code></td>
<td>Single-shot location: turns GPS on if it wasn't already, waits for a stabilised fix (HDOP ≤ 2.0, or ≥8 satellites on GPS hardware that doesn't report HDOP, averaged over 10s), sends the position, then restores GPS to whatever state it was in before. Replies in two parts — an immediate <code>GPS: acquiring fix...</code> ack, then the position (or <code>GPS: no fix (timeout)</code> / a partial fix) as a follow-up message up to <code>seconds</code> later (default 90s, clamped to 15-300s) — raise it under poor sky view, where 90s isn't always enough to reach the HDOP/satellite bar. Only one <code>!gps fix</code> can be in flight at a time; a second one gets <code>GPS: fix already pending</code>.</td>
<td>Single-shot location: turns GPS on if needed, waits for a stabilised fix (HDOP ≤ 2.0, or ≥8 satellites without HDOP, averaged over 10s), sends the position, then restores GPS's prior state. Two-part reply — immediate <code>GPS: acquiring fix...</code> ack, then the position (or <code>GPS: no fix (timeout)</code> / partial fix) up to <code>seconds</code> later (default 90s, 15300s range — raise it under poor sky view). Only one in flight at a time; a second gets <code>GPS: fix already pending</code>.</td>
</tr>
<tr>
<td><code>!advert</code></td>
@@ -3130,7 +3130,7 @@ Mark the spot first with <strong>Tools Trail → Hold Enter → Mark here</s
</table>
<!-- screenshot pending: Repeater — toggle + Network/profile + flood-filter rows -->
<p>Turns the companion into a packet <strong>repeater</strong> while it keeps working as a normal companion — no separate firmware. By default, enabling it switches the radio to a dedicated repeater profile rather than relaying on whatever network you're chatting on (see <strong>Network</strong> below) — that matches the MeshCore community norm of repeaters sitting on a standard channel, not a private one. Loop-detection and an advert flood-depth cap are always applied. This screen keeps the toggle, the network/profile, and its flood-filter options together; live forwarding stats are on <strong>Tools Diagnostics</strong>.</p>
<p>Turns the companion into a packet <strong>repeater</strong> while it keeps working as a normal companion — no separate firmware. By default, enabling it switches the radio to a dedicated repeater profile rather than relaying on your chat network (see <strong>Network</strong> below), matching the MeshCore community norm of repeaters sitting on a standard channel. Loop-detection and an advert flood-depth cap always apply. Live forwarding stats are on <strong>Tools Diagnostics</strong>.</p>
<p>Navigate with <strong>UP/DOWN</strong>; change a value with <strong>LEFT/RIGHT</strong> (or <strong>Enter</strong> for toggles). <strong>Cancel/Back</strong> saves and returns to Tools.</p>
<table>
<thead>
@@ -3149,7 +3149,7 @@ Mark the spot first with <strong>Tools Trail → Hold Enter → Mark here</s
<tr>
<td>Network</td>
<td>Current / Custom</td>
<td><strong>Custom</strong> <em>(default)</em>: enabling the repeater switches the radio to a dedicated profile (below) and disabling restores the companion's settings — so you can drop onto a separate repeater network and come back. A never-configured device seeds Custom with a frequency in the same band as your own network (433/868/915 MHz region), not a flat one-size-fits-all default so it can't land outside what's legal for your region. Switching to Custom afterwards (if it was OFF and unconfigured) seeds it from your current settings instead. <strong>Current</strong>: relay on the companion's own frequency — opt-in; not the community norm.</td>
<td><strong>Custom</strong> <em>(default)</em>: enabling the repeater switches to a dedicated profile (below), disabling restores the companion's settings. A never-configured device seeds Custom from your own network's band (433/868/915 MHz region), not a flat default, so it can't land outside what's legal for your region. <strong>Current</strong>: relay on the companion's own frequency — opt-in, not the community norm.</td>
</tr>
<tr>
<td>Rpt preset</td>
@@ -3194,8 +3194,8 @@ Mark the spot first with <strong>Tools Trail → Hold Enter → Mark here</s
</tbody>
</table>
<p>The five flood filters are <strong>opt-in</strong> (default OFF, so a plain repeater is unaffected) and act on <strong>flood</strong> traffic only — on a direct route this node is the named next hop, so it never drops those.</p>
<p><strong>Same network vs. separate network.</strong> With <strong>Network = Current</strong> (or a Custom profile set equal to your companion settings) the repeater stays on your own network — you keep messaging while relaying. With a <em>different</em> Custom profile the device moves entirely onto that network while relaying (a single radio can't be on two at once) and returns to your companion network when the repeater is switched off. The profile also re-applies after a reboot if the repeater was left on.</p>
<p>While the repeater is on, a <strong>»</strong> indicator appears in the status bar (same blink convention as the auto-advert and trail markers) so you can tell it's relaying at a glance. Two radio settings are also overridden while relaying and restored afterwards: <strong>Settings Radio Pwr save</strong> is forced off (a repeater must listen continuously) and <strong>Auto pwr</strong> is forced off (a repeater holds full TX power for consistent relay reach). Both show <code>--</code> in Settings while the repeater is on.</p>
<p><strong>Same network vs. separate network.</strong> With <strong>Network = Current</strong> (or a Custom profile matching your companion settings) the repeater stays on your own network — you keep messaging while relaying. A <em>different</em> Custom profile moves the device entirely onto that network while relaying (one radio can't be on two at once), returning to your own network when switched off. The profile re-applies after a reboot if the repeater was left on.</p>
<p>While on, a <strong>»</strong> indicator appears in the status bar (same blink convention as auto-advert/trail markers). Two radio settings are overridden and restored afterwards: <strong>Pwr save</strong> forced off (must listen continuously) and <strong>Auto pwr</strong> forced off (full TX power for relay reach). Both show <code>--</code> in Settings while active.</p>
<p>Live forwarding stats — <strong>Forwarded</strong>, <strong>Pool free</strong>, <strong>Queue</strong> — are shown on <strong>Tools Diagnostics</strong> (this screen is config-only).</p>
<hr />
<h2 id="admin">Admin</h2>
@@ -3203,8 +3203,8 @@ Mark the spot first with <strong>Tools Trail → Hold Enter → Mark here</s
<p>Send commands to a <strong>repeater/room server you have admin permission on</strong> — the on-device equivalent of the companion app's repeater-admin feature. See <a href="../../../cli_commands/">CLI Commands</a> for the full command grammar. (Admin only manages <em>remote</em> nodes; this device's own name, radio, TX power and reboot live in <strong>Settings</strong> — see below.)</p>
<ol>
<li><strong>Select a node</strong> opening <strong>Tools Admin</strong> goes straight to <strong>Tools Nodes</strong> (the same screen, filters, sort and live scan as browsing it normally) so picking a node for Admin looks exactly like using Nodes for anything else; <strong>Enter</strong> on a repeater/room row hands it to Admin, <strong>Cancel</strong> returns to Tools. Admin is also reachable directly from a node's own <strong>Hold Enter</strong> menu in Nodes.</li>
<li><strong>Log in</strong> — type the node's <strong>admin password</strong> (the same login handshake Messages uses for room servers; a repeater's admin password is set with the <code>password</code> CLI command). If a password was already saved for this node from an earlier successful login, it retries silently instead of prompting. Only a login that comes back with <strong>admin</strong>-level permission unlocks the next step — anything less shows "Not admin on this node".</li>
<li><strong>Select a node</strong><strong>Tools Admin</strong> opens straight into <strong>Tools Nodes</strong> (same screen, filters, sort, live scan), so picking a node for Admin looks like using Nodes normally; <strong>Enter</strong> on a repeater/room row hands it to Admin, <strong>Cancel</strong> returns to Tools. Also reachable from a node's own <strong>Hold Enter</strong> menu in Nodes.</li>
<li><strong>Log in</strong> — type the node's <strong>admin password</strong> (same handshake Messages uses for rooms; set on a repeater with the <code>password</code> CLI command). A saved password from an earlier login retries silently. Only <strong>admin</strong>-level permission unlocks the next step — anything less shows "Not admin on this node".</li>
<li><strong>Pick a category and a field</strong> — a tab carousel (<strong>LEFT/RIGHT</strong> to switch category, <strong>UP/DOWN</strong> to move within it, same as Remote Bot's tabs), so common settings don't need the CLI grammar memorised:</li>
</ol>
<table>
@@ -3244,7 +3244,7 @@ Mark the spot first with <strong>Tools Trail → Hold Enter → Mark here</s
<p>[!WARNING]
This screen can run <strong>destructive</strong> commands on the <em>remote</em> node — <code>reboot</code>, <code>erase</code>, a new admin password, and others. That's the same capability the phone app's repeater-admin feature already exposes, not a new risk, but double-check the value and the target before sending.</p>
</blockquote>
<p><strong>Passwords are remembered across reboots</strong>, the same self-healing behaviour as room logins in Messages: after a successful admin login the password is saved on the device, so picking that node again — even after a power cycle — logs back in silently. If a saved password stops working (e.g. it was changed on the node), the failed login forgets it, so the next pick prompts for a new one. A correct password that just lacks admin permission is left alone — retyping the same one wouldn't change the outcome. Some commands are marked <strong>Serial Only</strong> in the CLI reference — those reject a remote CLI request and only work over that node's own USB serial connection.</p>
<p><strong>Passwords are remembered across reboots</strong>, same self-healing behaviour as room logins in Messages: a successful login is saved, so picking that node again — even after a power cycle — logs back in silently. A password that stops working is forgotten on failure, prompting fresh next time. A correct password that just lacks admin permission is left alone. Commands marked <strong>Serial Only</strong> in the CLI reference reject a remote request and only work over that node's own USB serial.</p>
<h3 id="this-device">This device</h3>
<p>Admin doesn't manage the companion itself — its own settings live in <strong>Settings</strong>: <strong>Radio</strong> (preset / freq / SF / BW / CR) and <strong>TX power</strong> in the Radio section, and <strong>Name</strong> and <strong>Reboot</strong> in the System section. <strong>Send advert</strong> is the home <strong>ADVERT</strong> page.</p>