Skip to content

Releases: OpenMinis/iCTRL

iCTRL 1.98.12

Choose a tag to compare

@wsvn53 wsvn53 released this 15 Oct 04:05
d88bbf0

An AI-friendly iOS/iPadOS automation service. Tell your agent "My iPhone is running iCTRL at :8200 — figure out how to drive it." and it reads the on-device manual and takes it from there. Works with any agent that can make HTTP requests: OpenClaw, Hermes, Minis, Claude Code, Codex and others.

Downloads

Which IPA do I need?

File Needed? What it is
iCTRLUITests-Runner.ipa Required The automation engine. It serves the JSON-RPC API that agents and clients call, and must be running.
iCTRL.ipa Optional A companion app for tasks on the phone itself:
• mount the Developer Disk Image without a Mac, and remount it after a reboot
• start and stop the runner
• choose who can reach the runner (this device only / LAN / LAN + nearby)
• see and revoke authorized clients
• read the runner's log live

Skip iCTRL.ipa if you mount the Developer Disk Image with Xcode or StikDebug, and manage the runner from its notification or a computer. With a free Apple ID you get three sideloaded apps, and SideStore uses one of them. Install StikDebug or the iCTRL app alongside the runner, not both.

Both IPAs are unsigned for distribution (ad-hoc, no provisioning profile). Sign them when you install:

  • Free Apple ID: the latest SideStore signs and installs them. Older SideStore releases skip the nested .xctest, and the runner then crashes on launch.
  • Paid account: Scripts/sign-ipa.sh -i iCTRLUITests-Runner.ipa

The runner also needs the Developer Disk Image mounted (Xcode, StikDebug or the iCTRL app). The README covers the whole setup.

What's new since 1.97.1

Nearby discovery: no address to type

  • Reach the phone without an address. Turn on 📡 Nearby Discovery from the runner's notification or the iCTRL app (it needs Remote Access). Clients can then find the phone:
    • on the LAN, from any OS;
    • from a Mac over Apple peer-to-peer Wi-Fi (AWDL), with no shared network at all. The phone only needs Wi-Fi switched on, not joined to anything.
  • New client commands: python3 ictrl_rpc.py scan lists discovered phones, and --nearby "<name or id>" replaces --host. The first call pairs with the phone (approve once on the phone).
  • Strict exposure:
    • Nothing is announced on the network unless nearby discovery is on.
    • The AWDL listener accepts peer-to-peer connections only, and the main listener refuses them.
    • Nearby discovery can be switched on only from the phone itself (notification, iCTRL app or USB).
  • Self-healing:
    • Advertising follows Wi-Fi off and on, and recovers if the interface is recreated.
    • A failed listener is rebuilt.
    • The notification says why nearby discovery isn't ready yet (turn on Wi-Fi, allow Local Network).

Who can reach the phone, at a glance

  • The status notification's first line shows one of: 🔒 This device only, 🌐 LAN reachable, or 📡 Nearby discoverable.
  • The iCTRL app has a Visibility menu: 🟢 This device only · safe / 🟡 LAN / 🟡 LAN + nearby.
  • LAN addresses are real interfaces only. VPN or proxy tunnel addresses such as 198.18.0.1 are no longer shown as the phone's address.

Pairing and keys

  • Every pairing is approved on the phone. The "trusted for 10 minutes" shortcut is gone.
  • Limits on requests:
    • An unanswered request is refused after 60 s.
    • Only one request waits at a time, with a 15 s cooldown after a refusal.
    • Requests from the phone itself have their own slot, so a remote caller can't lock them out.
  • Check the key. The prompt shows a key fingerprint that the client also prints; allow only if they match.
  • One key per device. Clients store keys per device, so a phone paired once works over USB, the LAN and nearby without pairing again. Keys stored under an address by older clients are picked up automatically.
  • Local Network permission. The runner asks for it at launch and reports it. The iCTRL app warns when it's missing; without it, nearby discovery can't work even though LAN clients may still connect.

