Meshtastic Repeaters

How to plan, configure, and deploy Meshtastic repeaters to extend network coverage.

📖 Start Here — Meshtastic Repeaters Guide

This book covers Meshtastic infrastructure nodes - the ROUTER and REPEATER roles (and ROUTER_LATE) - from site selection through deployment, configuration, monitoring, and maintenance. (Note: the older ROUTER_CLIENT role was deprecated and removed in firmware 2.3.15 — use ROUTER or ROUTER_LATE instead. As of firmware ~2.7.x the REPEATER role is also deprecated; for most infrastructure the current recommendation is ROUTER. See the role pages for details.)

🚀 Where to Start

  1. What is a Meshtastic Repeater?
  2. ROUTER vs REPEATER vs ROUTER_LATE: When to Use Each - Critical decision before you configure anything. This is the canonical role-decision page; start here for which role to pick.
  3. Choosing a Repeater Location

A note on the role pages: several pages in this book discuss role selection (Device Roles Explained, the Deep Dive, and Router vs. Repeater: Which to Choose). Treat "ROUTER vs REPEATER vs ROUTER_LATE: When to Use Each" above as the authoritative, current-firmware reference; the other role pages provide background but predate the ROUTER_CLIENT removal (2.3.15) and REPEATER deprecation (~2.7.x), so where they disagree, follow the canonical page.

📚 What's In This Book

Roles and Role Configuration

Site Planning and Setup

Advanced Features

Network Reliability and Redundancy

Monitoring and Maintenance

Overview

What repeaters are and the different device roles available.

Overview

What is a Meshtastic Repeater?

A Meshtastic repeater is a dedicated node whose purpose is to receive and retransmit messages, extending the reach of the mesh network beyond what any single device can achieve on its own.

In a Meshtastic network, every node participates in relaying messages to some degree - this is the nature of a mesh. But dedicated repeater nodes are optimized specifically for relaying: they run continuously and are placed at elevation for maximum coverage. Depending on the role chosen, an infrastructure node can either rebroadcast with higher priority (without deferring to neighbors) or be configured to stay silent on the mesh. Note that "repeater" is used here as a general concept: in practice these nodes use either the ROUTER role (which still broadcasts its own NodeInfo and position) or the REPEATER role (which relays silently without broadcasting its own data). These roles are covered in detail on the device-role pages.

Why repeaters matter

In real-world conditions, LoRa range is often limited by terrain, buildings, and vegetation. Range figures are highly variable and depend on preset, antenna, height, TX power, and obstructions. With stock antennas at Long Fast, urban non-line-of-sight range is often well under 1 km up to a few km; rural line-of-sight can be tens of km, and elevated sites with clear line-of-sight have achieved 100+ km. A repeater at elevation with a clear view can bridge gaps that would otherwise isolate parts of the network.

The Meshtastic relay model

Meshtastic uses a managed flooding approach: when a message is sent, nearby nodes rebroadcast it, and those nodes rebroadcast to others. A hop counter (default 3, maximum 7) limits how many times a message can be relayed before it is discarded. Dedicated repeaters - placed at strategic high points - maximize the effective reach of each hop.

Overview

Device Roles Explained

Meshtastic devices can be assigned one of several roles that control how they participate in the mesh. Choosing the right role for your repeater affects network behavior, power consumption, and visibility.

CLIENT (default)

The standard role for personal devices, and the role official Meshtastic guidance recommends for the overwhelming majority of ordinary nodes. A CLIENT node sends and receives messages via the app and participates in relaying (managed flooding): it rebroadcasts a packet only when no other node has already done so. If a CLIENT hears another node rebroadcast a packet first, it defers and will not rebroadcast it itself.

A CLIENT also ignores any packet (tracked by Packet ID) it has already received, so a given packet is never relayed twice by the same node. This managed-flooding behavior is what prevents broadcast storms.

Best for: personal devices carried by users, and most ordinary stationary nodes.

REPEATER

A dedicated relay node. REPEATER is deprecated as of firmware ~2.7.x and is no longer recommended as the default for new infrastructure (see "Which role should I choose?" below). Key behaviors:

Note: ALL_SKIP_DECODING is a device.rebroadcast_mode value - a separate setting from the device role - that relays packets without decrypting them, so a REPEATER can forward traffic on channels whose PSK it does not hold. Role and rebroadcast mode are independent settings; REPEATER is not "formerly ALL_SKIP_DECODING."

Best for: legacy deployments on older firmware where an anonymous, node-list-invisible relay is specifically wanted. For new infrastructure, prefer ROUTER.

ROUTER

The recommended role for stationary, well-placed community infrastructure nodes. A ROUTER is visible in the node list and originates its own NodeInfo (and GPS position if configured), which makes it trackable and useful for network monitoring. A ROUTER automatically enables power-saving sleep (this cannot be turned off) and defaults its app connectivity - BLE, Wi-Fi, and Serial - to OFF, so you don't normally text it directly even though it can still originate and receive messages at the protocol level. It is designed for stationary, well-placed nodes.

Best for: fixed community infrastructure and backbone relay nodes where you want visibility on the network and reliable rebroadcasting.

ROUTER_LATE

A relay role that rebroadcasts only after all other nodes have had a chance to do so - it is not a prioritized router. It defers to every other node and relays last, which reduces redundant transmissions in dense areas while still ensuring coverage in gaps. Use it for nodes that should rebroadcast only after others.

Best for: filling specific dead spots in a network that already has primary coverage, or as a deliberately low-priority backup relay.

Comparison table

RoleVisible in node listRebroadcast strategyPrioritized routingSends own dataPower
CLIENTYesDeferred (managed flooding)NoYes (if set)Moderate
REPEATER (deprecated)NoOnce, higher priority, no deferralYesNoHigh (LoRa active, no force-sleep)
ROUTERYesOnce, higher priority, no deferralYesYesForce power-saving sleep; app radios off by default
ROUTER_LATEYesAfter all other nodesNo (relays last)YesHigh (LoRa always on)

Note: appearing on a public map such as meshmap.net is independent of role - it requires an MQTT uplink to the internet (a gateway), not a particular device role.

Which role should I choose?

Site Planning

Choosing locations, antennas, and using network maps.

Site Planning

Choosing a Repeater Location

Placement determines performance. A well-placed repeater with modest hardware will consistently outperform a poorly placed repeater with expensive equipment.

The primacy of line-of-sight

LoRa signals travel best when there is a clear, unobstructed path between transmitter and receiver. Any obstruction - a building, a ridge, a dense stand of trees - attenuates the signal. The higher your repeater, the more of the surrounding terrain is in line-of-sight.

Location types

Hilltops and ridgelines

The best possible placement. A repeater on a hilltop with 360-degree unobstructed views can serve an area many times larger than the same hardware at ground level. As a rule of thumb, even modest height gains above the surrounding obstructions can noticeably improve coverage; how much depends on the local terrain. The underlying mechanism is the radio horizon, which grows with the square root of antenna height - roughly 3.57×√hm km (or about 1.23×√hft miles) - so the first few tens of feet above ground level deliver the largest gains.

Rooftops

The most practical option for urban deployments. The highest accessible rooftop in a neighborhood, with the antenna mounted on a short mast, gives excellent urban coverage. Flat commercial rooftops are ideal.

Towers and elevated structures

Communications towers, water towers, and fire lookout towers are excellent platforms. Many communities with amateur radio infrastructure already have tower access - connecting with local ham radio clubs is a good path to shared hosting arrangements.

When co-locating on a registered antenna structure or shared tower, coordinate with the structure owner. RF-exposure (MPE) evaluation and antenna-structure-registration obligations rest with the tower owner, and your Part 15 unlicensed device must not interfere with the licensed services already on the structure.

Mast installations

A 15 - 30 foot mast in a yard or field dramatically improves line-of-sight over the surrounding area. Particularly effective in flat terrain where even modest height above obstructions makes a large difference.

Common placement mistakes

Coverage planning tools

Always validate coverage estimates with real-world testing - planning tools do not account for buildings, vegetation, or local RF environment.

Site Planning

Antenna and Signal Range Factors

What determines your repeater's range

Several factors interact to determine how far your repeater can reach. Understanding them helps you make better placement and hardware decisions.

Antenna height and line-of-sight (most important)

This is the dominant factor by a wide margin. Higher placement gives more line-of-sight coverage. Even a few meters of additional height can meaningfully extend coverage. Use terrain analysis tools to identify locations with the best natural line-of-sight before committing to a deployment.

Antenna type and gain

Omnidirectional antennas

Standard for general-purpose repeaters. Higher gain concentrates the signal horizontally, increasing range but reducing coverage of areas directly below. As a common community rule of thumb, many repeater deployments use 3 - 6 dBi omnidirectional antennas as a reasonable balance between reach and overhead coverage; this is not an official Meshtastic specification, so consider your own terrain and coverage goals. Note also that antenna gain counts toward your EIRP limit (see Transmit power below): an antenna over 6 dBi requires a corresponding reduction in conducted power under FCC rules.

Directional antennas (Yagi)

Best for linking two specific points across a long distance. Directional antennas can achieve dramatically longer range in one direction but provide no coverage off-axis. Useful for point-to-point relay links, not general area coverage.

Antenna and cable quality

Upgrading from a stock antenna to a quality external antenna is often one of the highest-return improvements available. Use short, low-loss coaxial cable (LMR-200 or LMR-400) between the radio and antenna. Long cable runs with cheap coax can negate antenna gain improvements.

LoRa modem presets

Meshtastic provides eight primary preset modem configurations (plus a deprecated ninth, Very Long Slow / VERY_LONG_SLOW, which is not recommended and is being phased out). Each preset is a named combination of Spreading Factor (SF), Bandwidth (BW), and Coding Rate (CR) that determines the tradeoff between range, data rate, and airtime. The official preset names are: SHORT_TURBO, SHORT_FAST, SHORT_SLOW, MEDIUM_FAST, MEDIUM_SLOW, LONG_FAST, LONG_MODERATE, LONG_SLOW, and the deprecated VERY_LONG_SLOW.

PresetSFBWCRData RateLink BudgetNotes
Short Turbo7500 kHz4/521.9 kbps140 dB500 kHz: legal in the US 902-928 MHz band; restricted in some narrower regional bands
Short Fast7250 kHz4/510.9 kbps143 dB
Short Slow8250 kHz4/56.25 kbps145.5 dB
Medium Fast9250 kHz4/53.52 kbps148 dB
Medium Slow10250 kHz4/51.95 kbps150.5 dBRecommended for dense networks
Long Fast11250 kHz4/51.07 kbps153 dBFirmware default
Long Moderate11125 kHz4/80.34 kbps156 dB
Long Slow12125 kHz4/80.18 kbps158.5 dBMaximum range; very low throughput

Choosing a preset for your network

The most important rule: match whatever preset the rest of your local network uses. Nodes on different presets cannot hear each other, even on the same channel name. A preset sets SF, bandwidth and coding rate; nodes must match SF and bandwidth to demodulate each other, and because bandwidth also determines the frequency-slot grid, mismatched presets generally also transmit on different center frequencies.

Transmit power

More transmit power increases range up to the legal limit. In the US, FCC Part 15 (47 CFR 15.247) caps conducted power at 1 W (30 dBm) in the 902-928 MHz band. Antenna gain up to 6 dBi is allowed at full power. For every dB of antenna gain above 6 dBi, you must reduce conducted power by the same amount (47 CFR 15.247(b)(4)). The frequently quoted 36 dBm (4 W) EIRP figure is simply what 30 dBm + 6 dBi works out to - it is a derived ceiling, not a flat license to radiate 36 dBm with any antenna. The region setting in your firmware is the master control that enforces the legal power cap, so set it correctly. Meshtastic's defaults are compliant with standard antennas, but you remain responsible for EIRP compliance with any non-standard or high-gain antenna - custom setups require the gain-reduction calculation above.

Interference

The 902 - 928 MHz ISM band is a shared, unlicensed band, so other devices operating in it (Wi-Fi extenders, cordless phones, industrial telemetry, and other LoRa networks) can reduce effective range. If you suspect interference, try changing the channel frequency slot within the band and comparing performance.

Site Planning

Using the Meshtastic Network Map

Before deploying a repeater, check a network map to understand where existing coverage exists and where gaps are most significant. This helps you choose a placement that adds the most value to the network. Note that these maps are third-party tools and only show nodes reporting to the public MQTT server, so they are an incomplete, not authoritative, picture of the mesh.

Available map tools

What the maps show

Nodes appear on the map if they have GPS enabled, are configured to share their location, and their data has reached the internet via an MQTT gateway node. Clicking a node shows its ID, name, hardware, and last activity time. Some maps display estimated coverage radius or known links between nodes.

The network map depends on nodes reaching the internet via an MQTT gateway. During internet or grid outages - i.e. during the very emergencies you would most want it - the map can be stale or blank and does not reflect live mesh state. Do not rely on it for real-time situational awareness during an incident; verify coverage on the radios themselves rather than trusting the map.

How to use the map for planning

  1. Find your area and identify where existing nodes and repeaters are concentrated
  2. Identify gaps in coverage - areas with no nearby nodes, or areas that would benefit from a relay between two clusters
  3. Look for natural high points near the gap that could serve as a relay location
  4. Check whether your planned location already has a node - placing a repeater very close to an existing one adds little value and increases network traffic

Making your repeater appear on the map

