Skip to content

AgentDeck ESP32 v1.0.7

Choose a tag to compare

@github-actions github-actions released this 22 Aug 15:04
· 51 commits to master since this release

AgentDeck ESP32 v1.0.7

Firmware was building correctly for ten boards every release and piling up
somewhere nobody could reach it. All 31 assets of esp32-v1.0.6 were downloaded
zero times, no page linked them, and the only documented way in assumed a source
checkout with PlatformIO installed. This release is the way in.

Flash from a browser — nothing to install

puritysb.github.io/AgentDeck/flash/
writes firmware to a board over USB from desktop Chrome or Edge. Pick a board,
plug it in, done — no checkout, no toolchain, no esptool.py. Safari, Firefox
and mobile browsers do not implement Web Serial; the page checks that before
rendering the flow and hands you the terminal command instead, in English,
Korean or Japanese.

Five boards are offered — 86 Box, InkDeck, TTGO T-Display, Ulanzi TC001,
T-Display-S3-Pro — each because a hardware run measured it. The other five are
listed too, disabled, with the reason on screen: a board missing from the picker
reads as "unsupported" and sends its owner to the wrong page.

agentdeck esp32 flash <board>

The same write from a terminal, with the two things a web page cannot do:

  • It frees the serial port itself. Every serial open toggles DTR/RTS and
    resets the board, so a running daemon is the commonest cause of a failed
    flash. The CLI takes a lease the daemon honours — a file, because the daemon
    that steals the port is the one that respawns underneath the write, and an
    in-process pause cannot span a respawn. The lease expires when it is read, not
    on a timer, so a flasher killed mid-write needs nothing to run to recover.

  • It asks the board to introduce itself after the write. MD5 against the
    chip proves the bytes; an image with a wrong flash-size header passes that and
    then bootloops, so the port is reopened and the firmware's own device_info
    is read back. Treat a reply as confirmation and its absence as no
    information: esptool-js's hard reset is a release with no assert
    (reset.js HardReset is sleep(100); setRTS(false)), so on an adapter that
    does not leave EN asserted after the write it is a no-op and the chip stays
    parked in the flasher stub. Measured on 86box, 2026-08-22: silent for 200s
    with exclusive port access after four separate writes, then up in 2.0s the
    moment esptool --after hard-reset pulsed EN for real — the firmware was
    correct the whole time. So the command reports "power-cycle it" rather than a
    warning, and a real per-board reset is still open work. ulanzi_tc001 skips
    the read-back entirely by name — its CH340 TX is broken in hardware.

    Corrected after this tag was cut. The hardware run that measured it happened
    once esp32-v1.0.7 was already published, so the tag-pinned changelog link
    below still shows the original wording; the corrected text lives on
    master.

serialport is an optional native dependency; without it the command says which
two things to install and points at the browser flasher.

The write is refused when the board is wrong

Both tools identify the chip before writing, and neither has an override. An S3
image on a classic ESP32, or a 16MB-header image on an 8MB part, is how these
boards get bricked — and the recovery tool for a bricked board is the tool that
refused. The size check is directional: declaring less flash than the part has
is fine, and on InkDeck it is required. An unreadable flash id stays unknown
rather than becoming detectFlashSize()'s silent "4MB", and the surface says the
check was unavailable instead of implying it passed.

ESP32 1.0.7 — one file, one offset

A release now ships agentdeck-<board>-merged.bin, written at 0x0 on every
chip, plus a manifest.json whose sizes and hashes are computed from the
artifacts. The previous asset set could not bring a board up: boot_app0.bin was
never published, so a stale otadata boots the previous slot; the bootloader
offset is chip-specific and this fleet spans three values, documented nowhere;
and an unstated flash size leaves a wrong header. A board that fails to build now
fails the release instead of shipping nothing quietly — the failure that left
three boards with no binaries at all in 1.0.1.

Firmware for every board this repository builds. Each asset is named by the
board's canonical id — the same string the firmware reports as
device_info.board and the one agentdeck esp32-ota <target> takes, so the
file you download is the target you pass.

Board Factory image Display PlatformIO env Wi-Fi OTA Browser flash
86 Box agentdeck-86box-merged.bin 4" 480x480 ST7701 box_86 yes yes
InkDeck agentdeck-inkdeck-merged.bin 7.5" 800x480 e-ink UC8179 inkdeck yes yes
IPS 10.1" agentdeck-ips_10-merged.bin 10.1" 800x1280 JD9365 ips10 yes no
IPS 3.5" agentdeck-ips_35-merged.bin 3.5" 480x320 AXS15231B ips35 yes untested
Round AMOLED agentdeck-round_amoled-merged.bin 1.8" 360x360 ST77916 amoled yes untested
T-Display-S3-Pro agentdeck-t_display_pro-merged.bin 2.33" 480x222 ST7796U t_display_pro yes yes
T-Embed CC1101 agentdeck-t_embed-merged.bin 1.9" 320x170 ST7789 t_embed yes untested
TTGO T-Display agentdeck-ttgo_t_display-merged.bin 1.14" 240x135 ST7789 ttgo yes yes*
Ulanzi TC001 agentdeck-ulanzi_tc001-merged.bin 32x8 WS2812B matrix led8x32 yes yes
Waveshare C6-LCD-1.47 agentdeck-esp32_c6_147-merged.bin 1.47" 172x320 ST7789 esp32_c6_147 no untested

Flash over USB

Each board ships a merged factory image — one file, written at one offset,
on every chip:

esptool --port PORT write-flash 0x0 agentdeck-<board>-merged.bin

The merged image already carries the bootloader, the partition table,
boot_app0 and the application, with the flash size and mode patched into its
header. That matters: the bootloader offset is chip-specific (0x1000 on ESP32,
0x2000 on ESP32-P4, 0x0 elsewhere), and writing the application alone leaves
boot_app0 pointing at whichever slot a previous OTA selected — so the board
can come up running the OLD firmware. The loose -bootloader.bin,
-partitions.bin, -boot_app0.bin and -<board>.bin files are still
published for recovery work; prefer the merged image.

manifest.json carries the same facts in machine-readable form (offsets,
sha256, per-board reset/baud settings). SHA256SUMS.txt covers every binary.

Update over Wi-Fi

agentdeck esp32-ota <board> --firmware agentdeck-<board>.bin

The board must already be provisioned and connected to the daemon over Wi-Fi.
86box and ips_10 units flashed before 2026-07-05 may still carry a
factory/NO_OTA layout and need one USB full flash first.

Flash from a browser

5 of 10 boards are hardware-verified for browser flashing
(Chrome or Edge on desktop, via Web Serial). Boards marked untested are listed
there too, disabled, with the reason — a hidden board reads as unsupported.

* TTGO T-Display: connects, but a guard is degraded — see the manifest's webFlashVerified.

Full changelog: https://github.com/puritysb/AgentDeck/blob/esp32-v1.0.7/CHANGELOG.md