Wendy Lite does not have a network-accessible container registry or an OTA pull mechanism. App deployment is a firmware rebuild: the WASM binary is baked into the firmware image as
Wendy Lite does not have a network-accessible container registry or an OTA pull mechanism. App deployment is a firmware rebuild: the WASM binary is baked into the firmware image as a C array and flashed to the device. This page covers the full flow from build to running code, and the CLI commands involved.
idf.py set-target esp32c6 # first time onlyidf.py buildidf.py flash
The idf.py build step picks up the updated main/demo_wasm.h and links the WASM binary into the firmware. idf.py flash writes the merged binary over USB.
Preview targets: If you are targeting a chip that is in ESP-IDF preview (e.g. esp32s31), prepend --preview to every idf.py invocation:
The simplest update path is to re-run idf.py flash with the device connected via USB. No WiFi required; no agent required.
Boards without auto-reset: some ESP32 devkits do not wire DTR/RTS to the chip's BOOT/RESET pins. On these boards, idf.py flash will fail with "No serial data received" unless you manually enter bootloader mode first: hold the BOOT button, press and release RESET, then release BOOT. The ESP32-S31-Korvo-1 is one such board.
Once a Wendy Lite device is connected to WiFi, the wendy CLI can interact with it over LAN using the standard gRPC transport. This works the same as for WendyOS devices — see connectivity and device selection for the full picture.
# Discover nearby devices (mDNS + BLE)wendy discover# Push a new firmware and flash remotelywendy device update --binary ./build/wendy_mcu_esp32c6.bin
The wendy device update command streams the binary to the running agent over gRPC and triggers the replacement. For Wendy Lite devices, this flashes the merged firmware image rather than replacing an agent binary.
Every push to main triggers a matrix build for esp32c5 and esp32c6 in CI (see build.yml). Builds produce a merged binary (wendy_mcu_<target>.bin) that can be flashed directly.
Nightly builds are published as a pre-release GitHub release (nightly) containing both targets. The tag is recreated on every main push.
Tagged releases (e.g. v1.2.0) attach both binaries to a stable GitHub release.
The CLI's wendy device update --nightly flag targets nightly pre-releases; omitting it targets the latest stable release.
The firmware loads the embedded WASM binary from the C array, instantiates it with WAMR, and calls the WASM entry point (_start or, for Swift apps, the WendyLiteApp.main() entrypoint synthesised by the SDK). There is no install/uninstall step — swapping the app is always a full firmware rebuild.
Multiple WASM apps in a single firmware build are not currently supported. One binary per flash.
Today (shipped): Wendy Lite provisioning is done by manually editing a JSON file into the C source tree before flashing. The fields cover device identity, the cloud endpoint, and the certificate material. There is no on-device key generation; the certificate is baked into the firmware image.
Planned (not yet shipped, WDY-1245): an automated provisioning system that:
Generates a private key and a certificate signing request on the device itself rather than burning a pre-generated certificate into the firmware.
Adds an explicit protocol property to the provisioning JSON (e.g. grpc, mtls) so the transport choice is recorded rather than inferred from port numbers. WendyOS today supports port overriding, and the standard default ports are widely understood, so this field is informational rather than required for connection routing — until the unified TCP socket protocol (WDY-1246) lands, at which point the field becomes the canonical transport selector.
Uses mDNS for device discovery, consistent with the rest of the WendyOS networking stack.
Until those changes ship, the manual JSON-edit + flash workflow above remains the only supported provisioning path.