A REPEATER-role node suppresses all of its own broadcasts (NodeInfo, position, and telemetry) and is hidden from node lists, so it will not appear on the map. A ROUTER-role node does broadcast its NodeInfo and position by default and will appear on map services that collect MQTT data. If map visibility matters, you can use ROUTER role instead of REPEATER - but choose ROUTER only for genuinely well-positioned infrastructure nodes, and do not switch to ROUTER merely for map visibility, since it also changes power behavior (ROUTER forces power-saving sleep), turns BLE/WiFi/Serial off by default, and affects routing.

Hardware

DIY vs kits, power systems, and enclosures.

Hardware

DIY vs Pre-built Kits

You can build a Meshtastic repeater from scratch or purchase a pre-built kit. The right choice depends on your budget, technical skills, and time available.

DIY builds

Building from components gives you full control over every aspect of the hardware and can be lower cost if you have relevant skills or existing parts.

Core components needed

Note on compliance: the FCC certification of a LoRa module can be tied to specific antenna gains. When you pair a board with your own external antenna, you remain responsible for staying within Part 15 conducted-power limits and the 6 dBi antenna-gain reduction rule (47 CFR 15.247(b)(4)) - for every dB of antenna gain above 6 dBi you must reduce conducted power by the same amount. Use the firmware's region setting to cap power, and reduce conducted power for any antenna over 6 dBi.

Challenges

Pre-built kits

Several manufacturers offer kits designed for easy Meshtastic deployment. These trade customization for convenience: weatherproofing is engineered from the factory, power systems are pre-integrated, and setup is primarily software.

Advantages

Disadvantages

Which to choose

FactorDIYKit
CostLower potential, more variableHigher, more predictable
Setup timeSignificantMinimal
Technical skill neededModerate to highLow
CustomizationFull controlLimited
Weatherproofing reliabilitySkill-dependentGenerally good to excellent
Hardware

Power Systems for Repeaters

Repeater and Router role nodes keep the LoRa radio on continuously, which draws significantly more power than a client device that sleeps between uses. Reliable power is a first-class concern for any permanent repeater deployment.

Solar systems

Solar power is the standard for remote deployments without access to mains power. Always-on repeaters draw power continuously and must be sized for worst-case conditions - the shortest winter days, multi-day storms, and cold (which cuts usable battery capacity). Undersized solar is a leading cause of repeaters failing exactly during the prolonged bad-weather emergencies the network is meant to serve. Size for the worst case with several days of autonomy and no solar input, not for average sunny-day draw.

Mains power

For rooftop or indoor repeaters with access to building power, a quality regulated 5V or 12V supply is simpler and more reliable than solar. Add a small UPS or battery backup to maintain operation during brief outages.

Software power optimization

Even with always-on radio requirements, you can reduce power draw in software:

Monitoring battery voltage

For remote deployments, periodically check battery voltage to detect degraded performance before the repeater goes offline. Some Meshtastic nodes can report telemetry data including battery voltage over the mesh.

Configuration

Setting device role, rebroadcast mode, and power optimization.

Configuration

Setting the Device Role

Configuring a device as a Meshtastic repeater involves two key settings: the device role and the rebroadcast mode. Both can be set using the Meshtastic mobile app or the Python CLI.

Using the mobile app (Android/iOS)

  1. Connect to your device in the Meshtastic app
  2. Navigate to Config → Device → Role (app layouts change between versions; this is the current path)
  3. Find Device Role and select your role. Note that REPEATER is deprecated as of firmware ~2.7.x; for most infrastructure nodes the recommended role is now Router (which stays visible in the node list), and for the overwhelming majority of ordinary nodes the official guidance is Client.
  4. Save settings - the device will reboot to apply changes

Using the Python CLI

Install the CLI if you have not already:

pip install meshtastic

Connect the device via USB, then set the role. The setting key is device.role and the value is the bare enum name (for example ROUTER or REPEATER):

# REPEATER is deprecated as of firmware ~2.7.x; ROUTER is recommended for most infrastructure
meshtastic --set device.role ROUTER

# To set the (deprecated) REPEATER role explicitly:
meshtastic --set device.role REPEATER

Verify the change:

meshtastic --info

After setting the role

Once set to REPEATER, the device will no longer appear in other nodes' node lists and does not send NodeInfo (it is anonymous on the mesh) - this is by design. It relays packets without broadcasting its own data, and unlike ROUTER it does not force power-saving sleep. To confirm it is operating, check the serial output or observe that messages are being relayed through it. (If you instead choose ROUTER, the node does appear in the node list and the firmware automatically enables power-saving sleep that cannot be turned off, with BLE/WiFi/Serial off by default.)

Flashing Meshtastic firmware

If your device does not have Meshtastic installed, use the Meshtastic Web Flasher to install firmware directly from Chrome or Edge - no software installation required. Connect via USB, select your device type, and click Flash.

Setting the region

Before the radio will transmit, you must set the correct region. The region setting is the master legal control - it determines both your authorized frequency band and the maximum power the firmware will permit:

meshtastic --set lora.region US

Or in the app: Config → LoRa → Region → US. Setting the wrong region (for example leaving a US deployment on EU868) will cause the device to transmit out-of-band on frequencies you are not authorized to use - a clear violation of FCC rules, not just a possibility. In the US, only 902-928 MHz is available for these unlicensed Part 15 devices. Always set the region that matches your physical location before transmitting, and leave lora.tx_power at its default of 0 so the firmware applies the region-legal maximum.

Configuration

Rebroadcast Mode: ALL_SKIP_DECODING

The rebroadcast mode controls how a node handles incoming packets for retransmission. For repeater deployments, ALL_SKIP_DECODING is strongly recommended. Note that ALL_SKIP_DECODING is only available when the device role is REPEATER - on any other role (including ROUTER) the setting behaves as ALL. If your node uses the ROUTER role, use rebroadcast mode ALL instead.

What ALL_SKIP_DECODING does

In this mode, the node rebroadcasts valid LoRa packets without attempting to decode or decrypt them. This mode is only available when device.role is REPEATER. It has several important advantages:

Setting ALL_SKIP_DECODING via app

  1. Connect to your device in the Meshtastic app
  2. Make sure the device role is set to REPEATER first - the ALL_SKIP_DECODING option only applies on the REPEATER role
  3. Go to Settings → Device
  4. Find Rebroadcast Mode and select ALL_SKIP_DECODING
  5. Save and allow the device to reboot

Setting ALL_SKIP_DECODING via CLI

meshtastic --set device.rebroadcast_mode ALL_SKIP_DECODING

This is only valid when device.role is REPEATER. The setting lives under the device. namespace, not lora.

Other rebroadcast modes (for reference)

ModeBehaviorUse case
ALL_SKIP_DECODINGRebroadcasts without decoding or decryptingRecommended for all repeater deployments; requires REPEATER role
ALLProcesses/validates packets (including duplicate detection) before rebroadcasting the original encrypted packet; does not decrypt or re-encrypt payloadsDefault; used on ROUTER and other roles that should relay
LOCAL_ONLYDoes not relay to other nodesNot suitable for repeaters
NONENo rebroadcasting (only permitted for SENSOR/TRACKER/TAK_TRACKER roles)Not suitable for repeaters
Configuration

Power Optimization Settings

Repeater and Router role nodes keep the LoRa radio on continuously, which draws significantly more power than a client device that sleeps between uses. These settings minimize everything else to extend runtime on battery or solar power.

Disable Bluetooth

Once configured, a dedicated repeater does not need Bluetooth. Disabling it saves power and removes an unnecessary wireless interface.

meshtastic --set bluetooth.enabled false

Disable GPS (REPEATER role handles this automatically)

The REPEATER role does not broadcast position data, but the GPS module may still draw power unless you disable it explicitly in the Position config. If your board has a GPS module, disable it to save power:

meshtastic --set position.gps_mode DISABLED

Disable the screen

If your device has a display, minimize the screen-on time. Display backlights draw meaningful power. Note that display.screen_on_secs 0 does not turn the screen off - 0 means the 10-minute default. To minimize screen-on time, set a small non-zero value instead:

meshtastic --set display.screen_on_secs 1

Set appropriate transmit power

Transmit power is the largest variable power draw. In most cases, leave tx_power at its default of 0, which tells the firmware to use the maximum power your region legally permits for this hardware - the region setting is what enforces the legal cap. Only set an explicit value if you are deliberately reducing power (for example, to limit interference with nearby nodes). Higher power is not always better.

meshtastic --set lora.tx_power 0

If you do set an explicit value, tx_power is conducted PA power; stay at or below 30 dBm. If you use an antenna over 6 dBi gain, you MUST reduce conducted power by 1 dB for every dB of gain above 6 dBi (47 CFR 15.247(b)(4)). Actual radiated power also depends on your board's PA capability and feedline loss, so tie any fixed value to your antenna-gain / EIRP calculation rather than picking a number arbitrarily.

Use the right modem preset - but match your local network

Modem preset affects how long the radio is transmitting each packet, which directly impacts power consumption:

Do not choose a preset based on power alone - you must use the same preset as the rest of your local network. Check what preset your local community or regional network uses before deploying. See the Choosing a Modem Preset page for guidance.

Managed Mode (optional)

For a deployed repeater that should not be reconfigured by whoever is near it, you can enable Managed Mode (security.is_managed). This blocks client apps from writing config; changes must then come via PKC Remote Admin (firmware 2.5+) or the legacy Admin channel. Verify that remote admin works before enabling this, or you risk locking yourself out - once managed mode is on, you cannot reconfigure the node from a normal client app.

meshtastic --set security.is_managed true
Configuration

Choosing a Modem Preset

Your modem preset is one of the most consequential configuration decisions for your repeater. It must match every other node on your channel - and different regional communities have standardized on different presets.

What a preset controls

Each preset is a named combination of three LoRa parameters:

The full preset table

PresetSFBWCRData RateLink Budget
Short Turbo7500 kHz4/521.9 kbps140 dB
Short Fast7250 kHz4/510.9 kbps143 dB
Short Slow8250 kHz4/56.25 kbps145.5 dB
Medium Fast9250 kHz4/53.52 kbps148 dB
Medium Slow10250 kHz4/51.95 kbps150.5 dB
Long Fast11250 kHz4/51.07 kbps153 dB
Long Moderate11125 kHz4/80.34 kbps156 dB
Long Slow12125 kHz4/80.18 kbps158.5 dB

Step 1: Ask your local community

Before choosing a preset, check what your local or regional network has standardized on. All nodes on a channel must use the same preset to communicate. If your area already has an established mesh, deploying on a different preset will isolate your repeater from it entirely.

Check local Discord servers, third-party tools such as the community network map at meshmap.net (unofficial; only shows nodes reporting to the public MQTT server), or regional mesh community pages for your area's standard.

Step 2: Match your network density

If no local standard exists, choose based on your expected network density:

Sparse / rural networks (under ~60 nodes in range)

Long Fast (the firmware default) is a reasonable choice. Range is maximized and the lower data rate is not a problem when relatively few nodes are generating traffic.

Larger networks (more than ~60 nodes)

Consider Medium Slow or Medium Fast. The official guidance is to consider moving away from Long Fast once a mesh exceeds roughly 60 nodes. The 3 - 4x higher data rate significantly reduces collision probability while still maintaining respectable, only slightly reduced range compared to Long Fast.

Dense urban networks (well over 60 nodes)

Faster presets are strongly preferred. Long Fast in a 100+ node network can cause congestion as packet airtime accumulates. Medium Slow has been reported as the standard for at least one large community mesh: the Meshtastic Bay Area community (reportedly 150+ nodes, as of 2025) is reported to have migrated to Medium Slow with improved reliability, and the Wellington Region Mesh (New Zealand) is reported to use Short Fast. These community figures are unsourced and change over time - check your local community's current standard rather than relying on these examples.

Presets to avoid for repeater deployment

Setting the preset via CLI

meshtastic --set lora.modem_preset MEDIUM_SLOW

Valid preset names: SHORT_TURBO, SHORT_FAST, SHORT_SLOW, MEDIUM_FAST, MEDIUM_SLOW, LONG_FAST, LONG_MODERATE, LONG_SLOW, VERY_LONG_SLOW (VERY_LONG_SLOW is deprecated / not recommended).

Frequency slot and channel name

Meshtastic derives the transmit frequency from the channel name hash by default (frequency slot 0). This means two nodes with the same channel name and same preset will automatically land on the same frequency. You can override this with a specific slot number if needed, but the default hash-based behavior is correct for most deployments.

Best Practices

Avoiding common problems, legal considerations, and config backups.

Best Practices

Deployment Best Practices

Plan before you deploy

A poorly placed repeater can add network congestion without meaningfully extending coverage. Before deploying:

Avoid hop gobbling

Each relay uses one hop ("hop gobbling" means a relay that uses up a hop without adding meaningful range). If a repeater is only marginally better positioned than surrounding nodes, it will consume a hop without significantly extending message range. Place repeaters where they add substantial coverage - bridging a gap or reaching a new area - not just adding a small increment to existing coverage.

Spacing between repeaters

Overlapping coverage is good for resilience, but too many repeaters within range of each other creates redundant retransmissions that congest the network. A general guideline is to space repeaters so each covers a distinct area, with just enough overlap for redundancy.

Test after deployment

