Files
HaloKeymind/docs/firmware_picker.md

21 KiB

Firmware picker

Each result now includes Restore your settings after flashing. Its commands follow the selected logging mode and the exact image's verified role/hardware controls. Select On, Off, or Check to view and copy the commands; Companion MQTT and GPS show their app/WebConfig steps instead. See feature switches by role for the full reference. The USB web console works with the default ASCII terminal on Full Companion and infrastructure roles.

Pick the choices in any order. Every selection narrows all the other controls to firmware combinations that were actually built in the current release set. The optional chip-family filter (ESP32, nRF52, RP2040, or STM32) can narrow the hardware list first. You can skip it: picking hardware fills it in automatically.

The picker reads public release metadata from GitHub. It does not upload device information. Hardware names, target names, and download links come directly from the published firmware assets.

Current release set

Loading release information...

For a new installation, choose the exact board and role, prefer a FULL / complete profile when it is available, and select Full install / layout migration (merged .bin). Narrower profiles remain available when their reduced transport or feature set is intentional.

Pick in any order. Use Any to clear one choice, or clear everything with the button below. The address bar updates with your choices; copy its URL to reopen or share the same selection.

Optional: chip family

Skip this if you know your board. Picking hardware selects its chip family automatically. Choose Any to clear this filter.

Any chip family - skip this filter
<div class="firmware-picker-control firmware-picker-select-control">
  <label for="firmware-picker-hardware-family">Hardware</label>
  <select id="firmware-picker-hardware-family" data-field="hardwareFamily" disabled>
    <option value="">Loading hardware...</option>
  </select>
</div>

<div class="firmware-picker-control firmware-picker-select-control" data-role="hardware-variant-control" hidden>
  <label for="firmware-picker-hardware">Hardware variant</label>
  <select id="firmware-picker-hardware" data-field="hardware" disabled>
    <option value="">Choose hardware first</option>
  </select>
</div>

<fieldset class="firmware-picker-control firmware-picker-radio-control firmware-picker-wide" data-radio-field="install" disabled>
  <legend>Install operation</legend>
  <div class="firmware-picker-radio-options" data-field="install">
    Loading install choices...
  </div>
</fieldset>

<fieldset class="firmware-picker-control firmware-picker-radio-control" data-radio-field="role" disabled>
  <legend>Firmware role</legend>
  <div class="firmware-picker-radio-options" data-field="role">
    Loading roles...
  </div>
</fieldset>

<fieldset class="firmware-picker-control firmware-picker-radio-control" data-radio-field="logging" disabled>
  <legend>Logging / MQTT</legend>
  <div class="firmware-picker-radio-options" data-field="logging">
    Loading logging choices...
  </div>
</fieldset>

<fieldset class="firmware-picker-control firmware-picker-radio-control" data-radio-field="ota" disabled>
  <legend>OTA capability</legend>
  <div class="firmware-picker-radio-options" data-field="ota">
    Loading OTA choices...
  </div>
</fieldset>

<div class="firmware-picker-control firmware-picker-select-control">
  <label for="firmware-picker-mode">Connection / bridge mode</label>
  <select id="firmware-picker-mode" data-field="mode" disabled>
    <option value="">Loading modes...</option>
  </select>
</div>

<fieldset class="firmware-picker-control firmware-picker-radio-control" data-radio-field="feature" disabled>
  <legend>Feature profile</legend>
  <div class="firmware-picker-radio-options" data-field="feature">
    Loading profiles...
  </div>
</fieldset>

<div class="firmware-picker-control firmware-picker-select-control">
  <label for="firmware-picker-variant">Firmware variant</label>
  <select id="firmware-picker-variant" data-field="variant" disabled>
    <option value="">Loading variants...</option>
  </select>
</div>

<div class="firmware-picker-form-actions firmware-picker-wide">
  <button type="reset" data-action="clear" disabled>Clear all choices</button>
  <button type="button" data-action="copy-link" disabled>Copy link to settings</button>
  <a data-role="share-link" hidden>Link to these settings</a>
  <p data-role="link-status" aria-live="polite"></p>
</div>
Loading the current firmware catalog...

Exact firmware match

