My adventures into mesh networking: MeshCore 101

 I’ve been interested in mesh networking for over a year now after a discussion about it on my club’s weekly TechNet piqued my interest. After doing some research into the various standards, I decided to check out LoRa-based mesh networks. Before I jump into that I’ll write up a quick overview of these networks and how they work.

The primary idea behind these mesh networks is to provide a way for people to communicate via inexpensive devices that use unlicensed UHF frequencies in various regions around the world. They leverage the LoRa (short for “Long Range”) protocol and hardware. LoRa dates back to 2010, when it was developed as a proprietary physical layer communication technique based on Chirp Spread Spectrum (CSS) technology. LoRa encodes data using FM sinusoidal chirps that provides high resistance to noise and multi-path interference and uses very low amounts of power. It operates in license-free ISM bands (915 MHz in North America, 868 MHz in Europe). 

2019: The Meshtastic open source protocol emerges

Meshtastic was the first open source LoRa-based mesh networking system developed, which was first released via GitHub in 2019 by Kevin Hester. Momentum gained in 2020 with the release of the first firmware. It provides a way for low cost devices, many of which based on the ESP32 microcontroller with LoRa hardware, to communicate with one another “peer-to-peer” without requiring an intermediary such as the Internet or a repeater. Initial use cases for Meshtastic were to enable small groups of people or devices to communicate at short range, since ISM dictates line-of-sight. 

The typical deployment method for Meshtastic is to acquire a LoRa compatible device, which cost between $30 and $150. The Meshtastic firmware is then flashed onto the device, generally using a web-based “flasher” that only requires a USB connection. After basic configuration, also done via s web interface, the device then advertises its availability on the network, seeking other nodes to communicate with. At this point the user can either use the device’s user interface to communicate, which ranges from basic units that can only transmit pre-configured messages, to units that have a full screen and keyboard. The most common user interface is a smart phone app (iOS and Android) that pairs with the LoRa device via Bluetooth and provides a much simpler user experience. 

Meshtastic communications are limited to text-only messages, and each “node” acts as a repeater, rebroadcasting every message that it receives. This enables users to reach other users via intermediary nodes, provided that a path exists between them. For example, one user could be on one side of a mountain, and another on the other side. If there is another user in between them with line of sight to both, they can communicate as the intermediary node will relay messages. 

As adoption of Meshtastic grew, limitations began to appear. At the 2024 Hamvention, the network crashed due to a large number of users overwhelming the system, which prompted custom firmware such as that developed for the DEFCON conference, which allowed over 2,000 nodes to communicate in 2025. Meshtastic also added support for MQTT “brokers”, which can help with scalability and also provide an Internet bridge, enabling networks to communicate with each other over long distances. 

 2024: MeshCore merges as a Meshtastic alternative

In a response to some of Meshtastic’s limitations, Scott Powell developed MeshCore, an open source protocol that uses the same LoRa hardware as Meshtastic, released in 2024. It should be noted that while the protocol is open source, the smart phone apps are not. MeshCore uses a fundamentally different networking architecture that introduced the concept of dedicated repeaters. At this time of this writing there are two main MeshCore apps (MeshCore and MeshCore One), and a third, Cairn, is in beta.

Individual user nodes, known as companion devices, do not automatically repeat messsages, drastically reducing network congestion in dense areas such as metropolitan regions. MeshCore also introduced the concept of an “observer node”, which uses the same ESP32-based LoRa hardware, but functions in a listen-only mode, reporting what it hears to Internet-based servers. The data gathered by observer nodes is used to create coverage maps and other telemetry to help people better understand mesh performance. Observer nodes also can host “rooms” which can be used as discussion groups and for private discussions. The advantage of a room is that messages are stored locally, so they perform a store-and-forward service, solving one issue with MeshCore: messages that are sent disappear if a node is online. 

MeshCore public channels, private channels, and direct messages