After installing, walk or drive the intended coverage area and verify that messages successfully reach destinations through the repeater. Test at the edges of expected coverage, not just close in. Note that a quiet walk-test proves coverage, not capacity: for networks intended for emergencies, also validate behavior under realistic concurrent traffic (multiple users sending at once), and re-test coverage periodically, since foliage, new construction, and changing neighbor RF can all shift it over time.

Document your deployment

Record the hardware, firmware version, configuration, location coordinates, and power system details for each repeater you deploy. This makes firmware updates, troubleshooting, and handoff to other maintainers much easier. Consider contributing your repeater location to the community map.

Maintain firmware

Meshtastic releases updates regularly with performance improvements, bug fixes, and new features. Keep your repeater firmware updated using the web flasher at flasher.meshtastic.org.

Best Practices

Legal Considerations

Meshtastic and MeshCore both operate in license-free ISM radio bands, but license-free does not mean unregulated. You must comply with applicable FCC rules for US deployments.

US regulatory framework (FCC Part 15)

In the United States, 915 MHz operation is governed by FCC Part 15 rules for ISM band devices. The key limits for intentional radiators in the 902 - 928 MHz band:

ParameterLimit
Conducted transmit power1 W (30 dBm) maximum, referenced to an antenna of 6 dBi or less
EIRP (with antenna gain)36 dBm (4 W) is a derived ceiling - it is the result of 30 dBm conducted + 6 dBi gain, not a flat standalone cap. For antenna gain above 6 dBi, conducted power must be reduced dB-for-dB (see below).
Duty cycleUS Part 15 imposes no duty-cycle limit on digital-modulation systems such as LoRa in 902 - 928 MHz. The dwell-time limits in 15.247(a)(1) apply only to frequency-hopping (FHSS) systems, not to LoRa's digital modulation. Other regions (e.g. the EU 868 MHz band) DO impose duty-cycle limits - check your region.

Antenna gain and EIRP

EIRP combines transmit power and antenna gain: EIRP = conducted power + antenna gain (in dBi) - cable loss.

The actual FCC rule (47 CFR 15.247(b)(4)) is: conducted transmit power of 1 W (30 dBm) is the absolute maximum, and antenna gain up to 6 dBi is permitted at that full power. For every dB of antenna gain above 6 dBi, conducted power must be reduced by the same number of dB. The often-cited 36 dBm EIRP figure is simply the result of this rule at exactly 6 dBi of gain (30 dBm + 6 dBi = 36 dBm) - it is not an independent allowance to radiate 36 dBm EIRP with any antenna.

Worked examples:

Meshtastic ships with a region-based power cap; setting tx_power to 0 lets the firmware use the maximum the selected region allows. This is compliant only when paired with an antenna of 6 dBi or less. With any higher-gain antenna you must reduce conducted power per the 6 dBi rule above. The region setting is the master legal power-cap control - set it correctly first.

No amateur radio license required

Standard Meshtastic and MeshCore operation in the 915 MHz ISM band does not require an amateur radio license. The band is available to any compliant Part 15 device without licensing. This holds only while the device remains within its Part 15 certification: adding a non-certified antenna or amplifier, or exceeding the power/EIRP limits, can void the certification - at which point the operation is no longer authorized under Part 15. The operator is responsible for keeping the device compliant, and Part 15 devices must accept interference and must not cause harmful interference.

Always verify current regulations

Radio regulations can change. The information above is provided as a general guide. For definitive requirements, consult the FCC Part 15 rules directly.

Best Practices

Backing Up Your Configuration

Before making changes to a working repeater - or before a firmware update - back up the configuration. This saves your channel keys, LoRa settings, and device role, allowing full recovery if something goes wrong.

Export configuration via CLI

pip install meshtastic # if not already installed
meshtastic --export-config > my_repeater_config.yaml

The --export-config command produces a YAML file (not JSON). This is the canonical, restorable backup format - use it consistently. The exported YAML file contains:

Restore configuration

meshtastic --configure my_repeater_config.yaml

Restore with --configure, which is the counterpart to --export-config. There is no --import-config flag in the Meshtastic CLI. Note also that meshtastic --info output is only a human-readable status dump and is not a restorable backup - always use --export-config for backups.

Store backups safely

The configuration file contains your channel PSKs. Store it in a secure location. Do not share it publicly or commit it to a public repository - anyone with the PSK for a private channel can read its messages.

After a firmware update

Firmware updates sometimes reset device settings. Always verify device role, rebroadcast mode, and LoRa region after updating. If settings are lost, restore from your backup YAML file with meshtastic --configure my_repeater_config.yaml.

Network Troubleshooting

Network Troubleshooting

Diagnosing Meshtastic Network Problems

This guide covers systematic diagnosis of common Meshtastic network issues: nodes that can't hear each other, poor range, network congestion, and routing failures.

Diagnostic framework

Work from the bottom up: radio layer first, then routing, then application.

  1. Radio layer: Can the nodes physically hear each other? Check RSSI/SNR.
  2. Configuration: Are both nodes on the same preset and channel?
  3. Routing: Is the path between nodes working? Use Trace Route.
  4. Application: Is the app connected properly? Is the message actually sending?

Problem: Two nodes can't communicate

Check 1: Same preset?

Nodes on different presets cannot hear each other. Verify the preset directly on each node:

meshtastic --get lora.modem_preset   # run this on each node

Both nodes must report the same preset (e.g., LONG_FAST or MEDIUM_SLOW). You generally cannot read a remote node's modem preset from a node-list dump - check each node on its own connection. If they differ: change one to match the other.

Check 2: Same channel and PSK?

Nodes must be on the same channel with the same PSK. The default public channel (LongFast) uses the well-known default PSK AQ== (a publicly known, weak key) - it is not an empty/no-encryption key. If you've customized your channel, the other node needs the same configuration.

meshtastic --info # Shows channel list with PSK hashes

PSK hash mismatch = nodes won't communicate even if physically in range.

Check 3: Physical range and line of sight

In the Meshtastic app, check if the node appears in the node list with any RSSI/SNR value. Do not assume a low or negative SNR means a bad link: LoRa decodes well below the noise floor, with per-spreading-factor demodulation limits running from about −7.5 dB (SF7) to about −20 dB (SF12). At Long Fast / Long Slow, an SNR of −10 to −18 dB is routinely decodable, not "at the noise floor." A link only becomes marginal as SNR approaches the per-SF demod limit (for example below about −17 dB at SF11/Long Fast), or as RSSI approaches the receiver sensitivity floor (the SX1262 is sensitive to roughly −137 dBm at SF12). If the node doesn't appear at all, no packets are being received.

Test: bring both devices to within 100 feet of each other (no obstacles). If they communicate at that distance, it's a range/obstruction problem. If they still can't communicate at 100 feet, it's a configuration problem.

Problem: Intermittent message delivery

Check: Hop count

Messages requiring more hops have higher failure rates. Check your hop limit setting:

meshtastic --get lora.hop_limit

Default is 3 (the maximum is 7). Before raising it, verify with a traceroute that the path actually needs more hops. Raising hop_limit increases airtime and channel utilisation and can worsen congestion rather than fix dropped messages — the preferred fix for a long path is usually to add infrastructure to shorten it. If a traceroute confirms the path genuinely needs more hops, raise it incrementally (for example to 4) and monitor channel utilisation:

meshtastic --set lora.hop_limit 4

See Hop Limit Configuration for Repeaters for the full caveats on high hop counts and channel utilisation.

Check: Network congestion

In dense networks (20+ nodes), Long Fast preset can cause congestion. Symptoms: high message drop rate even with good RSSI, large delays. Solution: migrate to Medium Slow or Medium Fast preset. Requires coordination with all network participants - all nodes must change at the same time.

Check: Router node availability

If a critical router node goes offline, messages that depended on that path fail. This is a design red flag, not just a diagnostic finding: if a single router node failing kills delivery for part of your network, that node is a single point of failure — see Designing for Reliability (N+1 Redundancy). For emergency use, no incident-critical route should depend on one node. Use Trace Route before and after to confirm the path change:

meshtastic --traceroute !nodeId

Problem: Poor range from a new repeater

  1. Antenna connected? An unconnected antenna transmits into the PCB and can damage the radio front-end. Verify the antenna is finger-tight. Some boards have a separate BLE antenna and LoRa antenna - ensure both are connected.
  2. Correct antenna type? Most boards use SMA or u.FL connectors. Verify your antenna has the correct connector type and is rated for your operating band - use a 915 MHz (902-928 MHz) antenna in North America. An 868 MHz antenna will radiate at 915 MHz but with a shifted resonance and elevated VSWR; for a broadband whip the penalty is usually small (a fraction of a dB), but for a narrowband tuned antenna the loss and reflected power can be significant, and high VSWR stresses the power amplifier. Note that antenna gain also bears on legal power limits — antennas over 6 dBi require a dB-for-dB reduction in conducted power per FCC 47 CFR 15.247(b)(4).
  3. TX power set correctly? Check that TX power hasn't been set to an unusually low value: meshtastic --get lora.tx_power
  4. Obstructions: Even a metal enclosure, HVAC equipment, or tree canopy directly around the antenna can reduce range significantly. Test with the antenna in the clear before committing to a location.
Network Troubleshooting

Repeater Performance and Maintenance

A deployed repeater requires periodic attention to maintain performance. This page covers the key maintenance tasks and performance metrics for Meshtastic infrastructure nodes. Throughout, "infrastructure node" means the general concept; ROUTER and REPEATER refer to the specific device roles (which behave differently - a ROUTER appears in the node list, a REPEATER does not).

Key performance indicators

The targets below are recommended operational goals set by the author, not official Meshtastic or manufacturer specifications. Treat them as starting points, not hard specs.

MetricHealthy rangeAction if outside range
Node uptime>95% over 30 days (baseline only)>95% is a baseline health indicator, not a reliability guarantee - it still allows ~36 hours/month offline, and says nothing about when the downtime falls. For nodes an emergency operator depends on, investigate ANY unexplained downtime and treat repeated outages as disqualifying for sole-path infrastructure. Redundancy, not a high uptime number, is what guarantees coverage during an incident.
Average RSSI to neighbors−70 to −100 dBm typicalRSSI down to roughly −120 to −130 dBm can still be decodable depending on spreading factor (SX1262 sensitivity ~−137 dBm at SF12). Judge link health by SNR margin and packet success, not RSSI alone; a sudden RSSI drop versus a known baseline is the useful warning sign, not a fixed −110 dBm threshold.
SNR to nearest neighborSNR margin above the per-SF demod limitLoRa decodes well below 0 dB SNR - demod limits run from ~−7.5 dB (SF7) to ~−20 dB (SF12). What matters is SNR margin above the per-SF limit. For Long Fast (SF11, limit ~−17.5 dB), SNR down to about −12 dB is comfortable and approaching −17 dB is marginal. A backbone link at −10 to −12 dB SNR is normal and healthy, not a fault - do not treat SNR < 0 dB as "noise floor / unreliable."
Battery voltage (solar)Depends on pack configurationState your battery configuration before reading these numbers. A single LiFePO4 cell has a working range of roughly 3.2 - 3.6 V; a 4S LiFePO4 pack is ~12.8 V nominal; a single Li-ion runs 3.0 - 4.2 V. Use the per-chemistry, per-configuration cutoff for your pack and align it with the cutoffs on the remote-monitoring page (e.g. ~11.5 V for a 12 V lead-acid pack, ~3.0 V per cell for LiPo). Repeated readings near the low end of your pack's range indicate an undersized power system.
Packets forwarded per hourVaries by locationSudden drop to 0 = node possibly offline

Routine maintenance checklist (quarterly)

Firmware update process for deployed nodes

Flashing new firmware (reflashing the binary) on a deployed repeater requires physical USB/serial access. Configuration changes can be made remotely via Remote Admin over the mesh, but a firmware reflash cannot be done remotely. Prepare:

  1. Before taking ANY repeater offline for a firmware update, confirm an alternate path covers its users (run traceroutes from both sides). NEVER update the only repeater serving an area without a tested spare on hand or a deployed temporary relay - a failed flash can leave the firmware in a crash loop, knocking out coverage with no rollback. Bring a known-good spare and a copy of the prior firmware so you can roll back on-site if the flash fails.
  2. Schedule a maintenance window and notify the community (the node will be offline during update)
  3. Bring: laptop, USB cable for your device type, and the firmware binary or web browser access
  4. Before disconnecting: record current configuration (region, TX power, role, channel settings, position) with a restorable backup: meshtastic --export-config > config_backup.yaml. (Do not rely on meshtastic --info - that is only a human-readable status dump and cannot be re-imported.)
  5. Flash new firmware via web flasher (flasher.meshtastic.org)
  6. Verify settings after flash - firmware updates occasionally reset some settings to defaults
  7. Confirm node reappears on the network before leaving the site

Common hardware failures

SymptomLikely causeFix
Node gone offline after stormWater intrusion, lightning strike, blown fuseInspect enclosure, check fuse, examine for burn marks on PCB
Range suddenly reducedAntenna connector loosened or corrodedRe-seat antenna, check connector for oxidation, replace if needed
Frequent rebootsPower supply instability (low battery/solar)Check battery voltage, check charge controller output
Firmware crash loopCorrupted flash or incompatible firmwareFactory reset and reflash
BLE not discoverableBLE antenna loose (V3 only); software issueFor V3: reseat u.FL BLE antenna. Otherwise reflash.

When to replace vs. repair

LoRa boards are inexpensive ($15 - 75). General guidance:

Meshtastic Repeater Setup

