AgentDeck ESP32 v1.0.7
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 owndevice_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.jsHardResetissleep(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
momentesptool --after hard-resetpulsed 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_tc001skips
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
onceesp32-v1.0.7was 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.binThe 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>.binThe 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