Skip to content

Tools screen

Tools Screen

Go back

Overview

OLED E-Ink

The Tools screen is a hub for GPS trail recording, nearby node browsing, ringtone editing, auto-reply bot, and auto-advert. Navigate the tool list with UP/DOWN and press Enter to open a tool.


Nearby Nodes

OLED E-Ink

Browse nodes that have recently advertised on the mesh. Filter (which nodes) and sort (in what order) are independent axes and combine freely.

Filter by category with LEFT/RIGHT (one coherent axis — type only):

Filter Shows
All All known nodes
Fav Upstream-starred contacts only
Comp Companion (chat) nodes
Rpt Repeaters
Room Room servers
Snsr Sensors

Select a node to see its coordinates, distance, bearing with cardinal direction, type, and last-heard time.

Hold Enter opens the same Options menu everywhere (list and detail), in a fixed order — only the actions that apply appear:

Action Available when
Navigate selected node has GPS
Ping a public key is known for the node
Save waypoint selected node has GPS
Sort: Dist/Recent browsing stored nodes — LEFT/RIGHT on the row flips distance ↔ last-heard in place
Discover scan / Rescan always (live NODE_DISCOVER_REQ scan)

Filtering stays on the list itself (LEFT/RIGHT cycles the type), so there is no separate Filter action in the menu. Sort is adjusted in place: highlight the Sort row and tap LEFT/RIGHT to flip the list (and its right-hand column) between distance and last-heard without closing the menu — the same in-popup pattern as Trail's settings. The row appears only while browsing stored nodes (live-scan rows carry signal, not distance). Filter and sort are independent and persist across re-entry to the screen.

Selecting Ping opens the Ping popup:

OLED E-Ink

Use Enter on the popup’s Ping row to send a direct mesh ping to that node. The popup then shows the RTT and SNR values on the next lines, and can be used again immediately for another ping.

[!TIP] Combined with Auto-Advert on the other device, Nearby Nodes becomes a passive location tracker — as long as the tracked device periodically broadcasts its GPS position, you can see its current distance and bearing without any manual interaction on either end.


Active Discovery (live scan)

OLED E-Ink

Options → Discover scan sends a NODE_DISCOVER_REQ. Repeaters, sensors and room servers within zero-hop range respond immediately with name, type and signal data. This is not a separate screen — it is the same list switched to a live-scan source: the right-hand column shows RSSI instead of distance, and node detail shows the public key, signal data and contact status.

Because it is the same list, all the same keys apply — UP/DOWN to navigate, Enter for detail, Hold Enter for the Options menu (where Rescan repeats the scan and Ping works exactly as on stored nodes).

  • Cancel / Back — return to the stored-nodes list

GPS Trail

OLED E-Ink

Records your route in a RAM ring buffer (up to 512 points, sampled every 1 s). Tracking runs in the background — a blinking G appears in the status bar. The trail survives display auto-off but is lost on reboot unless saved to flash first.

Cycle views with LEFT / RIGHT:

View Content
Summary Distance, elapsed time, avg speed or pace, point count, tracking status
Map Auto-fit dot-and-line plot with cos(lat) aspect correction; segment breaks marked; north arrow; square scale grid fitted to the map frame (toggle under Hold Enter → Settings → Grid, Map view only). Your current GPS position and all waypoints are always drawn — even with no trail recording — so the map is useful standalone
List Per-point rows showing local time (HH:MM) and delta distance from the previous point; segment-start rows show start; scroll with UP/DOWN
OLED E-Ink

Hold Enter opens the action menu. It is two-level — a short main menu, plus Trail file… and Settings… submenus. Cancel/Back in a submenu returns to the main menu.

Main menu:

Item Action
Start / Stop tracking Begin or end a recording session
Mark here Drop a waypoint at the current GPS fix (see below)
Waypoints… Open the waypoint list / navigation / add-by-coords
Trail file… Open the file submenu (below)
Settings… Open the settings submenu (below)

Trail file… (only the operations that apply right now appear):

Item Action
Save trail Write RAM ring to flash (/trail)
Load trail Restore flash trail into RAM
Export (live) Stream live RAM trail as GPX 1.1 over USB Serial
Export (saved) Stream saved flash trail as GPX 1.1 over USB Serial
Reset trail Clear RAM ring and elapsed time