Step-by-step setup, role selection, and channel configuration for Meshtastic repeaters.

Meshtastic Repeater Setup

Router vs. Repeater Role — Which to Choose

Overview of Device Roles

Meshtastic firmware supports several device roles that control how a node behaves on the mesh. For infrastructure nodes the historically relevant roles are ROUTER and REPEATER, but note that REPEATER is deprecated as of firmware ~2.7.x. For most stationary, well-placed infrastructure the current recommendation is ROUTER (or ROUTER_LATE for a node that should rebroadcast only after others have had a chance); for the overwhelming majority of ordinary nodes the official guidance is simply CLIENT.

ROUTER Role

REPEATER Role

REPEATER is deprecated as of firmware ~2.7.x. Prefer ROUTER (or ROUTER_LATE) for new infrastructure. The behavior below is retained for reference and for existing deployments.

When to Use Each Role

ScenarioRecommended Role
Temporary deployment or field relay that doubles as a usable clientCLIENT
Node needs to appear in the node list for coordinationROUTER
Permanent mountaintop or rooftop installationROUTER
Solar-powered, unattended backbone nodeROUTER
Ordinary user nodeCLIENT

CLIENT_MUTE Role

CLIENT_MUTE prevents a regular client device (phone, laptop) from rebroadcasting mesh traffic - a normal CLIENT still rebroadcasts under managed flooding, but CLIENT_MUTE does not relay at all. This is useful for devices that are on the mesh but should not consume airtime acting as relays, such as tablets used only for monitoring.

Setting the Role

In the Meshtastic app: on Android, Settings → Device → Role; on iOS/macOS, Settings → Device Configuration → Device → Role. The exact menu path can vary by app version.

Via the CLI: meshtastic --set device.role ROUTER (the key is device.role and the value is the bare enum name, e.g. ROUTER, ROUTER_LATE, CLIENT).

Via the web client at client.meshtastic.org: connect via USB, navigate to Device Config, and choose the desired role from the drop-down.

Meshtastic Repeater Setup

Initial Setup Walkthrough

Prerequisites

Step 0 - Set the Region (do this first)

Config → LoRa → Region - set this to your country (e.g. US) before transmitting. The region is the master legal control: it determines both your authorized frequency band and the maximum power the firmware will permit. The device should not be used to transmit until the region is set correctly - in the US, only 902-928 MHz is available for these unlicensed Part 15 devices, and an incorrect region will transmit out-of-band on frequencies you are not authorized to use. Leave lora.tx_power at its default of 0 so the firmware applies the region-legal maximum.

Step 1 - Connect to the Device

Via Bluetooth: Open the Meshtastic app, tap the + button, and scan for your device. Pair when prompted.

Via USB: Navigate to client.meshtastic.org in Chrome, click New connection → Serial, and select the device's COM/serial port.

Step 2 - Set the Device Name

Navigate to Config → Device:

Step 3 - Set the Device Role

Config → Device → Role. Use ROUTER when you want the infrastructure node to stay visible in the Nodes list and topology (the recommended choice for most infrastructure); use REPEATER for a pure relay that is invisible in the Nodes list and originates no NodeInfo, Position, or Telemetry. Note that REPEATER is deprecated as of firmware ~2.7.x, so ROUTER is preferred for new deployments; for ordinary non-infrastructure nodes the official guidance is CLIENT. Both ROUTER and REPEATER are infrastructure relay roles - neither is specifically a "monitoring point." See the Router vs. Repeater Role page for guidance.

Step 4 - Configure the Channel

The default channel (LongFast or Default) works for joining the public mesh. To match a local community's private channel:

  1. Navigate to Channels → Channel 0.
  2. Set the Name and PSK to match the local standard. The PSK (pre-shared key) is the channel's encryption key - all nodes that share a channel must use the same key to read each other's messages. Your local community provides this key, usually as a shared QR code or channel URL that imports the name and key together; you rarely need to type a raw key by hand. A PSK can be 0 bytes (no encryption), 16 bytes (AES-128), or 32 bytes (AES-256). See the channel-configuration page for details.
  3. Contact your local Meshtastic community (Discord, or a local club) for the channel name and key.

Step 5 - Set the Modem Preset

Radio Config → LoRa → Modem Preset - select the preset your local network uses (typically Long Fast or Medium Slow). Critical: all nodes on the same network must use the same modem preset or they cannot hear each other.

Step 6 - Configure a Fixed Position

For an unattended repeater without GPS, set a fixed position so the node can report its location:

  1. Config → Position → Fixed Position → Enable.
  2. Enter the latitude, longitude, and altitude of the deployment site (look up coordinates with any map app).
  3. Set Position Broadcast Interval to a long value for a static node - 43200 seconds (12 hours) or 86400 seconds (24 hours) is appropriate, since a fixed node's position never changes and frequent rebroadcasts waste airtime.

Step 7 - Power Optimisations (Battery / Solar)

Step 8 - Disable Bluetooth (Optional)

Config → Bluetooth → Enabled → false. This saves power and removes an attack surface on unattended nodes. Note: once Bluetooth is disabled, you will need a USB/serial connection or remote admin (PKC admin keys, firmware ≥2.5) to re-enable it.

Step 9 - Verify Operation

Meshtastic Repeater Setup

Channel Configuration for Infrastructure Nodes

What Are Channels?

Meshtastic supports up to 8 simultaneous channels (numbered 0 - 7). Channel 0 is the primary channel used for most mesh traffic. Channels 1 - 7 can carry separately encrypted traffic for specific groups or purposes.

PSK - Pre-Shared Key

Each channel has a name and a pre-shared key (PSK). The PSK can be 0 bytes (no encryption), 16 bytes (AES-128), or 32 bytes (AES-256) - it is not always a 32-byte AES-256 key. Two nodes can communicate on a channel only if they share the same name and the same PSK (same key length and value). The PSK encrypts the channel payloads with AES (AES-128 for a 16-byte key, AES-256 for a 32-byte key).

The Default Public Key

The Default public channel (LongFast) uses a well-known, publicly published default key (the 1-byte key AQ==, 0x01) - it is a defined weak key, not an empty/no-encryption PSK, so traffic on it is effectively public. Any node running Meshtastic with the default channel can participate in the public mesh. Using a custom PSK creates a private channel readable only by nodes that hold that key.

Channel Strategy for Community Infrastructure Nodes

Remote Administration

Meshtastic supports remote administration so that nodes can send configuration commands - changing settings without physical access to the device. In firmware 2.5 and later, the recommended method is PKC admin keys configured under Security Config: you add the public key(s) of trusted administrator nodes to the remote node's admin-key list, and those nodes can then administer it. The legacy admin channel (a secondary channel named exactly admin, case-sensitive) exists only for managing pre-2.5 nodes; there is no "Is Admin" toggle on a channel.

Setting up remote administration is strongly recommended for unattended permanent deployments.

  1. On firmware 2.5+, open Security Config and add the public key of each trusted administrator node to the node's admin-key list. (For legacy pre-2.5 nodes only: create a secondary channel named exactly admin.)
  2. Verify the exact app path before you publish or commit the change - getting remote admin wrong can lock you out of a remote node entirely.
  3. Back up the configuration (export the config, and for legacy admin channels save the QR code) and store it securely - anyone with the admin keys or legacy admin-channel QR code can reconfigure your node remotely.

Channel Propagation

What a relay rebroadcasts depends on its Rebroadcast Mode, not just on which channels it has configured. Meshtastic relays based on the unencrypted packet header, so under the default ALL mode a repeater rebroadcasts all packets that match its modem settings and frequency - including packets on channels whose PSK it does not have and cannot decrypt. This means a private channel can be carried by a public repeater. Only the LOCAL_ONLY or KNOWN_ONLY rebroadcast modes restrict relaying to the repeater's own configured/known channels. (A node still has to be on the same modem preset and frequency to hear and relay at all.) For a public community repeater, keeping only the public Default channel configured is the standard approach, but be aware that under default ALL mode it will still relay other traffic on the same modem settings.

Changing Channels on a Deployed Node

Options for modifying channel config after deployment:

Common pitfall: losing the admin keys / admin channel config (or disabling Bluetooth and having no USB access) leaves a remote node inaccessible without a physical site visit. Always back up admin keys and any admin-channel QR codes before deployment.

Advanced Meshtastic Repeater Topics

Store and Forward, position reporting, and telemetry for infrastructure repeater nodes.

Advanced Meshtastic Repeater Topics

Store and Forward

What Is Store and Forward?

Store and Forward (S&F) is a Meshtastic server module that buffers text messages for nodes that are temporarily offline. When a client node comes back within range, the S&F server can replay text messages the client missed while it was away.

Important - the buffer is volatile and S&F is not a delivery guarantee. Stored messages live only in the server node's PSRAM. Any reboot, brownout, or power loss on the server node erases ALL stored messages with no recovery. Replay is best-effort, request-driven, and limited by count and time window; it covers text messages only (not telemetry, position, or other packet types). Never treat the buffer as durable storage, and never rely on it for life-safety message assurance - for incident use, assume the buffer can vanish at any moment.

How It Works

  1. A node with S&F enabled in server mode listens to text messages on its primary channel (channel 0) and stores them in a ring buffer in PSRAM. Note: history retrieval over LoRa is not available on the default public channel, so the server must be configured with a non-default primary channel for S&F history to work.
  2. When a client node requests history (see Client Configuration below), it sends a replay request.
  3. The server transmits buffered messages up to the configured History Return Max count and within the History Return Window time range.

Hardware Requirements

The S&F server requires an ESP32 device with PSRAM - nRF52-based boards cannot run the Store-and-Forward server module at all:

Server Configuration

  1. Navigate to Config → Module Config → Store and Forward.
  2. Set Enabled → true.
  3. Set Is Server → true.
  4. Set History Return Max - the maximum number of messages to replay per request (default: 25 messages, which is the value used when this is left at 0).
  5. Set History Return Window - the time window in minutes from which to replay messages (default 0 = 240 minutes / 4 hours).
  6. Save and reboot the node.

Client Configuration

A client node does not need the Store and Forward module enabled to request history. To retrieve missed messages:

  1. Set role to CLIENT (or CLIENT_MUTE, labelled "Client Mute" in the app menu, if the device should not rebroadcast).
  2. Request history manually: on Android, send a direct message containing SF to the server node; on Apple, use the Client History option.

History retrieval over LoRa is manually requested as above. Automatic retrieval happens only when an app connects directly to the server node (firmware 2.4+) - it does not happen automatically over the mesh just by coming into range.

Ideal Use Cases

Limitations

Advanced Meshtastic Repeater Topics

Position and Telemetry for Infrastructure Nodes

Why Position Accuracy Matters

An accurate position lets your repeater appear correctly on meshmap.net and in the Meshtastic app's node list. (Note that meshmap.net is a third-party map and only shows nodes reporting to the public MQTT server, so it is not an authoritative or complete view of the mesh.) Other operators use your node's reported position to plan coverage, model signal paths, and verify that packets are actually being relayed from the expected location.

Fixed Position vs. GPS

Most unattended infrastructure repeaters do not need GPS hardware. Instead, configure a fixed position using the known coordinates of the deployment site:

  1. Look up the coordinates of your site with any map application (Google Maps, OSMand, etc.) - right-click the location and copy the lat/lon.
  2. In the Meshtastic app: Config → Position → Fixed Position → Enable.
  3. Enter the latitude, longitude, and altitude (in metres).
  4. Save. The node will broadcast this position at the configured interval without needing a GPS fix.

If your device has GPS hardware and the repeater is mobile (e.g. a vehicle relay), leave GPS enabled and set the Smart Position Broadcast threshold appropriate for your speed.

Position Broadcast Interval

This setting controls how often the node announces its location on the mesh.

Smart Position Broadcast

Meshtastic's Smart Position feature broadcasts a new position only when the node has moved beyond a configurable distance threshold. For a static repeater, disable Smart Position and use a fixed timed interval instead - Smart Position is designed for moving nodes and may behave unexpectedly on hardware without GPS.

Device Telemetry

Meshtastic can broadcast device health metrics over the mesh. The device metrics are:

Enable and configure telemetry under Module Config → Telemetry, in the Device Metrics section (exact menu labels vary by client and version). Set the broadcast interval - the default of 1800 seconds (30 minutes) is appropriate for most infrastructure nodes; lengthen it to reduce airtime.

Remote Health Monitoring

Once device telemetry is enabled, any operator who can see your node on the mesh can view its reported battery voltage and channel utilisation in the Meshtastic app's node detail view. This provides passive, no-cost status visibility:

Passive telemetry shows health only while the node is alive and in range. It provides no active alert when the node actually fails - you simply stop seeing updates, which is easy to miss. For infrastructure you depend on, pair telemetry with an active offline-detection alert (something that notifies you when telemetry stops).

For critical infrastructure nodes, consider setting up a MQTT bridge to push telemetry to an external monitoring system - see the Meshtastic MQTT documentation for details. Note that Wi-Fi/MQTT-based monitoring depends on internet connectivity and will fail in exactly the grid-down or internet-out emergencies you may most need it.

Role Configuration and Tuning

Deep-dive configuration of ROUTER, ROUTER_CLIENT, and REPEATER roles including hop limit tuning and fixed-position setup.

Role Configuration and Tuning

ROUTER vs ROUTER_CLIENT vs REPEATER: When to Use Each

