Repo of the Day
onehumanbeing/esp32-iphone-agent
Published: Oct 15, 2026
Open repository ↗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
Summary
ESP32 iPhone Agent lets a vision model drive a real iPhone using a small ESP32-S3 board plugged into the phone, with no Mac, developer account, or jailbreak required at run time. The board acts as both an AirPlay receiver (eyes) and a USB HID mouse and keyboard (hands), while an iPhone app runs the model and decides what to do. The target is engineers experimenting with phone-driving agents on a roughly $7 board.
What it is useful for
- Building AI agents that interact with iOS apps through screen observation and pointer/keyboard input, similar to computer-use agents but on a phone
- Prototyping automation on a real device without a tethered computer, jailbreak, or paid Apple Developer account
- Testing any OpenAI-compatible vision endpoint (vLLM, SGLang, llama.cpp, Ollama, cloud APIs) against live iOS UI
- Reviewing runs: every run is stored on the phone and can be replayed step by step with taps and swipes drawn on top
- A self-contained reference for BLE-based device control, an AirPlay receiver, and USB HID emulation on ESP32-S3
How engineers can use it
Hardware documented in the README: a Seeed Studio XIAO ESP32S3 (plain, 8 MB PSRAM, about $7), an iPhone on iOS 18 or later with cellular data, and an OpenAI-compatible vision endpoint. A Mac with Xcode is only needed once, to flash the board and build the app.
Setup steps from the README:
- Flash the board: install
arduino-cli, the ESP32 core 3.3.x, and[email protected], then runhardware/flash.sh(the script applies the BLE buffer sizes inhardware/hid_bridge/nimble_cfg.h). - Build the app: copy
ios/Config/Local.xcconfig.exampletoios/Config/Local.xcconfig, setDEVELOPMENT_TEAMandIA_BUNDLE_ID, openios/IPhoneAgent.xcodeprojin Xcode, and run the IPhoneAgent scheme on the iPhone. A free Apple ID can sign it, but the app must be re-signed every 7 days. - In-app setup walks through pairing over Bluetooth, joining the board's hotspot and enabling Screen Mirroring to ESP32 Agent, turning on AssistiveTouch, and entering a model endpoint and API key (stored in the Keychain).
- Type a goal such as "Open Settings and go to Wi-Fi" and press Start. The agent runs in the background; the Dynamic Island shows progress and a stop button. Siri, Shortcuts, widgets, and Control Center can launch saved tasks.
Prompts are plain text in prompts/ and bundled with the app, so planner and actor behavior can be edited and rebuilt.
Documented limitations: BLE bandwidth caps mirroring at about 480×1040 and ≤5 fps, so each step takes a few seconds; iOS won't mirror passcode, Apple Pay, or DRM screens, and mirroring stops when the phone locks; the phone's Wi-Fi is the board's hotspot during runs, so the model is reached over cellular data; keyboard input is ASCII only; landscape apps are not yet supported. The firmware is MIT-licensed, but hardware/hid_bridge/src/airplay/ is GPL-3.0 (ported from UxPlay), which makes the combined firmware binary GPL-3.0. The app also uses a private iOS API (suspend), which the README notes is fine for a self-built app but would need replacing before App Store distribution.