This is an old revision of the document!
Table of Contents
MeshCore
Introduction
From Wikipedia:
MeshCore is an open-source mesh networking protocol and software platform designed for off-grid, low-power text communication using LoRa (Long Range) radio technology. The system enables decentralized, multi-hop wireless messaging without reliance on cellular networks or internet infrastructure.
Use cases include emergency and disaster communications, outdoor and remote activities, [...] and experimental and educational deployments of low-power mesh networking.
[It] is designed to [...] operate in unlicensed ISM frequency bands such as 868 MHz and 915 MHz, depending on regional regulations.
The idea is that each person has a small companion device C paired to their cellphone via Bluetooth, and via that device, they can text each other or post public messages using the 915 MHz band, all without a special license. The signal can travel directly between companion devices if they are close enough, or via a series of repeaters R to extend coverage.
Companions
What is needed to use MeshCore?
- The MeshCore app downloaded to your cellphone or computer.
- A device with the MeshCore companion firmware paired to your cellphone.
- If needed, a device with the MeshCore repeater firmware to extend messaging range.
Each person who wants to send messages needs their own companion device.
Download the MeshCore App
- Search for “MeshCore” by “Liam Cottle” on Google Play or the Apple App Store.
- Alternatively, an offline copy can be downloaded for Android, Windows, macOS, Linux, and Web from https://meshcore.io. It's a good idea to have an offline copy in case of emergency.
Where to buy MeshCore devices?
- Recommended devices are listed at https://meshcore.io
- Alternatively, supported devices listed on https://meshcore.io/flasher can be purchased online from overseas suppliers such as AliExpress or Seeed Studio, or in Canada from Robot Shop.
Flash the Firmware
Use a Chromium-based web browser like Brave.
On Linux, you may have to add the “dialout” group to your user. To do that, type the following in the terminal replacing “USER” with your username and reboot your computer:
sudo usermod -a -G dialout USER
If you already have MeshCore installed, back up your current settings:
- Open the MeshCore app
- Navigate to the Settings (the gear in the top right corner)
- Scroll down to the “
Extra Tools” section and select “Export Config” - “
Select All” and click the check mark in the top right corner to save the “.json” file to your phone.
Flash the MeshCore Firmware:
- Connect the companion device to your computer via USB.
- Go to https://meshcore.io/flasher (using a Chromium Browser).
- Select your device
- Select Companion Bluetooth
- Select Enter DFU Mode
- Select Erase Flash (for brand new devices only.)
- Select Flash
To reload your previous config file (required only if you lost your configuration for some reason).
- Open the MeshCore App.
- Connect to the companion device, but it probably has a different Bluetooth name now.
- Enter the PIN displayed on your MeshCore device’s screen. If your device doesn’t have a screen, the default PIN is “
123456”. - Skip Setup.
- Navigate to the Settings (the gear in the top right corner).
- Scroll down to the “
Extra Tools” section and select “Import Config”. - Click on “
Select File”. - Select the “
*.json” file. - “
Select All” and click the check mark in the top right corner.
Connect to your MeshCore Device
- Turn on your device.
- Open the MeshCore App.
- Tap the “
Connect” button in the top right corner. - Tap the “
MeshCore-XXXX” device that matches the name shown on your MeshCore device’s screen. - Enter the PIN displayed on your MeshCore device’s screen. If your device doesn’t have a screen, the default PIN is “
123456”. - Once pairing is successful, you’ll be taken to the main screen.
If you’re having trouble pairing with Bluetooth, try rebooting your phone.
Settings
- Tap the settings icon in the top right corner.
Public Info
You should now rename and set a location for your MeshCore node. These settings will be seen by other users on the MeshCore network (and online!) and can be changed anytime.
- Write a name that is somewhat descriptive (your name or callsign).
- Tap the map icon to pick your location. This will be shared online so you might want to select a street corner that's close to but not exactly where you live. It should be close enough to be useful for your neighbours to identify you as part of the neighbourhood.
- Check the “
Share Position in Advert” - Tap the ✔ icon in the top right corner to save the settings.
The device name in Bluetooth will not update until you reboot your node.
Radio Settings
MeshCore can be used all over the world. Different countries have different regulations on which radio frequencies can be used for public, license-free communication. To ensure your node is operating legally, please make sure to select radio settings that are compliant in your country.
The MeshCore app provides a list of radio presets that have been suggested by the community for use in specific countries/regions, but in the SWBC region, we use different settings (see here for more details):
- Tap the Selected Preset field and select “
Canada”. After you save, this will change to “Custom”. - Change the Frequency (MHz) to “
909.000” - Make sure the other settings match the picture and tap the ✔ icon in the top right corner to save the settings.
The max transmit power depends on the device.
Network Settings
The Path Hash Size is a chunk of data that is sent with your messages to identify who you are on the mesh (kind of like your node's address). It is the first 1, 2, or 3 bytes of your public key.
There's a trade-off between how many hops a message can go and how many unique addresses each hash size can have. When two nodes have the same path hash, messages can be routed to the wrong place.
| Path Hash Size | Number of unique addresses | Max Hops | Recommended for |
|---|---|---|---|
| 1-byte | 256 (162) | 64 | Avoid |
| 2-byte | 65536 (164) | 32 | Companions |
| 3-byte | 16 millions (166) | 21 | Repeaters |
This page shows nodes with duplicate addresses, which can be fixed by increasing the path hash size.
- Tap the “
Default Path Hash Size” and select “2-byte” for companions, or “3-byte” for repeaters. - Tap the ✔ icon in the top right corner to save the settings.
Other Settings
Contact Settings
Position Settings
By default, the app can change your location based on your GPS coordinate. Since we've already set an approximate location earlier, we'll want to disable this option. It can be temporarily enabled if you're going somewhere you'd like others to be able to track you (for example).
- Select “
Disabled” - Tap the ✔ icon in the top right corner to save the settings.
Extra Tools
The last thing we'll do before exiting the settings is to back up all our configs:
- Tap “
Export Config” - “
Select All” - Tap the ✔ icon in the top right corner to save the settings.
Finally, let's tap the ✔ icon in the top right corner one last time to save the settings before exiting.
Contacts
Unlike SMS, you can only send a private message to someone if you are both in each other's contact list.
In this section, we'll see four different ways of sharing contact information.
Four ways to share contact information:
1. Advert / Discover
Advert
An advert is an unencrypted packet transmitted by your MeshCore node. It includes your node name, location and type, public identity key and a cryptographic signature to prevent anyone from tampering with the information as it’s sent across the mesh.
You can send two types of adverts:
Zero Hop:- The advert won’t be retransmitted by any repeaters.
- Your contact details will only be received by nearby nodes.
Flood Routed:- The advert will be rebroadcast by all repeaters that hear it.
- Your contact details could be received by everyone on the mesh.
There was a deliberate decision made to prevent auto advert for companions (but not for repeaters). As such, you should flood advert at least once a week so that new users can find and add you to their contact list.
- Tap the “wave” icon just to the left of the gears at the top
- Tap “Advert • Flood Routed”
Discover
The easiest way to add nodes that are in your neighbourhood to your contact list is to use the map feature. However, there are three different kinds of maps in MeshCore:
3) The “Internet Map” shows a map of all the nodes heard by “observers” that are shared to the Internet.
To populate your contact list, use the map under “Discover Contacts”. You might have to leave your node on for a bit for it to hear all the nodes in your area since they need to advert or transmit for your node to see them:
- In the “
Discover Contacts” → “Map View” - Tap on this ⋮ in the top right and uncheck “
Show Added Contacts”
The map will only show users that have not been added yet. To add them:
- Tap on a node
- Under the node's name, tap on “
Add”
If you go back to the main page's “Map” (1), you should now see that contact.
The maps only show nodes that have shared their Position in Advert. Nodes that have not shared their location will still show in the list, but you won't be able to tell where they are located. That's why it's important to share your approximate location: so others in your neighbourhood can add you to their contact list.
2. QR Code
The fastest way to share your contact information with someone who's next to you is to use QR Codes. However, don't text or email these out; for that, there's a better way...
Share
To share your contact details privately via QR Code:
- Tap on this ⋮ in the top right.
- Tap the “
My Contact Code” menu item. - Show the QR Code to the other person.
The QR Code contains your Node Name, Node Type and Public Identity Key. Your contact details will not be transmitted over the mesh. Only the person who scans your QR Code will receive your contact details.
Add
To add a contact via QR Code:
- Tap on this ⋮ in the top right.
- Tap the “
Add Contact” menu item. - Tap the “
Scan QR Code” button (if requested, grant access to the device’s camera). - Point the device’s camera at the QR Code.
- The contact details will be automatically added to your contacts list.
- Tap the ✔ to add.
You may need to accept a permissions request for the MeshCore app to access your camera. This permission must be granted to be able to scan the QR Code.
3. Link to Clipboard
The easiest way to share your contacts via email or SMS is to use a contact link.
Share
To share your contact link:
- Tap on this ⋮ in the top right.
- Tap the “
My Contact Code” menu item. - Tap on this ⋮ in the top right.
- Tap on “
Copy Link to Clipboard” - Paste the link in an email or SMS
Add
To add a contact link:
- Copy the contact link you were sent to your phone's clipboard.
- In the MeshCore app, tap on ⋮ in the top right.
- Tap on “
Add Contact” - Tap on “
Import from Clipboard Link” - Tap the ✔ to add.
4. In a Channel
We haven't discussed Channels yet so feel free to come back to this section later.
Share
Add
To add a contact shared in a channel:
- Simply tap the “
Add Contact” button. This will populate the name and public key in theAdd Contactwindow. - Tap ✔ to add.
Public-key Cryptography
This section is optional. It's interesting background on how MeshCore operates, but doesn't show how to do anything new. Feel free to skip it.
There are basically two different strategies for encrypting a message:
Symmetric-key cryptography is a system where the key to encrypt and decrypt a message is the same.
For example, if I generate a long random list of numbers between 1 and 26, I could use that to encrypt a message, and you could use the same list to decrypt it. Let's encrypt the word “hello” by shifting each letter by (1, 9, 2, 7, 3). The result is “innsr”. You can then shift them back using the key to recover “hello”.
This can be very secure if the key is random, is as long as the message itself, and is never reused for other messages. A big practical problem is that I have to somehow give you a copy of the key without it getting intercepted. If I can do that, I might as well give you the unencrypted message.
Public-key cryptography bypasses the problem of sharing the key securely.
You start with a large random number and use that to generate a pair of keys that are “inverses” of each other in some sense. That way, a message encrypted with one key can only be decrypted with its pair. This is based on the idea that a lot of processes in math are not easily reversible, so deducing one key from its pair is almost impossible.
Once you have this pair of keys, you keep one secret, and you publish the other one. That's right, you share one of your keys with everyone! Here are two things that you can now do:
- If I use your public key to encrypt a message that I post on a public forum, you're the only one who will be able to decrypt it with your private key.
- If I use my private key to encrypt a message that I post on a public forum, everyone will be able to decrypt the message (because they have my public key), but they'll know that the message has not been tampered with, and that it really comes from me because I'm the only one with the private key that encrypted it. Most software publishers use this scheme to sign the programs they publish online.
MeshCore and Public-key Cryptography
MeshCore uses Public Key Cryptography to:
- Identify you uniquely: your public key is your unique ID. It's listed in System -> Public Info, and it's part of the Contact Info that you share with others for them to add you to their contact list. Your private key can be exported for backup purposes or in case you upgrade your device and want to keep the same ID. But don't share your private key with anyone.
- A private message is encrypted with the recipient's public key. So even though it's transmitted over RF and everyone is receiving the message, only the recipient's private key can decrypt it.
- Different types of channels use public / private key pairs in different ways to make the channel either public or private (more on that in the next section).
Direct, Private Messages
To send a direct, private message to someone, you both need to be in each other's contact lists.
- Use one of the four methods for sharing contact info.
- From the “
Contacts” screen, tap on a contact. - Type your message as you would an SMS.
When you send a direct message to someone, it’s possible that it may not go through after several automatic attempts. This can happen for many different reasons, such as:
- Being out of range of the intended recipient.
- There are no repeaters in between you and the intended recipient.
- The intended recipient’s radio might be turned off.
- There might be interference on the radio spectrum.
- The recipient doesn't have you in their contact list.
To try sending the failed message again:
- Long-press the failed message shown in red.
- Tap the “
Retry Sending” button shown in the message actions pop-up. - Your message will try sending again.
Under Construction
I'm still editing the rest of this document. – Patrick, VA7FI 2026/10/22 16:28
If you notice typos or anything that needs to be fixed in the pages above, please email me directly. The rest of this document is still being reviewed and edited heavily.
Channels
Channels are “places” for people to share messages with large groups of people. It's not possible to know who did and did not receive messages posted in channels. There is also no “storing” capability, so if someone's node is out of reach, they will miss these messages.
There are three types of channels:
| The Public channel | has a known public/private key pair so every device can send messages to and read messages from that channel. |
|---|---|
| Hashtag channels | can be created and joined by anyone. The public/private key pair is derived from the hashtag name so anyone who knows the hashtag can join. These are public channels based on different topics or regions. |
| Private channels | have a randomly generated keys. So only those who know the private key can join the channel. Messages there are private in-so-far as the private key is not distributed outside the intended circle. |
The Public Channel
By default, messages sent to the “Public” channel can be seen by anyone on the MeshCore network. They are repeated across the mesh by all repeaters that hear them. Other mesh nodes in range of you or a repeater that rebroadcast the message should receive it.
To send a message:
- Tap the channels tab at the bottom of the screen.
- Tap the “
Public” channel. - Type a message and press the send icon.
To add the “Public” channel if it's not there:
- Tap on ⋮ in the top right.
- Tap on “
Add Channel” - Tap on “
Join the Public Channel” - Leave the Channel Name to “
Public” and tap “Join Channel”
Hashtag Channel
Hashtag channels are public channels based on topics or regions. Here are a few channels used in the South West region of BC:
#bc | Public messages for BC |
|---|---|
#news | News related items |
#ssi | Public messages for Salt-Spring Island |
#kod-bot | A bot maintained by VE7KOD for testing. Common commands: test (or t), Path (or p). Full list here. |
Notifications
Each channel can be configured with one of three different notification levels:
Ping a Repeater
To check the signal strength to and from a nearby repeater, you can run a ping test.
- Tap on this ⋮ icon next to a repeater contact.
- Tap the “Ping (Zero Hop)” menu item.
- A green pop-up will show signal strengths if successful.
- A red pop-up will show “Timeout” if your companion didn’t hear the repeater.
Ping tests do not hop through multiple repeaters. You must be in range of the specific repeater you are ping testing. For a ping test to be successful, the repeater must hear your companion signal directly, and your companion must hear the repeater signal directly. If you’re not in range of the repeater, the ping test will fail with a timeout error.
Repeaters
- Install a repeater like the SenseCAP Solar Node P1-Pro from seeed studio or RobotShop
- Use an antenna like:
- Use the shortest cable possible like:
Installing the Bootloader for the First Time.
This step is required to be able to perform future updates over-the-air (OTA) via Bluetooth, but is not required (or compatible) with ESP32 devices like the Heltec V or T beam.
If you already have MeshCore installed (but not the bootloader), download your current settings:
- Connect your device to your computer with a USB cable.
- Click on
Connect - Click on
Export - Click on
Disconnect - Locate the
.jsonfile (probably in your Downloads folder).
Download the bootloader:
- Select your device
- Select
Repeater(orRoom Server) - Click on
Download - Select the
*bootloader-x.x.x-OTAFIXx.x.uf2file - Locate the
.uf2file (probably in your Downloads folder).
Copy the bootloader over to your device:
- Connect your device to your computer with a USB cable.
- Double-click on the reset button.
- Open the drive that just mounted on your computer
- Copy the
.uf2file to the drive. - The drive may close on its own right away. This is normal.
Flash the MeshCore Firmware:
- Select your device
- Select
Repeater(orRoom Server) - Select
Enter DFU Mode - Select
Erase Flash - Select
Flash
Re-upload your settings:
- Select
Configure via USBfrom the previous page, or navigate to https://config.meshcore.io/ - Select
Connect - Select
Import - Select your
.jsonfile - Scroll down to the
Accesssection and retype yourNew Admin password(it doesn't remember it) - Scroll down and select
Save settings - Select
Disconnect
Updating the Firmware OTA
Set up the Over the Air (OTA) update app (first time only):
- Open the
DFUapp - In the settings, check
Packet receipt notification
Perform an OTA update:
- Using your phone's browser, navigate to https://meshcore.io/flasher
- Select your device
- Select
Repeater(orRoom Server) - Select
Download - Select the firmware
zipfile (not the bootloader file)
- Using the MeshCore app, log in to your repeater (or room server) using the admin password.
- For Room Servers: go to
Remote Management - Go to the
Command Line - Type
start ota, you should get a message that says:OK - mac: xx:xx:xx:xx:xx:xx
- Open the
DFUapp- Under
FileclickSelectto choose the firmware.zipfile - Under
DeviceclickSelectand choose the device that hasDFUin the name. If there are no devices with “DFU” in the name, select the device withOTAin the name. - Under
ProgressclickStart - If you selected a device with
OTAin the name, the process will fail atDFU initialization. choose “Abort” the process and go back to the previous step, and now you should be able to select a device withDFUin the name.
See Scott Baker's article for more information.
More Advanced: Sensors
- Install sensors.
Maps
- SWBC Map with links by VE7KOD
Tools






























