Skip to main content

MeshCore Firmware Distributions

Accurate as of 13 July 2026. Firmware projects move fast. Every version number, device count and current figure below should be re-checked against the configurator and each project's releases page before you rely on it.

There are two separate questions to answer before you flash a MeshCore node, and people often confuse them.

Which distribution do you flash? That is what this page covers. Stock MeshCore is one option. Several independent projects also build MeshCore firmware, each with a different priority: lower power draw, a touch UI, betterdifferent retry behaviour, a different operating system underneath. Some are forks of the upstream code, some are ports, and two are separate applications that link MeshCore as a library. "Distribution" is our umbrella word for all of them.

Which role does the node run? Companion, Repeater, Room Server and so on. That is covered on MeshCore Firmware Variants Explained. Every distribution below ships some subset of those roles, so you pickPick a distribution first, then a role within it.

The six distributions here are the ones offered by the Mesh America Device Configurator. There are other MeshCore forks in the wild; these are the ones you can flash from our tooling.

TheyFirst: none of this is permanent

Flashing is reversible. If you do not like a distribution, flash a different one. You are not going to brick a node by changing firmware through the web flasher, and going back to stock is always available.

What you can lose is state. A node's identity keypair, its contact list and its saved radio settings live in flash storage, and some install paths wipe that storage while others preserve it. A full or "clean" install typically resets the node to a new identity, which means your contacts will see you as a new node and will have to re-add you. Assume a distribution change resets your identity unless the project says otherwise, and write down your radio settings (frequency, bandwidth, spreading factor, coding rate) before you start so you can put them back.

Start here before you flash anything: Flashing MeshCore Firmware, and for a node you cannot physically reach, Flashing MeshCore Firmware OTA.

Do they all speak the same protocolinteroperate?

ThisThat is the partquestion thateveryone mattersasks, mostso andhere theis parta peoplecareful worryanswer about.rather than a comfortable one.

All six runare built on the MeshCore protocol and all six are intended to interoperate on the same mesh. AEach project says so about itself: ZephCore repeaterdescribes itself as "aiming for full protocol compatibility" with the Arduino firmware and the mobile apps, WADAMESH says it uses "the same MeshCore protocol and phone-app companion as stock", and MCLite says it is compatible with other MeshCore devices and the official apps.

Those are the projects' own claims about themselves. We are not aware of any independent, published interoperability test across all six, and we have not run one. Treat the general claim as well-founded but not proven.