Settings… (values cycle with LEFT/RIGHT or Enter; shown only where they apply):

Item Available Action
Min dist always Sample gate, 4 levels — metric: 5/10/25/100 m, imperial: 15/30/75/300 ft
Readout Summary view Summary shows Speed or Pace (in the global unit system)
Grid Map view Toggle scale grid on the map

(Trail file… appears only when a live or saved trail exists. Mark here needs a GPS fix; Waypoints is always available.)

Waypoints

A waypoint is a saved spot — your car, camp, a water source — that you can navigate back to later. Waypoints are independent of the trail: they live in their own flash file (/waypoints), survive a reboot, and are not cleared by Reset trail. Up to 16 can be stored — the Waypoints list header shows how many are in use (e.g. WAYPOINTS 3/16).

Dropping a waypointHold Enter → Mark here. This captures the current GPS fix and opens the on-screen keyboard for a short label (up to 11 characters — e.g. CAR, CAMP, H2O). Leaving it blank auto-names it WP1, WP2, … Marking works whether or not the trail is being recorded; it needs a GPS fix (otherwise it reports No GPS fix).

Adding by coordinates — open Hold Enter → Waypoints and select the + Add by coords row (always the last entry in the list). This creates a waypoint without being there — no GPS fix required (handy for a meeting point or a spot read off a map). It opens a small form with three editable rows plus Save:

  • Lat / LonEnter opens the keyboard to type the value in decimal degrees (magnitude only; the keyboard has no minus sign), and LEFT/RIGHT toggles the hemisphere — N/S for latitude, E/W for longitude.
  • LabelEnter to type a name (blank → auto WP<n>).
  • Save — validates the range and stores the waypoint. Missing or out-of-range values report a brief error.

On the map — 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 no trail, the view auto-fits to your waypoints and position. While a trail exists, 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.

NavigatingHold Enter → Waypoints opens the list (each row shows the label and live distance). The list always begins with a synthetic Trail start row whenever a trail exists, so you can backtrack to where you began without having marked it. Select a row and press Enter to open the navigation view:

   CAMP            ← target label
   1.4 km          ← distance to target
   To:  145° SE    ← absolute bearing to the target
   Hdg: 090° E     ← your current course over ground (-- when stationary)

There is no magnetometer, so the screen shows two absolute bearings and you compare them: target at 145°, travelling at 90° → bear right. The Hdg line is derived from GPS movement (see Compass) and reads -- until you move.

ManagingHold Enter on a waypoint row offers Rename / Delete / Send (the Trail start row is navigate-only). Delete removes one at a time; there is no bulk clear.

SharingSend hands the waypoint to the Messages screen: pick a contact or channel, and the message is pre-filled as [WAY]<lat>,<lon> <label> (e.g. [WAY]37.42123,-122.08456 CAR) for you to confirm or edit before sending. On the receiving device, opening that message and Hold Enter → Navigate / Save waypoint turns it back into a navigable point (see Messages › Fullscreen message view). The format is plain text, so it stays readable on other firmware and the phone app.

Downloading GPX

Easiest — Solo GPX Downloader (browser-based, no install):

  1. Open the link in Chrome or Edge (Web Serial API required).
  2. Click Connect device and select the USB serial port.
  3. On the device: Tools › TrailHold EnterExport (live) or Export (saved).
  4. The browser captures the stream automatically — set a filename and click Download.

Script — tools/trail_export.py (auto-detects the port, captures from <?xml to </gpx>, writes a timestamped file under tools/gpx/):

uv run tools/trail_export.py

Then on the device: Tools › TrailHold EnterExport (live) or Export (saved).

Manual fallback — open a serial terminal at 115200 baud and capture the stream by hand:

  • macOS/Linuxcat /dev/tty.usbmodem* > track.gpx (stop with Ctrl-C after the dump finishes)
  • Windows — PuTTY (Serial, 115200) or Arduino IDE Serial Monitor with no line ending; copy the text from <?xml to </gpx> into a .gpx file

Saved waypoints are included in the export as GPX <wpt> elements (with their label as <name>), 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.

[!NOTE] If the companion app is connected via BLE, the export is safe — BLE and USB operate independently. If connected via USB, disconnect the app before exporting.


Auto-Advert

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 A appears in the status bar while active.

