Why MeshCore Needs Regions
Explained simply
How MeshCore works
MeshCore is a radio network made of many small repeaters. When you send a message, here is what happens:
- Your device transmits the message over LoRa radio.
- Every repeater that receives the message passes it on — exactly once.
- The message hops from repeater to repeater until it has reached everyone on the network.
This is called flooding. It is robust and simple, but it has a catch: every single message from every user is repeated by every repeater on the network.
Counting it out: what does a message really cost?
Let's walk through it step by step. The "companion" is your device — a smartphone plus a MeshCore Companion. Every repeater that hears a message repeats it exactly once. Let's count how often a single message occupies the radio channel — your own transmission included:
| Setup | Transmissions per message |
|---|---|
| One companion, one repeater | 2 |
| One companion, two repeaters | 3 |
| One companion, four repeaters | 5 |
The pattern: one transmission from you, plus one per repeater in range. Every repeater that hears you adds exactly one more transmission to every message.
And here is the catch: in a densely populated area where ten repeaters all hear each other, a single short message already occupies the channel eleven times. An eleventh repeater there does not improve coverage — the area is long since covered — but it makes every message, for everyone, one transmission more expensive. More repeaters are not automatically better: once an area is covered, each additional repeater only spends shared transmit time.
The legal limit
Radio in the 868 MHz band is tightly regulated in Europe. A LoRa station may only transmit 10% of the time (duty cycle). More is prohibited — this protects other radio services from interference.
10% of an hour is 360 seconds of transmit time.
This 10% limit is a rolling window: what counts is always the last 60 minutes. You cannot save up unused transmit time and burst it later.
Step 1: How long does a packet take on average?
The average transmit time per packet can be derived from the repeaters' statistics:
Average transmit time = total TX time ÷ packets sent
| Repeater | Total TX time | Packets sent | Avg. TX time/packet |
|---|---|---|---|
| Flower | 132,455 s | 247,165 | 536 ms |
| RatSchen | 112,575 s | 221,376 | 509 ms |
| MU2 | 133,516 s | 257,796 | 518 ms |
| Silo3 | 124,073 s | 246,581 | 503 ms |
| GHETTO | 238,985 s | 407,917 | 586 ms |
So a single packet occupies the radio channel for roughly half a second.
Step 2: How many packets fit into 10% of an hour?
Max. packets/hour = 360 seconds ÷ avg. transmit time per packet
Example calculation for Flower:
360 s ÷ 0.536 s = 672 packets/hour
| Repeater | Avg. TX time/packet | Max. packets/hour |
|---|---|---|
| Flower | 536 ms | 672 |
| RatSchen | 509 ms | 708 |
| MU2 | 518 ms | 695 |
| Silo3 | 503 ms | 716 |
| GHETTO | 586 ms | 614 |
So roughly 680 packets per hour on average — and that is the absolute ceiling.
The crucial point
These 680 packets per hour are not per user — they are the total for all users combined.
Whether 5 or 500 people are on the network: each repeater may forward only this one quota of packets. If 50 people write at the same time, they share the same pot.
An analogy: picture a phone booth with only one hour of call time per day. Whether one person or a hundred people use it — the hour only lasts once.
Why regions are the solution
When the network grows, there is only one way to create more capacity: split the network.
A region is a bounded area with its own repeaters. Messages from region A are not forwarded into region B. As a result:
- A region keeps its repeaters' transmit-time pot for its own traffic — as long as it does not overlap with other regions
- Repeaters are not clogged up by distant, irrelevant messages
- Local messages stay quick to deliver
- The legal 10% limit is respected
Without regions, a single large network would inevitably hit the limit once it passed a certain number of users. Messages would then arrive late or not at all, because the repeaters would have used up their permitted transmit time.
How to structure regions sensibly
Regions work best when they are built like concentric circles — from small to large:
Hierarchy, not a patchwork
🌍 Parent region (e.g. Northern Germany)
└─ 🏙️ City/district (e.g. Pinneberg district)
└─ 🏘️ Town (e.g. Wedel)
└─ 🏠 Local group (e.g. neighbourhood, makerspace)
Each level has its own repeaters and its own transmit-time pot. Someone chatting in Wedel burdens neither the whole Pinneberg district nor the neighbours in Bremen.
Rules of thumb for good regions
- Sensible geographic boundaries — town, district, valley, island. Not all over the place.
- Mind the repeater density — a region should have enough repeaters for messages to arrive, but not so many that every message is repeated 30 times.
- Clear names — starting with the country code, e.g.
de-hh,de-sh-pi,de-nord. So everyone immediately knows what a region is for. - Plan the crossings — anyone who needs to communicate across regions deliberately uses the larger parent region or direct messages.
Watch out: several regions on one repeater
A repeater carries a list of regions. But its transmit-time pot — the roughly 680 packets per hour — is only one pot. That single pot is shared across all the regions the repeater carries.
Tag a repeater with four regions and those four regions compete for the same pot. You have not created four times the capacity — you have made four regions share one pot. Overlapping regions get their transmit time for all of them combined, not each on its own.
When this happens across the board — many operators tagging their repeater with several provinces — those regions effectively merge back into one single large network. That is exactly what happened on a wide scale after regions were introduced: the intent ("be reachable everywhere") is understandable, but the effect is the opposite of what regions are for — the provinces' traffic flows back together.
Remember: tag every repeater with the smallest set of regions it genuinely serves. A repeater on a provincial border may justify two regions; a repeater tagged with five provinces is just rebuilding the one big network.
Golden rule: always use the smallest fitting region
For every message, pick the smallest region that covers all the recipients you want.
Three examples:
| What do you want to do? | Right region |
|---|---|
| Message the neighbour around the corner | 🏠 Local group |
| A question to everyone in your town | 🏘️ Town |
| A warning to the whole Northern Germany community | 🌍 Parent region |
Why this matters so much
If you post a pure neighbourhood message in the large Northern Germany region, then:
- Every repeater across all of Northern Germany spends its transmit-time pot on it
- Hundreds of users get a message that does not concern them
- The network gets slower for everyone else
A single message in the wrong region costs many times the transmit time compared to the same message in the right, small region. With many users, that quickly adds up to a bottleneck.
Remember: the larger the region, the more expensive each message is for the network. Always send as local as possible, as far as necessary.
In short
Every repeater has a hard limit of about 680 packets per hour. All users on the network share this limit together. Regions are not red tape — they are the only way to keep the network scalable and legal for many users. And: whoever sends in the smallest possible region gives everyone else more transmit time.