There is at least one known case where compatibility genuinely breaks, and it is not hypothetical:

    Path hash size. MeshCore's path.hash.mode setting controls how many bytes a node uses for path hashes in the adverts it sends. Upstream's own CLI documentation warns that firmware v1.13.0 and older will forwarddrop packets fromcarrying multibyte path hashes. Keymind Cascade ships path.hash.mode=2 (3-byte) as a stockfactory companiondefault, node.and AMCLite's WADAMESHREADME handsettells willyou DMto ankeep MCLiteit handset.at You0 do"for notcompatibility needwith everyonepre-v1.15 inpeers". If your local mesh still has old nodes on theit, samethis firmware.setting will make some traffic silently disappear.

    What doeselse varyvaries between distributions is settings, defaults, and how much airtime a node uses.spends. Those can affect the mesh even when theevery packetspacket themselves areis valid. The Keymind Cascade section below has a concreteworked example.

    The six at a glance

    DistributionMaintainerWhat it isRolesPick it when
    MeshCore OfficialMeshCore core teamUpstream firmwareCompanion, Repeater, Room Server, GUI, KISSYou want the reference build. ThisThe is the defaultdefault, and the right answer for most nodes.
    EasySkyMesh PowerSavingIoTThinksFork tuned for powerCompanion (BLE), Repeater, Room ServerSolar or battery repeaters where current draw is the limiting factor.
    Keymind CascademikecarperDevFork. fork,Retry retrytuning. tuningDevelopment firmwareCompanion (BLE/USB/Wi-Fi), Repeater, Room Server, Terminal Chat, SensorYou want echo-based retries orneed a role the official flasher does not prebuild. Its retry defaults can harm a busy mesh if set wrong. Read the caveats first.section.
    MCLitelaserirStandalone handheld appapp. Pre-1.0Companion onlyT-Deck or T-Watch, and you want the device usable without a phone.
    WADAMESHALLFATHER BVTouch UI front endend. BetaCompanion onlyTouchscreen hardware, and you want an on-device map and chat.
    ZephCoreliquidraverPort to Zephyr RTOSCompanion (BLE/USB/TCP), Repeater, Room Server, ObserverPower-sensitive nodes, or a board only ZephCore supports.

    Each distribution ships its own selection of roles. Some build roles the official flasher does not (Keymind Cascade builds Sensor, Terminal Chat and Companion Wi-Fi; ZephCore builds a TCP companion and an Observer). It is not a strict subset of the official set.

    MeshCore Official

    The upstream project, maintained by the MeshCore core team at github.com/meshcore-dev/MeshCore and originally, created by Scott Powell (Ripple Radios). and now maintained by the MeshCore core team. MIT licensed. This is what flasher.meshcore.io serves, and what the Mesh America configurator serves under "MeshCore Official".

    • Roles built by the official flasher: Companion (BLE), Companion (USB), Repeater, Room Server, plus GUI builds(and a GUI-with-SD variant) for screen-equipped boardsboards, and a KISS radio build. Seven role keys, exactly.
    • Hardware: roughly 59 device entries across 12 manufacturers in the current flasher catalog, covering Heltec, LilyGo, RAK, Seeed, Elecrow and others.
    • Why start here: it is the build every other project tracks. Bug reports get triaged against it, the phone apps are developed against it, and the community assumes it unless told otherwise.

    Note on Sensor firmware. The upstream repository contains a simple_sensor example application, butso the source exists. The official flasher does not build it.it: there is no Sensor role in the flasher catalog, and no sensor binaries in the upstream releases. If you want a prebuilt sensor binary you haveeither to getbuild it yourself or take one from a fork (Keymind Cascade ships them) or build it yourself.. See MeshCore Sensor Nodes for how sensor telemetry actually works.

    Note on Wi-Fi companion. Same story. Wi-Fi companion is a real, separate build, but the official flasher does not ship it, because the SSID and password are compiled in. You build it yourself or take a prebuilt binary from a fork.

    EasySkyMesh PowerSaving

    Maintained by IoTThinks at github.com/IoTThinks/EasySkyMesh, with the source changes in github.com/IoTThinks/MeshCore. The project's own description of it:description:

    PowerSaving firmware is MeshCore firmware that has been highly optimized for lower power usage. Functionally it works the same as MeshCore, and eventually many of the changes make their way into the MeshCore official firmware.

    That last clause is the importantproject's one.stated Thisintent. isWe have not aindependently permanentconfirmed divergence.which Itof isits changes have actually been merged upstream, so read it as an aim rather than a proving ground, and its power work has a track record of landing upstream.record.

    • Roles: Repeater, Companion (BLE), Room Server.
    • Hardware: around 42 device entries, bothsplit evenly between nRF52 and ESP32, including the GAT562 kits, Heltec T114 and MeshSolar, LilyGo T-Echo, and RAK boards.
    • Versioning: its own scheme, currently the PowerSaving16 series.

    About the power numbers. The headline claim on the PowerSaving15 release wasis 15titled mA"15mA for ESP32 BLE companions,Companions and no timetime-drift driftfor repeaters". Read the release's own table before you budget a solar install on repeaters.that

    Pickheadline: it for:reports aHeltec repeaterv3 at 19.6 mA, Heltec v4.3 at 24.9 mA with the front-end module on solarand 18 mA with ait marginaloff, powerXiao budget,S3 whereat every16.3 milliampmA, and Xiao C3 at 15.1 mA. Only the Xiao C3 actually lands near 15 mA. The "no time drift" fix is tagged BETA in that same release. These are the project's own measurements; we know of idleno drawindependent shortensverification. The direction is right and the winterwork runtime.is real, but size your battery off the figure for your board, not the headline.

    WeSee have a separate page on this one:also EasySkyMesh: Third-Party Power-Optimized MeshCore Fork. Note that EasySkyMesh is not available through the official MeshCore flasher.

    Keymind Cascade

    A fork of meshcore-dev/MeshCore by GitHub user mikecarper, on the keymindCascade branch. MIT licensed,licensed tracking(the copyright line is inherited from upstream, Scott Powell / rippleradios.com). Tracks upstream v1.16.x. This is the most involved of the six and the one that needs the most care, so it gets the most space.

    It is explicitly development firmware. Every GitHub release is marked pre-release, every version string containscarries -dev-, and builds are pinned to a commit hash rather than a stable tag.tag, and some releases are flagged pre-release. It moves fast. Treat it accordingly.accordingly, and do not put it on a node you cannot easily reflash.

    What "Halo/Keymind retry tuning" does

    The core idea: after a node transmits a packet, it listens for a neighbour to retransmit it. If it does not hear that echo, it assumes the packet was lost and sends it again. There are separate knobssettings for direct-routed and flood-routed packets, and three shipped presets:

    PresetDirect retriesFlood retriesIntended for
    infra41Busy backbone sites
    rooftop153Fixed rooftop nodes
    mobile1515Handhelds

    This trades airtime for reliability, and thatthe trade is real. When mikecarper proposed the feature upstream (MeshCore discussion #1625), contributor samm-git pushedobjected: back: it"This could easily flood the air in noisy areas, where peers hear you but you do notdon't hear the echo." mikecarper's answerreply was that"Yep. That's why it can be turned off.off," and he acknowledged in the same thread that the feature "will use up more airtime". Both positions are right.correct. If you putPut a mobile preset on a busy repeater and you will hurtdegrade your local mesh.mesh for everyone on it. The full settings reference is at docs/halo_keymind_settings.md on the branch, and it is a genuinely good document.branch.

    What "Cascade defaults" means

    Nothing exotic. It is a build-time profile that ships different factory defaults. EveryThese oneare of these is a normalordinary MeshCore CLIsettings, settingnot younew could set by hand on stock firmware:inventions:

    path.hash.mode=2      loop.detect=minimal    rxdelay=2
    agc.reset.interval=8  advert.interval=0      flood.advert.interval=83
    multi.acks=1          companion.manual.add=1 companion.autoadd=0

    (advert.interval=0 is also upstream's stock default, so it is not a Cascade change.) Two of thosethese will surprise you if you do not know they are set:

    • companion.autoadd=0 means your contact list does not fill itself in from adverts. You add contacts manually.by hand. New users read this as a broken radio. It is not.
    • path.hash.mode=2 uses 3-byte path hashes.hashes Upstream'sin ownthe CLI docs warn thatadverts this capsnode floodsends. propagationTwo atconsequences. 21It hopsreduces (downthe maximum path this node's adverts can record from 64 athops to 21 (the default)path andfield thatis a fixed 64 bytes, so bigger hashes means fewer of them). And, per upstream's warning, nodes runningon firmware 1.v1.13.0 or older will drop packets carrying multibyte pathhashes. hashes.Upstream also notes the setting "has no impact on what packet ID/hash size this repeater forwards", so it governs what this node emits, not what it relays. On aan all-modern mesh this is fine. On a mixed-vintage meshmesh, itcheck isbefore somethingyou to check.deploy.

    Roles, builds and gotchas

    • Roles: Companion (BLE), Companion (USB), Companion (Wi-Fi), Repeater, Room Server, Terminal Chat, Sensor. Seven, against the official flasher's smaller set. Terminal Chat, Sensor and Companion Wi-Fi are not Keymind inventions;inventions. theyThey are upstream MeshCore examplebuild applicationstargets that the official flasher does not build.prebuild for you. Keymind's contribution is shipping them as prebuiltready binaries, which is a realgenuine convenience.
    • Hardware: the widest catalog of the six, roughly 84 devices across 23 manufacturers.
    • Two builds: a standard onestandard, and a Logging one.build The Logging buildthat adds diagnostic logging andplus the MQTT observer builds.binaries.
    • Gotcha: the Logging catalog containslists no BLE companion buildsbuilds, at all. Ifso you wantcannot select one from the configurator, even though the Logging release does contain BLE and logging together, this catalog cannot give it to you.binaries. The repo does not say whether that gap is deliberate.
    • Gotcha: as of writing, the catalogs the configurator serves are pinned a couple of point releases behind the fork's newest builds.

    Unverified:Not documented anywhere: the repository does not state anywhere what "Halo", "Keymind" orand "Cascade" actually refer to,to. The repository does not say and there is no third-party coverage of this fork. We are not going to guess. Wire compatibility with stock MeshCore 1.14 and newer is a reasonable inference (it is the same codebase, the retry logic is local transmit behaviour, and the Cascade settings all exist upstream), but no primary source states it outright.

    MCLite

    Maintained by GitHub user laserir at github.com/laserir/MCLite. MIT licensed. This one is notNot a fork: it is a separate application that pulls MeshCore in as a library and puts its own interface on top. Pre-1.0, currently the 0.4.x series, and described by its own author as experimental software, not a certified radio product.

    The point of MCLite is a radio that works on its own. No phone, no pairing, no account. Turn it on and message people.

    • Role: companion only. It is not a repeater, room server or sensor. It talks to those.
    Hardware: two boards only.boards. LilyGo T-Deck Plus and LilyGo T-Watch Ultra. An SD card is required. Configuration: a single config.json on the SD card, built with an offline HTML config tool. Fleet Mode generates a folder and keypair per device, so one person can configure a whole group and hand out cards. Boot with a blank card and it generates its own identity and a usable default config. Features stock does not have:ship: SOS broadcast, low-battery alerts to contacts, MGRS location format, offline map tiles from SD, quick replies, night-vision themes. Contacts are curated, not automatic. Overheard nodes land in a Heard Adverts list and you promote the ones you want. The project is explicit that this differs from the stock apps. A sparse contact list on a fresh device is expected behaviour, not weak reception.

    Compatibility:Compatibility, with the caveat. fullyMCLite says it is compatible with other MeshCore devices and with the official iOS and Android apps.apps, Itand alsoit actsworks as a normal companion radio over BLE, Wi-Fi or USB.USB (one

    transport, one client at a time). But "fully compatible" overstates it, and the project's own documentation shows why:

      The limitation you need to know about. Messages you type on the device do not show upappear in the companion phone app. Sending works fine over the mesh;mesh. theThe message justsimply never appearsshows up in the app's history. This is a limit of the MeshCore companion protocol, whichwhose frame set has no frametype for an outgoing message composed on the firmware side. MCLite cannot fix it. If you want a complete, correctly-sided history in the app, compose from the app.

      Pre-1.

      Keep path_hash_mode at 0 andif describedyour bymesh itshas ownpre-v1.15 authornodes ason experimentalit. software, not a certified radio product. Current release is the 0.4.x series.

      WADAMESH

      Maintained by ALLFATHER BV (Belgium) at github.com/ALLFATHER-BV/wadamesh, with a project site at wadamesh.com. GPL-3.0-or-later. Like MCLite it is an application rather than a fork: an LVGL touch interface built against an MIT-licensed MeshCore fork the same orgorganisation maintains.

      Its own summary: a full touch-screen interface for MeshCore, with the same protocol and the same phone-app companion as stock, just a richer front end on the device.

      • Hardware:Role: companion only, with an on-device UI.
      Hardware, through the Mesh America configurator,configurator: Heltec V4 with the touch expansion kit, and LilyGo T-Deck. The project's own flasher additionallycovers listsmore: ThinkNode M9,M9 and RAK WisMesh Tap V2 are beta-channel only, and Tanmatsu,the thoughTanmatsu thoseis sitnot onUSB-flashed itsat betaall channel.(it installs from the Tanmatsu app store). What you get: on-device chat with delivery receipts, contacts with route trace and telemetry, a pannable OpenStreetMap view with offline tile packs and contact positions plotted on it, and full radio settings without a phone. Companion at the same time: itthe isproject a standalone touch device and a companion radio simultaneously, andstates it will takeserves BLE, Wi-Fi and USB connections atsimultaneously once.while still working as a standalone touch device. Languages: the beta_40 release notes claim 11 non-English translationstranslations. asThe project website says "11 languages" and lists only 10 non-English ones. The two sources disagree; the release notes are the newer of the current stable.two.

      Everything is beta. There is no 1.0;0. releasesReleases are numbered beta_NN. andbeta_40 was the current stable at the time of writing, with beta_41 through beta_44 already out as pre-releases on the test channel moves quickly. The current stable is beta_40.channel.

      The Heltec V4 is the constrained board. It has 2 MB of PSRAM and no SD card slot, and several features are reduced or absent on it.it as a result. If you have the choice, the T-Deck is the better WADAMESH target.

      ZephCore

      Maintained by GitHub user liquidraver at github.com/liquidraver/ZephCore. MIT licensed. This is theThe most architecturally different of the six: a port of MeshCore from Arduino to the Zephyr RTOS (a real-time operating system), aiming at full protocol compatibility with the Arduino firmware and the MeshCore mobile apps.

      The reason that matters is power. The Arduino build runs a cooperative loop() and the CPU busy-waits unless something explicitly sleeps it. ZephCore is event driven, so the CPU sits in a wait-for-interrupt stateidles between events.events instead of spinning. On top of that:

      • LoRa RXreceive duty cycling. CAD-basedThe receiveradio windowingsleeps takesbetween short listening windows instead of receiving continuously. The project reports this cutting LoRa receive current from roughly 10 to 15 mA down to roughly 3 to 5 mA. OnThat is the project's own figure, with no stated method, and we know of no independent measurement. It is off by defaultdefault. forYou SX1262turn companionit andon repeaterper builds.node Notat enabledruntime forwith set rxduty on. It is not available on LR1110 (a mid-preamble lock issue) or SX127x.SX127x radios. If you are choosing ZephCore for battery life, this is the switch you came for, and it is not thrown for you.
      • Adaptive contention window. Stock MeshCore has three static delay settings (txdelay, rxdelay, direct.txdelay) that apply the same retransmit jitter noregardless matter what theof local conditions are.conditions. ZephCore replaces them with a system that measures actual contention: it counts how many neighbours retransmit the same flood packet it just sent, and sizes its delay from that. Near-zero delay in a quiet linear chain, more in a dense cluster. ThisThe project states this is local behaviour with no wirechanges changes,to what goes over the air, so it works alongside Arduino repeaters.
      • Adaptive Power Control. Compiled in, off by default. TurnEnable it on per node and it dropsreduces TXtransmit power when echo SNRsignal-to-noise shows excess margin.
      • Roles: Companion (BLE, USB and TCP), Repeater, Room Server, and an ESP32-only Observer role that publishes received packets to MQTT over Wi-Fi. The Mesh America configurator currently serves the companion and repeater builds.
      • Hardware: around 31 device entries,entries andin the listcatalog. includesThe README additionally lists boards you can build for yourself but which are not in the othercatalog, distributions do not reach, such asincluding the nRF54L15 and the EFR32MG24. Do not go looking for those in the configurator.
      • Worth knowing: the README statesdiscloses, plainlyin its own words, that the project is almost"99,9% entirelyclaude AI-assistedand code,cursor leaningbacked" and relies heavily on the official MeshCore repository. That is the maintainer's own disclosure,note, not our characterisation. Judge it on the sameway termsyou aswould judge any other firmware: read the code, test before you deploy.

      How to choose

      Ordinary advice, in order:

      1. Default to MeshCore Official. If nothing below applies to you,applies, flash the official build and stop reading. If your board has a screen, the official GUI build is included.
      2. Solar or battery repeater withon a tight power budget? Look at EasySkyMesh PowerSaving or ZephCore. Both attack idle draw, from different angles. Size your battery off the figure for your specific board, not the headline. If you use ZephCore, remember to actually turn on rxduty.
      3. T-Deck, T-Watch or aanother touchscreen board, and you want it usable without a phone? MCLite for the keyboard-and-keyboard and SOS, field-deployment angle. WADAMESH for the map-and-map and touch-UI angle. Both are companion-only and both are pre-1.0.
      4. Your board is not on the official flasher? Check the Keymind Cascade and ZephCore catalogs. Between them they cover a lot of hardware upstream does not build for.
      5. You want a Sensor orSensor, Terminal Chat or Wi-Fi companion binary without setting up a build environment? Keymind Cascade prebuilds them. Remember it is development firmware, and read its retry section before putting it on anything that repeats.

      Whatever you pick, the node still has to be on the right frequency, bandwidth, spreading factor and coding rate for your region and your local mesh. Firmware choice does not change that, and gettinga itmismatch wronghere is stilla the mostvery common reason a new node hears nothing.nothing at all. Get those four values from your local mesh community before you go looking for firmware bugs.

      A note on maintenance

      FiveThese are community projects of varying size. Upstream MeshCore has a large contributor base; ZephCore and WADAMESH have several contributors each; MCLite and EasySkyMesh are very small teams. Several of these six are single-maintainer projects. Severaldistributions are explicitly beta or pre-release.

      That is not a reason to avoid them,them. but itIt is a reason to keep a stock build handy, to know how to reflash a node you cannot reacheasily easily,reach, and to think twicehard before putting experimental firmware on a repeater at the top of a tower. See Flashing MeshCore Firmware OTA before you deploy anything you cannot get back to.


      Sources: the Mesh America Device Configurator provider catalogs (apps.meshamerica.com); the official MeshCore flasher catalog (flasher.meshcore.io); MeshCore discussion #1625; and the repositories, release notes and documentation of each project: github.com/meshcore-dev/MeshCore, github.com/IoTThinks/EasySkyMesh, github.com/mikecarper/MeshCore (branch keymindCascade), github.com/laserir/MCLite, github.com/ALLFATHER-BV/wadamesh, github.com/liquidraver/ZephCore.

      FirmwareWhere projectsa movefigure fast.comes Devicefrom counts,a versionproject's numbersown testing and rolehas availabilitynot werebeen accurateindependently whenverified, this page wassays written and should be checked against the configurator and each project's releases page before you rely on them.so.