No exact firmware matched

Browse all firmware releases
Advanced: search current release filenames

Use this for uncommon board suffixes or expert recovery. A filename match is not a board-identity check.

Filename contains

What the choices mean

Choice Use
Companion A phone, computer, or host application controls the radio
Repeater Standalone mesh relay
Room Server Hosts room conversations and history
Sensor / telemetry Publishes supported sensor data
Terminal Chat Standalone serial-terminal interface
USB logging / USB-connected MQTT Node remains attached to a computer over a data-capable USB cable
Wi-Fi MQTT observer Firmware connects directly to MQTT over Wi-Fi; this is not USB logging
USB logging + Wi-Fi MQTT Unified FULL image sends to both paths; avoid two publishers aimed at the same broker unless messages are deduplicated
No logging Normal standalone operation without the dedicated logging/MQTT profile
LoRa OTA repeater Repeater profile that can stage an exact matching update received over LoRa
LoRa OTA source only Full Companion serving a host-supplied update to another node without self-installing it

Connection and bridge choices depend on the selected role. Companion firmware may offer Full, combined USB + Bluetooth, Bluetooth, USB, Wi-Fi, serial, or Ethernet transports. Normal repeater firmware includes runtime-controlled RS-232 support where the board has room; use set bridge.enabled on after configuring bridge.uart and bridge.baud. The Wio-E5 remains the capacity exception and offers a separate RS-232 image. Choose Wi-Fi MQTT under Logging / MQTT; it is an output mode, not a second connection choice. Repeaters may still offer separate ESP-NOW or Ethernet bridge firmware because those paths use different compiled drivers.

An ESP-NOW bridge target keeps LoRa as its primary mesh radio. Its runtime bridge.format setting chooses the peer protocol: wrapped (the backward-compatible bridge-to-bridge default using bridge.secret) or raw (direct MeshCore ESP-NOW LR frames for Generic_ESPNOW, SenseCapIndicator-ESPNow, and other primary-ESP-NOW nodes). This is one firmware choice, not two board images. Match bridge.channel to the primary nodes' espnow.channel before selecting set bridge.format raw. For Heltec V4 specifically, companion_radio_full is still a LoRa-primary Companion; choose the existing heltec_v4_repeater_bridge_espnow firmware to make that board the LoRa/ESP-NOW gateway. Use its exact merged artifact when changing roles or partition layouts.

Share a selection

Select any combination of choices, then copy the address bar or use Copy link to settings. Opening the link restores those choices after the release catalog loads. Partial selections work too, so you can share a board and role while leaving other choices open. Clear all choices removes the picker parameters from the URL. Changes update the current browser-history entry without reloading the page or adding a Back-button entry for every click.

For example, RAK3401 repeater with internal storage preselects that board, role, OTA capability, and storage profile.

The query parameters are chipFamily, hardwareFamily, hardware, role, logging, ota, mode, feature, variant, and install. Values use the picker's internal identifiers rather than the displayed labels. The generated link also records chipAuto so automatic chip-family selection or an explicit Any choice behaves the same after reopening. Existing section anchors and unrelated query parameters are preserved.

Links use the current release catalog. If a linked choice is no longer available or conflicts with another choice, the picker identifies it and asks you to review the remaining selections. The downloadable HTML's Copy link to settings button creates a public website link that other people can open.

FULL versus standard

For a new installation, use the FULL / complete profile when it exists and the board has enough flash. FULL profiles keep the complete supported feature set and CLI. Standard profiles remain useful for boards without a FULL build, for an intentionally narrower transport, or when retaining an existing compatible partition layout.

Changing between standard and FULL ESP32 layouts requires the exact-board merged image over USB. A running application cannot safely move its own active and inactive partitions.

Current full-usb-wifi profiles use one binary for no external output, USB packet logging/USB-connected MQTT, direct WiFi MQTT, or both. The picker shows that same exact binary for each compatible logging choice; select the saved runtime mode with set logging.output off|usb|wifi|both. A FULL logging-fallback profile is listed only when no WiFi MQTT sibling exists; it appears for both the no-output and USB choices because set usb.logging off|on is persistent. On a fresh unified FULL install with no saved SSID, the setup AP and WiFi radio remain available for 30 minutes per boot, then turn off automatically until the next reboot or power cycle. An explicit administrator start webconfig remains available as an override. A saved SSID switches to the normal indefinite reconnect behavior instead.

