Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions docs/en/developer.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ Things that trip up first-time contributors — check these before requesting re
Keep the last 5–8 entries and trim older ones from the bottom.
-->

**July 2026** — Map layer stack (`MapLayer.kt`, `MapLayersManager`, GeoJSON/KML import, Site Planner) extracted from the Google flavor into shared `androidApp/src/main` source (#6148) — F-Droid now renders imported overlays via a new OSMdroid-based renderer, so both flavors compile one implementation.

**July 2026** — [Persistence](developer/persistence) — Local Mesh Discovery sessions and cached `msh.to` device links now persist to Room (`DiscoverySessionEntity`, `DiscoveryPresetResultEntity`, `DiscoveredNodeEntity`, `DeviceLinkEntity`).

**June 2026** — [Architecture](developer/architecture) / [Codebase](developer/codebase) — Protos migrated from the `core/proto` git submodule to the `org.meshtastic:protobufs` Maven artifact; there is no longer a local proto module to build or sync.

**June 2026** — AIDL/`IMeshService` removed (#5586). The mesh service is now in-process only, driven entirely through `RadioController` — no cross-process binder, no `aidl` stubs.
Expand All @@ -46,9 +50,5 @@ Keep the last 5–8 entries and trim older ones from the bottom.

**June 2026** — [Persistence](developer/persistence) — FTS5 full-text message search (#5373): a `PacketFts` virtual table mirrors `Packet.messageText`, kept in sync by Room-managed triggers.

**May 2026** — [Measurement & Formatting](developer/measurement) — New page documenting the `MetricFormatter` API, locale-aware unit conversion patterns, and how to add new measurement types.

**May 2026** — [Testing](developer/testing) — Compose Preview Screenshot Testing (CST) integrated: `screenshot-tests/` module, `@PreviewTest` wrappers, CI validation, docs asset pipeline.

<!-- DEV_WHATS_NEW_END -->

4 changes: 2 additions & 2 deletions docs/en/developer/adding-a-feature-module.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: Adding a Feature Module
parent: Developer Guide
nav_order: 3
last_updated: 2026-05-13
last_updated: 2026-07-08
aliases:
- new-module
- feature-module
Expand All @@ -27,7 +27,7 @@ plugins {
}

kotlin {
androidLibrary { withHostTest { } }
android { withHostTest { isIncludeAndroidResources = true } }

sourceSets {
commonMain.dependencies {
Expand Down
9 changes: 4 additions & 5 deletions docs/en/developer/codebase.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: Codebase
parent: Developer Guide
nav_order: 2
last_updated: 2026-06-11
last_updated: 2026-07-08
aliases:
- repository-layout
- project-structure
Expand Down Expand Up @@ -60,10 +60,9 @@ Meshtastic-Android/
├── screenshot-tests/ # Compose Preview screenshot tests (visual-regression gate)
├── docs-screenshots/ # Doc-framed composition screenshots (generate-only, not CI-gated)
├── build-logic/ # Convention plugins and build helpers
│ ├── convention/
│ └── flatpak/
│ └── convention/
├── docs/ # Documentation source (markdown)
│ └── en/ # English sources (translations land in docs/{lang}/)
│ └── en/ # English source; other locales live under docs/<locale>/user/
│ ├── user/
│ └── developer/
├── gradle/ # Gradle wrapper and version catalog
Expand Down Expand Up @@ -96,7 +95,7 @@ All build files use Kotlin DSL (`.gradle.kts`). Configuration:

### Convention Plugins

Located in `build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/`:
Located in `build-logic/convention/src/main/kotlin/`:

| Plugin | Purpose |
|--------|---------|
Expand Down
6 changes: 3 additions & 3 deletions docs/en/developer/contributing.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: Contributing
parent: Developer Guide
nav_order: 8
last_updated: 2026-05-13
last_updated: 2026-07-08
aliases:
- contributing
- pull-request
Expand All @@ -29,12 +29,12 @@ Branches use conventional-commit style prefixes:
| `test/<scope>` | Test additions or fixes |
| `deps/<scope>` | Dependency updates |

Numeric spec prefixes (e.g., `003-app-docs-markdown`) are also valid for spec-driven work.
Timestamp-based spec prefixes (`YYYYMMDD-HHMMSS-feature-name`, as created by `/speckit.git.feature`) are also valid for spec-driven work.

Examples:
- `feat/desktop-ble-transport`
- `fix/bluetooth-reconnect`
- `003-app-docs-markdown`
- `20260601-074653-air-quality-telemetry`

## Development Workflow

Expand Down
1 change: 1 addition & 0 deletions docs/en/developer/measurement.md
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ Date and time formatting uses the `DateFormatter` `expect object` with platform-
| `formatTime()` | "2:30 PM" |
| `formatTimeWithSeconds()` | "2:30:45 PM" |
| `formatDate()` | "2026-05-13" |
| `formatDateTimeShort()` | "5/13/26 2:30 PM" |

Unlike `MetricFormatter`, `DateFormatter` is declared with `expect`/`actual` (an `expect object` in `commonMain`, an `actual object` per platform) because date formatting inherently depends on platform locale APIs.

Expand Down
6 changes: 4 additions & 2 deletions docs/en/developer/navigation-and-deep-links.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: Navigation & Deep Links
parent: Developer Guide
nav_order: 4
last_updated: 2026-07-01
last_updated: 2026-07-08
aliases:
- deeplinks
- navigation-3
Expand Down Expand Up @@ -57,8 +57,9 @@ https://meshtastic.org/{path} # App Link, android:autoVerify — also open
`adb shell am start -a android.intent.action.VIEW -d "meshtastic://meshtastic/{path}"` is the fastest way to
trigger any route below from a shell or automation script without touching the UI.

**Source of truth:** the exhaustive, always-current list of segments lives as KDoc on
**Source of truth:** the always-current list of segments lives in the `when` block in
[`DeepLinkRouter.route()`](../../../core/navigation/src/commonMain/kotlin/org/meshtastic/core/navigation/DeepLinkRouter.kt)
(the class-level KDoc above it is illustrative, not exhaustive)
and as executable spec in
[`DeepLinkRouterTest.kt`](../../../core/navigation/src/commonTest/kotlin/org/meshtastic/core/navigation/DeepLinkRouterTest.kt).
The table below is a snapshot for quick reference — check those two files if it looks out of date.
Expand All @@ -76,6 +77,7 @@ The table below is a snapshot for quick reference — check those two files if i
| `/settings/helpDocs` | `SettingsRoute.HelpDocs` | Docs browser |
| `/settings/helpDocs/{pageId}` | `SettingsRoute.HelpDocPage(pageId)` | Specific doc page |
| `/settings/help-docs` | `SettingsRoute.HelpDocs` | Compatibility alias |
| `/discovery` | `DiscoveryRoute.DiscoveryGraph` | Local Mesh Discovery entry point |
| `/settings/local-mesh-discovery/session/{sessionId}` | `DiscoveryRoute.DiscoverySummary(sessionId)` | Discovery session result |
| `/nodes` | `NodesRoute.Nodes` | Node list |
| `/nodes/{destNum}` | `NodesRoute.NodeDetail(destNum)` | Node detail |
Expand Down
6 changes: 5 additions & 1 deletion docs/en/developer/persistence.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: Persistence
parent: Developer Guide
nav_order: 6
last_updated: 2026-06-11
last_updated: 2026-07-08
aliases:
- room
- database
Expand Down Expand Up @@ -49,6 +49,10 @@ The primary structured data store:
| `DeviceHardwareEntity` | Cached device hardware catalog |
| `FirmwareReleaseEntity` | Cached firmware release info |
| `TracerouteNodePositionEntity` | Traceroute hop position data |
| `DiscoverySessionEntity` | A Local Mesh Discovery scan session (timestamp, presets scanned, home preset) |
| `DiscoveryPresetResultEntity` | Per-preset result within a discovery session |
| `DiscoveredNodeEntity` | Nodes found during a discovery preset scan |
| `DeviceLinkEntity` | Cached `msh.to` device links from the Meshtastic API |

> 💡 **Note:** Waypoints, telemetry, and channel data are stored within the `Packet` entity (using the `port_num` field to distinguish packet types) rather than in separate tables.

Expand Down
2 changes: 1 addition & 1 deletion docs/en/developer/transport.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ Serial communication over USB:
## TCP/IP

**Module:** `core:network`
**Platforms:** Android, Desktop, iOS
**Platforms:** Android, Desktop (iOS: code compiles, but there's no iOS app target or `RadioTransportFactory` yet — see Transport Factory below)

Network-based transport for WiFi-enabled radios:
- TCP socket connection to radio's IP address
Expand Down
12 changes: 6 additions & 6 deletions docs/en/user.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@ Documentation for using the Meshtastic Android and Desktop app.
Keep the last 5–8 entries and archive older ones by removing them.
-->

**July 2026** — [Map & Waypoints](user/map-and-waypoints) — Waypoints can now define a geofence: get notified when nodes enter or leave an area. Creator-only by default, with a per-geofence opt-in for others.

**July 2026** — [Map & Waypoints](user/map-and-waypoints) — Map Layers (import your own `.kml`/`.kmz`/GeoJSON overlays) and Site Planner (RF coverage estimation) are now available on F-Droid, not just Google Play.

**July 2026** — [Nodes](user/nodes) — Added a "Nodes per Hop" histogram showing how many nodes sit at each hop distance, filterable to a last-heard time window.

**July 2026** — [Messages & Channels](user/messages-and-channels) — Documented tap-to-open `@mentions` and on-device message translation (Google Play build only).

**July 2026** — [Node Metrics](user/node-metrics) — Air Quality now shows an EPA NowCast AQI reading and the CO₂ sensor's own temperature & humidity.
Expand All @@ -29,11 +35,5 @@ Keep the last 5–8 entries and archive older ones by removing them.

**June 2026** — [Home Screen Widget](user/widget) — New page covering the Android home screen widget that shows your connected radio's local stats at a glance.

**June 2026** — [Discovery](user/discovery) — Added the Local Mesh Discovery scanner: a dedicated mode that cycles your radio through LoRa presets, dwells on each to collect packets, and ranks which preset works best at your location.

**June 2026** — [Node Metrics](user/node-metrics) — Added Air Quality metrics (PM1.0, PM2.5, PM10, and CO₂ with severity color bands), a separate view from the BME680 IAQ reading.

**June 2026** — [Messages & Channels](user/messages-and-channels) — Added full-text message search within a conversation, with a result counter and previous/next navigation.

<!-- WHATS_NEW_END -->

6 changes: 3 additions & 3 deletions docs/en/user/connections.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: Connections
parent: User Guide
nav_order: 2
last_updated: 2026-06-25
last_updated: 2026-07-08
description: Connect your phone or desktop to a Meshtastic radio via Bluetooth, USB, or TCP/IP.
aliases:
- bluetooth
Expand Down Expand Up @@ -79,8 +79,8 @@ Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based co
1. Make sure the radio is on the same local network as your phone/desktop.
2. On the Connect screen, select the **Network** transport filter.
3. Choose the radio one of two ways:
- **Scan 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 Network Device Manually** — enter the radio's IP address (or hostname) and port (default: `4403`).
- **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 (long-press 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.
Expand Down
4 changes: 2 additions & 2 deletions docs/en/user/debug-logs.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: Debug Logs
parent: User Guide
nav_order: 22
last_updated: 2026-07-01
last_updated: 2026-07-08
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
Expand Down Expand Up @@ -44,7 +44,7 @@ Tap the **download** icon to save the current logs to a file. You choose where i

Attach that file to your GitHub issue.

> 🔒 **Privacy:** Exports automatically **redact** sensitive values such as channel keys and admin/session keys before writing the file. Even so, logs can 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, and session passkeys before writing the file. Channel PSKs are **not** redacted, and logs can also contain node names, positions, and other identifying details — glance through the file before sharing it publicly, and share privately if you have any doubt.

## Desktop

Expand Down
5 changes: 2 additions & 3 deletions docs/en/user/desktop.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ Bluetooth Low Energy is supported on Desktop via the [Kable](https://github.com/
| Map | ✓ | ◐ | Map tab exists on desktop, but the interactive map view is Android-only |
| Settings | ✓ | ✓ | Full parity |
| Bluetooth (BLE) | ✓ | ✓ | Via Kable on desktop |
| Firmware Update | ✓ | | Desktop supports in-app USB firmware update; BLE/Wi-Fi OTA is Android-only |
| Firmware Update | ✓ | | In-app USB, BLE, and Wi-Fi (ESP32) update all work the same as Android |
| Notifications | ✓ | ✓ | Native OS notifications |
| Widgets | ✓ | ✗ | Android-only |
| Android Auto | ✓ | ✗ | Android-only — not available on Desktop or iOS |
Expand Down Expand Up @@ -135,7 +135,6 @@ Requirements:

## Known Limitations

- Firmware updates over the air (BLE/Wi-Fi) are Android-only; on desktop, use the in-app USB update or the [Web Flasher](https://flasher.meshtastic.org)
- The interactive map view is Android-only — the Map tab is present but does not render a map on desktop
- Some Android-specific features (widgets, specific notification channels) are unavailable
- Performance may vary on low-spec hardware running Compose Desktop
Expand All @@ -144,7 +143,7 @@ Requirements:
## Related Topics

- [Connections](connections) — connection methods overview
- [Firmware Updates](firmware) — in-app USB update on desktop, or the [Web Flasher](https://flasher.meshtastic.org)
- [Firmware Updates](firmware) — USB, BLE, and Wi-Fi update all work the same as on Android

---

6 changes: 3 additions & 3 deletions docs/en/user/discovery.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: Discovery
parent: User Guide
nav_order: 12
last_updated: 2026-06-11
last_updated: 2026-07-08
description: Explore your mesh network — the Local Mesh Discovery scanner, traceroute paths, neighbor maps, and node discovery tools.
aliases:
- mesh-discovery
Expand Down Expand Up @@ -115,8 +115,8 @@ Each hop represents a relay node that forwarded the message. The SNR and RSSI va

| What to look for | What it means |
|------------------|---------------|
| All hops show Good SNR (> 5 dB) | Healthy path — messages flow reliably |
| One hop shows Bad SNR (< 0 dB) | Weak link — this relay segment is fragile |
| 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 |
| 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!) |

Expand Down
2 changes: 1 addition & 1 deletion docs/en/user/firmware.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Keep your Meshtastic radio up to date with the latest firmware for new features,

## Checking for Updates

1. Open the connected radio's configuration and, under **Advanced**, tap **Firmware Update** — or tap the firmware notification if one is shown. The entry appears only for OTA-capable devices.
1. Open the connected radio's configuration and, under **Advanced**, tap **Firmware Update**. The entry appears only for OTA-capable devices.
2. The app checks for available firmware versions.
3. Available updates show the version number and changelog summary.

Expand Down
35 changes: 29 additions & 6 deletions docs/en/user/map-and-waypoints.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,17 @@
title: Map & Waypoints
parent: User Guide
nav_order: 6
last_updated: 2026-06-25
description: View node positions on the map, create and share waypoints, and manage position sharing and privacy.
last_updated: 2026-07-08
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
- waypoints
- gps
- location
- site-planner
- map-layers
- geojson
- kml
---

# Map & Waypoints
Expand Down Expand Up @@ -52,19 +56,30 @@ Waypoints are shared geographic points of interest that all mesh members can see

| Property | Description |
|----------|-------------|
| Name | Short identifier (max 30 characters) |
| Name | Short identifier (max 29 characters) |
| Description | Optional longer description |
| Icon | Visual marker emoji on the map |
| Locked | If locked, only the creator can edit or delete |
| Expiration | Optional auto-remove time |
| Expiration | Optional auto-remove date and time |
| Geofence | Optional enter/exit alert area — see below |

### Waypoint Expiration

Waypoints can be set to expire automatically:
- **Never** (default) — waypoint remains until manually deleted
- **Timed** — waypoint is automatically removed after the specified duration (e.g., "remove after 2 hours"). Useful for temporary markers like rally points, hazards, or meeting locations.
- **Timed** — pick a specific date and time; the waypoint is automatically removed once that time passes. Useful for temporary markers like rally points, hazards, or meeting locations.

Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown begins when the waypoint is created, not when other nodes receive it.
Expired waypoints are automatically hidden from the map so they don't clutter the display. The expiration countdown is based on the absolute time you picked, not a duration from when the waypoint was created or received.

### Waypoint Geofences

Any waypoint can also define a **geofence** — an alert area — so you or others get notified when a node enters or leaves it:

1. Set a **geofence radius** from the preset chips (or **Off** to disable), or tap **Set area on map** to draw a custom rectangular area instead.
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.

### Managing Waypoints

Expand All @@ -73,6 +88,14 @@ Expired waypoints are automatically hidden from the map so they don't clutter th
- **Locked waypoints** cannot be modified or deleted by other nodes — only the original creator can change them
- Unlocked waypoints can be edited by any mesh member

## Map Layers

Tap the layers icon on the map to open **Manage Map Layers**, where you can import your own overlays in `.kml`, `.kmz`, or GeoJSON format — either by 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 is available on both the Google Play and F-Droid builds.

### 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.

## Position Sharing

### Enabling Position Sharing
Expand Down
Loading