Free
Free
5 devices. No card required.
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
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.
Upload the .bin you already build, from the dashboard or the API, and choose what percentage of your boards gets it first.
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.
Free for 5 devices, no card required.
Mounted boards
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.
Free for 5 devices, no card required.
If a build is bad
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.
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.
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.
A few first
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.
The difference
| 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
Free for 5 devices, no card required.
In your sketch
#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
}
#include "simpleota.h"
void app_main(void) {
// nvs_flash_init() + your Wi-Fi bring-up first...
simpleota_config_t cfg = {
.token = "YOUR_PROJECT_TOKEN", // Project -> API tokens (device scope)
};
ESP_ERROR_CHECK(simpleota_init(&cfg));
ESP_ERROR_CHECK(simpleota_start());
}
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
Free
5 devices. No card required.
$12/mo
50 devices.
$39/mo
500 devices.
Custom
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.
Free for 5 devices, no card required.
Open source
Common questions
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.
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.
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.
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.
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.