Full Companion profiles use one binary for USB, BLE, ordinary Wi-Fi on ESP32, source-only LoRa OTA, Terminal Chat, optional USB packet logging, and any board-qualified serial or Ethernet Companion transport. Bulk builds therefore omit separate attached-transport, Terminal Chat, and USB-logging artifacts whenever the exact Full recipe exists. RAK4631 repeater and room-server Ethernet images remain separate roles. Fresh installs default to logging off. Heltec V3 and base OLED V4 Full images also contain the former direct Wi-Fi MQTT Companion capability, configured at runtime through WebConfig, so their separate companion_radio_wifi_mqtt artifacts are omitted from canonical builds as well.

When Full Companion does not fit but a matching USB Companion does, that USB artifact also supplies Terminal Chat and replaces its standalone release image. Heltec E290 and T190 now publish one Full USB + BLE + WiFi Companion; their old combined and single-transport names are explicit-build compatibility aliases. SSD1306 Full Companion builds use set display.rotation 90|180|270; 0 restores the board default, so a separate rotated release image is not recommended.

Ordinary non-OTA roles also use one artifact for normal operation and USB logging. On ESP32 1.17.1.5, run set powersaving off before set usb.logging on. Select the saved mode with set usb.logging off|on; no -logging- artifact is emitted. KISS, BLE-only Companion, and constrained LoRa OTA repeater images retain their protocol/partition contracts and do not inherit plaintext USB logging.

nRF52 Full Companion keeps the multi-role primary interface on 00; it starts as an ASCII terminal and automatically hands a complete < frame to Binary Companion. set usb.logging on reboot adds its plaintext interface 02.

Every ESP32 Full Companion instead exposes one USB TTY. Logging is off by default, so the TTY serves the ASCII/Binary Companion switcher. On 1.17.1.5, run these two text commands to enable USB logging:

set powersaving off
set usb.logging on

The second command turns that same TTY into an input-capable plaintext CLI/logging stream; framed Binary Companion is unavailable on USB while logging owns it. set usb.logging off stops the logs and leaves the TTY in the normal ASCII terminal, matching a fresh Full installation. Send +++MESHCORE-TERM-STOP, or let a Companion app send a valid framed probe, to switch from there to Binary Companion. BLE and Wi-Fi Companion remain usable while the USB TTY is logging. ESP32 Full builds use the repository's Arduino-ESP32 2.x base where the board supports it; RC32 and ESP32-C6 retain their board-required Arduino 3.x platform but still expose only one USB TTY. A second ESP32 CDC interface is not part of the release profile.

The picker includes the power-saving workaround when selecting USB or USB + WiFi logging on ESP32 1.17.1.5. WiFi/MQTT-only logging does not need it while the Repeater/Room Server bridge is running; check get mqtt.running. The workaround is not added to nRF52 directions. See logging by role for the saved settings and the original firmware's USB sleep issue.

Installation methods

File Use
-merged.bin Erase/fresh install, recovery, role migration, or partition-profile change on ESP32 over USB
Non-merged .bin Update an existing same-board, same-role, same-partition installation
.zip Native nRF52 Serial DFU update package; it is not an extra archive
.uf2 UF2 bootloader drag-and-drop install or update
.hex Erase/recovery flash with a supported wired programmer

Never send a merged ESP32 image through browser OTA or LoRa OTA. Back up the node configuration and verify every filename suffix before flashing.

LoRa OTA and OTAFIX

A LoRa OTA repeater build installs repeater firmware that can receive and stage updates. A later LoRa update still needs an exact target identity, compatible partition signature, matching radio settings, and the correct update package.

nRF52 LoRa OTA requires an OTAFIX bootloader built for the exact board. There is no universal bootloader file. Use the OTAFIX 2.4.6 for this release and select the hardware-matched HEX, Serial DFU ZIP, or bootloader-update UF2.

Hardware and variant names

