LoRa Mesh
Made Simple
Pick a device, set it up right, and know how far it will reach — Meshtastic and MeshCore, explained for beginners and experts.
client.meshtastic.org web, Python CLI. MeshCore: Liam Cottle's app for Android, iOS, Windows and Mac, the web app at app.meshcore.nz, and config.meshcore.io for repeaters.Meshtastic 2.8: read before upgradingNew default preset, node IDs, opt-in position
- New US nodes default to LONG_TURBO, not LONG_FAST (only when the region is picked for the first time on the device screen). The two presets cannot hear each other — set LONG_FAST manually to join an existing mesh.
- Node ID now comes from the node's public key, not the MAC address. Expect your node number to change.
- Packet signing (XEdDSA) lets receivers verify who sent a packet; unsigned-packet policy is being tightened.
- Position and telemetry broadcasts are opt-in. A fresh 2.8 node stays quiet until you turn them on.
- Precise position is no longer allowed on public/known-key channels — use a private channel to share exact location.
- Long name capped at 25 bytes; new Traffic Management module (dedup, rate limiting, role-aware policing); automatic variable hop limits; noise-floor tracking; new region table including ham 2 m / 1.25 m / 70 cm carve-outs; LoRa changes apply without a reboot; new presets (Long Turbo, Medium Turbo, Lite, Narrow and Tiny families).
- If an upgraded node boot-loops, export your config, then do a full erase and flash.
Which version should I run?Upgrade advice by user type
| You are | Run this | Why |
|---|---|---|
| New user joining a local mesh | Meshtastic 2.7.26 on LONG_FAST (or whatever your mesh uses) | Matches what nearly every existing US node is running today. |
| Rooftop / solar router operator | 2.7.26 until your community agrees to move | An infrastructure node on an alpha can break a whole area; 2.8 changes node IDs and defaults. |
| Tinkerer with a spare node | 2.8.0 alpha on the spare | Try signing, traffic management and the new presets; report bugs. |
| MeshCore user | 1.17.1 on everything | Big collision-avoidance improvement; config auto-migrates to JSON (old blob kept for rollback). |
LoRa mesh in 60 secondsStart here if you are brand new
LoRa is a long-range, low-power radio. A small $20–$100 radio talks to your phone over Bluetooth and sends short text messages to other radios miles away — no cell towers, no internet, no license.
A mesh means radios pass messages along for each other, so a message can hop across a whole city.
- Meshtastic: every radio helps relay. Works anywhere, great for groups, hiking, events and GPS tracking.
- MeshCore: only dedicated repeaters relay. Scales better across big cities, but needs repeaters to reach beyond direct range.
Both run on the same hardware. The biggest range upgrades are height and a good antenna, not more power.
Learn
How LoRa and the two mesh systems work. Tap a topic to open it.
How LoRa radio worksChirps, spreading factor, bandwidth, airtime
LoRa sends data as chirps — tones that sweep across the channel from low to high frequency. Each symbol is a chirp that starts at a different point in the sweep, and that starting offset is the data. Because the receiver correlates against the known chirp shape, LoRa tolerates Doppler, crystal drift, multipath and narrow interference unusually well, and it can decode signals that sit below the noise floor.
Spreading factor, bandwidth and coding rate
Spreading factor (SF) sets how many chips make one symbol (2SF). Each step up doubles time on air and buys about 2.5 dB of sensitivity. Bandwidth (BW) is the width of the sweep; halving it gains ~3 dB but halves speed. Coding rate (CR) adds error-correction bits (4/5 = 25% overhead, 4/8 = 100%).
Bar length = raw bit rate at 125 kHz BW, CR 4/5. Sensitivity is typical SX1262 (6 dB noise figure) at 125 kHz.
Processing gain
The ratio of chip rate to bit rate gives LoRa roughly 10·log10(2SF/SF) dB of processing gain — about 13 dB at SF7 and 25 dB at SF12. In practice the demodulator can pull a signal out at -7.5 dB SNR (SF7) down to -20 dB SNR (SF12). That is why a LoRa node shows negative SNR on packets it decodes perfectly.
Time on air — the hidden cost of range
Every transmission occupies the channel for everyone. On a busy mesh, airtime — not range — is usually the limit. Numbers below are calculated for a typical 66-byte Meshtastic packet (16-byte header + 50-byte payload) with a 16-symbol preamble.
| Preset | SF / BW / CR | Time on air | RX sensitivity (est.) |
|---|---|---|---|
| SHORT_TURBO | 7 / 500 / 4/5 | ~33 ms | -118.5 dBm |
| SHORT_FAST | 7 / 250 / 4/5 | ~66 ms | -121.5 dBm |
| MEDIUM_FAST | 9 / 250 / 4/5 | ~211 ms | -126.5 dBm |
| MeshCore US narrow | 7 / 62.5 / 4/5 | ~263 ms | -127.5 dBm |
| MEDIUM_SLOW | 10 / 250 / 4/5 | ~402 ms | -129 dBm |
| LONG_TURBO | 11 / 500 / 4/8 | ~509 ms | -128.5 dBm |
| LONG_FAST | 11 / 250 / 4/5 | ~723 ms | -131.5 dBm |
| LONG_MODERATE | 11 / 125 / 4/8 | ~2.4 s | -134.5 dBm |
| LONG_SLOW (deprecated) | 12 / 125 / 4/8 | ~4.6 s | -137 dBm |
A 3 dB gain in link budget is worth about 1.4× more range in cluttered terrain. You can buy that 3 dB with a slower preset (costing airtime for everyone), or with a better antenna and more height (costing nobody anything). Height and antennas first; slow presets last.
Frequencies & legal limitsUS 915 MHz, power rules, where meshes sit
LoRa mesh uses license-free ISM/SRD bands. The band is set by your hardware (a 915 MHz board will not work on 433 MHz) and the region setting, which must be set before a node will transmit.
US)Where US meshes actually sit
| Network | Center frequency | Settings | Notes |
|---|---|---|---|
| Meshtastic default (LONG_FAST) | 906.875 MHz | SF11 / 250 kHz / 4/5 | Frequency slot 0 = hash of the primary channel name, which lands on slot 20 of 104 for "LongFast". |
| Meshtastic 2.8 new-US default (LONG_TURBO) | Varies by slot | SF11 / 500 kHz / 4/8 | Only on first-time region selection; not compatible with LONG_FAST. |
| MeshCore "USA/Canada (Recommended)" | 910.525 MHz | SF7 / 62.5 kHz / 4/5 | The "narrow" preset most US MeshCore meshes adopted from Oct 2025. Older meshes may still be on 250 kHz / SF10–11 — ask locally. |
Under FCC Part 15 the common interpretation for 902–928 MHz is 1 W (+30 dBm) into the antenna and no more than +36 dBm EIRP — for every dB of antenna gain above 6 dBi, reduce transmit power by 1 dB. High-power boards (Station G2/G3, 1 W and 2 W E22 modules) can exceed this and must be turned down unless you operate as a licensed ham under Part 97. Part 97 operation means no encryption and identifying with your callsign — set is_licensed (Meshtastic "Licensed amateur radio") and use unencrypted channels.
LoRa vs LoRaWAN vs meshWhat is and is not the same thing
| Feature | Raw LoRa | LoRaWAN | Meshtastic | MeshCore |
|---|---|---|---|---|
| Topology | Point-to-point | Star (nodes → gateways) | Mesh, every client can relay | Mesh, only repeaters relay |
| Infrastructure needed | No | Gateways + network server | No (routers help) | Repeaters for anything past direct range |
| Internet | No | Required | Optional (MQTT bridge) | Optional (bridges, observers) |
| Channel encryption | None | AES-128 session keys | AES-128/256-CTR per channel PSK | AES-128 per channel secret |
| Direct messages | — | — | X25519 public-key (PKC) since 2.5; XEdDSA signing in 2.8 | Ed25519 identity, ECDH shared secret per contact |
| Typical use | Custom links | Sensors, meters | Groups, events, hiking, emergency | City-scale messaging networks |
Meshtastic: how it worksRouting, roles, encryption, presets
Meshtastic was started in 2020 by Kevin Hester (geeksville) and has grown into the largest LoRa mesh project, with firmware for ESP32, nRF52840, RP2040/RP2350, STM32WL and Linux (meshtasticd). A phone connects over Bluetooth, Wi-Fi, USB serial or Ethernet; the radio does all the mesh work.
Routing: managed flooding + next-hop
- Every packet carries a hop limit (default 3, max 7) and a hop start so receivers know how far it has traveled.
- A node that hears a new packet waits a short random time before rebroadcasting. The wait is shorter for weaker signals (farther nodes relay first, extending coverage) and shortest for ROUTER roles.
- If it hears someone else rebroadcast the same packet during its wait, a CLIENT cancels its own rebroadcast. ROUTERs always rebroadcast; ROUTER_LATE rebroadcasts after everyone else.
- Since firmware 2.6, direct messages learn a next-hop: once a reply path is known, only the chosen relay repeats the DM, falling back to flooding if it fails.
- 2.8 adds a Traffic Management module (dedup, rate limits, role-aware policing) and automatic variable hop limits based on how busy the mesh is.
Broadcasts (channel messages, positions, telemetry, node info) still flood. On LONG_FAST each packet is ~0.7 s of airtime, and a busy city mesh with 150+ nodes can spend more than half its airtime on background chatter. Keep hop limit at 3, keep position/telemetry intervals long, and use ROUTER roles only on truly high sites.
Packet format
Text messages are limited to about 200 characters. Direct messages using PKC carry an extra 12 bytes (auth tag + nonce extra) inside the payload.
Device roles (2.7 / 2.8)
Channels & encryption
- Channels are defined by a name and a pre-shared key (PSK). A node holds 1 primary + up to 7 secondary channels. The primary channel's name also picks the default frequency slot.
- The default channel (
LongFast, PSKAQ==) uses a publicly known key — treat it as a public CB channel. - Private channels use a random 128- or 256-bit AES key in CTR mode. Anyone with the key can read and send — channel keys identify a group, not a person.
- Direct messages (firmware 2.5+) use each node's X25519 key pair for true end-to-end encryption and authentication. 2.8 adds XEdDSA packet signing so receivers can verify the sender of broadcasts too.
- Remote admin uses admin keys (Security config) instead of the old shared "admin" channel.
Modem presets
Link budgets assume +22 dBm and 0 dBi antennas (official Meshtastic table). VERY_LONG_SLOW has been removed. 2.8 also lists Medium Turbo plus Lite, Narrow and Tiny preset families, mainly for new EU narrow allocations and licensed bands. Every node on a mesh must use the same preset and frequency slot.
MeshCore: how it worksCompanions, repeaters, room servers, paths
MeshCore (firmware by Scott Powell / Ripple Radios, apps by Liam Cottle, MIT-licensed firmware) was built for one job: reliable text messaging across a city without the rebroadcast storms of pure flooding. It does that with separate firmware for separate jobs and learned paths for direct messages.
Routing: flood once, then direct
- Adverts announce a node's name, location and signed public key. Companions advert only when you tap Advert (zero-hop or flood); repeaters flood-advert every 12 h by default.
- Your first DM to a contact floods through repeaters (up to 64 hops internally).
- The recipient's delivery report comes back carrying the list of repeaters it traveled through. Your app stores that path on the contact.
- Later DMs carry the path in the packet; only repeaters named in it forward. If the path breaks, the app retries, then resets the path and floods on the last retry.
- Channels (public or private group chats) always flood, because they have no single destination. Repeater admins can cap flood hops and use regions/scopes to keep floods local.
Clients are silent unless you are talking, repeaters are the only relays, and most DM traffic follows one path instead of flooding. A 200-client city mesh with 20 repeaters carries far less background chatter than the same city on Meshtastic. The trade-off: you need repeaters — two companions out of each other's range cannot relay for each other.
Security model
- Every node has an Ed25519 identity key; adverts are signed so names cannot be spoofed.
- DMs use a per-contact shared secret derived with ECDH, then AES-128 with an HMAC. On nRF52 1.17 uses the CC310 hardware crypto engine.
- The Public channel key is published (
8b3387e9c5cdea6ac9e5edbaa115cd72); #hashtag channels derive their key from the name (anyone who knows the name can join); private channels use a random secret shared by QR. - Repeaters and room servers use an admin password (default
password— change it) and optional guest password; the ACL grants guest/read-only/read-write/admin per public key.
Meshtastic vs MeshCoreWhich one fits you
Scores are this guide's editorial judgment, not benchmarks.
| Feature | Meshtastic 2.7 / 2.8 | MeshCore 1.17 |
|---|---|---|
| Who relays | Every node (CLIENT relays if nobody else did) | Only repeaters (and room servers with repeat on) |
| Routing | Managed flood; next-hop for DMs | Flood to discover, then source-routed direct path |
| Default hops | 3 (max 7) | Up to 64 (capped by repeater flood.max) |
| US default radio | LONG_FAST 906.875 MHz, SF11/250 (2.8 new-US: LONG_TURBO) | 910.525 MHz, SF7/62.5 |
| DM encryption | X25519 PKC + AES; XEdDSA signing (2.8) | Ed25519 identity, ECDH + AES-128/HMAC |
| Offline message storage | Store & Forward module (ESP32 PSRAM) | Room servers (built for it) |
| GPS / telemetry | Rich, many sensors | Location in adverts, sensor telemetry on request |
| MQTT / internet | Built in | Community bridges and observers |
| ATAK | Native plugin, TAK roles | Not on roadmap |
| Apps | Android, iOS/macOS, web, Python CLI, many third-party | Android, iOS, Windows, Mac, web; T-Deck Ultra firmware |
| License | GPL-3.0 (firmware) | MIT (firmware); native apps closed-source freemium |
| Pick it for | Groups, hiking, events, ARES/TAK, sensors, anywhere with no repeaters | Reliable city-wide messaging where people will host repeaters |
No. Different packet formats, and usually different frequencies. The same hardware runs either firmware, so many people keep one node on each.
Which platform for which jobQuick decision table
| Use case | Platform | Why / key setting |
|---|---|---|
| Family comms when cell service fails | Either; Meshtastic if no local repeaters | Private channel; one CLIENT_BASE or repeater on the roof. |
| Hiking / hunting / backcountry group | Meshtastic | Every radio relays; no infrastructure needed. |
| City-wide community chat | MeshCore (or Meshtastic with good router discipline) | MeshCore scales better when many people join. |
| ARES / SAR / CERT with ATAK | Meshtastic | TAK roles, MGRS, telemetry. |
| Vehicle / asset / pet tracking | Meshtastic TRACKER | GPS priority, sleep between fixes. |
| Remote weather / gate / water-level sensors | Meshtastic SENSOR / Detection Sensor | Long sleep, environment telemetry. |
| Message board that holds posts for later | MeshCore Room Server | Built for offline pickup. |
| Festival / convention | Meshtastic on SHORT_FAST | Fast preset for hundreds of nodes. |
PropagationTerrain, trees, buildings, ducting
- Free space — 6 dB more loss per doubling of distance. Only true with clear line of sight and Fresnel clearance.
- Two-ray / ground reflection — beyond a break-point distance loss grows 12 dB per doubling, and raising either antenna directly reduces loss (6 dB per doubling of height).
- Okumura-Hata / COST-231 — empirical urban/suburban models; reasonable for planning from base-station heights.
- ITM / Longley-Rice — terrain-aware; used by HeyWhatsThat, Radio Mobile and many coverage tools. Best for siting a specific repeater.
Environmental factors
- Trees: roughly 0.2–0.5 dB per meter of foliage at 900 MHz; worse wet and in leaf. Summer range in wooded suburbs is noticeably shorter than winter.
- Buildings: 5–15 dB per exterior wall (brick/stucco/low-E glass on the high end); metal roofs and foil insulation can block attic nodes almost completely.
- Vehicles: a node on the dashboard loses 10–20 dB versus a roof antenna.
- Rain: negligible at 915 MHz.
- Tropospheric ducting: temperature inversions (common on still Texas nights) occasionally carry signals 100+ miles.
LoRa history & radio chipsSemtech SX1262, LR1110, LR2021
LoRa (Long Range) modulation was invented at Cycleo, a startup in Grenoble, France, founded in 2009. In 2012 Cycleo was acquired by Semtech Corporation (Camarillo, California), which holds the patents and sells the radio chips that every Meshtastic and MeshCore node is built around.
The first-generation SX1272/SX1276 transceivers made LoRa cheap and common. The second-generation SX126x family (SX1261/SX1262/SX1268) cut receive current roughly in half, improved sensitivity and added spreading factors 5 and 6; it is the chip in almost every modern mesh node. The LR11xx line adds GNSS and Wi-Fi scanning (the T1000-E uses an LR1110), and the newest LR2021 is now supported by MeshCore 1.17.
LoRa is the radio modulation (physical layer). LoRaWAN is a separate star-network protocol run by the LoRa Alliance. Meshtastic and MeshCore ignore LoRaWAN entirely and send raw LoRa packets with their own mesh protocols.
Semtech silicon you will meet in mesh nodes
| Chip | Generation | Key features | Found in |
|---|---|---|---|
| SX1276 / SX1278 | 1st gen (~2013–15) | SF7–12, +20 dBm, ~11 mA RX | Old T-Beam v0.7/v1.0, TTGO T3 v1.6, RFM95 modules |
| SX1262 | 2nd gen | SF5–12, +22 dBm, ~5 mA RX, boosted-gain RX mode | Heltec V3/V4, T114, RAK4631, T-Deck, T-Echo, T-Beam Supreme, Station G2/G3 |
| SX1268 | 2nd gen | 410–810 MHz variant of SX1262 | 433/470 MHz boards |
| LR1110 / LR1121 | LR11xx | LoRa + GNSS scan + Wi-Fi scan; LR1121 adds 2.4 GHz | Seeed T1000-E, some trackers |
| SX1280 / SX1281 | 2.4 GHz | LoRa at 2.4 GHz, shorter range, worldwide band | Meshtastic LORA_24 region builds |
| LR2021 | Newest | Multi-band, higher data rates | Meshnology W12 (MeshCore 1.17) |
GlossaryEvery term in plain English
| Term | Meaning |
|---|---|
Advert | MeshCore announcement of a node's name, key and optional location. |
AGC | Automatic gain control in the receiver; can get "stuck" near strong signals. |
BW / SF / CR | Bandwidth, spreading factor, coding rate — the three LoRa modem settings. |
CAD | Channel Activity Detection — hardware check for LoRa energy before transmitting. |
Channel utilization / airtime | Percent of time the channel is busy / your node transmitted. Above ~25% utilization a Meshtastic mesh starts dropping packets. |
dBm / dBi | Power relative to 1 mW / antenna gain relative to an isotropic radiator. +3 dB = double power. |
EIRP | TX power + antenna gain − losses; the number the FCC limits (36 dBm). |
FEM / PA / LNA | Front-end module / power amplifier / low-noise amplifier on high-performance boards. |
Flood / direct | Broadcast relayed by everyone vs. relayed only along a known path. |
Frequency slot | Meshtastic's numbered channel within a region (104 slots in US on LONG_FAST). |
Fresnel zone | Football-shaped region around the direct path that must be mostly clear. |
Hop limit | Maximum relays a packet may take. |
MQTT | Internet publish/subscribe protocol used to bridge Meshtastic meshes. |
nRF52840 / ESP32-S3 | The two common MCU families: low-power Nordic vs Wi-Fi-capable Espressif. |
PKC | Public-key cryptography used for Meshtastic DMs and admin (X25519). |
PSK | Pre-shared key for a channel. |
Room server | MeshCore store-and-forward message board. |
RSSI / SNR | Received signal strength / signal-to-noise ratio. LoRa decodes at negative SNR. |
Time on air (ToA) | How long one packet occupies the channel. |
VSWR | Measure of antenna match; 1.0 perfect, under 1.5 good. |
Setup & Settings
Every option, what it does, and what to pick.
Quick start: first 5 minutesDo these and you are on the air
- LoRa → Region =
US(the radio will not transmit until this is set). - LoRa → Modem preset = whatever your local mesh uses (almost always LONG_FAST in the US today; check a local Discord or
meshmap.net). - User: set a long name and a 4-character short name people will recognize.
- Device → Role = CLIENT (leave it).
- Add a private channel for family/friends as a secondary channel and share its QR code.
- Decide on position sharing: on 2.7 it is on by default; on 2.8 you opt in. Set channel position precision to what you are comfortable sharing.
Menus are named the same in the Android app, the Apple apps and the web client (Settings → Radio Configuration / Module Configuration). CLI names are shown in code. Recommendation tags: EVERYONE safe advice for all, EXPERT change only if you know why, CAUTION can break things or break rules.
UserName, short name, ham mode
ownerMeshtastic xxxxFull display name shown in node lists (max 25 bytes on 2.8; emoji take several bytes).
owner_shortlast 4 hex of IDUp to 4 characters shown on maps and small screens.
is_licensedoffHam mode: uses your callsign, disables encryption, lifts software power limits. 2.8 blocks licensed nodes from relaying unlicensed traffic.
is_unmessagableoffTells others this node does not accept DMs (for unattended infrastructure).
ChannelsKeys, privacy, position precision, MQTT
Up to 11 characters. Name + key identify the channel. The primary channel name also selects the frequency slot when slot = 0.
AQ== (public)Encryption key: none, default (public), or random 128/256-bit.
Index 0 is primary (used for broadcasts like node info); 1–7 are secondary; DISABLED hides a slot.
How precisely your location is shared on that channel (10 bits ~14 mi, 13 bits ~1.8 mi, 16 bits ~0.2 mi, 32 bits = exact). 2.8 clamps public/known-key channels.
Allow this channel's packets to go to / come from MQTT.
Silences notifications for that channel on the device.
DeviceRole, rebroadcast, timezone, buzzer
device.roleCLIENTHow the node behaves on the mesh (see roles above).
ALL relays everything with matching modem settings; LOCAL_ONLY skips foreign/undecryptable channels; KNOWN_ONLY also skips unknown nodes; CORE_PORTNUMS_ONLY relays only text/position/telemetry/nodeinfo/routing; NONE for sensor/tracker.
node_info_broadcast_secs10800 (3 h)How often your name/key is announced. Nodes also answer on demand.
tzdefUTCPOSIX TZ string for the on-screen clock.
CST6CDT,M3.2.0,M11.1.0Turns off the blinking status LED.
Which events beep: all, notifications only, system only, DMs only, disabled.
Accelerometer double-tap acts as a button press.
Pin overrides for DIY builds.
PositionGPS, broadcast intervals, fixed position
Turns the onboard GPS on/off. Without GPS the node can use your phone's location.
position_broadcast_secs0 = 15 minHow often position is sent when smart broadcast is off (and the ceiling when it is on). On 2.8 broadcasting is opt-in.
Sends more often while moving, less when still.
Distance you must move before a smart update.
Minimum time between smart updates.
Use a saved lat/lon/alt instead of live GPS.
How often the GPS wakes for a fix.
Extra fields: altitude, MSL, DOP, sats in view, heading, speed, timestamp...
Pins for an add-on GPS.
PowerSleep, shutdown, battery calibration
is_power_savingoff (forced on for ROUTER on ESP32)ESP32: light-sleeps the CPU and turns off Bluetooth, Wi-Fi, serial and screen while the LoRa radio keeps listening.
Shuts down N seconds after external power disappears.
wait_bluetooth_secs0 = 60 sHow long Bluetooth stays up with no phone connected before sleep.
ls_secs0 = 300 sESP32 light-sleep interval.
min_wake_secs0 = 10 sStay awake this long after handling a packet.
Calibrates the battery voltage reading.
Use an I2C current/voltage monitor as the battery source.
Network (Wi-Fi / Ethernet)Wi-Fi, Ethernet, NTP, syslog
Joins your Wi-Fi (ESP32 only). Enables the TCP API (port 4403), web server (ESP32-S3) and MQTT. Turning Wi-Fi on turns Bluetooth off on ESP32.
Wired network on RAK13800/W5100S, RP2350+W5500 and similar.
Time source when on a network.
Static addressing.
Ships device logs to a syslog server.
Shares mesh packets with other nodes on the same LAN via multicast.
DisplayScreen timeout, units, formats
screen_on_secs0 = default (about 1 min)How long the screen stays on after activity.
Metric or Imperial for distances/altitude.
DEC, DMS, UTM, MGRS, OLC, OSGR.
Rotates screens every N seconds.
Clock style; show long names in lists.
Accelerometer wakes the screen.
Screen and compass orientation fixes.
Force SSD1306/SH1106/SH1107 driver; two-color, inverted or color mode.
LoRaRegion, preset, hops, power, frequency slot
Legal band and power limits. Node will not transmit until set.
USUse a named modem preset instead of manual BW/SF/CR.
Speed vs range trade-off. Must match the mesh.
hop_limit3How many relays a packet you originate may take (1–7).
tx_power0 = max legal for the boardRadio output in dBm (0–30).
channel_num0 = hash of primary channel namePicks the actual center frequency. US LONG_FAST has 104 slots; "LongFast" hashes to slot 20 (906.875 MHz).
sx126x_rx_boosted_gainoff (some boards on)SX126x high-sensitivity RX mode for ~1–2 mA more current.
Asks other gateways to allow (or not) your packets onto MQTT.
Drop packets that arrived via MQTT somewhere on their path.
Kill switch for the transmitter.
Manual modem settings when Use preset is off. SF 5–12 on SX126x.
Crystal error correction in Hz.
Transmit on an exact MHz, bypassing slots.
Ignore EU hourly duty-cycle limits.
Controls cooling fan on 1 W boards; external LNA on Heltec V4-class boards.
Deprecated list of node IDs to ignore.
BluetoothPairing mode and PIN
Phone app connection.
Random PIN shows on the display; Fixed PIN uses the set number; No PIN allows anyone nearby.
6-digit PIN for Fixed PIN mode.
SecurityKeys, admin keys, managed mode
X25519 identity for encrypted, authenticated DMs and (2.8) node ID and signing.
Public keys of nodes allowed to remotely configure this node over the mesh.
is_managedoffLocks local config; only admin-key holders can change settings.
USB serial API/console.
Streams debug logs to the connected client.
Old shared "admin" channel method (pre-2.5 nodes).
ModulesMQTT, telemetry, S&F, range test and more
Bridges mesh traffic to an MQTT broker (default mqtt.meshtastic.org, root topic msh/US). Settings: server, username/password, encryption, JSON output, TLS, "proxy to client" (use the phone's internet), map reporting (interval, position precision).
Device metrics (battery, voltage, channel utilization, airtime) and environment (BME280/680, SHT, etc.), air quality, power (INA), health. Intervals default to 30 min.
Preset messages selectable from a rotary encoder, up/down buttons, CardKB or T-Deck keyboard.
Drives LED, buzzer or vibration on message/bell. Nag timeout, alert on DM or on bell character only.
An ESP32 with PSRAM stores recent messages and replays them to nodes that were offline (records, history window, heartbeat).
Sender transmits a numbered message every N seconds; receiver logs RSSI/SNR/position to CSV.
Shares which nodes you hear directly (for topology maps). Minimum interval is hours.
Shows the hop path and SNR to a node.
Exposes the mesh over a UART (text, NMEA, CalTopo, Winlink-style proto).
Sends an alert when a GPIO changes (door switch, PIR motion).
Read/write GPIO pins over the mesh.
Codec2 push-to-talk voice on ESP32 (very low quality, heavy airtime).
RGB LED control; counts nearby Wi-Fi/BLE devices.
Short status text shown in node lists (2.7.19+).
Dedup, rate limiting and role-aware policing of forwarded packets.
Recommended setups by useHandheld, car, home base, relay, solar, tracker...
| Use | Role | Preset / Hops | Position | Power & other |
|---|---|---|---|---|
| Pocket handheld (everyday carry) | CLIENT | Mesh default / 3 | Smart on, 15–30 min, 13–14 bits on public | Screen 15 s, BT on, ext. notification on DMs. nRF52 device for multi-day battery. |
| Vehicle | CLIENT (CLIENT_BASE if it serves family handhelds) | Default / 3 | Smart on, min distance 300 m, min interval 300 s | 12 V power, shutdown-after-power-loss 600 s, roof NMO antenna. |
| Home base (attic/roof) | CLIENT_BASE (favorite your own nodes) | Default / 3 | Fixed position, GPS off, 1–4 h | Wi-Fi or Ethernet, RX boosted gain on, BT off if on network. |
| Tall-site relay (tower, hill, 10+ story) | ROUTER (coordinate locally) | Default / 3 | Fixed, 6–12 h | Admin keys set, BT off, unmessageable on, rebroadcast CORE_PORTNUMS_ONLY on busy meshes. |
| Dead-spot filler | ROUTER_LATE | Default / 3 | Fixed | Covers a cul-de-sac, school or low area without competing with routers. |
| Solar node | ROUTER / ROUTER_LATE / CLIENT_BASE | Default / 3 | Fixed, 12 h | nRF52 (RAK4631, T114, Xiao) preferred; telemetry 30–60 min; power saving on if ESP32. |
| Hiking / backcountry group | CLIENT | LONG_FAST or LONG_MODERATE on a private channel / 3–4 | Smart on, 5–10 min | GPS update 2–5 min; carry a spare power bank; one person with a small mast antenna helps enormously. |
| Asset / kid / pet tracker | TRACKER | Default / 3 | Private channel, full precision, 1–5 min | Power saving on; T1000-E or Wio Tracker class device. |
| Weather / sensor station | SENSOR | Default / 3 | Fixed | Environment telemetry 15–30 min, power saving on, rebroadcast NONE if on battery. |
| Event / festival | CLIENT | SHORT_FAST or MEDIUM_FAST on an event channel / 2–3 | Smart on | Faster preset keeps hundreds of nodes from jamming each other. |
| ARES / EmComm | CLIENT / CLIENT_BASE at EOC / ROUTER at high sites | Community preset / 3 | MGRS display format | Private channels; TAK role for ATAK users; pre-staged admin keys. Licensed ops may use ham mode (no encryption). |
Quick start: first 5 minutesFlash, pair, pick the US preset, advert
- Flash Companion BLE firmware at
flasher.meshcore.io(repeater firmware for a relay). - Pair the app (default BLE PIN
123456on screenless boards). - Settings → Radio: pick the USA/Canada (Recommended) preset — 910.525 MHz, BW 62.5, SF7, CR5 — unless your local group uses something else.
- Set your name, then tap Advert → Flood once so repeaters and people learn you exist.
- Join the Public channel (built in) and any local
#hashtagchannel your area uses.
Diagnostics commandsStats, neighbors, OTA, reboot
Diagnostics you will use
ver, board, clock / clock sync, neighbors, discover.neighbors, stats-core (battery, uptime, queue), stats-radio (noise floor, last RSSI/SNR, airtime), stats-packets, advert, start ota, reboot, erase (serial only, destructive).
Recommended setups by useMessenger, home relay, solar repeater, room server
| Use | Firmware | Key settings |
|---|---|---|
| Pocket messenger | Companion BLE | Regional preset, auto-add manual in dense cities, share location off. |
| Home relay in attic/roof | Repeater | Name + lat/lon, new admin password, rxgain on, advert.interval 120, flood.max 16. |
| Solar hilltop / tower repeater | Repeater (nRF52) | powersaving on, txdelay 1.0, loop.detect minimal, flood.max per regional plan. |
| Group message board | Room Server (separate device) | guest.password set, repeat off. |
| Standalone (no phone) | Ultra on T-Deck / T-Pager | Same radio preset; load map tiles to SD card. |
Apps, flashers & integrationsPhone apps, web clients, CLI, Home Assistant, ATAK
| Tool | Works with | What it is for |
|---|---|---|
| Meshtastic app (Android, iOS/iPadOS/macOS) | Meshtastic | Messaging, maps, full configuration over BLE, TCP or USB. |
| client.meshtastic.org / flasher.meshtastic.org | Meshtastic | Web client and browser-based firmware flasher (Chrome/Edge). |
Python CLI pip install meshtastic | Meshtastic | Scripting, bulk config, backups (--export-config). |
| meshtasticd | Meshtastic | Native Linux node on a Raspberry Pi + LoRa HAT (Station G3, RAK HATs). |
| Meshtastic MCP server | Meshtastic | AI-agent and test-framework access to devices (split into its own repo in 2.8). |
| MeshCore app (Android, iOS, Windows, Mac) | MeshCore | Companion messaging, repeater admin over RF; some admin conveniences are an in-app purchase. |
| app.meshcore.nz / config.meshcore.io / flasher.meshcore.io | MeshCore | Web companion app, USB repeater configurator, firmware flasher with console. |
| Home Assistant | Both (community integrations) | Node telemetry, presence and alerts as HA entities. |
| ATAK plugin (V2 in 2.8) | Meshtastic | Team positions and chat on TAK maps. |
| Node-RED / Grafana via MQTT | Meshtastic | Dashboards, logging, alert forwarding. |
Python example
import meshtastic.serial_interface
from pubsub import pub
def on_receive(packet, interface):
text = packet.get("decoded", {}).get("text")
if text:
print(packet["fromId"], text)
pub.subscribe(on_receive, "meshtastic.receive")
iface = meshtastic.serial_interface.SerialInterface()
iface.sendText("Hello from Python")Gear
Find the right radio, compare devices, GPS chips, antennas and power.
Prices are typical US street prices in 2026. Specs vary by batch and version; check the maker's page before buying. Always buy the 915 MHz version in the US.
Range by device & antennaInternal vs external, stock vs upgraded
Estimated reliable range for each device with the antenna it ships with, a tuned whip, and a rooftop antenna. Suburban neighborhood, LONG_FAST, 90% delivery, device held at 5 ft with body loss (rooftop column: mounted at 30 ft). The weaker direction of the link is used, so a louder radio only helps if it also hears well. Each cell shows range to another handheld / range to a rooftop base. Tap a device name to open its full card.
| Device | Antenna | Stock / internal | Tuned whip | Rooftop 6 dBi |
|---|
Estimates use this page's empirical neighborhood model and estimated antenna gains; real terrain, trees and buildings can halve or double them. Use them to compare options, not as guarantees.
Best antenna for maximum rangeExact specs for handheld, hiking, car, base, backbone
The antenna that gives the most range is, in order: tuned for 915 MHz, vertical, as high as possible, fed with short, low-loss cable — and only then higher gain. Gain does not create power; it squeezes the pattern flatter toward the horizon. That helps a fixed antenna on a roof and hurts a handheld that tilts in your hand.
Handheld: most range
Hiking / field: most range
Vehicle: most range
Home base / relay: most range
Backbone link: most range
Gain vs pattern
| Antenna gain | Vertical beam (approx.) | Best for | Watch out |
|---|---|---|---|
| 0–2 dBi (stubby, flex) | Very wide | Tiny devices, inside cases | Often poorly tuned; lowest range |
| 2–3 dBi half-wave | ~70–80° | Handhelds, packs, cars without a ground plane | Best all-round handheld choice |
| 5–6 dBi collinear | ~25–30° | Suburban rooftops, relays | Must be vertical |
| 8–10 dBi collinear | ~12–16° | Tall or hilltop sites, flat terrain | Can under-serve nodes close below a tall mast; watch EIRP with 1 W radios |
| 10–13 dBi Yagi / panel | Narrow both ways | Site-to-site links | Only covers where it points |
TX + antenna gain − losses must stay ≤ 36 dBm unlicensed. A 1 W (30 dBm) radio on an 8 dBi antenna is 38 dBm — turn the radio down to 28 dBm. A 22 dBm radio can use up to about 14 dBi.
The T-Deck Plus is sold in two versions: internal antenna (915 MHz part H737-A) for a clean pocket device, or external SMA (H737-03) for range and upgrades. Boards with a U.FL connector (Heltec, T114, RAK, XIAO, Wio Tracker) can use either a flex antenna inside a case or a pigtail to an external antenna.
T1000-E, Nano G2 Ultra, MeshPocket, WisMesh Tag and similar have no connector. Their "antenna upgrade" is placement: carry them high (shoulder strap, hat, top of the dashboard), keep them off your body and out of metal enclosures, and have a strong rooftop base or repeater nearby.
GPS chips comparedL76K, u-blox M10, AG3335, UC6580 and more
GPS lets a node share its location, set its own clock and show you on the map. It is also the biggest battery drain after the screen. Newer chips track more satellite systems at once, get a fix faster and use far less power.
| Chip | Constellations | Typical current | Found in | Notes |
|---|
- Fixed nodes don't need GPS: set Fixed position once and turn GPS off (Meshtastic GPS mode = DISABLED; MeshCore
gps off). - A first fix (cold start) takes 30 s to several minutes; it needs open sky. Later fixes (hot start) take seconds.
- The ceramic patch antenna must face the sky. A node in a pocket or car cabin may not get a fix at all.
- No GPS on the radio? Meshtastic can use your phone's location instead.
- Battery hikers: GPS update interval 5–10 min. Trackers: 30–60 s.
- Dual-band chips (UC6580) handle downtown reflections much better than single-band ones.
- Current figures are approximate tracking current for the chip alone.
Antennas: handheld, mobile, baseTypes, gain, coax loss, mounting
The antenna and its height matter more than anything else you can change. A stock whip that ships with a cheap board is often tuned for 868 MHz, not 915. A properly tuned half-wave antenna held at head height can double your handheld range for $15.
- Tuned for 902–928 MHz, VSWR under 1.5:1 across 903–915 MHz. Verify with a NanoVNA (~$60) if you can.
- Connector matches: SMA vs RP-SMA look alike but do not mate properly; IPEX/U.FL is fragile (rated for ~30 connections).
- Gain is not free: higher-gain omnis flatten the pattern. Great from a rooftop looking at the horizon, worse for a handheld that tilts.
- Vertical polarization everywhere — a horizontal handheld antenna can lose 10–20 dB to vertical ones.
- Never transmit without an antenna connected; it can damage the radio's PA.
Handheld (HT) setup
A node in a pocket or on a belt loses 6–15 dB to your body. Clipping it high on a backpack strap is the single best free upgrade.
Mobile (vehicle) setup
The metal roof is part of the antenna. Fiberglass or panoramic-roof cars need a no-ground-plane (NGP) antenna. Keep the node out of direct windshield sun.
Base station (home) setup
Best practice: put the radio at the antenna in an enclosure and run power (PoE or low-voltage DC) up instead of RF down. Twenty feet of LMR-400 costs 0.8 dB; twenty feet of RG-58 costs about 3 dB.
Antenna types at a glance
Coax loss at 915 MHz
| Cable | Loss per 100 ft | Loss per 10 ft | Use |
|---|---|---|---|
| RG-174 / RG-316 | ~27–30 dB | ~3 dB | Pigtails under 1 ft only |
| RG-58 | ~15 dB | ~1.5 dB | Short mobile runs |
| LMR-195 | ~10 dB | ~1 dB | Mobile, jumpers |
| RG-8X | ~10 dB | ~1 dB | Short base runs |
| LMR-240 | ~7.6 dB | ~0.8 dB | Runs up to ~25 ft |
| LMR-400 | ~3.9 dB | ~0.4 dB | Recommended base station feedline |
| LMR-600 | ~2.5 dB | ~0.25 dB | Towers, long runs |
| 1/2" hardline | ~2.2 dB | ~0.2 dB | Professional installs |
A 6 dBi antenna fed with 50 ft of RG-58 (~7.5 dB loss) performs worse than a 0 dBi antenna on the radio. Add ~0.2 dB per connector/adapter.
Battery lifeWhat drains power and how long it lasts
Battery life is dominated by three things: the MCU family (nRF52 vs ESP32), the screen, and GPS. LoRa receive is cheap (~5 mA on SX1262); transmit is expensive but brief.
| State / device class | Typical average current | 2000 mAh battery lasts | Notes |
|---|---|---|---|
| nRF52 client, no screen/GPS (T114, RAK, XIAO) | 4–8 mA | 10–20 days | MeshCore repeaters with powersaving can go lower still. |
| nRF52 with GPS every 2 min (T-Echo, T1000-E) | 10–20 mA | 4–8 days | Longer GPS interval = big gains. |
| ESP32-S3 client, BT connected, screen timeout | 45–90 mA | 1–2 days | Heltec V3/V4, T-Beam, T3-S3. |
| ESP32 with Wi-Fi (MQTT gateway) | 90–150 mA | ~15 h | Run from wall power. |
| ESP32 power saving (light sleep) | 15–25 mA | 3–5 days | Bluetooth off while asleep. |
| T-Deck Plus, screen on | 120–200 mA | ~10–15 h (2000 mAh built in) | Dim the screen; shorten timeout. |
| Transmit burst, +22 dBm | ~110–120 mA | — | 0.7 s per LONG_FAST packet. |
| Transmit burst, 1 W PA | ~500–900 mA | — | Needs a supply that can deliver it; 3 W+ PAs need 12–15 V. |
Figures are typical community measurements and vary with firmware, traffic, temperature and battery health. Heavy mesh traffic raises everyone's average because every node receives (and may relay) every packet.
- Choose nRF52 for anything carried or solar powered.
- Screen timeout 15–30 s; LED heartbeat off.
- GPS off on fixed nodes; GPS interval 5+ min when hiking.
- Leave Wi-Fi off on battery ESP32 nodes.
- Telemetry and position intervals of 30–60 min.
Solar repeater buildsSizing math, parts, installation
A well-placed solar node with a 5–6 dBi antenna at 30 ft typically extends coverage 2–4× in radius over ground-level handhelds. Use an nRF52 board; ESP32 boards need panels and batteries several times larger.
Sizing math (Dallas example)
// Load: nRF52 router on a busy mesh, ~10 mA avg at 3.7 V
Daily = 10 mA x 24 h = 240 mAh/day (~0.9 Wh)
// Autonomy: 5 cloudy days, use 80% of capacity
Battery = 240 x 5 / 0.8 = 1,500 mAh minimum -> use 2 x 18650 (6,000+ mAh)
// Winter sun in Dallas ~3.5-4 peak sun hours, 60% overall efficiency
Panel = 0.9 Wh / (3.5 h x 0.6) = ~0.45 W -> use 2-5 W for margin
// ESP32 router at ~60 mA avg needs ~6x more battery and a 6-10 W panel.
Installation best practices
- Batteries and heat: Texas attics and sun-baked boxes pass 60–70 °C. Use a white/shaded enclosure and venting. Li-ion must not be charged below 0 °C; LiFePO4 (3.2 V nominal, needs its own charge profile) tolerates heat and cycling better.
- Panel angle: face south, tilted about latitude + 15° (~47° in Dallas) to favor winter sun.
- Lightning: coax arrestor bonded to a real ground on any mast-mounted antenna.
- Remote management: Meshtastic admin keys or MeshCore admin password set before it goes up the pole.
- Antenna spacing: keep the antenna at least 1/2 wavelength (~16 cm) from metal and the panel frame.
Range
How far your setup will reach, and how to plan a network.
Range estimator
Pick a device for each end and how its antenna is set up. Transmit power, receive sensitivity (LNA/boosted gain) and antenna gain are filled in from the device; you can still edit any number. Both directions are calculated and the weaker one sets the range.
Typical range in a city neighborhoodHandheld, car, rooftop, tower
"How far will it go?" depends mostly on what is between the two antennas and how high they are. The ranges below are typical results reported by US community meshes for a flat suburban neighborhood (one- and two-story houses, mature trees — think most of Dallas–Fort Worth) on LONG_FAST at +22 dBm. MeshCore's narrow SF7/62.5 preset has ~4 dB less link budget, so expect roughly 25–30% less distance per hop, which its repeater-based design compensates for.
| Link | Dense urban (downtown, mid-rise) | Suburban neighborhood | Rural / open | Clear line of sight |
|---|---|---|---|---|
| HT ↔ HT (street level) | 0.2–0.6 mi | 0.3–1.2 mi | 1–4 mi | 5–10+ mi |
| HT ↔ mobile | 0.3–1 mi | 0.6–2 mi | 2–6 mi | 10+ mi |
| HT ↔ rooftop base | 0.5–1.5 mi | 1–3.5 mi | 4–10 mi | 15+ mi |
| Base ↔ base (rooftops) | 1–4 mi | 3–10 mi | 8–20 mi | 30+ mi |
| HT ↔ tower/hill router | 2–6 mi | 4–15 mi | 10–30 mi | 40+ mi |
| Base ↔ tower/hill router | 3–10 mi | 10–30 mi | 20–60 mi | 100+ mi mountain-to-mountain |
How to get more rangeBest upgrades first
- Height. Moving a base from the attic floor to 10 ft above the roof peak is often +10 dB — triple the coverage area.
- Get out of the pocket / out of the car. Body and vehicle-cabin losses are 6–15 dB.
- A tuned 915 MHz antenna instead of the stock whip: 2–6 dB.
- Short, low-loss coax: recover 3–6 dB on base stations.
- RX boosted gain on / LNA boards (Heltec V4, Station G2): 2–4 dB on receive.
- More power last: going from 0.16 W to 1 W is only +8 dB and only helps outbound.
Link budget & Fresnel zoneThe math behind the numbers
A link budget adds up every gain and loss between two radios. If the received signal is stronger than the receiver's sensitivity, the link works; the difference is your margin. Aim for 10 dB or more.
Free-space path loss
// FSPL (dB) = 32.44 + 20 log10(d_km) + 20 log10(f_MHz)
// At 915 MHz (20 log10(915) = 59.2):
0.5 km FSPL = 85.7 dB
1 km FSPL = 91.7 dB
5 km FSPL = 105.6 dB
10 km FSPL = 111.7 dB
50 km FSPL = 125.6 dB
// Real neighborhoods add 20-45 dB of clutter loss on top of FSPL.
// Margin = TX + Gtx - Ltx - PathLoss + Grx - Lrx - Sensitivity
Fresnel zone
r1 (m) = 8.66 * sqrt( d_km / f_GHz ) // radius at the midpoint
// 2 km link at 0.915 GHz: r1 = 8.66 * 1.48 = ~12.8 m
// 10 km link: r1 = 8.66 * 3.31 = ~28.6 m
// Keep 60% of r1 clear of trees, roofs and terrain for near-free-space loss.
At 915 MHz the Fresnel zone for a 2 km neighborhood link is ~13 m (40 ft) in radius at mid-path. Two antennas at 5 ft are almost completely inside roofs and trees; raising one to 35 ft clears a large part of the zone, which is why a rooftop base hears handhelds several times farther away.
Interference & congestionDiagnosing noise, keeping airtime free
902–928 MHz is shared with smart meters, toll tags, RFID, baby monitors, amateur radio and other LoRa networks (including Helium/LoRaWAN gateways).
Diagnosing
- Strong RSSI but poor SNR (e.g. -80 dBm at -5 dB) means noise or interference, not distance.
- Check the noise floor: Meshtastic 2.8 tracks it; MeshCore shows it in
stats-radio. Anything above about -110 dBm on 915 MHz is a noisy site. - Use an RTL-SDR with SDR++ to look at 902–928 MHz for smart-meter bursts or continuous carriers.
- Repeaters that stop hearing anything after a while may have AGC deafness — MeshCore
set agc.reset.interval 4; recent Meshtastic builds reset AGC automatically.
Reducing congestion
- Keep hop limit at 3; do not use ROUTER on low sites.
- Lengthen position (30–60 min) and telemetry (30–60 min) intervals; leave node info at 3 h+.
- Turn off range test, PAX counter and store-and-forward when not needed.
- Very busy meshes move to faster presets (MEDIUM_FAST) as a community decision.
- A 915 MHz cavity or SAW bandpass filter helps repeaters near cell sites or pagers.
Planning a networkTools, relay spacing, bridging
Planning tools
- HeyWhatsThat — free viewshed from any lat/lon and height.
- CloudRF and Radio Mobile — terrain-based coverage models.
- meshmap.net and meshtastic.liamcottle.net — existing Meshtastic nodes; map.meshcore.io for MeshCore.
Backbone spacing
| Environment | Relay spacing | Height | Meshtastic role | MeshCore |
|---|---|---|---|---|
| Dense urban | 1–2 mi | Rooftops 50–150 ft | ROUTER only on the tallest; ROUTER_LATE fillers | Repeaters every building cluster |
| Suburban | 3–6 mi | Roof masts 30–50 ft, water towers | CLIENT_BASE homes + few ROUTERs | 1 repeater per neighborhood + tall backbone |
| Rural | 8–20 mi | Hills, towers, grain elevators | ROUTER | Repeaters on high points |
Bridging distant meshes
Meshtastic uses MQTT gateways (Wi-Fi/Ethernet nodes with uplink/downlink on chosen channels). The public broker can make busy meshes busier — many regions use a private broker and bridge only one channel. MeshCore relies on RF repeaters, with community observers feeding analyzers such as analyzer.letsmesh.net.
Anything on the default Meshtastic channel or MeshCore Public channel should be treated as public, including anything bridged to the internet.