iCTRL app

  • Authorized Clients: every key holder, where each last connected from (this device / USB, LAN, nearby, VPN), revoke one or all others.
  • Runner Logs: the runner's log, live, with pause, refresh and filter.
  • Visibility menu (above), and a warning when the runner lacks Local Network access.
  • Share a pairing file to iCTRL from Files, Mail, AirDrop or a chat app when the picker can't reach it. iCTRL confirms when it's stored, or says why it was refused.

Clients

  • Python client:
    • Standard library only. LAN pairing no longer needs pip install cryptography.
    • Never sends iCTRL requests through an http_proxy.
    • If macOS Local Network privacy refuses the process, it relays nearby connections through the system nc.
  • C CLI: gets the same nearby support when built on macOS. The Linux static binary is rebuilt.

Server and API

  • GET /whoami and an X-ICTRL-Device header on every response identify the device.
  • config adds nearby_discovery and device_name, and reports nearby status and LAN addresses. Each client's last address and source appear in its session entry.
  • config now validates every parameter before changing any.
  • A change that restarts the listener replies first instead of returning an empty response.
  • Read-only polling (logs, plain config) no longer fills the log.

Known limitations

  • Nearby discovery over AWDL needs macOS on the client side. A phone whose screen is off may stop being discoverable over AWDL, as with AirDrop.
  • With nearby discovery on, iOS also announces the phone's own host name on the LAN, which often contains its owner's name.
  • Endpoints that need no key (/schema, /skill, /remote, /whoami, /pair) also answer over AWDL, and the screen stream is not encrypted on any channel.

Full details: #3.

SHA-256

d28fcb4775885a7161e8c7aa9f247aeb42fe1af1c7fcfc5ce1bbdb1b07b442f2  iCTRLUITests-Runner.ipa
7d9ceaad8eeb486e67d81a688e661f2278113d4ba4f7d3d73cff2f9973881ac7  iCTRL.ipa

iCTRL 1.97.1

Choose a tag to compare

@wsvn53 wsvn53 released this 13 Oct 11:33

An AI-friendly iOS/iPadOS automation service. Tell your agent "My iPhone is running iCTRL at :8200 — figure out how to drive it." and it reads the on-device manual and takes it from there. Works with any agent that can make HTTP requests: OpenClaw, Hermes, Minis, Claude Code, Codex and others.

Downloads

File What it is
iCTRLUITests-Runner.ipa The automation engine — required.
iCTRL.ipa Optional host app: mounts the Developer Disk Image on the device and starts the runner. Use it or StikDebug.

Both are unsigned for distribution (ad-hoc, no provisioning profile). Sign them when you install:

  • Free Apple ID: the latest SideStore signs and installs them. Older SideStore releases skip the nested .xctest, and the runner then crashes on launch.
  • Paid account: Scripts/sign-ipa.sh -i iCTRLUITests-Runner.ipa

The runner also needs the Developer Disk Image mounted (Xcode, StikDebug or the iCTRL app). The README covers the whole setup.

What's new since 1.97.0

