ESP32 OTA & Firmware Management

VerifiedSafe

Manage ESP32 firmware through the workbench web interface: upload, list, and delete binary files. Trigger over-the-air updates on WiFi-connected devices, enabling iterative development without blocking the serial port.

Sby Skills Guide Bot
DevelopmentIntermediate
6/2/2026
Claude Code
#ota#firmware#esp32#over-the-air-update#workbench

Recommended for

Automated summary

This skill manages over-the-air firmware updates for an ESP32 workbench server, including uploading, listing, deleting firmware files, and triggering OTA updates on devices.

Strengths

  • Enables iterative development without serial port blocking
  • Provides a complete workflow from upload to monitoring
  • Includes troubleshooting guidance for common issues
  • Supports both HTTP relay and UDP log monitoring

Limitations

  • Requires device to have OTA support and network connectivity
  • Cannot flash bootloaders or partition tables
  • Depends on a fixed workbench IP address (192.168.0.87)
When to use it

Use when you need to update firmware on an ESP32 that already runs OTA-capable firmware and is on the same network as the workbench.

When not to use it

Do not use if the device is bricked, lacks OTA support, or if you need to flash low-level firmware components.

Security analysis

Safe
Quality score92/100

The skill instructs HTTP requests (curl) to a local workbench server for legitimate OTA firmware management. No destructive commands, exfiltration, or obfuscation beyond trivial base64 encoding for payload transmission. Risks are minimal as all actions target the user's own devices and network.

No concerns found

How this analysis is made

Examples

Upload firmware to workbench
Upload the firmware binary from build/firmware.bin to the ESP32 workbench for project 'sensor-v2'.
Trigger OTA update on an ESP32
Trigger an OTA update on the ESP32 at http://192.168.4.2/ota with firmware URL http://192.168.0.87:8080/firmware/sensor-v2/firmware.bin and monitor the progress via UDP logs.
List and delete firmware files
List all firmware files uploaded to the workbench, then delete the file named 'old-firmware.bin' from project 'sensor-v2'.

name: esp32-workbench-ota description: OTA firmware upload, listing, deletion, and over-the-air update for the Universal ESP32 Workbench. Triggers on "OTA", "firmware", "update", "upload", "binary", "over-the-air".

ESP32 OTA & Firmware Repository

Base URL: http://192.168.0.87:8080

When to Use OTA (vs Serial Flashing)

Use OTA when:

  • Device already runs firmware with an OTA HTTP endpoint
  • Device is on the WiFi network (connected to workbench's AP or same LAN)
  • You want to update firmware without blocking the serial port
  • You're doing iterative development (build → upload → trigger → monitor cycle)

Do NOT use OTA when:

  • Device is blank/bricked — use serial flashing (see esp32-workbench-serial-flashing)
  • Device firmware has no OTA support — use serial flashing
  • Device has no WiFi connectivity — use serial flashing
  • You need to flash a bootloader or partition table — only esptool can do this

Endpoints

| Method | Path | Purpose | |--------|------|---------| | POST | /api/firmware/upload | Upload firmware binary (multipart/form-data) | | GET | /api/firmware/list | List all uploaded firmware files | | DELETE | /api/firmware/delete | Delete a firmware file | | GET | /firmware/<project>/<file> | Download URL (ESP32 fetches from here during OTA) |

End-to-End OTA Workflow

Step 1: Upload firmware to workbench

curl -X POST http://192.168.0.87:8080/api/firmware/upload \
  -F "project=my-project" \
  -F "file=@build/firmware.bin"

Response: {"ok": true, "project": "my-project", "filename": "firmware.bin", "size": 456789}

Step 2: Verify upload

curl -s http://192.168.0.87:8080/api/firmware/list | jq .

Step 3: Ensure device is on the network

The device must be able to reach http://192.168.0.87:8080. Use enter-portal to provision if needed (see esp32-workbench-wifi).

Step 4: Clear UDP log buffer (for clean monitoring)

curl -X DELETE http://192.168.0.87:8080/api/udplog

Step 5: Trigger OTA on the ESP32 via HTTP relay

OTA_BODY=$(echo -n '{"url":"http://192.168.0.87:8080/firmware/my-project/firmware.bin"}' | base64)

curl -X POST http://192.168.0.87:8080/api/wifi/http \
  -H 'Content-Type: application/json' \
  -d "{\"method\": \"POST\", \"url\": \"http://192.168.4.2/ota\", \"headers\": {\"Content-Type\": \"application/json\"}, \"body\": \"$OTA_BODY\", \"timeout\": 30}"

Step 6: Monitor OTA progress

# Via UDP logs (preferred — non-blocking)
curl "http://192.168.0.87:8080/api/udplog?limit=50"

# Or via serial monitor (see esp32-workbench-logging)
curl -X POST http://192.168.0.87:8080/api/serial/monitor \
  -H 'Content-Type: application/json' \
  -d '{"slot": "slot-1", "pattern": "OTA.*complete", "timeout": 60}'

Managing Firmware Files

# List all uploaded firmware
curl http://192.168.0.87:8080/api/firmware/list

# Delete a firmware file
curl -X DELETE http://192.168.0.87:8080/api/firmware/delete \
  -H 'Content-Type: application/json' \
  -d '{"project": "my-project", "filename": "firmware.bin"}'

# The download URL for ESP32 to fetch:
# http://192.168.0.87:8080/firmware/<project>/<filename>

Troubleshooting

| Problem | Fix | |---------|-----| | Upload returns "expected multipart/form-data" | Use -F flags (not -d) for multipart upload | | File not in list after upload | Check project/filename; .. and / are rejected | | ESP32 can't download firmware | Device must reach workbench at 192.168.0.87:8080; check WiFi | | OTA trigger times out | Check device's OTA endpoint URL; increase HTTP relay timeout | | No progress in UDP logs | Device may not send UDP logs — check serial monitor instead (see esp32-workbench-logging) | | OTA trigger returns error | Verify device firmware has OTA endpoint; check relay response body |

From the file to a first result

The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.

View the source and supporting files

This download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.

1. Download the file

Download SKILL.md

From the root of a test project, save the file as .skill-downloads/esp32-ota-firmware-management-mm78nmn4/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.

Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.

mkdir -p '.skill-downloads/esp32-ota-firmware-management-mm78nmn4' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/esp32-ota-firmware-management-mm78nmn4/download' --output '.skill-downloads/esp32-ota-firmware-management-mm78nmn4/SKILL.md.part' && mv '.skill-downloads/esp32-ota-firmware-management-mm78nmn4/SKILL.md.part' '.skill-downloads/esp32-ota-firmware-management-mm78nmn4/SKILL.md'

2. Check prerequisites

Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.

No recognized prerequisites section in this file. This does not mean it is self-contained: libraries, tools and access requirements may be mentioned elsewhere in the content or source repository.

The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.

3. Load the skill

After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.

Claude Code
test -f '.skill-downloads/esp32-ota-firmware-management-mm78nmn4/SKILL.md' && test -s '.skill-downloads/esp32-ota-firmware-management-mm78nmn4/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/esp32-workbench-ota' && cp -R '.skill-downloads/esp32-ota-firmware-management-mm78nmn4' '.claude/skills/esp32-workbench-ota'

OpenSkills

OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.

Official OpenSkills installation
openskills install './.skill-downloads/esp32-ota-firmware-management-mm78nmn4'

openskills read 'esp32-ota-firmware-management-mm78nmn4'

Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.

For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.

openskills sync

Manual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.

4. Try a first task

Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:

Read .skill-downloads/esp32-ota-firmware-management-mm78nmn4/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.

Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.

Related skills