Meshtastic's current infrastructure node roles are ROUTER, ROUTER_LATE, and REPEATER (with CLIENT covering ordinary nodes, which also relay traffic via managed flooding). Each has distinct behaviors for packet forwarding, position broadcasting, and power management. Choosing the wrong role for your hardware leads to either wasted bandwidth or poor coverage. Note: ROUTER_CLIENT was retired in firmware 2.3.15 and is no longer a settable role - it now behaves as CLIENT. It is covered below only to explain what to use instead.

Role Behavior Summary

BehaviorROUTERROUTER_LATEREPEATER
Forwards packetsYes (high priority)Yes (rebroadcasts only after others)Yes (high priority)
Has user-facing interface (BLE/WiFi/Serial)No (off by default)No (off by default)Yes (on by default)
Broadcasts own positionReducedReducedNever
Appears in node listYesYesNo (stealth)
Sends telemetryReducedReducedNone
Preferred for infrastructureYes (stationary, well-placed)Yes (rebroadcast-late nodes)Yes (privacy-conscious / anonymous relay)

ROUTER

The ROUTER role is designed for dedicated, stationary, well-placed infrastructure nodes. It:

Use ROUTER when: You have a dedicated always-on, stationary, well-placed infrastructure node (fixed repeater, backbone node) with no human user directly attached. For ordinary nodes, official guidance is to leave them on CLIENT rather than promoting them to ROUTER.

ROUTER_CLIENT (deprecated - use CLIENT or ROUTER instead)

ROUTER_CLIENT was deprecated and removed in firmware 2.3.15; it is no longer a settable role and now behaves exactly as CLIENT. It was originally meant for nodes that served double duty:

Why it was retired: ROUTER_CLIENT nodes created traffic loops and increased channel utilization (consuming hops and causing collisions) when several were deployed in close proximity - the developers have publicly described it as a mistake. Do not treat it as a role you can merely "be cautious with"; it is gone.

What to use instead: For a node that one person uses AND that should also relay for others, leave it on CLIENT - CLIENT nodes already rebroadcast via managed flooding while keeping the full client interface. For a dedicated repeater that no one uses interactively, use ROUTER.

REPEATER

The REPEATER role is the "silent repeater" option. (Note: REPEATER is a device.role; it is not "formerly ALL_SKIP_DECODING." ALL_SKIP_DECODING is a value of the separate device.rebroadcast_mode setting - the two are independent config axes.) REPEATER:

Use REPEATER when: You want a completely silent, anonymous infrastructure node - no node-list footprint, no management overhead. Ideal for stealth installations or when you want to avoid cluttering the node list.

Caveat: The REPEATER's invisibility makes it harder to diagnose - you won't see it on the map or in node lists. Use ROUTER instead if you need visibility for network management. (REPEATER is also deprecated as of firmware ~2.7.x; for most new infrastructure, prefer ROUTER or ROUTER_LATE.)

Configuration Commands

# Set role to ROUTER (dedicated infrastructure)
meshtastic --set device.role ROUTER

# ROUTER_CLIENT was retired in firmware 2.3.15 - do not use it.
# For a node that is both used and relays, leave it on CLIENT:
meshtastic --set device.role CLIENT

# Set role to REPEATER (anonymous silent relay)
meshtastic --set device.role REPEATER

# (Optional) skip-decoding forwarding is a SEPARATE rebroadcast_mode setting,
# not a role - enable it explicitly if you want it:
meshtastic --set device.rebroadcast_mode ALL_SKIP_DECODING

# Verify current role
meshtastic --get device.role

Role Configuration and Tuning

Deep-dive configuration of ROUTER, ROUTER_CLIENT, and REPEATER roles including hop limit tuning and fixed-position setup.

Role Configuration and Tuning

ROUTER vs ROUTER_CLIENT vs REPEATER Role: Deep Dive

Meshtastic provides several device roles for infrastructure nodes that exist to extend network reach rather than serve end users. On current firmware the relevant roles are ROUTER, ROUTER_LATE, and REPEATER (with CLIENT being the right choice for the overwhelming majority of ordinary nodes, since CLIENT nodes already rebroadcast via managed flooding). Choosing the wrong role wastes resources, creates unnecessary air-time, or silently breaks the capabilities operators expect. This page dissects each role at the firmware level so you can make an informed decision for every node you deploy.

Important deprecation notice. The ROUTER_CLIENT role referenced in this page's title was retired in firmware 2.3.15 and is no longer a selectable device.role value. Do not attempt to set it. If you need a node that both relays and is used interactively by its operator, use CLIENT (which already relays) or ROUTER. Separately, the REPEATER role has itself been deprecated as of firmware ~2.7.x; for new infrastructure prefer ROUTER or ROUTER_LATE. The valid current device.role values are CLIENT, CLIENT_MUTE, CLIENT_HIDDEN, ROUTER, ROUTER_LATE, REPEATER, TRACKER, SENSOR, TAK, TAK_TRACKER, and LOST_AND_FOUND. The historical ROUTER_CLIENT material below is retained for context only and clearly marked as legacy.


The Infrastructure Roles at a Glance

Capability ROUTER ROUTER_LATE REPEATER (deprecated)
Rebroadcasts received packets (once, with higher priority than CLIENT roles) Yes Yes (rebroadcasts last, after other nodes) Yes
Power-saving sleep behaviour Forced on automatically (ESP32); cannot be disabled Configurable via power.is_power_saving Does not force sleep by default
Visible in the node list / sends NodeInfo Yes Yes No (anonymous relay, sends no NodeInfo)
App connectivity (BLE / WiFi / Serial) by default Off by default On (client-style) Off
Relative overhead Standard Standard Minimal overhead (per docs)

All of ROUTER, ROUTER_LATE, and REPEATER rebroadcast each packet once with higher priority than ordinary CLIENT nodes. The retired ROUTER_CLIENT role has been omitted from this table; it is not settable on current firmware.


ROUTER Role

A ROUTER node is the canonical fixed-infrastructure role, designed for stationary, well-placed nodes. When you set a node to ROUTER it adjusts its behavior in the following ways:

Setting the ROUTER role via CLI

meshtastic --set device.role ROUTER

Verifying the role was applied

meshtastic --get device.role

The --get verb is the standard counterpart to --set for reading any config field in the Python CLI.


ROUTER_LATE Role

ROUTER_LATE is the modern infrastructure role for a node that should rebroadcast only after other nodes have had a chance to, rather than with top priority. It is useful within a local cluster where you want a relay that fills gaps without dominating airtime. Unlike ROUTER, it does not force power-saving sleep on, and it keeps client-style app connectivity available. For most stationary backbone infrastructure prefer ROUTER; choose ROUTER_LATE for nodes that should defer to the rest of the mesh first.


ROUTER_CLIENT Role (retired — legacy reference only)

ROUTER_CLIENT was retired in firmware 2.3.15 and is not a settable role on current firmware. Historically it was described as a "superset of ROUTER" that retained ROUTER's relay behaviour while also letting the node originate messages as a client. This is preserved here only for operators encountering older documentation or very old firmware:

Do not use the legacy command below on current firmware — it will fail because ROUTER_CLIENT is no longer an accepted device.role value. For a relay that an operator also uses interactively, set device.role CLIENT instead.

Legacy ROUTER_CLIENT CLI (no longer valid)

# Retired in firmware 2.3.15 — this command fails on current firmware.
# Use:  meshtastic --set device.role CLIENT
# (legacy:  meshtastic --set device.role ROUTER_CLIENT)

REPEATER Role (deprecated)

The REPEATER role is the most minimal relay option, designed for nodes that should retransmit packets with minimal overhead and produce no broadcasts of their own. Note: REPEATER was deprecated as of firmware ~2.7.x; for new infrastructure consider ROUTER or ROUTER_LATE. Its documented behaviour:

The anonymity of the REPEATER role is a deliberate design choice: relay nodes that aren't individually addressed produce less management overhead on the mesh. Because a REPEATER is not in the node list, you generally cannot select or ping it by node ID in the app the way you can a ROUTER.

Setting the REPEATER role via CLI

meshtastic --set device.role REPEATER

Hop Count Handling Across Roles

All relaying roles participate in hop-count decrement identically. When a packet arrives with a remaining hop count of N, the forwarding node decrements it to N-1 before rebroadcasting. If N is already 0, the packet is consumed locally but not forwarded. ROUTER and REPEATER have rebroadcast priority (they may rebroadcast sooner, and defer less to other rebroadcasters) but they still decrement and honour hop_limit — there is no hop-counter bypass or "always forward regardless" mode.

The practical consequence is that placing a relay mid-path does use a hop. Default hop_limit is 3 and the maximum is 7; "really, 3 is fine" per the docs. Ensure the number of relay hops between any two endpoints does not exceed your configured hop_limit. Raising hop_limit to "fix" dropped messages can worsen congestion (more airtime and collisions), so pair any increase with a check on channel utilisation.


Choosing the Right Role

Community fixed repeater on a hilltop or tower

Use ROUTER. The node should be visible to the community (appears in node list, sends NodeInfo, relays traceroutes) but should not generate user traffic of its own. Operators can still access the serial console locally for configuration. For a node that should defer to the rest of the mesh before rebroadcasting, consider ROUTER_LATE.

meshtastic --set device.role ROUTER

Ham operator's home station that also relays

Use CLIENT. CLIENT nodes already rebroadcast via managed flooding, so a home station set to CLIENT both relays and lets you participate in mesh conversations — sending alerts, coordinating with your community, or running net check-ins from the same hardware. (The old advice to use ROUTER_CLIENT here is obsolete; ROUTER_CLIENT was retired in 2.3.15.)

meshtastic --set device.role CLIENT

Minimal-overhead anonymous relay

Historically REPEATER was the choice for a small node tucked into a building to bridge two otherwise disconnected areas with no topology visibility. Because REPEATER is deprecated as of firmware ~2.7.x, prefer ROUTER (or ROUTER_LATE) for new deployments; only use REPEATER if you specifically need an anonymous relay and understand it is being phased out.

meshtastic --set device.role ROUTER   # preferred; REPEATER is deprecated

Power Consumption Comparison

Idle power profiles differ by role. A REPEATER keeps the radio active and does not force sleep, whereas a ROUTER uses forced power-saving sleep (ESP32) that cannot be disabled — so their idle draw is not the same. The differences otherwise arise from background processing:

Quick CLI power-related settings for infrastructure nodes

# Disable Bluetooth to save power (figure is approximate; verify against the Bluetooth config docs)
meshtastic --set bluetooth.enabled false

# Reduce the screen on-time to save power. Note: the documented field is display.screen_on_secs.
# A value of 0 is the 10-minute DEFAULT, not "off"; set a small nonzero value to dim sooner.
meshtastic --set display.screen_on_secs 10

# Set a lower TX power only if nodes are nearby (reduces TX draw and channel utilisation).
# tx_power 0 is the default and means "use the region-legal maximum." Never set a higher fixed
# value than your region/antenna combination legally allows (note the >6 dBi gain-reduction rule).
meshtastic --set lora.tx_power 17
Role Configuration and Tuning

Hop Limit Configuration for Repeaters

The hop limit is one of the most important and most misunderstood parameters in a Meshtastic mesh. Setting it correctly reduces unnecessary rebroadcasts, controls how far a message propagates, and prevents broadcast storms that saturate the channel. This page explains exactly what hop_limit does, when to change it, and the CLI commands to apply it.


What hop_limit Controls

Every Meshtastic packet carries a hop count field in its header. This field is initialised to the hop_limit value configured on the originating node at the time the packet is sent. Each relay node (ROUTER, ROUTER_LATE, or REPEATER) decrements this field by 1 before rebroadcasting. (The older ROUTER_CLIENT role was deprecated and removed in firmware 2.3.15 — use ROUTER or ROUTER_LATE instead; REPEATER is also deprecated as of firmware ~2.7.x.) When a node receives a packet with a hop count of 0 it delivers the packet locally but does not forward it further. (See the Meshtastic mesh algorithm docs: "If any mesh node sees a packet with a HopLimit other than zero, it will decrement that HopLimit and attempt to rebroadcast on behalf of the original sending node.")

In a simple linear chain, the maximum relay chain length is:

Maximum relaying nodes = hop_limit
Nodes reached along an idealised single chain = hop_limit + 1 (originator counts as hop 0)

Note: real meshes are not linear chains. Many nodes can hear each hop, so the total number of nodes that actually hear a packet is topology-dependent — the formula above describes an idealised single chain, not a fixed total node count.

With the default hop_limit = 3, a packet originating at node A can reach:

In practice the default of 3 covers most community-sized networks with reasonable relay density.


The Default: hop_limit = 3

As of current firmware (2026), the firmware default is 3 — a careful balance. It is high enough to traverse a typical multi-node mesh with a few infrastructure repeaters, and low enough that a single rogue or misconfigured node cannot cause runaway rebroadcasting. (This is a firmware-version-dependent default; verify against your installed firmware.) Leave it at 3 unless you have a specific and measured reason to change it.


When to Increase the Hop Limit

Large geographically spread networks

If your community network spans a large geographic area - for example a county-wide emergency communications mesh with repeaters spaced 20 - 30 km apart - a hop count of 3 may not be sufficient to bridge the entire path. In this case, increasing to 4 or 5 gives messages the relay budget to traverse more infrastructure nodes. Bear in mind that raising hop_limit increases airtime and channel utilisation; prefer adding infrastructure to shorten paths where you can.

Before increasing, first verify the actual hop count needed by running a traceroute between the two furthest nodes:

