Open source routing across radios that cannot reach each other

One message.
Every way out.

A mesh keeps a village talking to itself but has no route out of the valley. A satellite modem reaches anywhere and costs real money per message. MeshSat is the layer in between: it takes a message off the mesh and sends it by whatever bearer is still alive, spending satellite bytes only when nothing free is left.

Pre-release prototype. Never deployed to a real user, never used in an emergency.

curl -fsSL https://get.meshsat.net | sudo bash

Eight bearers, nine wired interfaces

Iridium runs on two modems, the 9603N for SBD and the 9704 for IMT. Every bearer is a first-class interface with its own MTU, cost model and transform pipeline. TAK and webhooks are integrations rather than bearers. Status says what we have actually run, not what we hope.

CategoryTransportStatus
MeshMeshtastic LoRaField tested
SatelliteIridium SBD 9603NField tested
Iridium IMT 9704Verified over satellite
CellularSMS and data (A7670E)Field tested
WirelessZigBee 3.0 (CC2652P)Little field exposure
IP / NetworkMQTTField tested
WebhooksField tested
APRS (bundled Direwolf, KISS)Field tested
TAK / Cursor-on-TargetField tested
RoutingReticulum TCP (HDLC framed)Interoperates with Python RNS

Multi-bearer bonding over a paid satellite link is not validated yet, and the jamming detector has only ever seen ambient noise. The repository sets out the full list of what has and has not been proven.

Satellite bytes are expensive. That is the whole design.

An Iridium line costs tens of euros a month plus credits per message, billed in 340 byte blocks. Give one to every person in a team and the bill scales with headcount. That price is the reason the routing layer exists at all.

One paid link, shared

A team carries cheap mesh radios. One gateway holds the expensive satellite line. Everyone reaches the outside through it, so cost stops scaling with the number of people.

Free bearers first

Every interface declares a cost. The router prefers the free ones, mesh, packet radio, Bluetooth and WiFi, and only reaches for satellite or SMS when nothing free is up.

Fewer bytes when it does

Anything leaving on a metered bearer is compressed first. SMAZ2 runs in under a millisecond on short text, which matters when you are billed per block rather than per byte.

Sent when the sky is right

Pass prediction from SGP4 orbital elements holds traffic for visibility windows instead of burning battery retrying against a satellite that is below the horizon.

MeshSat is free software under the GPLv3. Development is supported by SIDN fonds, and a six month field programme starts in November 2026.

What it runs on

A Raspberry Pi in a waterproof case with radios on USB and GPIO. Devices are identified at startup by USB ID and protocol probe, so plugging one in is the whole configuration step.

PartRole
Raspberry Pi 5 (8 GB)Host. ARM64, or any x86_64 Linux with Docker and USB serial.
Heltec LoRa V4 or XIAO ESP32-S3Meshtastic mesh radio at 868 or 915 MHz.
RockBLOCK 9603 or 9704Iridium satellite. SBD at 340 bytes, or IMT at 100 KB.
LILYGO T-Call A7670E4G and 2G cellular, for SMS and data.
CC2652P dongleZigBee coordinator.
UPS and batteryBecause the interesting cases are the ones where mains power has gone too.
MeshSat dashboard showing Iridium signal, MQTT traffic and cellular status

Signal, traffic and channel health, served by the device itself

Satellite pass predictor showing a visibility timeline

Pass prediction, so the queue waits for a satellite that is actually up

Live mesh network topology graph

Live mesh topology

Forwarding rules and gateway connection status

Forwarding rules and per-gateway status

The dashboard is embedded in the binary and served from the device. No cloud dependency, no account.

What it is not

The fastest way to waste an afternoon is to expect the wrong thing from it.

Not a Starlink replacement

MeshSat moves text, positions and telemetry. If you need video calls or the web, use Starlink. This is for the cases a dish cannot serve: battery powered, pocket sized, no mains.

Not voice or video

Satellite and mesh links are high latency and low throughput. This is store and forward messaging. Think SMS, not a phone call.

Not a LoRaWAN network server

The mesh side speaks Meshtastic, which is its own protocol over LoRa. For LoRaWAN, run ChirpStack and bridge it in over MQTT.

Not an emergency service

A research prototype, not a replacement for 112, 911 or any national emergency number. Nothing here is certified and nothing here has been used in a real emergency.

The rest of the system

The Bridge is one device and works entirely on its own. Two other pieces exist for when one device is not the whole picture.

MeshSat Hub

Private beta MeshSat Hub is not launched yet. It runs as a private beta on our own infrastructure. Access for demos and beta testing is arranged on request.

Fleet management across many bridges: OAuth2 and OIDC accounts, API keys with roles, multi-tenant isolation, SOS escalation chains, per-device rate limits and an Ed25519 hash-chain audit log. Deployable standalone, clustered, or on Kubernetes.

Request beta access

MeshSat Android

A phone as a standalone gateway, with no Pi and no cables. It talks to a Meshtastic radio over Bluetooth LE, an Iridium modem over Bluetooth SPP, and uses the phone's own SMS, all at the same time. Same encryption and message formats as the Bridge.

Android source

Try it

One command on a Linux machine with a radio plugged into it. A single device is enough to start, and anything missing is logged as a warning rather than an error.

curl -fsSL https://get.meshsat.net | sudo bash

Bug reports from people running hardware we have not tried are the most useful thing you can send. The supported-device list is short because it only names what we have physically run.