Changelog

# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [0.2.0] - 2026-09-03

### Added

- Download progress reporting, available two ways: `ota_api_config_t::progress_cb`
  (with `progress_interval_ms` rate limiting and `user_ctx`) and `OTA_API_EVENT`
  events posted to the default event loop (`STARTED`, `IMAGE_DESC`, `PROGRESS`,
  `SUCCEEDED`, `FAILED`).
- `ota_api_config_t::validate_cb`: inspect the incoming image's `esp_app_desc_t`
  after its header is read and before anything is written, to refuse a version
  that is already installed.
- `ota_api_abort()` and `ota_api_is_running()`: cooperatively cancel an update
  in flight, leaving the running firmware untouched.
- `ota_api_config_t::partial_download` and `max_http_request_size`: fetch the
  image over several ranged HTTP requests, which survives links that drop long
  transfers. Requires `CONFIG_ESP_HTTPS_OTA_ENABLE_PARTIAL_DOWNLOAD`.
- `advanced` example: the full lifecycle under console control — live progress
  bar with rate and ETA, `abort`, version check, ranged download, and a trial
  run confirmed with `confirm` or reverted with `rollback`, plus automatic
  rollback when nobody confirms in time.
- `rollback` example: self-test of a newly booted image with
  `esp_ota_mark_app_valid_cancel_rollback()` and automatic rollback when the
  diagnostic fails, using the blocking `ota_api_update()`.
- `on_demand` example: update triggered by an `ota [url]` console command, with
  the reboot performed by the application after its own cleanup.
- `examples/common` with the HTTPS server, certificates and firmware images
  shared by all examples.
- `examples/common/ota_server.py` now generates its own self-signed certificate
  (with the server IP in `subjectAltName`) using the `cryptography` package, so
  no `openssl` binary is needed on Windows or Linux.

### Changed

- `ota_api_update()` now drives `esp_https_ota_begin`/`perform`/`finish` instead
  of the one-shot `esp_https_ota()`, which is what makes progress, validation
  and aborting possible. Existing callers are unaffected: the new fields default
  to off.
- `ota_api_update()` rejects a second concurrent update with
  `ESP_ERR_INVALID_STATE`.
- The component now publicly requires `esp_event` and `esp_app_format`.
- `examples/basic` reads its server certificate from `examples/common/certs/`.

### Fixed

- `examples/basic` was shipped to the Component Registry without the
  certificate it embeds at build time, so `create-project-from-example` produced
  a project that did not compile.
- The format CI job could never pass: `ubuntu-latest` installs clang-format 18,
  which cannot parse `AlignEscapedNewlines: LeftWithLastLine` in `.clang-format`
  and therefore rejected every file. The version is now pinned via pip.

## [0.1.0] - 2026-07-14

### Added

- Initial release, extracted from the ESP-IDF `simple_ota_example`.
- `ota_api_update()`: blocking HTTPS OTA update via `esp_https_ota`.
- `ota_api_start_task()`: background OTA task that reboots on success.
- `ota_api_config_t`: URL, custom PEM certificate or trusted root bundle,
  CN check skip, network interface binding, task stack/priority.
- `basic` example with Wi-Fi/Ethernet connection and embedded server certificate.