Skip to content

KMX415/meshpoint

Meshpoint Logo

Meshpoint

Open-source Meshtastic base station with native TX/RX, 8-channel concentrator, and browser-based messaging.
Runs on Raspberry Pi 4 + SX1302/SX1303. Supports US915, EU868, ANZ915, IN865, KR920, and SG923.

License: AGPL v3 Python 3.11+ Platform: Raspberry Pi Discord GitHub stars GitHub issues Last commit Version

Meshradar Cloud Dashboard

Meshradar Cloud Dashboard

Local Dashboard

Local Dashboard

Messaging

Messaging

Startup Log

Startup Log


What Is This?

A Raspberry Pi-based Meshtastic base station that sends and receives messages through an SX1302/SX1303 concentrator. The concentrator receives on 8 channels simultaneously (SF7-SF12) and transmits natively with up to 27 dBm output. Phones and nodes see it as a regular participant on the mesh.

Everything is managed from a browser dashboard: full chat with channels and DMs, node discovery, radio configuration, and live packet feed. Also supports MeshCore traffic through a USB companion. Optionally syncs upstream to Meshradar for aggregated multi-site mesh intelligence.

Standard Node vs Meshpoint

Standard Node Meshpoint
Radio Single transceiver SX1302 concentrator (RX + TX)
Role Participant Observer + participant
Packet visibility Own traffic Everything in range
Messaging Phone app only Full chat from any browser
Storage None SQLite with retention
Dashboard None Real-time web UI with radio config

Features

Native mesh messaging. Send and receive Meshtastic messages directly from the dashboard. Broadcast to channels, DM individual nodes, or reply in conversations. MeshCore messaging supported through the USB companion. The SX1302 handles TX using the same sync word and encryption as the mesh network: phones and nodes see your Meshpoint as a regular participant.

Full chat UI. Conversations organized by channel and contact. Signal info (SNR, RSSI) on every received bubble. Duplicate badge shows how many times a relayed message was heard. Channel sidebar with LongFast, custom channels, and DM contacts. Message history persisted in SQLite.

Radio configuration from the dashboard. Change region, modem preset, frequency, TX power, and duty cycle without SSH. Add and remove channels with custom PSKs. Toggle TX enable/disable. All settings saved to local.yaml and survive restarts.

Node discovery. Live node cards showing every node your Meshpoint has heard: name, ID, protocol, hardware model, signal strength, battery, and last seen. Click any node to open a detail drawer with signal history and direct message.

Dual-protocol capture. Meshtastic and MeshCore traffic captured simultaneously. The SX1302 concentrator handles Meshtastic, while a USB MeshCore companion covers MeshCore on its own frequency.

Full packet decoding. 14 Meshtastic portnums decoded: TEXT, POSITION, NODEINFO, TELEMETRY, ROUTING, ADMIN, WAYPOINT, DETECTION_SENSOR, PAXCOUNTER, STORE_FORWARD, RANGE_TEST, TRACEROUTE, NEIGHBORINFO, and MAP_REPORT. 6 MeshCore message types decoded. Device roles (CLIENT, ROUTER, REPEATER, TRACKER, SENSOR) extracted from NodeInfo.

Multi-channel decryption. Configure private channel PSKs from the dashboard or local.yaml. The Meshpoint decodes traffic on those channels alongside the default key and routes messages to the correct conversation. Supports any number of channels with AES-128 or AES-256 keys.

6 frequency regions. US, EU_868, ANZ, IN, KR, and SG_923. Select during setup or change from the Radio settings page. MeshCore companion radios configure to match automatically.

Real-time dashboard. Live map with node positions, color-coded packet feed with frequency and spreading factor columns, traffic charts, signal analytics, and node cards. Accessible from any device on your network.

Cloud integration. Optional WebSocket uplink to Meshradar for aggregated multi-site mesh intelligence. Fleet management, city-wide maps, and packet history across all your Meshpoints.

Dual-protocol MQTT gateway. Publish captured packets to community MQTT brokers and Home Assistant. Dual-protocol: Meshtastic (protobuf) and MeshCore (JSON) from a single device. Two-gate privacy model ensures private channel data never leaks. Optional JSON publishing, HA auto-discovery, and configurable location precision.

Auto-detect hardware. RAK Hotspot V2 and SenseCap M1 identified automatically during setup. MeshCore USB companions auto-detected on /dev/ttyUSB* and /dev/ttyACM*.


Hardware

Requirements: Raspberry Pi 4, 64-bit Raspberry Pi OS, Python 3.13. The compiled core modules are aarch64 binaries: other platforms (Pi 3, x86, 32-bit OS) are not currently supported.

Option A: RAK Hotspot V2 (~$60, recommended)

The easiest path. RAK/MNTD Hotspot V2 miners (model RAK7248) include a Pi 4, RAK2287 (SX1302), Pi HAT, metal enclosure, antenna, and power supply: everything you need. Helium's IoT network didn't pan out, so these are all over eBay for $40-70.

Find on eBay ($30-80)

RAK7248 Hotspot V2

Remove the black tape covering the SD card slot and carefully remove SD. Flash a new card with Raspberry Pi OS 64-bit, run the install script, and you have a Meshpoint in a nice aluminum enclosure.

Option B: SenseCap M1 (~$40-60)

Another Helium-era miner with identical compatibility. The SenseCap M1 includes a Pi 4, Seeed WM1303 concentrator (SX1303), carrier board, metal enclosure, and antenna. Some units ship with a 64GB SD card included.

Find on eBay ($30-60)

SenseCap M1

Remove the 2 screws on the back panel (the side without the Ethernet/antenna ports) to access the SD card: it may be held in place by kapton tape. Flash with Raspberry Pi OS 64-bit and run the install script. USB-C power connects to the carrier board, not the Pi directly.

