refactor: rename firmware from Plus to Solo

- FIRMWARE_VERSION: v1.15-plus.1 → v1.15-solo.1
- FIRMWARE_PLUS_BUILD → FIRMWARE_SOLO_BUILD in all platformio.ini and UITask.cpp
- docs/plus_features/ → docs/solo_features/ (all sub-docs moved)
- README: update all doc links plus new Documentation section
- GitHub Actions: extract GIT_TAG_VERSION in each build job (was missing,
  causing empty FIRMWARE_VERSION in builds); rename output files to
  solo-VERSION-oled.uf2 / solo-VERSION-eink.uf2; release title → "Solo VERSION"

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-05-29 12:25:34 +02:00
parent df32f47942
commit c7009140ce
62 changed files with 551 additions and 399 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,55 @@
## Clock Screen
[Go back](../../../README.md)
### Overview
| OLED | E-Ink |
| :-----------------------: | :-----------------------: |
| ![](./clk_scr_1_oled.png) | ![](./clk_scr_1_eink.png) |
A full-screen clock page on the home screen. Shows the current time and date, with up to three configurable data fields below.
Time is synchronized from GPS or via the companion app. Timezone offset is applied from **Settings System**.
If no time source is available, the screen shows _"! No time sync"_ with a hint to enable GPS or connect the app.
---
### Time display
- **Format** — 24 h or 12 h with AM/PM; configurable in **Settings Display**
- **Seconds** — shown by default on OLED; hidden on e-ink (always) and optionally on OLED via **Settings Display Clock seconds**; hiding reduces the refresh rate from 1 s to 60 s
---
### Data fields
| OLED | E-Ink |
| :-----------------------: | :-----------------------: |
| ![](./clk_scr_2_oled.png) | ![](./clk_scr_2_eink.png) |
Up to three data fields are shown below the date separator. Each field displays a label and a value on the same line.
| Field | Label | Value |
| ----------- | ----- | ------------------------------------------------------------------------- |
| None | — | — |
| Batt V | Batt | Battery voltage (e.g. `3.92V`) |
| Batt % | Batt | Battery percentage using LiPo curve anchored at the low-battery threshold |
| Temperature | Temp | °C from onboard sensor |
| Humidity | Hum | % from onboard sensor |
| Pressure | Pres | hPa from onboard sensor |
| GPS | GPS | `lat lon` decimal degrees, or `no fix` |
| Altitude | Alt | metres from GPS |
| Luminosity | Lux | lux from onboard sensor |
| CO₂ | CO2 | ppm from onboard sensor |
| Contacts | Nodes | Total contacts in the mesh |
| Messages | Msgs | Total unread message count |
Sensor fields show `--` when the sensor is not connected or has no data.
---
### Configuring fields
**Hold Enter** (or press the **Context menu** key) on the Clock page to open the Dashboard Config screen, where each of the three field slots can be cycled with **LEFT/RIGHT**.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,59 @@
## Favourites Dial
[Go back](../../../README.md)
### Overview
| OLED | E-Ink |
| :------------------------: | :------------------------: |
| ![](./fav_dial_1_oled.png) | ![](./fav_dial_1_eink.png) |
A dedicated home page showing a grid of up to 6 pinned contacts for quick access. The layout adapts to the display orientation:
- **Portrait** (OLED, e-ink portrait) — 2 columns × 3 rows
- **Landscape** (e-ink landscape) — 3 columns × 2 rows
---
### Navigation
Navigate tiles with **UP / DOWN / LEFT / RIGHT**. Pressing a directional key at the edge of the grid switches to the adjacent home page instead of wrapping.
**Enter on a filled tile** — opens that contact's DM directly.
**Enter on an empty tile (`+`)** — opens a contact picker to fill the slot.
---
### Unread badge
Filled tiles show an unread message count in the top-right corner when there are unread DMs from that contact. The contact name is ellipsized to make room for the badge.
If a pinned contact has been removed from the contacts list, the tile shows `(gone)` until the slot is reassigned.
---
### Pinning a contact
**From the Favourites Dial** — press **Enter** on an empty tile (`+`). A picker opens showing:
1. Contacts marked as favourites in the upstream app (starred contacts) — listed first
2. Recent DM contacts — listed after
Select a contact to pin it to that slot.
**From a DM conversation****Hold Enter** context menu **Pin to dial**, then choose a slot from the slot picker (Slot 16, showing the current occupant name or "empty").
If the selected contact is already pinned in another slot, it is moved to the new slot automatically.
---
### Unpinning a contact
Open the contact's DM, **Hold Enter** context menu **Unpin (slot N)**.
---
### Reordering the Favourites page
The position of the Favourites Dial in the home page navigation sequence can be changed in **Settings Home Pages** — press **LEFT / RIGHT** on the Favourites entry to move it earlier or later.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,108 @@
## Messages Screen
[Go back](../../../README.md)
### Overview
| OLED | E-Ink |
| :-----------------------: | :-----------------------: |
| ![](./mes_scr_1_oled.png) | ![](./mes_scr_1_eink.png) |
The Messages screen is split into three modes — **DMs**, **Channels**, and **Rooms** — selectable with UP/DOWN on the mode-select screen. Each mode shows the corresponding list of conversations with unread counters.
---
### Sending messages
| OLED | E-Ink |
| :-----------------------: | :-----------------------: |
| ![](./mes_scr_2_oled.png) | ![](./mes_scr_2_eink.png) |
Press **Enter** on a contact or channel to open its history, then press **Enter** again (or select an empty send row) to compose a message. Choose between:
- **Custom message** — opens the on-screen keyboard
- **Q1Q10** — quick reply templates editable in Settings Messages
The keyboard supports placeholders that insert live data at send time:
| Placeholder | Value | Availability |
| ----------- | -------------------- | --------------------------- |
| `{time}` | current time (HH:MM) | always |
| `{loc}` | GPS coordinates | always ("no GPS" if no fix) |
| `{temp}` | temperature | sensor connected |
| `{hum}` | humidity | sensor connected |
| `{pres}` | barometric pressure | sensor connected |
| `{alt}` | altitude | sensor connected |
| `{lux}` | luminosity | sensor connected |
| `{co2}` | CO₂ concentration | sensor connected |
Sensor placeholders appear automatically in the placeholder picker when the corresponding sensor is active. `{time}` and `{loc}` are always shown.
---
### Message history
| OLED | E-Ink |
| :-----------------------: | :-----------------------: |
| ![](./mes_scr_3_oled.png) | ![](./mes_scr_3_eink.png) |
Each entry in the history list shows the sender name and a compact age indicator (`3m`, `2h`, `>1d`) in the top-right corner.
**Short Enter** on a message opens it in fullscreen. **Hold Enter** opens the context menu (Reply option).
---
### Fullscreen message view
| OLED | E-Ink |
| :-----------------------: | :-----------------------: |
| ![](./mes_scr_4_oled.png) | ![](./mes_scr_4_eink.png) |
Navigate between messages with **LEFT** (newer) and **RIGHT** (older). Long messages scroll with **UP/DOWN**.
If the message is a reply addressed to someone (`@[nick]`), a **To: nick** bar is shown below the sender name and the body is displayed without the address prefix.
| OLED | E-Ink |
|:----:|:-----:|
| ![](./mes_scr_5_oled.png) |![](./mes_scr_5_eink.png) |
**Hold Enter** in fullscreen opens the Reply option.
---
### Context menu — contact list
**Hold Enter** on a contact entry opens a context menu:
| OLED | E-Ink |
|:----:|:-----:|
| ![](./mes_scr_6_oled.png) | ![](./mes_scr_6_eink.png) |
| Item | Action |
| ---------------------------- | ------------------------------------------------------------------------------ |
| Mark as read | Clears unread counter for this contact |
| Notif: default / OFF / ON | Per-contact notification override — **LEFT/RIGHT** to cycle |
| Melody: global / M1 / M2 | Per-contact melody override — **LEFT/RIGHT** to cycle |
| Pin to dial / Unpin (slot N) | Pin this contact to a Favourites Dial slot; if already pinned shows which slot |
When **Pin to dial** is selected, a slot picker opens (Slot 16 showing current occupant name or "empty"). Choosing a slot that already holds another contact moves the new contact there.
---
### Context menu — channel list
| OLED | E-Ink |
| :-----------------------: | :-----------------------: |
| ![](./mes_scr_7_oled.png) | ![](./mes_scr_7_eink.png) |
**Hold Enter** on a channel entry opens a context menu:
| Item | Action |
| ------------------------- | --------------------------------------------------------------------- |
| Mark all read | Clears all unread for this channel |
| Notif: default / OFF / ON | Per-channel notification override — **LEFT/RIGHT** to cycle |
| Melody: global / M1 / M2 | Per-channel melody override — **LEFT/RIGHT** to cycle |
| Fav: yes / no | Add or remove this channel from favourites — **LEFT/RIGHT** to toggle |
---
### Mark all read
**Hold Enter** on the DM / Channels / Rooms mode-select screen to clear all unread counters for the highlighted category at once.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,51 @@
## Screen Lock
[Go back](../../../README.md)
### Overview
| OLED | E-Ink |
| :-----------------------: | :-----------------------: |
| ![](./lck_scr_1_oled.png) | ![](./lck_scr_1_eink.png) |
Screen lock prevents accidental keypresses. While locked the display turns off and all input is ignored.
---
### Locking and unlocking
**Hold Back** and press **Enter** three times within 3 seconds. The sequence works in both directions — the same combination locks and unlocks.
If the display is off when the sequence begins, it turns on automatically so the hint is visible. Each press in the sequence extends the display-on timer by 5 seconds.
The hint popup at the bottom of the lock screen guides through the sequence:
| Step | Hint |
| -------------- | --------------------- |
| Not started | _Hold Back + 3×Enter_ |
| 1 press done | _Enter ×2 more…_ |
| 2 presses done | _Enter ×1 more…_ |
If no press is made for 3 seconds, the counter resets.
---
### Lock screen
| OLED | E-Ink |
| :-----------------------: | :-----------------------: |
| ![](./lck_scr_2_oled.png) | ![](./lck_scr_2_eink.png) |
A brief press of any button wakes the display and shows the lock screen. It displays:
- **Time** — large, same format as the Clock page (24 h / 12 h from Settings)
- **Date** — day-of-week, day, month
- **Two sensor values** — the first two Dashboard Config fields (same values configured for the Clock page); shown side by side if both are set
The display turns off again automatically after 5 seconds of inactivity (or 2 seconds immediately after locking).
---
### Auto-lock
Enable **Auto-lock** in **Settings Display** 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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,91 @@
## Settings Screen
[Go back](../../../README.md)
### Overview
| OLED | E-Ink |
| :-----------------------: | :-----------------------: |
| ![](./set_scr_1_oled.png) | ![](./set_scr_1_eink.png) |
All settings are saved to flash and restored on next boot. Settings are organised into collapsible sections. Press **Enter** on a section header to expand or collapse it — all sections start collapsed for faster navigation. Press **LEFT/RIGHT** to change a value, or **Enter** for toggle items.
Press **Cancel/Back** to save and return to the home screen.
---
### Display
| Setting | Options | Notes |
| ------------------------------------ | -------------------------------- | ----------------------------------------------------------------------------------------------------- |
| Brightness | 15 | LEFT/RIGHT; preview applies immediately |
| Auto-off | 5 s / 15 s / 30 s / 60 s / never | LEFT/RIGHT |
| Auto-lock | on / off | Locks device when display turns off |
| Battery | icon / % / V | Display mode for the top-bar battery indicator |
| Clock seconds | show / hide | Hiding reduces OLED refresh from 1 s to 60 s |
| Clock format | 24 h / 12 h | 12 h appends AM/PM |
| Font | Default / Lemon | Default: 5×7 Adafruit with ASCII transliteration; Lemon: native Unicode with pixel-accurate line wrap |
| Display rotation _(e-ink only)_ | 0° / 90° / 180° / 270° | Applied immediately |
| Joystick rotation _(e-ink only)_ | 0° / 90° / 180° / 270° | Rotates input mapping independently of display rotation; useful for custom enclosures |
| Full refresh interval _(e-ink only)_ | off / 5 / 10 / 20 / 30 | Partial refreshes between full clears; reduces ghosting on long sessions |
---
### Sound
| Setting | Options | Notes |
| -------------- | ------------------------------ | ------------------------------------------------------------ |
| Buzzer | On / Off / Auto | Auto: silences while BLE connected, re-enables on disconnect |
| Volume | 15 | LEFT/RIGHT; preview tone plays on each change |
| DM Melody | built-in / Melody 1 / Melody 2 | Notification sound for incoming private messages |
| Channel Melody | built-in / Melody 1 / Melody 2 | Notification sound for incoming channel messages |
Melody 1 and Melody 2 are custom sequences editable in **Tools Ringtone Editor**.
---
### Home Pages
| OLED | E-Ink |
| :-----------------------: | :-----------------------: |
| ![](./set_scr_2_oled.png) | ![](./set_scr_2_eink.png) |
Lists all available home screen pages. For each entry:
- **LEFT / RIGHT** — move the page earlier or later in the navigation sequence
- **Enter** — toggle the page ON / OFF
**Settings** and **Messages** are always visible and cannot be disabled.
---
### Radio
| Setting | Options | Notes |
| -------- | -------- | ---------- |
| TX power | 222 dBm | LEFT/RIGHT |
---
### System
| Setting | Options | Notes |
| ----------- | --------------------------------------------------- | -------------------------------------------------------------------------------------- |
| Timezone | 12 h … +14 h | UTC offset in whole hours |
| Low battery | off / 3.0 V / 3.1 V / 3.2 V / 3.3 V / 3.4 V / 3.5 V | Auto-shutdown threshold; also sets the 0 % anchor for the battery percentage indicator |
---
### Contacts
| Setting | Options | Notes |
| -------- | ---------------- | ---------------------------------------------------- |
| DMs | all / favourites | Show all chat contacts or only upstream-starred ones |
| Channels | all / favourites | Show all channels or only favourited ones |
| Rooms | all / favourites | Show all room servers or only favourited ones |
---
### Messages
Up to 10 quick reply templates (Q1Q10). Press **Enter** on a slot to open the keyboard editor. Supports the same placeholders as the main keyboard (`{time}`, `{loc}`, and sensor placeholders when connected).

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,173 @@
## Tools Screen
[Go back](../../../README.md)
### Overview
| OLED | E-Ink |
| :-----------------------: | :-----------------------: |
| ![](./tls_scr_1_oled.png) | ![](./tls_scr_1_eink.png) |
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 |
| :-----------------------: | :-----------------------: |
| ![](./tls_scr_2_oled.png) | ![](./tls_scr_2_eink.png) |
Browse nodes that have recently advertised on the mesh. Filter by category with **LEFT/RIGHT**:
| Filter | Shows |
| ------ | ------------------------------ |
| Fav | Upstream-starred contacts only |
| ALL | All known nodes |
| 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** → context menu → **Discover nearby** to send a live `NODE_DISCOVER_REQ` 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
| OLED | E-Ink |
| :-----------------------: | :-----------------------: |
| ![](./tls_scr_3_oled.png) | ![](./tls_scr_3_eink.png) |
Sends a `NODE_DISCOVER_REQ` ping. Repeaters, sensors and room servers within zero-hop range respond immediately with name, type and signal data.
Results show as 2-line cards: node name + type, then RSSI / SNR / remote SNR.
- **UP/DOWN** — navigate results
- **Enter** — open full-screen detail (public key, signal data, contact status)
- **Hold Enter** — rescan
- **Cancel / Back** — return to nearby list
---
## GPS Trail
| OLED | E-Ink |
| :-----------------------: | :-----------------------: |
| ![](./tls_scr_4_oled.png) | ![](./tls_scr_4_eink.png) |
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; scale grid (toggle with **LEFT/RIGHT** on the Grid row in the menu) |
| **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 |
| :-----------------------: | :-----------------------: |
| ![](./tls_scr_5_oled.png) | ![](./tls_scr_5_eink.png) |
**Hold Enter** opens the action menu:
| Item | Interaction | Action |
| --------------------- | ------------------- | --------------------------------------------------- |
| Min dist | LEFT/RIGHT | Filter gate: 5 m / 10 m / 25 m / 100 m |
| Units | LEFT/RIGHT | Speed/pace: km/h / mph / min/km / min/mi |
| Grid | LEFT/RIGHT or Enter | Toggle scale grid on the map |
| Start / Stop tracking | Enter | Begin or end a recording session |
| Save trail | Enter | Write RAM ring to flash (`/trail`) |
| Load trail | Enter | Restore flash trail into RAM |
| Export (live) | Enter | Stream live RAM trail as GPX 1.1 over USB Serial |
| Export (saved) | Enter | Stream saved flash trail as GPX 1.1 over USB Serial |
| Reset trail | Enter | Clear RAM ring and elapsed time |
### Downloading GPX
1. Connect the device via USB cable
2. Open a serial terminal at **115200 baud**:
- **macOS/Linux** — `cat /dev/tty.usbmodem* > track.gpx` (stop with Ctrl-C after dump completes)
- **Windows** — PuTTY (Serial, 115200) or Arduino IDE Serial Monitor (no line ending)
3. On the device: **Tools Trail****Hold Enter****Export (live)** or **Export (saved)**
4. The device streams a GPX 1.1 XML document. Save the output from `<?xml` to `</gpx>` as a `.gpx` file
5. Import into OsmAnd, Garmin BaseCamp, GPX Studio, Google Earth, etc.
> [!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.
---
## Ringtone Editor
| OLED | E-Ink |
| :-----------------------: | :-----------------------: |
| ![](./tls_scr_6_oled.png) | ![](./tls_scr_6_eink.png) |
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 |
| :-----------------------: | :-----------------------: |
| ![](./tls_scr_7_oled.png) | ![](./tls_scr_7_eink.png) |
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 |
| ------------- | -------------------------------------------------------------------------------- |
| Bot | ON / OFF — enables DM listening |
| Channel mode | ON / OFF — additionally monitors a selected channel |
| Channel | Which channel to monitor (only relevant when channel mode is ON) |
| Trigger | Word or phrase that activates the reply (shared by both modes, case-insensitive) |
| DM reply | Reply text for DMs; supports `{time}` and `{loc}` placeholders |
| Channel reply | Reply text for channel messages; supports `{time}` and `{loc}` placeholders |
A 10-second cooldown prevents repeated replies in quick succession.