Hardware families with multiple released targets get a second hardware-variant menu. It separates revisions, display type, expansion kit, radio/PA layout, pin map, and other physical differences without crowding the first menu. The firmware-variant menu separately exposes choices that still require different code or wiring, such as serial port or the legacy no_external_sensors target suffix. For RAK3401 and RAK4631, the picker labels that compact LoRa OTA option Internal storage (no external storage board). Its result details explain the omitted optional environmental/ranging sensor drivers; the reduction does not disable generic I2C or unrelated board-integrated peripherals. Other boards retain the Reduced optional environmental/ranging drivers label. Reduced RAK3401 and RAK4631 targets retain INA219/INA226/INA260/INA3221 as voltage/current entries in the optional sensor table. They are not the only I2C users: the SSD1306 OLED, supported autodiscovered RTCs, and RAK12500 GPS remain separate I2C peripherals in compatible recipes. RAK12501/L76K GPS uses Serial1 instead. The explicit RAK4631 Serial1 bridge omits the combined GPS provider because its bridge owns the RAK12501 UART, so that legacy image does not expose RAK12500 either. The firmware-configured INA3221 and RAK12500 addresses are both 0x42; to install both, keep RAK12500 at 0x42, strap INA3221 A0 to SCL for 0x43, and use a build with -DTELEM_INA3221_ADDRESS=0x43. Companion power saving, controllable FEM receive gain, and radio-chip receive gain are saved settings rather than separate recommended firmware files. Do not substitute a similarly named physical target.

The header-wired RAK19007 W25Q16 LoRa-OTA recipes are also exact hardware variants, labeled External storage board (W25Q16) in the picker. W25Q16 is the flash-memory part on the added storage board; RAK13302 identifies the radio module, not the storage board. Choose this variant for RAK4631 or for RAK3401 + RAK13302 only when that core/radio combination, the EF4015 flash wiring, and its matching OTAFIX bootloader are all present. The common base-board wiring does not make the two firmware or bootloader identities interchangeable.

The picker recommends one Full Companion image instead of separate USB, BLE, ordinary WiFi, and USB-logging images. On ESP32, logging is off by default so the one USB TTY starts in ASCII and automatically changes to framed Companion when a complete < frame arrives. Enabling logging gives that TTY to the plaintext CLI/logger and disables framed USB Companion until logging is turned off and the normal ASCII-to-binary mode switch occurs. nRF52 Full Companion retains its optional dedicated interface 02. Exact filename search still finds old aliases from earlier releases.

Maintaining the runtime directions

The online picker and downloadable HTML use the same command renderer. Hardware-specific controls are enabled only when _data/firmware_controls.json matches the selected release family and exact target. If that metadata is missing or belongs to another release, the picker retains basic role/logging directions and links the complete guide without inventing hardware support.

After qualifying a new release, resolve its PlatformIO configuration with no other PlatformIO process running, then generate the controls from that source revision and its staged manifests:

pio project config --json-output > /tmp/meshcore-picker-pio-config.json
python3 scripts/generate_picker_controls.py \
  --stage /path/to/staged-release \
  --pio-config /tmp/meshcore-picker-pio-config.json

For the downloadable version, save the release family's public GitHub release objects as a JSON array, then package the same picker UI and controls:

python3 scripts/package_firmware_picker.py \
  --releases-json /path/to/releases.json \
  --output /path/to/FIRMWARE-PICKER.html

This HTML embeds its catalog and directions, so selections work without an internet connection. Firmware downloads and the USB web console still need network access. When replacing the downloadable picker on release pages, update its entry in each page's SHA256SUMS.txt as well.

Memory-corrected 1.17.1.5 downloads

Corrected downloads retain the 1.17.1.5 release page and use source suffix aa20e927, with 1e4d1e16 for Wireless Paper Full's 350-contact follow-up. The picker accepts replacement source hashes within that exact release version. Its installation directions identify the nRF52 queue-sharing behavior, Wireless Paper Full's 350 contacts with a shared 256/128-slot queue, and the 150-contact limit on the other six affected ESP32 Full profiles. Those notices apply only to the corrected files. See the memory correction details and each replacement's .memory.json report before updating.