Option C: Build Your Own (~$85)

Component Price
Raspberry Pi 4 (1GB+) $35
RAK2287 SX1302 + Pi HAT ~$20*
915 MHz LoRa antenna $10
MicroSD card (16GB+) $10
USB-C power supply (5V 3A) $10

*Helium's surplus means RAK2287 concentrators and Pi HATs go for ~$20 combined on eBay.

Assembly: Seat the RAK2287 on the Pi HAT, mount the HAT on the Pi GPIO header, connect the antenna. Always connect the antenna before powering on.

Optional: MeshCore USB Companion

Add a Heltec V3/V4 or T-Beam running MeshCore USB companion firmware to monitor MeshCore traffic alongside Meshtastic. Plug it into any USB port on the Pi -- the setup wizard auto-detects the device and configures its radio frequency for your region.

Full step-by-step guide: See the Onboarding Guide for detailed instructions covering flashing, assembly, installation, MeshCore setup, and troubleshooting for all hardware options.


Install

sudo apt update && sudo apt install -y git
sudo git clone https://github.com/KMX415/meshpoint.git /opt/meshpoint
cd /opt/meshpoint && sudo bash scripts/install.sh

This builds the SX1302 HAL with Meshtastic patches, sets up a Python venv, and installs the systemd service.

sudo meshpoint setup    # interactive config wizard
meshpoint status        # verify everything is running

Open http://<pi-ip>:8080 for the local dashboard.

First time? The Onboarding Guide walks through everything from flashing the SD card to verifying your first captured packets.


Architecture

                                ┌─────────────────────────┐
                                │    Meshradar Cloud       │
                                │    (meshradar.io)        │
                                └────────────┬────────────┘
                                             │ WebSocket
                                             │
┌──────────┐    ┌──────────┐    ┌────────────┴────────────┐
│Meshtastic│    │ SX1302/  │    │    Meshpoint (Pi 4)      │
│ packets  │◀──▶│ SX1303   │◀──▶│                          │
│ (OTA)    │    │ RX + TX  │    │  Capture → Decode → API  │
└──────────┘    └──────────┘    │      ▲           │       │
                                │      │       Dashboard   │
┌──────────┐    ┌──────────┐    │   Messages    (port 8080)│
│ MeshCore │    │  Heltec  │    │   + Chat UI              │
│ packets  │◀──▶│  USB     │◀──▶│                          │
│ (OTA)    │    │companion │    │                          │
└──────────┘    └──────────┘    └─────────────────────────┘

CLI

meshpoint status         # service status + config summary
meshpoint logs           # tail the service journal
meshpoint report         # full operational report (traffic, signal, system)
meshpoint restart        # restart the service
meshpoint meshcore-radio # configure MeshCore companion radio frequency
sudo meshpoint setup     # re-run config wizard

Local API

FastAPI server on port 8080:

Endpoint Description
GET /api/nodes All discovered nodes
GET /api/nodes/map Nodes with GPS for map display
GET /api/packets Recent packets (paginated)
GET /api/analytics/traffic Traffic rates and counts
GET /api/analytics/signal/rssi RSSI distribution
GET /api/device/status Device health and uptime
GET /api/config Radio, TX, and channel configuration
PUT /api/config/transmit Update TX settings
PUT /api/config/identity Update node ID, long/short name
PUT /api/config/radio Change region, preset, frequency
POST /api/messages/send Send a Meshtastic or MeshCore message
GET /api/messages/conversations Message history by conversation
WS /ws Real-time packet + message stream

Updating

cd /opt/meshpoint
sudo git pull origin main
sudo systemctl restart meshpoint

The local dashboard shows an orange update indicator when a new version is available.

Updating to v0.6.0 (one-time steps)

v0.6.0 adds native TX support, which requires a one-time HAL recompile and two config files:

cd /opt/meshpoint
sudo git pull origin main
sudo bash /opt/meshpoint/scripts/patch_hal.sh
sudo cp config/sudoers-meshpoint /etc/sudoers.d/meshpoint
sudo chmod 440 /etc/sudoers.d/meshpoint
sudo cp scripts/meshpoint.service /etc/systemd/system/meshpoint.service
sudo systemctl daemon-reload
sudo systemctl restart meshpoint

patch_hal.sh patches the concentrator HAL for Meshtastic-compatible TX sync words and recompiles (takes about 2 minutes). The sudoers rule allows the dashboard to restart the service when you change settings. Both only need to run once. Future updates go back to git pull + restart.


Troubleshooting

Chip version 0x00: Concentrator not responding. Check that the concentrator module is seated, SPI is enabled (raspi-config → Interface Options → SPI), and try a full power cycle (unplug for 10+ seconds). Normal chip versions are 0x10 (SX1302) and 0x12 (SX1303).

No packets: Verify antenna is connected and frequency matches your region. Check meshpoint logs for lgw_receive returned N packet(s).

Upstream 401: Bad API key. Get a free one at meshradar.io and re-run sudo meshpoint setup.


Documentation


Community


Contributing

Meshpoint is still early alpha. Pull requests are welcome, but please keep changes small and reviewable.

See CONTRIBUTING.md for guidelines, workflow, and PR expectations.

AI-assisted contributions are allowed, but contributors should review and understand all code before submitting.


License

AGPL-3.0: see LICENSE. Compiled core modules are distributed as pre-built binaries under the same license.


Built for the mesh community by Meshradar.

About

Open-source LoRa base station for Meshtastic/Meshcore. Raspberry Pi + SX1302/SX1303 concentrator — passive multi-channel capture, local dashboard, native TX

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Contributors