Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
6b5c697
docs(home): tidy wording, explain transmit slots, update developer cr…
MrAlders0n Sep 29, 2026
eed3598
docs(onboarding): match the current onboarding wizard
MrAlders0n Sep 29, 2026
66a47a7
docs(mqtt): add native firmware guide, switch Python guide to meshcor…
MrAlders0n Sep 29, 2026
9179fb4
docs(multiregions): fact-check against the server and redraw the diagram
MrAlders0n Sep 29, 2026
66fc599
docs(map): rewrite layers, visuals and backbone against the current map
MrAlders0n Sep 29, 2026
d8bce11
docs(multibyte): App Path Bytes, per-repeater width tracking, ID grid
MrAlders0n Sep 29, 2026
dc2584b
docs(duplicates): document the collision rules and fix outdated claims
MrAlders0n Sep 29, 2026
ae746c0
docs(override): correct duplicate-detection override behaviour and lo…
MrAlders0n Sep 29, 2026
65f0355
docs(leaderboards): match current boards (Pioneers, Explorers, admins…
MrAlders0n Sep 29, 2026
ff964cf
docs(admin): fix admin list bot reply, webhook events and failure beh…
MrAlders0n Sep 29, 2026
7066a23
docs(support): fix menu paths, Ambiguous wording, Visualize Live, bot…
MrAlders0n Sep 29, 2026
f0a24f9
docs(community): update awards, portal and embedding for current beha…
MrAlders0n Sep 29, 2026
fe0416e
docs(api): correct limits, priorities, errors and field meanings; fix…
MrAlders0n Sep 29, 2026
5f54afe
docs: fix FAQ onboarding/colours/boundary answers, broker badges, and…
MrAlders0n Sep 29, 2026
ca32e01
docs(privacy): match what is actually collected, retained and shared
MrAlders0n Sep 29, 2026
255a92a
docs(readme): describe the wiki and how to build it
MrAlders0n Sep 29, 2026
3bda7f4
docs(admins): rewrite the admin panel guide to match the current panel
MrAlders0n Sep 29, 2026
85e5df0
docs(app): verify overview, getting started and tabs against the app
MrAlders0n Sep 29, 2026
3bc3351
docs(app): verify how it works, troubleshooting and third-party API a…
MrAlders0n Sep 29, 2026
0af8ed2
docs(app): verify modes, settings and connection guide against the app
MrAlders0n Sep 29, 2026
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
18 changes: 17 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,17 @@
# MeshMapper_Wiki
# MeshMapper Wiki

Source for [wiki.meshmapper.net](https://wiki.meshmapper.net), the documentation for MeshMapper, built with [MkDocs Material](https://squidfunk.github.io/mkdocs-material/).

## Editing

Pages live in `docs/` and the sidebar is defined by `nav` in `mkdocs.yml`. Link between pages with relative links (e.g. `[Backbone](backbone.md)`) so broken links are caught by the build.

## Building Locally

```bash
pip install mkdocs-material mkdocs-macros-plugin pyyaml mkdocs-glightbox pymdown-extensions
mkdocs serve # preview at http://127.0.0.1:8000
mkdocs build --strict # same check the deploy runs
```

Pushing to `main` builds and deploys the site to GitHub Pages.
4 changes: 3 additions & 1 deletion docs/administratorlist.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Tag the MeshMapper bot in the MeshMapper Discord server:
@MeshMapper !admins YOW
```

Or just ask in natural language — `@MeshMapper who runs YOW?` works too. The bot replies with the region's administrators and their contact information. See [Bot Commands](botcommands.md) for more.
Or just ask in natural language — `@MeshMapper who runs YOW?` works too. The bot replies with the names of the region's administrators. For contact details, use **Region Info** on the region's map. See [Bot Commands](botcommands.md) for more.

## Still Can't Reach Anyone?

Expand All @@ -37,4 +37,6 @@ If a region's administrators are unavailable or unresponsive, tag a `@Moderator`
* **Global Administrator**: Moderator access across all regions.
* **Region Administrator**: Access to specific geographic regions.

Region administrators can invite another admin for their region from the **Admins** tab of the admin panel. The invite is emailed and expires after 7 days.

Want to become an administrator for your region? See the [FAQ](faq.md#administration) and [Onboarding](onboarding.md) pages.
629 changes: 344 additions & 285 deletions docs/admins.md

Large diffs are not rendered by default.

127 changes: 85 additions & 42 deletions docs/app_connection_guide.md

Large diffs are not rendered by default.

76 changes: 43 additions & 33 deletions docs/app_getting_started.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
# Getting Started

Welcome to MeshMapper, a community-driven wardriving app for MeshCore mesh network devices. MeshMapper lets you connect to a MeshCore radio over Bluetooth, send GPS-tagged pings across the mesh, and contribute coverage data to the [MeshMapper community map](https://meshmapper.net/).
Welcome to MeshMapper, a community-driven wardriving app for MeshCore mesh network devices. MeshMapper connects to your MeshCore radio, sends pings across the mesh, and adds what it hears to the [MeshMapper community map](https://meshmapper.net/). Your location goes only to the MeshMapper server; by default, pings on the air carry an anonymous token, not your coordinates.

---

## What You Need

1. **A MeshCore-compatible radio device**
— Any device that supports MeshCore will work with MeshMapper. It is recommended to run up-to-date firmware on your device, as some features require v1.14.0 or newer.
2. **A phone or computer** — Android, iOS, or a Chromium-based browser (Chrome or Edge)
3. **GPS/location services** enabled on your device
4. **Bluetooth** enabled on your device
2. **An Android or iOS phone**
3. **GPS/location services** enabled on your phone
4. **Bluetooth** enabled on your phone (or use TCP or USB instead, see below)

---

Expand All @@ -24,88 +24,97 @@ Welcome to MeshMapper, a community-driven wardriving app for MeshCore mesh netwo

**Beta releases:**

In the MeshMapper Discord server, open **Channels & Roles** and select **Yes** for beta testing. Then choose your platform:
To hear about betas, join the MeshMapper Discord server, open **Channels & Roles**, and opt in to beta testing. Then choose your platform:

- **iOS:** [Join the beta in TestFlight](https://testflight.apple.com/join/PXxfr5Jr).
- **Android:** [Download the beta APK from GitHub](https://github.com/MeshMapper/MeshMapper_Project/releases/), or [add MeshMapper to Obtainium](https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/%7B%22id%22%3A%22net.meshmapper.app%22%2C%22url%22%3A%22https%3A%2F%2Fgithub.com%2FMeshMapper%2FMeshMapper_Project%22%2C%22author%22%3A%22MeshMapper%22%2C%22name%22%3A%22MeshMapper%22%2C%22preferredApkIndex%22%3A0%2C%22additionalSettings%22%3A%22%7B%5C%22includePrereleases%5C%22%3Atrue%2C%5C%22fallbackToOlderReleases%5C%22%3Atrue%7D%22%2C%22overrideSource%22%3A%22GitHub%22%7D) to follow prereleases.

**Web (Chrome/Edge only):**

- [wd.meshmapper.net](https://wd.meshmapper.net)
- Requires Chrome or Edge (Safari is not supported, it lacks the Web Bluetooth API)

!!! note
The web app is experimental and has not been widely tested. It should be technically stable, but the mobile apps are the recommended experience.

---

## First Launch

When you first open MeshMapper, you will see a **location disclosure dialog** explaining why the app needs GPS access. This dialog explains that MeshMapper collects your location to:
When you first open MeshMapper, you will see a **Location Access Required** dialog explaining why the app needs GPS access. It says MeshMapper collects your location to:

- Track where you send pings on the mesh network
- Map coverage areas for the community
- Record which repeaters hear your device

It also discloses that your location data is uploaded to the MeshMapper API and displayed on public coverage maps at meshmapper.net. If you prefer to be more anonymous, enable the Anonymous Mode feature in Settings, or wardrive in Offline Mode and never upload your sessions.
It also explains that your location data is uploaded to the MeshMapper API and used for the public coverage maps at meshmapper.net, and that Offline Mode stores data on your phone without uploading it.

!!! info "What is a 'ping'?"
Throughout MeshMapper, "ping" refers to any packet the app sends out on the mesh. This includes channel messages (TX), discovery requests (DISC), and trace requests (TRC). Each type works differently, but they are all "pings."

After tapping **Continue**, your phone will ask for location permission. Grant "While Using the App" at minimum.

!!! warning "iOS Background Location"
If you want to run MeshMapper in the background on iOS (e.g., wardriving with the screen off), you need to manually enable "Background Location" under Settings > General in MeshMapper. Apple restricts apps from requesting background location directly, so the user must enable it themselves. Without this, iOS will throttle or stop GPS updates when the app is not in the foreground.
Next, a **Welcome to MeshMapper** prompt offers a short tour. Tap **Start Guide** to open the **Quick Guide**, 12 short pages ("Page X of 12") covering connecting, online vs offline, privacy, the antenna setting, CARpeaters, background use, modes, Smart Pinging, map controls, results, your account, and getting help. Tap **Skip Guide** to skip it. You can reopen it any time from **Settings > About & Support > Quick Guide**.

!!! tip "Privacy options"
Two privacy settings live under **Settings > Wardriving > Privacy**:

- **Anonymous Mode** renames your radio to "Anonymous" for mesh pings and keeps you off the public leaderboard. It hides your name only: your radio's public key is still used to sign in, and your sessions are still recorded against it.
- **Broadcast My Coordinates** is off by default, so your coordinates are sent only to the MeshMapper server, not over the air.

You can also wardrive in Offline Mode and never upload your sessions.

!!! warning "Wardriving in the background"
To keep wardriving on iOS with the screen off or the app in the background, turn on **Background Location** under Settings > General in MeshMapper and allow location access **Always**. Without it, iOS may slow or stop GPS updates when the app is not in the foreground. Android needs no extra location permission, but some phones pause apps when the screen is off; if that happens, set MeshMapper's battery usage to **Unrestricted** in Android settings.

---

## Connecting to Your Radio

1. **Navigate to the Connect tab** (the Bluetooth icon in the bottom navigation bar)
2. **Make sure your radio is powered on** and nearby
3. **Tap "Scan for Devices"** to start a Bluetooth scan. Your MeshCore device should appear in the list within a few seconds.
3. **Tap "Scan"** at the bottom of the screen to start a Bluetooth scan. Your MeshCore device should appear in the list within a few seconds. Scan only works when you are inside a MeshMapper zone (or in Offline Mode).
4. **Tap your device** to begin the connection process

The app runs a **9-step connection sequence** automatically:

| Step | What Happens |
|------|-------------|
| 1. Connecting to device | Establishes a BLE connection to your radio |
| 1. Connecting to device | Opens the Bluetooth, TCP, or USB link to your radio |
| 2. Protocol handshake | Verifies the app and firmware can communicate |
| 3. Querying device info | Retrieves your device's manufacturer string and public key (required for API auth) |
| 4. Identifying device | Matches your radio against the device database to determine model and TX power |
| 5. Syncing time | Synchronizes your radio's clock with your phone |
| 6. Acquiring API session | Authenticates with the MeshMapper API, gets zone info and regional settings |
| 7. Setting up channel | Creates the #wardriving channel on your radio |
| 8. Initializing GPS | Waits for a GPS lock on your phone |
| 6. Acquiring API slot | Authenticates with the MeshMapper API, gets zone info and regional settings |
| 7. Setting up channel | Makes sure the #wardriving channel exists on your radio |
| 8. Initializing GPS | Starts GPS tracking on your phone |
| 9. Connected | Ready to wardrive |

Once complete, the Connect tab icon turns **green** and the label changes to "Connected."

!!! tip
MeshMapper remembers your last connected device. On future launches, you can tap the remembered device to reconnect quickly without scanning.
MeshMapper remembers your last connected device. On future launches, the **Last Connected Device** card lets you tap **Reconnect** without scanning (or **Forget** it).

!!! note "Not just Bluetooth"
Bluetooth is the standard way to connect, but the Connect tab also supports **TCP** (network-attached radios, Android/iOS) and **USB Serial** (Android via OTG cable, or Chrome/Edge on the web). See the [Connection Guide](app_connection_guide.md) for details.
Bluetooth is the standard way to connect, but the Connect tab also supports **TCP** (network-attached radios, such as a Wi-Fi companion) and **USB** (Android only, via an OTG cable). Pick BLE, TCP, or USB in the bar at the bottom of the Connect tab. See the [Connection Guide](app_connection_guide.md) for details.

---

## Your First Ping

Before you can send a ping, two things need to be set:

1. **External antenna** — On the Map tab, the Controls panel asks "External Antenna?" Tap **Yes** or **No**.
- This is required before any pings can be sent
- Select **Yes** if your antenna has a clear, unobstructed path to the sky (e.g., mag-mount on a car roof, antenna outside a window)
- Select **No** if your radio is inside a vehicle (cup holder, dash), inside a bag, or otherwise obstructed by metal or walls
- The key distinction is whether the signal is obstructed, not just whether it is an external antenna. Being inside a metal car significantly reduces range.
- This matters because the coverage map needs accurate data about signal conditions
1. **External antenna** — On the Map tab, the Controls panel has an **External Antenna** switch with **No** and **Yes** (in landscape it is labelled **Antenna**, with **Internal** and **External**).
- This is required before any pings can be sent (the panel shows "Select antenna option" until you choose)
- Select **No** (Internal) if the antenna is inside a metal vehicle cabin, a metal box, or another enclosure that reduces reception, e.g. the radio and antenna are inside the car
- Select **Yes** (External) if nothing like that blocks the antenna, e.g. a roof-mounted antenna, a handheld radio, or walking with the radio in your pocket
- This does not change your radio or its power. It records how the antenna was set up so the coverage data can be read correctly.
- The app remembers your choice for each radio

2. **Coverage zone** — The status bar shows your zone status:
- Green zone code (like "YOW") = you are in a zone and TX is allowed
- Red zone code = you are in a zone but TX is at capacity (Passive Mode only)
- Orange dash = you are outside any zone (or GPS is still searching)
- Blue zone code = your region has flood traffic turned off (Passive and Trace only)
- Grey zone code = you are in a zone but not yet connected
- Orange dash = you are outside any zone
- Orange "GPS..." = GPS is still searching

If your device model was not recognised, you may also need to pick a power level on the Connect tab (the panel says "Select power level in Connect tab").

!!! note "Flood traffic"
Send Ping, Active Mode, and Hybrid Mode send flood traffic, so they only appear when your region allows it. Regions that have not been set up yet have flood traffic turned off by default. When flood traffic is off, or the zone is at capacity, those buttons are hidden and only Passive and Trace are available.

Once both are set, tap **Send Ping**:

Expand All @@ -116,6 +125,7 @@ Once both are set, tap **Send Ping**:
- The app listens for **5 seconds** to see which repeaters echoed your message back
- On the backend, MeshMapper uses **MQTT observers** that also listen to the #wardriving channel. If an observer receives your message, the backend marks that ping as **bidirectional (bidir)**
- Results appear as markers on the map and entries in the Log tab
- After a manual ping, Send Ping has a 15-second cooldown

---

Expand All @@ -126,7 +136,7 @@ The status bar sits below the app bar on the Map tab:
- **Zone chip** (left): Zone code when in coverage, dash when outside, "GPS..." while acquiring. Tap for details.
- **TX**: Channel messages sent (flood the mesh, or scoped if your region has a scope set)
- **RX**: Mesh packets passively received
- **DISC**: Discovery requests sent
- **DISC**: Discovery requests that got a response
- **TRC**: Successful trace responses
- **Upload**: Pings successfully uploaded to MeshMapper servers

Expand All @@ -136,7 +146,7 @@ Tap any stat chip to see a description of what it means.

## What Happens to Your Data

Every ping you send (TX), mesh packet you passively receive (RX), and discovery response (DISC) is queued for upload to the MeshMapper API. The app batches these uploads (up to 50 at a time) and sends them automatically. You can see the current queue size in Settings under "Data > Queued Pings."
Every ping you send (TX), mesh packet you passively receive (RX), discovery response (DISC), and trace result (TRC) is queued for upload to the MeshMapper API. The app batches these uploads (up to 50 at a time) and sends them automatically. In Offline Mode nothing is uploaded until you upload the saved session yourself from Settings > Data. You can see the current queue size in Settings under "Data > Queued Pings."

Your data contributes to the community coverage map at [meshmapper.net](https://meshmapper.net/), helping everyone understand where MeshCore mesh coverage exists.

Expand Down
Loading
Loading