Once you have a MeshCore device configured and its receiving signals from repeaters, you need to configure it to listen to various public and private channels. Channels are named starting with a hash symbol (#), and there are a set of default channels generally published by local MeshCore groups. In the Colorado area, we use #public for general conversations, #emergency for emergency traffic, #hamradio for geeks like me to talk about ham radio, and so on. People can also create private channels, which require creation of a public and private encryption key (which is documented on various MeshCore websites). People that want to join a private channel need the public key so that their devices can decode messages on the channel. When you create a private channel, a QR Code is also generated, which many MeshCore apps can use to configure the channel instead of having to type in an insanely long string of hex characters. Direct messages can also be sent from device to device, but both devices need to have a network path between them, and both must be online so the network knows how to route the messages. MeshCore apps allow you to view all of the various devices (contacts) that it’s seeing, and you can just click on a device name and send them a direct message. 

MeshCore Apps

One of the nicest aspects of MeshCore is a wide variety of apps for communicating with MeshCore companion devices. There is an official MeshCore app available on the MeshCore website, which works on MacOS, iOS, Android, and Windows, plus a web app that uses a USB connection to the device. Since then, I’ve also discovered MeshCore One, which is a very nice app, and the newest, Cairn, which is currently in beta test only for MacOS and iOS devices. I really like Cairn and it’s become my go-to app. There are also specialized apps for certain devices, like the LilyGo T-Deck Plus, that run directly on the device. 

My home MeshCore architecture

During my experimentation with Meshtastic, I purchased three LoRa devices: a LilyGo T-Deck (which looks like a Blackberry, with a touch screen, thumb “ball” pointer, and a keyboard), an Elecrow ThinkNode M1 (which is designed more for portable use with the smartphone app, that features a more durable design and a low draw e-ink display and very long battery life), and a Heltec V3 “mini companion” with a tiny screen, perfect for use with the MeshCore smart phone apps. I later also picked up a Heltec V4 with GPS. I’ll explain why I’ve collected so many devices next.

Fortunately, the same hardware that works for Meshtastic can also be easily converted to MeshCore by simply re-flashing the devices with the Meshcore web flasher. So, after deciding to make the leap, it literally only took a few minutes to switch over. 

The next step: put up a MeshCore repeater

Unfortunately, as many users of both systems have experienced, my neighborhood doesn’t have MeshCore coverage, so I basically had 3 devices that were nothing more than pretty gadgets. At that point, I decided to jump in and pick up a MeshCore repeater. After reading reviews, I decided on the Seeed Studio SenseCAP Solar Node P1-Pro for MeshCore, which cost around $140 on Amazon. This is a very cool, self-contained, weatherproof device that, once flashed and configured, is set-and-forget. It powers itself with a decent solar panel, and you can monitor the device health remotely. I also picked up a 6 dB gain vertical antenna to go with it, hoping that it would help ensure successful connections to the local MeshCore network. I also performed a survey of repeaters in the area, finding several within a few miles, so I had a pretty good feeling that a rooftop repeater would work. 

The next challenge: figure out how best to mount the repeater on my roof. I could have attached it to my chimney, but I discovered a mount that spans the peak of the roof (originally designed for a StarLink dish), which is weighed down by two cement tiles (which I happened to already have on hand). So I picked that up as well. 

Assembling and configuring the repeater was pretty straightforward; you flash the repeater using the same web flasher, just specifying the device type and its role as a repeater. Repeater configuration is also done via a web user interface. I did check with the local MeshCore group, which has guidelines on how to name the repeater; if you’re in the Denver/Colorado area, here’s the repeater guide from the Colorado MeshCore website. My repeater’s name is DEN-LTTN-CBNE-RE-7235, in case you are in Denver and want to see if it’s visible to you.

After flashing, assembling, and installing the repeater on my roof, my MeshCore companion devices immediately discovered it, and as the repeater advertised itself to the network, wha-la! I started seeing messages coming through on the various public channels. WOW! I was finally on the network! After the next few days and weeks, the repeater charged itself to 100%, and it’s regularly communicating with about 20 repeaters all over the south Denver area, as far away as Berrian Mountain in Evergreen, Mount Herman in Monument, and a repeater near I-25 and Quincy: some as far as 35 miles away. This amazes me, given that the repeater only transmits around 250 mW (1/4 of a watt!). 

I also discovered a very cool live map that shows MeshCore activity all over the Denver area, and I really enjoy watching traffic being relayed by my repeater. I could literally watch the map all day. :-) If you want to have a look yourself, here’s the map link. (Hint: press the ‘Live map’ button to see the live activity as it happens).

My MeshCore repeater

The next step: adding a MeshCore Observer to my home setup

Next, since I thought the live MeshCore map was so cool, I dove in to figure out how to see how it’s actually generated, since MeshCore, by definition, is not connected to the Internet. It turns out there is a third MeshCore device type, called an Observer, that passively receives MeshCore signals and then relays what it sees to Internet-based servers using the MQTT protocol. Observers can also host “room servers”, which are like a local message board where MeshCore users can post messages that persist, as opposed to regular MeshCore messages, which have no store-and-forward capability. In other words, if your MeshCore device isn’t on and in range of a repeater when a message is sent, you’ll never see it. 

The good news: Observers use the same hardware as every other MeshCore device, so I re-purposed my Heltec V3 into an Observer. Just like the other node types, it was a simple firmware flash using the web flasher, this time specifying an observer as the device type. And when you configure the Observer, you also connect it to WiFi, which gives it the ability to relay messages and network telemetry to the internet-based servers. I just set my Observer up in a window on the second floor of my house and let it do its thing. Since I have a repeater, it receives the traffic going in and out of my repeater, and sends the data to the Internet. I haven’t set up a room yet, but it’s on my to-do list.

Conclusion: where do we go from here?

As you no doubt have surmised, there is a whole lot more to MeshCore than just simple messaging. The protocol can carry digital data, like telemetry and command-and-control data, similar to the ham radio APRS protocol, which I haven’t begun to investigate. And naturally, the biggest challenge is promotion: getting as many people as possible to put up repeaters in their neighborhoods, so the mesh can become more resilient and reliable. It’s growing really rapidly, with over 300 nodes in Denver. So if you’re so inclined, join the mesh and help us build a resilient network that can survive without power or Internet!






















Comments

Popular Posts