Let an AI model use a real iPhone with a $7 ESP32: AirPlay eyes, USB HID hands, any OpenAI-compatible vision model. No Mac, no developer account, no jailbreak.
# Add to your Claude Code skills
git clone https://github.com/onehumanbeing/esp32-iphone-agentGuides for using ai agents skills like esp32-iphone-agent.
See how esp32-iphone-agent compares with popular alternatives.
esp32-iphone-agent is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by onehumanbeing. Let an AI model use a real iPhone with a $7 ESP32: AirPlay eyes, USB HID hands, any OpenAI-compatible vision model. No Mac, no developer account, no jailbreak. It has 168 GitHub stars.
esp32-iphone-agent's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/onehumanbeing/esp32-iphone-agent" and add it to your Claude Code skills directory (see the Installation section above).
esp32-iphone-agent is primarily written in Python. It is open-source under onehumanbeing on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh esp32-iphone-agent against similar tools.
No comments yet. Be the first to share your thoughts!
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
Let an AI model use a real iPhone — with a $7 ESP32. No Mac, no developer account, no jailbreak.
English · 简体中文
Example 1 — draw on a canvas. "Open Whiteboard and draw a smiley face": the agent searches for the app, opens it and draws the face with continuous strokes. Every step's screenshot, with its tap or stroke drawn on top, stays on the step wall.
Example 2 — set an alarm. "Set an alarm for 7:00 AM that repeats every day, then save it": the agent opens Clock, types 0700 into the time wheel, ticks the days under Repeat several taps at a time, and saves. Left: the real iPhone with the ESP32 plugged in; right: the web UI.
The agent sees the phone through AirPlay screen mirroring and touches it through a tiny ESP32-S3 board that plugs into the phone's USB port as a mouse and keyboard. Any OpenAI-compatible vision model can be the brain — a cloud API, or a model you run yourself.
Most iPhone automation drives the phone through XCTest / WebDriverAgent. That needs a Mac, Xcode, a signed helper app and an Apple developer account (a free account's signature expires every 7 days). This project uses the same paths a person uses — the screen and a pointer — so the phone needs nothing installed.
| ESP32 iPhone Agent | XCTest / WebDriverAgent tools | |
|---|---|---|
| Apple developer account | Not needed | Needed (to sign the runner) |
| Xcode | Not needed | Needed |
| Computer | Mac or Linux | Mac |
| App installed on the phone | None | Test runner app |
| Jailbreak | Not needed | Not needed |
| Extra hardware | ESP32-S3 board (~$7) | USB cable |
| Works in any app, incl. games | Yes (it only sees pixels) | Mostly (depends on the accessibility tree) |
move, click, type, …);
all logic stays on the computer.| Part | Notes |
|---|---|
| ESP32-S3 board | Tested with a bare Seeed Studio XIAO ESP32S3 (~$7, no camera add-on needed); attach the antenna that comes with it, as the XIAO has no on-board antenna and Wi-Fi drops often without it. Any ESP32-S3 board whose USB-C port is wired to the S3's native USB works. |
| iPhone | USB-C models plug in directly. Lightning models need a Lightning to USB Camera Adapter. The phone powers the board. |
| Computer | macOS or Linux, on the same network as the phone; runs UxPlay and the server. |
| Vision model | Any OpenAI-compatible chat API that accepts images. Running a model locally is optional. |
Use a USB-C hub with power pass-through if the phone should keep charging while the board is plugged in.
Set up with an AI coding agent. Paste this into Claude Code, Codex or a similar agent on the computer the board will connect to:
Clone https://github.com/onehumanbeing/esp32-iphone-agent and follow its README to set it up on this machine: flash the ESP32-S3 plugged in over USB, install UxPlay and the server, write server/.env for my model API, start the server and give me the web UI address. Ask me for the Wi-Fi name/password and the model API key.
Install arduino-cli and the ESP32 core (3.x), then:
cp hardware/hid_bridge/secrets.example.h hardware/hid_bridge/secrets.h
# edit secrets.h: 2.4 GHz Wi-Fi name/password and the IP address of the computer running the server
hardware/flash.sh # optional arguments: [serial port] [--debug]
# UxPlay — macOS:
brew install uxplay
# UxPlay — Debian / Ubuntu:
sudo apt install uxplay gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-libav
cd server
python3 -m venv .venv && .venv/bin/pip install -e .
cp .env.example .env # set LLM_BASE_URL / LLM_MODEL / LLM_API_KEY
set -a && . ./.env && set +a && .venv/bin/python -m hidagent
Open http://<computer-ip>:8890 in a browser.
Type a goal (for example "Open Settings and go to Wi-Fi") and press Start, or click one of the examples.
precise (pointer checked before tapping) are labelled in the log.Set in server/.env (see .env.example):
| Variable | Default | Meaning |
|---|---|---|
LLM_BASE_URL |
http://localhost:8000/v1 |
OpenAI-compatible endpoint |
LLM_MODEL / LLM_API_KEY |
— | Model name and API key |
LLM_EXTRA_BODY |
{} |
JSON merged into every request (e.g. to turn off a model's thinking mode) |
LLM_TOKEN_PARAM |
auto |
Token-limit field: max_tokens, max_completion_tokens (newer OpenAI models), or auto to detect |
ACTOR_* / PLANNER_* |
— | Per-role overrides of any LLM_* variable |
AIRPLAY_NAME |
iPhone Agent |
Receiver name in the phone's Screen Mirroring list |
PORT / DEVICE_PORT |
8890 / 7300 |
Web UI port / port the board connects to |
HIDAGENT_DATA |
~/.hidagent |
Calibration and debug traces |
HIDAGENT_DEBUG |
0 |
Debug mode, see below |
A cloud API is enough. If you want everything on your own hardware, this is the setup the project was developed and timed with:
LLM_BASE_URL=http://<dgx-spark-ip>:8888/v1
LLM_MODEL=Qwen3.8-Flash-Next
LLM_EXTRA_BODY='{"chat_template_kwargs": {"enable_thinking": false}}'
Any other OpenAI-compatible server (vLLM, SGLang, llama.cpp, Ollama, …) with a vision model works the same way.
Set HIDAGENT_DEBUG=1 to log every board command with its latency and to save one folder per agent run:
~/.hidagent/traces/20261012-005207/
├── steps.jsonl # every model call (prompt, raw reply, latency) and every