iCTRL

Runs a long-lived XCUITest on a real iPhone and exposes an HTTP API so agents can tap, type, read the UI and take screenshots. Meant for testing on your own devices.

View on GitHub ↗
Stars
★ 528
Last commit
19 Oct 2026
Maintenance
Active
Licence
Apache-2.0
Category
Other
GitHub
OpenMinis/iCTRL

Overview

iCTRL is an iOS automation service built on XCUITest that lets AI agents control a real iPhone over the network. It runs on the phone as a UITest runner that never stops and serves encrypted JSON-RPC requests for tapping, typing, swiping, reading the view tree and taking screenshots. It is designed to explain itself to an agent, which only needs the device's address to get started. The author says it is meant for automated testing and research only.

Features

  • Serves its own operating manual and method schema so an agent can learn how to use it
  • Every response includes a hint and every error says what to do next
  • Taps, types, swipes, launches apps, reads the screen's view tree and takes screenshots
  • Finds the phone on the local network or over AWDL from a Mac
  • Comes with a static CLI and a Python client downloaded from the device
  • Includes an agent skill (ictrl-phone-control) for driving it

Requirements

  • An iPhone with Developer Mode turned on (iOS 16 or later)
  • A free Apple ID with SideStore, or a paid developer account to sign the runner
  • The Developer Disk Image mounted after each reboot, using Xcode, StikDebug or the iCTRL app

Install

  1. Sign and install the runner on your iPhone, using SideStore, the included sign-ipa.sh script or Xcode

  2. Mount the Developer Disk Image, then tap iCTRLUITests-Runner on the Home Screen to start the server

  3. Find the device from your computer

    python3 ictrl_rpc.py scan

Example

Ask your agent to open a shopping app on the phone, search for a product and report the price.

Works with

Claude CodeCodex

Listed in

swiftskills.dev

Read the code before you install anything. SwiftAgents doesn't review or endorse the tools listed here. Active: a commit in the last 90 days. Slowing: last commit within the past year. Stale: older than a year, or archived.

More in this category