AsyncElegantOTA¶
VENDORED · ACCESS POINT · UPLOAD PAGE · NO UPSTREAM
The upload page through which an ESP32 node receives new firmware comes from AsyncElegantOTA. That library is not in the registry but sits as a copy inside the MeshCore repo, and therefore has no version range and no update path.
[!NOTE] Source. This page was verified against the firmware itself:
MeshCorev1.16.0, commit03b6ef4, 28 July 2026 — filesplatformio.ini,arch/esp32/AsyncElegantOTA/library.propertiesandsrc/helpers/ESP32Board.cpp.
What it does¶
AsyncElegantOTA puts an upload page on top of an asynchronous web server. You open it in a browser, pick a firmware file, and the library writes that to the OTA partition and restarts the board. The built-in page has a progress bar and an error message if the file does not fit.
The library.properties in arch/esp32/AsyncElegantOTA/ names version 2.2.8
and Ayush Sharma as author, with
https://github.com/ayushsharma82/AsyncElegantOTA as its origin.
How MeshCore pulls it in¶
platformio.ini r.70
file://arch/esp32/AsyncElegantOTA
A local path in the [esp32_ota] section. The consequence is that there is no
version range and that PlatformIO never fetches anything: the code in
arch/esp32/AsyncElegantOTA/ is the code you get. A newer upstream version
only lands here if someone updates the directory.
How MeshCore uses it¶
The library is included in the same block as the web server:
src/helpers/ESP32Board.cpp r.9
#include <AsyncElegantOTA.h>
The OTA session opens with an access point and by blocking sleep:
src/helpers/ESP32Board.cpp r.13-18
bool ESP32Board::startOTAUpdate(const char* id, char reply[]) {
inhibit_sleep = true; // prevent sleep during OTA
WiFi.softAP("MeshCore-OTA", NULL);
sprintf(reply, "Started: http://%s/update", WiFi.softAPIP().toString().c_str());
MESH_DEBUG_PRINTLN("startOTAUpdate: %s", reply);
After that the web server is created, AsyncElegantOTA is given the node's ID and it attaches itself to that server:
src/helpers/ESP32Board.cpp r.34-36
AsyncElegantOTA.setID(id_buf);
AsyncElegantOTA.begin(server); // Start ElegantOTA
server->begin();
What it means for a node¶
The full route as a user sees it: an OTA session is started on the node, after
which the node broadcasts an open WiFi network called MeshCore-OTA. The node
replies with the address of the upload page, in the form http://<ip>/update.
Whoever joins that network and opens that page can upload a firmware file;
afterwards the board restarts with the new firmware.
The access point has no password — WiFi.softAP("MeshCore-OTA", NULL). What
protects the session is that it can only be started by someone who knows the
node's admin password, and that it does not stay running. For as long as it
does run, anyone within radio range of the access point can reach it.
Sources¶
Translated from Dutch by Anthropic Claude