SimpleOTA
Arduino, PlatformIO & ESP-IDF  ·  Free for 5 devices

ESP32 OTA shouldn't need an infrastructure team.

Upload, deploy, done. From a single board to a full fleet, without building the servers yourself.

Free for 5 devices, no card required.

Open-source MIT clients on GitHub PlatformIO registry ESP-IDF Component Registry Status

Start here

How it works

  1. 1. Add the library.

    Add SimpleOTAClient to your Arduino or PlatformIO project, or the simpleota component to ESP-IDF, and it takes care of checking in, downloading and installing for you.

  2. 2. Upload your build.

    Upload the .bin you already build, from the dashboard or the API, and choose what percentage of your boards gets it first.

  3. 3. Devices update themselves.

    Only the boards in the canary cohort get the new build until you promote it. Each of those boards fetches it the next time it checks in.

Start free

Free for 5 devices, no card required.

Mounted boards

A bad update doesn't have to mean a site visit

Once a board is mounted in a ceiling, a greenhouse or a customer's home, getting a cable to it costs a day, so SimpleOTA lets the board undo a bad update by itself and lets you try every build on a few devices before the rest.

Start free

Free for 5 devices, no card required.

If a build is bad

How a bad update gets undone

Checked as it's written.

The device hashes the image while it writes it and only marks it bootable once the SHA-256 matches, so a truncated or corrupted download never gets booted.

Signed updates when enabled.

With signed mode on and your public key pinned, the device accepts only images that key signed. Without both, it relies on the hash check.

Back to the last good build.

A new build runs on trial, and the device returns to the previous one when the new build crashes or can't confirm it's healthy. By default, confirm means the first successful check-in. A hang before that confirmation is caught by the timeout or the watchdog. A hang in the bootloader is not caught.

How ESP32 OTA works

A few first

Roll out to a few, then promote

Send a build to a percentage of your boards, watch them confirm on the dashboard, and promote it to everyone when you're happy. When a device in the rollout rolls back, the deployment can pause itself and email you.

Canary rollouts and device groups are on every plan, including Free.

Staged firmware rollouts

The difference

ArduinoOTA, your own server, or SimpleOTA

Topic ArduinoOTA Your own server SimpleOTA
How it ships Updates boards on the bench over local Wi-Fi. You host the files, and you build signing, rollback, and tracking. Updates boards over the internet, with tracking, staged rollouts, and rollback.
If an update fails Keeps two OTA partitions, and it does not run a managed trial or confirm. You build the trial, the confirm, and the record of the result. Runs the new build on trial until the device confirms, and shows the result on the deployment.
Who gets the update Offers no staged rollout and keeps no history of which devices updated. You build the percentage rollout, the pause, and the outcome counts. Sends the build to a percentage of boards, lets you pause it, and shows the outcome counts.
Firmware signing Does not include a managed signing workflow. You distribute the key, and you check each image. Signed updates when enabled. With your public key pinned, the device accepts only images that key signed.

ArduinoOTA compared with managed fleet OTA

Start free

Free for 5 devices, no card required.

In your sketch

Add it in a few lines

#include <WiFi.h>
#include <SimpleOTAClient.h>

SimpleOTAClient ota("soto_proj_xxxx", SimpleOTAClient::CHIP_ESP32);

void setup() {
    Serial.begin(115200);
    WiFi.mode(WIFI_STA);
    WiFi.begin("ssid", "password");
    ota.begin();   // check every hour, auto-reboot on success
}

void loop() {
    // your application code
}

Upload

curl -X POST https://simpleota.com/api/v1/projects/${PID}/artifacts/ \
  -H "Authorization: Bearer ${TOKEN}" \
  -F "manifest=$(jq -c . manifest.json)" \
  -F "[email protected]"

Simple pricing

Pricing

Free

Free

5 devices. No card required.

Maker

$12/mo

50 devices.

Pro

$39/mo

500 devices.

When the subscription ends, your account drops to Free, and up to five of your oldest devices keep receiving updates. Each other device gets no new build, because the check tells it: Updates are disabled for this device. The clients stay MIT-licensed on GitHub.

Start free

Free for 5 devices, no card required.

Open source

Who's behind it

Common questions

Frequently asked questions

What is the difference between SimpleOTA and the ArduinoOTA library?

The ArduinoOTA.h library, which is part of the ESP32 Arduino core, updates devices over local Wi-Fi, finding them with mDNS, so it works well during development when your computer and the device share a network. SimpleOTA supports internet-based updates and adds build tracking, device groups, canary rollouts, and deployment history, which is covered in the ArduinoOTA comparison.

What is the difference between SimpleOTA and Arduino Cloud OTA?

Arduino Cloud OTA is a feature inside the broader Arduino Cloud platform. It delivers firmware over the internet via S3, but requires you to compile and upload your sketch through the Arduino Cloud editor; you cannot bring a binary built with PlatformIO, ESP-IDF, or a CI pipeline. Devices must be enrolled in Arduino Cloud as connected Things. SimpleOTA is build-system agnostic: compile with PlatformIO, ESP-IDF, Arduino IDE, or any CI system and upload the binary directly. There is no platform lock-in, no IoT variable system required, and SimpleOTA adds canary rollouts, device groups, and fleet-level version tracking that Arduino Cloud OTA does not provide.

Does SimpleOTA work with PlatformIO?

Yes. SimpleOTA is build-system agnostic. Compile your firmware with PlatformIO as you normally would, then upload the resulting .bin file via the SimpleOTA dashboard or dev API. For Arduino projects, add the SimpleOTAClient library to your platformio.ini via lib_deps = https://github.com/xanderwasserman/SimpleOTAClient-Arduino.git and the OTA polling loop is handled automatically.

Is there really a free plan? What's the catch?

Yes, free with no credit card required. The free plan supports up to 5 devices and 10 firmware uploads per month, which is plenty for personal projects and prototypes. Upgrade to a paid plan when your fleet grows.

Can I roll back to an older firmware version?

Yes. On both the Arduino and ESP-IDF clients, a new build runs on trial, and the device returns to the previous one when the new build crashes or can't confirm it's healthy. By default, confirm means the first successful check-in. A hang before that confirmation is caught by the timeout or the watchdog. A hang in the bootloader is not caught. For the fleet, re-upload the previous binary as a new artifact. It is assigned a higher build number and can be deployed like any other release. Devices that already confirmed the bad build receive the corrected release through normal deployment.

Start with one board and grow to a fleet on the same setup, free for up to 5 devices with no card required.