For people

Remote control: drive a phone from another iPhone or a browser

The daemon that serves agents also serves people. You get a live picture in a browser or the iOS app, and you can tap, swipe and type. With the app signed by a paid developer team, the phone can host its own control service, so no computer is needed. With a cloud relay added, you can reach it from any network.

Phone Use on an iPhone 17 remotely controlling another iPhone's Settings
An iPhone 17 driving another iPhone: the top bar shows the route (LAN / internet), latency and frame rate; below are Back, Home, Search and Keyboard.

Three ways to connect

🖥️ Hosted by a Mac

The phone is plugged into a Mac or on the Mac's Wi‑Fi. You drive it from the Mac's control page or from the iOS app. The picture is H.264, encoded on the phone.

📱 Self-hosted (local control)

Phone Use on the controlled phone runs the control service itself, so no Mac is needed at run time. Another phone on the same network connects to it directly.

🌐 Across networks (cloud relay)

The controlled phone dials out to a relay you deploy, and the controller reaches it through that relay from any network. The phone needs no open port and no VPN.

Install the app

The app is not in the App Store. You build and install it with your own developer team:

bash
$ iphone-use setup-app                    # the default instance's phone
$ iphone-use setup-app --instance i13     # another phone

Self-hosted: no computer needed

  1. Pair once: after installing, setup-app pairs the phone over USB and hands the pairing record to the app. After that, nothing at run time needs the Mac.
  2. Turn it on: on the controlled phone, open Phone Use › Settings › 本机控制 (Local control) › 启用本机控制 (Turn on local control), and allow the VPN configuration. Local control takes the one VPN slot iOS allows, so it cannot run alongside Tailscale or another VPN.
  3. Connect: tap 让其他设备连接 (Let other devices connect) to show a QR code, and scan it with Phone Use on the other phone.

Local control and the Mac's runner compete for the same automation session. To use local control, first run iphone-use setup pause --instance <name> on the Mac. To go back to the Mac, stop local control in the app, then run iphone-use setup resume.

Connect without touching the controlled phone

When both phones are connected to the Mac, one command connects the controller with no QR code:

bash
$ iphone-use setup-app --instance i13 --connect-to default --connect-only

Over USB, the Mac drops a one-time code into the controlled phone's app. The code is valid for 5 minutes. The Mac then opens the connection link on the controller, which asks once: tap 连接 (Connect).


Across networks: the cloud relay

Use the relay when the controlled phone is at home and you are out, for example on cellular. The relay only forwards traffic. Sign-in, pairing codes and device tokens are still checked by the daemon on the controlled phone.

text
controller ──https──▶ relay /p/<id>/…  ──WebSocket──▶ daemon on the controlled phone

Deploy your own relay

The relay is a Cloudflare Worker with one Durable Object per phone. It lives in the repository's relay/ directory. Deploy it with your own Cloudflare account:

bash
$ cd relay && npm install
$ npx wrangler login
$ $EDITOR wrangler.toml        # your own domain, or delete routes for workers.dev
$ npx wrangler deploy
$ curl https://<your relay>/   # → iphone-use relay

Connect a phone through it

bash
$ iphone-use setup-app --instance <controlled phone> --connect-to <controlling phone> \
    --connect-only --relay https://<your relay>

Once the controlled phone has the relay address, it keeps one outgoing connection open. When the controller is on the same Wi‑Fi, the app switches to a direct LAN connection and the status bar shows 局域网 (LAN). Away from that network, the app goes back through the relay and shows 外网 (Internet). A daemon on a Mac connects to the relay too when IPHONE_USE_RELAY_URL=https://<your relay> is set.

Cost and limits

FAQ

Why not Tailscale?

iOS allows only one VPN at a time, and local control already uses that slot. When a Mac hosts the phone, a VPN such as Tailscale still works for reaching the Mac.

The picture is black, but taps work?

Check the latency and frame rate in the status bar. A very low frame rate away from home usually means the controller's connection is too slow; it speeds up again on the LAN. If no picture appears at all, tap 重新加载画面 (Reload picture).

Who can connect to my phone?

Only a device that holds a one-time pairing code (the QR code, or --connect-to) or has paired before. The id in a relay address is random, and the relay pins the key the phone first presents, so nobody else can pose as that phone.

Next: How it works · Privacy & security.