meshtastic --traceroute '!abcd1234'

Count the intermediate hops in the output. Set hop_limit to at least that number plus one for margin.

# Increase hop limit on the originating/infrastructure node
meshtastic --set lora.hop_limit 4

When to Decrease the Hop Limit

Small, dense urban networks

In a dense neighbourhood deployment where every node can hear at least 2 - 3 others directly, a hop limit of 3 generates significant redundant retransmissions. Consider reducing to 2 if traceroutes show no path requires more than 2 relays.

meshtastic --set lora.hop_limit 2

Local-only repeater that should not propagate far

Important: setting hop_limit low on a repeater does NOT limit the packets it relays for others — it only limits how far the repeater's own messages (its NodeInfo, position, telemetry) travel. To limit how far transit traffic propagates through your infrastructure you must coordinate settings network-wide (see below) or use rebroadcast-mode / role settings.

If you deploy a repeater specifically to bridge two buildings on the same campus - not to reach the wider regional mesh - you can reduce the reach of the traffic it itself originates by setting hop_limit = 2 on its own packets (its own NodeInfo, position, telemetry). This does not prevent it from forwarding transit packets that arrive with a remaining count of 3, so it does not constrain its repeater function — it only limits the blast radius of traffic the repeater itself generates.

Note: the lora.ignore_incoming array is a blocklist — node IDs listed there have their packets dropped on receive — not a whitelist of nodes to serve. It is also deprecated in the client apps. To ignore a specific node, long-press it in the app and mark it ignored rather than relying on this setting.


The Broadcast Storm Risk From High Hop Counts

The maximum hop_limit is 7 (it cannot be set higher). Values of 6 and 7 are valid settings, not a forbidden range — but the Meshtastic project strongly recommends leaving hop_limit at 3 unless you have a specific, verified reason to raise it, because unnecessarily high hop counts cause network problems. Here is why:

If you feel you need a high hop limit, the better solution is usually to add more infrastructure repeaters to shorten the required path, rather than raising the hop counter.


Configuring hop_limit via CLI

# Set hop limit to 3 (default - recommended for most networks)
meshtastic --set lora.hop_limit 3

# Set hop limit to 4 (for large spread-out networks after traceroute verification)
meshtastic --set lora.hop_limit 4

# Set hop limit to 2 (for small dense networks or local-only repeaters)
meshtastic --set lora.hop_limit 2

# Verify the applied value
meshtastic --get lora.hop_limit

hop_limit Is a Per-Node Origination Setting

An important subtlety: hop_limit controls the initial value placed in packets that this node originates. It has no effect on packets that arrive from another node already carrying a hop count - those are forwarded as received (after decrement). Therefore:


Monitoring Channel Utilisation After Changes

After adjusting hop_limit, monitor channel utilisation via the Meshtastic app or web UI, where it is clearly labelled in the node detail view. Channel utilisation (ChUtil) is measured over a 1-minute window (six 10-second periods). Use these health bands consistently: green below 25%, orange 25 - 50%, red above 50% ChUtil; AirUtilTX should be much lower (a few percent). Note that ChUtil is a lagging rolling average, so it can read healthy while the channel is momentarily saturated. If you see utilisation spike after a hop_limit increase, your network density may not support the change and you should revert.

Role Configuration and Tuning

Fixed Position for Repeater Nodes

A repeater node that knows its own location serves the community in two ways: it appears accurately on coverage maps, and it lets neighbouring nodes calibrate their own position estimates. Without a fixed position, a GPS-less repeater either appears at coordinate (0, 0) in the ocean or does not appear on the map at all. This page explains how to configure a precise static position, how to reduce position precision for privacy, and how to minimise the air-time cost of periodic position broadcasts.


Why a Fixed Position Matters for Infrastructure Nodes


Configuring a Static GPS Position Without a GPS Module

Method 1: Meshtastic CLI (recommended)

The --setlat, --setlon, and --setalt flags write a fixed position directly to the device's configuration storage. Once set, this position is broadcast as the node's location even with no GPS hardware present. This is the documented, recommended way to set a fixed position.

# Set position for a repeater at the top of Mount Davidson, San Francisco
# Latitude: 37.7406, Longitude: -122.4538, Altitude: 282 metres
meshtastic --setlat 37.7406 --setlon -122.4538 --setalt 282

Determine the coordinates of your site using Google Maps, CalTopo, or any mapping tool that provides WGS84 decimal degrees (the standard Meshtastic expects). Right-click the exact antenna location on Google Maps to copy coordinates.

Method 2: Meshtastic Python API

If you prefer scripting, the Python API exposes setFixedPosition() on the local node, which takes decimal-degree latitude and longitude plus an integer altitude in metres:

from meshtastic.serial_interface import SerialInterface

iface = SerialInterface()

# Set a fixed position: latitude, longitude (decimal degrees), altitude (metres)
iface.localNode.setFixedPosition(37.7406, -122.4538, 282)

iface.close()

Method 3: Meshtastic Web UI

Connect to the node's web interface (available on ESP32-based devices at http://meshtastic.local or the device's IP when connected to Wi-Fi). Navigate to Config → Position, enable Fixed Position, and enter latitude, longitude, and altitude. Save and reboot.


Position Precision: Reducing Exact Location for Privacy

If the repeater is on private property and the owner does not want the exact address broadcast on the mesh, reduce position precision. Position precision is a per-channel setting (module_settings.position_precision), so it is configured against a specific channel index rather than globally. Meshtastic supports precision levels from full resolution (sub-metre) down to a heavily-rounded approximation. The exact bits-to-radius mapping is defined by the in-app precision slider; the values below are approximate and may shift between firmware versions - confirm against the current Meshtastic position-config docs.

Common choices for community repeaters:

# Position precision is per-channel; --ch-index selects the channel (0 = primary)
# Set position precision bits to 14 (approximately a 1.5 km radius)
meshtastic --ch-index 0 --ch-set module_settings.position_precision 14

# Set position precision bits to 11 (approximately a 11.7 km radius)
meshtastic --ch-index 0 --ch-set module_settings.position_precision 11

# Restore full precision (precision bits 32)
meshtastic --ch-index 0 --ch-set module_settings.position_precision 32

The position_precision value is a bit-field width - higher values mean more significant bits retained from the raw coordinate, i.e. higher accuracy. Values below about 10 round so aggressively that the position becomes almost meaningless for map purposes. Because this is a per-channel setting, you can carry different precision on different channels.


Position Broadcast Interval for Fixed Nodes

A fixed repeater does not move. By default the node broadcasts its position on a periodic interval (the firmware default is 15 minutes), and smart position broadcast - controlled by position.position_broadcast_smart_enabled (default true) - further reduces transmissions when the node is stationary. For a static infrastructure node you can simply lengthen the interval to at least 12 hours (43200 seconds), or even 24 hours (86400 seconds), to avoid wasting air-time that could be used by mobile nodes.

# Set position broadcast interval to 12 hours (43200 seconds)
meshtastic --set position.position_broadcast_secs 43200

# Set position broadcast interval to 24 hours (86400 seconds) - recommended for fixed sites
meshtastic --set position.position_broadcast_secs 86400

# Smart position broadcast is on by default; set false only if you want to disable it
meshtastic --set position.position_broadcast_smart_enabled false

With an 86400-second interval, a fixed node broadcasts its position approximately once per day (plus once at boot). The firmware default interval is 15 minutes; increasing it to the 12-24 h range for a static node saves many transmissions per day across a network with multiple infrastructure nodes.


Verifying the Fixed Position Was Applied

# Check position configuration on the device
meshtastic --get position

# Pull the device info including last known position
meshtastic --info | grep -A 5 position

After the node reboots following a position update, connect to the Meshtastic app and look at the node list. The repeater should appear at the correct location on the map within one position broadcast interval.


Altitude Accuracy

Altitude in Meshtastic is stored in whole metres. It is commonly referenced to the WGS84 ellipsoid rather than mean sea level, but the Position message also carries an ALTITUDE_MSL flag that indicates when a value is given relative to mean sea level - so do not assume the value is always ellipsoidal. For antenna-height accuracy, use the elevation of the antenna itself, not ground level at the base of the tower. For most community mapping purposes, ground-level elevation from a topo map is sufficient - the difference rarely affects coverage visualisations.

Find accurate elevation using the USGS National Map (apps.nationalmap.gov) or open-elevation.com/api/v1/lookup?locations=LAT,LON for non-US sites.

Monitoring and Maintenance

Remote monitoring stacks, firmware update procedures, and systematic troubleshooting for deployed Meshtastic repeaters.

Monitoring and Maintenance

Remote Monitoring a Meshtastic Repeater

A repeater deployed on a hilltop or building rooftop is useless to the community if failures go undetected for days. Effective remote monitoring lets you catch power issues, firmware hangs, and hardware faults before users notice. This page covers the monitoring stack - from MQTT uplink through time-series dashboards to alerting - and the procedures for restarting a stuck node remotely.

This MQTT/Telegraf/Grafana stack is an advanced, optional setup. If you just want a quick health check, the simple in-app telemetry view (battery, channel utilisation, last heard) in the Meshtastic app is the recommended starting point for most operators.

Important caveat - this monitoring path depends on internet connectivity at the repeater. The entire stack relies on the repeater reaching an MQTT broker over Wi-Fi/internet. During grid-down or internet-outage events - exactly the scenarios mesh emergency comms is built for - MQTT monitoring will be blind, and you lose visibility precisely when it matters most. Do not rely on MQTT/Grafana as your sole health check for incident readiness; maintain an over-the-mesh (LoRa) status check or a local/RF heartbeat that does not require internet.


Architecture Overview

The standard monitoring stack for a Meshtastic infrastructure node has four components:

  1. Node -> MQTT uplink: The repeater connects to Wi-Fi (if ESP32-based) and publishes mesh packets as JSON to an MQTT broker. This requires internet at the repeater (see the caveat above).
  2. MQTT broker -> InfluxDB: A subscriber (Telegraf or a custom script) consumes MQTT messages and writes telemetry fields into InfluxDB or another time-series database.
  3. Grafana -> InfluxDB: Grafana dashboards visualise battery voltage, SNR of received packets, channel utilisation, and uptime over time.
  4. Alerting: Grafana alerts (or a Python watchdog) send notifications when telemetry gaps indicate the node is offline.

Enabling the MQTT Uplink on the Repeater

# Enable MQTT on the device
meshtastic --set mqtt.enabled true

# Set your MQTT broker address
meshtastic --set mqtt.address mqtt.yourdomain.com

# Set MQTT username and password (if your broker requires auth)
meshtastic --set mqtt.username meshuser
meshtastic --set mqtt.password yourpassword

# Enable JSON encoding (required for Telegraf/InfluxDB ingestion)
meshtastic --set mqtt.json_enabled true

# Set the root MQTT topic (all messages published under this prefix)
meshtastic --set mqtt.root msh

# Enable uplink on the default channel (channel 0)
meshtastic --ch-set uplink_enabled true --ch-index 0

After applying these settings the node publishes JSON packets to topics of the form: msh/US/2/json/<CHANNELNAME>/<USERID> (for example msh/US/2/json/LongFast/!abcd1234). The path segments after /json/ are the channel name and the node user ID - the portnum is not in the topic path, it appears inside the JSON message as the type field.


Telegraf Configuration for InfluxDB Ingestion

Install Telegraf on your monitoring server and add an MQTT consumer input:

[[inputs.mqtt_consumer]]
 servers = ["tcp://mqtt.yourdomain.com:1883"]
 topics = ["msh/#"]
 username = "meshuser"
 password = "yourpassword"
 data_format = "json"
 json_time_key = "rx_time"
 json_time_format = "unix"

[[outputs.influxdb_v2]]
 urls = ["http://localhost:8086"]
 token = "YOUR_INFLUXDB_TOKEN"
 organization = "mesh-community"
 bucket = "meshtastic"

Restart Telegraf and verify data is flowing:

telegraf --config /etc/telegraf/telegraf.conf --test

Grafana Dashboard Panels

Create a Grafana dashboard with the following panels for each monitored repeater:

Battery Voltage Trend

from(bucket: "meshtastic")
 |> range(start: -7d)
 |> filter(fn: (r) => r["_measurement"] == "mqtt_consumer")
 |> filter(fn: (r) => r["_field"] == "voltage")
 |> filter(fn: (r) => r["from"] == "!YOUR_NODE_ID")

Channel Utilisation Over Time

from(bucket: "meshtastic")
 |> range(start: -24h)
 |> filter(fn: (r) => r["_field"] == "channel_utilization")
 |> filter(fn: (r) => r["from"] == "!YOUR_NODE_ID")

Last Seen (Uptime Check)

Create a Stat panel showing the time since last telemetry packet. As a common rule of thumb (not a firmware spec), treat a node as likely offline once the time since last telemetry exceeds about 2× its telemetry broadcast interval.


Offline Detection: The 2× Interval Rule

Telemetry interval is a Module Config setting (under Telemetry in the app, not the radio LoRa config). It is broadcast on a configurable interval; set it on the repeater:

# Set device metrics telemetry interval to 30 minutes (1800 seconds)
meshtastic --set telemetry.device_update_interval 1800

Configure your monitoring system to alert if no telemetry has been received from the node in 2 × 1800 = 3600 seconds (1 hour). This tolerates a single missed packet (common with occasional MQTT delivery failures) before triggering an alert.

