Skip to main content

A tool to scan and map meshcore network graphs

Project description

meshmap

A tool for scanning and mapping meshcore radio networks. It discovers nearby nodes, logs in to each reachable repeater to enumerate its neighbours, and builds a graph of the network — including GPS coordinates where available.

Install

Requires Python 3.12+ and uv.

# Install uv (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh

# Clone and install
git clone https://github.com/mangelajo/meshmap
cd meshmap
uv sync

The meshmap command is then available via uv run meshmap.

Usage

All commands require -p to specify the serial port of your connected device.

meshmap -p PORT [OPTIONS] COMMAND

Global options (apply to all commands):

Flag Description
-p, --serial-port Serial port (e.g. /dev/ttyUSB0, COM3)
--sniff Print decoded RF packets in real time
--sniff-key PATH Private key file for decryption (repeatable)
-d, --debug Low-level meshcore debug output

Commands

explore — map the network graph

The main command. Discovers 0-hop repeaters, then recursively logs in to each one to fetch its neighbour list, building a full network graph. Saves to a JSON file after each node so it can be paused and resumed.

# First scan
uv run meshmap -p /dev/ttyUSB0 explore

# Resume a previous scan, open live visualisation in browser
uv run meshmap -p /dev/ttyUSB0 explore --resume --serve

# Re-visit already-explored nodes to refresh SNR data
uv run meshmap -p /dev/ttyUSB0 explore --resume --refresh

# Retry nodes that failed on the last run
uv run meshmap -p /dev/ttyUSB0 explore --resume --retry

# Limit exploration to 3 hops, save to a custom file
uv run meshmap -p /dev/ttyUSB0 explore --depth 3 -o my-network.json

# Full run with live packet sniffing and web visualisation
uv run meshmap -p /dev/ttyUSB0 --sniff --sniff-key mykey.txt explore --serve --resume

The web visualisation (--serve) is available at http://localhost:8080 and auto-refreshes every 3 seconds while the scan runs.

Option Default Description
-o, --output meshmap-graph.json Output file
--resume off Load existing graph, skip already-visited nodes
--refresh off Re-queue already-visited nodes (oldest first)
--retry off Re-queue nodes whose last visit failed
--serve off Start web visualisation server
--port 8080 Web server port
--depth 5 Max BFS hop depth
-w, --wait-time 10.0 Seconds to wait for 0-hop discovery responses

discover-repeaters — list nearby repeaters

uv run meshmap -p /dev/ttyUSB0 discover-repeaters

get-neighbours — inspect a single repeater

Log in to one repeater and print its neighbour list.

uv run meshmap -p /dev/ttyUSB0 get-neighbours

sniff — decode RF packets

Listen and decode raw RF traffic for a given duration.

uv run meshmap -p /dev/ttyUSB0 sniff 30
uv run meshmap -p /dev/ttyUSB0 sniff 60 --key mykey.txt

contacts — list known contacts

uv run meshmap -p /dev/ttyUSB0 contacts

scan — quick 0-hop node scan

uv run meshmap -p /dev/ttyUSB0 scan

Graph file format

The graph is saved as JSON and can be loaded by external tools:

{
  "version": 1,
  "last_updated": "2026-02-17T12:00:00+00:00",
  "nodes": {
    "<pubkey>": {
      "public_key": "...", "name": "My Repeater",
      "node_type": "repeater", "lat": 40.4, "lon": -3.7,
      "depth": 1, "last_visited": "...", "visit_failed": false
    }
  },
  "edges": [
    { "node_a": "...", "node_b": "...", "snr_a_hears_b": 12.5, "snr_b_hears_a": 9.0, "last_seen": "..." }
  ]
}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

meshmap-0.1.0.tar.gz (69.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

meshmap-0.1.0-py3-none-any.whl (58.9 kB view details)

Uploaded Python 3

File details

Details for the file meshmap-0.1.0.tar.gz.

File metadata

  • Download URL: meshmap-0.1.0.tar.gz
  • Upload date:
  • Size: 69.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.22

File hashes

Hashes for meshmap-0.1.0.tar.gz
Algorithm Hash digest
SHA256 dfb86aa0cc8d1540d0e42ecfce9bb21e7574b6a9a9605bbea9d1f35283c79b20
MD5 fe0098941d60d9646605cce228aa8f6f
BLAKE2b-256 94eeb8f8d95f425d1c798605604bf33150fb789ddaacad449be29977fe9a9d63

See more details on using hashes here.

File details

Details for the file meshmap-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: meshmap-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 58.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.22

File hashes

Hashes for meshmap-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a9f717a07cb86bd4fa6847c4d2fa8ca108a61abbe8762a48aeaeddad38646620
MD5 df9232b6b50032e7571fa3c8b961f81e
BLAKE2b-256 429944c28133679bed5ccb92dbbf0dfca39c65f02e52950aa6e141784e42b727

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page