Skip to content

Firmware artifacts

A firmware artifact is an immutable bundle of:

  • The binary (firmware.bin): stored in object storage.
  • The manifest: declares what hardware this binary fits.
  • A SHA-256 of the binary: devices verify after download.
  • A project-scoped build number: assigned at upload time, never reused, never gap-filled.

Artifacts are immutable. Re-upload = new artifact = new build number. There is no "edit this artifact" operation.

Storage

Binaries live in object storage managed by SimpleOTA. Devices are only ever handed a pre-signed download URL with a short expiry (default 5 minutes); the binary bytes never flow through the SimpleOTA API servers.

Manifest

Required for Arduino, optional for ESP-IDF.

A minimal Arduino manifest:

{
  "framework": "arduino",
  "chip_family": "esp32",
  "board_id": "esp32dev",
  "partition_profile": "default_4mb",
  "nvs_schema_version": 1,
  "security_mode": "basic"
}

See Manifest schema for the full reference.

Where do artifacts come from?

  • CI/CD: typical. Tag a release in your firmware repo, GitHub Actions / GitLab CI builds and uploads. See GitHub Actions.
  • Dashboard upload: fine for one-offs and internal tools.
  • Developer API direct: for custom build pipelines.

Cleaning up

The dashboard's artifact view shows which artifacts are referenced by active deployments. Old artifacts can be deleted; doing so deletes the binary in object storage but keeps the audit log of which devices received which build.