ayushsharma82/ElegantOTA

The original over-the-air update library for wireless microcontrollers (since 2019).

C++

1,015

271 commits

updated Sep 5, 2026

See the code

README

ElegantOTA Banner

Latest release   Build status   Last commit   License

The original over-the-air update library for wireless microcontrollers (since 2019).

ElegantOTA gives your microcontroller a polished web portal for over-the-air firmware and filesystem updates. Point a browser at /update, drop in a .bin, and watch it land - with live progress, transfer rate, and a capacity check that catches an oversized image before a single byte is written.

No HTML, no CSS, no JavaScript. Three lines of code.

ElegantOTA in action

Features

  • 🔥 Quick & simple OTA procedure - firmware and filesystem images
  • 📊 Live progress, transfer rate, and byte counts as the flash is written
  • 🛟 Capacity check up front, so an oversized build is rejected before it half-writes
  • 🔒 MD5 integrity verification and optional HTTP Basic auth
  • 🌗 Light & dark portal themes, keyboard reachable, readable down to 320px
  • 🎷 No need to learn HTML/CSS/JS
  • 🛫 Ready to use within 3 lines of code

Supported MCUs

PlatformNotes
ESP32Including S2, S3, C3 and C6 variants
RP2040 (+WiFi)e.g. Raspberry Pi Pico W - requires a LittleFS partition
RP2350 (+WiFi)e.g. Raspberry Pi Pico 2 W - requires a LittleFS partition
ESP8266Legacy - maintained, but new projects should prefer ESP32 or RP2350

[!IMPORTANT] RP2040 / RP2350 users: these boards stage the incoming image inside the filesystem region, so a LittleFS partition is mandatory. In the Arduino IDE, pick Tools > Flash Size > 2MB (Sketch 1MB, FS 1MB) or similar. A bare RP2040/RP2350 without a WiFi chip cannot run ElegantOTA.


Installation

Arduino IDE

Sketch > Include Library > Manage Libraries… → search for ElegantOTA → Install.

PlatformIO

lib_deps =
  ayushsharma82/ElegantOTA@^4.0.0

; ElegantOTA supports several architectures, and PlatformIO will otherwise try
; to resolve dependencies for all of them. Without this you will hit build errors.
lib_compat_mode = strict

If you already have a .pio/libdeps folder, delete it before rebuilding.


Quick start

The whole integration is three lines - an include, a begin(), and a loop():

#include <WiFi.h>
#include <WebServer.h>
#include <ElegantOTA.h>          // 1

WebServer server(80);

void setup() {
  WiFi.mode(WIFI_STA);
  WiFi.begin("ssid", "password");
  while (WiFi.status() != WL_CONNECTED) delay(500);

  server.on("/", []() {
    server.send(200, "text/plain", "Hi! This is ElegantOTA Demo.");
  });

  ElegantOTA.begin(&server);     // 2
  server.begin();
}

void loop() {
  server.handleClient();
  ElegantOTA.loop();             // 3
}

Open http://<device-ip>/update in a browser and you have the portal.

Full sketches live in examples/ - Demo for the synchronous webserver, AsyncDemo for ESPAsyncWebServer.

Async mode

ElegantOTA can serve its routes through ESPAsyncWebServer instead of the built-in synchronous server. Enable it with a build flag:

build_flags = -D ELEGANTOTA_USE_ASYNC_WEBSERVER=1

The Arduino IDE has no way to set build flags, so there you edit ELEGANTOTA_USE_ASYNC_WEBSERVER in src/ElegantOTA.h directly. You cannot run the synchronous WebServer and ESPAsyncWebServer in the same firmware - pick one. See the async mode guide for the per-platform TCP dependencies.


Documentation

Installation, integration, security and feature guides: docs.elegantota.pro


Looking for more? Upgrade to Pro.

ElegantOTA Lite covers a solid project end to end. ElegantOTA Pro adds the pieces a shipped product tends to need:

  • Two extra OTA modes - Direct Download (the device fetches firmware from a URL itself) and Auto Update (update channels)
  • Toggle OTA modes at runtime
  • Hardware ID & firmware version on the UI
  • Whitelabel / branding
  • Commercial license

It is also a fantastic way to support the time that goes into building and maintaining the library.

ElegantOTA Pro

Available at the official store (store.softt.io).


Contributing

Every contribution is highly appreciated. Spotted a bug? Open an issue or a pull request so it can be fixed for everyone.

Feature requests: open an issue and I'll look at adding it in a future release.

Contributors are asked to sign the CLA, and participation is governed by the Code of Conduct.


License

ElegantOTA open-source edition is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).

If you are planning to use ElegantOTA in a commercial project, please consider purchasing ElegantOTA Pro, which comes with the less restrictive SOFTT Commercial License 1.3.

air
arduino
elegantota
esp32
esp8266
espressif
firmware
fs
ota
over
pico
raspberrypi
spiffs
the
update

ayushsharma82/ElegantOTA

The original over-the-air update library for wireless microcontrollers (since 2019).

C++

1,015

