docs: audit the user guide against the code, and fix what had drifted (#6968)

This commit is contained in:
James Rich authored and GitHub committed 2026-08-30 23:29:09 +00:00
1 parent 08e3673797
commit ef4e4154f2
23 files changed
+599 -378

No files matched your search

+8 -8
View File
@@ -17,6 +17,14 @@ Documentation for using the Meshtastic Android and Desktop app.
Keep the last 58 entries and archive older ones by removing them.
-->
**August 2026** — [Local Mesh Discovery](user/discovery) — Mesh Beacon advertises the region and preset your radio actually uses, requires a region and a standard modem preset before it will broadcast, and hides invitations to channels your radio already has.
**August 2026** — [Map & Waypoints](user/map-and-waypoints) — Filter the map by node role and by how a node was heard, from a new filter sheet.
**August 2026** — [Map & Waypoints](user/map-and-waypoints) — Every map layer and overlay now has its own opacity slider.
**August 2026** — [Map & Waypoints](user/map-and-waypoints) — F-Droid builds draw the map with MapLibre, and the Desktop app has an interactive map for the first time.
**August 2026** — [Settings — Radio & User](user/settings-radio-user) — The status message moved into the User Profile, beside Long Name and Short Name; its separate module screen is gone.
**August 2026** — [Messages & Channels](user/messages-and-channels) — Swipe a message right to reply, double-tap it to react, and day separators group the thread.
@@ -25,13 +33,5 @@ Keep the last 58 entries and archive older ones by removing them.
**August 2026** — [Units & Locale](user/units-and-locale) — New page. Units now follow your device region and OS locale, with a Units setting to override them, and all number formatting goes through ICU.
**August 2026** — [Settings — Modules & Admin](user/settings-module-admin) — Documented the About screen and its Acknowledgements list (the old license screen), and the Status Message module.
**August 2026** — Android Auto support was removed from every build variant, and its page with it.
**July 2026** — [Local Mesh Discovery](user/discovery) — New Mesh Beacon: broadcast invitations to your mesh and receive mesh invitations from others, with one-tap join or a preset-seeded Discovery scan.
**July 2026** — [Settings — Radio & User](user/settings-radio-user) — Security config now offers encrypted on-device key backup/restore and a packet-authenticity Protection Level (Strict / Balanced / Compatible).
<!-- WHATS_NEW_END -->
+16 -12
View File
@@ -2,7 +2,7 @@
title: App Functions
parent: User Guide
nav_order: 19
last_updated: 2026-08-29
last_updated: 2026-08-30
description: Expose mesh capabilities to the Android system and on-device AI assistants (e.g. Gemini) so they can run mesh workflows without opening the app.
aliases:
- app-functions
@@ -24,35 +24,39 @@ Control App Functions from **Settings → System AI**. The screen has:
- A **master toggle** labeled **"Allow AI access"**, with the subtitle *"Let system AI assistants (e.g. Gemini) discover and use mesh functions"*. When off, no functions are exposed to the system.
- An **individual toggle for each function**, so you can expose only the capabilities you want.
> ⚠️ **Important:** App Functions ship switched on. On a Google-flavor build the master toggle and every individual function, **Send message** included, start enabled — so an assistant can read your mesh data and send messages to your mesh until you turn **Allow AI access** off.
The functions are grouped into a **Write** section (functions that change something or send data to your mesh) and a **Read** section (functions that only return information).
![App Functions screen with master and per-function toggles](../../assets/screenshots/app-functions_settings.png)
The screenshot has **Send message** and **Get recent messages** switched off to illustrate per-function control; a fresh install shows every switch on.
### Write Functions
| Function | What it does |
|----------|--------------|
| **Send Message** | Sends a text message to a contact (direct message) or to a channel, up to 237 bytes. |
| **Send message** | Sends a text message to a contact (direct message) or to a channel. The mesh carries at most 233 bytes of text, so keep assistant-composed messages short. |
### Read Functions
| Function | What it returns |
|----------|-----------------|
| **Get Mesh Status** | Whether you're connected to a radio, and how many nodes are online. |
| **Get Node List** | The list of nodes on your mesh. |
| **Get Channel Info** | Information about your channels. |
| **Get Device Status** | Status of your connected radio. |
| **Get Node Details** | Detailed information about a specific node. |
| **Get Recent Messages** | Recent messages from your conversations. |
| **Get Unread Summary** | A summary of unread messages. |
| **Get Mesh Metrics** | Telemetry and metrics from your mesh. |
| **Get mesh status** | Whether you're connected to a radio, and how many nodes are online. |
| **Get node list** | The list of nodes on your mesh. |
| **Get channel info** | Information about your channels. |
| **Get device status** | Status of your connected radio. |
| **Get node details** | Detailed information about a specific node. |
| **Get mesh metrics** | Telemetry and metrics from your mesh. |
| **Get recent messages** | Recent messages from your conversations. |
| **Get unread summary** | A summary of unread messages. |
## Privacy
> 🔒 **Privacy:** The **Send Message** function lets an assistant send messages to your mesh on your behalf. Only enable functions you trust the assistant to use. The read functions expose node, message, and metric data to the assistant enable only what you're comfortable sharing. Each function has its own toggle, and the master toggle turns all of them off at once.
> 🔒 **Privacy:** The **Send message** function lets an assistant send messages to your mesh on your behalf, and the read functions expose node, message, and metric data to it. Because all of them start enabled, the choice you make here is what to turn off rather than what to turn on. Each function has its own toggle, and **Allow AI access** turns all of them off at once.
## Related Topics
- [Messages & Channels](messages-and-channels) — sending messages directly in the app
- [Nodes](nodes) — the node list the read functions draw from
- [Node Metrics](node-metrics) — the telemetry behind Get Mesh Metrics
- [Node Metrics](node-metrics) — the telemetry behind Get mesh metrics
+45 -19
View File
@@ -2,7 +2,7 @@
title: Connections
parent: User Guide
nav_order: 2
last_updated: 2026-08-29
last_updated: 2026-08-30
description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP.
aliases:
- bluetooth
@@ -21,14 +21,16 @@ Bluetooth Low Energy is the default and most common connection method on Android
### Pairing a Radio
1. Ensure your Meshtastic radio is powered on and in pairing mode.
1. Power on your radio. Most radios advertise over Bluetooth as soon as they boot — there is no pairing mode to enter. Radios with a color touchscreen ship with Bluetooth switched off, so turn it on from the radio's own on-screen menu first.
2. Open the app and navigate to the **Connect** tab.
3. Tap **Scan for Bluetooth devices** — nearby Meshtastic radios will appear.
4. Select your radio from the list.
5. Accept the Bluetooth pairing prompt if shown.
5. Android asks you to pair. If your radio has a screen, it shows a six-digit PIN — type that into the Android dialog. If your radio has no screen, the PIN is `123456`.
![Scanning for Bluetooth devices, with a discovered radio in the list](../../assets/screenshots/connections_bluetooth_scan.png)
You can change the pairing method, or turn Bluetooth on for a radio that ships with it off, under **Settings → Device configuration → Bluetooth** — see [Settings — Radio & User](settings-radio-user). For more information, see [Bluetooth configuration](https://meshtastic.org/docs/configuration/radio/bluetooth) on meshtastic.org.
Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):
![Connections screen with the transport selector showing Bluetooth, Network, and USB](../../assets/screenshots/connections_transport_filters.png)
@@ -44,7 +46,7 @@ The screen names anything on the app's side that is blocking a scan, with the fi
| **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. |
| No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. |
Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.
The explanation lives in that card, not in the scan control: tapping **Scan for Bluetooth devices** after you have declined once asks Android again directly.
### Connection Status
@@ -52,7 +54,7 @@ Tapping **Scan** after you have declined the permission once explains what it is
|------|-------|-------------|
| 🟢 | Connected | Active radio link established |
| 🟡 | Connecting | Handshake in progress |
| 🔴 | Disconnected | No active connection; the app keeps trying to reconnect |
| 🔴 | Disconnected | No active connection. The app retries automatically, with a growing delay between attempts |
| ⚪ | Device sleeping | The radio is in light sleep — the app is waiting for it to wake and reconnect, not failing |
These are the four states the app models. "Device sleeping" is normal on power-saving configurations and needs no action.
@@ -67,9 +69,12 @@ If no devices are found, the app shows an empty state with instructions:
### Troubleshooting Bluetooth
- **Device not found:** Toggle Bluetooth off/on, ensure location is enabled.
- **Radio not found:** Turn Bluetooth off and back on. On Android 11 and older, also check that system location services are switched on — those releases do not return scan results without them.
- **Bluetooth scan couldn't start:** Try again, and toggle Bluetooth off and on if it repeats.
- **Connection drops:** Move closer to the radio; check for interference.
- **Pairing failed, or pairing did not complete:** Check that the **Nearby devices** permission is granted, then pair again.
- **Pairing rejected:** Forget the device in Android Bluetooth settings and retry.
- **Could not establish a stable connection after repeated attempts:** The app stopped retrying after three failed handshakes — a radio that keeps failing here is usually crashing on reconnect. Power-cycle the radio, then tap it again on the **Connect** tab to start a fresh attempt.
## USB Serial
@@ -77,32 +82,31 @@ USB connections provide a wired alternative, useful for desktop or when Bluetoot
### Setup
1. Connect your radio to your phone with a USB cable.
1. Connect your radio to your phone with a USB data cable. Charge-only cables carry no data lines, and a radio on one never appears in the list.
2. The app prompts for USB permission — tap **Allow**.
3. The connection is established automatically.
> ️ **Note:** USB connections require OTG support on Android devices.
### Troubleshooting USB
- **USB permission denied:** Unplug the radio and plug it back in — Android asks again on reconnect.
- **No radio in the list:** Check that the cable carries data rather than only power, and that the phone supports OTG.
## TCP/IP (Network)
Some Meshtastic radios support Wi-Fi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio's own Wi-Fi settings (via the firmware web interface or another connection) — then connect to it from the app.
> ️ **Note:** **Settings → Wi-Fi Provisioning for mPWRD-OS** is a separate, narrower tool. It provisions Wi-Fi
> credentials over Bluetooth to **mPWRD-OS** devices only, using their own protocol — it does not
> configure Wi-Fi on an ordinary Meshtastic radio. It scans over BLE, lists the networks the device
> can see (including an option for a hidden SSID), takes the password, and reports success or
> failure. Available on both Android and Desktop.
Some Meshtastic radios support Wi-Fi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first. Connect to it over Bluetooth or USB, open **Settings → Device configuration → Network**, and under **Wi-Fi Options** turn on **Wi-Fi enabled** and enter the **SSID** and **Password**. The Network screen appears only for radios whose hardware supports Wi-Fi or Ethernet. Once the radio has an address, come back and connect to it over the network.
### Connecting over the Network
1. Make sure the radio is on the same local network as your phone/desktop.
2. On the Connect screen, select **Network** in the transport selector.
2. On the **Connect** tab, select **Network** in the transport selector.
3. Choose the radio one of two ways:
- **Scan for network devices** — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / `_meshtastic._tcp`). Discovered devices appear in the list; tap one to connect.
- **Add device manually…** — enter the radio's IP address (or hostname) and port (default: `4403`).
4. Previously-used network addresses are remembered under **Recent Network Devices** for quick reconnection (touch & hold to remove one).
> 💡 **Tip:** Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.
Network discovery uses mDNS, which only works when both your phone and the radio are on the same subnet. If the phone is not on Wi-Fi at all, the app warns that a network scan may find nothing. On Android 17 and newer, the app needs the **Local network permission** to reach a radio on your own Wi-Fi at all — not only to discover it — so typing the address by hand does not work around a denied permission. Grant it from the card on the Network pane, or from the **Permissions** section of **Settings**. A radio on a public address, or one reached over a VPN, needs no permission.
### When to Use TCP
@@ -110,11 +114,31 @@ Some Meshtastic radios support Wi-Fi/Ethernet connectivity, allowing TCP-based c
- Testing with a simulated radio
- Environments where Bluetooth has interference issues
### Wi-Fi Provisioning for mPWRD-OS
**Settings → Wi-Fi Provisioning for mPWRD-OS** is a separate, narrower tool. It sends Wi-Fi credentials over Bluetooth to **mPWRD-OS** devices only, using their own protocol — it does not configure Wi-Fi on an ordinary Meshtastic radio. It is available on both Android and desktop.
1. Open the screen and wait while the app finds the device over Bluetooth.
2. Tap **Scan for Networks**, then pick a network from **Available Networks** — or turn on **Hidden network** and type the name into **Network Name (SSID)**.
3. Enter the **Password** and tap **Apply**.
If the scan reports **No networks found** or fails outright, move the phone closer to the device and scan again. If **Failed to apply Wi-Fi configuration** comes back, check the password and try again.
## After Your First Connection
Being connected is not the same as being able to transmit.
A radio leaves the factory with no LoRa region set, and it does not transmit until you set one. When you connect such a radio, the **Connect** tab shows a **Set your region** card; tap it to open the LoRa screen and choose the region you are in.
Once the region is set, the tab warns you if the radio is receive-only: a **Transmit is disabled** card, reading "This device can receive but will not send anything over LoRa." Tap it to open the same screen and turn **Transmit Enabled** back on. Only one of the two cards appears at a time — an unset region already stops the radio transmitting, so the app names that first and holds the transmit card back until you have set a region.
For more information, see [Settings — Radio & User](settings-radio-user#lora-config).
## Reconnection Behavior
The app reconnects to the last selected radio on startup. You can switch transports from the Connect screen at any time.
The app reconnects to the last selected radio on startup. You can switch transports from the **Connect** tab at any time.
To disconnect, tap the disconnect button on the Connect screen:
To disconnect, tap the disconnect button on the **Connect** tab:
![Disconnect from radio](../../assets/screenshots/connections_disconnect.png)
@@ -130,6 +154,8 @@ See [Desktop App](desktop) for platform-specific details and keyboard shortcuts.
## Related Topics
- [Getting Started](onboarding) — first-launch setup and permissions
- [Settings — Radio & User](settings-radio-user) — Bluetooth and network configuration
- [Settings — Radio & User](settings-radio-user) — Bluetooth, region, and network configuration
- [Messages & Channels](messages-and-channels) — send your first message once the radio is connected
- [Nodes](nodes) — see who else is on your mesh
- [Desktop App](desktop) — desktop-specific connection details
- [Supported devices](https://meshtastic.org/docs/hardware/devices) — full list of compatible radios on meshtastic.org
+3 -3
View File
@@ -2,7 +2,7 @@
title: Debug Logs
parent: User Guide
nav_order: 22
last_updated: 2026-08-29
last_updated: 2026-08-30
description: View and export the app's own debug logs from inside the app, and attach a capture to a GitHub issue to help diagnose bugs — no adb required.
aliases:
- debug-logs
@@ -40,11 +40,11 @@ Error and warning lines are tinted so problems stand out.
## Exporting
Tap the **download** icon to save the current logs to a file. You choose where it goes through the system file picker, and the file is named with a timestamp (for example `meshtastic_logcat_20260701_143312.txt`) so repeated exports never overwrite each other.
Tap the **download** icon to save the current logs to a file. The app first shows a warning about what the file contains — confirm it, then choose where the file goes through the system file picker. The file is named with a timestamp (for example `meshtastic_logcat_20260701_143312.txt`) so repeated exports never overwrite each other. The same warning guards the **Packets** tab export.
Attach that file to your GitHub issue.
> 🔒 **Privacy:** Exports automatically **redact** private keys, admin keys, session passkeys and channel PSKs before writing the file. Logs can still contain node names, positions, and other identifying details — glance through the file before sharing it publicly, and share privately if you have any doubt.
> 🔒 **Privacy:** Exports automatically **redact** private keys, admin keys, session passkeys, and channel PSKs, and suppress raw packet bytes. Everything else stays — the file can contain your message text, precise locations, and node details. Read it before sharing it publicly, and share privately if you have any doubt.
## Desktop
+15 -10
View File
@@ -2,7 +2,7 @@
title: Desktop App
parent: User Guide
nav_order: 14
last_updated: 2026-08-29
last_updated: 2026-08-30
description: Install and use the Meshtastic Desktop app on Linux, macOS, and Windows — connections, feature parity, and keyboard shortcuts.
aliases:
- desktop
@@ -20,7 +20,8 @@ This page covers installing the Meshtastic desktop app, connecting a radio, and
### Linux
- Download the `.deb` or `.AppImage` package from the [releases page](https://github.com/meshtastic/Meshtastic-Android/releases)
- Download the `.deb`, `.rpm`, or `.AppImage` package from the [releases page](https://github.com/meshtastic/Meshtastic-Android/releases)
- Or install from Flathub: `flatpak install flathub org.meshtastic.MeshtasticDesktop`
- Or build from source using `./gradlew :desktopApp:run`
### macOS
@@ -30,7 +31,7 @@ This page covers installing the Meshtastic desktop app, connecting a radio, and
### Windows
- Download the `.msi` installer from the [releases page](https://github.com/meshtastic/Meshtastic-Android/releases)
- Download the `.msi` or `.exe` installer from the [releases page](https://github.com/meshtastic/Meshtastic-Android/releases)
- Or build from source
## Connecting Your Radio
@@ -66,7 +67,7 @@ Bluetooth Low Energy is supported on desktop via the [Kable](https://github.com/
| Site Planner | ✓ | ✓* | *Opens in your browser on desktop; the estimate is not drawn on the desktop map |
| Settings | ✓ | ✓ | Full parity |
| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop |
| Firmware Update | ✓ | ✓ | In-app USB, BLE, and Wi-Fi (ESP32) update all work the same as Android |
| Firmware Update | ✓ | ✓ | In-app USB, BLE, and Wi-Fi (ESP32) update work the same as Android. The USB maintenance flow — nRF52/RP2040 factory erase and bootloader upgrade — is Android-only |
| Notifications | ✓ | ✓ | Native OS notifications |
| Widgets | ✓ | ✗ | Android-only |
| AI Assistant (Chirpy) | ✓* | ✗ | Google flavor Android only |
@@ -97,13 +98,13 @@ Shortcuts use **⌘** (Command) on macOS and **Ctrl** on Windows and Linux. (The
### Window & System Tray
- **Window resizing** — responsive layout adapts to window dimensions
- **System tray** — minimize to system tray for background mesh operation
- **System tray** — closing the window minimizes to the system tray for background mesh operation. On a desktop environment with no tray, there is nowhere to minimize to, so closing quits the app instead
- **Tray menu** — right-click the tray icon to show window or quit
- **Mouse interaction** — hover states and standard desktop navigation
### Notification Preferences
The desktop app provides in-app toggles for controlling which notifications are shown — messages, new nodes, and low battery alerts. Access these from **Settings → Notifications** within the app.
The desktop app provides in-app toggles for controlling which notifications are shown. Find them in the **App Notifications** section of the Settings screen: **Direct message notifications**, **New node notifications**, and **Low battery notifications**.
## Built-in Documentation Browser
@@ -136,9 +137,12 @@ Requirements:
- Offline tile downloads and local `.mbtiles` archives are not available on desktop.
- `.kml`/`.kmz`/GeoJSON layer import works — see
[Map & Waypoints](map-and-waypoints#map-layers). Site Planner opens in your browser
rather than in the app; to bring its coverage estimate onto the map, use the planner's
**Export GeoJSON** and add the file as a layer. Custom network tile sources work too — see
[Map & Waypoints](map-and-waypoints#adding-your-own-tile-source)
rather than in the app; to bring its coverage estimate onto the map, click the transmitter pin
in the browser and use the planner's GeoJSON export, then add the file as a layer — not the KML
export, which is a ground-overlay image this map cannot draw. Custom network tile sources work
too — see [Map & Waypoints](map-and-waypoints#adding-your-own-tile-source)
- The USB maintenance flow — nRF52/RP2040 factory erase and bootloader upgrade — is Android-only. The
desktop app still shows the option, but it cannot complete there
- Some Android-specific features (widgets, specific notification channels) are unavailable
- Performance may vary on low-spec hardware running Compose Desktop
- BLE bonding is not yet supported on desktop (pairing works without bonding)
@@ -146,4 +150,5 @@ Requirements:
## Related Topics
- [Connections](connections) — connection methods overview
- [Firmware Updates](firmware) — USB, BLE, and Wi-Fi update all work the same as on Android
- [Firmware Updates](firmware) — in-app USB, BLE, and Wi-Fi update all work the same as on Android
- [Map & Waypoints](map-and-waypoints) — base maps, layers, custom tile sources, and what the desktop map does not do
+44 -24
View File
@@ -2,7 +2,7 @@
title: Local Mesh Discovery
parent: User Guide
nav_order: 12
last_updated: 2026-08-29
last_updated: 2026-08-30
description: Explore your mesh network — the Local Mesh Discovery scanner, traceroute paths, neighbor maps, and node discovery tools.
aliases:
- discovery
@@ -27,9 +27,9 @@ The app offers two complementary approaches:
Local Mesh Discovery is a dedicated scanning mode that helps you find the best LoRa modem preset for your location and see which nodes are active on each preset. It cycles your connected radio through one or more presets you choose, dwells on each one — listens for a set time — to collect packets, then analyzes and ranks the results.
Open it from **Settings → Advanced → Local Mesh Discovery**. On desktop, it has its own **Settings → Local Mesh Discovery** entry.
Connect your radio, then open **Settings → Advanced → Local Mesh Discovery**. On Android the **Advanced** section stays grayed out until a radio is connected and the app has finished reading its configuration, and every entry in it is disabled on a managed device. On desktop, Local Mesh Discovery has its own entry on the Settings screen, with no such gate.
> ️ **Note:** Discovery temporarily changes your radio's LoRa settings while it scans, then restores your original configuration when it finishes. Your radio must be connected to run a scan.
> ️ **Note:** Discovery temporarily changes your radio's LoRa settings while it scans, then restores your original configuration when it finishes.
### Setting Up a Scan
@@ -39,9 +39,9 @@ Before starting, configure these controls:
|---------|-------------|
| **LoRa preset picker** | Select one or more presets to scan. Discovery dwells on each selected preset in turn. |
| **Dwell time** | Time to listen on each preset. Choose from 1, 5, 15, 30, 45, 60, 90, 120, or 180 minutes. Longer dwell times collect more packets and give a clearer picture, but take longer. |
| **Keep screen awake** | Optional toggle that prevents the screen from sleeping during a long scan. |
| **Keep screen awake** | Keeps the phone out of Android Doze mode, which would otherwise drop radio packets during a long scan. Recommended — a scan run with it off can under-count what the radio heard. |
The **Start** button stays disabled — with an explanation of why — until the scan can run. Common reasons it's disabled:
The **Start Scan** button stays disabled — with an explanation of why — until the scan can run. Common reasons it's disabled:
- The radio is **not connected**.
- **No presets** have been selected to scan.
@@ -53,15 +53,19 @@ While a scan runs, Discovery shows its current stage:
| Stage | What's happening |
|-------|------------------|
| **Preparing** | Saving your current configuration and getting ready to scan. |
| **Preparing scan** | Saving your current configuration and getting ready to scan. |
| **Shifting to \<preset\>** | Switching the radio to the next preset to test. |
| **Reconnecting** | Re-establishing the connection after the preset change. |
| **Dwell** | Listening on the current preset to collect packets, with a countdown to the next step. |
| **Analysis** | Processing the collected packets and ranking the presets. |
| **Restoring** | Putting your original LoRa configuration back. |
| **Reconnecting on \<preset\>** | Re-establishing the connection after the preset change. |
| **Dwelling on \<preset\>** | Listening on the current preset to collect packets, with a countdown to the next step. |
| **Analyzing results** | Processing the collected packets and ranking the presets. |
| **Restoring home preset** | Putting your original LoRa configuration back. |
| **Cancelling scan** | You tapped **Stop Scan**; partial results are saved before the original preset is restored. |
| **Scan failed: \<reason\>** | The scan could not continue — most often the radio did not come back within a minute of a preset change. The results collected so far are saved, and the original preset is restored automatically. |
![Dwell countdown showing time remaining on the current preset](../../assets/screenshots/discovery_dwell_progress.png)
If a scan is interrupted — the app is closed, or the radio goes away — the app restores your original preset the next time it reconnects to that radio, and tells you it has done so. Reconnect the same radio to let that happen; until you do, the radio stays on whichever preset the scan left it on.
### Reading the Results
When the scan completes, Discovery presents a per-preset result card for each preset it tested, plus an overall summary.
@@ -90,10 +94,16 @@ Additional features available from the results:
Mesh Beacon lets nodes invite others to join their mesh. A beaconing node periodically broadcasts an invitation — optionally advertising a channel, region, and modem preset — that nearby nodes can hear even before they share a configuration.
Configure it under **Settings → Module Config → Mesh Beacon**:
Configure it under **Settings → Module configuration → Mesh Beacon**. The entry appears only on radios running firmware 2.8.0 or newer. A read-only **Region** row at the top of the screen shows the region the beacon advertises: that region, and the preset, are always the ones the radio itself uses, so a beacon cannot invite anyone onto settings your radio is not running.
- **Listen for beacons** — receive invitations broadcast by other nodes.
- **Broadcast beacon** — send your own invitation at a set interval, with an optional message and an offered channel.
- **Broadcast a beacon** — periodically advertise this mesh to nearby nodes, with an optional **Beacon message** of up to 100 bytes, a **Broadcast interval** picked from fixed intervals between 1 hour and 72 hours, and an **Offered channel** chosen from your radio's own channels. The offered channel is required, and defaults to your primary channel.
- **Broadcast targets** — optional extra destinations beyond the offered channel. **Add target** appends a row; each row picks a **Channel** and a **Transmit preset**, and **Remove target** deletes it. With no targets, the beacon goes out on the offered channel alone.
Two conditions block beacon setup:
- **The radio has no region set.** The screen shows nothing but *Set your radio's region before setting up a beacon.* Set the region on **Settings → LoRa** first.
- **The radio uses custom LoRa settings.** A beacon advertises a modem preset for others to join, so a radio with **Use Preset** turned off has no standard preset to offer. In that state **Broadcast a beacon** can be turned off but not on, and the broadcast settings are read-only. Listening for beacons is unaffected.
Received invitations appear as **Mesh invitations** cards on the Discovery screen. Each card shows the sender's message plus the offered channel, region, preset, and signal quality, with these actions:
@@ -103,6 +113,8 @@ Received invitations appear as **Mesh invitations** cards on the Discovery scree
Channels advertised by beacons also show up in the scan setup as **Beacon channels** — select one to include it as a scan target.
An invitation to a mesh your radio is already on is suppressed: no card, no notification, and no **Beacon channels** entry. A channel counts as one you already have only when both its name and its key match a channel on your radio — the same name with a different key is a different mesh, so that invitation still reaches you.
## Manual Exploration
The following tools are available at any time from the node list and node detail screens. Use them to investigate specific paths and build a topology picture, alongside or instead of a full scan.
@@ -114,22 +126,28 @@ Traceroute reveals the exact path a message takes from your node to any other no
#### Running a Traceroute
1. Navigate to **Nodes** and tap the node you want to trace.
2. On the node detail screen, tap **Traceroute**. The app sends the request; results show each hop with signal quality.
2. On the node detail screen, find **Traceroute** in the **Telemetry** section and tap its request button. Once a result arrives, a second button on the same row opens the traceroute log, where each hop is listed with its signal quality.
#### Reading the Results
A traceroute result looks like this:
```
You → Node A (SNR: 8.5, RSSI: -95) → Node B (SNR: 5.2, RSSI: -108) → Target
```text
Route traced toward destination:
■ Your Node (YOUR)
⇊ 8.5 dB
■ Relay Node (RLAY)
⇊ -8.75 dB
■ Target Node (TGT1)
```
Each hop represents a relay node that forwarded the message. The SNR and RSSI values at each hop tell you about the link quality on that specific segment.
Each `⇊` line between two nodes is one relay hop, and the SNR on that line is the quality of that segment alone. The app colors it green at or above 7 dB, yellow at or above 15 dB, and orange below that. A request that also gets a reply adds a second block under **Route traced back to us:**.
| What to look for | What it means |
|------------------|---------------|
| All hops show Good SNR (≥ 7 dB, green) | Healthy path — messages flow reliably |
| One hop shows Bad SNR (< 15 dB, red) | Weak link — this relay segment is fragile |
| One hop shows a poor SNR (below 15 dB, orange) | Weak link — this relay segment is fragile |
| Many hops (4+) | Long path — consider repositioning a node to shorten it |
| Different path on retry | Mesh is adapting — multiple routes exist (this is good!) |
@@ -137,8 +155,9 @@ Each hop represents a relay node that forwarded the message. The SNR and RSSI va
#### Troubleshooting with Traceroute
- **"No route found"** — The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key.
- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa Config**.
- **No Response** — The traceroute got nothing back. The target node may be offline, out of range, or on a different channel. Check that both nodes share at least one channel with the same encryption key.
- **Traceroute times out** — The path may be too long (exceeds hop limit) or a relay node is congested. Try increasing the hop limit in **Settings → LoRa**.
- **Cannot show traceroute map because the start or destination node has no position information** — The path was traced, but one end has never shared a position.
- **Asymmetric paths** — A traceroute from A→B may take a different path than B→A. This is normal — radio propagation is not always symmetric.
### Neighbor Info
@@ -147,19 +166,20 @@ The Neighbor Info module lets each node broadcast a list of the nodes it can **d
#### Enabling Neighbor Info
1. Navigate to **Settings → Module Config → Neighbor Info**.
1. Navigate to **Settings → Module configuration → Neighbor Info**.
2. Enable the module.
3. Set the broadcast interval (default: 900 seconds / 15 minutes).
3. Set **Update interval (seconds)**. The default is 21600 seconds (6 hours), and the firmware minimum is 14400 seconds (4 hours) — a smaller value is rejected and reset to the default.
4. Turn on **Transmit over LoRa**. Without it, your neighbor list goes only to MQTT and to this app, never over the air. It is unavailable on a channel that still uses the default name and key, so set up your own channel first — see [Messages & Channels](messages-and-channels).
Once enabled, your node periodically broadcasts its neighbor list. Other nodes with Neighbor Info enabled do the same.
Once enabled and transmitting over LoRa, your node periodically broadcasts its neighbor list. Other nodes with Neighbor Info enabled do the same.
#### Viewing Neighbor Data
- Open any node's detail screen and look for the **Neighbors** section.
- Open a node's detail screen and find **Neighbor Info** in the **Telemetry** section. The request button asks the node for its current neighbor list; once the app has received one, a second button on the same row opens the log of everything that node has reported. The row appears only on nodes that can answer a neighbor request, or that have already reported neighbors.
- Each neighbor entry shows the node that was directly heard and its signal quality.
- Combine neighbor data from multiple nodes to understand the full mesh topology.
> ️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. On busy meshes with many nodes, consider longer broadcast intervals (3600 seconds or more) to avoid congestion.
> ️ **Note:** Neighbor Info increases airtime usage because every enabled node periodically broadcasts its neighbor list. The firmware does not accept an interval shorter than 14400 seconds (4 hours) for this reason; on busy meshes, leave it at the 21600-second default or raise it further.
### Node List as a Discovery Tool
+11 -7
View File
@@ -2,7 +2,7 @@
title: Firmware Updates
parent: User Guide
nav_order: 13
last_updated: 2026-08-29
last_updated: 2026-08-30
description: Update your radio firmware over Bluetooth or USB — OTA process, version channels, pre-flight checks, and recovery.
aliases:
- firmware
@@ -32,7 +32,7 @@ The most common update method for Android users:
1. Ensure your radio is connected via Bluetooth.
2. Navigate to the Firmware Update screen.
3. Select the desired firmware version.
4. Tap **Update** to begin the OTA process.
4. Tap **Update**. An **Update Warning** dialog lists the pre-flight checks — read it, then tap **I know what I'm doing.** to start. This dialog appears for every update method, including Wi-Fi OTA, USB, and a local firmware file.
5. Wait for the update to complete — **do not disconnect** during the update.
![Firmware checking for updates](../../assets/screenshots/firmware_checking.png)
@@ -58,8 +58,6 @@ When an ESP32 radio is connected over the network rather than Bluetooth, the app
Wi-Fi OTA takes the ESP32 `-update.bin` image rather than the `.uf2` a USB update uses; the app selects the right artifact for you.
![Firmware disclaimer](../../assets/screenshots/firmware_disclaimer.png)
### In-App USB Update
When your radio is connected over **USB/serial** (rather than Bluetooth), the Firmware Update screen offers **USB File Transfer**. The app reboots the device into DFU mode, then prompts you to save the `.uf2` file to the device's DFU drive using the system file picker. This option appears only on a USB/serial connection — it is not available over Bluetooth.
@@ -68,9 +66,11 @@ When your radio is connected over **USB/serial** (rather than Bluetooth), the Fi
### Factory Erase and Bootloader Upgrade
On a **USB/serial** connection, nRF52 and RP2040 devices also offer **Erase and reinstall** and, where an upgraded bootloader is published for the board, **Upgrade bootloader**.
On a **USB/serial** connection, nRF52 and RP2040 devices can be wiped as part of an update — that is the **Erase device during update** opt-in described earlier on this page. nRF52 devices additionally offer **Upgrade bootloader** where an upgraded bootloader is published for the board; RP2040 devices run no Adafruit bootloader, so they never see it.
Erasing wipes everything on the device — channels, keys and all settings — and there is no backup, so the app asks for confirmation first. Both operations write two files in turn, so you will be asked to select the device's update drive twice: once for the erase or bootloader image, then again for the firmware.
Select a firmware version before either one: the app hides both until a release is chosen, because the firmware is reinstalled after the device is wiped or the new bootloader is written.
Both a USB erase and a bootloader upgrade write two files in turn, so you are asked to select the device's update drive twice: once for the erase or bootloader image, then again for the firmware.
The app reads `INFO_UF2.TXT` from the drive you select to confirm it really is the device's update drive and to identify the board before writing anything. If it can't confirm which Bluetooth stack your device uses, it refuses to erase and points you at the [Web Flasher](https://flasher.meshtastic.org) instead. In the Web Flasher, choosing the wrong Bluetooth stack can leave the radio recoverable only with a hardware programmer.
@@ -120,11 +120,15 @@ If the update appears frozen:
- If it is still stuck after that, power-cycle the radio.
- Attempt the update again.
The message **Verification timed out. Device did not reconnect in time.** means the image was written but the radio did not come back within that window — power-cycle it and check the version under **Currently Installed** before re-running the update.
![Firmware update error](../../assets/screenshots/firmware_error.png)
### Radio Won't Boot After Update
If your radio fails to boot:
If the app told you the Bluetooth update could not be finished, follow the instruction it gave: connect the radio to a computer over USB and re-flash it with the vendor's serial DFU tool, such as `adafruit-nrfutil`. A stock nRF bootloader cannot reliably complete an interrupted over-the-air update.
Otherwise, if your radio fails to boot:
1. Try connecting via USB to a computer
2. Use the web flasher in recovery/DFU mode
3. Flash a known-good firmware version
+2 -2
View File
@@ -2,7 +2,7 @@
title: Help & In-App Docs
parent: User Guide
nav_order: 21
last_updated: 2026-08-29
last_updated: 2026-08-30
description: Browse this documentation inside the app, search it, and ask Chirpy — the on-device AI assistant — questions about Meshtastic.
aliases:
- help
@@ -23,7 +23,7 @@ The docs browser lists every user-guide page. Tap a page to read it; images and
### Search
Tap the search icon and type to filter pages by title and keywords — results update as you type.
The search box sits at the top of the docs browser. Type in it to filter pages by title and keywords — results update as you type, and the **Clear search** button (✕) empties the box.
![Searching the in-app documentation](../../assets/screenshots/docs-browser_search.png)
+36 -22
View File
@@ -2,7 +2,7 @@
title: Map & Waypoints
parent: User Guide
nav_order: 6
last_updated: 2026-08-29
last_updated: 2026-08-30
description: View node positions on the map, create and share waypoints, manage map layers and Site Planner, and control position sharing and privacy.
aliases:
- map
@@ -37,22 +37,30 @@ Each node that reports a position is shown as a **node chip** marker displaying
- **Center** — tap the location button to center on your position
- **Node tap** — tap a node marker to view details
The floating toolbar provides quick access to compass, layer switching, node filters, refresh, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position.
The floating toolbar provides quick access to the compass, the map type and layers pickers, node filters, Site Planner, and location tracking. Tap the compass to reorient north-up, or tap the location button to center on your current position. On **Google Play** builds a refresh button joins them while a network layer is showing; on **F-Droid** and **Desktop**, refresh a network layer from its own row in the layers sheet instead.
![Map screen with the floating toolbar open, showing compass, layers, and location controls](../../assets/screenshots/map_controls_overlay.png)
![Map floating toolbar with compass, filter, refresh, and location controls](../../assets/screenshots/map_controls_overlay.png)
### Filtering the Map
Tap the filter button in the floating toolbar to open **Filter map**. **Display** controls what is drawn: **Only Favorites**, **Show Waypoints**, **Show Precision Circles**, and a slider that hides nodes not heard from recently. **Node roles** is a chip per device role, plus **All** to show every role; a selected chip means that role is shown. **Nodes** narrows the set further with **Hide offline nodes**, **Only show direct nodes**, **Exclude MQTT**, **Show ignored nodes**, and **Include unknown**.
A dot on the filter button means at least one filter is hiding something — check it before concluding the mesh is quiet. Turning **Show Waypoints** off hides every waypoint, including your own. **Show ignored nodes** adds them to the map rather than showing only them — unlike the node list's **Only show ignored Nodes**.
## Waypoints
Waypoints are shared points of interest, visible to everyone the waypoint is sent to.
Waypoints are shared points of interest, visible to everyone on your mesh.
### Creating a Waypoint
Your radio must be connected — the map ignores a touch & hold while it is not, because saving a waypoint means broadcasting it.
1. Touch & hold the map at the desired location.
2. Enter a name and optional description.
3. Choose an icon/emoji for the waypoint.
4. Tap **Send** to share with the mesh.
Waypoints are addressed like messages: by default they broadcast on the primary channel, but a waypoint can also be sent on a specific channel or as a direct message to a single node.
Waypoints always broadcast to the whole mesh on the primary channel. Unlike a message, a waypoint cannot be addressed to one channel or sent as a direct message.
### Waypoint Properties
@@ -81,37 +89,40 @@ Any waypoint can also define a **geofence** — an alert area — so you or othe
2. Once a region is set, toggle **Notify on enter** and/or **Notify on exit**.
3. Optionally enable **Favorites only** to limit alerts to your favorited nodes.
Since waypoints (and their geofences) are broadcast to the whole mesh, only the **creator** is alerted by default. If someone else shares a geofenced waypoint with you, its detail view offers a **"Notify me of crossings"** opt-in so you can also receive enter/exit alerts for it.
Since waypoints (and their geofences) are broadcast to the whole mesh, only the **creator** is alerted by default. If someone else shares a geofenced waypoint with you, its detail view offers a **Notify me of crossings** opt-in so you can also receive enter/exit alerts for it.
### Managing Waypoints
- Tap a waypoint on the map to view its details and coordinates
- Edit or delete waypoints you created
- **Locked waypoints** cannot be modified or deleted by other mesh members — only the creator can change them
- Unlocked waypoints can be edited by any mesh member
- Tap a waypoint to see its name, description, and geofence radius. On **Google Play** builds the first tap opens the marker's info bubble — tap the bubble to open the waypoint itself
- **Locked waypoints** can only be changed on the mesh by the node that locked them
- Unlocked waypoints can be edited by any mesh member while connected to a radio — saving re-broadcasts the waypoint
- Confirming a delete removes your own copy. To remove it from everyone else's map too, select **Delete for everyone** in the delete dialog; that box appears only for a waypoint you may change (unlocked, or locked by you) and only while you are connected
## Map Layers
Tap the layers icon on the map to open **Manage Map Layers**. It imports your own overlays in `.kml`, `.kmz`, or GeoJSON format — including KMZ ground overlays (georeferenced images, such as exported topo or aerial tiles), which drape at their stated bounds. Add one by picking a file with **Add Layer**, opening a file with Meshtastic, or sharing it into the app from another app. Imported layers are listed with a toggle to show/hide each one and an option to remove it. This works on the Google Play build, the F-Droid build, and **Desktop**, which shares the same layer store and file picker.
Tap the layers icon on the map to open **Manage Map Layers**. It imports your own overlays in `.kml`, `.kmz`, or GeoJSON format — including KMZ ground overlays (georeferenced images, such as exported topo or aerial tiles), which drape at their stated bounds. Add one by picking a file with **Add Layer**, opening a file with Meshtastic, or sharing it into the app from another app. **Add Network Layer** instead takes a name and an `http://` or `https://` URL pointing at a KML or GeoJSON file; that layer then carries its own refresh button in the sheet. On **Google Play** builds the toolbar's refresh button re-fetches every visible network layer at once.
Imported layers are listed with a toggle to show/hide each one and an option to remove it. Each layer — imported or built-in overlay — carries its own opacity slider while it is switched on, so an overlay can be faded back rather than only switched off. This works on the Google Play build, the F-Droid build, and **Desktop**, which shares the same layer store and file picker.
### Site Planner
**Site Planner** estimates RF coverage for a transmitter and draws it on the map as a color-coded overlay. Open it from a map control, or from a node's detail page via **Estimate coverage** (shown only for nodes with a known position). Configure the transmitter (location, frequency, TX power, antenna gain and height), the receiver (sensitivity, height), and simulation options (max range, high-resolution terrain, color palette), then run the estimate. Like map layers, Site Planner works on both the Google Play and F-Droid builds, where the finished estimate is drawn on the map as a coverage overlay. On **Desktop** the same form is shown but the planner opens in your browser; to bring the estimate onto the map, use the planner's **Export GeoJSON** and add the downloaded file under **Manage Map Layers**.
**Site Planner** estimates RF coverage for a transmitter and draws it on the map as a color-coded overlay. Open it from a map control, or from a node's detail page via **Estimate coverage** (shown only for nodes with a known position). Configure the transmitter (location, frequency, TX power, antenna gain and height), the receiver (sensitivity, height), and simulation options (max range, high-resolution terrain, color palette), then run the estimate. Like map layers, Site Planner works on both the Google Play and F-Droid builds, where the finished estimate is drawn on the map as a coverage overlay. On **Desktop** the same form is shown but the planner opens in your browser; to bring the estimate onto the map, click the transmitter pin in the browser, choose the planner's GeoJSON export, then add the downloaded file under **Manage Map Layers** with **Add Layer**. Use the GeoJSON export, not the KML one — the KML is a ground-overlay image this map cannot draw.
## Position Sharing
### Enabling Position Sharing
Your node shares its GPS position based on:
- **Fixed interval** — broadcast position at regular intervals
- **Smart position** — broadcast when movement exceeds a threshold
- **Manual** — only share when explicitly requested
- **Broadcast Interval** — share the position on a fixed timer
- **Smart Position** — share only once you have moved far enough; **Smart Interval** sets the shortest gap between broadcasts and **Smart Distance** how far you must move
- **Fixed Position** — publish a latitude, longitude, and altitude you enter by hand instead of the GPS reading
- **GPS Mode (Physical Hardware)** — GPS enabled, disabled, or not present on this hardware; offered only while **Fixed Position** is off
Configure position behavior in **Settings → Position**.
Configure position behavior in **Settings → Device configuration → Position**. The screen is only reachable while your radio is connected, and saving it reboots the radio. For the full field list, see [Settings — Radio & User](settings-radio-user).
### Privacy Considerations
> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position.
> 🔒 **Privacy:** Position data is broadcast to all nodes on your channel. If you don't want your location shared, disable GPS position in settings or use a fixed/fake position. To keep sharing a position without pinpointing yourself, edit the channel in **Settings → Channels**, turn **Precise location** off, and set the slider beneath it — the channel then publishes an approximate area, shown as ± a distance, instead of an exact point.
## Map Sources
@@ -123,8 +134,8 @@ picker, all three offer the same raster base maps:
| --- | --- |
| Normal / Satellite / Terrain / Hybrid | Google Play only — Google's own map types |
| Liberty | Default on F-Droid and Desktop. Vector street map |
| Positron | Low-contrast vector map; keeps node markers legible over it |
| Dark | Vector map suited to dark themes |
| Positron | F-Droid and Desktop only. Low-contrast vector map; keeps node markers legible over it |
| Dark | F-Droid and Desktop only. Vector map suited to dark themes |
| OpenStreetMap | Classic raster street tiles |
| OpenTopoMap | Raster topographic |
| USGS Topo / USGS Imagery | US coverage only |
@@ -138,8 +149,8 @@ Overlays can be toggled on top of any base map, from the layers sheet:
### Adding your own tile source
Any XYZ tile endpoint can be added as a base map, on every flavor and on desktop. Open **Manage custom
tile sources** at the foot of the base map picker and paste a URL template using `{z}`, `{x}` and `{y}`
Any XYZ tile endpoint can be added as a base map, on every flavor and on desktop. Open **Manage Custom
Tile Sources** at the foot of the base map picker and paste a URL template using `{z}`, `{x}` and `{y}`
— plus `{s}` if the provider uses rotating subdomains. A national mapping service, for example:
```
@@ -150,7 +161,10 @@ Tiles are cached on disk, so panning does not re-download what you were just loo
On **Android**, the same screen also imports a local `.mbtiles` archive for fully offline use.
Offline area downloads are **F-Droid only**: cache the visible region from the layers sheet.
Offline area downloads are **F-Droid only**. Select a vector base map first — Liberty, Positron, or Dark —
since a download is defined against a vector style and **Start Download** stays disabled over a raster one.
Frame the area you want on screen, then tap **Start Download** in the layers sheet: that creates a paused
pack covering the current zoom plus two levels deeper. Press play on the pack's row to actually download it.
**Google Play** builds import pre-made MBTiles files instead, and **Desktop** has neither.
## Related Topics
+43 -31
View File
@@ -2,7 +2,7 @@
title: Messages & Channels
parent: User Guide
nav_order: 3
last_updated: 2026-08-29
last_updated: 2026-08-30
description: Send and receive messages, manage channels, configure encryption, search conversations, and use quick chat, reactions, and message actions.
aliases:
- channels
@@ -25,29 +25,38 @@ Every Meshtastic radio comes with a default **LongFast** channel. It is encrypte
### Channel Security
Channels support multiple encryption levels:
Each channel carries a lock icon that shows how well it is protected. Tap the icon to see the same explanation inside the app.
| Icon | Security Level | Description |
|------|----------------|-------------|
| 🔒 | PSK (256-bit AES) | Fully encrypted with a strong pre-shared key. Only nodes with the matching key can read messages. |
| 🔐 | PSK (128-bit AES) | Encrypted with a shorter key. Secure for most uses but 256-bit is preferred for sensitive data. |
| 🔓 | Default / Open | Uses the well-known default key. **Any Meshtastic device** on the same preset can read these messages. |
| ⚠️ | Insecure + Position | Open channel that also broadcasts your GPS position. Use with caution in public meshes. |
| Icon | What it means |
|------|---------------|
| Green closed lock | The channel is securely encrypted, with either a 128-bit or a 256-bit AES key. |
| Yellow open lock | The channel is not securely encrypted — it uses no key at all, or a well-known one-byte key — and it does not carry precise location. |
| Red open lock | Not securely encrypted, and the channel carries precise location data. |
| Red open lock with a warning badge | Not securely encrypted, carrying precise location data, and uplinking that data to the internet over MQTT. |
Key length alone does not change the icon: a 128-bit key and a 256-bit key both show the green lock.
> 🔒 **Security:** Always configure a unique PSK for private communications. The default channel is intentionally open so new users can discover the mesh — but you should create a separate encrypted channel for anything sensitive.
### Adding a Channel
1. Navigate to **Settings → Channels**.
2. Tap the **+** button to add a channel, or import one by scanning a channel QR code.
3. Configure the channel name and encryption key.
4. Share the channel URL/QR code with others who need access.
1. Connect to your radio. The **Channels** row stays grayed out until the app has a connection — see [Connections](connections).
2. Go to **Settings**, then tap **Channels** under **Configuration**.
3. Tap the **+** button to add a channel. The editor opens on the new entry.
4. Set the channel name and the **PSK**, and choose whether the channel uses MQTT uplink and downlink. Naming a new channel generates a fresh 256-bit key for you; the refresh icon beside **PSK** generates another one.
5. Tap **Save** to close the editor. The change is still only on your phone.
6. Tap **Send** at the bottom of the channel list to write the changes to the radio. **Cancel**, or leaving the screen without tapping **Send**, throws them away.
7. Optional: share the channel URL or QR code with the people who need access.
Tapping a channel shows its details and sharing options.
Tapping an existing channel opens the same editor, where you can change the name, the PSK, MQTT uplink and downlink, and position precision. Every edit on this screen — adding, editing, deleting, or dragging a channel into a new order — waits on **Send** the same way.
## Direct Messages
Direct messages (DMs) are point-to-point encrypted communications between two specific nodes.
Direct messages (DMs) go to one specific node. When both radios hold each other's public keys, your radio encrypts the message to that node's public key, so no one else on the mesh can read it — not even nodes that share your channel.
Your radio must already hold the other node's public key before it can send a DM. Keys travel inside node info, which nodes broadcast periodically, so the key usually arrives on its own once you have heard from that node. Until it does, a radio that has its own key pair — the default — refuses the send rather than falling back to channel encryption, and the message shows **Recipient key unavailable**.
A public-key conversation carries a key icon in its top bar. A green closed lock means the direct message is protected by public-key encryption; a red key-off icon means the node's public key changed and no longer matches the one your radio stored. Tap the icon for the details.
### Sending a Direct Message
@@ -100,7 +109,7 @@ When a message fails to deliver, the error indicator shows what went wrong:
| Error | Meaning | What to Do |
|-------|---------|------------|
| No Route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. |
| No route | No path exists to the destination node | The recipient may be offline or out of mesh range. Try later or move closer. |
| No radio interface | No radio interface available to send | Check that your radio is connected and available. |
| Failed to deliver to mesh | Retries exhausted. The same label covers three underlying causes — a relay refusing (NAK), a plain timeout, and running out of retransmits | Move closer, improve signal, or wait for conditions to improve. Tap the error for the specific cause. |
| Rate limited | The mesh is throttling you for sending too fast | Wait before sending again. |
@@ -116,21 +125,21 @@ When a message fails to deliver, the error indicator shows what went wrong:
| Duty cycle limit | Regional airtime limit reached | Wait for the duty cycle window to reset. |
| Invalid request | Malformed or invalid request | Retry after updating or restarting the app if this persists. |
> 💡 **Tip:** Most delivery errors resolve themselves. If a node is intermittently reachable, the mesh will retry. For persistent "No Route" errors, check that intermediate Router nodes are online.
> 💡 **Tip:** Most delivery errors resolve themselves. If a node is intermittently reachable, the mesh will retry. For persistent **No route** errors, check that intermediate Router nodes are online.
## Message Features
### Quick Chat
Pre-configured messages for rapid communication:
- Access via the Quick Chat button in the message input area
- Choose from built-in phrases or custom messages
- Customize quick chat messages in **Settings → Quick Chat**
- Useful when typing is impractical (gloves, small screen, urgent)
Pre-configured messages for rapid communication, useful when typing is impractical (gloves, small screen, urgent):
- The quick chat row is hidden until you turn it on. Open a conversation, tap the overflow menu in the top bar, then tap **Show quick chat menu**. **Hide quick chat menu** puts the row away again.
- The row carries one built-in entry, the 🔔 alert bell. It appends an alert message that includes a bell character, which clients that support it flag as an alert. Every other button on the row is one you created.
- Add, edit, reorder, and delete your own entries from the same overflow menu — tap **Quick chat options**.
![Quick chat option](../../assets/screenshots/messages_quick_chat.png)
Each quick chat entry has a short **Name** (the button label), the **Message** it inserts, and an **Instantly send** toggle — when enabled, tapping the button sends the message immediately instead of placing it in the input field for editing:
Each quick chat entry has a **Name** the button label, capped at five characters, forced to uppercase, and filled in for you from the message text — and the **Message** it carries. A switch decides what tapping the button does. A new entry starts on **Instantly send**, so a tap sends the message straight away; turn the switch off and the label changes to **Append to message**, which puts the text in the input field for you to edit first.
![New quick chat dialog with name, message, and instantly-send toggle](../../assets/screenshots/messages_edit_quick_chat.png)
@@ -175,7 +184,7 @@ Type `@` while composing to mention a node — a picker suggests matching contac
React to messages with emoji:
- **Touch & hold** a message — or double-tap it — to raise a quick reaction bar above the bubble. Opening the bar sends nothing.
- Tap an emoji in the bar to send it; tap **more** to open the full picker, or anywhere outside
- Tap an emoji in the bar to send it; tap **More reactions** to open the full picker, or anywhere outside
the bar to dismiss it without sending. A reaction is a real mesh packet, so it only goes out
when you pick an emoji.
- Reactions appear below the message bubble
@@ -190,7 +199,7 @@ React to messages with emoji:
**Swipe a message to the right** to reply to it — the composer opens with that message quoted.
Swiping past the reply threshold arms the action; releasing before it springs back with nothing sent.
Reply is also in the actions menu, reached by touching & holding and then tapping **More**.
Reply is also in the actions sheet, reached by touching & holding and then tapping **More message actions**.
### Day Separators
@@ -206,13 +215,16 @@ messages. That count is messages, not people — five unread from one person rea
### Message Actions
Touch & hold or double-tap a message to open the quick reaction bar, then tap **More** (the
overflow icon on that bar) to reach:
- **Copy** — copy message text to clipboard
Touch & hold or double-tap a message to open the quick reaction bar, then tap **More message actions**
(the overflow icon on that bar) to open the actions sheet. The emoji row runs across the top of the
sheet — that is where reactions live — and beneath it, along with the message's timestamp and
delivery status, are:
- **Reply** — quote the message in your response
- **React** — add an emoji reaction
- **Translate** — translate a received message into your device language and toggle between the original and translated text (Google Play build only; uses on-device translation)
- **Delete** — remove a message you sent (local deletion)
- **Copy** — copy the message text to the clipboard
- **Translate** — translate a received message into your device language, and toggle between the original and translated text (Google Play build only; uses on-device translation). The first translation into a language asks to download a one-time language model and tells you its size, then translates once the download finishes. If the download fails, or the message is already in your language, the app says so instead of translating
- **Select** — start multi-select, so you can act on several messages at once
- **Delete** — remove the message from this phone. It works on any message in the conversation, yours or not, and does not remove it from anyone else's radio or phone
### Message Priority
@@ -225,7 +237,7 @@ reliable or background, but that is not something you control from the message c
### Message Limits
- **Maximum length:** 200 bytes (approximately 200 characters for ASCII text)
- The 200-byte cap applies to the in-app composer — the mesh payload limit itself is ~233 bytes, so messages from other senders (e.g., App Functions) may arrive slightly longer
- The 200-byte cap applies to the in-app composer — the mesh payload limit itself is 233 bytes, so messages from other senders (e.g., App Functions) may arrive slightly longer
- **Rate limiting:** The mesh enforces airtime fairness; heavy message volume may be throttled
- **Delivery:** Messages are retried automatically if no acknowledgment is received
+31 -22
View File
@@ -2,7 +2,7 @@
title: MQTT
parent: User Guide
nav_order: 11
last_updated: 2026-08-29
last_updated: 2026-08-30
description: Bridge your mesh to the internet — MQTT broker setup, encryption layers, and map reporting.
aliases:
- mqtt
@@ -34,27 +34,29 @@ A gateway node with internet access (Wi-Fi or Ethernet) publishes mesh messages
### Enabling MQTT
1. Navigate to **Settings → Module Config → MQTT**.
1. Navigate to **Settings → Module configuration → MQTT**.
2. Enable the MQTT module.
3. Configure the broker connection:
![MQTT module settings with the module enabled](../../assets/screenshots/settings_switch.png)
| Setting | Description | Default |
|---------|-------------|---------|
| Server Address | MQTT broker hostname | mqtt.meshtastic.org |
| Username | Broker authentication | meshdev |
| Password | Broker authentication | large4cats |
| Root Topic | Base topic for messages | msh |
| Encryption | Encrypt MQTT payload | Enabled |
| JSON Output | Also publish and consume the `/2/json/` topic. Deprecated in the protobuf schema, but still the only toggle for this behavior — and the app's own proxy honors it | Disabled |
| TLS | Secure connection to broker | Disabled |
| Map Reporting | Report position to public map | Disabled |
| **Address** | MQTT broker hostname | mqtt.meshtastic.org |
| **Username** | Broker authentication | meshdev |
| **Password** | Broker authentication | large4cats |
| **Root topic** | Base topic for messages | `msh`, which the radio rewrites to `msh/<REGION>` once you set a region |
| **Encryption enabled** | Encrypt MQTT payload | Enabled |
| **JSON output enabled** | Also publish and consume the `/2/json/` topic. Deprecated in the protobuf schema, but still the only toggle for this behavior — and the app's own proxy honors it | Disabled |
| **TLS enabled** | Secure connection to broker | Disabled |
| **Map reporting** | Report position to public map | Disabled |
| **Proxy to client enabled** | Relay MQTT through the connected phone | Disabled |
### Connection Status and Test Connection
The top of the MQTT settings screen shows the live broker connection — **Connected**,
**Connecting**, **Reconnecting**, **Disconnected**, or **Inactive**.
The top of the MQTT settings screen shows the status of the relay this phone runs —
**Connected**, **Connecting**, **Reconnecting**, **Disconnected**, or **Inactive**. It reads
**Inactive** whenever the phone is not relaying, which includes the normal case of a radio
reaching the broker over its own Wi-Fi or Ethernet. The radio's own connection to the broker is
not reported here.
**Test connection** probes the broker before you commit the settings to the radio, and
distinguishes the failure modes: the hostname not resolving, the TCP connection being refused,
@@ -70,7 +72,9 @@ The **MQTT proxy on this phone** toggle at the top of the MQTT settings screen s
### Default Meshtastic Broker
The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing. Connections to it always use TLS (port 8883), even if the TLS toggle is off; for any other broker, TLS is used only when you enable it (port 8883 with TLS, 1883 without).
The community maintains a public broker at `mqtt.meshtastic.org`. This is intended for general use and testing.
When this phone relays MQTT for the radio, connections to that broker always use TLS on port 8883 even if **TLS enabled** is off — the app forces the switch on and grays it out. A radio that reaches the broker over its own Wi-Fi or Ethernet forces nothing: turn **TLS enabled** on yourself, or it connects in the clear on port 1883. For any other broker the toggle decides in both cases (port 8883 with TLS, 1883 without).
> 🔒 **Privacy:** Messages on the public broker are readable by anyone subscribed. Always use channel encryption for private communications.
@@ -85,10 +89,13 @@ Configure your node to point to your private broker with appropriate credentials
## Map Reporting
When Map Reporting is enabled, your node publishes its position to the Meshtastic community map:
- Visible at [meshmap.net](https://meshmap.net) and similar community map services
- Only position and node info are shared
- Disable this if you don't want your location publicly visible
When **Map reporting** is on, your node periodically publishes a map report to the broker. The report goes out unencrypted, whatever keys your channels use, and carries your node id, long and short name, approximate location, hardware model, role, firmware version, LoRa region, modem preset, and primary channel name.
Turning it on opens a consent card. Turn on **I agree.** and choose a **Map reporting interval (seconds)** of one hour or more — the screen will not save until you do. A slider sets the position precision, and the app shows the resulting accuracy as a ± distance, so you can publish an approximate location rather than an exact one.
Reports appear at [meshmap.net](https://meshmap.net) and similar community map services.
> 🔒 **Privacy:** A map report is readable by anyone subscribed to the broker. Leave **Map reporting** off if you do not want your approximate location published.
## Uplink vs Downlink
@@ -97,7 +104,7 @@ When Map Reporting is enabled, your node publishes its position to the Meshtasti
| **Uplink** | Messages from mesh → MQTT broker |
| **Downlink** | Messages from MQTT broker → mesh |
Configure per-channel which directions are active to control message flow and airtime usage.
Uplink and downlink are per-channel settings, not MQTT module settings. Open **Settings → Channels**, tap the channel, and use **MQTT Uplink Enabled** and **MQTT Downlink Enabled**. Every channel you want bridged out needs uplink on, and every channel you want MQTT traffic injected into needs downlink on.
## Message Formats
@@ -117,7 +124,7 @@ MQTT carries two payload formats:
Understanding the layered encryption model:
1. **Channel encryption** happens on the mesh *before* MQTT. If your channel has a PSK, the MQTT payload is already encrypted — the broker and any subscribers see only the ciphertext.
2. **MQTT encryption** (the module setting) adds an additional encryption layer for transit to the broker. This protects metadata and routing information.
2. **Encryption enabled** (the module setting) decides which copy of the packet the gateway publishes — it is not an extra layer. Leave it on and the broker receives the packet still encrypted with your channel key. Turn it off and the gateway publishes the decrypted packet, so anyone subscribed to the topic reads your messages in the clear. Turn it off only when you own the broker and want plain payloads for a dashboard.
3. **TLS** encrypts the TCP connection to the broker itself, preventing network-level eavesdropping.
> 🔒 **Security:** The default public channel has a well-known key. Messages on the default channel sent via MQTT are effectively **unencrypted** — anyone can decode them. Always use a custom PSK for private communications.
@@ -143,7 +150,9 @@ Understanding the layered encryption model:
- **Check uplink/downlink settings** — if only uplink is enabled, messages flow from mesh to MQTT but not back. Enable downlink on the receiving gateway.
- **Channel mismatch** — both gateways must share the same channel with the same PSK. A mismatch means messages are encrypted with different keys and appear as garbage.
- **Topic mismatch** — ensure both gateways use the same root topic. The default `msh` works for the public broker.
- **Topic mismatch** — both gateways must use exactly the same root topic. Setting a region rewrites a default root to `msh/<REGION>` (for example `msh/US`), so gateways in different regions do not meet until you give both the same explicit root.
- **Ignore MQTT is on** — in a region with a duty-cycle limit, the radio turns on **Ignore MQTT** (LoRa config, **Advanced**) when you set the region, and then drops every packet that reached it via MQTT. Turn it off on the receiving nodes, not only on the gateway.
- **Ok to MQTT is off** — on a public broker a gateway uplinks other nodes' packets only when the sending node has **Ok to MQTT** (LoRa config, **Advanced**) on. Your own traffic bridges either way; your neighbors' does not until they opt in.
## Related Topics
+23 -17
View File
@@ -2,7 +2,7 @@
title: Node Metrics
parent: User Guide
nav_order: 5
last_updated: 2026-08-29
last_updated: 2026-08-30
description: Telemetry dashboards for each mesh node — device health, environment sensors, air quality, signal quality, power, traceroute, and position history.
aliases:
- metrics
@@ -19,11 +19,12 @@ The node detail screen provides comprehensive telemetry and metrics for each nod
1. Navigate to **Nodes**.
2. Tap the node you want to inspect.
3. Select the metric category from the detail tabs.
3. Scroll to the **Telemetry** section and find the category you want — **Signal Quality**, **Device Metrics**, **Environment Metrics**, **Air-Quality Metrics**, **Power Metrics**, **Position**, and the rest.
4. Tap the refresh button on a row to ask the node for a fresh reading. The chart button beside it opens that category's history, and appears once the node has reported that kind of telemetry.
![Node detail — local device](../../assets/screenshots/nodes_detail_local.png)
The position tab shows location data for nodes that share GPS:
The **Position** row expands to show location data for nodes that share GPS:
![Position inline content](../../assets/screenshots/nodes_position.png)
@@ -37,13 +38,13 @@ Basic operating information reported by each node:
|--------|-------------|
| Battery Level | Current battery percentage |
| Voltage | Battery voltage reading |
| Channel Utilization | Percentage of airtime consumed |
| Airtime | Transmission time used by this node |
| ChUtil | Percentage of local airtime in use |
| AirUtil | Percentage of the last hour this node spent transmitting |
| Uptime | Time since last reboot |
Device metrics are displayed as individual cards with trend sparklines showing battery level, voltage, channel utilization, airtime, and uptime over time.
Device Metrics has no cards on the node detail screen. Use the chart button on its row to open the Device Metrics screen, where battery level, voltage, ChUtil, and AirUtil are plotted over time and every reading — uptime included — is listed with its timestamp underneath. Pick a time frame at the top of the screen, and use the save icon in the app bar to export the visible history as CSV.
> 💡 **Tip:** Tap any metric card to expand it into a full chart with historical data points. Pinch to zoom the time axis.
> 💡 **Tip:** Where a category does show cards — Environment, Air Quality, and Power — touch & hold a card to copy its value to the clipboard. On a chart screen, pinch to zoom the time axis.
## Environment Metrics
@@ -100,7 +101,7 @@ An air-quality log/metrics button appears on the node detail screen **only when
> 💡 **Tip:** Air Quality metrics require a compatible air-quality sensor on the remote node. See [Telemetry & Sensors](telemetry-and-sensors) for supported hardware.
## Signal Metrics
## Signal Quality
Radio signal quality information:
@@ -124,7 +125,7 @@ Signal quality is rated from **SNR relative to the active LoRa modem preset's de
See [Understanding the Signal Meter](signal-meter) for the full explanation.
Local Stats from your connected radio are also shown in Signal Metrics when available. These logs include noise floor, traffic counters, relay counters, online node counts, and radio uptime. The noise floor chart uses a dashed reference line at -85 dBm to help identify a busy RF environment.
Local Stats from your connected radio are also shown in Signal Quality when available. These logs include noise floor, traffic counters, relay counters, online node counts, and radio uptime. The noise floor chart uses a dashed reference line at -85 dBm to help identify a busy RF environment.
- **Request** — ask the connected radio for a fresh Local Stats telemetry report
- **Clear** — remove Local Stats logs for that node
@@ -139,24 +140,21 @@ Power management telemetry (requires INA sensor or compatible hardware):
| Voltage | Per-channel voltage reading |
| Current | Per-channel draw, in milliamps |
Up to three sensor channels (ch1ch3) are charted, each with a label you can edit. The app does not
derive a wattage figure from them.
The node detail screen shows cards for channels 1 to 3. Use the chart button on the **Power Metrics** row to open the chart screen, which lists a chip for every channel that reported data — up to eight — and charts the one you select. Use the label field under the chips to give a channel a name of your own, such as Solar or Battery. The app does not derive a wattage figure from voltage and current.
## Traceroute
Traceroute shows the path a message takes through the mesh:
1. From the node detail screen, tap **Traceroute**.
1. From the node detail screen's **Telemetry** section, tap the refresh button on the **Traceroute** row. You cannot traceroute your own node, and the button accepts one request every 30 seconds.
2. The app sends a traceroute request to the target node.
3. Results show each hop with SNR/RSSI values.
3. Results show each hop with its SNR.
### Reading Traceroute Results
```
You → Node A (SNR: 8.5) → Node B (SNR: 5.2) → Target
```
A traceroute is a round trip, so each saved result carries a hop count in each direction — **Forward Hops** and **Return Hops** — and the **Round Trip** time in seconds. A result marked **Direct** reached the target with no relay in between. Tap a result to read the route traced toward the destination and the route traced back to you, with the SNR of every hop. On Android that view offers **View on map**, which draws the same path, as long as the start and destination nodes have both shared a position.
Each hop represents a relay node that forwarded the message.
A result marked **No Response** means the target never answered. It may be out of range, asleep, or configured not to reply. Wait for the 30-second cooldown to clear and try again; if it keeps failing, send a direct message first to confirm the node is reachable at all.
## Position Log
@@ -170,6 +168,14 @@ Historical position data for nodes that share their location:
Shows which nodes a given node can directly hear, useful for understanding mesh topology.
## Host Metrics
Nodes that run Meshtastic on a Linux host, such as a Raspberry Pi, report the host's own health — free memory, free disk space, one-, five-, and fifteen-minute load averages, and how long the host has been up. The **Host Metrics** row is always listed; its chart button appears once a node has reported them.
## PAX Metrics
A node running the PAX counter module reports how many Wi-Fi and Bluetooth devices it saw nearby, as a crowd-size estimate, and charts the two counts alongside their total. The **PAX Metrics** row is always listed; its chart button appears once a node has reported them. The counts are of devices, not people.
## Related Topics
- [Nodes](nodes) — node list, filtering, and sorting
+37 -19
View File
@@ -2,7 +2,7 @@
title: Nodes
parent: User Guide
nav_order: 4
last_updated: 2026-08-29
last_updated: 2026-08-30
description: Browse, filter, and sort mesh nodes — view details, signal quality, roles, and quick actions.
aliases:
- node-list
@@ -20,17 +20,21 @@ The Nodes screen lists every node visible on your mesh.
The node list shows every node your radio has heard, including:
- **Node name** — user-configured long name
- **Short name** — 4-character identifier
- **Signal quality** — last heard signal strength
- **Signal quality** — SNR, RSSI, and a quality word, shown only for nodes your radio heard directly. In the Complete layout a node reached through a relay shows its hop count here instead; a node heard only over MQTT shows neither
- **Last heard** — time since last communication
- **Distance** — estimated distance (if positions are shared)
- **Battery** — remote node battery level (if telemetry is enabled)
### Choosing What the List Shows
The list has two densities, set at **Settings → Node Layout**. **Complete** shows every field a node has reported and hides the ones it hasn't. **Compact** fits more nodes on screen and lets you pick the fields yourself — **Power**, **Last Heard Time**, **Relative Last Heard Time**, **Distance and Bearing**, **Hops Away**, **Signal (Direct Only)**, **Channel**, and **Device & Role**. The **Environment Metrics** toggle applies to both densities. A preview above the toggles shows the effect before you leave the screen.
### Node Status Indicators
| Badge | Meaning |
| Indicator | Meaning |
|-------|---------|
| 🟢 Online | Node heard within the last 2 hours |
| ⚪ Offline | Node not heard for over 2 hours |
| Green last-heard time | Node heard within the last 2 hours |
| Plain last-heard time | Node not heard for over 2 hours |
| ⭐ Favorite | Node you marked as a favorite. |
There is no separate "away" tier.
@@ -53,7 +57,7 @@ Nodes can be configured with different roles that affect their mesh behavior:
| Sensor | Optimized for telemetry reporting |
| TAK | Interoperates with TAK systems (sends/receives CoT) |
| TAK Tracker | TAK position reporting only |
| Lost & Found | Continuous position beacon for recovery |
| Lost and Found | Sends its position to the default channel as a text message at regular intervals, to help recover a lost radio |
### Choosing a Role
@@ -81,6 +85,8 @@ Nodes display encryption status icons next to their name:
> 💡 **Tip:** PKI encryption (firmware 2.5+) provides stronger security than channel PSK because each node has a unique key pair. If you see a key mismatch warning, the node may have been reset or compromised.
To clear a mismatch, first confirm through another trusted channel that the key change was intentional — a factory reset causes one. Then touch & hold the node, choose **Remove**, and let the two radios exchange keys again the next time yours hears it.
## Quick Actions
From the node list, you can:
@@ -91,7 +97,13 @@ From the node list, you can:
- Send a direct message
- Trace route
- Ignore/unignore
- Remove node
- Remove
## Sharing a Contact
On a node's detail screen, tap **Share Contact** to produce a link and a QR code for that node. From the same dialog, **Write to NFC tag** saves the link to a writable NFC tag that anyone can tap to open.
To add someone else's contact, use the import button on the node list and choose **Scan Shared Contact QR Code**, **Scan Shared Contact NFC**, or **Input Shared Contact URL**. The app asks you to confirm with **Import Shared Contact?**, and warns you when the contact is one you already have.
## Filtering & Sorting
@@ -103,24 +115,24 @@ Type in the search field to filter nodes by name or short name. The filter updat
| Filter | Description |
|--------|-------------|
| **Only online** | Show only nodes heard within the last 2 hours |
| **Only direct** | Show only nodes with direct (non-relayed) connections |
| **Hide offline nodes** | Show only nodes heard within the last 2 hours |
| **Only show direct nodes** | Show only nodes your radio heard directly, with no relay in between |
| **Include unknown** | Show nodes that haven't sent user info yet. **On by default**, so a node heard before its info arrives stays visible and messageable; these carry a badge marking them incomplete |
| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) |
| **Exclude infrastructure** | Hide infrastructure-role nodes (Router, Router Late, Client Base, and legacy Repeater nodes) and any node that cannot be messaged, whatever its role |
| **Exclude MQTT** | Hide nodes heard only via MQTT internet bridge |
| **Show ignored** | Show nodes you've ignored |
| **Only show ignored Nodes** | Replace the list with the nodes you have ignored. Every other node is hidden while this is on, and a banner appears at the top of the list to take you back |
### Sort Options
| Sort | Description |
|------|-------------|
| **Last heard** (default) | Most recently heard nodes first |
| **Alphabetical** | Sorted by node long name |
| **Last heard** | Most recently heard nodes first |
| **A-Z** | Sorted by node long name |
| **Distance** | Nearest nodes first (requires position sharing) |
| **Hops away** | Fewest relay hops first |
| **Channel** | Grouped by channel index |
| **Via MQTT** | Grouped by MQTT vs. radio-heard |
| **Favorites** | Favorited nodes first |
| **via MQTT** | Grouped by MQTT vs. radio-heard |
| **via Favorite** (default) | Favorited nodes first, then the rest |
## Nodes per Hop
@@ -130,9 +142,7 @@ Tap the hop-histogram icon in the node list's app bar to open a bar chart of how
Tapping a node opens the detail view with comprehensive information. See [Node Metrics](node-metrics) for full details on metrics and telemetry.
![Node list, showing signal quality and last-heard time for each node](../../assets/screenshots/nodes_node_list.png)
The detail screen includes device info, position, and action buttons:
The Details card carries the node's short name, role, IDs, last heard time, hops away, uptime, and its SNR and RSSI:
![Node detail section](../../assets/screenshots/nodes_detail_section.png)
@@ -150,7 +160,15 @@ Inline status indicators show key metrics at a glance:
When a node's hardware is recognized, the detail view shows a collapsible **"I want one"** section linking to places to buy or learn more about that device: the vendor's product page, product variants, and regional marketplace listings (such as AliExpress, Amazon, and supported retailers), filtered to your country. Each link opens through the `msh.to` redirect service. Devices with no matching links don't show the section.
A full, browsable directory of every link is also available under **Settings → Help & Documentation → Device Links**.
A full, browsable directory of every link is also available at **Settings → Device Links**. The item is hidden while you have Settings open for a remote node.
## When No Nodes Appear
The list stays empty until your radio hears another node.
- **No device connected** — the app is not connected to a radio. See [Connections](connections).
- **Searching for nodes** — the radio is connected and listening, but nothing has arrived yet. Check that its region and modem preset match the mesh around you, and leave **Include unknown** on so a node that has not yet sent its name still appears. See [Settings — Radio & User](settings-radio-user).
- A node you expect is missing — check the filter toggles. **Only show direct nodes**, **Exclude MQTT**, and **Exclude infrastructure** each hide a whole category of node.
## Related Topics
+13 -11
View File
@@ -2,7 +2,7 @@
title: Getting Started
parent: User Guide
nav_order: 1
last_updated: 2026-08-29
last_updated: 2026-08-30
description: First-launch setup — permissions, onboarding flow, and next steps after connecting your radio.
aliases:
- first-launch
@@ -16,7 +16,7 @@ This page covers the first-launch flow of the Meshtastic Android app, what each
## First Launch
When you open the app for the first time, the app guides you through an introductory flow that configures essential permissions and settings. Complete each step in order or skip it — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app.
When you open the app for the first time, the app guides you through an introductory flow that configures essential permissions and settings. Complete each step in order or skip it — nothing here is a one-time offer. Every permission can be reviewed and granted later from the **Permissions** section of **Settings** inside the app.
### Welcome Screen
@@ -38,15 +38,15 @@ The app requests several permissions during setup. Each one serves a specific pu
### Bluetooth Permission
Bluetooth is the primary connection method between your phone and Meshtastic radio:
- **Bluetooth scanning** — discover nearby Meshtastic radios
- **Bluetooth connect** — establish and maintain connections with paired radios
Bluetooth is the primary connection method between your phone and Meshtastic radio. The **Bluetooth** screen shows what the permission buys you:
- **Discovery** — find and identify Meshtastic devices near you.
- **Configuration** — wirelessly manage your device settings and channels.
Grant both permissions when prompted. Without Bluetooth, you'll need to use USB or TCP connections instead.
On Android 12 and newer, Android asks once, for **Nearby devices**, and that one grant covers both scanning and connecting. Without it, you'll need to use USB or TCP connections instead.
### Location Permission
> **Is location required for Bluetooth?** **Android 11 and older** show one location step, on the Bluetooth screen, rather than two — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices". Asking twice would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio.
> **Note:** Location is not required for Bluetooth on Android 12 and newer. **Android 11 and older** show one location step, on the Bluetooth screen, rather than two — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices". Asking twice would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio.
Meshtastic also uses your location for:
- Showing your position on the mesh map
@@ -70,11 +70,13 @@ Notifications alert you to:
Critical alerts are high-priority notifications that break through Do Not Disturb — for emergency mesh alerts and urgent messages.
This step is not a runtime permission prompt. There is no grant/deny dialog: the button opens the Android system settings page for the app's **Alerts** notification channel, where you turn the breakthrough behavior on yourself. You can **skip** it, and reach the same page later from Android notification settings.
This step is not a runtime permission prompt. There is no grant/deny dialog: the button opens the Android system settings page for the app's **Alerts** notification channel, where you turn the breakthrough behavior on yourself. Tap **Configure Critical Alerts** to open that page, or **Skip** to move on — you can reach the same page later from Android's notification settings for Meshtastic. This step appears only if you granted notifications on the previous screen — skip or decline them and setup ends there.
### Reviewing permissions later
**Settings → Permissions** summarizes where every runtime permission stands. It covers five: **Nearby devices** (Bluetooth), **Location**, **Notifications**, **Camera** (scanning channel and contact QR codes) and **Local network** (finding radios over Wi-Fi by mDNS) — the last two are never asked for during setup, only when a feature first needs them. It reads *All allowed* when no permission needs attention; the row names the count and the Permissions screen opens automatically when something does. Tap the row to see the full list at any time:
The **Permissions** section of **Settings** summarizes where every runtime permission stands. On Android 12 and newer it lists five: **Nearby devices permission** (Bluetooth), **Location permission**, **App Notifications**, **Camera permission** (scanning channel and contact QR codes) and **Local network permission** (finding radios over Wi-Fi by mDNS). On Android 11 and older a single **Location permission** row covers both Bluetooth and location, so there are four. The last two are never asked for during setup, only when a feature first needs them.
The section reads *All allowed* when every permission is granted, *Nothing needs your attention* when some have simply never been asked for, and names a count when one is denied — in which case it expands itself. Tap the row to expand or collapse it at any time:
| State | What tapping the row does |
|---|---|
@@ -90,9 +92,9 @@ This matters most for notifications. If you decline them during setup, this row
After you grant permissions, the app opens the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions.
> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.
> 💡 **Tip:** If you skipped any permissions during setup, open the **Permissions** section of **Settings** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.
Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.
Features also ask in context. On the **Connect** tab, a card above the device list explains what the Bluetooth permission is for and offers **Grant permission**; once Android stops prompting, that button becomes **Open settings**.
New to Meshtastic? The [getting started guide](https://meshtastic.org/docs/getting-started) on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.
+114 -73
View File
@@ -2,7 +2,7 @@
title: Settings — Modules & Admin
parent: User Guide
nav_order: 8
last_updated: 2026-08-29
last_updated: 2026-08-30
description: Configure optional feature modules (MQTT, telemetry, canned messages, TAK, and more) and perform device administration.
aliases:
- modules
@@ -14,46 +14,51 @@ aliases:
Configure optional feature modules and perform device administration. Modules extend Meshtastic with specialized capabilities — each can be independently enabled or disabled.
> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration.
> 💡 **Tip:** You only need to enable the modules you actually use. Disabling unused modules reduces airtime, saves battery, and simplifies your configuration. A module you expect can be missing for three reasons: your node's role does not enable it, your firmware is older than the release that added it, or the firmware build excludes it for this hardware.
Module settings use a card-based layout with toggle switches, dropdowns, text fields, and sliders:
![Toggle switch](../../assets/screenshots/settings_switch.png)
![A toggle setting in the on position](../../assets/screenshots/settings_switch.png)
![Dropdown selector](../../assets/screenshots/settings_dropdown.png)
![A dropdown setting, expanded to show its list of options](../../assets/screenshots/settings_dropdown.png)
![Text field](../../assets/screenshots/settings_text_field.png)
![A text field setting with a value entered](../../assets/screenshots/settings_text_field.png)
![Settings card layout](../../assets/screenshots/settings_titled_card.png)
![A module settings card with its title and grouped controls](../../assets/screenshots/settings_titled_card.png)
## Module Configuration
Every module lives under **Settings → Module configuration**.
> ⚠️ **Important:** Saving a module screen restarts the radio — the button reads **Save & restart**, and the radio is unreachable for a few seconds afterwards. External Notification and Mesh Beacon are the exceptions: their button reads **Save**, and the radio may still restart for some changes.
### MQTT Module
Bridges mesh messages to and from an MQTT broker for internet connectivity. This is how you extend your mesh beyond radio range or integrate with home automation systems.
| Setting | Description |
|---------|-------------|
| Enabled | Toggle MQTT bridge |
| Server | MQTT broker address |
| MQTT enabled | Toggle MQTT bridge |
| Address | MQTT broker address |
| Username | Authentication username |
| Password | Authentication password |
| Encryption | Encrypt MQTT payloads |
| JSON Output | Publish and consume MQTT messages as JSON. Marked deprecated in the protobuf schema, but it is still the only toggle for this behavior and the firmware still honors it |
| TLS | Use secure connection |
| Root Topic | Base MQTT topic path |
| Encryption enabled | Encrypt MQTT payloads |
| JSON output enabled | Publish and consume MQTT messages as JSON. Marked deprecated in the protobuf schema, but it is still the only toggle for this behavior and the firmware still honors it |
| TLS enabled | Use secure connection |
| Root topic | Base MQTT topic path |
| Proxy to client enabled | Let a connected phone carry the node's MQTT traffic, instead of the node reaching the broker itself |
| MQTT proxy on this phone | The phone-side half of **Proxy to client enabled**: whether this phone acts as that relay. See [MQTT](mqtt) |
| Map Report | Publish position to the public map — see below |
| Map reporting | Publish position to the public map — see the Map reporting group that follows |
**Map Report** expands into its own group:
Turning **Map reporting** on reveals a consent card headed *Consent to Share Unencrypted Node Data
via MQTT*, with an **I agree.** switch under it. The rest of the card does not exist on screen
until you agree:
| Setting | Description |
|---------|-------------|
| Enabled | Publish to the public map at all |
| Share location | Explicit consent to include your position. Map reporting does not save without it |
| Position precision | How coarsely your position is published |
| Publish interval | How often to report. Must be **at least 3600 s (1 hour)** — the app blocks saving below that |
| I agree. | Explicit consent to transmit your node data, including an approximate position, unencrypted. Map reporting does not start without it |
| Precision slider | The slider has no label of its own. It sets how coarsely your position is published, from 12 to 15; the line beneath reads *±* the resulting distance, in your own units |
| Map reporting interval (seconds) | How often to report. A dropdown of fixed intervals from 1 hour to 72 hours — nothing shorter is offered |
See [MQTT](mqtt) for a detailed usage guide including encryption, privacy, and broker setup.
@@ -99,11 +104,11 @@ Buffers messages for nodes that were temporarily offline, then replays them when
| Setting | Description |
|---------|-------------|
| Enabled | Activate store and forward |
| Store & Forward enabled | Activate store and forward |
| Heartbeat | Periodically announce this node's store-and-forward capability |
| Records | Maximum stored messages |
| History Return (max) | Max messages to replay |
| History Return (window) | Time window for replay |
| Number of records | Maximum stored messages |
| History return max | Max messages to replay |
| History return window | Time window for replay |
| Server | Act as a store-and-forward server for the mesh (requires ample memory, e.g. ESP32 with PSRAM) |
> 💡 **Tip:** Store and Forward works best on nodes with ample memory (ESP32 with PSRAM). Router nodes are ideal candidates since they're typically always-on.
@@ -111,16 +116,17 @@ Buffers messages for nodes that were temporarily offline, then replays them when
### Range Test Module
> ⚠️ **Warning:** Range Test only works on a secured primary channel. As long as your primary channel
> still uses the default channel key, the Enabled, Interval and Save-CSV controls stay disabled, and
> saving force-disables the module if the channel has reverted to public.
> still uses the default channel key, the interval and CSV controls stay disabled — you can still
> switch an already-enabled module off — and saving force-disables the module if the channel has
> reverted to public.
Automated range testing tool for evaluating link quality between nodes. When enabled, the node periodically transmits test messages with incrementing counters. A receiver node logs these messages, allowing you to walk or drive away and later analyze at what distance messages stopped arriving.
| Setting | Description |
|---------|-------------|
| Enabled | Activate range testing |
| Sender Interval (s) | Time between test transmissions |
| Save CSV | Log received test data to SD card |
| Range test enabled | Activate range testing |
| Sender message interval (seconds) | Time between test transmissions, chosen from a dropdown of fixed intervals |
| Save .CSV in storage (ESP32 only) | Log received test data to the radio's own filesystem. ESP32 hardware only |
### Telemetry Module
@@ -132,7 +138,7 @@ battery health often and sensors rarely.
| Setting | Description |
|---------|-------------|
| Send Device Telemetry | Master toggle for device metrics. Only shown on firmware 2.7.12 and newer |
| Device metrics update interval | How often to report battery, uptime and channel utilisation |
| Device metrics update interval | How often to report battery, uptime and channel utilization |
| Environment metrics module enabled | Report the attached environment sensors |
| Environment metrics update interval | How often to report them |
| Environment metrics on-screen enabled | Also show these readings on the device's own display |
@@ -154,9 +160,9 @@ Pre-configured messages accessible from the radio's physical buttons (for radios
| ~~Canned message enabled~~ | ⚠️ **Deprecated** in the protobuf schema |
| Messages | Newline-separated list of messages |
| Send bell | Send a bell character alongside the message, so a receiving node's External Notification module can sound |
| Rotary encoder enabled | Use a rotary encoder as the input device |
| GPIO pin for rotary encoder A / B / press | The three pins the encoder is wired to |
| Generate input event on press / CW / CCW | Which key event each encoder action produces |
| Rotary encoder #1 enabled | Use a rotary encoder as the input device |
| GPIO pin for rotary encoder A / B / Press port | The three pins the encoder is wired to |
| Generate input event on Press / CW / CCW | Which key event each encoder action produces |
| Up/Down/Select input enabled | A separate, simpler input scheme using up/down/select buttons rather than an encoder |
| ~~Allow input source~~ | ⚠️ **Deprecated** in the protobuf schema |
@@ -166,13 +172,13 @@ Codec2 audio support for low-bandwidth voice communication over the mesh. This i
| Setting | Description |
|---------|-------------|
| Enabled | Activate audio module |
| Codec2 Rate | Audio quality/bandwidth tradeoff |
| PTT Pin | GPIO pin for the push-to-talk button |
| I2S Word Select | GPIO pin for I2S WS |
| I2S Data In | GPIO pin for I2S DIN |
| I2S Data Out | GPIO pin for I2S DOUT |
| I2S Clock (SCK) | GPIO pin for the I2S bit clock |
| CODEC 2 enabled | Activate audio module |
| CODEC2 sample rate | Audio quality/bandwidth tradeoff |
| PTT pin | GPIO pin for the push-to-talk button |
| I2S word select | GPIO pin for I2S WS |
| I2S data in | GPIO pin for I2S DIN |
| I2S data out | GPIO pin for I2S DOUT |
| I2S clock | GPIO pin for the I2S bit clock |
> ️ **Note:** Audio requires specific hardware (I2S microphone and speaker). Voice quality is very low-bandwidth — think "understandable radio voice," not phone-call quality.
@@ -180,13 +186,13 @@ Codec2 audio support for low-bandwidth voice communication over the mesh. This i
GPIO control over the mesh network. Allows a remote node to read or write GPIO pins on another node — useful for activating relays, reading switches, or controlling external hardware from a distance.
> ⚠️ **Warning:** Enabling **Allow Undefined Pins** gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Only enable on dedicated GPIO nodes.
> ⚠️ **Warning:** Turning on **Allow undefined pin access** gives remote nodes access to all GPIO pins, which could interfere with the radio's own hardware. Turn it on only on dedicated GPIO nodes.
| Setting | Description |
|---------|-------------|
| Enabled | Activate remote GPIO access |
| Allow Undefined Pins | Allow access to any GPIO pin (security risk) |
| Available Pins | Up to 4 GPIO pins this node exposes for remote read/write |
| Remote Hardware enabled | Activate remote GPIO access |
| Allow undefined pin access | Allow access to any GPIO pin (security risk) |
| Available pins | Up to 4 GPIO pins this node exposes for remote read/write |
### Neighbor Info Module
@@ -194,9 +200,9 @@ Broadcasts information about directly heard neighbors, enabling mesh topology ma
| Setting | Description |
|---------|-------------|
| Enabled | Activate neighbor broadcasting |
| Update Interval (s) | How often to broadcast neighbor list |
| Transmit Over LoRa | Also broadcast neighbor info over LoRa, not just MQTT/phone. Unavailable on a channel using the default key and name |
| Neighbor Info enabled | Activate neighbor broadcasting |
| Update interval (seconds) | How often to broadcast neighbor list |
| Transmit over LoRa | Also broadcast neighbor info over LoRa, not just MQTT/phone. Unavailable on a channel using the default key and name |
See [Local Mesh Discovery](discovery) for how to use neighbor data for mesh topology exploration.
@@ -206,7 +212,7 @@ Controls onboard NeoPixel or other addressable RGB LEDs on supported hardware. C
| Setting | Description |
|---------|-------------|
| LED State | Turn the LED on or off |
| LED state | Turn the LED on or off |
| Current | LED current limit (031) |
| Red / Green / Blue | Individual color channel values (0255) |
@@ -216,14 +222,14 @@ Turns your node into a motion or door sensor alert system. When a GPIO pin detec
| Setting | Description |
|---------|-------------|
| Enabled | Activate detection sensor |
| Monitor Pin | GPIO pin connected to sensor |
| Detection Trigger Type | How the pin's state maps to a detection event (e.g. active high/low, edge-triggered) |
| Use Input Pullup Mode | Enable the pin's internal pull-up resistor |
| Minimum Broadcast (s) | Minimum time between alert broadcasts |
| State Broadcast (s) | Periodic state broadcast interval |
| Send Bell | Include bell character in alerts |
| Friendly Name | Custom name for this sensor |
| Detection Sensor enabled | Activate detection sensor |
| GPIO pin to monitor | GPIO pin connected to sensor |
| Detection trigger type | How the pin's state maps to a detection event (e.g. active high/low, edge-triggered) |
| Use INPUT_PULLUP mode | Enable the pin's internal pull-up resistor |
| Minimum broadcast (seconds) | Minimum time between alert broadcasts |
| State broadcast (seconds) | Periodic state broadcast interval |
| Send bell with alert message | Include bell character in alerts |
| Friendly name | Custom name for this sensor |
### Paxcounter Module
@@ -231,8 +237,8 @@ People counter using Wi-Fi and BLE probe requests. Counts nearby devices by pass
| Setting | Description |
|---------|-------------|
| Enabled | Activate people counting |
| Update Interval (s) | How often to report counts |
| Paxcounter enabled | Activate people counting |
| Update interval (seconds) | How often to report counts |
| Wi-Fi RSSI threshold | Ignore Wi-Fi probes weaker than this, so distant devices are not counted (defaults to 80 dBm) |
| BLE RSSI threshold | The same cut-off for BLE advertisements (defaults to 80 dBm) |
@@ -245,15 +251,16 @@ The status message has no module screen. It is edited with the rest of the node'
### Mesh Beacon Module
Broadcasts an invitation to your mesh, and receives invitations from others. See
[Local Mesh Discovery](discovery) for the full walkthrough.
Broadcasts an invitation to your mesh, and receives invitations from others. The entry appears only
on radios running firmware 2.8.0 or newer. See [Local Mesh Discovery](discovery) for the full
walkthrough.
### TAK Module
Team Awareness Kit integration for interoperability with ATAK and WinTAK. This module only appears
in the list once the node's **Device Role** (Device Config) is set to **TAK** or **TAK Tracker**
change the role first, otherwise the entry does not appear. See [TAK Integration](tak) for detailed
setup and usage.
Team Awareness Kit integration for interoperability with ATAK and WinTAK. Two things have to be
true before the entry appears in the module list: the radio runs firmware 2.8.0 or newer, and its
**Device Role** on **Settings → Device configuration → Device** is set to `TAK` or `TAK_TRACKER`.
See [TAK Integration](tak) for detailed setup and usage.
## Administration
@@ -268,28 +275,62 @@ Remotely configure nodes that share your admin key:
> ⚠️ **Important:** Requires an admin key configured on both your node and the target node.
### Clean Node Database
### Device Actions
Prunes your local node database. Two independent controls:
**Settings → Administration** holds five one-shot actions, each behind a confirmation dialog:
- An **age slider** — remove nodes not heard from within that window.
- **Clean unknown nodes only** — restrict the purge to nodes that never sent their user info,
leaving named nodes alone regardless of age.
| Action | What it does |
|---|---|
| Set time | Sends your phone's clock to the radio |
| Reboot | Restarts the radio |
| Shutdown | Powers the radio down |
| Factory reset | Returns every setting to its factory default |
| NodeDB reset | Clears the radio's node database. This dialog carries a **Preserve Favorites?** switch |
### Factory Reset
> ⚠️ **Warning:** Factory reset erases all settings, channels, and keys, and cannot be undone. Before you reset, use **Export configuration** to save the radio's settings and **Backup Keys** on the Security screen to save its keys, so you can put both back afterwards.
> ⚠️ **Warning:** Factory reset erases all settings, channels, and keys. This cannot be undone.
### Backup & Restore
Resets all settings to factory defaults.
**Settings → Backup & Restore** writes the connected radio's whole configuration to a file with
**Export configuration**, and reads a saved file back in with **Import configuration**. Export
before a factory reset, or to copy one radio's setup onto another. The section is shown for your
own radio only, not over remote admin.
### Reboot
### Advanced
Remotely reboot a connected or administered node.
**Settings → Advanced** collects the tools that read or rewrite local state, and is likewise shown
for your own radio only: **Firmware Update** on OTA-capable hardware, **Clean Node Database**,
**TAK Server**, **Local Mesh Discovery**, and the **Debug Panel**.
### Debug Panel
#### Clean Node Database
Prunes nodes from your node database — from the app's copy *and* from the radio's own, so this is
not a display-only cleanup. The two filters combine rather than acting separately; the screen puts
it as *Selections are additive*.
- **Clean up nodes last seen older than N days** — always applied. The slider runs from 7 days to
365 and starts at 30; with **Clean up only unknown nodes** turned on, its floor drops to 0.
- **Clean up only unknown nodes** — narrows the same purge to nodes that never sent their user
info. The age limit still applies on top of it.
The screen lists the nodes queued for deletion as you move the filters. **Clean Now** carries the
purge out, after one more confirmation, and it cannot be undone. Favorited nodes, ignored nodes,
and nodes with a public key heard in the last seven days are never removed, whatever the filters
say — that is why the queued list can be shorter than you expect.
#### Debug Panel
Opens the **Packets** and **App logs** tabs for viewing, filtering, and exporting diagnostic output. See [Debug Logs](debug-logs) for the full walkthrough.
### App Settings
Two easy-to-miss entries on the **Settings** screen configure the app rather than the radio, and
appear only when your own node is selected:
- **Node Layout** — how much detail each row of the node list shows.
- **Message Filter** — hides incoming messages that contain words you list. With no words
configured it does nothing.
### About
**Settings → About** carries the app's own identity rather than the radio's:
+78 -47
View File
@@ -2,7 +2,7 @@
title: Settings — Radio & User
parent: User Guide
nav_order: 7
last_updated: 2026-08-29
last_updated: 2026-08-30
description: Configure your radio hardware, LoRa presets, user profile, position sharing, power management, and security.
aliases:
- settings
@@ -15,21 +15,38 @@ aliases:
Configure your radio's user identity, region and LoRa parameters, position and power behavior, network and Bluetooth connectivity, and security settings.
## How These Screens Work
Everything here is on the **Settings** screen. **User**, **LoRa**, **Channels** and **Security** are
listed there directly. **Device**, **Position**, **Power**, **Network**, **Display** and
**Bluetooth** are one level down, under **Settings → Device configuration**. **Network** appears
only on radios with Wi-Fi or Ethernet, and **Bluetooth** only on radios with Bluetooth.
Settings use standard preference controls — dropdowns, toggles, and sliders:
| Control | Screenshot |
|---------|------------|
| Dropdown | ![A dropdown setting, expanded to show its list of options](../../assets/screenshots/settings_dropdown.png) |
| Toggle | ![A toggle setting in the on position](../../assets/screenshots/settings_switch.png) |
| Slider | ![A slider setting with its current numeric value shown](../../assets/screenshots/settings_slider.png) |
## User Settings
### User Profile
On **Settings → User**.
| Setting | Description |
|---------|-------------|
| Long Name | Your display name (up to 39 characters) |
| Short Name | 4-character abbreviated name |
| Status Message | A short free-text status other nodes display alongside your node — up to 80 bytes, cleared with the **✕** in the field. Needs firmware 2.8 or newer, and is absent otherwise |
| Status Message | A short, public free-text status other nodes display alongside your node — up to 80 bytes, cleared with the **✕** in the field. The radio broadcasts it to the mesh when you change it and again every 12 hours. Needs firmware 2.8 or newer, and is absent otherwise |
| Unmessageable | Marks the node as one nobody should try to message — for an unmonitored or infrastructure node. Other clients hide it from the contact list. Needs supporting firmware |
| Licensed Operator | Enable if you hold an amateur radio license (permits higher power). Turning it on relabels **Long Name** as **Call Sign** and adds a separate Long Name field, and is staged behind a confirmation dialog |
| Licensed amateur radio (Ham) | Enable if you hold an amateur radio license (permits higher power). Turning it on is staged behind a confirmation dialog. On your own radio it then relabels **Long Name** as **Call sign** and adds a separate Long Name field; over remote admin the field stays **Long Name** |
### Applying Changes
After modifying settings, tap **Save** to write the configuration to your radio. The radio may reboot to apply changes.
The footer appears as soon as you change something. **Discard** throws the change away, and the other button writes it to the radio: it reads **Save & restart** on the screens the firmware applies with a reboot — Position, Network, Bluetooth, Security, and most module screens — and **Save** everywhere else.
The status message is saved with the same **Save**, but it never reboots the node — and, like the
rest of this screen, it can be edited on a remote node you administer.
@@ -38,12 +55,14 @@ rest of this screen, it can be edited on a remote node you administer.
### Device Config
On **Settings → Device configuration → Device**.
| Setting | Description | Default |
|---------|-------------|---------|
| Role | Node behavior (Client, Router, etc.) — each option carries its own description in the picker. Choosing Router asks for confirmation | Client |
| Rebroadcast Mode | How the node retransmits messages; each mode is described in the picker | All |
| Node Info Broadcast (s) | Interval for broadcasting node info | 10800 |
| Double-tap Button | Treat a double tap as a button press | Disabled |
| Device Role | Node behavior. The picker lists the firmware names (`CLIENT`, `ROUTER`, `ROUTER_LATE`, `TAK`, and so on), and the description of whichever role is selected appears under the field. Choosing `ROUTER` or `ROUTER_LATE` asks you to confirm you have read the device-role guidance first | `CLIENT` |
| Rebroadcast Mode | How the node retransmits messages. As with the role, the picker lists the firmware names and describes only the selected one | `ALL` |
| Node Info Broadcast Interval | How often the node re-announces itself. A dropdown of fixed intervals — Unset, then 3 to 72 hours — not a value you type in seconds | 3 hours |
| Double Tap as Button | Treat a double tap as a button press | Disabled |
| Triple Click Ad Hoc Ping | Send an ad-hoc position ping on a triple click | Disabled |
| LED Heartbeat | Blink the status LED periodically | Enabled |
| Time Zone | POSIX time-zone string for the device clock, with buttons to copy your phone's zone or clear it | — |
@@ -51,49 +70,58 @@ rest of this screen, it can be edited on a remote node you administer.
### LoRa Config
On **Settings → LoRa**.
| Setting | Description | Default |
|---------|-------------|---------|
| Region | Regulatory region for frequency bands. You must set this before transmitting | Unset (must configure) |
| Modem Preset | Speed/range tradeoff | LongFast |
| Hop Limit | Maximum retransmit hops | 3 |
| TX Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) |
| Presets | Speed/range tradeoff | LongFast |
| Number of Hops | Maximum retransmit hops | 3 |
| Transmit Power | Transmission power (dBm); 0 = max allowed for region | 0 (region max) |
| Frequency Override | Overrides the computed operating frequency outright (MHz). It does not offset the calculated value — leave at 0 unless you know you need a specific frequency | 0 (use calculated) |
| Channel Bandwidth | Bandwidth setting | Default for preset |
| Use Preset | On by default. Turn it off to set Spread Factor, Coding Rate and Bandwidth by hand instead of taking them from the modem preset | On |
| Spread Factor | Manual mode only: 712. Higher spreads further but slower | From preset |
| Coding Rate | Manual mode only: 58. More redundancy costs airtime | From preset |
| Bandwidth | Manual mode only: the channel bandwidth in kHz, typed in directly. On the 2.4 GHz region the app offers a list of the bandwidths your radio supports instead, and a stored value that is not on that list shows as *Unsupported* and blocks saving until you pick a supported one | From preset |
| Frequency Slot | Which slot within the region's band to use. 0 derives it from the primary channel name | 0 (automatic) |
| Transmit Enabled | Turning this off makes the node receive-only | On |
| Override Duty Cycle | Ignores the region's duty-cycle limit. Illegal in most regions; turn it on only where your license permits | Off |
| Ignore MQTT | Drop packets that arrived from MQTT rather than over the air | Off |
| OK to MQTT | Allow your packets to be forwarded to MQTT by gateways | Off |
| Ignore MQTT | Drop packets that arrived from MQTT rather than over the air. The firmware turns this on for you whenever you set a region that has a duty-cycle limit — the EU bands, Thailand, and Ukraine 433 | Off, until you set a duty-cycle-limited region |
| Ok to MQTT | Allow your packets to be forwarded to MQTT by gateways | Off |
| RX Boosted Gain | Extra receive gain on SX126x radios; costs a little current | Off |
| PA fan disabled | Turn off the power-amplifier fan on hardware that has one | Off |
Some regions are amateur-radio allocations whose presets only licensed operators may use. On firmware 2.8 or newer the app knows which regions those are and grays the whole **Presets** list out until **Licensed amateur radio (Ham)** is turned on for the node you are configuring; the text under the field says so while it is grayed out.
> ⚠️ **Important:** Operating without the correct region may violate local radio regulations. See the [region configuration guide](https://meshtastic.org/docs/getting-started/initial-config) on meshtastic.org for details.
### Modem Presets
The Lite, Narrow, Medium Turbo, and Tiny presets need firmware 2.8 or newer — the app hides them on older radios.
> 💡 **Tip:** The **SNR Limit** values are negative on purpose. LoRa can decode signals *below* the noise floor, so a more-negative limit means the preset tolerates a weaker, noisier signal (more range). See [How the Signal Meter Works](signal-meter) for the full explanation.
| Preset | Range | Speed | SNR Limit | Best For |
|--------|-------|-------|-----------|----------|
| Short Turbo | ~1 km | 21.9 kbps | 7.5 dB | Dense urban with line-of-sight; data-heavy applications |
| Short Fast | ~3 km | 10.9 kbps | 7.5 dB | Urban neighborhoods; buildings within a few blocks |
| Short Slow | ~5 km | 5.5 kbps | 10 dB | Suburban short-range; moderate building density |
| Medium Fast | ~5 km | 5.5 kbps | 12.5 dB | Suburban areas; moderate building density |
| Medium Slow | ~8 km | 1.1 kbps | 15 dB | Suburban/rural; moderate range with slower speed |
| Long Turbo | ~10 km | 4.4 kbps | 12.5 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput |
| Short Slow | ~5 km | 6.25 kbps | 10 dB | Suburban short-range; moderate building density |
| Medium Fast | ~5 km | 3.52 kbps | 12.5 dB | Suburban areas; moderate building density |
| Medium Slow | ~8 km | 1.95 kbps | 15 dB | Suburban/rural; moderate range with slower speed |
| Long Turbo | ~10 km | 1.34 kbps | 12.5 dB | Similar range to Long Fast but with 500 kHz bandwidth; faster throughput |
| Long Fast | ~10 km | 1.1 kbps | 17.5 dB | **General use (default)** — balanced range and speed |
| Long Moderate | ~20 km | 0.34 kbps | 17.5 dB | Rural with some terrain; occasional use |
| Lite Fast | ~5 km | 5.5 kbps | 12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast |
| Lite Slow | ~10 km | 1.1 kbps | 15 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast |
| Narrow Fast | ~5 km | 2.7 kbps | 10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices |
| Narrow Slow | ~10 km | 1.1 kbps | 12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast |
| Lite Fast | ~5 km | 1.76 kbps | 12.5 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Medium Fast |
| Lite Slow | ~10 km | 0.98 kbps | 15 dB | EU 866 MHz SRD band (125 kHz BW); comparable to Long Fast |
| Narrow Fast | ~5 km | 2.28 kbps | 10 dB | EU 868 MHz band (62.5 kHz BW); avoids interference with other devices |
| Narrow Slow | ~10 km | 1.30 kbps | 12.5 dB | EU 868 MHz band (62.5 kHz BW); comparable to Long Fast |
| Medium Turbo | ~5 km | 7.0 kbps | 12.5 dB | Like Medium Fast but with 500 kHz bandwidth; not legal in every region. Needs firmware 2.8 or newer |
| Tiny Fast | ~10 km | 0.68 kbps | 7.5 dB | Amateur bands that cap occupied bandwidth; these presets use 15.6 kHz. Needs firmware 2.8 or newer, an SX126x or SX127x radio, and a TCXO of ±5 ppm or better |
| Tiny Slow | ~20 km | 0.33 kbps | 10 dB | Same band restrictions as Tiny Fast, longer range. Same firmware, radio, and TCXO requirements |
| ~~Long Slow~~ | ~30 km | 0.18 kbps | 20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release |
| ~~Very Long Slow~~ | ~40+ km | 0.09 kbps | 20 dB | ⚠️ **Deprecated** — still selectable but may be removed in a future firmware release |
> ️ **Note:** This table uses the common short names. In the app's preset dropdown they read as **Short Range - Fast**, **Long Range - Fast**, **Lite - Fast**, **Narrow - Fast**, and so on.
> ️ **Note:** This table uses the common short names. The app's **Presets** dropdown lists the raw firmware names instead — `SHORT_FAST`, `LONG_FAST`, `LITE_FAST`, `NARROW_FAST`, and so on. Local Mesh Discovery shows the same presets as *Long Fast* and *Short Turbo*.
#### Choosing a Modem Preset
@@ -116,7 +144,7 @@ The range estimates in the [Modem Presets](#modem-presets) table assume flat ter
### Display Config
These control the **radio's own screen**, not the app's.
On **Settings → Device configuration → Display**. These control the **radio's own screen**, not the app's.
| Setting | Description |
|---------|-------------|
@@ -125,7 +153,7 @@ These control the **radio's own screen**, not the app's.
| Display mode | Screen layout/density used by the firmware |
| Display units | Metric or Imperial on the radio's screen |
| Use 12h clock format | Show the radio's clock as 12-hour rather than 24-hour |
| Bold heading | Draw the screen's heading text in bold |
| Bold Heading | Draw the screen's heading text in bold |
| Flip screen | Rotate the display 180° for an inverted mounting |
| OLED type | Auto, SSD1306, SH1106, SH1107 |
| Wake on tap or motion | Light the screen when the radio is tapped or moved |
@@ -134,6 +162,8 @@ These control the **radio's own screen**, not the app's.
### Position Config
On **Settings → Device configuration → Position**.
> ⚠️ **Important:** Saving this screen always reboots the radio.
| Setting | Description |
@@ -150,6 +180,8 @@ These control the **radio's own screen**, not the app's.
### Power Config
On **Settings → Device configuration → Power**.
| Setting | Description |
|---------|-------------|
| Enable power saving mode | Let the radio sleep aggressively between activity |
@@ -163,15 +195,17 @@ These control the **radio's own screen**, not the app's.
### Network Config
> ⚠️ **Important:** Saving this screen always reboots the radio.
On **Settings → Device configuration → Network**, on radios with Wi-Fi or Ethernet.
> ⚠️ **Warning:** Turning on **Wi-Fi enabled** or **Ethernet enabled** ends the Bluetooth connection between your phone and the radio. Reconnect over the network afterwards from the [Connections](connections) screen, or turn Wi-Fi off again from the radio's own screen or over USB. Saving this screen also always reboots the radio.
| Setting | Description |
|---------|-------------|
| Wi-Fi enabled | Enable the Wi-Fi radio (ESP32 radios) |
| SSID | Network name to connect to. **Scan Wi-Fi QR code** fills this and the password from a standard Wi-Fi QR code |
| SSID | Network name to connect to. Appears only once **Wi-Fi enabled** is on, along with **Password**. **Scan Wi-Fi QR code** fills both from a standard Wi-Fi QR code; on Android, holding the phone against a Wi-Fi NFC tag while this screen is open fills them the same way, and the app offers to open system settings if NFC is turned off |
| Password | Network password |
| Ethernet enabled | Use a wired connection on hardware that has one |
| IPv4 mode | DHCP, or a static address configured with the four fields below |
| IPv4 mode | DHCP, or a static address configured with the four fields that follow |
| Wi-Fi IP / Subnet / Gateway / DNS | The static address, only used when IPv4 mode is static |
| UDP broadcasting | Share mesh traffic with other nodes over the local network |
| NTP server | Time synchronization server |
@@ -181,29 +215,36 @@ These control the **radio's own screen**, not the app's.
### Bluetooth Config
On **Settings → Device configuration → Bluetooth**, on radios with Bluetooth.
> ⚠️ **Important:** Saving this screen always reboots the radio.
| Setting | Description |
|---------|-------------|
| Bluetooth Enabled | Enable/disable BLE radio |
| Pairing Mode | Fixed PIN, Random PIN, or No PIN |
| Bluetooth enabled | Enable/disable BLE radio |
| Pairing mode | Fixed PIN, Random PIN, or No PIN |
| Fixed PIN | PIN code for pairing. Must be **exactly six digits** — the field rejects anything else |
### Security Config
On **Settings → Security**. The screen is grouped into cards: **Packet authenticity**, **Direct Message Key** (your node's key pair), **Admin Keys**, **Logs**, and **Administration**.
> ⚠️ **Important:** Saving this screen always reboots the radio.
| Setting | Description |
|---------|-------------|
| Public Key | Your node's public key (read-only) |
| Admin Key | Keys permitted to administer this node remotely — up to three |
| Private Key | Your node's private key (handle securely). Shown redacted when you are viewing another node over remote admin — the firmware does not send it |
| Regenerate Private Key | Issues a new keypair for this node, behind a confirmation. Every peer that knew your old key must learn the new one |
| Direct Message Key | The key used for direct-message encryption |
| ~~Admin Channel Enabled~~ | ⚠️ Removed — now configured automatically when an admin key is set |
| Debug Log | Output live debug logging over serial/bluetooth |
| Serial Enabled | Enable serial console access (moved from Device Config) |
| Serial console | Serial console over the Stream API |
| Debug log API enabled | Output live debug logging over serial, and view and export position-redacted radio logs over Bluetooth |
| Managed Mode | Restrict non-admin channel changes. Only selectable once an Admin Key is set |
| Backup Keys | Save an encrypted backup of the node's keys on this device (Android only) |
| Backup Keys | Save an encrypted backup of the node's keys on this phone (Android only, and only for your own node) |
| Restore Keys | Write the backed-up keys back to the node (available once a backup exists) |
| Delete Key Backup | Remove the stored key backup from this device |
| Protection Level | Packet authenticity — how unsigned or relayed packets are treated: **Strict**, **Balanced**, or **Compatible** (requires supporting firmware; Strict asks for confirmation) |
| Delete Key Backup | Remove the stored key backup from this phone |
| Protection level | How unsigned or relayed packets are treated: **Strict — Require authentication**, **Balanced — Prefer authenticated**, or **Compatible — Accept unsigned** (requires supporting firmware; Strict asks for confirmation) |
#### Lockdown Mode
@@ -220,7 +261,7 @@ Alongside the passphrase you set the limits that end a session automatically:
|---|---|
| Boots remaining | How many device boots the unlocked state survives |
| Hours until expiry | Wall-clock lifetime of the unlocked state |
| Session cap (minutes) | Maximum length of a single unlocked connection |
| Session cap (minutes) | A per-boot uptime cap on the unlocked state. 0, the default, means no cap |
Once active, the row reads *Active — storage encrypted, this connection authenticated* when
unlocked, or *Active — enter your passphrase to unlock this connection* when not. **Lock Now**
@@ -230,16 +271,6 @@ back-off before you can try again.
> ⚠️ **Warning:** There is no passphrase recovery. Losing it means erasing the device to get it
> back, which destroys its keys, channels and settings.
![Password field](../../assets/screenshots/settings_password_field.png)
Settings use standard preference controls — dropdowns, toggles, and sliders:
| Control | Screenshot |
|---------|------------|
| Dropdown | ![A dropdown setting, expanded to show its list of options](../../assets/screenshots/settings_dropdown.png) |
| Toggle | ![A toggle setting in the on position](../../assets/screenshots/settings_switch.png) |
| Slider | ![A slider setting with its current numeric value shown](../../assets/screenshots/settings_slider.png) |
## Related Topics
- [Settings — Modules & Admin](settings-module-admin) — optional feature modules and device administration
+11 -9
View File
@@ -2,7 +2,7 @@
title: How the Meshtastic Signal Meter Works
parent: User Guide
nav_order: 15
last_updated: 2026-08-29
last_updated: 2026-08-30
description: How the signal meter rates quality from SNR relative to the LoRa modem preset — spread spectrum, presets, and what the bars really mean.
aliases:
- signal
@@ -38,25 +38,27 @@ Because the rating is relative to the preset, the same SNR rates differently on
| Level | Bars | Criteria | Meaning |
|-------|------|----------|---------|
| Good | 3 | SNR above `limit` | Comfortably above the demodulation floor — a healthy connection. |
| Fair | 2 | less than 5.5 dB below `limit` | Decodable, but approaching the floor. |
| Bad | 1 | 5.5 dB to 7.5 dB below `limit` | At the edge of what the preset can recover. |
| None | 0 | more than 7.5 dB below `limit` | Far below the preset's floor; further packets from this node are likely to be lost. |
| Good | Full | SNR above `limit` | Comfortably above the demodulation floor — a healthy connection. |
| Fair | 3 | less than 5.5 dB below `limit` | Decodable, but approaching the floor. |
| Bad | 2 | 5.5 dB to 7.5 dB below `limit` | At the edge of what the preset can recover. |
| None | 1 | more than 7.5 dB below `limit` | Far below the preset's floor; further packets from this node are likely to be lost. |
The icon never goes blank, so count the bars carefully: a single bar means None, not a weak but usable link, and Good is a solid wedge rather than a set of bars. A gray three-bar icon labeled Unknown is a different state again — the packet carried no SNR measurement at all, which is not the same as measuring one and finding it too weak.
> ️ **Note:** Traceroute hop colors use fixed thresholds (7 dB / 15 dB); the per-node signal meter uses the preset-relative rating instead.
## Diagnosing Local Interference
A great RSSI paired with only one bar (Bad) points to local interference, not distance. A cheap power supply, a noisy computer, or a nearby transmitter can create enough static to drown out an otherwise strong signal.
A great RSSI paired with a one- or two-bar rating (None or Bad) points to local interference, not distance. A cheap power supply, a noisy computer, or a nearby transmitter can create enough static to drown out an otherwise strong signal.
## Where Signal Information Appears
In the app, signal data appears in several places:
- **Node list** — a signal-bars icon next to each node
- **Node detail** — SNR, RSSI, and signal quality in the device metrics section
- **Node list** — a signal-bars icon, shown only for nodes your radio heard directly. A node reached through a relay shows its hop count instead, because the SNR your radio measured describes the last hop, not the whole path
- **Node detail** — SNR, RSSI, and the quality word in the **Details** card at the top of the screen
- **Traceroute** — per-hop signal quality for each relay node
- **Signal metrics** — historical SNR and RSSI data in the metrics charts
- **Signal Quality** — historical SNR and RSSI data in the metrics charts
![Node list entry showing a Good signal rating: 12.5 dB SNR, 42 dBm RSSI, and the green signal-strength icon](../../assets/screenshots/nodes_signal_info.png)
+12 -7
View File
@@ -2,7 +2,7 @@
title: TAK Integration
parent: User Guide
nav_order: 10
last_updated: 2026-08-29
last_updated: 2026-08-30
description: Interoperate with ATAK and WinTAK — CoT position sharing, TAK roles, and plugin setup.
aliases:
- tak
@@ -26,8 +26,11 @@ The TAK module allows Meshtastic nodes to:
### Prerequisites
- ATAK (Android Team Awareness Kit), iTAK, or WinTAK installed
- Your node's **Role** (Device Config) set to **TAK** or **TAK Tracker** — this is what makes the
TAK module appear in Module Config at all
- Your node's **Device Role** (Device configuration) set to **TAK** or **TAK Tracker** — this is what makes the
TAK module appear in Module configuration at all
- Firmware 2.8.0 or newer on the radio. Earlier firmware accepts a TAK config write and never
stores it, so the app hides the TAK module entry below that version even when the role is set
correctly. See [Firmware Updates](firmware)
> ⚠️ **Warning:** The old **Meshtastic ATAK Plugin** is no longer part of this path and cannot
> work. It bridged through the cross-process AIDL API, which was removed in app 2.8.0; the mesh
@@ -36,8 +39,8 @@ The TAK module allows Meshtastic nodes to:
### Configuration
Navigate to **Settings → Module Config → TAK**. The module's own settings are your TAK identity —
there is no separate enable switch here, because the **Role** setting in Device Config is what
Navigate to **Settings → Module configuration → TAK**. The module's own settings are your TAK identity —
there is no separate enable switch here, because the **Device Role** setting in Device configuration is what
turns TAK on. Your node broadcasts this identity, which appears on TAK maps.
| Setting | Description |
@@ -53,7 +56,9 @@ name.
### Local TAK Server
The app can also run a **local TAK server** so ATAK/iTAK on the **same phone** can connect directly, without a remote TAK server. The server binds to localhost only (`127.0.0.1:8089`) and uses TLS with mutual certificate authentication (mTLS), so it is not reachable from other devices on the network. Open **Settings → Module Config → TAK → TAK Server**:
The app can also run a **local TAK server** so ATAK/iTAK on the **same phone** can connect directly, without a remote TAK server. The server binds to localhost only (`127.0.0.1:8089`) and uses TLS with mutual certificate authentication (mTLS), so it is not reachable from other devices on the network.
Open **Settings → Advanced → TAK Server**. These are app settings stored on this phone, which is why they sit next to **Firmware Update** and **Debug Panel** rather than under the TAK module config — and why they need neither a TAK role nor firmware 2.8.0:
![Local TAK Server settings with enable toggle and export option](../../assets/screenshots/tak_server_enabled.png)
@@ -105,7 +110,7 @@ Once configured:
| Problem | Cause | Solution |
|---------|-------|----------|
| Node doesn't appear on ATAK map | Wrong Role setting, or Mesh to CoT Converter off | Set the node's **Role** to TAK or TAK Tracker. For ordinary (non-TAK-role) nodes to appear, also enable **Mesh to CoT Converter** under the TAK Server settings |
| Node doesn't appear on ATAK map | Wrong Device Role setting, or Mesh to CoT Converter off | Set the node's **Device Role** to TAK or TAK Tracker. For ordinary (non-TAK-role) nodes to appear, also enable **Mesh to CoT Converter** under **Settings → Advanced → TAK Server** |
| Position updates are stale | GPS fix lost or interval too long | Check GPS status; reduce position broadcast interval in Position Config |
| ATAK shows "disconnected" | The local TAK server is off, or ATAK is pointed elsewhere | Check **Enable Local TAK Server** is on, and that ATAK is connecting to `127.0.0.1:8089` — re-import the exported data package if unsure |
| Shapes, markers, or routes not bridging | Sending node is on legacy V1 (firmware 2.7.x or older) | Update the sending node's firmware to 2.8.0+ for V2 wire format |
+24 -14
View File
@@ -2,7 +2,7 @@
title: Telemetry & Sensors
parent: User Guide
nav_order: 9
last_updated: 2026-08-29
last_updated: 2026-08-30
description: Sensor data on the mesh — supported environment, air quality, and power sensors, plus configuration and viewing guides.
aliases:
- sensors
@@ -23,8 +23,8 @@ All Meshtastic nodes report basic device telemetry:
|--------|-------------|---------------|
| Battery Level | Charge percentage | 0100% |
| Voltage | Battery voltage | 3.04.2V (LiPo) |
| Channel Utilization | % of airtime used locally | 0100% |
| Air Utilization TX | % of airtime used by this node | 0100% |
| ChUtil | % of local airtime in use | 0100% |
| AirUtil | % of the last hour this node spent transmitting | 0100% |
| Uptime | Seconds since last boot | Varies |
## Environment Sensors
@@ -66,6 +66,20 @@ Both appear as info cards on the node detail screen, next to the other environme
| VEML7700 | Ambient light (lux) |
| LTR390 | UV index |
### Weather and Other Readings
| Metric | Unit | Where it appears |
|--------|------|------------------|
| Wind speed | km/h or mph | Card and chart. Sensors report meters per second; the app converts to match your unit setting, and the chart uses the same unit as the card |
| Wind direction, gust, and lull | degrees, km/h or mph | Listed with each reading on the Environment Metrics screen; not charted |
| Rainfall, last hour and last 24 hours | mm or in | Listed with each reading on the Environment Metrics screen; not charted |
| Radiation | µR/h | Card and chart |
| Weight | kg or lb | Card only — load cells, such as a beehive scale |
| Distance | mm or in | Card only — water level, from a distance sensor |
| Dew point | °C or °F | Card only — computed from temperature and humidity |
| 1-Wire temperature | °C or °F | Card and chart, up to eight DS18B20-style probes |
| ADC voltage | V | Card and chart, up to eight raw analog channels |
## Power Metrics
Nodes with INA-series power sensors can report:
@@ -75,21 +89,21 @@ Nodes with INA-series power sensors can report:
| Voltage | Per-channel voltage reading |
| Current | Per-channel current draw, in mA |
Up to three sensor channels (ch1ch3) are reported, and each can be given its own label — Solar or Battery, say — from the node detail screen. There is no separate wattage reading; the app charts voltage and current, and does not compute power from them.
The node detail screen shows read-only cards for channels 1 to 3. Use the chart button on the **Power Metrics** row to open the chart screen, which lists a chip for every channel that reported data — up to eight — and charts the one you select. Rename a channel there, in the label field under the chips, to something like Solar or Battery. There is no separate wattage reading; the app charts voltage and current, and does not compute power from them.
Useful for monitoring solar charging or battery health on remote nodes.
## Configuring Telemetry
1. Navigate to **Settings → Module Config → Telemetry**.
1. Navigate to **Settings → Module configuration → Telemetry**.
2. Each metric group has its own enable toggle and its own interval:
- **Device Metrics** — battery, channel and airtime utilisation
- **Device Metrics** — battery, voltage, uptime, ChUtil, and AirUtil. Its enable toggle, **Send Device Telemetry**, appears only on firmware 2.7.12 and later; on older firmware you can change the interval but not turn the group off
- **Environment Metrics** — temperature, humidity, pressure and the other sensor readings
- **Air Quality Metrics** — particulate and CO₂ readings
- **Power Metrics** — the per-channel voltage and current readings
Environment metrics additionally have toggles to show the readings on the radio's own screen,
and to show them in Fahrenheit.
Environment and Power each have an extra toggle to show their readings on the radio's own
screen, and Environment has one more to show its temperatures there in Fahrenheit.
### Choosing an Interval
@@ -118,12 +132,8 @@ Air quality data can be viewed as info cards on the node detail screen, charted
## Viewing Telemetry
1. Navigate to **Nodes** and select a node.
2. Telemetry sections show on the detail screen:
- Device Metrics (always available)
- Environment Metrics (if sensors present)
- Power Metrics (if INA sensor present)
- Air Quality Metrics (if PM/CO₂ sensor present)
3. Historical graphs show trends over time.
2. The **Telemetry** section lists a row for every metric type — Device, Environment, Air Quality, Power, and the rest — whether or not this node has reported it. A row fills in with readings, and grows a chart button, once that node has actually sent that kind of telemetry. An empty row means nothing has arrived yet, not that the sensor is missing.
3. Use the chart button on a row to open that metric's history, where you can pick a time frame and export the readings as CSV.
![Node detail screen with the telemetry chart action menu open](../../assets/screenshots/node-metrics_telemetric_actions.png)
+6 -4
View File
@@ -2,7 +2,7 @@
title: Translate the App
parent: User Guide
nav_order: 17
last_updated: 2026-08-29
last_updated: 2026-08-30
description: How the app and its documentation are translated via Crowdin, and guidelines for contributing translations.
aliases:
- translate
@@ -20,7 +20,7 @@ The app and its in-app docs are translated on Crowdin — this page shows how to
|---|---|---|
| UI strings | `core/resources/src/commonMain/composeResources/values/strings.xml` | Buttons, labels, messages, and all user-visible text |
| User Guide pages | `docs/en/user/*.md` | In-app documentation shown in Help & Documentation |
| Fastlane metadata | `fastlane/metadata/android/en-US/` | App Store listing title, description, and changelogs |
| Fastlane metadata | `fastlane/metadata/android/en-US/` | Google Play listing title, description, and changelogs |
> ️ **Note:** Developer Guide pages are English-only. Code-focused documentation targeting contributors is not translated.
@@ -29,7 +29,7 @@ The app and its in-app docs are translated on Crowdin — this page shows how to
1. **Visit the Crowdin project.** Open the [Meshtastic Android Crowdin project](https://crowdin.com/project/meshtastic-android) and sign in or create a free account.
2. **Choose your language.** Select an existing language or request a new one by opening a [GitHub issue](https://github.com/meshtastic/Meshtastic-Android/issues/new).
3. **Translate strings.** Crowdin shows the English source on the left and your translation on the right. Translate each string and save.
4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. Approved translations are automatically merged into the next release.
4. **Review context.** Many strings include screenshots or context comments — check these to understand where the text appears in the app. A scheduled job pulls approved translations from Crowdin and opens a pull request; they ship once a maintainer merges it and a new build goes out.
> 💡 **Tip:** Keep translations short. UI strings often appear in buttons, chips, or narrow columns. If a translation is significantly longer than the English original, consider abbreviating where the meaning stays clear.
@@ -71,10 +71,12 @@ docs/
└── ...
```
Locale folders use the Android resource convention `{lang}-r{REGION}` (e.g. `fr-rFR`, `de-rDE`, `ja-rJP`), matching the `values-*` directories used for app strings.
Doc locale folders use Android locale qualifiers, either `{lang}` or `{lang}-r{REGION}` (for example `fr`, `fr-rFR`, `de-rDE`, `ja-rJP`). The `values-*` folders for app strings use bare language codes instead (`values-fr`, `values-de`, `values-ja`), because `crowdin.yml` writes strings with `%two_letters_code%` and doc pages with `%android_code%`. The two sets do not line up one-to-one.
The app automatically selects the correct locale based on your phone's **Language & Region** settings.
A page that came from Crowdin is labeled **Community translated** under its title in the app. If a page has no Crowdin translation for your language yet, the Google-flavor Android build machine-translates the English source on the fly and labels it **Auto-translated** instead; F-Droid and desktop builds show the English page. Your Crowdin translation replaces the machine one as soon as it lands.
## Translation Guidelines
- **Do not translate** technical terms like "LoRa", "MQTT", "BLE", "TAK", "SNR", or "RSSI" — these are universal.
+8 -8
View File
@@ -2,7 +2,7 @@
title: Units, Measurement & Locale
parent: User Guide
nav_order: 16
last_updated: 2026-08-29
last_updated: 2026-08-30
description: How the app formats temperature, distance, speed, and other measurements based on your device locale.
aliases:
- measurement
@@ -22,15 +22,15 @@ Meshtastic radios always transmit data in **metric units** (meters, °C, m/s, hP
On Android, your measurement preferences are determined by your system **Language & Region** settings. On Desktop (JVM), the app uses the JVM's default `Locale`.
Units follow your device's **region**, not the display language. Plain languages — like **English** in the app's own Language setting or Android's per-app language — keep the region your device is set to. A choice that names a region of its own, like **English (Canada)**, overrides it and brings that region's units with it. On Android 16+, the system-wide **Measurement system** preference overrides the region entirely.
Units follow your device's **region**, not the display language. Plain languages — like **English** in the app's own Language setting or Android's per-app language — keep the region your device is set to. A choice that names a region of its own, like **English (Canada)**, overrides it and brings that region's units with it. On Android 16+, the system-wide **Measurement system** preference overrides the region for distance, speed, and the other measurements — but not for temperature, which keeps following the region.
> 💡 **Tip:** By default there is nothing to configure — change your system measurement preferences and every screen in Meshtastic updates automatically. If your device offers no working region or measurement setting (some manufacturer builds don't), set **Settings → Units** in the app instead.
## The Radio's Own Screen Is Separate
**Device → Display → Units** configures the screen on the radio, not the app. So do **Use 12-Hour Clock** and **Always Point North** — all three apply to the radio's display only. Temperature on that screen has its own setting, [**Telemetry → Display Fahrenheit**](https://meshtastic.org/docs/configuration/module/telemetry#display-fahrenheit).
**Settings → Device configuration → Display → Display units** configures the screen on the radio, not the app. The **Use 12h clock format** and **Always point north** settings do too — all three apply to the radio's display only. Temperature on that screen has its own setting, **Environment metrics use Fahrenheit**, on the radio's Telemetry module — see the [Telemetry module reference](https://meshtastic.org/docs/configuration/module/telemetry#display-fahrenheit) on meshtastic.org.
If your node list shows miles while the radio's screen shows kilometres, this is why: the two are set in different places. Changing the radio's setting never alters what the app displays. See the [Display Config](https://meshtastic.org/docs/configuration/radio/display) guide on meshtastic.org for the device-side options.
If your node list shows miles while the radio's screen shows kilometers, this is why: the two are set in different places. Changing the radio's setting never alters what the app displays. See the [Display Config](https://meshtastic.org/docs/configuration/radio/display) guide on meshtastic.org for the device-side options.
## Temperature
@@ -58,7 +58,7 @@ Distances between nodes and GPS altitudes are transmitted as **meters** and auto
| Metric | 350 m | 2.5 km | 1,200 m |
| Imperial (US) | 1,148 ft | 1.6 mi | 3,937 ft |
The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometres or miles automatically.
The app uses natural scaling — short distances stay in meters or feet, while longer distances switch to kilometers or miles automatically.
### Where these appear
@@ -126,7 +126,7 @@ All timestamps throughout the app — last heard, message times, telemetry logs,
| **24-Hour Time** | Clock format | 14:30 vs 2:30 PM |
| **Date Format** | Date ordering | 09/05/2026 vs 05/09/2026 |
The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localised into your device language.
The app also uses **relative time** where it makes sense — for example, "5 min ago" or "2 hours ago" in the node list — which is automatically localized into your device language.
## Changing Your Measurement System
@@ -136,7 +136,7 @@ By default the app follows your device, and your measurement system (metric vs i
2. Change your **Region**
3. Return to Meshtastic — values update immediately
On Android 16+, the system-wide **Measurement system** preference overrides the region for every measurement. On Android 14+, temperature can be overridden on its own under **Regional preferences → Temperature**.
On Android 16+, the system-wide **Measurement system** preference overrides the region for distance, speed, and the other measurements — but not for temperature. Temperature is resolved separately, and on Android 14+ you override it on its own under **Regional preferences → Temperature**.
Not every English region is fully metric. **English (United Kingdom)** uses miles and feet for distance, so the node list shows miles and altitude in feet. For metric distances, set the app's **Units** setting to Metric (see [Overriding the Units in the App](#overriding-the-units-in-the-app)), or choose a fully metric region such as English (Canada), English (Ireland), or English (New Zealand).
@@ -146,7 +146,7 @@ Some phones do not offer the **Regional preferences** menu at all and list only
Not every device can express every preference — some manufacturer builds ship no regional preferences at all, some
offer only one English variant, and UK regions are imperial for distance even if you'd rather read altitude in
metres. For those cases the app has its own switch:
meters. For those cases the app has its own switch:
1. Open **Meshtastic Settings → Units**
2. Choose **System default**, **Metric**, or **Imperial**
+5 -3
View File
@@ -2,7 +2,7 @@
title: Home Screen Widget
parent: User Guide
nav_order: 20
last_updated: 2026-08-29
last_updated: 2026-08-30
description: Add the Meshtastic home screen widget to glance at your connected radio's local stats without opening the app.
aliases:
- widget
@@ -18,15 +18,17 @@ On Android, Meshtastic provides a home screen **widget** that shows live local s
The widget displays the **connected radio's** current local stats:
- A **node chip** across the top, carrying the radio's short name in its own colors
- **Battery** — the radio's battery level, or *Powered* when running on external power
- **ChUtil** — channel utilization (how busy the LoRa channel is, as a percentage)
- **AirUtil** — airtime utilization (how much of the duty cycle your radio is transmitting)
- **Traffic** — packets transmitted / received, and duplicates seen
- **Relays** — packets relayed and relay cancellations (shown when the radio is relaying)
- **Noise floor** — the measured background noise level
- **Dropped** — packets the radio discarded
- **Diagnostics** — a combined line carrying **Noise** (the background noise level in dBm), **Bad** (corrupt packets received), and **Dropped** (packets the radio discarded). Bad and Dropped appear only once they are above zero, so a quiet radio may show the noise reading alone
- **Heap** — free versus total memory on the radio, drawn as a bar
- **Nodes** — how many nodes are online, out of the total known
- **Uptime** — how long the radio has been running since its last reboot, shown beside Nodes
- **Updated** — the time the stats last refreshed, along the foot of the widget
Tap the widget to open the app, or use its refresh control to request fresh stats.
@@ -281,7 +281,7 @@ class DefaultDocBundleLoader : DocBundleLoader {
CoreRes.string.doc_keywords_nodes,
"en/user/nodes.html",
4,
listOf("node-list", "mesh-nodes", "peers"),
listOf("node-list", "mesh-nodes", "peers", "hop-histogram"),
3800,
"nodes",
),
@@ -301,7 +301,7 @@ class DefaultDocBundleLoader : DocBundleLoader {
CoreRes.string.doc_keywords_map,
"en/user/map-and-waypoints.html",
6,
listOf("map", "waypoints", "gps", "location"),
listOf("map", "waypoints", "gps", "location", "site-planner", "map-layers", "geojson", "kml"),
3600,
"map",
),
@@ -361,7 +361,15 @@ class DefaultDocBundleLoader : DocBundleLoader {
CoreRes.string.doc_keywords_discovery,
"en/user/discovery.html",
12,
listOf("discovery", "local-mesh-discovery", "mesh-discovery", "local-discovery", "network-scan"),
listOf(
"discovery",
"local-mesh-discovery",
"mesh-discovery",
"local-discovery",
"network-scan",
"traceroute",
"neighbor-info",
),
2800,
"discovery",
),
@@ -391,7 +399,7 @@ class DefaultDocBundleLoader : DocBundleLoader {
CoreRes.string.doc_keywords_signal_meter,
"en/user/signal-meter.html",
15,
listOf("signal-quality", "signal-strength", "rssi", "snr"),
listOf("signal", "signal-meter", "signal-quality", "signal-strength", "snr", "rssi"),
3500,
"signal-meter",
),
@@ -411,7 +419,7 @@ class DefaultDocBundleLoader : DocBundleLoader {
CoreRes.string.doc_keywords_translate,
"en/user/translate.html",
17,
listOf("crowdin", "localization", "language", "i18n", "contribute"),
listOf("translate", "crowdin", "localization", "language", "i18n", "contribute"),
3700,
"translate",
),
@@ -484,7 +492,7 @@ class DefaultDocBundleLoader : DocBundleLoader {
"en/developer/architecture.html",
1,
listOf("architecture", "kmp", "module", "layer", "core", "feature", "compose"),
listOf("layers", "module-architecture", "kmp"),
listOf("layers", "module-architecture", "kmp", "radio-control"),
4600,
"architecture",
),