Be aware of the tradeoff: a 1-hour detection window means a failed node can be down for nearly an hour before you are alerted, and that failure could coincide with the start of an incident. Tune the window to how long you can tolerate an undetected outage, not just to MQTT reliability. For emergency infrastructure, shorten the telemetry interval (e.g. 5-10 minutes) so the 2× alert threshold gives 10-20 minute detection, or add an independent faster heartbeat.

In Grafana, create an Alert Rule on the Last Seen panel with the condition: last seen > 3600 seconds -> ALERT.


Python Watchdog with Telegram Alerts

For operators who prefer a lightweight Python watchdog over a full Grafana stack, the following script monitors MQTT and sends a Telegram message when a repeater goes silent.

#!/usr/bin/env python3
"""
Meshtastic repeater watchdog - sends Telegram alert when node goes silent.
Dependencies: pip install paho-mqtt requests
"""
import time, threading, paho.mqtt.client as mqtt, requests

MQTT_HOST = "mqtt.yourdomain.com"
MQTT_PORT = 1883
MQTT_USER = "meshuser"
MQTT_PASS = "yourpassword"
MQTT_TOPIC = "msh/#"

# Map node ID (string, e.g. "!abcd1234") to friendly name
WATCHED_NODES = {
 "!abcd1234": "Mt-Davidson Repeater",
 "!ef567890": "Twin-Peaks Repeater",
}

# Telegram bot config
TELEGRAM_TOKEN = "YOUR_BOT_TOKEN"
TELEGRAM_CHAT_ID = "YOUR_CHAT_ID"

# Alert if silent for longer than this many seconds
SILENCE_THRESHOLD = 3600 # 2x 30-minute telemetry interval

last_seen = {nid: time.time() for nid in WATCHED_NODES}
alerted = {nid: False for nid in WATCHED_NODES}

def send_telegram(msg):
 url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage"
 requests.post(url, data={"chat_id": TELEGRAM_CHAT_ID, "text": msg})

def on_message(client, userdata, msg):
 try:
 # Topic format is msh/US/2/json/CHANNELNAME/USERID, so the node USERID is the last segment
 parts = msg.topic.split("/")
 node_id = parts[-1]
 if node_id in last_seen:
 last_seen[node_id] = time.time()
 if alerted[node_id]:
 alerted[node_id] = False
 name = WATCHED_NODES[node_id]
 send_telegram(f"RESOLVED: {name} is back online.")
 except Exception:
 pass

def watchdog_loop():
 while True:
 now = time.time()
 for node_id, name in WATCHED_NODES.items():
 silent = now - last_seen[node_id]
 if silent > SILENCE_THRESHOLD and not alerted[node_id]:
 alerted[node_id] = True
 mins = int(silent / 60)
 send_telegram(
 f"ALERT: {name} ({node_id}) has been silent for {mins} minutes."
 )
 time.sleep(60)

client = mqtt.Client()
client.username_pw_set(MQTT_USER, MQTT_PASS)
client.on_message = on_message
client.connect(MQTT_HOST, MQTT_PORT)
client.subscribe(MQTT_TOPIC)

threading.Thread(target=watchdog_loop, daemon=True).start()
client.loop_forever()

Run this script as a systemd service on your monitoring server so it restarts automatically after reboots.


Checking Battery Voltage Trend for Solar Systems

Solar-powered repeaters require voltage trend analysis, not just instantaneous readings. A battery at 12.6 V at noon is fine; the same reading at 4 AM after a cloudy week indicates the system is not fully recovering and may fail the following night.

In Grafana, create a panel showing battery voltage over the previous 7 days with a minimum threshold line at your low-voltage cut-off. Set this cut-off to your battery manufacturer's specified low-voltage-disconnect value rather than a single hardcoded number - commonly around 11.8-12.0 V for a 12 V lead-acid battery and roughly 3.0-3.3 V per cell for LiPo. Configure an alert if the daily minimum voltage is declining by more than 0.1 V per day.


Remote Administration via Admin Keys

When monitoring indicates a repeater has stopped responding but power is confirmed present, a firmware hang is the likely cause. Meshtastic supports remote administration, but note an important limitation: only --set and --get are supported over --dest. There is no supported remote --reboot (or --reset) command - --reboot is a local-only CLI action. To recover a remote node you can change its configuration via --set (or use the admin app); a true remote reboot is not available over the mesh.

# Read a setting from the target node remotely
meshtastic --dest '!abcd1234' --get device.role

# Change a setting on the target node remotely (only --set/--get are supported remotely)
meshtastic --dest '!abcd1234' --set device.role REPEATER

For this to work:

Resilience against firmware hangs

Meshtastic has internal firmware watchdogs, but it exposes no user-configurable watchdog interval setting (there is no device.watchdog_secs field). If you need automatic recovery from a hard firmware hang where even admin packets are not processed, rely on physical solutions instead: an external hardware watchdog timer that power-cycles the board, or a scheduled power-cycle (for example a timer or smart relay on the supply). These do not require any network connectivity to recover the node.

Monitoring and Maintenance

Firmware Updates on Deployed Repeaters

Meshtastic has no over-the-LoRa firmware push between mesh nodes - firmware cannot be sent from one node to another over the radio mesh. Firmware is updated via a USB connection to the device, or via Bluetooth OTA on supported nRF52 devices (e.g. RAK4631). For a repeater deployed on a rooftop, tower, or remote site, this generally means a site visit. Planning these maintenance windows carefully - and documenting configuration before you go - prevents accidental service outages and preserves network continuity for the community.


Over-the-Air Firmware Update: Not Over LoRa

It is worth stating clearly: there is no mechanism in Meshtastic firmware to push a firmware binary from one mesh node to another over LoRa. The "OTA" term in Meshtastic documentation means Bluetooth OTA - a supported firmware update path over BLE from a smartphone app for nRF52 devices, not a transfer over the LoRa mesh. BLE OTA is a documented, first-class update path on nRF52 boards (such as the RAK4631), not a stray term.

USB flashing is the most universally supported and reliable path across all platforms; nRF52 devices additionally support reliable BLE OTA, which is often the only practical path for a sealed enclosure. Plan accordingly when choosing repeater sites - a location that requires climbing a locked tower or a two-hour drive is a location you will want to update infrequently, so prioritise stability over bleeding-edge firmware on remote infrastructure nodes.


Planning a Maintenance Window


Exporting Configuration Before the Update

Configuration is not preserved across all firmware versions. Some updates change protobuf field IDs or introduce new mandatory fields, causing the stored configuration to load with default values after the firmware wipe. Always export before touching the device.

# Export current configuration to a YAML file
meshtastic --export-config > repeater_config_backup_$(date +%Y%m%d).yaml

This produces a YAML file with all channel configurations, device settings, LoRa settings, position, and module config. Store this file in a safe location - version control or your operations shared drive. (Note: --info output is not a restorable backup; only the --export-config YAML can be re-applied with --configure.)

Review the exported file before the update and note any values that are not visible in the app UI (e.g. custom channel PSK keys, non-default hop limits, MQTT credentials). These are the settings most likely to need manual restoration if automatic re-import fails.


Flashing Firmware via the Web Flasher