271 commits

updated Sep 5, 2026

See the code

README

ElegantOTA Banner

Latest release   Build status   Last commit   License

The original over-the-air update library for wireless microcontrollers (since 2019).

ElegantOTA gives your microcontroller a polished web portal for over-the-air firmware and filesystem updates. Point a browser at /update, drop in a .bin, and watch it land - with live progress, transfer rate, and a capacity check that catches an oversized image before a single byte is written.

No HTML, no CSS, no JavaScript. Three lines of code.

ElegantOTA in action

Features

  • 🔥 Quick & simple OTA procedure - firmware and filesystem images
  • 📊 Live progress, transfer rate, and byte counts as the flash is written
  • 🛟 Capacity check up front, so an oversized build is rejected before it half-writes
  • 🔒 MD5 integrity verification and optional HTTP Basic auth
  • 🌗 Light & dark portal themes, keyboard reachable, readable down to 320px
  • 🎷 No need to learn HTML/CSS/JS
  • 🛫 Ready to use within 3 lines of code

Supported MCUs

PlatformNotes
ESP32Including S2, S3, C3 and C6 variants
RP2040 (+WiFi)e.g. Raspberry Pi Pico W - requires a LittleFS partition
RP2350 (+WiFi)e.g. Raspberry Pi Pico 2 W - requires a LittleFS partition
ESP8266Legacy - maintained, but new projects should prefer ESP32 or RP2350

[!IMPORTANT] RP2040 / RP2350 users: these boards stage the incoming image inside the filesystem region, so a LittleFS partition is mandatory. In the Arduino IDE, pick Tools > Flash Size > 2MB (Sketch 1MB, FS 1MB) or similar. A bare RP2040/RP2350 without a WiFi chip cannot run ElegantOTA.


Installation

Arduino IDE

Sketch > Include Library > Manage Libraries… → search for ElegantOTA → Install.

PlatformIO

lib_deps =
  ayushsharma82/ElegantOTA@^4.0.0

; ElegantOTA supports several architectures, and PlatformIO will otherwise try
; to resolve dependencies for all of them. Without this you will hit build errors.
lib_compat_mode = strict

If you already have a .pio/libdeps folder, delete it before rebuilding.


Quick start

The whole integration is three lines - an include, a begin(), and a loop():

#include <WiFi.h>
#include <WebServer.h>
#include <ElegantOTA.h>          // 1

WebServer server(80);

void setup() {
  WiFi.mode(WIFI_STA);
  WiFi.begin("ssid", "password");
  while (WiFi.status() != WL_CONNECTED) delay(500);

  server.on("/", []() {
    server.send(200, "text/plain", "Hi! This is ElegantOTA Demo.");
  });

  ElegantOTA.begin(&server);     // 2
  server.begin();
}

void loop() {
  server.handleClient();
  ElegantOTA.loop();             // 3
}

Open http://<device-ip>/update in a browser and you have the portal.

Full sketches live in examples/ - Demo for the synchronous webserver, AsyncDemo for ESPAsyncWebServer.

Async mode

ElegantOTA can serve its routes through ESPAsyncWebServer instead of the built-in synchronous server. Enable it with a build flag:

build_flags = -D ELEGANTOTA_USE_ASYNC_WEBSERVER=1

The Arduino IDE has no way to set build flags, so there you edit ELEGANTOTA_USE_ASYNC_WEBSERVER in src/ElegantOTA.h directly. You cannot run the synchronous WebServer and ESPAsyncWebServer in the same firmware - pick one. See the async mode guide for the per-platform TCP dependencies.


Documentation

Installation, integration, security and feature guides: docs.elegantota.pro


Looking for more? Upgrade to Pro.

ElegantOTA Lite covers a solid project end to end. ElegantOTA Pro adds the pieces a shipped product tends to need:

  • Two extra OTA modes - Direct Download (the device fetches firmware from a URL itself) and Auto Update (update channels)
  • Toggle OTA modes at runtime
  • Hardware ID & firmware version on the UI
  • Whitelabel / branding
  • Commercial license

It is also a fantastic way to support the time that goes into building and maintaining the library.

ElegantOTA Pro

Available at the official store (store.softt.io).


Contributing

Every contribution is highly appreciated. Spotted a bug? Open an issue or a pull request so it can be fixed for everyone.

Feature requests: open an issue and I'll look at adding it in a future release.

Contributors are asked to sign the CLA, and participation is governed by the Code of Conduct.


License

ElegantOTA open-source edition is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).

If you are planning to use ElegantOTA in a commercial project, please consider purchasing ElegantOTA Pro, which comes with the less restrictive SOFTT Commercial License 1.3.

air
arduino
elegantota
esp32
esp8266
espressif
firmware
fs
ota
over
pico
raspberrypi
spiffs
the
update

Significant stargazers

Joe Block

1,337 followers · starred Feb 2024

Ciaran O'Reilly

96 followers · starred Oct 2024

imoonkey

18 followers · starred Mar 2024

Adrien Bourdeaux

7 followers · starred Mar 2024