Skip to content

AgentDeck ESP32 v2.1.0

Choose a tag to compare

@github-actions github-actions released this 05 Nov 22:08
· 42 commits to master since this release
285a57d

AgentDeck ESP32 v2.1.0

2.1 highlights

Dictation reaches Claude Code in any terminal. A dictated prompt now goes to
an observed Claude Code session through its private peer inbox instead of
depending on a per-terminal scripting path, so Ghostty, WezTerm, kitty, SSH and
editor terminals work like iTerm2, Terminal.app, tmux and cmux. The selected
VOICE tile reports whether the prompt was delivered, held or refused by the
receiving session; a write alone is never reported as delivered. AgentDeck no
longer asks for Automation access to a terminal app that does not own the
session. Requires the Node daemon (npm) and a Claude Code version that
exposes the peer inbox; other agents and older versions keep the terminal
path. Standalone macOS app peer inbox delivery is not included. Run
agentdeck daemon install (or npx @agentdeck/setup) once after upgrading:
it refreshes the Claude hooks that advertise the inbox, which a plain claude
session does not do on its own. The delivered/held/refused wording on the
VOICE tile comes from the deck plugin, so update the Stream Deck or Ulanzi
plugin to 2.1 as well.

  • Live cmux names. Same-project sessions show their cmux workspace and surface titles and follow renames and moves.
  • Reconnect after changing daemons. Apple and Android clients retry the selected host after retries run out, keep authentication backoff, and respect an explicit Disconnect. Devices whose approval was retired can request pairing again instead of disappearing from the approval list.
  • Pairing token renewal. agentdeck token rotate and the macOS app's Pairing settings renew the active daemon's token. Retired approvals still need explicit approval; offline or older daemons that never observed the renewal are not retired by it.
  • Local ownership and devices. Uncertain renewal results recover without renewing twice; Swift custody hands over to the active daemon once. macOS USB registry discovery is bounded, BLE requirements are repaired before readiness is reported, and the installed Mac app launches independently of test copies.
  • Firmware trust and recovery. Each board keeps its endpoint and credential bound across reboot, refuses ambiguous discovery and confirmed authentication failures, and repaints USB re-pair guidance. Setup portals keep the paired-daemon firmware update path and apply bounded request parsing and authentication.
  • Ulanzi keys never sit blank. A key with no session to show now displays an OPEN SLOT card instead of a near-black tile that looked like a missing icon. Japanese session and cmux titles render instead of empty boxes, and a shortened workspace / surface cmux label keeps the surface name that tells tabs apart. The Studio bridge reconnects to the endpoint Studio launched it with instead of the SDK default port, and a failed key-image raster is retried and repainted (#730).
  • Calendar feeds. ICS subscriptions from Outlook and Google keep events that used Windows time-zone names, a week starting on Sunday or monthly "nth weekday" rules; skipped events are reported, and webcal:// links are fetched over HTTPS (Node and macOS app, #672).
  • ESP32 serial discovery on macOS. A timed-out ioreg lookup no longer leaves processes stacking at full CPU (#677).
  • Network defaults (Node daemon). The legacy UDP discovery beacon is off by default; mDNS remains the discovery path, and a client that still needs the beacon can opt in with "udpDiscoveryEnabled": true in settings.json. ADB reverse mappings that another tool already owns are preserved, and device settings follow AGENTDECK_DATA_DIR. ESP32 boards advertise a per-board mDNS name, agentdeck-display-<board id>, and stop retrying a token the daemon has rejected (HTTP 401 / WebSocket 4001), showing USB re-pair guidance instead.
  • Pixoo64. The bottom usage HUD is preserved, the ordinary scene uses its habitat renderer, and the preview follows the configured panel scene.
  • Security maintenance. Runtime input and transport boundaries, credential handling (Keychain storage for optional evaluation API keys, Android credential-backup exclusion, Android OkHttp 4.12.1 compromised-certificate blocking) and retained inbox resources are hardened, and reviewed dependencies are updated. Details under coordinated disclosure remain private.

After updating, refresh enabled integrations (agentdeck daemon install or the
app's setup), and approve any companion that asks to pair again.

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
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
LilyGo T5 ePaper S3 agentdeck-lilygo_epd47-merged.bin 4.7" 960x540 grayscale e-ink ED047TC2 lilygo_epd47 yes untested
RockBase NM-EPD-420 agentdeck-nm_epd_420-merged.bin 4.2" 400x300 tri-color e-ink GDEY042Z98 nm_epd_420 no untested
Round AMOLED agentdeck-round_amoled-merged.bin 1.8" 360x360 ST77916 amoled yes untested
Seeed TRMNL 7.5" agentdeck-trmnl_75-merged.bin 7.5" 800x480 e-ink UC8179 trmnl_75 yes yes
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 12 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.

Full changelog: https://github.com/puritysb/AgentDeck/blob/esp32-v2.1.0/CHANGELOG.md