Platform feature
Over-the-air firmware updates that don't break in the field
Signed firmware, automatic rollback, staged rollouts. Triggered from a GitHub release tag.
ESP32 OTA updatesecure OTA IoTfirmware deployment IoT
How it works
OTA is the highest-leverage feature in any IoT stack. And the easiest one to get wrong. A bad update bricks your fleet. SCADABLE OTA is built around three rules. Never ship unsigned firmware, never deploy to 100% at once, always have a rollback path.
Tag a GitHub release, choose a rollout shape, and SCADABLE pushes signed firmware to the fleet. Staged, monitored, and reversible.
What you get
- Signed firmware against your organization key on every release
- Staged rollouts. 1%, then 10%, then 100%. Paced by your rules
- Automatic rollback if crash rate exceeds the baseline within 24 hours
- Per-device gating: pin specific units to a firmware version for QA
- Triggered from a GitHub release tag. Same workflow as the rest of SCADABLE
Trigger from a release tag
toml
# .scadable/config.toml — picked up by service-builder when you push a release tag.
[ota]
# What triggers an OTA build + fanout. Defaults to release tags matching v*.
trigger = "release"
tag_pattern = "v*"
# Stage the rollout. Each step waits the given duration before promoting.
# Set rollout = "atomic" for instant 100% if you want it.
rollout = [
{ percent = 1, wait = "2h" },
{ percent = 10, wait = "6h" },
{ percent = 100 },
]
# Auto-rollback if crash rate spikes during the window after a stage promotes.
rollback_crash_rate_above = "1.5x_baseline"
rollback_window = "24h"
# Diagnostics gate. Any failing diagnostic on a device blocks OTA on that device.
gate_on_diagnostics = trueBuilt on the rest of the stack
OTA reuses the per-device certificates for signature verification, rides the same MQTT channel for delivery, and writes its progress into the logging dashboard. One library, one console, one identity per device. OTA is the lifecycle piece that ties it together.
Bring your fleet onto SCADABLE.
Connect a repo, leave with a fleet you can manage from your codebase.