ESP32 iPhone Agent: 약 7달러짜리 ESP32를 “손”, AirPlay 미러링을 “눈”으로 삼아 시각 모델이 진짜 iPhone을 조작한다
onehumanbeing/esp32-iphone-agent는 MIT 라이선스 Python 프로젝트로 2026년 10월 11일에 만들어졌고 작성 시점에 별이 약 1,500개다. AirPlay 미러링으로 iPhone 화면을 컴퓨터로 보내고, 폰에 꽂은 ESP32-S3가 USB 마우스와 키보드로 동작하며, OpenAI 호환 시각 모델이 계획하고 조작한다. 폰에 아무것도 설치하지 않고 Mac, Xcode, 개발자 계정도 필요 없다. 신뢰성 수치는 제시되지 않았고 데모는 작성자가 보여 준 것이다.
onehumanbeing/esp32-iphone-agent는 Python으로 작성된 오픈소스 프로젝트로 MIT 라이선스입니다. 2026년 10월 11일에 만들어졌고 마지막 푸시는 10월 13일이며, 작성 시점에 별 약 1,517개와 포크 194개가 있습니다. 소개는 한 줄입니다. 약 7달러짜리 ESP32로 AI 모델이 진짜 iPhone을 쓰게 하며 Mac도 개발자 계정도 탈옥도 필요 없다는 것입니다. 데모 영상과 소식은 작성자의 X 계정과 YouTube에 있습니다. README에는 예가 둘 있습니다. 첫째는 “화이트보드를 열고 웃는 얼굴을 그려라”로, 에이전트가 앱을 검색해 열고 이어진 획으로 얼굴을 그립니다. 둘째는 “매일 반복되는 오전 7시 알람을 설정하고 저장하라”로, 시계를 열고 시간 휠에 0700을 입력하고 반복 아래의 요일을 몇 번의 탭으로 한꺼번에 체크한 뒤 저장합니다. 각 단계의 스크린샷은 탭이나 획이 표시된 채 “단계 벽”에 남습니다.
왜 이 길을 택했을까요? README는 대부분의 iPhone 자동화가 XCTest나 WebDriverAgent로 폰을 구동한다고 설명합니다. 그러려면 Mac, Xcode, 서명된 보조 앱, Apple 개발자 계정이 필요하고 무료 계정의 서명은 7일마다 만료됩니다. 이 프로젝트는 사람이 쓰는 것과 같은 경로, 곧 화면과 포인터를 쓰므로 폰에는 아무것도 설치할 필요가 없습니다. README의 비교표에 따르면 이 방식은 개발자 계정과 Xcode가 필요 없고, Mac이나 Linux에서 돌아가고, 폰에 앱을 설치하지 않으며, 픽셀만 보기 때문에 게임을 포함한 모든 앱에서 동작합니다. XCTest류 도구는 개발자 계정과 Xcode가 필요하고 Mac에서만 돌며 테스트 러너 앱이 필요하고 대체로 접근성 트리에 보이는 범위에 달려 있습니다. 기술적으로는 세 부분으로 이루어집니다. 눈은 AirPlay 미러링으로, iPhone이 화면을 컴퓨터의 UxPlay로 미러링하고 GStreamer 파이프라인이 스트림을 에이전트와 웹 페이지용 JPEG 프레임으로 바꿉니다. 손은 USB HID 브리지로, 폰에 꽂은 ESP32-S3가 표준 USB 마우스와 키보드로 인식됩니다. iOS 보조 터치를 켜 두면 마우스가 둥근 화면 포인터를 움직이고 클릭은 탭, 드래그는 스와이프가 됩니다. 보드는 Wi-Fi로 컴퓨터에 연결되어 move, click, type 같은 간단한 줄 명령을 실행하고 ok나 err로 답하며, 모든 로직은 컴퓨터에 남습니다. 두뇌는 계획자와 실행자입니다. 계획자가 목표와 현재 화면으로 짧은 계획을 쓰고, 실행자가 새 스크린샷마다 탭, 스와이프, 경로 그리기, 입력, 키 누르기, 홈으로 이동, 종료 중 하나를 고릅니다. 두 역할은 같은 모델이어도 되며 이미지를 받는 OpenAI 호환 모델이면 클라우드 API든 직접 돌리는 모델이든 됩니다.
이 길을 가능하게 하는 것은 닫힌 루프입니다. 포인터가 상대 이동이므로 서버가 위치를 추적합니다. 탭하기 전에 포인터를 흔들어 미러링 화면에서 찾고 어긋남을 보정하며 쓰는 동안 보정을 다듬습니다. 각 동작 뒤에는 화면이 실제로 바뀌었는지 확인해 모델에 알려 주므로, 놓친 탭은 알아채고 다시 시도하며 잘못된 상태 위에 쌓이지 않습니다. 같은 동작이 반복되면 다시 계획하고 연결이 끊기거나 응답이 잘못되어도 복구할 수 있습니다. 웹 UI에는 클릭이 탭, 드래그가 스와이프가 되는 실시간 폰 화면, 실시간 로그, 각 단계의 스크린샷과 모델의 추론을 담은 단계 벽, 긴급 정지가 있습니다. Esc를 눌러도 에이전트가 멈추고 포인터가 풀립니다. HIDAGENT_DEBUG=1을 켜면 실행마다 모든 모델 호출과 동작을 담은 steps.jsonl과 각 호출이 본 스크린샷이 든 폴더도 저장됩니다. 하드웨어 요구는 적습니다. ESP32-S3 보드 한 장이 필요합니다. 작성자는 핀 헤더가 납땜되지 않은 Seeed Studio XIAO ESP32S3 일반형을 테스트했으며 Sense 카메라판도 Plus도 아니고 Seeed에서 약 7달러이며, USB-C 포트가 S3의 기본 USB에 연결된 다른 ESP32-S3 보드도 됩니다. USB-C iPhone은 바로 꽂고 Lightning 모델은 Lightning-USB 카메라 어댑터가 필요합니다. 컴퓨터는 폰과 같은 네트워크의 macOS나 Linux이며 UxPlay와 서버를 실행합니다. 완전히 로컬로 돌리고 싶다면 작성자의 개발 구성은 NVIDIA DGX Spark 두 대를 텐서 병렬(TP=2)로 묶어 nvidia/Qwen3.8-Flash-Next-NVFP4를 서빙하며 사고 모드를 끈 상태에서 동작당 약 1.3초, 계획당 약 2초입니다.
독자에게 알릴 점이 몇 가지 있습니다. 첫째, 이 모두는 프로젝트 자체의 설명과 데모입니다. README에는 작업 성공률, 실패율, 많은 작업에 대한 평가가 없으므로 데모를 신뢰성의 증거로 받아들이지 마세요. 둘째, 에이전트가 폰 전체를 조작하므로 이메일, 은행, 메신저 앱에 닿을 수 있고 클라우드 모델에서는 모든 스크린샷이 모델 제공자에게 갑니다. 테스트용 폰을 쓰고 중요한 계정에는 로그인하지 않으며 긴급 정지를 바로 누를 수 있게 두세요. 셋째, iPhone 자동화의 문턱을 낮추는 동시에 물리적 접속으로 폰을 조종하는 문턱도 낮춥니다. 테스터에게는 편리하고 보안 담당자에게는 고려해야 할 위험입니다. 전체적으로 발상이 영리하고 시험해 볼 만한 작은 프로젝트이지만 아직 매우 초기 단계입니다.
Sources
FAQ
어떻게 “보고” “움직이나요”?
눈은 AirPlay 미러링입니다. 폰이 화면을 컴퓨터의 UxPlay로 미러링하고 GStreamer 파이프라인이 스트림을 에이전트와 웹 페이지용 JPEG 프레임으로 바꿉니다. 손은 USB HID 브리지입니다. 폰에 꽂은 ESP32-S3가 표준 USB 마우스와 키보드로 인식되고, iOS 보조 터치를 켜 두면 마우스가 화면의 포인터를 움직여 클릭은 탭, 드래그는 스와이프가 됩니다. 보드는 Wi-Fi로 컴퓨터에 연결해 move, click, type 같은 간단한 줄 명령만 실행하며 모든 로직은 컴퓨터에 있습니다.
정확한 위치를 누르는 것은 어떻게 보장하나요?
포인터가 상대 이동이므로 서버가 위치를 추적합니다. 탭하기 전에 포인터를 흔들어 미러링 화면에서 찾고 어긋남을 보정하며 쓰는 동안 보정을 다듬습니다. 각 동작 뒤에는 화면이 실제로 바뀌었는지 확인해 모델에 알려 주므로 놓친 탭은 알아채고 다시 시도하며 잘못된 상태 위에 쌓이지 않습니다. 같은 동작이 반복되면 다시 계획하고, 연결이 끊기거나 응답이 잘못되어도 복구합니다. 두뇌는 두 역할입니다. 계획자가 목표와 화면으로 짧은 계획을 쓰고, 실행자가 새 스크린샷마다 다음 동작을 고릅니다. 두 역할은 같은 모델이어도 됩니다.
어떤 하드웨어가 필요하고 위험은 무엇인가요?
ESP32-S3 보드가 필요합니다. 작성자는 Seeed Studio XIAO ESP32S3 일반형을 테스트했고 약 7달러입니다. USB-C iPhone은 바로 꽂고 Lightning 모델은 어댑터가 필요합니다. 컴퓨터는 폰과 같은 네트워크의 macOS나 Linux입니다. 시각 모델은 OpenAI 호환 API라면 클라우드든 로컬이든 됩니다. 위험으로는, 폰 전체를 조작하는 에이전트는 모든 계정에 닿을 수 있습니다. 웹 페이지에 긴급 정지가 있고 Esc도 됩니다. 클라우드 모델에서는 스크린샷이 모델 제공자에게 갑니다. README에 성공률 평가는 없으므로 데모는 작성자의 쇼케이스로 보세요.