Repository navigation
UserGuide
This guide explains how to use the MeshCore companion firmware with the on-device touch/keyboard interface (the GUI) and the browser interface (the WebUI).
Drafted with AI assistance. If something here does not match what you see on your device, please report it so it can be corrected.
The guide is written for two kinds of readers at the same time:
| You are… | Read this | Skip this |
|---|---|---|
| New to MeshCore / not technical | Quick Start, Glossary, the "In plain words" boxes at the start of each chapter, Troubleshooting | Everything inside a 🔧 box |
| Technical / power user | Everything. Open the 🔧 Technical details boxes (click the small triangle) for exact ranges, formulas, file names, protocol behaviour and per-board differences | – |
How the guide marks things:
- "In plain words" – a short, jargon-free explanation of what a chapter or feature is for.
- 🔧 Technical details – a collapsible box with the deep details. It is closed by default so beginners are not overwhelmed. (If your Markdown viewer does not support collapsible boxes, the text is simply shown open.)
- Mgmt → Radio → Freq – a menu path. It means: tap the Mgmt tab, open the Radio page, then the Freq row.
- Device = the on-screen/keyboard interface on the hardware. WebUI = the same interface in a web browser. Differences between the two are called out where they exist.
Start here
- Introduction
- Installation & Setup
- System Overview
- GUI Documentation
- WebUI Documentation
- Features & Capabilities
- Device Compatibility
- Advanced Usage
- Troubleshooting
- Best Practices
In plain words: MeshCore turns small radio devices into a chat network that works without internet or mobile coverage. Your device talks to other MeshCore devices nearby by radio (LoRa). Messages can hop from device to device (through repeaters) to travel further. This Quick Start gets you from a box to your first message.
- Attach the antenna first. Never switch the device on without its LoRa antenna: transmitting without one can permanently damage the radio.
- Install the firmware (skip if your device already runs MeshCore with the GUI). Open flasher.meshcore.io in Chrome or Edge, pick your device, choose Companion Radio, tick Erase All Flash (first installation only) and click Flash. Details and special cases (T-Deck DFU mode, SenseCap Indicator second chip): Section 2.2.
- Power on and wait. The first boot can take 1–2 minutes and the screen may flicker. That is normal (Section 2.3).
- Check the radio settings for your country — Mgmt → Radio. The built-in defaults are for Europe/UK (869.618 MHz, 62.5 kHz, SF 8, CR 8, 22 dBm). Everyone who wants to talk to each other must use exactly the same Freq / BW / SF / CR. Not sure what to use? Ask the local MeshCore group in your area (Section 7.3, Section 6.6).
- Give your device a name — Mgmt → Global → Name → Edit. This is what other people see.
- Announce yourself — Mgmt → Advert → Advert Flood (or Advert 0-Hop). An advert is a small "I am here" broadcast. Nearby devices appear in your Contacts tab as they announce themselves, and you appear on theirs.
-
Send your first message.
- To everybody: Msgs tab → open the Public channel → Send → type → OK.
- To one person: Contacts tab → tap the person → MSG → type → OK. A ✓ next to a direct message means it arrived.
-
Optional extras (do these later, when the basics work):
- Use the phone app over Bluetooth: pairing PIN is in Mgmt → BLE → Custom PIN (Section 6.8).
- Use a browser on your laptop/phone: Section 5.2.
- Show a map: needs GPS and/or map tiles (Section 6.4, Section 8.2).
- Set the clock: Section 6.7.
| I want to… | Go to |
|---|---|
| Change my name | Mgmt → Global → Name |
| Change radio frequency / settings | Mgmt → Radio |
| Let others find me | Mgmt → Advert → Advert Flood / Advert 0-Hop |
| See who is nearby | Contacts tab (long-press the tab for the Discovered list) |
| Write to someone | Contacts → tap person → MSG |
| Write to a group | Msgs → Channels → open a channel → Send |
| Join a private group | Msgs → + (name + key) or Mgmt → Channels → Join channel |
| Make the screen turn off sooner (save battery) | Mgmt → UI → Disp. Timeout |
| Lock the screen | Mgmt → Lock → Autolock |
| Mute sounds | Mgmt → Sound → All Sounds |
| Pair with the phone app | Mgmt → BLE → Custom PIN |
| Open the web interface |
Mgmt → WiFi (note the IP), then http://<ip> in a browser |
| Share (or hide) my position | Mgmt → Advert → Advert Location |
| Set the clock/time zone | Mgmt → Date/Time |
| Back up my settings |
Mgmt → Backup (device) or copy /MCTerm/prefs.txt (Section 8.1) |
| Find out why something doesn't work | Troubleshooting |
- Antenna on before power on.
- Same radio settings on every device (Freq, BW, SF, CR). Different settings = you will never hear each other.
- A companion device does not relay messages. To cover more distance you need repeaters, ideally placed high up (Section 3.3).
- Be patient after sending an advert. Contacts show up when their adverts are heard, not instantly.
- Never share the repeater admin password or private key over the mesh (Section 10).
Plain-language meanings of the words used in this guide. Beginners: you can come back here whenever a word is unfamiliar.
| Term | Meaning |
|---|---|
| Mesh | A network where every device can pass messages on, so there is no central server or tower. |
| Node | Any device taking part in the mesh (your handheld, a repeater, a sensor…). |
| LoRa | The long-range, low-power radio technology MeshCore uses. Slow (small text messages), but reaches far and uses little energy. |
| Companion Radio | The firmware for a device you use to chat. It has the GUI (or connects to a phone app). It does not relay other people's messages. |
| Repeater | A device that only relays messages to extend range, usually mounted high and powered by solar. |
| Room Server | A shared "chat room" node you log in to with a password. |
| Sensor node | A node that periodically sends readings (temperature, humidity, …). |
| Contact | Another node your device knows about (name + public key). |
| Advert | A short "I am here" broadcast that lets other nodes discover you. 0-Hop = only direct neighbours hear it; Flood = it is passed on across the mesh. |
| Flood | A packet that is rebroadcast through the whole reachable mesh. Used when the route is unknown, and for all channel messages. |
| Direct (routing) | A packet that follows a known route instead of being repeated everywhere. |
| Hop | One radio link between two nodes. "3 hops" = the message was passed on 3 times. |
| Path / Route | The chain of repeaters a message travelled through. |
| DM | Direct message to one contact, end-to-end encrypted. |
| Channel | A group chat. Everyone with the channel's secret key can read it. |
| Public channel | The built-in open channel everyone can join. Anyone on your frequency can read it. |
| PSK (pre-shared key) | The shared secret that protects a private channel. |
| Public key / Private key | Your node's identity. The public key is shared so others can send you encrypted messages; the private key must stay secret. |
| ACK (acknowledgement) | A small reply that proves a direct message arrived (✓). |
| Region scope | An optional tag that limits how far a channel's flood messages are meant to spread geographically. |
| Path hash / Device ID | A short (1–3 byte) fingerprint of a public key, shown as e.g. [A3], used to name hops compactly. |
| Freq / BW / SF / CR | The four radio settings: frequency, bandwidth, spreading factor, coding rate. See Section 6.6. |
| dBm | Unit of transmit power / signal level. Higher (closer to 0) = stronger. |
| RSSI | Received signal strength — how loud a packet was (dBm; for example −90 is stronger than −110). |
| SNR | Signal-to-noise ratio — how far a packet stood out from the noise (dB). Higher is better. |
| Noise floor | The background radio noise level your receiver sees. |
| Airtime / Duty cycle | How much of the time your device is allowed to transmit. Many regions limit this by law. |
| Telemetry | Sensor and position data a node shares. |
| TPERM | Per-contact permission to share telemetry with you. |
| Transport | How a phone/PC talks to the companion device: BLE (Bluetooth), WiFi, or USB. |
| AP / STA (Station) | WiFi modes. AP: the device creates its own WiFi network. STA: it joins your router/hotspot. |
| WebUI | The browser version of the device interface, served by the device itself over WiFi. |
| GUI | The interface on the device's own screen. |
| SD card / Primary Disk | Optional memory card for maps and backups. Primary Disk chooses whether settings live on internal flash or on the SD card. |
| Map tiles | Small map picture files ({z}/{x}/{y}.png) for the map tab. |
| NTP | Internet time service used to set the clock automatically over WiFi. |
| GPS fix | The state where the GPS receiver has found enough satellites to know your position. |
| OTA | "Over the air" firmware update over WiFi, without a USB cable. |
| CLI | Command-line interface: type text commands. For advanced users. |
In plain words: MeshCore lets small radio devices send text messages to each other over long distances without internet, SIM card or a central server. If two devices are too far apart, other MeshCore devices in between (repeaters) pass the message along. Your device has a touchscreen or keyboard for chatting, and can also be controlled from a phone app or a web browser.
🔧 Technical overview
MeshCore is a lightweight, decentralised mesh communication system designed for LoRa packet radios. It enables multi-hop text messaging, sensor data exchange, and network administration across groups of small embedded devices — without any internet connection, cellular infrastructure, or central server.
Unlike conventional mesh radio systems that flood every packet to every node, MeshCore uses a hybrid routing model: it floods messages only when a direct route is unknown, and switches to targeted direct routing once a path to the destination has been established. This dramatically reduces channel congestion in larger networks.
The MeshCore companion firmware extends the base mesh stack with a full-featured, touch-first graphical interface (GUI) that runs directly on the radio hardware. It also provides a browser-accessible WebUI that mirrors the on-device interface when the device is connected to WiFi, giving users the option to manage their device from a laptop or phone without installing any software.
| Scenario | Description |
|---|---|
| Off-grid communication | Stay in contact during hikes, camping trips, or expeditions without mobile coverage |
| Emergency & disaster response | Deploy an instant mesh network where infrastructure is unavailable |
| Community networks | Build low-power neighbourhood or event communication grids |
| Tactical operations | Encrypted group and direct messaging without internet dependency |
| Remote sensor monitoring | Collect temperature, humidity, CO₂, and other telemetry from remote nodes |
| General LoRa exploration | Experiment with mesh networking on affordable hardware |
MeshCore companion firmware runs on a range of LoRa-equipped devices. The following hardware is supported with the full graphical interface:
| Device | Display | Input | Notable Features |
|---|---|---|---|
| LilyGO T-Deck Plus | 320×240 colour TFT | QWERTY keyboard + trackball | Built-in GPS, microphone, speaker |
| LilyGO T-Deck (original) | 320×240 colour TFT | QWERTY keyboard + trackball | No GPS module |
| Seeed Studio SenseCap Indicator | 480×480 colour TFT | Touchscreen | Dual MCU, hardware buttons |
| Elecrow CrowPanel 3.5" | 480×320 colour TFT | Touchscreen | SD card for map tiles |
| Elecrow CrowPanel Advanced 7" | 1024×600 colour IPS | Touchscreen | ESP32-P4, WiFi via coprocessor |
| Heltec Vision Master V4 (TFT) | Colour TFT | Touchscreen | Compact form factor |
Additionally, the companion radio firmware supports any device running in headless mode that accepts connections over BLE, USB, or WiFi from an external client application (see Section 3.3).
To get started with MeshCore you need:
- A supported hardware device — see the list in Section 1.3
- A USB cable connecting the device to your computer
- A modern web browser — Google Chrome or Microsoft Edge are recommended (Firefox does not support WebSerial)
- A LoRa antenna — always attach the antenna before powering the device; transmitting without an antenna can damage the radio hardware
No software installation on your computer is required for basic flashing.
Which firmware type do I choose? If you want to chat, pick Companion Radio. Pick Repeater only for an unattended relay node, and Room Server only if you want to run a shared chat room. When in doubt: Companion Radio.
The easiest way to install MeshCore is via the official web flasher.
Step-by-step:
- Open https://flasher.meshcore.io in Chrome or Edge.
- Select your device from the list.
- Choose the firmware type:
- Companion Radio — full GUI with mesh radio capability (recommended for most users AND for MCTerm)
- Repeater — relay-only node with remote management, no GUI
- Room Server — shared group chat server node
- For a first-time installation, click Erase All Flash before flashing. This removes any previous firmware and settings.
- Click Flash and follow the on-screen prompts to connect your device via USB.
- Wait for the flash to complete (typically 30–90 seconds).
Note: A full flash erase is only required for first-time installation or when switching firmware type. Routine updates — such as upgrading to a new version of the companion firmware — can be applied without erasing settings.
Note: After flashing, the first boot may take 1–2 minutes. The screen may flicker briefly while partitions and settings are initialised. This is normal.
Some T-Deck variants require manual entry into Device Firmware Update (DFU) mode before flashing:
- Hold down the trackball button while connecting the USB cable.
- The device should appear as a serial port to the web flasher.
- Release the trackball and proceed with flashing normally.
The Seeed SenseCap Indicator has two MCUs:
| MCU | Role | How to flash |
|---|---|---|
| ESP32-S3 | Companion UI, LoRa, WiFi/BLE | Web flasher (steps above) |
| RP2040 | microSD, sensors, buzzer, battery sense | UF2 file from GitHub Releases (not the web flasher) |
The web flasher updates only the ESP32. On every release check if there is a NEW RP2040 image available , install the matching RP2040 image from the same release, OR the latest one. The build artifact is named like rp2040_indicator_<version>.uf2. An older RP2040 image with a newer ESP32 build can break SD-primary storage, map tiles, sensors, and the buzzer.
Flash the RP2040 (drag-and-drop UF2):
- Download
rp2040_indicator_<version>.uf2from the project Releases page (same/latest version as your companion firmware). - Disconnect USB if the device is plugged in.
- Locate the RP2040 BOOT button on the board (small internal button; Seeed documents using a paperclip or needle through the enclosure access).
- Press and hold BOOT, connect the Indicator to your computer with USB-C, then release BOOT once the cable is connected.
- The computer mounts a removable drive (RPI-RP2 on Windows/Linux; often RP2040 on macOS).
-
Copy the
.uf2file to the root of that drive (not into a subfolder). The drive ejects automatically when flashing finishes and the RP2040 reboots. - Disconnect USB or power-cycle, then start the device normally so the ESP32 companion firmware runs.
USB serial ports (two interfaces):
When both MCUs are running, two COM/serial devices may appear. Use the right one for each task:
| Typical name | MCU | Use for |
|---|---|---|
| USB-SERIAL CH340 (Windows) | ESP32-S3 | Web flasher, ESP32 serial log |
| USB Serial Device (Windows) | RP2040 | Optional RP2040 serial monitor |
| usbmodem (macOS) | Often RP2040 when both are listed | UF2 drag-and-drop does not need a serial port |
If the web flasher cannot find the device, connect only for ESP32 flashing (no BOOT held) and select the CH340 port. For RP2040 updates, always use the UF2 steps above.
After flashing:
- Confirm Mgmt → Global → Admin → FW-MC matches your release.
- Check SD-primary storage, map tiles, sensor readings, and buzzer behavior.
- Mgmt → Global → Admin → Reboot RP2040 (HW) (double-tap to confirm) soft-resets the coprocessor without reflashing.
See also Seeed’s Indicator flashing guide for hardware photos.
When the device starts for the first time after flashing:
- A splash screen is displayed for approximately 2.5 seconds while hardware is initialised. On builds with the boot console enabled, a scrollable boot log may appear first (migration steps, SD sync, store selection). Swipe vertically to read it; it dismisses automatically after a short hold once startup finishes.
- The GUI opens on the Contacts tab, which will be empty initially.
- A default radio frequency and settings are applied. For EU/UK users this is 869.618 MHz, 62.5 kHz bandwidth, SF 8, CR 8, 22 dBm. For other regions, adjust these values in Management → Radio before transmitting.
- A node name is automatically generated. It is recommended to set a meaningful name in Management → Global as soon as possible, since this is how other users will identify your device on the mesh.
- The device immediately begins listening on the configured frequency and will add any nearby MeshCore nodes to the contacts list as it hears their advertisements.
Antenna reminder: Always ensure the LoRa antenna is properly attached before the first boot. Transmitting without an antenna can permanently damage the radio module.
In plain words:
- Every device is a little radio. Devices that hear each other can talk directly.
- If the other person is too far away, repeaters in between pass the message on.
- The first time you write to someone, your message is sent "to everyone" so it can find its way. Once the route is known, later messages follow that route and cause much less radio traffic.
- Direct messages are encrypted so only the recipient can read them. A message you sent shows ✓ when the recipient's device confirmed it.
🔧 Technical details: flooding, direct routing, encryption
MeshCore creates a network of independent radio nodes that communicate by passing packets over LoRa. There is no central infrastructure — each node participates autonomously.
When a node wants to send a message to another node, it first needs to know how to reach it. MeshCore discovers routes through a flooding mechanism: the first time a message is sent to an unknown destination, it is broadcast as a flood packet that propagates across the network until it reaches the target. Intermediate repeater nodes pass the packet along up to a configurable maximum number of hops.
Once a bidirectional exchange has occurred and a path is known, subsequent messages are sent as direct packets — targeted transmissions that follow the established route and are not rebroadcast by every node. This keeps network traffic low in established networks.
Because MeshCore companion nodes do not repeat or relay packets, the mesh relies on dedicated repeater nodes placed strategically in the network to extend range. Room servers similarly act as infrastructure nodes that handle group message storage and distribution.
All direct messages are end-to-end encrypted using the recipient's public key. Only the intended recipient can decrypt the contents. Channel (group) messages use a shared pre-shared key (PSK) known to all participants.
MeshCore uses two primary message types from a user perspective:
Direct Messages (DMs):
- Sent to a specific contact
- End-to-end encrypted
- Delivery is tracked; the sender receives an acknowledgement when the message reaches the recipient
- Route to the recipient is cached and reused; if the route becomes stale, a new one is discovered automatically
Channel Messages:
- Sent to a named group channel
- All members who share the channel's pre-shared key can receive and decrypt them
- Always transmitted as flood packets so all participants can receive them
- A default Public channel exists that any MeshCore node can join without a password
In plain words: Most people only need a Companion Radio (the device they chat with). Repeaters are optional "relay stations" that make the network reach further. Room servers and sensor nodes are special-purpose.
| Role | Description |
|---|---|
| Companion Radio | A user-facing node with a GUI (or headless BLE/WiFi/USB endpoint). Sends and receives messages. Does not repeat packets — it participates only as an endpoint. |
| Repeater | A relay node with no user interface. Receives and retransmits mesh packets to extend network coverage. Most commonly deployed as a fixed, solar-powered installation. Can be managed remotely via the GUI on a companion device. |
| Room Server | A group chat server. Stores and distributes channel messages. Participants join the server with a password. Can be managed remotely in the same way as a repeater. |
| Sensor Node | A battery- or solar-powered node that periodically broadcasts sensor telemetry (temperature, humidity, CO₂, voltage, etc.) into the mesh. |
In plain words: The bottom of the screen always shows four buttons: Contacts (who is around), Msgs (your conversations), Map and Mgmt (all settings). The top line shows your name, battery, and small status icons. Everything else you need is reachable from these four tabs.
The GUI is organised around four main tabs shown in a permanent tab bar at the bottom of the screen. The tab bar is always visible regardless of what content is displayed above it.
| Tab | Purpose |
|---|---|
| Contacts | Lists all known mesh nodes; provides access to direct messages and node details |
| Msgs | Channels, DMs, and Rooms lists; group and direct message transcripts |
| Map | Interactive map showing GPS positions of nodes on the mesh |
| Mgmt | All device settings, diagnostics, and administration functions |
The active tab is marked visually. Tap any tab icon to switch to it at any time.
The status bar runs across the top of the screen and is always visible.
- Node Name — your device's identity on the mesh, as seen by other nodes
- Temporary Override Area — shows short-lived alert text such as "New message from Alice" when a message arrives; clears automatically after a few seconds
The right side of the status bar can show battery or duty cycle; a short tap on the battery area switches the display:
-
Battery Mode — voltage (e.g.
4.15 V) or percentage (e.g.85 %), toggled between volts and percent on each short tap while in battery mode. - Duty Cycle Mode — live radio TX duty cycle as a percentage. Short tap cycles Percent → Volts → Duty → Percent.
Centre: when there is room, the status bar shows HH:MM local time. Tap the clock to jump to Mgmt → Date/Time.
| Icon | Meaning |
|---|---|
| WiFi symbol | WiFi interface state: off, connecting, connected (STA), or access-point (AP) mode |
| GPS dot | GPS state: searching for fix, or fix acquired |
| SD card symbol | An SD card is inserted and accessible |
| Radio activity dots | Left dot flashes on packet received (RX); right dot flashes on packet transmitted (TX). Each flash lasts 250 ms. |
| Gesture | Effect |
|---|---|
| Tap | Select items, open detail views, press buttons, switch tabs |
| Long-press | Alternate actions — see the gesture reference in Section 4.11 |
| Swipe / drag | Scroll lists; pan the map |
| Swipe left/right | Switch sub-pages in Management, Contact detail, and Channels |
| Double-tap word | Copy word to internal clipboard |
| Double-tap empty editor | Paste from internal clipboard |
The T-Deck Plus has a full QWERTY keyboard and a physical trackball, providing hardware navigation across the entire interface.
| Control | Effect |
|---|---|
| Trackball (roll) | Scroll lists; navigate in views |
| Trackball press | Select / confirm |
| QWERTY keyboard | Direct text input in any active text field |
| Arrow keys | Move cursor inside text editor fields; arrow escape bytes are automatically stripped to prevent accidental password damage |
These devices are primarily touchscreen-driven. On the SenseCap Indicator, a hardware button on the top edge toggles the display on and off.
The Contacts tab is the primary hub for discovering nearby nodes and managing direct communication.
The list shows all currently known mesh contacts. Each entry displays the node's name, type badge, and activity state.
Sorting and filtering:
While on the Contacts tab, short-tap the Contacts tab bar button (not the list header) to cycle sort modes. The status bar briefly shows the active sort (sort:last heard, sort:a-z, etc.):
| Mode | Description |
|---|---|
| Last Heard | Most recently active nodes first (default) |
| Last Message | Contacts with the most recent incoming DM first |
| Distance | Nearest GPS contacts first (requires your position + contact GPS); contacts without GPS sort after those with coordinates |
| Favs Only | Show only starred (favourite) contacts |
| A-Z | Alphabetical by name |
In Discovered mode (below), sorting is fixed by recency — tab taps show sort:recency instead.
Colour coding:
- Bright / white — recently active node
- Dim / grey — node not heard recently
- Consistent colour — each node has a unique persistent colour derived from its identity; this colour is reused consistently across contacts, transcripts, the log, and map markers
Type badges:
| Badge | Colour | Node Type |
|---|---|---|
USR |
Blue | Chat user / companion radio |
RPT |
Orange | Repeater |
SVR |
Purple | Room server |
SNS |
Green | Sensor node |
Favourite badge: ⭐ shown on favourited contacts.
Discovered Nodes view:
Long-press the Contacts tab bar button (about 2 seconds) to toggle between the normal contact list and Discovered mode. The tab label switches to Discovered; entering discovered mode sends a repeater-focused node-discover request. This view lists recently overheard advertisement frames — useful for finding nearby repeaters before adding them as contacts.
Tap any contact to open its detail panel. The panel has up to two swipeable sub-pages.
Page 0 — Contact Info
| Field | Description |
|---|---|
| Name + hash | Node identity; the first byte of the public key is shown in parentheses for disambiguation |
| Public Key | The full 32-byte key, shown as wrapped hex text (no truncation, no QR code) |
| Type / Firmware level | Node type and reported firmware capability level |
| Last heard | Relative age of the most recent packet from this node (e.g. 5 m ago, 2 h ago) |
| SNR / RSSI | Signal quality from the most recently received packet |
| Battery | Reported battery voltage or percentage (if broadcast by the node) |
| GPS | Last reported coordinates, if the node broadcasts its location |
| Telemetry | Latest temperature, humidity, CO₂, and TVOC values (if telemetry is shared) |
| Path | Current routing path with intermediate hop identifiers |
If a contact was removed while you had its detail open (for example after auto-add / purge ran on another tab), the detail view shows Contact missing with a visible Back button and returns to the list when you tap Back or anywhere on the header row.
Action buttons on Page 0:
| Button | Action |
|---|---|
| Back | Return to the contact list |
| MSG | Open a direct-message composer to this contact |
| PATH | View the current routing path; tap again to force a path reset |
| FAV | Toggle the favourite star |
| DEL | Remove this contact from the list |
| TPERM | Toggle permission for this contact to share telemetry (location and environment data) with you |
| PING | Send a ping packet; the round-trip time is displayed inline after the response arrives |
| MAP | Switch to the Map tab and centre it on this contact's GPS position |
Page 1 — Admin / Session (swipe left; only available for repeaters and room servers)
See Remote Repeater Administration and Room Server Session later in this section.
- Open any contact in the Contacts tab and tap MSG.
- The text editor opens with the recipient's name shown as the title.
- Type your message (up to 125 characters) and tap OK — or press Enter on a hardware keyboard.
- The message is dispatched and appears in the Msgs → Users tab under the conversation thread for that contact.
- A delivery state badge is shown next to the message:
| Badge | Meaning |
|---|---|
| ⏳ | Pending — message sent; awaiting acknowledgement |
| ✓ | Delivered — acknowledgement received |
| ✗ | Not delivered — no acknowledgement received within the timeout |
In plain words: If you own a repeater, you can log in to it from here (with its admin password) to check its health or change its settings remotely over the mesh. If you only chat, you can skip this.
When a contact is a repeater (RPT) and you have the admin password, Page 1 on the contact detail panel provides a full remote-management console.
Stage 0 — Login
- Enter the admin password in the password field.
- Optionally tick Save credential to store it encrypted on the device (tied to the repeater's public key).
- Tap LOGIN. The result — OK, Fail, Timeout, or Send Fail — is shown inline.
Stage 1 — Overview (after a successful login)
Ten quick-action tiles give fast access to common operations:
| Tile | Function |
|---|---|
| Status | Fetch live statistics: battery, noise floor, RSSI, packet counters, uptime |
| ACL | View and edit the repeater's access control list |
| Neighbours | Scan for adjacent repeater nodes |
| CLI | Open a raw command-line terminal to the repeater |
| Device | Read and write device name, radio parameters, and TX power |
| Advert | Configure advertisement intervals |
| Clock | Read (and optionally set) the repeater's clock |
| Telemetry | View live environment sensor data from the repeater |
| Passwords | Remote password management |
| Reboot | Remotely reboot the repeater (requires a second confirmation tap) |
Stage 2 — Overlay views
Each tile opens a detailed overlay. Key views:
Status — shows packet receive/send counts, flood and direct subsets, duplicate counts, total air time, noise floor, last RSSI, last SNR, error events, and uptime.
Access Control List (ACL) — displays up to 112 bytes of ACL data parsed into individual entries. Each entry shows a 6-byte key prefix and the assigned role. Actions:
- REMOVE — delete the selected entry
- ADD — enter a full 32-byte public key and select a role (Read-Only, Read-Write, or Admin)
Device — reads and allows editing of: device name, radio frequency, bandwidth, spreading factor, coding rate, TX power. Tap SAVE to commit changes.
Advert — configures the direct (zero-hop) advertisement interval in minutes and the flood advertisement interval in hours. Tap SET to apply.
Clock — displays the repeater's current time. A SET button appears when the local device has a valid NTP-synchronised time, allowing the repeater's clock to be updated remotely.
CLI — a full terminal with scrollback. Type commands using the on-screen or hardware keyboard. Command history is navigable with the up/down arrow keys.
When the contact is a room server (SVR), Page 1 provides a session console:
- Enter the room password and tap LOGIN.
- On success, the session view shows the room transcript, a message compose field, your permission level, and an ACL button to view who has access.
The Msgs tab has three list frames, cycled by swiping left/right on the list headers, using the ◀ ▶ arrows, or short-tapping the Msgs tab bar button while already on Msgs:
| Frame | Header | Contents |
|---|---|---|
| 0 — Channels | Msgs N/MAX |
Joined group channels (#index, name, scope badge, unread border) |
| 1 — DMs | DMs |
Direct-message threads (non–room-server peers) |
| 2 — Rooms | Rooms |
DM threads with room server (SVR) contacts |
Long-press the Msgs tab bar button (about 2 seconds) to open the Join channel secret-key editor (PSK join without using the + flow).
Displays all joined channels. Each row shows channel index (#0, #1, …), name, optional scope badge, and an unread highlight when new messages exist.
Opening a channel: tap its row to open the full transcript.
Joining a new channel: tap the + button and:
- For a public-name channel: enter the channel name (e.g.
hiking) - For a hashtag channel: type
#channelname— the GUI automatically parses the name - For a channel with a pre-shared key (PSK): enter the channel name and its base64-encoded key
Inside a transcript:
The header row (channel and DM threads) provides:
| Button | Action |
|---|---|
| Back | Return to the channel or user list |
| Read | Mark every message in this thread as read (clears unread badges) |
| Newest | Jump scroll to the latest message at the bottom |
| Custom (or Qck on narrow screens) | Send Custom QuickSend text immediately (no editor) |
| Send | Open the message composer |
Per-message quick replies (Q1 / Q2):
-
WebUI: each message row has Q1 and Q2 buttons (channel and DM). They fill the composer with Custom QuickR1 / Custom QuickR2 from Mgmt → Messages, expanded with route data from that message (see Quick Send and quick replies below).
-
Device (channels): tap a message → Reply in the detail header → the composer shows QuickR1 and QuickR2 below the text field (same templates as Q1/Q2). DM threads on the device use Custom / Qck for QuickSend only; use the WebUI for per-message Q1/Q2 in DMs.
-
Messages are displayed in IRC-style with sender names coloured consistently by node identity
-
#hashtagreferences in messages are highlighted; tap one to get a prompt to join that channel -
A message that is nothing but a shared contact or channel link (
meshcore://contact/add?.../meshcore://channel/add?...— the same format as the phone app's QR codes) offers a one-tap add instead of opening the detail view: WebUI shows it as an Add contact / Join channel button in place of the raw link; on the device, tapping that message shows a confirm with the name (and contact type, or channel name) before anything is added. This also works inside a room server's Room Console (Contacts → room contact → session), on the same line that hold-to-copy uses. A message that only mentions such a link alongside other text is left alone -
Tap any message row to open the message detail view (full text, route, scope, repeats, delivery)
-
Short-tap the channel title row (
#N name+ scope badge) to cycle that channel's region scope assignment (see Region scopes) -
Long-press the Back arrow in the header to clear the entire channel transcript (confirmation required)
-
Long-press the channel title row in the header to delete the channel from your device (confirmation required)
Phone / WebUI companion: While Wi‑Fi or BLE companion transport is connected, new messages received on the device are stored as already read, so the on-device unread count stays lower after you read traffic on the phone app. Messages you read only on the phone before disconnecting are not synced as read — use Read on the device thread if badges remain.
Note: The Public channel is the default open channel shared by all MeshCore nodes. It is automatically restored if deleted.
Region scopes limit which geographic area a flood channel message is tagged for. They are optional; most traffic works without them.
| Where | What you see |
|---|---|
| Channel list row | Scope badge: [name] = scope assigned to this channel; [Def:name] = using the Default Scope; [None] = no scope |
| Channel transcript title | Same badge beside #N channelname
|
| Message detail |
Scope: name (or omitted when none) — the scope active on that packet when it was sent/received |
| Mgmt → Channels | Define scopes, set Default Scope, per-channel Scope / Share / Del |
Configure scopes: Mgmt → Channels → Scopes (add named regions with keys). Set Default Scope for new channels. Per channel, tap Scope or short-tap the transcript title row to cycle assignments.
When you send on a scoped channel, the firmware applies that channel's scope before transmit (applyRegionScopeForChannel). Incoming messages store the scope name on the RAM message row so detail view can show it.
In plain words: Tap a message to see more about it: who sent it, when, whether a direct message was delivered, how many hops it took and how strong the signal was. Beginners mostly need Reply, Resend and Del.
Open from any channel, DM, or room transcript by tapping a message line. Opening marks that message read. Scroll vertically for long content.
🔧 Message detail fields in full (device and WebUI)
Detail header (device)
| Button | Channel | DM / room |
|---|---|---|
| Back | Return to transcript | Return to transcript |
| Reply | Opens composer; after send, returns to transcript. In Reply mode the editor offers QuickR1 / QuickR2 below the field | — (no Reply button on device DMs) |
| Resend | Shown as a 4th button alongside Reply, only on a channel message you sent. Sends the same text again as a brand-new message — the original is not touched or replaced | Shown in place of Reply, only on a message you sent. Same behavior |
| Del | Delete this message from RAM (and SD journal when enabled) | Same |
Body layout (top → bottom)
-
Message text — full body; channel messages show
Sender:prefix in nick colour. Replace HashCodes applies to[XX]tokens in the text (see §6.1). - Metadata block (varies by type):
| Field | Channel | DM / room |
|---|---|---|
| Device: | — | Peer name, optional duplicate count, path-hash prefix [XX]
|
| Sent: | Sender's timestamp from the packet (if present) | Same |
| Received: | Local receive time, or relative age if RTC unset | Same |
| Scope: |
Scope: name when the packet carried a region scope |
Same |
| Delivery: | — | Pending / Pending (retry N) / Delivered / Delivered (Nms) / Not delivered |
| Last heard: | Sender contact's last activity (by name match) | Peer contact's last activity |
| Diagnostics line |
N Hops • SNR: … • RSSI: … • Repeats: N ( -- when unknown) |
Same |
- Path block (when route data exists):
| Line | Meaning |
|---|---|
| Path: Flood / Path: N hops / Path: Direct / Path: Direct (N hops) | Route type and hop count |
| 1) … 2) … | Hop list, closest-to-you first; hop names use contact lookup / hash labels; last hop may include SNR |
| (hop list unavailable) | Flood/direct hint without full path bytes |
Tap the Path: line to open the Map tab with that message's hop overlay (§4.6).
- Repeats block (when overheard repeaters were recorded):
Repeats:
1) [hash/name] …
2) …
Lists repeaters that rebroadcast the same packet (not the same as the routing path).
Other actions in detail
- Double-tap a word to copy it to the clipboard
- Text selection (where supported): drag to select lines in the detail body
Tap a message row in Msgs (channel or DM). The WebUI detail page mirrors the device fields in sections:
| Section | Fields |
|---|---|
| Message Body | Full text (hash replacement applied) |
| Delivery / Route | Delivery (DM), RSSI, SNR, Route summary + hop path HTML, Show Path On Map, Flood (channel), Repeats / Repeat count, DM Expected ACK / Wait / Trip / Read? |
| Metadata | Kind, Scope (packet scope), Sent, Received, Sender, Chars |
| Raw | Route Raw, Text Raw (debug) |
Header: Back, Del, Resend (on a message you sent — channel or DM, sends the same text again as a new message), Reply (when a sender is known — prefills composer for channel or DM).
Lists DM conversations with non–room-server contacts, sorted by most recent activity. Each row shows contact name (identity colour) and an unread border when new messages exist.
Opening a thread: tap it to view the full conversation history.
Deleting a thread: long-press the thread title row in the transcript header and confirm (same gesture as deleting a channel). Empty threads are pruned automatically.
DM transcript header: Back, Read, Newest, Custom/Qck, Send — same as channels, but no Reply on individual messages in detail view; use WebUI Q1/Q2 on DM rows for quick replies.
Same list layout as DMs, but only threads whose peer is a room server (SVR). Open a room thread like a DM transcript (message detail, delivery, path — same layout as DMs).
Room admin vs room thread: The Msgs → Rooms list is for DM-style message history with that server contact. Login, ACL, and posting to the room channel are under Contacts → room server → Page 1 (Room Server Session). WebUI: open room-admin from contact detail or map popup on SVR markers.
The Map tab shows an interactive geographic view of all GPS-enabled mesh nodes.
| Element | Meaning |
|---|---|
| Blue circle with dot | Your current location ("ME") |
| Coloured node marker | A mesh contact with a known GPS position; colour matches the contact's identity colour; [hash] badge shows that node's path-hash prefix (1–3 bytes per Path Hash Mode / advert metadata) |
| Orange/yellow border on marker | Currently selected contact |
| Altitude bar (top-left, vertical green bar) | Your current altitude (can be toggled) |
| Zoom level indicator (top-centre) | Current zoom level; auto-hides after 3 seconds |
| Red "No SD" banner | SD card is absent; offline map tiles cannot be loaded |
| Yellow "No GPS fix" banner | GPS module is searching for a satellite fix |
Touch / on-screen buttons:
| Control | Action |
|---|---|
| Drag | Pan the map in any direction |
| + / − buttons | Zoom in / zoom out (can be hidden in settings) |
| D-pad arrows | Coarse directional pan (can be hidden in settings) |
| ME button | Jump to your current GPS location and re-centre the view |
| Tap a node marker | Select the contact |
| Double-tap a node marker | Open the full contact detail view |
| Long-press a node marker | Select the contact (alternative to single-tap) |
T-Deck Plus keyboard shortcuts while in the Map tab:
| Key | Action |
|---|---|
W |
Pan up |
A |
Pan left |
S |
Pan down |
D |
Pan right |
I |
Zoom in |
O |
Zoom out |
R |
Re-centre on your location |
T |
Toggle the altitude bar |
From a DM or channel message detail view, tap the Path: line to open the Map tab with that message's hop path drawn. While the overlay is active:
- Hop repeaters are highlighted with numbered markers and connecting lines.
- Only contacts on that path remain visible on the map.
To return to the normal map (all GPS contacts), leave the Map tab (switch to Contacts, Messages, etc.). The overlay clears automatically when you re-enter Map.
The map renders from two sources:
-
SD card — slippy-tile image files stored in the standard
{z}/{x}/{y}.pngdirectory hierarchy. The root tiles directory is configurable in Mgmt → Map → Tiles Folder. The GUI caches up to 32 tiles in device RAM (LRU eviction) to minimise repeated SD card reads during panning. - Network — tiles downloaded from OpenStreetMap over WiFi when Network Tiles is enabled and WiFi is connected. Missing tiles are fetched on demand and, when Local Tiles is also enabled, saved under Tiles Folder on the storage selected by Primary Disk (internal flash or SD card).
On devices without an SD card and without WiFi connectivity, the map will display a grid background without imagery, but node positions are still plotted correctly.
Navigate to Mgmt → Map → Tiles Folder → Open to choose which folder on the SD card contains the tile images. A folder browser opens showing the SD card root. Tap a directory name to enter it, tap .. to go up, and tap Use to confirm (or Cancel to leave the path unchanged).
The Management tab provides access to all device settings and administrative functions. Swipe left or right on the overview grid, or use the ◀ ▶ header arrows on a settings page, to navigate. There are 21 settings pages (plus a three-page overview grid). Tap a tile on the overview to open that page.
In plain words: There are 21 pages, but you will rarely touch most of them.
| Priority | Pages | Why |
|---|---|---|
| Set up once | Global (name), Radio, Advert, Date/Time | Your identity and being able to talk to others |
| Comfort | UI, Light, Sound, Lock, Messages | Screen, sounds, quick replies, auto-lock |
| Connect | WiFi, BLE | Phone app and browser access |
| Location & maps | GPS, Map | Share position, show tiles |
| Group & contacts | Contacts, Channels | Who is added automatically, private channels |
| Look & diagnose | Stats, Log, Sensors | Signal quality, received packets, readings |
| Special / advanced | CLI, Backup, Alarm | Command line, SD snapshots, remote siren |
The overview has three pages (dots under the header), each a 3×3 grid filled left-to-right, top-to-bottom in the same order as the header-arrow pager. Swipe horizontally on the grid, or use the header arrows while the overview is showing.
| Overview page | Tiles (tap to open) |
|---|---|
| 0 | Global, WiFi, BLE, UI, Light, Lock, Map, Sound, CLI (bottom-right) |
| 1 | GPS, Radio, Advert, Messages, Stats, Log, Sensors, Contacts, Backup (bottom-right; SD-capable builds only) |
| 2 | Channels, Date/Time, Alarm (the page opens on every board; it shows Not supported on hardware without a buzzer, I²S speaker or — LilyGo T-Display P4 — haptic motor) |
| # | Page Name | Contents |
|---|---|---|
| 0 | Global | Identity, Admin, storage, reboot/OTA, C6/RP2040 coprocessor actions (board-specific) |
| 1 | WiFi | Profiles, AP/STA credentials, static IP, WebUI, live link status, Use WiFi transport |
| 2 | BLE | Custom PIN, live link status, Use BLE transport, stack Restart (some boards) |
| 3 | UI | Brightness, Disp. Timeout, UI Zoom, Rotation (SenseCAP Indicator), Color Scheme (Dark/Light), Battery 100% calibration |
| 4 | Light | Keyboard light/blink (T-Deck+), display blink, Blink Bright — not theme (see UI) |
| 5 | Lock | Autolock, lock background (PNG), lock text colour, timer |
| 6 | Map | Navigation Btn, zoom buttons, Def. Follow Me, Tiles Folder, local/network tiles, Tile Source preset, custom Tile URL |
| 7 | Sound | All Sounds, When Connected, Quiet Hours, volume, boot/DM/channel/ack sounds (each with a Play preview) |
| 8 | GPS | Enable/pins/AutoBaud, status diagnostics, manual location, Use Map Center, Tracking, Advert Location |
| 9 | Radio | Freq, BW, SF, CR, Power, Duty Cycle (percent), airtime factor and live duty (per-row Edit) |
| 10 | Advert | Auto 0-hop/flood intervals, advert location, path hash, manual advert + Scan Rpts (15 s) |
| 11 | Messages | QuickSend/QuickR1/QuickR2, clear RAM, retry/ack, Replace HashCodes |
| 12 | Stats | Live RSSI/SNR/margin graphs, noise floor, airtime, mesh packet counters, RAM usage, SD Store |
| 13 | Log | Scrollable receive log with per-packet detail |
| 14 | Sensors | Live sensor graphs, calibration offsets, telemetry publish settings (formerly the separate Tele page) |
| 15 | Contacts | Auto-add, types, max hops, manual add, Purge actions |
| 16 | Channels | Add/join, scopes, Unscoped Flood, per-channel Scope/Share/Del |
| 17 | Date/Time | Manual Date/Time, GPS Time sync, NTP timezone/server, NTP Sync every, Sync Prio1–3, NTP Status |
| 18 | CLI | Local command-line shell for the node |
| 19 | Backup | SD backup slots: New, Refresh, Restore, Delete, Repair, Multi-sel (device only; not in WebUI) |
| 20 | Alarm | Remotely-triggerable siren: DM/channel trigger phrases and match modes, sender/channel filters, display and keyboard blink |
In plain words: Your node's name and identity, system information, storage, and reboot. Name is the one setting everyone should change. Leave the key and storage actions alone unless you know what you want.
Identity
| Row / control | Action |
|---|---|
| Name | Tap Edit to rename the node (advertised on the mesh). |
| Device ID | Read-only short hex prefix of your public key (width follows Mgmt → Advert → Path Hash Mode: 2 / 4 / 6 characters). Long-press the row to copy Device ID: … to the clipboard. |
| Public Key | Tap the row or View to open the Identity detail (scrollable): name, grouped public key, private key (if export is enabled), SD key file path, and SD bundle path (/meshcore_identity.json). Long-press a section in the detail view to copy that block (public key as raw hex, etc.). |
| Save key to SD | Tap the path area to edit the SD key file path; tap Save to write identity to SD (also writes the bundle JSON). |
| Load key from SD | Tap the path area to edit; tap Load to import identity from SD. |
| Set private key | Tap Set to paste a 128-character hex private key (replaces the node identity; advanced). |
Admin (read-only, refreshes about every 500 ms while visible)
| Field | Meaning |
|---|---|
| Uptime | Time since boot |
| FW-MC / FW-MOD | Main companion firmware version and build modifier string |
| Heap | Free internal RAM (and minimum seen) |
| PSRAM | External RAM free/total (or none) |
| Flash | Flash chip size |
| Sketch | Firmware partition used/free |
| CPU | CPU frequency |
| Chip | ESP32 variant, revision, core count |
| Reset | Last reset reason (e.g. PowerOn, SW, Panic, Brownout) |
Actions
| Row / button | Action |
|---|---|
| Storage | Summary of primary data stores (internal vs SD usage). |
| FW upgrade | Hint only on device: upload a .bin from the WebUI Global page in the browser (not from the touchscreen). |
| Primary Disk | (SD-capable builds) Toggle Internal vs SD Card for the authoritative binary prefs blob. /MCTerm/prefs.txt on SD stays in sync when a card is present (§8.1). Switching copies all managed settings; wait for progress to finish before removing the card. |
| Reboot RP2040 (HW) | (SenseCap Indicator only) Double-tap to reset the RP2040 coprocessor via the board reset line. |
| Reboot | Restarts the ESP32 companion (confirm where prompted). |
| OTA Update | (When built with auto-update and WiFi is up with STA password set) Validates the manifest, sets the update flag, and reboots into the WiFi updater. Greyed out if WiFi has no IP or password. |
| Update ESP32-C6 | (Elecrow CrowPanel 7" with hosted C6) Double-tap to flash the WiFi/BLE coprocessor from the embedded image on next boot. If C6 firmware is outdated, a red banner warns that WiFi is blocked until updated. |
On CrowPanel 7, identity save/load/view/set actions are disabled while C6 firmware is outdated (update C6 first).
Contact purge is on Mgmt → Contacts, not Global.
In plain words: Choose whether the device creates its own WiFi (Access Point — easiest, connect your phone straight to it) or joins your home/hotspot WiFi (Station). You need WiFi for the browser interface (WebUI), internet map tiles and NTP time. WiFi and Bluetooth are not used as the companion link at the same time on most devices.
WiFi settings are stored in saved profiles. The main screen edits the active profile; use Pick to switch profiles (each profile has its own mode and credentials). See §8.3 WiFi Profile Management.
| Control | Description |
|---|---|
| Profile | Active profile name. Tap Pick to open the profile list (each row shows AP or STA). Tap Select to activate a profile and apply its settings; tap Del to delete (with confirmation). |
| New Profile | Tap Add, enter a name, and create a profile seeded from the current active settings. |
| Mode | Access Point or Station. Toggle applies to the active profile. |
| AP SSID | (AP mode) Network name clients connect to. Default: device node name (sanitized). Empty stored value uses the node name at runtime. |
| AP Password | (AP mode) WPA2 password (8–63 characters). Default when unset: BLE PIN as six digits plus 00 (e.g. PIN 123456 → 12345600). |
| AP Clients | (AP mode) Up to 3 devices may associate. DHCP is provided by the device at 192.168.4.1/24. |
| SSID | (Station mode) Tap Edit to enter the upstream WiFi network name. |
| Password | (Station mode) Tap Edit to enter the network password. |
| IP Mode | (Station mode) DHCP or Static; when Static, edit IP, subnet, gateway, and DNS fields below. |
| WebUI | Enable or disable the WebUI feature (persisted). Does not bind port 80 by itself. |
| WebUI Server | Read-only: Running = HTTP/WebSocket listener active; Stopped = disabled, not on WiFi, or no IP yet. |
| Live status | Shown at the bottom of the page (values matter when WiFi transport is active on this boot): Active, Link, Has IP, Role (AP/STA), mode-specific rows (AP SSID / AP MAC / Stations, or SSID / RSSI / STA MAC), then IP, Subnet, Gateway, DNS1, DNS2. |
| Use WiFi | When BLE is the active transport, tap Use WiFi to switch (native builds) or Switcher → Safe reboot (CrowPanel 7 hosted WiFi). When WiFi is inactive, a hint row Info: Switch to WiFi may appear instead. |
Static IP (STA): When IP Mode is Static, edit Static IP, Static Subnet, Static Gateway, Static DNS1, and Static DNS2 above the live block.
Access Point mode: The device hosts its own WiFi network. Connect a phone or PC to the AP SSID, then open the WebUI at http://192.168.4.1 (when WebUI is enabled). The same URL works whenever the status line shows the AP address.
Station mode: The device joins an existing router or hotspot. Use the IP shown under IP for the WebUI (e.g. http://192.168.1.45).
The WebUI WiFi page mirrors these fields (Mode, AP SSID/password, STA SSID/password, static IP options) with per-row Save buttons.
In plain words: Bluetooth lets the phone app talk to your device. The Custom PIN is the six-digit code you type when pairing. It is also the password for the browser interface.
(BLE builds with BLE_PIN_CODE only; otherwise the page shows BLE: -.)
| Control | Description |
|---|---|
| Custom PIN | Six-digit fixed PIN for BLE pairing. Tap Edit to change. Enter this on the phone/app when prompted. |
| Active | Yes when BLE is the companion transport on this boot. |
| Use BLE | When WiFi is active instead, tap Use BLE to switch transport (native) or Switcher → Safe reboot (CrowPanel 7). |
| Link | Connected / Not connected to a BLE client. |
| RSSI | Client link RSSI in dBm when connected; - otherwise. |
| Name | Advertised BLE name (BLE_NAME_PREFIX + node name). |
| Addr | Local Bluetooth address (once the stack is up). |
| Last err | Last BLE start error text, or -. |
| BLE stack → Restart | (Non–CrowPanel builds, BLE active) Restarts the BLE stack without a full reboot. |
| Radio → Off | (Non–CrowPanel builds, BLE active) Turns off the LoRa radio while keeping BLE up. |
There is no separate “switch to WiFi” button on this page when BLE is active — use Mgmt → WiFi → Use WiFi instead.
| Setting | Options | Description |
|---|---|---|
| Brightness | 0–100 % slider | Display backlight only; drag horizontally on the slider track (vertical scrolling on the page does not change the value). Keyboard backlight is on Light (T-Deck Plus). |
| Disp. Timeout | Tap Set | Screen soft-off delay after inactivity; cycles Off → 15s → 30s → 60s → 2m → 5m → Off. Any touch wakes the display. |
| Vibration | On / Off | LilyGo T-Display P4 only (haptic motor board). Toggling on plays a confirmation buzz. |
| UI Zoom | ^ / v buttons |
100%, 133%, 167%, 200%. 100% and 200% are exact pixel copies (200% doubles every pixel, so letters stay perfectly sharp). The two in-between steps use area-weighted scaling: every stroke of every letter gets the same width with softly shaded edges, instead of some strokes being 1 px and others 2 px wide. A value saved by older firmware (e.g. 121%) is rounded to the nearest step. If the device cannot allocate the screen buffer for the new size (low memory), it shows UI zoom failed and keeps the previous zoom. - if unsupported. |
| Rotation (deg) | 0 / 90 / 180 / 270 | SenseCAP Indicator only (the row is hidden on other boards). Each tap turns the whole screen a further 90° clockwise (at 90° the top of the UI is on the right-hand edge) — mount the device any way round. Touch follows the rotation, and the setting is saved and restored at boot. Only the square 480×480 panel can do this without changing the layout; landscape boards cannot rotate at runtime. Also on the WebUI's UI page. |
| Color Scheme | Dark / Light | UI theme (background and text colours). |
| Battery 100% | Tap Set | The battery voltage (in mV, 3500–4500) that the status bar and battery percentage treat as a full charge — a display calibration, not a charger setting. |
| Setting | Description |
|---|---|
| Keyboard Light | T-Deck Plus only. Steady keyboard backlight (0–100 % slider); default 50 %. Independent of display brightness. |
| Keyboard Blink | Enable/disable keyboard blink on new messages (T-Deck Plus) |
| KB Blink Dur | Keyboard blink duration in milliseconds |
| KB Timeout | Turn keyboard backlight off after inactivity (Set to choose duration) |
| Display Blink | Momentarily raise display brightness when a new message arrives |
| Blink Bright | Peak brightness during display blink (0–100 % slider) |
| Disp Blink Dur | Display blink duration in milliseconds |
All lock options are under the LOCK section on this page (not on Mgmt → UI).
| Setting | Options | Description |
|---|---|---|
| Autolock | Enabled / Disabled | After inactivity, the UI enters the lock overlay (mesh receive/store continues). Toggling on resets the idle timer briefly so it does not lock immediately. |
| Lock Background | None / Picture | None: solid black lock screen. Picture: draw a PNG from Picture PNG behind the clock (scaled to the display). |
| Picture PNG | Path (default /MCTerm/lockscreen.png) |
Tap Set to edit the path (must be absolute, .png suffix). Tap ? for limits: PNG only, max 480×480, max 512 KiB. File must exist on SD or internal storage. WebUI: upload via Global or lock settings (/api/lockscreen/upload). |
| Lock Text Color | White, Blue, Green, Yellow, Orange, Red | Colour for the clock, Locked label, and unlock hints on the overlay. |
| Autolock Timer | 5–3600 seconds | Tap Set and enter seconds (shown as …s on the row). Default 30 s if unset. |
Lock overlay behaviour (see also §4.10): shows local time (or --:--:-- if unset), Locked, optional Tracking badge when Mgmt → GPS → F-Advert Tracking is on, and unlock instructions. With Lock Background → Picture, the PNG is drawn full-screen; on touch/key activity the clock and hints appear over it.
| Setting | Description |
|---|---|
| Navigation Btn | Show or hide on-screen D-pad and ME buttons on the Map tab |
| Zoom Btn | Show or hide +/− zoom buttons on the Map tab |
| Def. Follow Me | Re-centre on your position when a new GPS fix arrives (if follow mode is active) |
| Tiles Folder | Current SD tiles root; tap Open for the folder browser (Use / Cancel) |
| Local Tiles | Read tiles from Tiles Folder; also required to save network downloads into that cache |
| Network Tiles | Download missing tiles over WiFi when connected, from whichever source Tile Source selects |
| Tile Source | Tap to cycle through five providers: OpenStreetMap (default), OSM Germany, OpenTopoMap, Humanitarian, CyclOSM |
| Tile URL | Shows the active tile host; tap Edit to enter your own HTTPS PNG template (e.g. https://host/{z}/{x}/{y}.png) instead of a preset — both the device and the WebUI map load from this same source |
Altitude bar: On the Map tab, press T (T-Deck Plus keyboard) to toggle the altitude bar. The WebUI exposes the same as Alt Info Bar under Mgmt → Map.
Route overlay: Same behaviour as on the Map tab — see §4.6 Route overlay. In the WebUI, open a message detail and use Show Path On Map; clear with Clear Path or Alt+C — see §5.3.1.
On boards without a buzzer or I2S audio, all rows show - instead of toggles.
| Setting | Options | Description |
|---|---|---|
| All Sounds | On / Off | Master mute for notification audio (shares the same setting the mesh core uses to silence the buzzer) |
| When Connected | On / Off | Play a tone when a BLE or WiFi client connects |
| Quiet Hours Start / End | Tap Set, enter HHMM | Silence sounds during a daily window, e.g. 2230 for 22:30. Enter 9999 on either row to disable that boundary (no quiet hours). The range can span midnight. |
| Volume | Low / Med / High | Tap Set to cycle level |
| Boot Sound | On / Off (+ Play preview) | Startup chime |
| New DM | On / Off (+ Play) | Direct message received |
| New Channel | On / Off (+ Play) | Channel message received |
| Ack | On / Off (+ Play) | Outgoing DM acknowledged |
The Play button next to each toggle previews that sound immediately (even while All Sounds is off, it just reports "Sounds: Disabled" instead of playing). The WebUI enters quiet hours as two time-of-day pickers instead of HHMM digits, and has no preview buttons.
In plain words: Switch the GPS on or off, see whether it has found satellites, and decide whether your position is shared in adverts. A GPS needs a view of the sky and can take a few minutes to find satellites; it also uses noticeable battery.
This page (device and WebUI) is shown on every board built with GPS support, even when no receiver has been recognised yet. In that case it shows GPS not recognized with the reason (Disabled, UART failed, No data, No NMEA), the UART settings (RX/TX pins, AutoBaud, Baud, Defaults, Restart GPS) and manual location, so a wrong setup can be fixed from here; fix capture, tracking and the receiver/fix diagnostics appear once a receiver is recognised.
GPS hardware
| Setting | Description |
|---|---|
| GPS function | Enable or disable the GPS module |
| RX Pin / TX Pin | UART pins; tap Edit to change |
| AutoBaud | Automatic baud detection; when enabled, Baud shows Auto |
| Baud | Manual baud rate when AutoBaud is off |
| Defaults | Reset factory GPS pin and baud defaults |
| Restart GPS | Go — restart the GPS driver without rebooting the device |
Manual location
| Setting | Description |
|---|---|
| Manual Lat / Lon / Alt | Tap Edit to set decimal degrees / metres |
| Capture GPS Fix | Tap Save to copy the current live fix into manual lat/lon/alt |
| Clear Location |
Clear — reset manual location to 0,0,0
|
| Use Map Center | Tap Save to copy the map viewport centre into manual lat/lon |
| Advert Location | Off, GPS, or Manual — whether coordinates are included in adverts (same control as Mgmt → Advert) |
Tracking (movement-based flood adverts):
| Setting | Description |
|---|---|
| F-Advert Tracking | Enabled / Disabled — when enabled, the node sends an extra flood advert after you move farther than the distance threshold (requires a valid GPS fix) |
| Send tracking advert every | Movement threshold in metres (1–999, default 15 m). Tap Edit to change |
🔧 GPS receiver diagnostics (module hints, status table)
Module hints (from NMEA/UBX when available): Module, Chip, Diag, Talker.
Status / diagnostics (read-only, refreshes while the page is open):
| Field | Meaning |
|---|---|
| Status | Disabled, No fix, Fix (N) with satellite count, or driver status text |
| Sats | Satellite count |
| FixQ | GGA fix quality; est when UBX reports fix without GGA quality |
| HDOP | Horizontal dilution of precision |
| hAcc | UBX horizontal accuracy (metres) |
| C/N0 | UBX signal strength avg/max (dB-Hz) |
| Bytes | UART bytes received (MB) |
| Msgs | UBX or NMEA message count |
| PVT | Age of last UBX NAV-PVT frame |
| UBX | Compact fix summary (t type, ok, u used sats, v in view) |
| Last byte | Age since last UART byte (wrong wiring vs no satellites) |
| Age | Age of last navigation fix |
| Coords | Current node lat/lon when known |
When tracking is active, an orange tracking icon appears beside the WiFi/BLE badges in the status bar. Tracking is independent of Advert Location and Auto Advert Flood schedules; it only fires on movement. If GPS is off or has no fix, tracking pauses until a fix returns.
GPS coordinates are automatically saved to storage approximately every 5 minutes when a valid fix is maintained. After a reboot, the map opens at the last saved GPS position even before a new fix is acquired.
To set a manual location directly on the device:
- Open Mgmt → GPS.
- In Manual Location, tap Edit for Manual Lat, enter latitude, then confirm.
- Tap Edit for Manual Lon, enter longitude, then confirm.
- Tap Edit for Manual Alt, enter altitude (meters), then confirm.
- Set Advert Location to Manual so advertisements use your manual coordinates.
Advert Location modes on-device are:
- Off: do not include coordinates in adverts.
- GPS: advertise coordinates from the active GPS fix.
- Manual: advertise the saved Manual Lat/Lon/Alt values.
In plain words: These are the "channel settings" of your radio. They must be identical on every device that should talk to each other. Change them only if you know what your local group uses. See Section 6.6 for what each value does.
Each row has an Edit button; changes apply when you confirm in the editor (no separate RADIO commit button on device). The last two rows (Airtime Fact, Duty Live) are read-only.
| Parameter | Unit | Accepted range | Typical Values |
|---|---|---|---|
| Freq | MHz | 400–2500 | 869.x (EU), 915.x (US), 433.x (Asia), etc. |
| BW | kHz | 7.8–500 | 62.5 / 125 / 250 / 500 |
| SF | — | 5–12 | 7 (fastest, shortest range) to 12 (slowest, longest range) |
| CR | — | 5–8 | 5 = lowest overhead, 8 = most redundancy |
| Power | dBm | −9 up to the board's maximum (commonly 22, up to 30 on some boards) | Legal limit varies by region and antenna; check local regulations |
| Duty Cycle | % | 10–100 | Allowed share of airtime: type 10 for 10 % (stored as airtime factor 9.0, i.e. 100 / % − 1). WebUI: Duty Cycle % |
| Airtime Fact | — | — | Read-only: the airtime factor derived from the duty cycle (silent time = TX time × factor) |
| Duty Live | % | — | Live TX duty cycle since boot (monitor for compliance) |
The WebUI's Radio page additionally shows RX Delay Base and RX Boosted Gain, which are not on the device page.
A device restart may be required for some changes to take full effect. All nodes on the same mesh must use identical radio settings to hear each other.
Regulatory note: Always operate within the legal transmit power limits and frequency allocations for your country. Unlicensed operation on LoRa frequencies is subject to duty-cycle restrictions in most regions.
In plain words: An advert is how others learn that you exist. Short intervals = others find you faster but more radio traffic. For most people the defaults are fine; use the manual Advert buttons after changing your name or when you first switch on.
Advertisements are periodic broadcast packets that announce your node's presence on the mesh. Other nodes use these to discover you and add you to their contact list.
| Setting | Description |
|---|---|
| Auto Advert 0-Hop | Tap to cycle: Off, 1, 4, 12, 24, 72 hours |
| Auto Advert Flood | Tap to cycle: Off, 1, 3, 6, 12, 24, 48, 72, 168, 255 hours (255 h ≈ 10.6 days, the largest value the field can store) |
| Advert Location | Off, GPS, or Manual — whether coordinates are included in adverts |
| Path Hash Mode | 1-Byte / 2-Byte / 3-Byte — on-air path hash size; sets Device ID width and map badge sizes |
| Advert 0-Hop / Advert Flood | Manual actions — send a one-shot advert now |
| Scan Rpts | Opens Neighbor RPTs: a 15 s listen window for direct (0-hop) repeater adverts. Shows Heard RPT count, State (Scanning… / Done), RSSI/SNR bars, and Add for repeaters not yet in contacts. Tap Rescan to run again. |
Reducing advertisement frequency (longer intervals) decreases channel usage. Advertising more frequently increases how quickly new nodes discover you.
| Setting | Description |
|---|---|
| Custom QuickSend | Fixed phrase for one-tap send: long-press status-bar centre, or Custom / Qck in a thread header |
| Custom QuickR1 | Template for Q1 / QuickR1 (per-message quick reply); tap Edit |
| Custom QuickR2 | Template for Q2 / QuickR2; tap Edit |
| Clear All Msgs | Empty — clears channel + DM messages from RAM only (not SD history) |
| Auto Retry | Resend DMs when no ACK within timeout |
| Auto Reset Path | With Auto Retry, failed delivery clears the cached route before retry |
| Direct Message Acks | Tap Set to choose how many ACKs are required, 0–99 (0 = off). The WebUI's dropdown for this setting only offers 0–2. |
| Mark Delivered Faster | Mark sent DMs delivered without waiting for ACK |
| Replace HashCodes |
Enabled / Disabled — show contact names instead of raw [XX] path-hash codes in transcripts (display only; default Enabled) |
Quick-reply templates may include placeholders expanded from the message you are replying to: (HP) / [HP] (path hashes), (HC) / [HC] (hop count), (SNR) / [SNR], (RSSI) / [RSSI]. Example: Heard you on (HC) at (SNR). See Replace HashCodes for how [XX] tokens in message text relate to path hashes.
In plain words: The Stats page is your device's health and signal dashboard. It answers: How noisy is the radio channel? How well do I hear others? How busy is the network? How much memory is left? Nothing on this page changes any setting (except opening graphs and Airview), so you can explore freely.
How to open it: tap Mgmt, then open Stats (overview page 1, or swipe/use the header arrows to page 12). In the WebUI: Mgmt → Stats.
Where to look for what
| I want to know… | Look at | What it tells you |
|---|---|---|
| Is the channel quiet or noisy? | Noise Floor | The background radio noise your receiver hears (dBm). The lower (more negative) the better. |
| How well did I hear the last packet? | Last RSSI, Last SNR | RSSI = how strong; SNR = how clearly it stood out from the noise. A packet whose RSSI is well above the noise floor is received more reliably. |
| Is a link getting better or worse over time? | Tap > next to Noise Floor / Last RSSI / Last SNR | A scrolling live graph of the last 64 samples. The Link Margin graph is RSSI minus noise floor; its baseline is 0 dB. |
| What is actually flying around on the air right now? | Airview | A live picture of the channel and every packet heard — see below. |
| How much am I transmitting? | TX Air / RX Air and (on Radio) Duty Live | Total time spent sending / receiving since boot. |
| Is my traffic mostly flood or direct? | Packets | Sent/received counters split into flood and direct. |
| Is my memory filling up? | Messages | How many channel/DM messages are held in RAM of the maximum. |
Graph details: the RSSI graphs draw a red reference line at the noise floor; link-margin graphs draw a 0 dB baseline.
🔧 All fields on the Stats page
Radio
| Field | Description |
|---|---|
| Noise Floor | Current receiver noise floor (dBm) |
| Last RSSI | RSSI of the most recent packet |
| Last SNR | SNR of the most recent packet |
| Airview | Opens the full-screen Airview (see below). Device: tap the header's Back button to exit; WebUI: tap anywhere |
| Radio RX / Radio TX | Driver-level packet counters |
Airtime
| Field | Description |
|---|---|
| TX Air | Cumulative transmit air time (seconds) |
| RX Air | Cumulative receive air time (seconds) |
Packets (mesh routing)
| Field | Description |
|---|---|
| Sent Flood / Sent Direct | Transmitted flood vs direct packets |
| Recv Flood / Recv Direct | Received flood vs direct packets |
Messages (RAM buffers)
| Field | Description |
|---|---|
| Channel | Channel messages used / capacity |
| DM | Direct messages used / capacity |
SD Store (SD-capable builds): Advert paths when a card is present, else No SD Card.
Graph titles: RSSI (live), SNR (live), Link Margin (live) (RSSI minus noise floor).
In plain words: Airview is like a live picture of the airwaves on your radio's channel. You see the background noise, and every time a packet is heard it shows up as a coloured mark that tells you what kind of packet it was (advert, channel message, direct message, …). Use it to answer: Is the channel busy? Is something transmitting that I can't decode? Are my own sends going out? Do I hear adverts from repeaters?
Airview is safe: it never changes your radio settings or scans other frequencies, and sending/receiving continues normally while it is open.
How to open and close it
| Device | WebUI | |
|---|---|---|
| Open | Mgmt → Stats → Radio → Airview | Same path in the WebUI |
| Help | Tap the ? button (top right). The help scrolls (drag); Back or X closes it | Click ?; Close closes it |
| Exit Airview | Tap the header's Back button | Tap anywhere on the view |
In the WebUI, the device only measures for the browser while Airview is open.
What you see, in 30 seconds
- Header line: the frequency, bandwidth, SF and CR you are listening on. Airview always shows your radio settings.
-
Big waterfall (centre): time runs downwards – the newest row is at the top, labels on the left tell how old a row is (
now,-5s,-10s…). Left = weak signal, right = strong signal.- A steady column far on the left = the quiet background noise (normal).
- A short mark further right = a packet arrived (the further right, the stronger).
- Colour in a cell = how much of that moment was spent at that signal level: black = nothing, then blue → cyan → green → yellow → red = more and more.
- Coloured lane at the left edge + faint stripe across the row: tells you the type of packet heard at that moment (colours in the table below).
- Packet list (right side on wide screens, otherwise below): one line per packet, newest first.
- Blue bars on top (histogram): where the signal spent its time over the last ~20 s (device) / ~30 s (browser).
- Cyan line: estimated noise floor. Orange line: estimated receiver sensitivity (the weakest signal your current SF/BW can still decode; only drawn when it fits on the scale).
- Numbers under the waterfall: Now, Floor, Peak, Busy %, packet count and rate, last packet RSSI/SNR, symbol time, bit rate, sensitivity.
Packet colours
| Colour | Name | Meaning |
|---|---|---|
| green | ADV | Adverts ("I am here") |
| yellow | CH | Channel (group) messages / data |
| magenta | DM | Direct messages |
| cyan | PATH | Returned paths |
| orange | TRC | Trace packets |
| grey | ACK | Acknowledgements (delivery confirmations) |
| violet | REQ | Requests and responses (for example remote admin/telemetry requests) |
| white | OTH | Control / multipart / raw |
| red | TX | Your own transmissions |
The type comes from the packet's unencrypted header only; message content stays encrypted and is never shown.
Reading the picture – common situations
| What you see | What it usually means |
|---|---|
| Only the quiet column on the left, no marks | Nobody is transmitting on your settings right now – or you are out of range of everyone. Send an advert and see whether your red TX mark appears. |
| Regular green ADV marks | Nearby nodes (often repeaters) are announcing themselves – good sign that you hear the mesh. |
| Many marks close together, high Busy % | The channel is busy. Consider longer advert intervals or fewer flood messages (Section 8.6). |
| A power streak in the waterfall but no entry in the packet list | Something was transmitted but not decoded: noise or interference, a different LoRa setting (frequency/BW/SF), or a damaged packet. |
echo in the packet list |
One of your own packets was heard coming back via a repeater – proof that a repeater relayed it. |
TX! in the packet list |
Your own send failed. |
| Noise column creeping to the right | Rising noise floor – interference nearby. |
🔧 Airview in depth: measurement, packet list format, statistics
What is measured. The LoRa chip reports one power value for the channel it is tuned to, not a frequency spectrum. Airview therefore shows signal level over time, not a frequency sweep. It samples that value every few milliseconds and builds:
- Waterfall: each row is 200 ms. The horizontal axis is signal level in 2 dB steps from −130 dBm (left) to −30 dBm (right). A cell's colour = share of that 200 ms row spent at that level.
- Level histogram (blue bars; neutral colour): the same level axis summed over the whole window (about 20 s on the device, 30 s in the browser). Not related to the waterfall colours.
- Cyan line (noise floor estimate): the level below which 20 % of the samples fall, so packets do not distort it.
- Orange line (sensitivity estimate): computed from bandwidth and SF with an assumed 6 dB noise figure; shown only when it lies inside the displayed range.
Where packet types appear. Three places show the same colour: the lane at the waterfall's left edge, a faint stripe across the whole row (lane, stripe and the bright mark at the packet's own signal level belong together), and the packet list. A row with a decoded packet but no recognised type gets a white mark. The line below the stats counts packets per type over the window (types with 0 are dimmed); the small gradient under it is the waterfall colour scale.
Packet list format (newest first):
-3s GRP_TXT Public F 2h -88dBm 6.2dB 54B
= age (same scale as the waterfall labels) · type in its colour · for channel packets the channel name (or #hash for a channel you don't have) · Flood or Direct route · hop count · RSSI · SNR · size. TX / TX! (send failed) are your own sends; echo is one of your own packets heard back via a repeater. The radio does not report the coding rate of a received packet, so packets cannot be told apart by CR.
Statistics under the waterfall:
| Value | Meaning |
|---|---|
| Now | Latest sample |
| Floor | Estimated noise floor |
| Peak | Strongest level seen in the window |
| Busy | Share of samples at least 8 dB above the floor |
| Pkts / rate | Number of decoded packets in the window and their rate |
| Last | RSSI/SNR of the last decoded packet |
| Tsym / bps | LoRa symbol time and bit rate for your SF/BW/CR |
| Sens | Sensitivity estimate |
Layout: on short, wide panels (for example the Heltec V4 TFT) the stats, packet counts and legend move into a column beside the plot.
Hardware limit: on the T-Watch (S7XG radio) the module cannot read live channel power: the waterfall only gets a sample when a packet was decoded.
See the CHANGELOG for when Airview features were added or changed.
In plain words: A list of the latest radio packets your device heard. Useful for checking that you receive anything at all.
A scrollable receive log showing the most recent 48 received packets. Each row displays:
- Relative timestamp (e.g.
5 m ago) - SNR and RSSI values
- Route type (Flood or Direct)
- Payload type and version
- Sender identity (resolved to name if the contact is known)
- Destination hash (if present)
- Path length (number of hops)
Each entry uses the consistent identity colour for the sender, making it easy to track a specific node's packets in the log.
The log automatically scrolls to show the newest entries. Scrolling up pauses auto-follow; the log resumes auto-follow when you scroll back to the bottom.
Tap any log row to open a full-detail overlay showing the complete raw frame data including the decoded routing path.
In plain words: If your device has sensors (or you plug some in), this page shows their readings with small graphs. If a reading is slightly off, you can correct it with an offset.
Everything about the node's own sensors on one page (Mgmt → Tele was merged into it). The same sections appear in the WebUI under Mgmt → Sensors.
Live — one row per reading, with a small graph of the last 96 samples and the current value, for example:
| Reading | Unit |
|---|---|
| Battery voltage | V |
| Temperature | °C |
| Relative humidity | % |
| Pressure | hPa |
| CO₂ concentration | ppm |
| TVOC index | — |
| Voltage / current / power (INA2xx) | V / mA / W |
| Distance, light | cm / lux |
🔧 Supported I²C sensors and addresses
Supported I2C sensors (all boards): AHT10/AHT20 (0x38), BME280 / BMP280 / BME680 (0x76/0x77), BMP085/BMP180 (0x77), SHTC3 (0x70), SHT4x (0x44), LPS22HB (0x5C), INA219 (0x40), INA260 (0x41), INA3221 (0x42), INA226 (0x44), MLX90614 (0x5A) and VL53L0X (0x29) — the full MeshCore sensor set. Plug one into the board's I2C bus and it is found at boot (only addresses that answer are initialised). On the SenseCAP Indicator this is the ESP32 bus; its built-in CO₂/temperature/humidity/VOC sensors are read by the RP2040 and appear as Indicator.
Readings only appear if the hardware has that sensor. If two sensors report the same kind of value, the sensor name is shown in front (e.g. BME280 Temp). The value refreshes every 5 s while the page is open. The graphs are recorded in the background, every Refresh (s) seconds (default 60 s, so 96 samples ≈ 96 minutes), so they are already filled when you open the page. Tap a Live row for a full-screen graph with its min/max; the header Back button returns. Hold a row to copy its value.
Status — GPS state, location, altitude and, on the SenseCAP Indicator, how long ago the RP2040 last sent sensor data.
Calibration — every detected sensor (name and I2C address) with its readings and an Offset per reading (below); INA219 boards also have a Range row. The chip temperatures are sensors too: ESP32 (all ESP32 boards) and RP2040 (SenseCAP Indicator) each have a live graph and a temperature offset, and are sent as telemetry like any other sensor.
Telemetry — Refresh (s) (graph sample interval, 0 = off) and Base Tele, Loc Tele, Env Tele (tap to cycle Off / On request / Broadcast: what this node answers to telemetry requests or broadcasts).
Calibration offsets — set a calibration offset per reading: temperature (°C), humidity (%RH), pressure (hPa), distance (cm), voltage (V), current (mA), power (W), CO₂ (ppm), VOC/IAQ index, light (lux) and altitude (m). Available on the device (tap Offset on a reading) and in the WebUI (Mgmt → Sensors).
- Offset = reference value − sensor value. Example: a trusted thermometer shows 21.0 °C and the sensor shows 22.5 °C → enter -1.5. Leave the sensor settled for a while before comparing; self-heating (enclosure, board) is the usual reason for warm readings.
- The corrected value is used everywhere: Live graphs, WebUI, companion app, and telemetry sent to other nodes.
🔧 Offset limits, sensor IDs and driver notes
- Limits: ±20.0 °C, ±30.0 %RH, ±200.0 hPa, ±100.0 cm, ±5.00 V, ±1000 mA, ±100 W, ±2000 ppm, ±500 (index), ±5000 lux, ±1000 m. Humidity is sent in 0.5 % steps (Cayenne LPP), so a humidity offset is applied in 0.5 % steps.
- An offset belongs to the physical sensor, stored under its ID (model + I2C address, e.g.
BME280@76, or model + instance for non-I2C sensors, e.g.ESP32#0,RP2040#0,Indicator#0), so it survives reboots and stays with that sensor when others are added or removed. Enter 0 to remove it. - A pressure offset corrects the pressure only. The altitude some sensors report is calculated by their driver from the uncorrected pressure and a fixed sea-level reference (1013.25 hPa), so it does not change.
- A reading that fails (sensor unplugged, bad checksum, out of range) is left out of that report instead of being sent as a wrong value.
- SenseCAP Indicator: the built-in sensors on the RP2040 coprocessor (SCD41, or AHT20 as fallback, for temperature/humidity; CO₂; SGP40 VOC index) appear as Indicator. Their values are the last ones the coprocessor reported, refreshed on request.
In plain words: Decide whether your device adds new people automatically when it hears them, and clean up the list. Auto-add is convenient; in a busy mesh, limit it by type and hop count so the list stays useful.
| Setting | Description |
|---|---|
| Auto Add Contacts | When enabled, overheard adverts can add contacts (Note: adds from adverts) |
| Manual add contact | Tap Add to enter a public key and name without hearing an advert |
| Auto Add Types | Tap Set (when auto-add is on) to toggle USR, RPT, SRV, SNS, and OW (Overwrite oldest) |
| AutoAdd Max Hops |
Edit — limit path length for auto-add (No Limit, Direct (0), or N hops) |
| ACT/MAX Contacts | Current contact count vs device maximum |
| Purge Contacts | Remove all contacts (confirmation required) |
| Purge w/o favs | Remove all non-favourite contacts |
Manual add is useful for pre-loading a known public key before nodes are in range, e.g. one shared over another channel.
The WebUI's Mgmt → Contacts page has the same Auto Add, Max Hops, and Add types bitmask (as a single 0–31 number field) plus a Client Repeat toggle not shown on the device — this field is marked deprecated in firmware (_client_repeat, superseded by the repeater's own forwarding setting) and kept only for backward compatibility. The WebUI page has no Manual add contact field and no Purge buttons; purging contacts is device-only.
In plain words: Add or join group chats, share a channel's secret with friends, and delete channels you no longer need.
| Control | Description |
|---|---|
| Add channel | Create a new channel |
| Join channel | Join by name/PSK; Public restores the default public channel if missing |
| Scopes | Edit region-scope definitions used for geo-filtered channels |
| Default Scope | Default scope applied to new channels |
| Unscoped Flood | Toggle whether flood messages with no region scope are still relayed (protocol v12+ flood-scope-key behaviour) |
| Per-channel row | Scope, Share, Del — delete requires confirmation; Public channel can be re-added with Public |
Share a channel shows a popup with the channel's secret (base64, or hex for a 128-bit secret) and its stored message count — there is no QR code. On the WebUI, the same popup also copies the secret to your clipboard automatically.
In plain words: Your device needs the right time for message timestamps. Easiest setup: enter your time zone (for example
CET,UKorUTC+2), connect WiFi and leave the default Sync Prio order (NTP → GPS → Message). The clock then sets itself. No internet? Use GPS or set the time by hand.
| Setting | Description |
|---|---|
| Date/Time | Current local clock; tap Set to enter local date/time (YYYY-MM-DD HH:MM:SS). Shows -- if unset. Manual set always wins until the next automatic sync from a higher-priority source. |
| GPS Time | Status: No GPS, Disabled, No fix, or Fix. Tap Sync for a one-shot GPS copy into the RTC when a fix is valid (does not require GPS in a prio slot). |
| NTP TimeZone | Short form (CET, UTC+2, UTC-5, GMT, BST) or full POSIX TZ string. MeshCoreTerm converts short forms automatically. |
| NTP Server | Hostname; default pool.ntp.org. Tap Set to edit. Used when NTP appears in a sync priority slot. |
| NTP Sync every | Cycle: 1h, 6h, 12h, 24h (default), 48h, or OneTime. Controls how often the device starts a new NTP (SNTP) sync while NTP is in a prio slot and WiFi is up. OneTime = one successful NTP apply per boot (retries about every 60 s until success, then stops until reboot). Changing interval forces the next sync when due. |
| Sync Prio1 / Prio2 / Prio3 | Cycle each slot: Disabled, NTP, GPS, or Message. Prio1 is tried first, then Prio2, then Prio3 — the first configured source that is available right now updates the RTC (see refresh table below). If all three are Disabled, the clock is left unchanged (no NTP/GPS/message auto-sync). Default: NTP → GPS → Message. Message uses DM/channel timestamps (not repeater/room traffic). |
| NTP Status | Read-only: last successful NTP sync (e.g. 5m ago, 2h ago) or Syncing... / No reply / Not tried / NTP off / Once (done). If it stays on Syncing..., use serial debug clock on (see Date/Time debug) and check WiFi, NTP in a prio slot, and [CLK] lines for may_apply / sntp_cb. |
🔧 Automatic sync: how often each source runs
Automatic sync — how often each slot option runs
Only sources that appear in Prio1–3 (and are not blocked by a higher-priority source that is already available) can change the RTC. Manual Date/Time → Set and GPS Time → Sync are separate one-shot actions and do not depend on these slots.
| Slot option | Check / retry interval | When the RTC is actually updated |
|---|---|---|
| Disabled | Never (automatic) | No automatic updates. Current time is kept until you enable another slot or use manual Set / GPS Sync. |
| NTP | New SNTP sessions follow NTP Sync every (default 24 h; OneTime = once per boot). Until the first success, retries are about every 60 s (or 20 s on some remote WiFi pin-config builds). WiFi reconnect can trigger a sync when the interval is due (or for OneTime if not yet synced this boot). | On each successful SNTP response (network latency applies). Only if NTP is the highest-priority source that is available (WiFi up). |
| GPS | Main loop evaluates GPS about every 60 s (boards with GPS). Some GPS drivers may also push time after GPS Sync or about every 30 min when a fix is valid. | Only if GPS wins priority over other available sources and the RTC is invalid (before 2020) or local time differs from GPS by more than 1 day (and GPS is not wildly different from NTP when NTP is already valid). |
| Message | On each incoming DM or channel message (not repeater/room). No background timer. | Only if Message is the highest-priority source that is available for that message and the sender timestamp differs from local RTC by at least 60 s (and passes sanity checks, including within 1 day of NTP when NTP time is already valid). |
NTP Timezone examples:
| What you type | Meaning |
|---|---|
UTC or GMT
|
UTC, no DST |
UTC+2 |
Fixed UTC+2 (no DST) |
UTC-5 |
Fixed UTC−5 (no DST) |
CET |
Central Europe with DST (CET/CEST) |
BST or UK
|
UK with DST (GMT/BST) |
EST |
US Eastern with DST |
🔧 Advanced time zones (POSIX strings)
Advanced (POSIX — optional):
| Region | POSIX string |
|---|---|
| UK (GMT + BST) | GMT0BST,M3.5.0/1,M10.5.0/2 |
| Central Europe (CET + CEST) | CET-1CEST,M3.5.0,M10.5.0/3 |
| US Eastern | EST5EDT,M3.2.0,M11.1.0 |
Do not use IANA names like Europe/London or Europe/Vienna — they are not supported on ESP32.
The device stores UTC internally. Status bar, message timestamps, and Date/Time display apply your TZ string as local time. Date/Time → Set expects local date/time, not UTC.
NTP runs when NTP is assigned to a sync priority slot and WiFi has an IP; the device retries SNTP periodically while WiFi stays up. Editing timezone/server triggers an immediate sync attempt. Legacy installs migrate from the old NTP Enabled / Sync from Msg toggles to the three priority slots (default NTP / GPS / Message).
Accurate time is important for message timestamps and for ensuring the routing path cache behaves correctly. GPS time sync provides an alternative to NTP in environments without internet access.
In plain words: A text console for advanced users. Beginners can ignore this page.
A full local command-line interface for sending raw mesh commands to the connected node. The CLI overlays a scrollable terminal with history, identical in appearance and behaviour to the remote repeater CLI in the contact admin view. On touch-only boards, three buttons under the output — Cmd (open the keyboard to type a command), Last (recall the previous command), Clear (clear the output) — replace the up/down history keys the T-Deck Plus's physical keyboard uses instead.
The CLI is primarily an advanced diagnostic and configuration tool.
In plain words: Make a complete snapshot of your device (identity, contacts, channels, settings) on the SD card, so you can restore it later. Keep the card safe — the snapshot contains your private key.
Available on builds with SD backup support (overview page 1 corner tile, or page 19 in the page index). This index is a different page in the browser: the WebUI's page 19 is Storage (an SD/internal file browser), and it has no equivalent of this Backup page at all — creating, restoring, repairing or deleting a backup slot can only be done on the device.
The page title Backup is centred in the header between the pager arrows (same layout as the Log page).
| Control | Description |
|---|---|
| New | Create a new backup slot on SD (progress spinner with file counts) |
| Refresh | Rescan the backup slot list |
| Restore | Active once a slot is selected; asks to confirm, then reboots the device into the restored state |
| Delete | Active once a slot is selected (or, in Multi-sel, once at least one slot is marked); asks to confirm |
| Repair | Active once a slot is selected. Rebuilds that slot's metadata file (checksum, timestamp, which store — Internal or SD — it was made from) from the files already on disk, without touching their content. Use it if a slot's listing looks wrong or its checksum shows as stale, for example after files were copied onto the card by hand. |
| Multi-sel | Switches the slot list into multi-select mode (tap slots to mark/unmark, Delete removes every marked slot); tap again (Exit Sel) to leave it |
| Slot list | Tap a slot to select it (or mark it, in Multi-sel) |
A backup slot is a full snapshot: node identity (including the private key), contacts, channels, advert path cache, MC-Term settings and UI preferences, region scopes and channel-scope assignments. Because the private key is included, treat a backup slot — and the SD card holding it — the same as your node's original identity: restoring one on a different device replaces that device's identity with yours. Backup slots are not the same as day-to-day settings sync via /MCTerm/prefs.txt (see §8.1): a prefs.txt copy carries only the UI/MC-Term settings, not contacts, channels or the identity, and is far lighter to copy around than a full slot.
In plain words: Alarm turns your device into a remotely triggerable siren. You agree on a secret trigger phrase (for example
SOS). When a message containing that phrase arrives – as a direct message or in a channel – your device sounds a loud alarm and can show a blinking full-screen popup saying who sent it. It is useful for waking someone up, calling attention to a base station, or an emergency call-out in a group.It is off by default. Nothing happens until you set Alarm Seconds to a number above 0 and switch on at least one trigger.
How to open it: tap Mgmt, then Alarm (overview page 2, third tile, or page 20). In the WebUI: Mgmt → Alarm. On hardware with no buzzer, I²S speaker or haptic motor (LilyGo T-Display P4) the page shows a single Alarm: Not supported row.
What the alarm does when it triggers
- Plays the chosen siren (Wail, Police, Fire, Ambulance) on the buzzer/speaker – or on the T-Display P4, the haptic motor – for Alarm Seconds.
- Optionally shows a full-screen blinking popup with the sender's name and any text that followed the phrase (Blink on Alarm → Display).
- Optionally blinks the keyboard backlight while the siren sounds (T-Deck Plus only).
- Silencing it: the first touch anywhere on the device (not only on this page) stops the sound and the blinking but leaves the popup on screen; a second, separate touch closes the popup.
| Step | Where | Setting |
|---|---|---|
| 1 | Alert |
Alarm Seconds → 30 (the siren sounds for 30 s; 0 = feature off) |
| 2 | Alert | Alarm Sound → pick one by tapping (Wail / Police / Fire / Ambulance) |
| 3 | DM Trigger | Trigger: DM → on |
| 4 | DM Trigger |
DM Phrase → Set → type SOS
|
| 5 | DM Trigger |
DM Match → Whole word (so SOS fires on "help SOS!" but not on "SOSO") |
| 6 | DM Trigger | DM Senders → tap, pick the trusted contact(s) who may trigger it (up to 8) |
Test it: from the allowed contact, send you a direct message such as SOS test. The siren sounds, and if Blink on Alarm is on you see the popup. Touch the screen once to silence, again to close the popup.
Safety tip: Prefer the DM trigger with a sender filter for anything important. Direct-message senders are verified by their public key. Channel-message senders are only a name written in the text, so anyone posting in that channel could imitate it. Also pick a phrase that people will not type by accident.
Alert (applies to both triggers)
| Setting | Description |
|---|---|
| Alarm Seconds | 0–999 seconds the alarm sounds once triggered. 0 disables the whole feature – both triggers below only arm once this is non-zero. |
| Alarm Sound | Tap to cycle: Wail, Police, Fire, Ambulance. |
DM Trigger – react to direct messages
| Setting | Description |
|---|---|
| Trigger: DM | Enable/disable matching incoming direct messages. |
| DM Phrase | Tap Set to enter the trigger text (up to 23 characters). Matching is case-insensitive and surrounding spaces are ignored. |
| DM Match | Tap to cycle how the phrase must appear in the message (see table below). |
| DM Senders | Any sender, or tap to open a picker and mark up to 8 specific contacts by their public key. |
Channel Trigger – react to group channel messages
| Setting | Description |
|---|---|
| Trigger: Channel | Enable/disable matching incoming channel messages. |
| Ch Phrase | Same as DM Phrase, for channel messages. |
| Ch Match | Same match modes as DM Match. |
| Channels | All channels, or tap to open a picker and mark specific channels. |
| Ch Senders | Any sender, or tap to open a picker and mark up to 8 sender names. Channel messages carry the sender's name as plain text, not a cryptographic identity, so — unlike the DM sender filter's real public-key match — this is a best-effort match anyone posting to the channel could spoof. |
Match modes (same for DM and channel) – example phrase SOS:
| Mode | Fires when the message… | Example that fires | Example that does not |
|---|---|---|---|
| Starts with (default) | begins with the phrase | SOS come now |
help SOS |
| Contains | has the phrase anywhere, even inside a word |
help SOS!, SOSO
|
S O S |
| Ends with | ends with the phrase | help SOS |
SOS come now |
| Exact | is exactly the phrase | SOS |
SOS now |
| Whole word | has the phrase as a separate word anywhere | help SOS! |
SOSO |
Display – popup on the screen
| Setting | Description |
|---|---|
| Blink on Alarm | Off by default. When enabled, a triggered alarm also shows a full-screen, blinking popup naming who sent the trigger and any text after the phrase. |
| Blink Interval | Tap to cycle 200ms, 500ms, 1s, 2s, 3s, 4s, 5s. |
Keyboard (LilyGo T-Deck Plus only)
| Setting | Description |
|---|---|
| Blink on Alarm | Off by default. Blinks the physical keyboard backlight for as long as the alarm is actively sounding — independent of the Display blink above. |
| Blink Interval | Same cycle as the Display section. |
WebUI: Mgmt → Alarm mirrors every one of these settings, including the specific DM sender / channel / channel-sender picks (the same persisted lists). Instead of tap-to-cycle it uses per-row Save buttons.
Good to know
- The alarm only reacts to messages your device receives, so the device must be switched on and in radio range (directly or through repeaters).
- If nothing happens: check Alarm Seconds is above 0, the trigger switch is on, the phrase and match mode fit the test message, the sender/channel filter allows it, and Mgmt → Sound is not muted (see Troubleshooting).
- The CHANGELOG lists alarm changes (match modes, WebUI page, keyboard/display blink fixes).
The text editor overlay appears whenever the interface requires text input — for messages, settings, passwords, channel names, and search fields. On hardware keyboard devices (T-Deck Plus), physical key input is active in all text fields without needing to open the on-screen keyboard explicitly.
┌────────────────────────────────────┐
│ Field title [counter] │
│ ┌──────────────────────────────┐ │
│ │ typed text with cursor █ │ │
│ └──────────────────────────────┘ │
│ ┌──────────────────────────────┐ │
│ │ Q W E R T Y U I O P │ │
│ │ A S D F G H J K L │ │
│ │ Z X C V B N M ← ↵ │ │
│ │ ⇧ 123 [space] . OK × │ │
│ └──────────────────────────────┘ │
└────────────────────────────────────┘
| Mode | How to activate |
|---|---|
| UPPERCASE | Default mode on open |
| lowercase | Tap the shift key (⇧) |
| Symbol set 1 (SYM1) | Tap 123
|
| Symbol set 2 (SYM2) | Tap #+= from SYM1 |
| Action | Touch | Hardware keyboard |
|---|---|---|
| Insert character | Tap key | Type key |
| Delete character | Tap ← | Backspace |
| Confirm / Send | Tap OK | Enter |
| Cancel | Tap × | Alt+C |
| Move cursor left/right | Tap in text area | ← → arrow keys |
| Copy a word | Double-tap the word | — |
| Paste from clipboard | Double-tap in empty area | — |
Symbol printed on a key (# 1 @ ! ? …) |
SYM1 / SYM2 | Sym+key |
| Open the on-screen symbol pad | Tap 123
|
Alt+S |
The T-Deck keyboard cannot type some ASCII characters. While a text field is open, Alt+key inserts them. Each one relates to the symbol printed on its key (e.g. D carries 5 → %, N carries , → <). An Alt combination never types the plain letter. Alt+B (keyboard light), Alt+C (cancel), Alt+L (lock) and Alt+S (symbol pad) are reserved. The editor shows this list on screen.
| Alt+ | O | D | F | Z | N | M | T | Y | G | V | I | K |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Inserts | = |
% |
^ |
& |
< |
> |
[ |
] |
\ |
| |
~ |
` |
The GUI maintains a private clipboard (up to 256 characters) for copy and paste within the device.
- Copy a word: double-tap any word in a message detail view. A brief notification shows the copied text.
- Copy public key: open Mgmt → Global → Public Key (Identity detail) and long-press the public-key block, or long-press the Device ID row to copy the short ID.
- Paste: double-tap in an empty text input area. A character counter in the title shows remaining space.
- The clipboard is saved to the SD card as
/clipboard.txtand is restored on reboot.
Fields designated as passwords — BLE PIN, WiFi password, repeater admin passwords — display characters as • dots. The actual value is withheld from the display but can be copied from a clipboard operation in specific flows (e.g. copying a displayed credential for transfer).
For fields with a maximum length (channel messages are limited to 125 characters), a counter is shown in the top-right corner of the input box. The counter turns red as the limit approaches.
Destructive or irreversible actions always present a confirmation dialog before executing, showing a title and description of the action with OK and Cancel buttons.
A 150 ms suppression window is applied after the dialog opens. This prevents the finger-up event of the opening tap from immediately and accidentally dismissing the dialog.
| Action | Location |
|---|---|
| Delete channel | Long-press channel title row in transcript header |
| Delete DM thread | Long-press thread row in Users list |
| Join hashtag channel | Tapping a #tag in a message |
| Switch transport | Mgmt → WiFi → Use WiFi or Mgmt → BLE → Use BLE (CrowPanel 7: Switcher → Safe reboot) |
| Share channel (shows the secret) | Mgmt → Channels → Share |
| Purge all contacts | Mgmt → Contacts → Purge Contacts |
| Purge contacts (keep favourites) | Mgmt → Contacts → Purge w/o favs |
| Disable all flood adverts | Mgmt → Advert |
| Disable all direct adverts | Mgmt → Advert |
| Delete WiFi profile | Mgmt → WiFi → Profiles |
- Go to Mgmt → Lock.
- Set Autolock to Enabled.
- Tap Set on Autolock Timer and enter idle seconds (5–3600).
- Optional: set Lock Background to Picture, place a PNG at Picture PNG (or upload from WebUI), and pick Lock Text Color.
The timer resets on every touch, keypress, or navigation event. The lock does not engage during the boot splash screen.
When locked, normal UI input is blocked and a full-screen overlay is drawn:
- Lock Background → None: black screen (display may soft-off until you touch; see below).
- Lock Background → Picture: your PNG fills the screen; touch or a key press turns the panel on and shows the time and hints on top.
- Shows HH:MM:SS (device local time), Locked, and — if F-Advert Tracking is enabled — an orange Tracking badge.
- Mesh receive, message storage, and radio activity continue; only the interactive UI is suspended.
Configure appearance under Mgmt → Lock (Page 5).
On touch devices:
- Long-press anywhere for 2 seconds. A progress bar and Hold: X.Xs countdown appear.
- Release early and the attempt resets; hold until the bar completes.
On keyboard devices (e.g. T-Deck):
- Press Alt+L to toggle lock, or use the same 2 s long-press where touch is available.
After unlocking:
A short grace period (~1.5–3 s) prevents the unlock gesture from immediately activating a control underneath.
Mgmt → UI → Disp. Timeout dims the backlight after inactivity; a tap wakes brightness. This is independent of autolock — both can be active. Entering lock while soft-off forces the panel on so the lock screen remains visible when Lock Background → Picture is used.
| Gesture | Effect |
|---|---|
| Single tap | Select, open, activate |
| Short tap battery indicator | Cycle status label: Percent → Volts → Duty → Percent |
| Tap status bar clock | Open Mgmt → Date/Time |
| Long-press Contacts tab (2 s) | Toggle Discovered nodes view |
| Short tap Contacts tab | Cycle contact sort mode (not in Discovered view) |
| Short tap Msgs tab | Cycle Channels → DMs → Rooms lists |
| Long-press Msgs tab (2 s) | Open join-channel secret-key editor |
| Long-press Back arrow in transcript | Clear transcript (with confirmation) |
| Long-press channel/DM title in transcript header | Delete channel or DM thread (with confirmation) |
| Long-press transcript header middle button (1 s) | Edit Custom QuickSend text |
| Long-press map node marker | Select contact |
| Long-press lock screen | Unlock (2-second hold) |
| Double-tap word in detail view | Copy word to clipboard |
| Double-tap empty editor area | Paste from clipboard |
| Swipe up/down | Scroll any list or log |
| Swipe left/right | Switch Msgs frames, Mgmt pages, contact detail pages |
| Drag on map | Pan map |
🔧 Touch handling internals (scroll gating, dropout protection)
Fixed headers, title bars, and action bars do not initiate drag-scroll when a touch begins in their region. Only the scrollable content area below responds to vertical drag. This prevents unintentional scrolling when tapping buttons in headers.
A 150 ms grace window joins brief touch-panel dropout events into the preceding gesture, so that a momentary lift during a slow drag does not break the scroll. The suppression window after dialogs and editor overlays also prevents ghost taps from the closing interaction.
| Key | Action |
|---|---|
W |
Pan up |
A |
Pan left |
S |
Pan down |
D |
Pan right |
I |
Zoom in |
O |
Zoom out |
R |
Re-centre on your location |
T |
Toggle altitude bar |
| Key | Action |
|---|---|
| Printable characters | Insert at cursor position |
| Backspace | Delete character before cursor |
| ← / → | Move cursor left/right |
| Enter | Confirm and send |
| Esc | Cancel and close editor |
| Key | Action |
|---|---|
| Printable characters | Add to command input |
| Enter | Send command |
| ↑ / ↓ | Navigate command history |
| Backspace | Delete last character |
The WebUI is a browser-based interface that mirrors the on-device GUI in structure, appearance, and functionality. It is served directly from the device itself over WiFi — no external server or cloud service is involved. When the device is connected to a WiFi network (or acting as a WiFi access point), any device on the same network can open the WebUI in a web browser.
The WebUI offers the same four main tabs as the on-device GUI: Contacts, Msgs, Map, and Mgmt. (Channels, DMs, and room-server threads all live under Msgs, not separate top-level tabs.) All data visible in the WebUI comes from the device in real time via a WebSocket connection; changes made in the WebUI are immediately reflected on the device and vice versa.
In plain words — quick version:
- On the device: Mgmt → WiFi → set WebUI to Enabled and make sure WiFi is the active connection (Use WiFi).
- Connect your phone/laptop to the device's WiFi (Access Point mode), or put both on the same network (Station mode).
- Open
http://192.168.4.1(Access Point mode) orhttp://<IP shown under Mgmt → WiFi>in a browser.- Log in with user
adminand the six-digit Custom PIN from Mgmt → BLE.If the page does not load, see Troubleshooting.
🔧 Full requirements, login and session behaviour
The on-device HTTP/WebSocket server (port 80) starts only when both are true:
- WebUI is Enabled (Mgmt → WiFi → WebUI — default is often disabled on first boot).
-
WiFi is the active transport (not BLE or Off) and the link has a usable IP (Station associated or Access Point running, e.g.
192.168.4.1).
Enabling WebUI while the device is on BLE turns the setting on but does not start the server. After you switch transport to WiFi and the link has an IP, the server starts automatically. Mgmt → WiFi → WebUI Server shows Running only when the listener is actually bound; Enabled with Stopped means waiting for WiFi or an IP.
Anyone who can reach the device IP on the LAN can open the login page; you must sign in before data or settings are available.
Prerequisites
- WiFi transport selected and up (Station or AP) — see §8.3.
- WebUI: Enabled on the device.
- The device's Custom PIN (Mgmt → BLE → Custom PIN). This is the WebUI password.
When connected to an existing WiFi network (Station mode):
- Connect the device to your WiFi (active WiFi profile, Station mode).
- On the device, note the IP in Mgmt → WiFi (e.g.
192.168.1.45) or use the address your router assigned. - On a phone or PC on the same network, open a browser:
http://<device-ip>(example:http://192.168.1.45).
When using the device as a WiFi access point:
- Use a WiFi profile in Access Point mode; connect clients to the AP SSID (see §8.3).
- Open
http://192.168.4.1in the browser (typical AP address when the status line shows the AP is up).
Login (required)
The first screen is the MeshCore WebUI login overlay:
| Field | Value |
|---|---|
| User |
admin (fixed; shown on the form) |
| Password | The device's 6-digit Custom PIN (same PIN used for BLE pairing) |
Tap Login. On success, the overlay closes and the WebUI loads contacts, channels, map, and management pages. A session token is stored in the browser (localStorage); the next visit on the same browser may skip the login step until that token expires or is cleared.
Wrong credentials show Login failed; API and WebSocket requests without a valid token return 401 Unauthorized.
After login
- The browser opens a WebSocket to the device for live data (messages, contacts, GPS, debug tiles).
- If the connection drops, the client retries with backoff (about 1.5 s up to ~12 s). If the session is no longer valid, you are returned to the login screen.
- Logging out or clearing site data removes the saved token; you must log in again.
-
Keyboard shortcuts use Alt + a letter (e.g. Alt+S opens map search on the Map tab). These are browser shortcuts in the WebUI, not the T-Deck Map pan keys (
W/A/S/D). Full list: §5.3.2.
Security: The WebUI has no separate account password — knowledge of the Custom PIN (and network access to the device IP) is enough to sign in. Do not expose the WebUI to the public internet without a VPN or tunnel; see §5.4.
The WebUI provides full access to device state and configuration:
| Tab | Features |
|---|---|
| Contacts | Search (name / pubkey / type), sort (Last Heard, A-Z, Last Msg, Distance, Favs), manual + Add by pubkey, contact detail (GPS, telemetry, path, actions), repeater admin, room-server console |
| Msgs | Three frames like the device: Msgs (channels), DMs, Rooms — use header ◀ ▶ arrows. Channel/DM threads with auto-read on open, per-row Del / RPL / Q1 / Q2, composer with byte counter. + Add panel for new channels (name + optional base64/hex/psk: key) |
| Map | Interactive map; Alt+S search — §5.3.1. Layer switch, path overlay, Clear Path |
| Mgmt | The same 21 logical pages as the device (Global … Alarm), except index 19: on the device this is Backup, but in the browser it is Storage (a file manager) — the WebUI has no backup-slot UI at all. A Debug page (index 20, diagnostics) exists only in the browser, ahead of Alarm. Most settings use per-row Save (not batch commit). Overview grid lists all pages |
WebUI vs device (Mgmt highlights):
| Page | WebUI notes |
|---|---|
| Global | Firmware .bin upload, identity import/export (file + hex), primary storage switch with progress overlay |
| UI | Brightness slider, screen timeout and — on the SenseCAP Indicator — Rotation; Color Scheme, UI Zoom and Battery 100% are device-only |
| WiFi | Extra reconnect/diagnostic rows (sleep inhibit, last event, disconnect reason) |
| GPS | Simpler status block, but the same actions as the device — Restart GPS, Repair receiver, Restore Defaults, Use Map Center, Clear Loc. The detailed UART diagnostics (FixQ, HDOP, hAcc, C/N0, Bytes/Msgs/PVT, Last byte) are device-only. |
| Radio | Also shows RX Delay Base and RX Boosted Gain, which have no row on the device |
| Advert | Also shows Tracking / Track Dist m here (the device keeps those on the GPS page only) |
| Messages | Multi ACKs dropdown offers 0–2; the device accepts 0–99 typed directly |
| Sound | Quiet hours use two time-of-day pickers instead of the device's HHMM digit entry; no Play preview buttons |
| Contacts (Mgmt 15) | Auto Add, Max Hops and the Add-types bitmask, plus a deprecated Client Repeat toggle not on the device; no Manual add contact field and no Purge buttons (device-only) |
| Channels | Same Add/Join/Scopes/Unscoped Flood/Share/Del as the device; Share copies the secret to your clipboard automatically |
| Sensors | Same sections as the device (Live graphs, Status, Calibration, Telemetry permissions); click a Live row for a large graph |
| Date/Time | Sync Prio1–3, timezone, server — no manual Date/Time / GPS Time rows (use device) |
| Alarm | Every device option, including the specific DM sender / channel / channel-sender picks, with per-row Save instead of tap-to-cycle |
| Storage (19) | File manager: browse folders on internal flash or SD, view/edit a text file, delete, see capacity used. A different feature from the device's Backup at the same index — the WebUI has no backup-slot UI |
| Debug (20) | Live diagnostics cards (CPU/heap, UI state, mesh JSON, memory breakdown). Copy Debug Snapshot in Help. Browser-only page, not on the device |
The WebUI supports large contact lists through paginated delivery — contacts are loaded in batches to avoid overloading the connection. All updates from the mesh (new messages, new contacts, GPS movements, signal changes) are pushed to the browser automatically without requiring a page refresh.
Tab-bar mail badges: unread channel and DM counts appear as small envelope icons on the Msgs tab (and update on every tab while connected).
Debug page (browser-only, listed ahead of Alarm): Live diagnostics pushed over WebSocket — CPU/heap/PSRAM, UI state (display, soft-off, lock, tab), timers, battery, WebSocket client counts, message-store sizes, SD queue, and mesh/radio JSON stats. Tap a card to expand detail. Use Copy Debug Snapshot (Help) when reporting issues. There is no WebUI backup UI; use the device Backup page when SD backup is supported.
The browser Map tab uses Leaflet with tiles loaded from the device (same sources as the on-device map: local cache and/or network fetch via the radio).
| Control | Action |
|---|---|
| + (top-right) | Open map search panel — filter by name, hash, or type; tap a result to centre the map and open that marker's popup. Same as Alt+S when the Map tab is active (§5.3.2). |
| Layer buttons (Dark / Light / Topo) | Switch basemap style (stored in the browser for the session). Same as Alt+D / Alt+L / Alt+T. |
| Clear Path (bottom-left) | Visible only while a message path overlay is active — removes hop lines and shows all contacts again (zoom/pan unchanged) |
| Marker popup | Coordinates, distance, Open Contact Detail; repeaters can be added to a manual path when Build Path on Map is active from contact detail |
- In Msgs (channel or DM thread), open a message that has path metadata.
- In message detail, tap Show Path On Map.
- The Map tab opens with numbered hop markers, route polylines, and only contacts on that path visible (same filtering idea as the device GUI overlay in §4.6).
- To exit overlay mode and restore the full contact map, tap Clear Path (bottom-left) or press Alt+C while the Map tab is focused.
Note: Clear Path clears the view overlay only. It does not change stored routing paths on contacts or messages. Build Path on Map (contact detail) is a separate flow for editing a contact's outbound path; cancel that with Alt+P or the path-picker Cancel button.
Live marker updates while you stay on the Map tab (WebSocket pushes) refresh positions without reloading the page; path overlay geometry is updated incrementally when overlay mode is active.
Map Alt+ shortcuts are listed in §5.3.2. In the WebUI help overlay (Map tab → ? or Alt+H), the same shortcuts appear under Map Shortcuts.
The WebUI is used in a desktop or mobile browser. Shortcuts are Alt + letter (hold Alt, tap the letter). They are not the on-device T-Deck Map keys (W / A / S / D pan the hardware map; Alt+S in the browser opens search on the WebUI map).
Tip: On macOS, Option is the same modifier as Alt for these shortcuts.
Works when the WebUI Map tab is selected (focus is in the page). Alt+M switches to Map from any other tab.
| Shortcut | Action |
|---|---|
| Alt+S | Map search — open the top-right search panel, focus the search field, and show matching contacts (name, pubkey, type, hash). Enter selects the first result; Escape closes search. |
| Alt+M | Switch to the Map tab |
| Alt+F | Centre map on this device (self GPS) |
| Alt+D | Basemap: Dark |
| Alt+L | Basemap: Light |
| Alt+T | Basemap: Topo |
| Alt+C | Clear Path — exit message path overlay; show all contacts again |
| Alt+P | Cancel Build Path on Map picker (if active) |
| Alt+H | Open Map Shortcuts help (marker legend + shortcut list) |
Map search workflow (Alt+S or + button):
- Open the Map tab (or press Alt+M).
- Press Alt+S (or tap + at the top-right of the map).
- Type in the search field — results update as you type (up to 24 matches).
- Click a result (or press Enter with the field focused) to pan/zoom to that node and open its popup.
- Press Escape or tap × on + to close the search panel.
The WebUI is designed for local network use. It is not intended to be exposed directly to the internet. For remote access over the internet, use a VPN or a secure tunnel.
Practical limitations:
- The WebUI requires the device to be on WiFi or acting as an AP. It is not available when the device is in BLE-only mode.
- Map tiles in the WebUI come from the same source as the on-device GUI. Network tile downloads (from OpenStreetMap) pass through the device — if the device has internet access, the map will auto-load tiles; if not, only pre-loaded SD card tiles are available.
- Very large contact lists (hundreds of contacts) load progressively; the initial page may show a partial list for a few seconds on first connection.
MeshCore supports two types of text messaging: direct messages (one-to-one, end-to-end encrypted) and channel messages (group, PSK-encrypted).
- Maximum message length: 125 characters
- Encryption: end-to-end using the recipient's public key
- Delivery tracking: each sent message is assigned a pending state; it transitions to delivered (✓) when an acknowledgement is received, or undelivered (✗) if no acknowledgement arrives within the timeout
- Route caching: the path to the recipient is cached after the first successful exchange. Subsequent messages reuse this path without flooding. If delivery fails, a path reset and re-flood are triggered automatically (if Auto Retry is enabled)
- Message history is stored on the device and persists across reboots
- Maximum message length: 125 characters
- Encryption: all participants share a pre-shared key (PSK); messages are decryptable by anyone with the key
- All channel messages use flood routing, so they propagate across the entire reachable mesh
- Message history per channel is stored on the device and persists across reboots
- Up to the device storage limit, multiple channels can be joined simultaneously
MeshCore provides three configurable message shortcuts in Mgmt → Messages:
| Setting | UI label | What it does |
|---|---|---|
| Custom QuickSend | Custom / Qck (thread header) | Sends the phrase immediately to the open channel or DM — no composer |
| Custom QuickR1 | Q1 (WebUI); QuickR1 (device composer) | Inserts expanded template text into the composer for a reply to a specific message |
| Custom QuickR2 | Q2 (WebUI); QuickR2 (device composer) | Second quick-reply template (same behaviour as Q1) |
Quick Send (Custom QuickSend):
- Tap Custom / Qck in the channel or DM transcript header (sends immediately to the open thread).
- Long-press the middle header button in an open transcript (about 1 s) to edit the QuickSend phrase (same text as Mgmt → Messages → Custom QuickSend).
- If unset, the device falls back to a default test phrase (
RangeTest - ACK?).
Useful for canned status lines such as OK or Heading back.
Quick replies Q1 / Q2 (Custom QuickR1 / QuickR2):
- Configure both strings under Mgmt → Messages (up to 128 characters each).
-
WebUI: in an open channel or DM thread, tap Q1 or Q2 on a message row. The composer is prefilled with the template after placeholder expansion; for incoming channel traffic the WebUI may add an
@[sender]prefix. -
Device: in a channel thread, tap a message → Reply → tap QuickR1 or QuickR2 in the editor. Placeholders
(HP),[HP],(HC),[HC],(SNR),[SNR],(RSSI),[RSSI]are filled from that message’s route/SNR/RSSI data. Edit if needed, then confirm OK to send. - If a template is empty, the device shows QuickR1 not set / QuickR2 not set; the WebUI shows a similar notice.
Quick Send and Q1/Q2 are separate: Quick Send transmits directly; Q1/Q2 only prepare (or prefill) a reply tied to a chosen message.
MeshCore routes packets using shortened path hashes — the first 1, 2, or 3 bytes of each node’s public key (see Mgmt → Advert → Path Hash Mode and your Device ID on Mgmt → Global). On the air and in stored message text, those hops often appear as bracketed hex:
| Pattern | Path hash size | Example |
|---|---|---|
[XX] |
1 byte | [A3] |
[XXXX] |
2 bytes | [A3F2] |
[XXXXXX] |
3 bytes | [A3F2C1] |
Bots, repeaters, and users may embed these tokens in channel or DM text (for example route reports, diagnostics, or templates that expand (HP) / [HP] to a hop list).
Replace HashCodes (Mgmt → Messages, default Enabled) controls display only:
-
Enabled: in channel/DM transcripts and message detail, each matching
[XX]/[XXXX]/[XXXXXX]token is shown as[ContactName]when that prefix matches a node in your Contacts list (same lookup as the map hash badge and route overlay). - Disabled: messages show the literal hex tokens as received — useful for debugging, support logs, or copying exact on-air path data.
This does not change what was transmitted or what is saved on SD; it only changes how the device UI and WebUI render message bodies. Unknown hashes (no matching contact) stay as [A3] etc. The WebUI setting is the same (Replace HashCodes under node/message settings); unresolved hashes are shown in monospace grey, resolved ones as a name badge plus the hash.
When to use it:
- Leave Enabled for day-to-day reading — channel traffic and quick-reply expansions are easier to follow when hop codes become repeater or user names you already know.
- Turn Disabled if you need the exact hash bytes (troubleshooting routes, comparing with a packet log, or matching Path Hash Mode on another node).
Ensure repeaters and peers you care about are in Contacts (auto-add or manual); replacement only works for public-key prefixes you have stored locally.
- Unread badges appear on the Msgs tab, channel rows, and DM rows when messages have not been marked read on the device.
- Open a thread and scroll to the bottom to mark visible traffic read automatically, or tap Read in the transcript header to mark the whole thread at once.
- Tap Newest to jump to the latest message without scrolling manually.
- While a phone or browser companion session is connected over Wi‑Fi/BLE, newly arriving messages are ingested as read on the device; use Read after disconnect if you cleared unread state only on the companion app.
Channels can be joined in two ways:
- By name: open the Msgs tab, tap +, and enter a channel name. A channel with no PSK is effectively a public channel — anyone using the same name on the same radio frequency can participate.
-
By name + PSK: tap +, enter the name, and enter the pre-shared key (base64 is usual; the WebUI also accepts hex or a
psk:prefix). Only devices with the matching key can decrypt messages. -
By hashtag link: tapping a
#channelnamereference in any received message immediately prompts you to join that channel. - Mgmt → Channels: use Add channel or Join channel — same channel list as the Msgs tab; changes are saved immediately.
Joined channels are written to the same store as contacts. With Primary Disk → SD Card, channel data is saved on the SD card (not only internal flash), so new channels survive reboot when the card is present.
A default Public channel exists that is pre-configured on all MeshCore nodes. It has a known public key, so any node on the same frequency can participate. The Public channel is restored automatically if deleted.
- Delete a channel: long-press the channel title row in the transcript header, or use Mgmt → Channels → Delete.
- Clear transcript: long-press the Back arrow inside a channel transcript.
- Cycle scope: short-tap the channel title row in a transcript, or Mgmt → Channels → Scope per channel.
- Share a channel: Mgmt → Channels → Share shows the channel's secret as text (there is no QR code) — see Page 16 — Channels.
Optional geo-filter tags for flood traffic. Define named scopes under Mgmt → Channels → Scopes; assign per channel or set a Default Scope. Scope badges on channel rows and Scope: in message detail show which region applied. See §4.5 Region scopes.
New nodes are discovered from their advertisement packets. When Auto Add Contacts is enabled, the GUI automatically adds incoming advertisements to the contact list based on:
- Type filter — only the selected node types (USR, RPT, SVR, SNS) are added
- Hop limit — only nodes reachable within the configured maximum number of hops are added
If you know a node's public key but it is not in radio range, you can add it manually:
- Go to Mgmt → Contacts → Manual Add.
- Enter the full 32-byte hexadecimal public key.
- Enter a display name.
- Tap Add.
The contact appears in the list immediately and will be available for messaging.
Star any contact by tapping FAV in the contact detail view. Favourite contacts:
- Are always shown regardless of the Favs Only filter
- Are preserved when Purge Contacts (keep favourites) is used
- Display a ⭐ badge in the contact list
By default, contacts do not automatically share their GPS coordinates and sensor readings with you unless you grant them permission. Tap TPERM in the contact detail view to toggle this. When permission is granted, the contact's telemetry fields are populated in the detail view as the node broadcasts data.
On first boot or after enabling the GPS module, allow up to 5 minutes for an initial satellite fix, especially indoors or in built-up areas. The GPS status icon in the status bar shows whether the module is searching or has a valid fix. Once a fix is acquired, the map automatically places the "ME" marker at your location.
For best results, position the device with a clear view of the sky. Some device variants (e.g. T-Deck Plus) have specific antenna placement requirements — consult your device's documentation for the optimal antenna orientation.
When Advert Location is enabled (Mgmt → Advert), your GPS coordinates are included in advertisement packets. Other nodes receive these coordinates and can plot your position on their maps. Disable Advert Location if you do not want to share your position.
GPS coordinates are saved to persistent storage every 5 minutes while a fix is active. After a reboot, the last saved position is shown on the map immediately.
Mgmt → GPS → Tracking controls automatic flood adverts when your position changes:
- Set F-Advert Tracking to Enabled.
- Set Send tracking advert every to the distance in metres you must move before another tracking advert is sent (default 15 m).
- Ensure GPS function is on and the module has a valid fix (Advert Location → GPS if you want coordinates in those adverts).
Each time you move at least that far from the last tracking anchor, the device issues a flood advert (rate-limited to about one attempt every 1.5 s). Other nodes can discover your updated position without waiting for the normal auto-advert schedule. An orange tracking icon in the status bar indicates tracking is enabled.
On the WebUI, the same options appear under node settings as Tracking and Track Dist m.
For offline map tiles, use the slippy-tile format ({z}/{x}/{y}.png) under Mgmt → Map → Tiles Folder, on internal flash or microSD depending on Mgmt → Global → Primary Disk. You can copy tiles from a PC (MOBAC, MAPC2MAPC, etc., zoom 8–16) or let the device download them when Network Tiles and Local Tiles are enabled and WiFi is connected (see §8.2).
The device also keeps 32 map tiles in RAM to reduce storage reads while panning.
On the device, tap Path: in message detail to show the hop route on the Map tab (§4.6). In the WebUI, use Show Path On Map and Clear Path / Alt+C (§5.3.1).
Mgmt → Sensors (device and WebUI) shows the node's own readings — battery, temperature, humidity, pressure, CO₂, TVOC, INA2xx power values and more, depending on the hardware — each with a live graph of the last 96 samples, plus status rows, calibration offsets and the telemetry permissions (see the Sensors page description above). Local telemetry is independent of radio communication — it reads the hardware sensors directly.
Remote telemetry from other node types (sensor nodes, repeaters) is visible in the contact detail view under the Telemetry field. The contact must have TPERM granted and must broadcast its sensor data in advertisements.
In plain words: Think of the radio settings as the "channel" and "speed mode" of a walkie-talkie.
Want… Do… Cost More range Higher SF, lower bandwidth Messages take longer to transmit and block the channel longer Faster messages Lower SF, wider bandwidth Shorter range More robust in noisy places Higher CR A little more airtime Golden rule: Frequency, bandwidth, SF and CR must be identical on every device in your group. If you can't hear anyone, check this first.
Respect your country's legal limits for frequency, transmit power and airtime.
MeshCore uses LoRa radio modulation. The key configurable parameters are:
Frequency: The centre frequency in MHz. All nodes on the same mesh must use the same frequency. Consult your regional radio regulations for authorised ISM-band frequencies (e.g. 868 MHz in Europe, 915 MHz in North America).
Bandwidth (BW): The LoRa channel width. Narrower bandwidth gives better sensitivity and longer range but lower data rates and slower messaging. Wider bandwidth allows faster communication at shorter range. Common values: 62.5 kHz (maximum range), 125 kHz (balanced), 250/500 kHz (high throughput, shorter range).
Spreading Factor (SF): Controls the encoding spread. Higher SF = greater range and interference resilience, lower data rate, longer airtime. Lower SF = shorter range, faster messages. SF 7–8 is typical for shorter distances; SF 11–12 for maximum range on very sparse networks.
Coding Rate (CR): Forward error correction overhead. CR 5 (4/5 encoding) has less overhead; CR 8 (4/8 encoding) is more robust in noisy environments. Typically left at 5 unless experiencing high packet error rates.
TX Power: Output power in dBm. Higher power extends range but increases current draw and may exceed regulatory limits. Always verify the legal limit for your region and frequency band before increasing power.
Airtime factor / duty cycle: Mgmt → Radio sets the Duty Cycle in percent (10 = 10 %), shows the derived Airtime Fact, and Duty Live (TX time since boot). TX Budget shows how much of the allowed airtime is left; when it is used up the device keeps outgoing packets queued and the round radio dot at the top left of the status bar (device and WebUI) shows a yellow X ("HOLDING" on the TX Budget row) until sending is allowed again. Monitor Duty Live against regional limits (e.g. 1 % in some EU SRD sub-bands). The lowest duty cycle you can set is 10 % (the firmware limits the airtime factor to 9), so for stricter limits keep your own traffic low.
All nodes communicating on the same mesh must have identical frequency, bandwidth, spreading factor, and coding rate settings. If any parameter differs, two nodes will not hear each other. On device, edit each row with Edit — there is no batch RADIO commit button.
In plain words: Set your time zone and let WiFi (NTP) or GPS set the clock. Manual entry is the fallback.
Accurate time is used for message timestamps and routing cache management. Four synchronisation methods are available:
- Manual entry (Mgmt → Date/Time → Date/Time) — tap Set and enter local date/time.
- GPS sync (Mgmt → Date/Time → GPS Time → Sync) — copy time from a valid GPS fix.
- NTP — put NTP in Sync Prio1–3 and connect WiFi; the device retries SNTP about every 60 s and applies time on each good response (see Page 17 — Date/Time).
- Sync priorities — assign NTP, GPS, and/or Message to Sync Prio1–3; the device uses the first configured source that is available, with the per-source intervals in that section.
The NTP server hostname and timezone string are configurable. Use short forms like CET or UTC+2, or a full POSIX string (see Page 17 — Date/Time). The firmware validates NTP timestamps and rejects implausible values.
Quick check: after saving the timezone, the status-bar clock should match local UK/EU/US time before NTP sync (TZ alone shifts display). With NTP in a prio slot and WiFi connected, Clock Status should eventually show e.g. NTP Prio1 after a successful sync.
In plain words: To use your phone or computer with the device you can connect by Bluetooth (phone app), WiFi (browser/WebUI) or USB cable. Most devices use one of Bluetooth/WiFi at a time; switch on the Mgmt → WiFi or Mgmt → BLE page.
The companion firmware can connect to external client applications (mobile apps, WebUI, Python/JavaScript tools) via three transports:
| Transport | Description |
|---|---|
| BLE | Bluetooth Low Energy. Suitable for short-range connections to a paired phone or tablet. Uses a fixed 6-digit PIN for pairing. |
| WiFi | Connects to an existing WiFi access point (STA mode) or creates its own network (AP mode). Enables the WebUI and remote access. |
| USB | Serial-over-USB. Used for direct connection to a computer running a compatible client. No wireless configuration required. |
Only one primary transport (BLE or WiFi) is active at a time on most devices. Switch with Use WiFi on Mgmt → WiFi or Use BLE on Mgmt → BLE when the other transport is active. On CrowPanel 7 (hosted WiFi/BLE), the row shows Switcher → Safe reboot and reboots into the selected transport. Some native builds apply the switch without a full reboot.
Access Point vs Station: Each saved WiFi profile stores whether it uses AP or STA mode plus the credentials for that mode. Switching profiles is the recommended way to move between a field hotspot, home router, and office WLAN (see §8.3). New devices default to AP when no Station SSID is configured.
Access Point mode: The device creates its own WiFi network (SSID/password from the active profile), assigns clients an address via DHCP (192.168.4.1/24 on the device), and allows up to three associated clients. The WebUI is reachable at http://192.168.4.1 when WebUI is enabled.
Firmware updates can be performed:
- Via the web flasher — connect the device via USB and use https://flasher.meshcore.io as described in Section 2.2. Settings are preserved unless a full erase is performed.
- Over-the-air (OTA) — when the build includes auto-update and WiFi is connected (with password set where required), use OTA Update on Mgmt → Global. Some boards also offer Update ESP32-C6 for coprocessor firmware. OTA downloads firmware over WiFi; a reboot follows.
SenseCap Indicator: OTA updates the ESP32 companion only. After any companion update, flash the matching RP2040 .uf2 from Releases as described in SenseCap Indicator — RP2040 coprocessor.
After any firmware update, verify that your radio settings (frequency, bandwidth, etc.) are still correct before transmitting.
MeshCore is designed with power efficiency in mind.
Display sleep: The display enters soft-off (zero brightness) after Disp. Timeout (Mgmt → UI) elapses. The touch panel remains powered, so a touch wakes the display without a hardware button. This is the largest single contributor to battery life improvement.
Brightness: Lower Mgmt → UI → Brightness to reduce backlight current. On T-Deck Plus, Keyboard Light on Mgmt → Light is separate from the display.
GPS: The GPS module is a significant power consumer. Disable it (Mgmt → GPS → GPS function) when location is not required.
Radio: The LoRa radio is active continuously for reception. Reducing TX power and decreasing advertisement frequency reduce transmit power consumption.
Sounds: Active buzzers draw current when producing sound. Disabling notifications reduces idle power draw on devices with always-on buzzer hardware.
Autolock: Use autolock with a short timer (30–60 seconds) to ensure the display enters soft-off promptly after the device is set down. This prevents the display from remaining bright in a pocket or bag.
Devices with onboard audio hardware (buzzer or speaker) can play notification sounds for various events. All audio settings are in Mgmt → Sound:
- All Sounds — master enable for notification audio
- When Connected — tone when a BLE or WiFi client connects
- Boot Sound, New DM, New Channel, Ack — per-event tones (each has a Play preview on device)
Volume can be set to Low, Medium, or High. Disabling individual notification sounds does not affect the other sounds.
Note: Audio is only available on devices with dedicated audio hardware. On the Heltec V4, audio support depends on hardware configuration; sound may be compiled as a no-operation on units without a confirmed buzzer connection.
| Device | Processor | Display | GPS | Audio | SD Card | BLE | WiFi |
|---|---|---|---|---|---|---|---|
| LilyGO T-Deck Plus | ESP32-S3 | 320×240 TFT | ✓ | Speaker | ✓ | ✓ | ✓ |
| LilyGO T-Deck (OG) | ESP32-S3 | 320×240 TFT | — | — | ✓ | ✓ | ✓ |
| Seeed SenseCap Indicator | ESP32-S3 + RP2040 | 480×480 TFT | — | — | — | ✓ | ✓ |
| Elecrow CrowPanel 3.5" | ESP32-S3 | 480×320 TFT | — | — | ✓ | ✓ | ✓ |
| Elecrow CrowPanel Advanced 7" | ESP32-P4 | 1024×600 IPS | — | — | ✓ | ✓ (via C6) | ✓ (via C6) |
| Heltec V4 (extended) | ESP32-S3 | TFT | — | Optional buzzer | — | ✓ | ✓ |
- Physical QWERTY keyboard and trackball provide the most complete input experience
- Keyboard backlight blink notification is available on this device only
- GPS module requires correct UART baud rate (38400) and antenna orientation; external antenna strongly recommended for reliable fix acquisition
- Up to 32 GB SD cards supported; FAT32 format required
- Screenshots can be captured from within the device (consult the FAQ for the key combination)
- No GPS module; GPS-related settings and map ME / follow-me behaviour are limited
- No speaker; Mgmt → Sound rows may show as unavailable
- Physical QWERTY keyboard and trackball; no Keyboard Light / keyboard-blink rows (those are T-Deck Plus only)
- Map tab still supports keyboard pan/zoom (
W/A/S/D,I/O,R,Tfor altitude bar) - Same core messaging, channels, and management pages otherwise
- Touchscreen only; no physical keyboard or trackball
- Hardware button on the top edge toggles the display on/off
- No built-in GPS; GPS features unavailable
- Dual-MCU architecture (ESP32-S3 + RP2040): ESP32 runs the companion; RP2040 owns the onboard microSD, sensors, buzzer, and battery measurement — flash both on every release (§2.2 RP2040 UF2)
- Map tiles and primary data can use the RP2040-attached SD when Mgmt → Global → Primary Disk is set to SD Card; network download remains available when SD is empty
- Capacitive touchscreen only
- SD card slot available for map tiles
- No built-in GPS
- Largest supported display: 1024×600 MIPI-DSI IPS
- WiFi and Bluetooth provided through an integrated ESP32-C6 coprocessor
- Switching from BLE to WiFi involves the coprocessor and requires slightly longer transition delays than native ESP32 devices
- GPS not built in; no audio hardware
- Requires USB-C power delivery capable of 8–10 W for the display and coprocessor; underpowered USB ports may cause display instability
- Touch TFT variant only (non-TFT variants use e-paper and are not covered by this GUI guide)
- Audio support depends on hardware variant; buzzer notifications may be inactive on some units
- No GPS, no SD card in the standard configuration
The following defaults are applied on first boot when no saved settings exist (tuned for EU/UK ISM bands):
| Parameter | Default Value |
|---|---|
| Frequency | 869.618 MHz |
| Bandwidth | 62.5 kHz |
| Spreading Factor | 8 |
| Coding Rate | 8 |
| TX Power | 22 dBm |
For other regions, adjust these settings immediately after first boot via Mgmt → Radio before transmitting. Example settings for other regions:
| Region | Typical Frequency | Notes |
|---|---|---|
| Europe (EU863-870) | 869.525 MHz or 869.618 MHz | 1 % duty cycle applies |
| North America (US915) | 915.0 MHz | Check local SUB-GHz regulations |
| Australia (AU915) | 915.0–928.0 MHz | Channel plan varies |
| Asia (AS920-923) | 923.0 MHz | Varies by country |
This chapter is mainly for technical users. Beginners can safely skip to Troubleshooting and Best Practices.
In plain words: Your settings are saved automatically on the device. If you have an SD card, a readable copy (
/MCTerm/prefs.txt) is kept there too. To be safe, occasionally copy that file somewhere, or make a Backup slot (Mgmt → Backup). After changing settings, wait a moment before pulling out the SD card.
🔧 Technical details: storage layers, prefs.txt keys, Primary Disk switch
Settings use two layers:
-
Binary prefs blob — the authoritative
NodePrefsstore (radio, telemetry, GPS, message options, scopes, etc.) plus manual position, written bysavePrefs()to internal flash or SD depending on Primary Disk. -
/MCTerm/prefs.txt— a portable INI-style sidecar (key=value, one per line) on the SD card when SD is available.
On boot, the firmware compares sync_version in internal storage and in prefs.txt and reconciles UI-oriented fields from the newer copy. The binary blob path follows Primary Disk (below).
Besides sync_version and UI keys (timeouts, map toggles, region scopes, sound, WebUI flags, zoom/brightness, and similar), the file includes every field written by the binary prefs save — for example:
| Category | Example keys |
|---|---|
| Identity / node |
node_name, ble_pin
|
| Radio |
freq, bw, sf, cr, tx_power_dbm, airtime_factor, duty_cycle_pct, multi_acks, rx_delay_base, rx_boosted_gain, client_repeat, path_hash_mode
|
| Telemetry / advert |
telemetry_mode_base, telemetry_mode_loc, telemetry_mode_env, advert_loc_policy, auto_advert_zerohop_hours, auto_advert_flood_hours
|
| GPS / position |
gps_enabled, gps_interval, manual_lat, manual_lon, manual_alt
|
| Contacts / messaging |
manual_add_contacts, autoadd_config, autoadd_max_hops, quick_send_text, quick_reply1_text, quick_reply2_text, msg_auto_retry, msg_auto_reset_path, msg_mark_delivered_fast, msg_replace_hashes
|
| Map / tracking |
map_network_tiles_enabled, tracking_enabled, tracking_distance_m
|
| Scope defaults |
default_scope_name, default_scope_key
|
| Other |
buzzer_quiet, identity key lines when exported, region scope rows (ui_rgn…), etc. |
Whenever settings change in firmware (Mgmt edits, WebUI Save, GPS interval updates, and any other path that calls the internal prefs save), the sidecar is scheduled for rewrite (~120 ms debounce). After editing, wait briefly before removing the SD card, or leave Mgmt / let autolock run to force an immediate flush.
Primary Disk (Mgmt → Global → Actions) selects which store is authoritative for the binary prefs blob when SD is available:
| Primary | Behaviour |
|---|---|
| Internal | Internal storage is source of truth; SD file is updated from internal when synced |
| SD Card | SD prefs file is source of truth when the card is present; switching may copy the blob between stores (watch boot log / progress UI) |
Before the switch finishes, firmware flushes every pending save, then copies the complete managed state — not just radio fields:
| Layer | Included |
|---|---|
| Node / radio | Full NodePrefs binary blob (new_prefs), including GPS interval, manual position, quick-send/reply text, map tiles flag, tracking, scopes, and message options |
| UI settings | All Mgmt/WebUI options in internal storage (timeouts, autolock, map, sound, NTP, WebUI, zoom/brightness, identity key path, etc.) |
| Region scopes | Region definitions and per-channel scope assignments (internal + prefs.txt) |
| Mesh data | Contacts, channels, main identity, advert path blobs, WiFi profiles |
| Internal namespace | Entire meshcore internal export (transport, GPS pin/baud overrides, boot transport, OTA flags, and other dynamic keys) |
| Sidecars |
/MCTerm/prefs.txt (full key set above), advert-path sidecar, clipboard (per primary mode) |
When SD Card is primary, day-to-day saves for contacts and channels go to the SD mirror paths (for example channels2.bin under /MCTerm/primary_state_v2/). Adding or joining a channel from the Msgs tab, Mgmt → Channels, or the WebUI persists there; you do not need a separate “apply” step beyond confirming the add/join dialog.
Progress is shown on device (Storage switch). Wait until it completes before removing the SD card.
prefs.txt is also updated from current in-memory settings whenever SD is mounted (see debounce note above). Moving an SD card between devices can transfer settings if the sync version on the card is newer. The internal clipboard is stored separately at /clipboard.txt on SD and is restored on boot when present.
SD Backup (Mgmt page 19) snapshots SPIFFS-style data to named slots on the card; it is separate from day-to-day prefs.txt sync (see page 19 notes above).
In plain words: The map needs picture tiles. Easiest way: connect the device to WiFi with internet, turn on Mgmt → Map → Network Tiles and Local Tiles, and pan around — tiles are downloaded and saved for offline use. Alternatively copy a prepared tile folder onto an SD card.
Map imagery uses the standard slippy-tile layout: each file is {z}/{x}/{y}.png (e.g. 12/2048/1365.png). The root directory is set in Mgmt → Map → Tiles Folder (default is often /tiles).
You can load tiles in two ways: copy them onto the device in advance, or let the firmware download them over WiFi when Network Tiles is enabled.
The local tile cache — both pre-copied tiles and tiles saved after a network download — is written to:
| Mgmt → Global → Primary Disk | Tile cache backend |
|---|---|
| Internal (default on many boards) | Device internal flash (SPIFFS), under the path from Tiles Folder |
| SD Card | microSD card, under Tiles Folder on that card |
Switching Primary Disk changes where new network downloads are saved and where Local Tiles reads from. Use Mgmt → Map → Tiles Folder → Open to pick the subdirectory (e.g. /tiles) on whichever backend is active.
On boards that use a remote SD (e.g. some SenseCAP setups), SD Card primary may store tiles on the companion SD module; behaviour matches Primary Disk = SD Card in the UI.
- Use a tile tool such as MOBAC (Mobile Atlas Creator), MAPC2MAPC, or a
wget-style slippy downloader - Select OpenStreetMap or another compatible source and your area of interest
- Export zoom levels 8–16 (or fewer on small cards; zoom 16 grows quickly)
- Copy the
{z}/{x}/{y}.pngtree onto the chosen storage:- Internal primary: copy into the SPIFFS path that matches Tiles Folder (via USB mass storage, backup restore, or another supported transfer path for your board)
- SD Card primary: copy onto the microSD, then set Tiles Folder to that directory
On-device folder selection:
- Set Primary Disk if you want internal flash vs SD card as the tile store
- Mgmt → Map → Tiles Folder → Open — browse the active backend and tap Use on the folder that contains the zoom-level directories
- Enable Mgmt → Map → Local Tiles
The map reads from that cache. A 32-tile LRU RAM cache avoids re-reading storage on every pan frame.
When the device is on WiFi with internet access:
- Enable Mgmt → Map → Network Tiles (and WebUI → Map → Network Tiles if you use the browser UI)
- Enable Mgmt → Map → Local Tiles — required if downloads should be saved for later offline use. With Local Tiles off and Network Tiles on, tiles are shown from the network but not written to storage (RAM-only for that session).
- Pan the map to areas that are not yet cached; missing tiles are fetched from OpenStreetMap, displayed immediately, and written under Tiles Folder on internal flash or SD card, according to Primary Disk
Firmware checks the local cache first, then the network. After a successful download, the PNG is stored at {Tiles Folder}/{z}/{x}/{y}.png on the selected backend so later sessions (or Local Tiles only, without WiFi) can reuse it.
Typical combinations:
| Local Tiles | Network Tiles | WiFi | Result |
|---|---|---|---|
| On | On | Connected | Cache first, then download and save missing tiles |
| On | Off | — | Offline cache only |
| Off | On | Connected | Online view only; no persistence to storage |
| Off | Off | — | No map imagery (grid/positions may still show) |
Attribution: When using OpenStreetMap tiles, display of attribution ("© OpenStreetMap contributors") is required by the OpenStreetMap licence. The device itself does not display attribution text on the map view; if you publish screenshots or use the map data in a public context, ensure compliance with the OSM tile usage policy.
In plain words: A profile is a saved WiFi setup (for example "Home", "Office", "Field hotspot"). Switch between them with Mgmt → WiFi → Pick → Select.
WiFi profiles are the primary way to manage connectivity. Each profile is a complete WiFi configuration, not just an SSID/password pair:
| Stored per profile | Description |
|---|---|
| Mode | Access Point (device is the hotspot) or Station (device joins another network) |
| STA SSID / password | Used in Station mode |
| AP SSID / password | Used in Access Point mode |
Examples: a profile Field AP (AP mode, custom SSID for deployment), a profile Home (STA mode, home router credentials), and a profile Office (STA mode, office WLAN). Tap Pick → Select to activate a profile; the device applies mode and credentials and restarts WiFi when WiFi transport is already running.
| Setting | Default |
|---|---|
| Mode (new device, no STA SSID yet) | Access Point |
| Mode (upgraded device with STA SSID already saved) | Station (preserves existing behaviour) |
| AP SSID | Device node name (invalid characters stripped; max 32 characters) |
| AP password |
BLE PIN formatted as six digits plus 00 (8 characters for WPA2, e.g. PIN 123456 → password 12345600) |
| AP DHCP | 192.168.4.1/24 on the device; up to 3 clients |
Station IP Mode (DHCP vs static IP) is shared across profiles — it is not stored inside each profile file.
- Set Mode, credentials, and any other fields on Mgmt → WiFi (or WebUI → WiFi with Save per row).
- Tap New Profile → Add, enter a name, and confirm.
- The new profile is saved with a copy of the current active settings. The active profile does not change unless you select the new one.
The first time you edit WiFi without any profile, firmware creates a Default profile automatically.
- Mgmt → WiFi → Profile → Pick
- Each row shows the profile name and AP or STA
- Tap Select on the desired profile
- The main WiFi screen updates; if WiFi transport is active, settings are applied without a full device reboot when possible
Changes on Mgmt → WiFi (Mode, AP SSID, AP password, STA SSID, password) are written to the active profile immediately. No separate “save profile” step is required.
- Open the profile picker (Pick)
- Tap Del on the profile row
- Confirm deletion
If you delete the active profile, firmware selects another saved profile or clears the active name if none remain.
🔧 Legacy profiles and where profiles are stored
Older firmware stored only Station SSID and password per profile. On first boot with newer firmware, those files are upgraded automatically (MWP1 → MWP2): Station fields are kept; mode is Station if an SSID was set, otherwise Access Point. One-time global AP settings from older internal keys, if present, are merged into the active profile and removed from internal storage.
Profiles are stored in SPIFFS at /state_v2/wifi_profiles.dat (format MWP2). They survive reboots and firmware updates. They are not part of prefs.txt, but they are included when you switch Primary Disk to copy full device state to or from SD (see §8.1), and may be mirrored to SD backup paths when SD mirroring is enabled. Swapping SD cards between devices can transfer profiles only when that full state copy or backup restore includes the WiFi profile file.
In plain words: Manage a repeater or room server from your own device, over the mesh, if you have its admin password.
Remote administration is accessible from the contact detail view when the target contact is a repeater or room server and you have the admin credentials.
Key workflows covered in Section 4.4:
- Viewing live status and statistics
- Managing the access control list (ACL)
- Editing device name and radio parameters
- Setting advertisement intervals
- Reading and correcting the remote device clock
- Running raw CLI commands for advanced configuration
Password security notes:
- Admin passwords are stored per-public-key in device flash. The stored form is hashed, so the cleartext password is never persisted.
- If you forget the admin password, physical access to the repeater is required to reset it via USB.
- ACL entries limit who can access the repeater at each permission level (RO, RW, Admin). A repeater with an empty ACL accepts connections from any node.
When you need to message a specific node but cannot wait for its advertisement packet — for example, before deploying two devices in different locations — use the manual contact import:
- Obtain the target node's full 32-byte hexadecimal public key (on the target device: Mgmt → Global → Public Key, long-press the public-key block to copy it, then transfer it by any means)
- On your device, go to Mgmt → Contacts → Manual Add
- Paste or type the public key hex string
- Enter a display name
- Tap Add
The contact is immediately added to your list. Sending a message to this contact before an advertisement has been received will use flood routing to reach the destination, since the routing path is not yet known.
- Use a lower bandwidth (62.5 kHz) and higher spreading factor (SF 11–12) for maximum link budget. Be aware this significantly slows message delivery and increases airtime.
- Position repeaters at elevated locations — hilltops, rooftops, towers — with unobstructed line of sight.
- Use a quality external antenna with a gain appropriate for your deployment distance. Replace the stock antenna on devices where the connector is accessible.
- Lower coding rate (CR 5) is faster but less resilient to interference. In noisy RF environments, try CR 7 or 8.
- Increase advertisement intervals (Mgmt → Advert). In an established network with stable membership, advertising every 30 minutes is sufficient.
- Limit auto-add by setting Max Hops to 0 or 1 in Mgmt → Contacts. This prevents distant nodes — whose messages are unlikely to reach you directly — from flooding your contact list.
- A mesh with many nodes all using SF 12 and frequent advertisements can quickly saturate the channel. Consider multiple frequency groups or reduce advertisement density.
- Set Disp. Timeout to 10–30 s and enable Autolock with a 60 s timer
- Set brightness to Low
- Disable GPS when not needed
- Disable sounds on devices with active buzzers
- Increase advertisement intervals to reduce TX events
- Use SF 7–8 (shorter messages = shorter airtime = less TX current)
- Enable Auto Retry and Auto Reset Path together: failed messages will trigger a full path re-discovery and retry automatically
- Use Ping (contact detail → PING) to verify reachability before sending long messages
- If a contact is consistently unreachable, use Mgmt → Advert → Scan Rpts to list overheard repeaters and their signal quality
- Check Stats (Mgmt → Stats) for error events and duplicate counts. High traffic noise-floor degradation is visible in the noise floor reading on the Stats page.
- Is the antenna attached?
- Are Freq / BW / SF / CR identical to the other devices? (Mgmt → Radio)
- Is anyone else actually in range and switched on? Send an advert (Mgmt → Advert) and wait a minute or two.
- Is the screen locked? Long-press for 2 seconds to unlock.
- Is the USB power strong enough? (Large screens need a proper power supply.)
- Did you restart the device? A reboot (Mgmt → Global → Reboot) solves many transient problems.
| Symptom | Most Likely Cause | Recommended Action |
|---|---|---|
| Screen stays dark on boot | Inadequate USB power (especially CrowPanel 7") | Use a USB power supply rated for at least 10 W; try a powered USB hub |
| No contacts appearing | No nearby nodes or wrong radio settings | Verify frequency, bandwidth, SF, CR in Mgmt → Radio; check that at least one other node is powered and on the same settings |
| Map tiles not displaying | Cache empty, wrong folder, Local Tiles off, or bad files | Check Primary Disk (SD inserted if SD primary); Tiles Folder must contain zoom folders; enable Local Tiles for cache reads; for network fill, also enable Network Tiles + WiFi |
| Map shows "No GPS fix" | GPS module searching; no satellite signal | Move to an open area with clear sky view; allow 3–5 minutes for cold start; verify GPS is enabled in Mgmt → GPS |
| Map tiles load from network but are slow | WiFi connected via coprocessor with limited RPC bandwidth | Normal behaviour on CrowPanel 7"; tiles load in the background — panning speed improves as the RAM cache fills |
| Touch not responding | Autolock is active | Long-press anywhere on the screen for 2 seconds to unlock |
| WiFi won't connect | Wrong SSID or password | Re-enter credentials in Mgmt → WiFi; check that the access point is reachable and using a 2.4 GHz band (5 GHz not supported) |
| Messages show ✗ (undelivered) | Destination out of range, stale path, or no repeater coverage | Tap the contact → PATH → Reset; enable Auto Retry; verify the destination node is online with a Ping |
| Repeater login fails | Wrong admin password or insufficient ACL role | Verify the password; if forgotten, reset the repeater via USB |
| NTP not syncing | No WiFi connectivity or NTP server unreachable | Check WiFi status; verify the NTP server in Mgmt → Date/Time; for offline networks use GPS or manual time entry |
| NTP Status stuck on Syncing... | SNTP not completing, NTP blocked by higher prio, or interval Once already done | Serial: debug clock on; look for [CLK] ntp configTzTime, sntp_cb, may_apply ... DENY winner=; confirm NTP in Sync Prio and WiFi IP |
| Clock wrong by ~1 h (e.g. UK BST) | Wrong timezone or missing DST rules | Use BST or UK for UK (with DST), CET for Central Europe, or UTC+2 for fixed offset; not IANA names like Europe/London; save TZ then confirm status bar; enable NTP + WiFi for sync |
| System clock shows wrong year | Bad GPS time or rogue NTP source | The firmware validates time against a 2020–2050 plausibility range; if GPS is providing a wildly wrong date, try disabling GPS time sync and using NTP only |
| Stats graphs appear empty | No radio packets yet received | Wait for radio events; graphs populate on each received and transmitted packet |
| Device reboots during WiFi/BLE switch | Insufficient FreeRTOS scheduler time during radio transition | This is mitigated in recent firmware; if recurring, try switching transports with the device stationary and fewer background operations active |
| WebUI does not load | Device not on WiFi or wrong IP address | Check WiFi status (Mgmt → WiFi); confirm the IP address displayed under WiFi Status and navigate to http://<IP> in the browser |
| WebUI shows stale data after reconnecting | Browser WebSocket reconnecting | The browser reconnects automatically; wait 1–3 seconds after the page indicates "Connected" for all data to repopulate |
| BLE pairing fails | Wrong PIN entered on the connecting device | The PIN is the 6-digit Custom PIN in Mgmt → BLE; delete the existing pairing on the phone and pair again |
| SD card not detected | Card not fully seated or incompatible format | Reseat the card; ensure it is formatted as FAT32; cards larger than 32 GB may need to be reformatted |
| Duplicate contacts appearing | Two nearby nodes generating identical public key prefix bytes | Use Manual Add to clarify identities; this is rare but can occur with large meshes |
| Unread badges after reading on phone only | Read state is not synced from the companion app after disconnect | Tap Read in the thread header, or open the thread on device; new traffic while companion is connected is marked read automatically |
| Alarm does not sound | Alarm Seconds is 0, trigger off, phrase/match/sender filter doesn't fit, or sounds muted | Set Alarm Seconds above 0; check Trigger, Phrase, Match, Senders/Channels and Mgmt → Sound → All Sounds / Quiet Hours; test with a message from an allowed sender (see Page 20 — Alarm) |
| Airview shows only a flat quiet column | Nobody transmitting on your settings, or radio settings differ from the others | Check Freq/BW/SF/CR, send an advert and look for your red TX mark (see Airview) |
Something that used to be broken? Fixed bugs (for example older problems with channels on SD, the Backup page title or the contact detail view) are listed per version in the CHANGELOG. If your problem looks like one of them, update the firmware first (see Section 6.9).
- Place repeaters high. The single most effective way to extend a MeshCore mesh is putting at least one repeater at elevation (a rooftop, hill, or tower) with clear line of sight to as many participants as possible.
- One frequency, one mesh. All nodes in a communicating group must use identical radio settings. Document the agreed settings before deploying devices in the field.
- Use dedicated repeater hardware. Running a companion-radio device as a relay is not recommended; it does not forward packets. Use repeater firmware on dedicated hardware for infrastructure nodes.
- Plan your hop budget. Each additional hop adds latency and consumes channel bandwidth. Design the network so that most nodes need at most 2–3 hops to reach any destination.
- Set a strong admin password on all repeater and room server nodes before deployment. An empty or default admin password allows anyone on the mesh to reconfigure or reboot the hardware.
- Use PSK-protected channels for any communication that should not be readable by all participants. The Public channel is visible to every node on the frequency.
- Do not share admin credentials over mesh messages. The admin password should be distributed out-of-band (in person or via encrypted link).
- Disable telemetry sharing (TPERM) for contacts you do not trust with your location data.
- Rotate PSKs for private channels periodically, especially after a member leaves the group.
- Name your device clearly. Use a name that uniquely identifies you within your group (e.g. your callsign or first name + last initial). Generic names cause confusion on the contact list.
- Use Favourites. Star the contacts you communicate with most often and activate the Favs Only filter for a clean, focused contact view during an event.
- Keep SD tiles updated. Before a field event, download fresh map tiles for the target area and copy them to the SD card. OSM data improves continually — tiles from 6+ months ago may be noticeably outdated in actively mapped regions.
- Check Stats before an event. Review Mgmt → Stats → noise floor and last RSSI/SNR after deploying to verify you are on a clean frequency with adequate signal margins.
- Use Ping to verify routes. Before relying on a contact for communications, send a Ping from the contact detail view. The measured round-trip time gives a realistic indication of whether messages will get through reliably.
-
Back up your settings. Periodically copy
/MCTerm/prefs.txtto a safe location. It lists UI preferences plus the full radio/node field set (see §8.1). For a full device image including contacts and message stores, use Mgmt → Backup slots in addition to keepingprefs.txt.
MeshCore is open-source software released under the MIT licence. Contributions, bug reports, and device support requests are welcome via the project repository.