Commit
manhpham90vn/Deskhub
Write a Deskhub commit message. An agent skill from manhpham90vn/Deskhub.
Build, install, launch, and configure AgentDeck on connected Android, Apple, ESP32, Stream Deck, Ulanzi Studio, or daemon targets.
$ npx skills add puritysb/AgentDeck --skill agentdeck-deploy -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install puritysb/AgentDeck agentdeck-deploy --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/puritysb/AgentDeck.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/agentdeck-deploy .claude/skills/agentdeck-deploy && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "agentdeck-deploy" agent skill from https://github.com/puritysb/AgentDeck/tree/master/.agents/skills/agentdeck-deploy into .claude/skills/agentdeck-deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentdeck-deploy", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/puritysb/AgentDeck/tree/master/.agents/skills/agentdeck-deployType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add puritysb/AgentDeck --skill agentdeck-deploy -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install puritysb/AgentDeck agentdeck-deploy --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/puritysb/AgentDeck.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/agentdeck-deploy .agents/skills/agentdeck-deploy && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "agentdeck-deploy" agent skill from https://github.com/puritysb/AgentDeck/tree/master/.agents/skills/agentdeck-deploy into .agents/skills/agentdeck-deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentdeck-deploy", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add puritysb/AgentDeck --skill agentdeck-deploy -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install puritysb/AgentDeck agentdeck-deploy --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/puritysb/AgentDeck.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/agentdeck-deploy .cursor/skills/agentdeck-deploy && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "agentdeck-deploy" agent skill from https://github.com/puritysb/AgentDeck/tree/master/.agents/skills/agentdeck-deploy into .cursor/skills/agentdeck-deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentdeck-deploy", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/puritysb/AgentDeck.git --path .agents/skills/agentdeck-deploy--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add puritysb/AgentDeck --skill agentdeck-deploy -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install puritysb/AgentDeck agentdeck-deploy --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/puritysb/AgentDeck.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/agentdeck-deploy .gemini/skills/agentdeck-deploy && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "agentdeck-deploy" agent skill from https://github.com/puritysb/AgentDeck/tree/master/.agents/skills/agentdeck-deploy into .gemini/skills/agentdeck-deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentdeck-deploy", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install puritysb/AgentDeck agentdeck-deployInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add puritysb/AgentDeck --skill agentdeck-deploy -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/puritysb/AgentDeck.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/agentdeck-deploy .github/skills/agentdeck-deploy && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "agentdeck-deploy" agent skill from https://github.com/puritysb/AgentDeck/tree/master/.agents/skills/agentdeck-deploy into .github/skills/agentdeck-deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentdeck-deploy", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add puritysb/AgentDeck --skill agentdeck-deploy -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install puritysb/AgentDeck agentdeck-deploy --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/puritysb/AgentDeck.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/agentdeck-deploy .opencode/skills/agentdeck-deploy && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "agentdeck-deploy" agent skill from https://github.com/puritysb/AgentDeck/tree/master/.agents/skills/agentdeck-deploy into .opencode/skills/agentdeck-deploy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentdeck-deploy", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
agentdeck-deployBuild, install, launch, and configure AgentDeck on connected Android, Apple, ESP32, Stream Deck, Ulanzi Studio, or daemon targets.
Agentdeck Deploy is an agent skill from puritysb/AgentDeck. Build, install, launch, and configure AgentDeck on connected Android, Apple, ESP32, Stream Deck, Ulanzi Studio, or daemon targets. Use when the user asks to deploy AgentDeck or names target devices such as pantone, crema, lenovo, iphone, ipad, macos, esp32, tc001, d200h, bridge, daemon, or plugin.
Its SKILL.md is about 5.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development, covering Embedded systems. It works with ESP32, Android, macOS and iOS. The repository describes itself as: Local dashboards and physical controls for AI coding agents — native 3D aquariums, Stream Deck, Apple/Android apps, e-ink, ESP32 and LED displays. The licence is MIT.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 81d1d0e. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
adbgitpnpmxcrunbashxcodebuildcurlFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, pnpm and curl, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Agentdeck Deploy loads about 5.1k tokens when it runs. Until then it costs about 79 tokens; SKILL.md has 1,808 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from puritysb/AgentDeck at commit 81d1d0e, republished under its MIT licence (© puritysb). 1,808 words, ~5,127 tokens.
.claude/skills/agentdeck-deploy/SKILL.md (or your agent's skills folder).Canonical deploy procedure for AgentDeck. This file is the single source of truth — .claude/skills/agentdeck-deploy is a tracked directory symlink to this skill. Build, install, launch, and configure AgentDeck on connected targets; keep deployment scoped to what is actually connected and skip missing devices with a clear note (never fail the whole deploy because one device is absent).
Parse the argument string to determine target(s). Multiple targets can be combined (e.g. android ios).
| Argument | Scope |
|---|---|
(none) / all | Full deploy: bridge → plugin → android → ios → macos |
android | All connected Android devices |
pantone / pantone6 | Pantone 6 only |
crema | Crema S only |
lenovo / tablet / tab | Lenovo Tab only |
ios | Connected routine iOS targets (iPad Air M2 + iPhone 14 Pro Max) |
iphone | iPhone 14 Pro Max only |
ipad | iPad Air M2 only |
macos / mac | macOS app only |
apple | iOS + macOS |
esp32 | All connected ESP32 display boards (excludes Ulanzi TC001) |
esp32-all | All ESP32 boards including Ulanzi TC001 |
trmnl_75 | TRMNL 7.5" e-ink only |
nm_epd_420 / nm | RockBase NM-EPD-420 only |
lilygo_epd47 / epd47 | LilyGo T5 ePaper S3 only |
ulanzi / tc001 | Ulanzi TC001 LED matrix only |
bridge / daemon | Daemon restart only |
plugin / sd | Stream Deck plugin only |
d200h / ulanzi-plugin | Ulanzi Studio keypad plugin; separate from TC001 firmware |
esp32_c6_147 | Waveshare C6-LCD-1.47; USB only, no OTA |
The default all sequence above does not include ESP32 or the D200H Studio
plugin. When reviewing release coverage, list those channels explicitly; when
deploying, follow the requested target scope. ulanzi means TC001 firmware,
whereas d200h / ulanzi-plugin means the Studio plugin. A firmware build or a
plugin package does not update the installed runtime.
| Device | Serial | Type | Quirks |
|---|---|---|---|
| Pantone 6 | AA007422R24C1300039 | Color e-ink (Kaleido 3, RK3566) | Rotation reset on reinstall → must restore landscape. WRITE_SETTINGS permission lost on reinstall |
| Crema S | CREMAA21W09235 | B&W e-ink (IWG / Qualcomm sdm660, native Onyx View API) | Standard |
| Lenovo Tab | HVA095B4 | LCD tablet (J606F) | Standard |
| Device | devicectl ID | xcodebuild destination | Type |
|---|---|---|---|
| iPad Air 11" (M2) | 8B71247D-A740-535E-8B2C-6FE9A196F342 | platform=iOS,id=00008112-001608A02ED2601E | WiFi/USB |
| iPhone 14 Pro Max | 00008120-001169AA11D8C01E | platform=iOS,id=00008120-001169AA11D8C01E | WiFi/USB |
| macOS | — | platform=macOS | Local |
iPhone XR is retired from routine test and deploy targets. Do not include it in
all, ios, or iphone runs even if it appears in device discovery; target it
only when the user explicitly requests that device.
두 이름 층 (panel/form + 인치):
friendly는./scripts/flash.sh <friendly>에 넘기는 canonical 친근명,pio env는pio run -e <pio env>/.pio/build/<pio env>/에 쓰는 실제 PlatformIO env. flash.sh 는 둘 다 받지만pio run -e는 pio env 만 받는다.
| Board | friendly (flash.sh) | pio env (pio run -e) | Serial Pattern | Chip |
|---|---|---|---|---|
| 86 Box (480×480) | box_40 | box_86 | /dev/cu.usbserial-* | ESP32-S3, CH340 |
| IPS 3.5" (480×320) | ips_35 | ips35 | /dev/cu.usbmodem* | ESP32-S3, native USB |
| Round AMOLED (360×360) | amoled_18 | amoled | /dev/cu.usbmodem* | ESP32-S3, native USB |
| TTGO T-Display (135×240) | tft_114 | ttgo | /dev/cu.wchusbserial* | ESP32-D0WDQ6, CH340 |
| IPS 10.1" (800×1280) | ips_101 | ips10 | /dev/cu.wchusbserial* | ESP32-P4 + C6 |
| TRMNL 7.5" (800×480 e-ink) | trmnl_75 | trmnl_75 | /dev/cu.usbmodem* | XIAO ESP32-S3 Plus |
| RockBase NM-EPD-420 (400×300 e-ink) | nm_epd_420 | nm_epd_420 | /dev/cu.usbmodem* | ESP32-S3 N16R8, native USB |
| LilyGo T5 ePaper S3 (960×540 e-ink) | lilygo_epd47 | lilygo_epd47 | /dev/cu.usbmodem* | ESP32-S3 N16R8, native USB |
| T-Embed CC1101 (170×320 + encoder) | t_embed | t_embed | /dev/cu.usbmodem* | ESP32-S3, native USB |
| T-Display-S3-Pro (222×480) | t_display_pro | t_display_pro | /dev/cu.usbmodem* | ESP32-S3, native USB |
| Waveshare C6-LCD-1.47 (172×320) | esp32_c6_147 | esp32_c6_147 | /dev/cu.usbmodem* | ESP32-C6, native USB, no OTA |
| Ulanzi TC001 (8×32 LED) | led_8x32 | led8x32 | /dev/cu.usbserial-* | ESP32-D0WD classic, CH340 |
Output discipline. Every step below runs from the repository root (cd "$(git rev-parse --show-toplevel)"). Send long build output to a log under diagnostics/logs/ (gitignored) and show only the tail or the errors, e.g. mkdir -p diagnostics/logs; <build> >diagnostics/logs/<target>.log 2>&1 || { tail -40 diagnostics/logs/<target>.log; exit 1; }, then grep -nE 'error|FAILED' diagnostics/logs/<target>.log | head -20 if the tail is not enough. Use each tool's quiet mode: xcodebuild -quiet, gradle -q, pio run -s.
Run before any deploy to know what's available:
cd "$(git rev-parse --show-toplevel)"
echo "=== ADB Devices ==="
adb devices -l 2>/dev/null | grep -w device | grep -v "List"
echo "=== Apple Devices ==="
xcrun devicectl list devices 2>/dev/null | grep -E "(iPhone|iPad)" || echo "none"
echo "=== Serial Ports (ESP32) ==="
ls /dev/cu.usb* 2>/dev/null || echo "none"
echo "=== Stream Deck ==="
pgrep -x "Stream Deck" >/dev/null && echo "running" || echo "not running"
echo "=== Daemon ==="
cat ~/.agentdeck/daemon.json 2>/dev/null || echo "not running"For macOS targets (macos, apple, all, or any run that ends in screenshots/E2E driven through System Events), also run bash scripts/macos-preflight.sh --automation --accessibility --screen-recording --json (add --firewall apple/DerivedData/Build/Products/Debug/AgentDeck.app once that app is built). Exit 2 means a grant is denied: relay each fix path to the user and stop the E2E part instead of letting a consent sheet stall it; exit 3 means it could not confirm — say so, never assume granted.
Only deploy to devices that are actually connected. Skip missing devices with a warning, don't fail. If preflight access fails, follow AGENTS.md Agent working agreements for execution-policy failures; retry only the affected command after resolving access, and do not infer device absence from an unreadable probe.
mkdir -p diagnostics/logs
pnpm build >diagnostics/logs/pnpm-build.log 2>&1 || { tail -40 diagnostics/logs/pnpm-build.log; exit 1; }For Android targets, also build APK:
bash scripts/build-android-release.sh >diagnostics/logs/android.log 2>&1 || { tail -40 diagnostics/logs/android.log; exit 1; }This produces dist/agentdeck-v{VERSION}.apk.
For Apple targets (ios/macos), build via xcodebuild (see Step 3/4).
For EACH connected Android device in the target set:
SERIAL="<device_serial>"
APK="dist/agentdeck-v*.apk" # use the actual versioned filename from Step 1
# 1. Stop running app
adb -s $SERIAL shell am force-stop dev.agentdeck
# 2. Install (attempt direct first, uninstall on signature conflict)
if ! adb -s $SERIAL install -r $APK 2>&1 | grep -q "Success"; then
adb -s $SERIAL uninstall dev.agentdeck
adb -s $SERIAL install $APK
fi
# 3. Launch
adb -s $SERIAL shell am start -n dev.agentdeck/.MainActivity
# 4. adb reverse for daemon connection
adb -s $SERIAL reverse tcp:9120 tcp:9120Device-specific post-install:
Pantone 6 (after ANY install, especially after uninstall→reinstall):
# Rotation fix — reinstall resets system rotation settings (NOTE: Pantone 6 only! Do NOT run on Crema S or ordinary tablets)
adb -s AA007422R24C1300039 shell settings put system accelerometer_rotation 0
adb -s AA007422R24C1300039 shell settings put system user_rotation 1 # 1=landscapeCrema S: No special steps needed. (Standard requestedOrientation is used; do not modify system-wide user_rotation.)
Lenovo Tab: No special steps needed.
Build once, install on multiple devices:
cd "$(git rev-parse --show-toplevel)"
# Build (one build serves both devices); a fixed derived-data path, never a DerivedData hash
xcodebuild build -project apple/AgentDeck.xcodeproj -scheme AgentDeck_iOS \
-destination 'platform=iOS,id=00008112-001608A02ED2601E' \
-derivedDataPath apple/DerivedData \
CODE_SIGN_STYLE=Automatic DEVELOPMENT_TEAM=QF36NDHYHD -quiet \
>diagnostics/logs/xcodebuild-ios.log 2>&1 || { tail -40 diagnostics/logs/xcodebuild-ios.log; exit 1; }
APP=apple/DerivedData/Build/Products/Debug-iphoneos/AgentDeck.appFor EACH iOS device in the target set:
DEVICE_ID="<devicectl_id>"
xcrun devicectl device install app --device $DEVICE_ID $APP
xcrun devicectl device process launch --device $DEVICE_ID bound.serendipity.agent.deckImportant:
xcodebuild commandscd "$(git rev-parse --show-toplevel)"
xcodebuild build -project apple/AgentDeck.xcodeproj -scheme AgentDeck_macOS \
-destination 'platform=macOS' -derivedDataPath apple/DerivedData -quiet \
>diagnostics/logs/xcodebuild-macos.log 2>&1 || { tail -40 diagnostics/logs/xcodebuild-macos.log; exit 1; }
# Kill existing → relaunch
killall AgentDeck 2>/dev/null; sleep 0.5
open -a "$PWD/apple/DerivedData/Build/Products/Debug/AgentDeck.app"Do not add or alter App Store UI text that asks users to install or launch external tools (App Review 4.2.3 — see AGENTS.md "App Store build invariants").
Use the supervisor-routed lifecycle command (.claude/rules/daemon-lifecycle.md): daemon restart rebuilds stale packages on a checkout, restarts through the LaunchAgent/systemd/Scheduled Task that owns the daemon, and verifies the daemon that came up by pid and build — never background daemon start & with a fixed sleep.
agentdeck daemon restart
# Bounded health wait on the registry-resolved port (never a blind 9120 probe)
PORT=$(sed -n 's/.*"port"[[:space:]]*:[[:space:]]*\([0-9][0-9]*\).*/\1/p' ~/.agentdeck/daemon.json 2>/dev/null | head -n 1)
for _ in 1 2 3 4 5 6 7 8 9 10; do
curl -fsS --max-time 2 "http://127.0.0.1:${PORT:-9120}/health" >/dev/null && break
sleep 1
done
agentdeck daemon statusIf the health wait never answers, report the daemon as unverified (not stopped) and show agentdeck daemon status.
A build is not a deployment: Marketplace installation can replace the source
link, and an already-running process keeps its old JavaScript after a rebuild.
On macOS, from the persistent main checkout, run pnpm plugin:deploy. It refuses linked
worktrees and checkouts missing known origin/master changes, builds shared and
plugin, preserves a replaced installation outside the host scan directory,
links the source, restarts it, and requires a fresh runtime receipt matching the
bundle path and SHA-256. pnpm plugin:check checks the current installation and
running process without changing them. Never report success from pnpm build
or a successful streamdeck link alone.
After a Marketplace/DRM validation session, restore the development installation
with pnpm plugin:deploy and record pnpm plugin:check before finishing. A
failed switch restores the prior installation; do not delete its backup.
Use pnpm --filter @agentdeck/plugin-ulanzi package to prepare a package;
package:install additionally installs it into Studio when deployment is in
scope. Read the verification procedure and
the packaging contract.
Retain WASM resvg and the bundled fonts. Restart the installed plugin and verify
its path, version, bundle hash and process start after replacement, then inspect
actual D200H keys and reconnect behaviour. A file hash alone does not prove the
running process loaded it. D200X keypad support does not imply encoder support.
CRITICAL: Build and flash ONE AT A TIME — PlatformIO lock + serial port conflicts.
Ulanzi TC001 is a separate target. The esp32 target deploys connected display boards from the board SSOT, excluding TC001: 86 Box, IPS 3.5", IPS 10.1", Round AMOLED, TTGO, T-Embed CC1101, T-Display-S3-Pro, C6-LCD-1.47, TRMNL 7.5", NM-EPD-420, and LilyGo EPD47. Use ulanzi, tc001, or esp32-all to include the Ulanzi TC001. This separation exists because:
CRITICAL: Identify boards by device_info BEFORE flashing. Port numbers change when USB hub positions change — never assume a port number means a specific board.
cd "$(git rev-parse --show-toplevel)/esp32"
# Step 1: Detect and IDENTIFY each board
for port in /dev/cu.usb*; do
echo "=== $port ==="
# Send device_info_request, read 1 line bounded by a perl alarm (stock macOS has no `timeout`)
(echo '{"type":"device_info_request"}' > "$port" &) 2>/dev/null
perl -e 'alarm shift; exec @ARGV' 2 head -n 1 < "$port" 2>/dev/null | grep -o '"board":"[^"]*"' || echo "no response"
done
# Match each port to its board name before flashing!If the daemon is holding a serial port, stop the daemon (or use the flash helper that pauses/resumes it) before flashing — see docs/esp32.md.
Flash each detected display board:
# Match port to environment and flash
# run from esp32/, so the repo log dir is ../diagnostics/logs
pio run -s -e <environment> -t upload --upload-port <port> >../diagnostics/logs/pio-<environment>.log 2>&1 \
|| tail -40 ../diagnostics/logs/pio-<environment>.log86 Box CH340 fallback: If PIO upload fails at high baud (chip stops responding), build separately then flash with esptool at 115200:
pio run -s -e box_86 # build only
BOOT_APP0=~/.platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin
~/.platformio/penv/bin/esptool --chip esp32s3 --port <port> --baud 115200 \
--before default-reset --after hard-reset write-flash -z \
--flash-mode dio --flash-freq 80m --flash-size 16MB \
0x0 .pio/build/box_86/bootloader.bin \
0x8000 .pio/build/box_86/partitions.bin \
0xe000 "$BOOT_APP0" \
0x10000 .pio/build/box_86/firmware.binThe flash size must match board_upload.flash_size (16MB since the 2026-07-05
dual-OTA migration): 8MB patches the bootloader header below the partition table
and the board boot-loops on partition 3 invalid ... exceeds flash chip size.
boot_app0.bin resets otadata; without it the bootloader keeps booting the older
OTA slot and the board reports the previous build (both measured 2026-09-26).
Stray serial readers: with the Node daemon stopped, the macOS AgentDeck app's
Swift daemon opens the boards' serial ports; two readers on one TTY show up as
esptool "serial noise"/checksum failures. Quit the app (or keep the Node daemon up
and use its /esp32/serial/suspend lease) before a USB write, and reopen it after.
IPS10 USB recovery: identify the current CH340 port from device_info; the
fixed port in platformio.ini may be stale. Python esptool 5.3 with
--before default-reset --after hard-reset and its default stub works at 460800
(measured 2026-09-26, P4 rev1.3). Do not reuse the historical no-reset/no-stub
recipe. Use 16MB/DIO/40MHz, bootloader at 0x2000, partitions at 0x8000,
boot_app0.bin at 0xe000, firmware at 0x10000. Browser flashing is still
unverified. Suspend serial with a lease while keeping the Node daemon running.
Boards with OTA: TRMNL re-enumerates to a download node. Once a board
has a dual-OTA partition table, agentdeck esp32-ota <board> -e <env> --build
over WiFi is the simpler path; confirm the running build by a direct
device_info read under a serial lease — the daemon's device list can keep
reporting the previous build after an OTA.
After flash: USB re-plug required for JTAG boards (IPS 3.5", Round AMOLED).
All three must be identified by device_info before flashing because native USB
port numbers change. TRMNL 7.5" additionally re-enumerates to a distinct download
node; choose that new node after reset. NM and LilyGo use the confirmed 115200
upload speed.
./scripts/flash.sh trmnl_75 <device_info-confirmed-port>
./scripts/flash.sh nm_epd_420 <device_info-confirmed-port>
./scripts/flash.sh lilygo_epd47 <device_info-confirmed-port>Only flash when ulanzi, tc001, or esp32-all is specified. Skip for plain esp32 target.
Use the helper script or the equivalent esptool command at 115200:
cd "$(git rev-parse --show-toplevel)/esp32"
./scripts/flash.sh led_8x32 /dev/cu.usbserial-211110Equivalent manual fallback:
cd "$(git rev-parse --show-toplevel)/esp32"
~/.platformio/penv/bin/esptool --chip esp32 --port /dev/cu.usbserial-211110 --baud 115200 \
--before default-reset --after hard-reset write-flash -z \
--flash-mode dio --flash-freq 40m --flash-size 8MB \
0x1000 .pio/build/led8x32/bootloader.bin \
0x8000 .pio/build/led8x32/partitions.bin \
0xe000 ~/.platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin \
0x10000 .pio/build/led8x32/firmware.binNotes:
460800 is not reliable on the TC001's CH340 pathbootloader + partitions + firmware togetherAfter all deploys complete, verify each target:
# Android: check process running
for d in AA007422R24C1300039 CREMAA21W09235 HVA095B4; do
adb -s $d shell pidof dev.agentdeck 2>/dev/null && echo "$d: running" || echo "$d: not running"
done
# Daemon
curl -s --max-time 2 "http://127.0.0.1:${PORT:-9120}/health" | head -c 300
# Plugin / Devices
agentdeck devices 2>/dev/nullPrint a summary table at the end. Example:
Deploy Summary
══════════════════════════════════════════════════
Target Status Details
──────────────────────────────────────────────────
Bridge OK Daemon port 9120
Plugin OK Runtime hash verified
Pantone 6 OK Installed + launched + rotation fix
Crema S OK Installed + launched
Lenovo Tab OK Installed + launched
iPad Air OK Installed + launched
iPhone SKIP Not connected
macOS OK Built + launched
ESP32 SKIP No firmware changes
══════════════════════════════════════════════════Use SKIP (not connected / not in target), OK (success), FAIL (error with reason). Always report which commands required approval.
© puritysb, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/agentdeck-deploy of puritysb/AgentDeck.
Open the folder on GitHubat commit 81d1d0e
Agentdeck Deploy next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Agentdeck Deploy this skillpuritysb/AgentDeck | 257 | — | ~5.1k | Automated safety check: Pass | MIT | |
| Commitmanhpham90vn/Deskhub | 133 | — | ~978 | Automated safety check: Pass | MIT | |
| Engine Whats Newflutter/flutter | 179k | — | ~978 | Automated safety check: Pass | BSD-3-Clause | |
| App Store Screenshots GeneratorParthJadhav/app-store-screenshots | 7.2k | — | ~14k | Automated safety check: Pass | MIT | |
| Cindy Skill Creatormakecindy/cindy | 2.9k | — | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Phoneagentrounak/PhoneAgent | 798 | — | ~2.2k | Automated safety check: Pass | MIT |
manhpham90vn/Deskhub
Write a Deskhub commit message. An agent skill from manhpham90vn/Deskhub.
flutter/flutter
Generates the "what's new" release summary and diff file for changes in the Flutter engine (//engine/src/flutter) between two releases (e.g., 3.47 vs 3.44).
ParthJadhav/app-store-screenshots
Scaffolds a Next.js editor for designing App Store and Google Play screenshots as ads and exporting them at every required size, for iOS, Mac and Android.
makecindy/cindy
Create or edit a Cindy Skill, search the SkillHub public marketplace or your organization's Skills, upload your own Skill, or publish a new version of a Skill you authored.
rounak/PhoneAgent
Control a connected iPhone, iOS simulator, Android emulator, or Android device from macOS through PhoneAgent's JSON-RPC bridge.
spinabot/brigade
Diagnoses why a Brigade companion app can't pair or connect, by first identifying the real node-to-gateway route and then fixing auth.
puritysb/AgentDeck
A skill your agent uses when the user asks to end, wrap up, clear, hand off, or prepare continuity for a Codex/AgentDeck session.
puritysb/AgentDeck
Memory-allocation discipline for AgentDeck ESP32 firmware (esp32/).
puritysb/AgentDeck
Diagnose AgentDeck Stream Deck/PTY option synchronization, cursor state, hook ingestion, and bridge state-machine issues.
puritysb/AgentDeck
A skill your agent uses for AgentDeck build, dev-server, Stream Deck plugin, Android release, or Apple/Xcode diagnostic workflows.
Categories
Build, install, launch, and configure AgentDeck on connected Android, Apple, ESP32, Stream Deck, Ulanzi Studio, or daemon targets. Agentdeck Deploy is an agent skill from puritysb/AgentDeck. Build, install, launch, and configure AgentDeck on connected Android, Apple, ESP32, Stream Deck, Ulanzi Studio, or daemon targets.
Agentdeck Deploy fits situations like: the user asks to deploy AgentDeck; names target devices such as pantone.
Run `npx skills add puritysb/AgentDeck --skill agentdeck-deploy -a claude-code`. Or copy the skill folder (.agents/skills/agentdeck-deploy in puritysb/AgentDeck) into .claude/skills/agentdeck-deploy in your project. Claude Code loads it when a task matches its description.
Run `npx skills add puritysb/AgentDeck --skill agentdeck-deploy -a codex`. Or copy the skill folder (.agents/skills/agentdeck-deploy in puritysb/AgentDeck) into .agents/skills/agentdeck-deploy in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add puritysb/AgentDeck --skill agentdeck-deploy -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/agentdeck-deploy, .gemini/skills/agentdeck-deploy, .github/skills/agentdeck-deploy and .opencode/skills/agentdeck-deploy in your project.
Going by SKILL.md and its folder, Agentdeck Deploy needs the command-line tools its instructions call (adb, git, pnpm, xcrun, bash and xcodebuild).
SKILL.md contains no URLs. Its commands use git and curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Agentdeck Deploy is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.1k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Agentdeck Deploy: Commit (manhpham90vn/Deskhub, 133 stars), Engine Whats New (flutter/flutter, 179k stars), App Store Screenshots Generator (ParthJadhav/app-store-screenshots, 7.2k stars) and Cindy Skill Creator (makecindy/cindy, 2.9k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
puritysb (a GitHub user) maintains it in puritysb/AgentDeck, which has 257 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on October 7, 2026.
Source: puritysb/AgentDeck on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.