The Meshtastic web flasher at flasher.meshtastic.org is the recommended tool for ESP32 hardware platforms (T-Beam, Heltec, etc.). It runs entirely in a Chromium-based browser and handles partition layout, bootloader, and firmware in a single operation. nRF52 boards (RAK4631, T-Echo) are not flashed with the web serial flasher - they update by drag-and-dropping a UF2 file onto the device's mass-storage drive after entering bootloader mode (double-tap reset), or via BLE OTA.

  1. Connect the repeater hardware to your laptop via USB. Use a data-capable cable - power-only cables will not expose a serial port.
  2. Navigate to flasher.meshtastic.org in Chrome or Edge (these are the officially supported browsers; other Chromium browsers such as Brave are based on the same engine and may work, but Web Serial support is not guaranteed).
  3. Click Flash Connected Device. The browser will request access to the serial port - select the device from the list (typically CP2102, CH340, or FTDI depending on the board).
  4. Select the correct hardware variant. Flashing the wrong variant can result in a non-booting device, so always confirm the exact variant string against the live device dropdown on flasher.meshtastic.org before flashing - variant labels can change between releases. Common examples (verify before use):
    • T-Beam v1.1 → tbeam
    • T-Beam v1.2 / AXP2101 → tbeam-s3-core (the AXP2101 PMU appears on more than one board; confirm your board's exact variant in the device list)
    • Heltec v3 → heltec-v3
    • RAK WisBlock 4631 → rak4631 (flashed via UF2 drag-and-drop, not the web serial flasher)
  5. Select the firmware version. For infrastructure nodes, prefer the latest stable release rather than alpha/nightly builds.
  6. Click Flash and wait for the progress bar to complete. Do not disconnect the cable during flashing.

Alternative: CLI / esptool flashing

The web flasher (flasher.meshtastic.org) is the supported path for ESP32 devices. A command-line flashing route using esptool is documented in the official "Flashing Firmware" guide. The standalone meshtastic-flasher GUI project is legacy/unmaintained in favour of the web flasher; if you use any CLI tool, verify its current syntax against the official docs rather than relying on a fixed command line, as flags change between versions.


Restoring Configuration After the Update

# Restore a previously exported configuration (YAML) with --configure
# (there is no --import-config flag)
meshtastic --configure repeater_config_backup_20250101.yaml

After restoring, verify critical settings manually:

# Verify device role
meshtastic --get device.role

# Verify region (master legal control for band and power cap)
meshtastic --get lora.region

# Verify channel 0 PSK matches your network
meshtastic --info | grep -A 3 "channel_0"

# Verify MQTT settings
meshtastic --get mqtt

# Verify fixed position
meshtastic --get position

# Verify hop limit
meshtastic --get lora.hop_limit

Reboot the device after restoring configuration to ensure all settings take effect from a clean state:

meshtastic --reboot

Version Compatibility: What to Check Before Updating

Meshtastic nodes rebroadcast packets based on matching radio parameters even when they cannot fully decode newer packet types (managed flooding rebroadcasts on radio params, not on decode success). There is no formal version-negotiation handshake, so nodes running very different firmware versions may fail to decode some packet types from each other. Specific areas to check in release notes:

# Verify active modem preset after firmware update
meshtastic --get lora.modem_preset

Post-Update Validation Checklist

  1. Device boots and appears in Meshtastic app node list.
  2. Device role is correct. For infrastructure, use ROUTER (or ROUTER_LATE for nodes that should rebroadcast only after others). Note that ROUTER_CLIENT was deprecated in v2.3.15 and REPEATER is deprecated as of ~v2.7.11, so prefer ROUTER for new and updated deployments.
  3. LoRa region is set correctly for your location (meshtastic --get lora.region). A firmware update that resets the region to UNSET or changes a default can cause out-of-band or wrong-power transmission - the region is the master legal control for both your authorized band and your power cap, so always confirm it after updating.
  4. Channel 0 (primary) PSK matches community configuration.
  5. Fixed position is present and correct on map.
  6. MQTT uplink is publishing telemetry (check Grafana or broker).
  7. Hop limit is correct for your network.
  8. Position broadcast interval is set to a long static-node value (e.g. 43200 or 86400 seconds), not the default short interval.
  9. At least one other mesh node can receive packets from the updated repeater.

Only after this checklist passes should you remove the USB cable and close up the enclosure.

Monitoring and Maintenance

Troubleshooting a Misbehaving Repeater

Infrastructure repeaters are expected to operate unattended for months. When behaviour deviates from normal - excessive channel utilisation, duplicate node entries, relay failures, or complete silence - rapid and systematic diagnosis avoids unnecessary site visits and minimises community impact. This page catalogues the most common symptoms, their likely causes, and the remediation steps including serial console diagnostics.


Symptom 1: High Channel Utilisation Caused by This Node

Diagnosis

In the Meshtastic app or web UI, open the node list and check the channel utilisation percentage. If it is above 25% and you suspect a specific node is the primary contributor, inspect each candidate node's reported airtime/channel-utilisation telemetry, or watch the serial/debug log of the suspect node to see how often it is transmitting and rebroadcasting. (Traceroute shows the routing path/hops to a destination - it does not measure which node rebroadcasts most frequently, so it is not the right tool for isolating a chatty node.) You can also check the MQTT stream for an unusually high publication rate from one node ID.

# On the suspect node: check current telemetry broadcast interval
meshtastic --get telemetry.device_update_interval
meshtastic --get telemetry.environment_update_interval

# Check position broadcast interval
meshtastic --get position.position_broadcast_secs

Common causes and fixes

Short telemetry intervals: If device_update_interval has been shortened well below the default, a node generates a telemetry packet every interval plus the corresponding rebroadcasts. (Note: a connected client app always receives device metrics once per minute regardless of this setting - that local behaviour is separate from the over-mesh broadcast interval, whose default is 1800 seconds / 30 minutes.) Set it back to 30 minutes for infrastructure nodes:

meshtastic --set telemetry.device_update_interval 1800
meshtastic --set telemetry.environment_update_interval 1800

Short position broadcast interval: A fixed repeater broadcasting position every 5 minutes generates 288 position packets per day. Increase to 24 hours:

meshtastic --set position.position_broadcast_secs 86400

Smart broadcast enabled on a non-moving node: Smart position broadcasting transmits whenever the node moves more than a configured distance. On a fixed node, GPS jitter can cause false movement detection and trigger frequent transmissions. Disable it:

meshtastic --set position.position_broadcast_smart_enabled false

Symptom 2: Node Appearing Twice in the Node List

Diagnosis

Two entries in the node list with the same name or similar names, but different node IDs, indicates that the same physical device has been flashed or configured with two different node identities. This typically happens when:

Remediation

If two physical devices have the same node ID (the critical case - never do this): One device must be factory-reset to generate a new unique ID. Factory reset clears all configuration including channel keys - re-configure from scratch:

Warning: A factory reset erases the channel PSK and all configuration - the node will fall off your mesh and emergency channel until it is manually re-keyed, which on a remote node means a site visit. NEVER factory-reset a sole-path or remote infrastructure node without (a) a current exported config backup (meshtastic --export-config > config.yaml) and (b) physical or admin access to restore it. Do not perform this during an active incident.

meshtastic --factory-reset

If stale entries persist after a legitimate device reset: Other mesh nodes cache node entries and expire stale ones on their own over time - there is no fixed published TTL, but the entry will age out without intervention. There is no remote command to force-clear another node's cache. Note that --remove-position only unsets a device's own fixed position (latitude/longitude/altitude) - it does NOT clear the node database. To reset a node's own NodeDB requires either the dedicated NodeDB-reset command or a factory reset; clearing a node's own DB does not remove a stale entry that other nodes are caching, which simply expires on its own.

# Clears only this device's own fixed position - NOT the node database:
meshtastic --remove-position

Symptom 3: Node Offline Despite Power Being Present

Diagnosis

The node is powered (LEDs lit, no alarm on power supply) but is not appearing in the mesh and is not publishing to MQTT. This indicates a firmware hang, a radio module fault, or a configuration issue that prevents the radio from transmitting.

Step 1: Attempt remote recovery

Remote administration over --dest supports only the --set and --get commands - there is no supported remote --reboot command, so a hung node generally cannot be rebooted over the air. You can remotely read or adjust settings if the radio stack is still responding:

# Remote admin supports only --get / --set over --dest:
meshtastic --dest '!abcd1234' --get device.role

If the radio stack is functional but the application layer is hung, remote reads may still respond. If the node is fully unresponsive, you will need a physical power cycle or serial console access (below). Meshtastic has no configurable hardware-watchdog setting to enable.

Step 2: Serial console inspection

Connect via USB and open a serial terminal at 115200 baud:

screen /dev/ttyUSB0 115200
# or on macOS:
screen /dev/cu.usbserial-0001 115200
# or using meshtastic CLI:
meshtastic --port /dev/ttyUSB0 --debug

Look for these patterns in the serial output (exact log wording varies by firmware version):

Step 3: Full power cycle

Disconnect power completely (including USB) for 10 seconds. Many transient LoRa module hang states clear only with a full power cycle, not a software reset.


Symptom 4: Node Not Relaying Packets

Diagnosis

The node appears in the node list and is visible on the map, but traceroutes confirm it is not serving as a relay hop - packets that should transit through it are not being forwarded.

Check the device role

A node configured as CLIENT_MUTE does not relay packets from other nodes. A plain CLIENT node DOES relay - it rebroadcasts packets when no other node has already done so - so a CLIENT role is not, by itself, the reason a node fails to forward. Confirm the role:

meshtastic --get device.role

If the role returns CLIENT_MUTE (which suppresses rebroadcasting), change it. For a well-placed stationary infrastructure node, ROUTER is the recommended role:

meshtastic --set device.role ROUTER

Check the rebroadcast mode

meshtastic --get device.rebroadcast_mode

The rebroadcast mode is set under the device. namespace (device.rebroadcast_mode). The valid values are:

A mode of LOCAL_ONLY or KNOWN_ONLY filters foreign-mesh traffic and may explain why some transit traffic is being dropped.

Check hop count on arriving packets

If packets arrive at this node with a remaining hop count of 0, they are consumed and not forwarded - this is correct behaviour, not a fault. Verify by enabling debug output and watching the hop_limit field in received packets:

meshtastic --debug 2>&1 | grep "hop_limit"

If all arriving packets have hop_limit = 0, the originating nodes may need their lora.hop_limit increased (default 3, maximum 7). Raising the hop limit increases airtime and can worsen congestion, so do this cautiously and watch channel utilisation.

Check channel configuration

A relay forwards packets based on the unencrypted packet header (sender NodeID + packet ID), and it deduplicates using that same header - so a node can and does rebroadcast packets even when it does not hold the channel PSK. This is exactly why ALL_SKIP_DECODING can relay channels it cannot decrypt. A PSK mismatch prevents reading the message content, not relaying it. To actually exchange and read messages with the nodes you are serving, the channel 0 PSK must match:

meshtastic --info | grep -A 5 "channel_0"

Serial Console Diagnostic Reference

When physically on-site, the following serial console commands provide rapid triage:

# Full device info dump (version, channels, config, node DB)
meshtastic --info

# Export the full current configuration to a YAML backup file
meshtastic --export-config > config.yaml

# Watch live packet events (requires --debug flag)
meshtastic --debug

# Factory reset (last resort - wipes config and channel keys; back up first)
meshtastic --factory-reset

Reading the debug log for relay events

When --debug is active, relay events appear in the log. The exact wording varies by firmware version, but conceptually you will see rebroadcast events (the node forwarding a packet with a decremented hop limit) and duplicate-suppression events (the node ignoring a packet it has already heard), for example:

(illustrative, not verbatim)
Rebroadcasting packet from !abcd1234 ...
Ignoring duplicate packet from !abcd1234 (id=0x12345678)

If you see only duplicate-suppression lines and no rebroadcast lines, the node is receiving packets but treating them all as duplicates. This can happen if the duplicate detection window (stored in RAM) has stale entries from a previous session - a reboot typically clears this.

If neither message type appears for packets that other nearby nodes are hearing, the LoRa receive path is not functioning. Check antenna connection (a disconnected antenna is the single most common field repair) and SPI bus integrity.

Meshtastic Repeater Network Patterns

Meshtastic Repeater Network Patterns

Designing for Reliability: N+1 Redundancy

Designing for Reliability: N+1 Redundancy

In plain terms: make sure that no single node failure can split your network into two halves that can no longer reach each other. A mesh network is only as reliable as its weakest single point of failure. In graph theory terms, a node whose removal splits a connected graph into two or more disconnected components is called a cut vertex. Real-world Meshtastic deployments often develop cut vertices without operators realizing it - especially as networks grow organically. N+1 redundancy means ensuring that for every critical backbone node, at least one backup path exists so that the loss of any single node does not partition the network.

Important caveat: a second node at the SAME site protects only against single-device failure (firmware crash, board death). It does NOT protect against the failures most likely in an emergency - site power loss, lightning, tower collapse, fire, flooding - because both nodes share that fate. For incident-grade redundancy, the backup MUST be at a separate site on independent power.

Identifying Critical Backbone Nodes

Start by drawing your network on paper or a whiteboard. Place each node as a dot and draw lines between nodes that can hear each other directly. Now ask: if I erase this dot, does the network split into two disconnected groups? Any node where the answer is yes is a cut vertex and a single point of failure.

For larger networks, the most reliable analysis is manual: run meshtastic --traceroute between nodes on opposite sides of a suspect backbone node - if the only path routes through that one node, it is critical. Third-party visualizers such as meshmap.net can help you eyeball topology, but they only show nodes that report to the public MQTT server (a gateway is required) and are not authoritative; do not rely on them as a complete picture of your mesh.

Providing Backup Paths

Once critical nodes are identified, the fix is straightforward in concept: ensure each one has a backup. Two approaches work well in practice:

Testing Redundancy

Testing is non-negotiable. Make sure no single node failure splits your network: a backup path that exists on paper but has never been verified may fail in practice due to marginal signal, wrong node roles, or misconfigured hop limits. The test procedure is simple:

  1. Identify two nodes on opposite sides of the critical backbone node you want to test.
  2. Run a traceroute between them and record the path.
  3. Briefly power the backbone node down to simulate failure. (Power it off - do NOT simply unplug its antenna while it is transmitting; transmitting into a disconnected antenna can damage the radio.)
  4. Run the traceroute again. The path should route around the powered-down node.
  5. If routing fails, the backup path is insufficient and must be improved before the critical node is trusted.

A passing reroute test proves the backup path exists, not that it has capacity. Under incident load the backup path carries the failed node's traffic on top of its own and may saturate. Verify the backup path also has channel-utilization headroom for surge traffic, not just connectivity.

Test redundancy at least quarterly, and ALWAYS as part of pre-incident readiness checks or before any planned event you expect to rely on the network. Annual testing is insufficient for networks used in emergencies - paths degrade silently between tests, and any time the physical environment changes significantly you should retest.

Network Mapping Tools

Third-party visualizers such as meshmap.net provide a visual overlay of node positions for nodes that report to the public MQTT server, which can help you spot obvious topological bottlenecks - but they are not authoritative and will not show nodes that lack an internet gateway. The ground truth for redundancy verification is the meshtastic --traceroute <destination_id> CLI command, which reveals the actual hop-by-hop path packets take in real time.

Meshtastic Repeater Network Patterns

Planned Maintenance Procedures for Live Networks

Planned Maintenance Procedures for Live Networks

Taking a backbone node offline for maintenance - whether for firmware updates, hardware replacement, or antenna adjustments - affects the users routing through it. With proper planning, that impact can be reduced to a brief interruption rather than a prolonged outage. This page describes a repeatable maintenance procedure for Meshtastic backbone nodes in active community networks.

Pre-Maintenance Checklist

Complete these steps before any planned maintenance window:

During Maintenance

Where possible, power down gracefully rather than performing a hard power-off. A graceful shutdown lets the node stop transmitting cleanly and avoids cutting off a packet mid-transmission or corrupting the node's stored configuration during a flash or write. For solar-powered nodes, the practical approach is to disconnect the load output of the charge controller rather than physically unplugging the node in the dark.

Perform the maintenance task - firmware flash, hardware swap, antenna replacement - as quickly as practical. Every additional minute of downtime increases the chance of a user encountering a failed message delivery.

Post-Maintenance Verification

Before declaring the node returned to service, verify it from multiple directions:

  1. Send a test message from a node that previously routed through the maintained node and confirm delivery.
  2. Run traceroutes from multiple directions to confirm the node is routing normally.
  3. If you run a monitoring system (for example MQTT/Grafana or a third-party map such as meshmap.net), confirm it shows the node online AND recently active. Note that seeing a node online is necessary but NOT sufficient - a node can appear up while failing to relay (for example, wrong role or rebroadcast mode). Always also complete step 1 (a real test message routed through the node) before declaring it back in service.
  4. Update your network maintenance log with the date, work performed, and any configuration changes.

Emergency Rollback Procedure

If a replacement node does not work as expected - wrong firmware, hardware fault, or configuration error - act quickly. Restore the original node if it is still functional, or connect a known-good spare configured to match the original settings. If neither is possible, notify the community immediately that the outage is extended and provide an estimated restoration time. For any network used in emergencies, keep at least one spare node per critical site, PRE-CONFIGURED to match that site (role, channel/PSK, hop limit, fixed position). An unconfigured spare is not a substitute - configuring on-site under incident pressure wastes the very time the spare was meant to save.

After any unplanned extended outage, conduct a brief post-incident review: what failed, why, and what process change would prevent recurrence. Even a one-paragraph note in the maintenance log is valuable for future operators.

Meshtastic Repeater Network Patterns

Channel Utilization Management

Channel Utilization Management

Channel utilization (CU) is one of the most important health metrics for a Meshtastic network, yet it is frequently misunderstood or ignored until problems become severe. Understanding what CU measures, what causes it to rise, and how to bring it back down is essential knowledge for any network operator running more than a handful of nodes.

What Is Channel Utilization?

Channel utilization is the percentage of time the radio channel is occupied by transmissions, measured over a rolling 1-minute window. Meshtastic breaks the minute into six 10-second sub-windows and sums the milliseconds of airtime used in each. A CU of 10% therefore means the channel was busy for roughly 6 seconds out of the last minute (not 90 seconds out of 15 minutes). Meshtastic calculates CU locally on each node by monitoring the time its own radio is keyed up, plus time spent sensing channel activity from other nodes (via Channel Activity Detection). Note that CU counts the airtime of all LoRa traffic heard on the same modem settings, including non-Meshtastic LoRa. The reported CU figure is visible in the Meshtastic app under the node detail view and in the device telemetry metrics channel. (Do not confuse this 1-minute window with the EU 10% duty-cycle limit, which is measured over a 1-hour window.)

Healthy, Warning, and Critical Thresholds

These bands match the color coding used by the Meshtastic apps:

If you prefer a stricter operational target for infrastructure (for example, keeping a busy backbone channel below ~20-25% to preserve headroom for incident traffic), treat that as a conservative operator guideline, not the system threshold. CU is also a lagging rolling average: a channel can briefly saturate while the reported figure still looks healthy.

Common Causes of High Channel Utilization

Several factors drive CU up. Understanding which ones apply to your network guides the correct fix:

Remediation Strategies

These remediations are proactive. They must be applied before an incident. Once a channel saturates during an event, Meshtastic has no automatic congestion recovery; the only mid-incident fix is to reduce traffic (fewer senders, shorter messages, suppress telemetry), which requires discipline from every operator rather than a single config change - and reconfiguring deployed nodes mid-incident is often impossible. Provision capacity headroom in advance.