Skip to content

Artifacts view

Every firmware build uploaded to the project. A summary card sits on the project page in Advanced mode, and the full Firmware artifacts page lists all of them, filterable by version or release notes, chip family, security mode, and whether they are archived.

What the list shows

Per artifact:

  • build_number, project-scoped, monotonic, never reused
  • version_label, the human-readable string from the manifest
  • framework and chip_family
  • the signing key id, when the build was uploaded as signed

Uploads are append-only: an artifact cannot be edited or deleted, from either the dashboard or the API. To take a build out of circulation, archive it (see below).

Artifact detail

Opening a build shows the manifest exactly as it was uploaded, which is the compatibility contract the decision engine matches against and is otherwise invisible. Alongside it: the checksum, size and upload source, every deployment that has included the build, and how many devices report running it. Between this page and a device's own page you can settle why a particular device was or was not offered a particular build.

Archiving a build

Archiving is what you want when a build turns out to be bad. An archived artifact is never offered to a device and cannot be chosen for a new deployment, while the record of which devices ran it is untouched.

It is refused while any draft, active or paused deployment still references the build: cancel or complete those first. That keeps a deployment's own state the single answer to what it can reach, rather than splitting it across two places.

Archiving is reversible, and both directions are recorded in the audit log.

Upload form

The manifest is entered as ordinary form fields, not pasted JSON: pick the binary, then fill in framework, version label and chip family, plus the optional compatibility fields (board id, hardware revision range, partition profile, NVS schema version) and the security mode. The form validates before accepting the upload, so a bad combination fails with an inline error rather than a rejected API call.

CI uses the JSON manifest directly instead. See the manifest schema.

Upload the app image, not a merged/factory image

Upload the application binary: for the Arduino toolchain that is sketch.ino.bin. Do not upload the sibling build outputs the toolchain also produces:

  • sketch.ino.merged.bin (bootloader + partition table + app, ~4 MB)
  • sketch.ino.bootloader.bin, sketch.ino.partitions.bin
  • sketch.ino.elf, sketch.ino.map

An OTA update rewrites only the app partition, so a merged/factory image (which includes the bootloader and partition table and is far larger than one app partition) can never fit and the device rejects it with update_begin_failed. SimpleOTA shows an advisory warning when an upload's filename looks like one of these, but still accepts it, so double-check you selected the right file.

Upload limits

Uploads are capped per calendar month, UTC, resetting at 00:00 on the 1st: 10 on Free, 100 on Maker, 500 on Pro. Hitting the cap blocks the upload form and returns 400 from the API. See Plans and limits.