MeshCore — best practices
To remember
Join the local groups
First, find the MeshCore groups for your city, region, or country. They run the mesh.
Same radio as the mesh
Use your community preset. In Europe and the UK that is usually EU/UK (Narrow).
2-byte hops
In the app, set the path header to 2 bytes (32 hops) once the mesh around you runs 1.14+.
This page is meant to travel over the air. One short URL, no account, and it is not tied to a single county. Local radio law always wins. Region names and the exact preset belong to your community, not to a single global standard.
Useful firmware: 1.14+ for multi-byte hops, 1.17+ for CAD. Recent MeshCore app (1.41+ for hops, 1.49+ for the network menus described here).
Community
The most useful step: join the MeshCore groups for your city, your region, or your country. Radio presets, region names, channels, and repeater placement are decided there. A lone node, even well configured, can hurt the mesh if it ignores local choices.
Radio
Every node on the same mesh must share the same frequency, bandwidth, spreading factor, and coding rate. A different preset means you hear nobody.
Pick the preset in Settings → Radio settings (or at flash time). In Europe and the UK the recommended preset is EU/UK (Narrow): 869.618 MHz, 62.5 kHz, SF8, CR8. Switzerland publishes the same numbers. Other countries have their own line in the app. Do not copy a foreign preset “because it goes farther”.
Hardware must match the legal band: 868 MHz in Europe and the UK, 915 MHz in the United States, Canada, Australia, and New Zealand. An 868 radio does not become legal in the US by changing a menu.
Presets seen in the official app (community snapshot, January 2026; the app remains the source of truth):
| Area | Preset | Frequency | SF | BW | CR |
|---|---|---|---|---|---|
| EU / UK | EU/UK (Narrow) | 869.618 MHz | 8 | 62.5 kHz | 8 |
| Switzerland | Switzerland | 869.618 MHz | 8 | 62.5 kHz | 8 |
| Czechia | Czech Republic (Narrow) | 869.525 MHz | 7 | 62.5 kHz | 5 |
| Portugal 868 | Portugal 868 | 869.618 MHz | 7 | 62.5 kHz | 6 |
| USA / Canada | USA/Canada (Recommended) | 910.525 MHz | 7 | 62.5 kHz | 5 |
| Australia | Australia | 915.800 MHz | 10 | 250 kHz | 5 |
| Victoria (AU) | Australia: Victoria | 916.575 MHz | 7 | 62.5 kHz | 8 |
| New Zealand | New Zealand (Narrow) | 917.375 MHz | 7 | 62.5 kHz | 5 |
| Vietnam | Vietnam | 920.250 MHz | 11 | 250 kHz | 5 |
European 869.4–869.65 MHz sub-band: typically 500 mW ERP and a 10% duty cycle. With a gain antenna, lower TX power so you stay inside the limit. In the United States, FCC 15.247 is different: there is no European 10%. Check the local authority (Ofcom, ANFR, BNetzA, FCC, ACMA…).
2-byte hops
A packet path can encode repeaters in 1, 2, or 3 bytes. One byte still works on old firmware, but identifier collisions are common. 2 bytes (65,536 identifiers, 32 hops at most) is the right trade-off once enough repeaters run 1.14+. Older nodes drop multi-byte packets. Three bytes (21 hops) is for very large deployments.
On the companion: ⚙ Settings → Network settings → default header size 2 bytes, or ⚙ Settings → Experimental settings (depends on the app version).
Companion
Name the node in ⚙ Settings → Public information. The ISO country + subdivision prefix is used on every node, companions included: GB-ENG-Sam, US-WA-Alex.
In Network settings: header 2 bytes, default region = your country (fr, gb, nl…). Add your community hashtag channels (often #country, #emergency for emergencies only, #info, #meteo, #test, plus the local one). Then set the region scope on each channel.
Do not invent a “longer range” radio preset if the mesh around you is already fixed.
Checklist
- Join the MeshCore groups for your city, region, or country.
- Same band and preset as the local mesh (EU/UK Narrow in Europe / UK, unless the community says otherwise).
- Firmware 1.17+ on every node.
- Header / hops at 2 bytes in the app.
I have a repeater
Hierarchical regions
Without a region, a neighbourly message can cross a whole country and fill the channel. A region is a tag on the packet. A repeater forwards it only if that tag is in its list. Matching is exact: gb is not gb-eng. That is why you use a hierarchy, and why you list every useful region.
Common convention: lowercase, a-z, 0-9, hyphens, 29 bytes at most.
continent → country → area → local
eu → fr → fr-pac → fr-06
eu → gb → gb-eng → gb-nwk
eu → nl → nl-nh
us → us-fl → us-fl-cfl
au → au-nsw → au-nsw-syd
Exact names come from your community. Discover them in the app: open a channel → ⋮ → set region scope → discover regions.
Example chain on a repeater (adapt it):
region def eu gb gb-eng gb-nwk
region default gb
region home gb
region save
region def builds a parent → child chain and allows flood. region put child parent does the same step by step. region default is the scope this node puts on packets it originates. region home says where it sits. region save writes flash. A repeater that only has * is not a local filter: many communities refuse to rely on it.
On the companion, bind each channel to one region. A pattern, not a mandatory list:
| Channel | Typical region |
|---|---|
| Public | continent (eu, sometimes the country) |
#country (#fr, #nl) |
country |
| #emergency, #info, #meteo, #test | area |
| local channel (town, county) | local |
A #alpesmaritimes message scoped fr-06 stops at the first repeater that does not list fr-06. That is the point. Use full place names and hyphens so names stay unique (#kingston-upon-hull).
Repeater
Name it COUNTRY-SUB-City-District-free. The first four letters of the city are uppercase, the rest lowercase. The district is optional; the last segment is free (site, owner). Examples: GB-ENG-LONDon-Soho-Sam, US-WA-SEATtle-Capitol-Alex. Put it high, keep it powered, use a tuned antenna and a short feed. Add a public contact. Leave telemetry open to guests: no guest password. Sync the clock (clock sync from the companion).
Typical CLI, adapt it (duty cycle 10 is mainly Europe on 869.4–869.65 MHz; elsewhere follow local law). Some communities disable zero-hop adverts (set advert.interval 0):
set advert.interval 240
set flood.advert.interval 24
set flood.max.advert 6
set flood.max.unscoped 5
set multi.acks 1
set path.hash.mode 1
set loop.detect minimal
set dutycycle 10
set agc.reset.interval 4
set cad on
set repeat on
region def eu gb gb-xx gb-yy
region default gb
region home gb
region save
reboot
clock sync
| Command | Role |
|---|---|
advert.interval 240 |
Zero-hop advert every 4 hours, for nearby neighbours. |
flood.advert.interval 24 |
Network discovery once a day, without flooding the channel. |
flood.max.advert 6 |
Flood adverts do not travel too far. |
flood.max.unscoped 5 |
Messages with no region stay local. |
multi.acks 1 |
Extra acknowledgements, more reliable. |
path.hash.mode 1 |
Repeater adverts use 2 bytes. |
loop.detect minimal |
Drops loops (thresholds depend on 1, 2, or 3 bytes). |
dutycycle 10 |
10% cap (typical EU). 100 = no software limit. |
agc.reset.interval 4 |
Periodic AGC reset, useful in a noisy site. |
cad on |
Listen before transmit (firmware 1.17+). |
repeat on |
Forwarding enabled. |
Firmware 1.17+ is the comfortable baseline for CAD + 2-byte hops + regions.
CAD
CAD (Channel Activity Detection): the radio listens before it transmits and waits if the channel is busy. On a 1.17+ repeater or room server:
set cad on
It is off by default.
On a very noisy site, CAD can delay a transmission by a few seconds. Talk to the community before you turn it off. On companions, hardware CAD is not yet a stable in-app setting: the useful step is set cad on on the repeater.
- Hierarchical regions listed one by one; channels bound;
region save. - Quiet adverts, multi-ACK, legal duty cycle, correct clock,
repeat on. set cad on(1.17+).- Name in the
COUNTRY-SUB-City…form (first four city letters uppercase), public contact, guest telemetry left open, decent antenna and power.
Sources
Adapted from the Alpes-Maritimes guide for every country. Commands: MeshCore CLI. Hops: MeshCore FAQ. EU radio: MeshCore Europe. Presets: LetsMesh. CAD: 1.17.0 notes. Project: meshcore.io.