MeshCore
9.1.15 beta — what's new

Your mesh, on every screen.

A companion client for MeshCore radios. Chat, maps and repeater administration — on the Linux desktop and on Android, sharing one archive.

Download See it working

Free and MIT licensed. In beta.

Pictures show
MeshCore
Favourites 1
HH Horsens Havn2m Repeater back up after the storm
All conversations 3
AD ADT-DK870014m Battery 4.02 V · 21 °C
# #denmark1h Lars: anyone hearing OZ7IGY? 2
M MetteTue On my way north now
HH Horsens Havn a1f4c07e9b32d5e8… · direct, 2 hop(s)
Today
Repeater back up after the storm. 14:02  +8.5 dB  2 hops
Good. Battery held? 14:03  ✓
3.98 V overnight, no brownout. 14:06  +7.1 dB  2 hops  Show path
YouOZ-HERNHorsens Havn
Message 0/160
HHHorsens Havn
Public keya1f4 c07e 9b32 d5e8
TypeRepeater
Last heard2 minutes ago
Routedirect, 2 hop(s)
PathOZ-HERN → Horsens Havn
Adverts412
Position55.861, 9.850 ±120 m
Signal history
Connected on /dev/ttyUSB0 ADT-DK8700 · Denmark · 4.02 V
Chat
HH Horsens Havn2m Repeater back up after the storm
AD ADT-DK870014m Battery 4.02 V · 21 °C
# #denmark1h Lars: anyone hearing OZ7IGY? 2
M MetteTue On my way north now

Linux desktop

A three-pane messenger with a map beside it. USB or Bluetooth, repeater administration, a firmware flasher, and the archive on your own disk.

Debian, Ubuntu, Zorin · .deb

Android

The same archive in your pocket. Chat, the map, repeater administration and flashing over USB-C — and it can transmit a message the desktop composed.

Sideloaded · .apk

Chat

Every message tells you how it got here

Not just sent or delivered. Each bubble carries its delivery state, its signal-to-noise ratio and the number of hops it took — and Show path draws the actual route on the app's own map. When a direct message goes unacknowledged it is retried, and the stale route is dropped first so the retry floods rather than repeating a path that no longer exists.

  • Delivery state, SNR and hop count on every message
  • Show path draws the route it travelled
  • @mentions written the way every MeshCore client writes them
  • A byte counter against the real limit, not a guess
MeshCore
Favourites 1
HH Horsens Havn2m Repeater back up after the storm
All conversations 3
AD ADT-DK870014m Battery 4.02 V · 21 °C
# #denmark1h Lars: anyone hearing OZ7IGY? 2
M MetteTue On my way north now
HH Horsens Havn a1f4c07e9b32d5e8… · direct, 2 hop(s)
Today
Repeater back up after the storm. 14:02  +8.5 dB  2 hops
Good. Battery held? 14:03  ✓
3.98 V overnight, no brownout. 14:06  +7.1 dB  2 hops  Show path
YouOZ-HERNHorsens Havn
Message 0/160
HHHorsens Havn
Public keya1f4 c07e 9b32 d5e8
TypeRepeater
Last heard2 minutes ago
Routedirect, 2 hop(s)
PathOZ-HERN → Horsens Havn
Adverts412
Position55.861, 9.850 ±120 m
Signal history
Connected on /dev/ttyUSB0 ADT-DK8700 · Denmark · 4.02 V

Map

The mesh, drawn

Every node you have ever heard, whether or not you added it as a contact. Positions carry their uncertainty as a circle rather than a false pin, tracks show where a node has been, and the tiles are cached — so the map still works in the field, which is where you need it.

  • Pins, uncertainty circles and historical tracks
  • Offline tile caching, downloaded before you leave
  • Routing paths resolved to node names
MeshCore
Tiles cached for offline use
Connected on /dev/ttyUSB0 ADT-DK8700 · Denmark · 4.02 V
Map
Tiles cached for offline use

Repeater management

Look after the repeaters you run

Mark a node as yours and it gets a page that flags anything not heard for six hours. Log in over the air, or reach a repeater over a cable when the air will not do — then run the firmware's own CLI, with the commands that can brick it gated behind a confirmation.

  • Over the air, or over a cable
  • A form for every setting the firmware exposes
  • Battery and temperature with a guest password, no admin login
  • Anything unheard for six hours is flagged
MeshCore
Search Cable… Battery Refresh
3 of your repeaters · 1 not heard in the last 6 hours
NameLast heardBatteryUptime
Horsens Havn2 minutes ago3.98 V18 d
ADT-DK870014 minutes ago4.02 V31 d
OZ-HERN9 hours ago
> get radio.freq 869.525 > get radio.sf 11
Connected on /dev/ttyUSB0 ADT-DK8700 · Denmark · 4.02 V

Device flashing

New firmware without a laptop

Import a firmware image and the app reads its type, version and supported hardware out of the filename, then keeps it in your own data directory. Flash over USB from the desktop, or over USB-C straight from the phone — because downloading a flashing tool is exactly what you cannot do in the field.

  • A firmware library that lives on your machine
  • Type, version and hardware read from the filename
  • Flash from the desktop over USB, or the phone over USB-C
Firmware
Heltec V3connected over USB-C
meshcore-v1.16.0-heltec_v3.bin repeater · v1.16.0 · 1.2 MB
Writing 64% · do not unplug
In your library
meshcore-v1.16.0-heltec_v3.binrepeater · v1.16.0
meshcore-v1.15.2-heltec_v3.binrepeater · v1.15.2
companion-v1.16.0-heltec_v3.bincompanion · v1.16.0

Profiles and sync

One archive, several radios, two devices

The desktop and the phone share a schema, so a .mcbackup moves between them intact. Save a whole radio configuration as a profile — optionally including its identity — and put it back on this radio or another one. Compose a message on the desktop and the phone's radio can be the one that transmits it.

  • A SQLite archive you can back up and restore
  • Radio profiles, identity optional
  • Generate a new node identity without a factory reset
  • Write on the desktop, transmit from the phone
MeshCore
Profiles and sync
This laptop 12 340 messages · 214 nodes up to date
Phone 12 340 messages · 214 nodes up to date
Heltec V3 · Denmarksaved 2 Sept · with identity
Bench radiosaved 28 Aug
Connected on /dev/ttyUSB0 ADT-DK8700 · Denmark · 4.02 V
Sync
This phonepaired with the laptop
Messages, nodes, tiles12 340 · 214 · 1 204
Last sync 40 seconds ago

Everything the radio can do, where you can see it.

One download, no account, no server in the middle.

Download Known bugs

Latest 9.1.15 · 2026-09-04