Step-by-step instructions for building and deploying a Meshpoint: from an empty Raspberry Pi to a fully operational node feeding data to the Meshradar cloud platform.
A Meshpoint is an edge device that:
- Listens to Meshtastic traffic on 8 LoRa channels simultaneously via an SX1302/SX1303 concentrator
- Sends and receives Meshtastic messages directly from the browser dashboard (native TX via the concentrator)
- Optionally monitors MeshCore traffic via a USB companion radio
- Decodes, stores, and visualizes packets on a real-time dashboard with full chat UI, node discovery, and radio configuration
- Ships data upstream to the Meshradar cloud platform for regional mesh intelligence
You need a Raspberry Pi 4 with an SX1302 or SX1303 LoRa concentrator. The easiest paths are buying a pre-built unit (RAK Hotspot V2 or SenseCap M1) and reflashing the SD card.
| Component | Purpose | Notes |
|---|---|---|
| Raspberry Pi 4 (1-2GB RAM) | Host computer | 1GB works, 2GB recommended for future updates |
| SX1302/SX1303 Concentrator | Multi-channel LoRa RX + TX | RAK2287 (SX1302) or Seeed WM1303 (SX1303) |
| Carrier board / Pi HAT | Mounts the concentrator to the Pi | RAK Pi HAT, SenseCap M1 carrier, or WM1302 Pi HAT |
| microSD card (32GB) | Boot drive | Class 10 or better |
| USB-C power supply (5V 3A) | Power | Official Pi PSU recommended |
| LoRa antenna (906 MHz) | RX + TX | 10 dBi gain recommended for US915 band |
| Ethernet cable or WiFi | Network connectivity | Needed for cloud uplink |
| Optional: MeshCore USB companion | MeshCore traffic monitor | Heltec V3/V4 or T-Beam with USB companion firmware |
| Unit | Concentrator | Price Range | Notes |
|---|---|---|---|
| RAK Hotspot V2 (RAK7248) | RAK2287 (SX1302) | $30-70 on eBay | Pi 4 + metal enclosure + antenna, usually 32GB SD card (more than enough for our usage) |
| SenseCap M1 | WM1303 (SX1303) | $30-60 on eBay | Pi 4 + metal enclosure + antenna, may include 64GB SD card |
RAK2287 vs SenseCap M1: The RAK2287's SPI bus can latch if power is cut while the concentrator is active. The Meshpoint service includes a GPIO reset script that holds the concentrator in reset during shutdown, making
sudo rebootandsudo systemctl restart meshpointsafe. However, hard power loss (yanked cable, power outage) can still latch the SPI bus — requiring a full power unplug (10+ seconds) to clear. Repeated hard power loss can permanently damage the SX1250 radio. The SenseCap M1 does not have this issue. For deployments with unreliable power, the SenseCap M1 is recommended, or add a small UPS (PiSugar, USB battery with passthrough).
RAK Hotspot V2: remove 4 bottom screws to access the SD card. SenseCap M1: remove 2 screws on the back panel (opposite the Ethernet/antenna ports) -- the SD card may be held down with kapton tape.
- A computer with an SD card reader (for flashing)
- SSH client (PuTTY on Windows, or built-in terminal on Mac/Linux)
- A Meshradar account (free: create one before starting)
-
Download Raspberry Pi Imager on your computer.
-
Insert the microSD card.
-
Open Raspberry Pi Imager and choose:
- OS: Raspberry Pi OS Lite (64-bit) -- the headless version without a desktop
- Storage: Your microSD card
-
Click the gear icon (or Ctrl+Shift+X) to open Advanced Options:
- Enable SSH: Check the box, select "Use password authentication"
- Set username and password: Choose a username (e.g.
pi) and a strong password - Configure WiFi (if not using Ethernet): Enter your SSID and password
- Set locale: Choose your timezone and keyboard layout
-
Click Write and wait for it to finish.
-
Insert the SD card into the Raspberry Pi. Do not power it on yet.
Enclosed units: RAK Hotspot V2 -- remove 4 bottom screws. SenseCap M1 -- remove 2 screws on the back panel (opposite the Ethernet/antenna ports); SD card may be taped down with kapton tape. After flashing, re-insert the card and reassemble.
If using a pre-built unit (RAK Hotspot V2 or SenseCap M1): The concentrator is already seated. Just connect the LoRa antenna to the SMA connector and insert the flashed SD card. For SenseCap M1, USB-C power plugs into the carrier board (not the Pi's own USB-C port).
If building from parts:
- Seat the concentrator module (RAK2287 or WM1303) into the mPCIe slot on the carrier board.
- Connect the LoRa antenna to the SMA port. Never power the concentrator without an antenna connected -- this can damage the radio.
- If your carrier board has a GPS module and you have a GPS antenna, connect it to the u.FL connector.
- Mount the carrier board onto the Raspberry Pi's GPIO header.
- If using a MeshCore USB companion, connect it to one of the Pi's USB ports.
- Connect Ethernet (if not using WiFi).
- Connect the power supply.
The Pi should boot and connect to your network within 1-2 minutes.
Option A: Check your router's DHCP client list for a device named raspberrypi (or whatever hostname you set).
Option B: Use nmap from your computer:
nmap -sn 192.168.1.0/24Replace 192.168.1.0/24 with your local subnet.
ssh pi@<your-pi-ip-address>Enter the password you set during imaging.
sudo apt update && sudo apt install -y git
sudo git clone https://github.com/KMX415/meshpoint.git /opt/meshpoint
sudo bash /opt/meshpoint/scripts/install.shThe install script handles everything: system packages, SPI/UART/GPS kernel configuration, building the LoRa concentrator driver with Meshtastic TX patches, Python virtual environment, dependencies, systemd service, and permissions setup.
This takes 5-15 minutes depending on your internet speed and Pi model.
The SPI and UART kernel changes require a reboot:
sudo rebootWait 30-60 seconds, then SSH back in.
- Go to meshradar.io in your browser
- Sign up and verify your email
- Go to Account > API Keys
- Click Generate New Key
- Copy the key immediately -- it is only shown once
sudo meshpoint setupNote:
sudois required — the wizard writes to/opt/meshpoint/config/local.yamlwhich is owned by root.
The wizard walks you through these steps:
- Hardware Detection -- probes for concentrator, carrier board, GPS, serial radios, USB MeshCore devices
- Frequency Region -- select your Meshtastic region (US, EU_868, ANZ, IN, KR, SG_923). The concentrator auto-tunes to the correct frequency
- Capture Source -- auto-selects concentrator, serial, or mock. If a MeshCore USB companion is detected, offers to enable it and configure its radio frequency to match your region
- MQTT -- optional MQTT publishing to community brokers and Home Assistant
- API Key -- paste your Meshradar API key
- Device Name -- give it a recognizable name (e.g. "Meshpoint Rooftop")
- Location -- use GPS fix or enter lat/lng manually (right-click Google Maps to copy)
- Node Identity -- a unique random Meshtastic node ID, long name, and short name are auto-generated. You can customize these later from the Radio settings page on the dashboard
- Device ID -- auto-generated unique identifier for cloud registration
The wizard writes config/local.yaml and offers to start the service.
After setup: TX is disabled by default. Enable it from the dashboard Radio settings page once you've verified RX is working.
meshpoint statusCheck the local dashboard at http://<your-pi-ip>:8080. You should see:
- Map showing your device's location and discovered nodes
- Packet feed with live Meshtastic and MeshCore traffic (once LoRa devices are in range)
- Messaging tab for sending and receiving Meshtastic messages (enable TX in Radio settings first)
- Nodes grid with cards for every discovered node: name, signal, hardware, battery
- Radio settings page to configure region, modem preset, frequency, TX, and channels
- Signal charts and traffic analytics
- System metrics: CPU, RAM, disk, temperature
Check the cloud dashboard at meshradar.io. Your Meshpoint should appear as a green dot in the fleet view within a minute.
A MeshCore USB companion gives your Meshpoint the ability to monitor MeshCore mesh traffic alongside Meshtastic. It's a single-channel radio that listens on one frequency -- all standard MeshCore traffic in your region uses the same frequency, so the regional preset covers everything.
A Heltec or T-Beam board flashed with USB Serial Companion firmware. Supported devices include:
| Device | Notes |
|---|---|
| Heltec LoRa V3 | ESP32-S3, common and inexpensive |
| Heltec LoRa V4 / V4 OLED | ESP32-S3, latest Heltec revision |
| LilyGo T-Beam | ESP32, includes GPS |
| Heltec Wireless Tracker | ESP32-S3, includes GPS and display |
- Go to flasher.meshcore.co.uk in a Chrome or Edge browser
- Select your device model
- Choose the
companion_radio_usbfirmware variant (not BLE) - Connect the device via USB and click Flash
Important: The USB companion firmware disables Bluetooth. Radio parameters (frequency, bandwidth, etc.) can only be configured over serial -- either through the Meshpoint setup wizard or manually via Python. The setup wizard handles this automatically.
- Connect the flashed device to any USB port on the Raspberry Pi
- Run the setup wizard:
sudo meshpoint setup- The wizard detects the MeshCore device and asks if you want to enable monitoring
- The wizard auto-configures the companion's radio frequency based on your selected region:
| Region | Frequency | BW | SF | CR |
|---|---|---|---|---|
| US | 910.525 MHz | 62.5 kHz | 7 | 5 |
| EU | 869.618 MHz | 62.5 kHz | 8 | 8 |
| ANZ | 916.575 MHz | 62.5 kHz | 7 | 8 |
Other regions prompt for custom frequency entry. You can also change the MeshCore radio frequency anytime with meshpoint meshcore-radio.
- The wizard sets the radio parameters, reboots the companion, and verifies the new settings
After setup, both capture sources start automatically on boot. You'll see them in the startup banner:
Source concentrator (SX1302), MeshCore USB node
To switch the MeshCore companion to a different region without re-running the full setup wizard:
meshpoint meshcore-radio # interactive menu (US, EU, ANZ, Custom)
meshpoint meshcore-radio EU # apply EU preset directly
meshpoint meshcore-radio custom # enter manual frequency/BW/SF/CRThe command auto-detects the USB port, stops the service, configures the radio, waits for the companion to reboot, updates the config if the USB port changed, and restarts the service.
| SX1302/SX1303 Concentrator | MeshCore USB Companion | |
|---|---|---|
| Protocol | Meshtastic | MeshCore |
| Direction | RX + TX (native) | RX + TX (via companion) |
| Channels | 8 simultaneous | 1 |
| Spreading factors | SF7-SF12 all at once | Fixed (SF7 default) |
| Connection | SPI (internal HAT) | USB serial |
| Configuration | Dashboard Radio settings | Region preset via wizard |
If you received a pre-built Meshpoint, all the software is already configured. You just need to set it up physically.
- Raspberry Pi 4 with LoRa concentrator HAT mounted (RAK2287 or WM1303)
- LoRa antenna
- USB-C power supply
- microSD card (already inserted and configured)
- Connect the antenna to the gold SMA connector on the HAT. Do this BEFORE powering on.
- Plug in the Ethernet cable (if provided) or the device is pre-configured for your Wi-Fi.
- Plug in the USB-C power supply.
The device will boot in about 60 seconds and start capturing LoRa packets automatically.
Shutting down: If you ever need to unplug the device, always run
sudo powerofffirst (via SSH) and wait for the green LED to stop blinking. Never yank the power cable while the Pi is running -- this can corrupt the SD card and permanently damage the concentrator radio.
Once the device is on your network, open a browser and go to:
http://<device-ip>:8080
To find the device IP, check your router's DHCP client list for the device name (e.g. "meshpoint-nyc").
- Packet Feed -- real-time Meshtastic and MeshCore packets from your area
- Messaging -- send and receive messages on the mesh (if TX is enabled)
- Node Cards -- every discovered node with name, signal, hardware, battery
- Node Map -- discovered mesh nodes plotted on a map
- Radio Settings -- configure region, modem preset, frequency, TX, and channels
- Signal Charts -- RSSI distribution and traffic over time
- Device Metrics -- CPU, RAM, disk usage, temperature
The device also sends data to the Meshradar cloud platform. Your device operator can see your Meshpoint status and metrics from the cloud dashboard.
- No packets appearing: Make sure the antenna is connected and there are Meshtastic/Meshcore devices transmitting in your area.
- Can't find the device on your network: Check your router for the device hostname, or try
nmap -sn 192.168.1.0/24from your computer. - Dashboard not loading: Wait 60 seconds after power-on for the service to fully start.
| Command | Description |
|---|---|
meshpoint status |
Show device health, uptime, and connection status |
meshpoint logs |
Tail the live service logs |
meshpoint report |
Full operational report: traffic, signal, system metrics |
meshpoint restart |
Restart the service (applies config changes) |
meshpoint stop |
Stop the service |
meshpoint meshcore-radio |
Configure MeshCore companion radio frequency |
sudo meshpoint setup |
Re-run the setup wizard (overwrites config) |
meshpoint version |
Print firmware version |
sudo poweroff |
Shut down safely before unplugging power |
Always shut down before unplugging. Run
sudo poweroffand wait for the green LED to stop before pulling the cable. Reboots (sudo reboot) are safe.
Most settings can now be changed from the Radio settings page on the dashboard: region, modem preset, frequency, TX power, channels, and node identity. Changes save to local.yaml automatically.
For advanced settings not exposed in the UI, edit the file directly:
sudo nano /opt/meshpoint/config/local.yaml
meshpoint restartDefault settings are in config/default.yaml: do not edit that file.
cd /opt/meshpoint
sudo git pull origin main
sudo systemctl restart meshpointThe local dashboard shows an orange update indicator when a new version is available on GitHub.
v0.7.0 ships the core modules as Python source instead of pre-compiled .so binaries. If your install predates v0.7.0, git pull alone is not sufficient: Python's import machinery would prefer the stale .cpython-*.so files over the new source and you'd silently keep running v0.6.x code. Re-run install.sh after pulling to clean them up:
cd /opt/meshpoint
sudo git pull origin main
sudo bash scripts/install.sh
sudo systemctl restart meshpointinstall.sh is idempotent and also subsumes the older v0.6.0-era one-time steps (HAL TX sync word patch, sudoers rule, systemd service install) in the same pass, so this single command covers any path from v0.5.x or v0.6.x up to current. Future updates from v0.7.0 onward go back to plain git pull + restart.
A reboot ensures all changes take effect cleanly (kernel modules, SPI state, MeshCore companion). Reboots are safe: the systemd service holds the concentrator in reset during shutdown to prevent SPI bus latch.
If the concentrator fails to start with lgw_start() failed or Failed to set SX1250_0 in STANDBY_RC mode, the SPI bus latched due to a hard power cut. Fix it with a full power cycle:
sudo poweroffWait for the green LED to stop blinking, then unplug for 10+ seconds and plug back in.
Important: Always shut down gracefully with sudo poweroff before unplugging. Hard power cuts (yanked cable, power outage) can corrupt the SD card and latch the RAK2287's SPI bus. Repeated hard power loss can permanently damage the SX1250 radio.
For troubleshooting, corrupted install recovery, and pip issues, see Troubleshooting.
Your Meshpoint (Raspberry Pi)
┌──────────────────────────────────┐
│ SX1302/SX1303 (SPI) │
│ ├─ Meshtastic RX (8 ch) │
│ └─ Meshtastic TX (native) │
│ MeshCore companion (USB serial) │
│ └─ MeshCore RX + TX │
│ ZOE-M8Q GPS (UART) │
│ └─ Device positioning │
│ │
│ Meshpoint Software │
│ ├─ Dual-protocol capture │
│ ├─ Protocol decoding │
│ ├─ Chat UI + messaging │
│ ├─ Radio config dashboard │
│ ├─ Node discovery │
│ ├─ Local SQLite storage │
│ ├─ Local web dashboard │
│ └─ WebSocket upstream ────────┼── meshradar.io
└──────────────────────────────────┘ │
▼
Cloud Dashboard
(all Meshpoints
aggregated on
a shared map)
Each Meshpoint operates independently with its own local dashboard. When connected to the cloud, all Meshpoints contribute to a shared regional view where you can see every node and Meshpoint across the network.