iCTRL app

  • The pairing-file import picker now accepts real pairing files. A pairing record is an XML property list, which the picker greyed out before, so it could not be selected when mounting the Developer Disk Image on the device. Thanks to @wynx1123 (#1).

Runner

  • No functional changes; only the version number moves to 1.97.1.

For the browser control page changes (full screen, floating quick controls, Home Screen app), see 1.97.0.

SHA-256

2d938136f7b4c1a4dbe636d819d311261e7b0af5e3d1f0e01fd8395596cdc652  iCTRLUITests-Runner.ipa
e74918d6cd2043804bb7737f807f32a8693f5598557c763f017527f6dadb872e  iCTRL.ipa

iCTRL 1.97.0

Choose a tag to compare

@wsvn53 wsvn53 released this 13 Oct 03:08

An AI-friendly iOS/iPadOS automation service. Tell your agent "My iPhone is running iCTRL at :8200 — figure out how to drive it." and it reads the on-device manual and takes it from there. Works with any agent that can make HTTP requests: OpenClaw, Hermes, Minis, Claude Code, Codex and others.

Downloads

File What it is
iCTRLUITests-Runner.ipa The automation engine — required.
iCTRL.ipa Optional host app: mounts the Developer Disk Image on the device and starts the runner. Use it or StikDebug.

Both are unsigned for distribution (ad-hoc, no provisioning profile). Sign them when you install:

  • Free Apple ID: the latest SideStore signs and installs them. Older SideStore releases skip the nested .xctest, and the runner then crashes on launch.
  • Paid account: Scripts/sign-ipa.sh -i iCTRLUITests-Runner.ipa

The runner also needs the Developer Disk Image mounted (Xcode, StikDebug or the iCTRL app). The README covers the whole setup.

What's new since 1.96.1

This release is about the browser control page, GET /remote: it now works well from another phone, not only from a desktop browser. The API and the iCTRL app are unchanged.

Plays on iPhone

  • The stream now plays in Safari on iPhone (iOS 17.1 and later). Before, the page stopped with "browser lacks MediaSource".

Full screen

  • A full-screen mode that leaves only the picture and a floating ball, entered from the button at the top right, the ball's menu or the Display panel.
  • In Safari on iPhone (iOS 26 and later) the picture covers the whole screen, running beneath the status bar and Safari's floating toolbar.
  • Add to Home Screen opens the page as a web app with no browser bars, straight into full screen, with the iCTRL icon. The same icon is the page's favicon.
  • A picture setting for full screen: fill the screen (default), whole picture, or stretch. Touches land where the picture is drawn in every mode.
  • Action results (tap, drag, home…) are not shown in full screen, so the view looks like the phone itself. Failures still are.

Controls

  • A translucent floating ball replaces the settings button on phones. Drag it anywhere; it snaps to a side, remembers its place and darkens over a light part of the picture.
  • Tapping the ball opens quick controls: Home, Type, Shot, Open app, Connect/Stop, Full screen, More.
  • A Display panel to show or hide the device and connection badges, the device health panel and the status bar.
  • Screenshots open in a preview with a Download button, at the device's resolution.
  • Dragging sideways on the picture no longer also triggers the browser's back/forward swipe.

Fixes

  • The connection status no longer stays on "waiting for first frame" while the picture is already playing.
  • The dimmed backdrop behind the controls sheet now appears.
  • Screenshots were JPEG data saved with a .png name; the file type now matches.
  • The page is served with Cache-Control: no-cache, so an installed web app picks up the page of an updated runner.

Good to know

  • In a Safari tab, taps on the strip under Safari's toolbar go to Safari. Use the Home Screen app, or the "whole picture" setting, when you need the bottom edge of the phone.
  • A Home Screen web app keeps its own storage, so it pairs once more the first time.

SHA-256

f24bee7e60d5ee6f4ee81dd1b30865d8e31106f53ea65ca26a960cd81d422d5a  iCTRLUITests-Runner.ipa
788d26cccbd8a62856914240d2325f48f890c30a45daf18b7d8a932c03123e9a  iCTRL.ipa

iCTRL 1.96.1

Choose a tag to compare

@wsvn53 wsvn53 released this 11 Oct 15:46

An AI-friendly iOS/iPadOS automation service. Tell your agent "My iPhone is running iCTRL at :8200 — figure out how to drive it." and it reads the on-device manual and takes it from there. Works with any agent that can make HTTP requests: OpenClaw, Hermes, Minis, Claude Code, Codex and others.

Downloads

File What it is
iCTRLUITests-Runner.ipa The automation engine — required.
iCTRL.ipa Optional host app: mounts the Developer Disk Image on the device and starts the runner. Use it or StikDebug.

Both are unsigned for distribution (ad-hoc, no provisioning profile). Sign them when you install:

  • Free Apple ID: the latest SideStore signs and installs them. Older SideStore releases skip the nested .xctest, and the runner then crashes on launch.
  • Paid account: Scripts/sign-ipa.sh -i iCTRLUITests-Runner.ipa

The runner also needs the Developer Disk Image mounted (Xcode, StikDebug or the iCTRL app). The README covers the whole setup.

Highlights since 1.32.0

  • Settle-aware actions: taps, scrolls, typing and open_url wait until the screen stops changing and report what changed, ignoring motion the action didn't cause (running animations, video, Picture-in-Picture).
  • Bounded accessibility work: element lookups and taps by ref use capped tree walks, so slow or busy apps can no longer stall the UI queue.
  • Reading screens: collect reads a long list in one call and switches to OCR when the tree is thin; page_source enhanced:true adds text drawn in images.
  • Screen-state flags: system alerts, overlays, loading indicators, login walls, anti-bot checks and promotional popups are reported with each read; refs refuse to act on a screen that has changed.
  • Smoother remote control page (GET /remote): screen capture is several times faster, the stream plays with low latency up to 30 fps, and the page supports horizontal swipes, long press, and right-click for Home.
  • Runner home-screen icon.
  • iCTRL app: mounts the cryptex Developer Disk Image on iOS 26.4 and later, detects the LocalDevVPN tunnel by actually connecting through it, and checks network permissions on first launch.

SHA-256

17c9cdf84ad85306624a806ecf1866c602043b5e0207e139accc1d085f716b63  iCTRLUITests-Runner.ipa
b9df924ca13d80dcdc8628edc14142b0c3b3c358417f5ad1fd5656b4116556dc  iCTRL.ipa

iCTRL 1.32.0

Choose a tag to compare

@wsvn53 wsvn53 released this 09 Oct 03:33

An AI-agent-friendly iOS automation service. Tell your agent "My iPhone is running iCTRL at :8200 — figure out how to drive it." and it reads the on-device manual and takes it from there.

Downloads

File What it is
iCTRLUITests-Runner.ipa The automation engine — required.
iCTRL.ipa Optional host app: mounts the Developer Disk Image on the device and starts the runner. Use it or StikDebug.

Both are unsigned for distribution (ad-hoc, no provisioning profile). Sign them when you install:

  • Free Apple ID: the latest SideStore signs and installs them. Older SideStore releases skip the nested .xctest, and the runner then crashes on launch.
  • Paid account: Scripts/sign-ipa.sh -i iCTRLUITests-Runner.ipa

The runner also needs the Developer Disk Image mounted (Xcode, StikDebug or the iCTRL app). The README covers the whole setup.

Highlights

  • Faster: synthesized taps (~280ms median). Visible-screen reads under 1s even on long feeds. On-device OCR when the accessibility tree is empty.
  • Reliable on busy and backgrounded apps: queries against an app that has left the screen are refused immediately instead of stalling the UI queue. Abandoned calls can no longer pile up and get the runner killed for CPU use.
  • Better element targeting: find_element prefers on-screen matches and reports visibility and alternatives. scroll_to_element drags straight to known positions and says when an element isn't in the view at all.
  • Controlled from notifications: long-press to approve pairing, toggle remote access, or stop the server.
  • Builds from a fresh clone with make ipa and nothing but Xcode and XcodeGen.
  • Now licensed under Apache-2.0 (previously AGPL-3.0).

SHA-256

9961e8146fe5f447fad9ec07768fe77682b4dfc47c309a01eaa210e80bf3038d  iCTRLUITests-Runner.ipa
387f141d4fc160b5d3ff40d7d337d6c16874513ccb575e64ad52a121660a3959  iCTRL.ipa