[!TIP] Audible connection heartbeat — the device chirps each time it receives an advert from any node (sound chosen in Settings › Sound › AD sound). 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 every received advert, so in a busy mesh it can get chatty; choose None in Settings › Sound › AD sound to silence just this event, or set Settings › Sound › Advert scope to Zero-hop to limit it to local adverts only. You can also set Settings › Sound › Buzzer to Off (or Auto, which mutes while a companion app is connected) to silence all buzzer output.


Compass

A heads-up GPS compass. The L1 has no magnetometer, so the heading is the course over ground — derived from how your GPS position moves over the last few seconds. The display is a horizontal heading tape: 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. 145° SE).

Because the heading comes from movement, it only updates while you are actually moving: standing still shows move to set heading (and navigation's Hdg line reads --). 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 not required.


Ringtone Editor

OLED E-Ink

A step sequencer for composing custom notification melodies. Two slots — Melody 1 and Melody 2 — switchable from within the editor.

Each melody supports up to 32 notes:

Parameter Options
Pitch C / D / E / F / G / A / B / pause
Octave 4 – 7
Duration 1/4 / 1/8 / 1/16 / 1/32
BPM 60 / 90 / 120 / 150 / 180

Navigation in the editor:

  • LEFT/RIGHT — move between notes
  • UP/DOWN — change pitch of selected note
  • Enter — cycle octave of selected note
  • Hold Enter (or context menu) — open options menu

Options menu:

Item Interaction Action
Play / Stop Enter Preview the melody
Melody 1 / 2 Enter Switch to the other slot
Duration LEFT/RIGHT Cycle duration for selected note
BPM LEFT/RIGHT Cycle tempo
Insert Enter Insert a new note after the cursor
Delete Enter Delete the note at cursor
Save & Exit Enter Persist the melody and return to Tools
Discard Enter Return to Tools without saving

Melodies can be assigned in Settings › Sound (global default) or overridden per contact or channel from the Messages screen context menu.


Auto-Reply Bot

OLED E-Ink

Automatically replies to incoming messages that contain a configured trigger word (case-insensitive, contains match).

When the bot is enabled it listens to DMs by default. Channel monitoring is an optional addition — select a channel separately to activate it alongside DM mode.

Setting Description
Enable ON / OFF — enables DM listening
Channel OFF, or which channel to additionally monitor (cycles through your channels)
Trigger DM Word or phrase that activates the DM reply (case-insensitive). A lone * means reply to every DM (away mode) and is shown as (any msg).
Reply DM Reply text for DMs; supports {time}, {loc} and sensor placeholders
Trigger Ch Independent trigger for the monitored channel. * means reply to every channel message — bounded by the per-channel cooldown, but use sparingly on a busy channel.
Reply Ch Reply text for channel messages; supports the same placeholders
Commands ON / OFF — answer ! query commands (see below)
Quiet from/to Local-time window during which auto-replies stay silent; set both equal (OFF) to disable

The DM and channel triggers are independent, so you can run e.g. an away-message (*) in DMs while the channel reacts only to a specific keyword (or vice-versa).

The header shows a running count of auto-replies sent since boot.

Throttle. Auto-replies are rate-limited per contact (10 s), so a second sender is never starved while one contact is on cooldown. The channel bot keeps a single 10 s cooldown and won't echo a message identical to its own reply (so two bots running the same reply text on one channel can't ping-pong); the cooldown caps any residual back-and-forth.

Quiet hours suppress the push (trigger) replies between the configured local hours; a window where from is later than to wraps past midnight. Commands are a pull (explicitly requested), so they answer even during quiet hours.

Commands

With Commands ON, a DM beginning with ! is answered with live node data, independent of the trigger:

Command Reply
!ping pong
!batt battery voltage
!loc GPS coordinates (or no GPS)
!time local time HH:MM
!temp temperature (or n/a if no sensor)
!hops how many hops the command message took to reach the node (direct if heard directly)
!status combined battery / location / time
!help list of available commands

Several commands can be combined in one message — !batt !time !hops is answered with a single 4.10V | 14:30 | 3 hops reply (one transmission). A message with no recognised command falls through to the trigger bot.

Commands also work on the monitored channel (the one selected for channel mode) — anyone there can query the node. Channel replies are broadcast to everyone, so unlike DM commands they respect quiet hours and use the shared per-channel cooldown. DM commands use the per-contact throttle.