Skip to content

Source / Binary ​

Run it directly as a regular user, without Docker. You need the system usbmuxd (udev starts it when the phone is plugged in).

Install ​

Prebuilt binary ​

After a release, Releases has Linux x86_64 and aarch64 archives (glibc 2.34 or later: Debian 12, Ubuntu 22.04 and newer):

bash
sudo apt install usbmuxd
tar xzf iphone-control-v*-x86_64*.tar.gz   # on ARM, aarch64 instead of x86_64 (see uname -m)
install -Dm755 iphone-control-*/iphone-control ~/.cargo/bin/iphone-control

~/.cargo/bin matches the systemd unit below; if you put it elsewhere, change ExecStart in the unit too.

Build from source ​

You need Rust 1.88+ (rustup) and a C compiler:

bash
sudo apt install build-essential git usbmuxd
git clone https://github.com/Derrors/iphone-control && cd iphone-control
cargo install --path apps/iphone-control --locked   # installs ~/.cargo/bin/iphone-control

Run ​

bash
iphone-control daemon       # in the foreground
iphone-control setup        # setup wizard, in a second terminal
iphone-control mcp-config   # prints the MCP registration command

Only the systemd service below reads ~/.config/iphone-control/env. In the foreground, load it first: set -a; . ~/.config/iphone-control/env; set +a.

Keep it running: systemd user service ​

The unit is deploy/iphone-control.service in the repository (also included in the binary archives):

bash
mkdir -p ~/.config/systemd/user ~/.config/iphone-control
cp deploy/iphone-control.service ~/.config/systemd/user/
cp .env.example ~/.config/iphone-control/env    # proxy, notifications, … (env.example in the binary archive)
systemctl --user daemon-reload && systemctl --user enable --now iphone-control
loginctl enable-linger "$USER"                  # start at boot without logging in

Differences from Docker ​

DockerSource (regular user)
Data directory./data~/.local/share/iphone-control
Control socket/run/iphone-control/ctl.sock in the container$XDG_RUNTIME_DIR/iphone-control/ctl.sock
usbmuxdstarted by the daemonthe system service
Pairing recordslockdown/ in the data directorythe system's /var/lib/lockdown
Unsigned WDAshipped in the imagedownloaded before the first signing (sha256-checked)
Configuration.env~/.config/iphone-control/env

WARNING

  • Run the daemon, the CLI and the MCP server as the same user.
  • Don't run it alongside the Docker version against the same phone. With a system usbmuxd installed, sudo systemctl mask usbmuxd before going back to Docker.

Upgrade ​

bash
git pull && cargo install --path apps/iphone-control --locked   # or drop in the new binary
systemctl --user restart iphone-control

Released under the MIT License · Not affiliated with Apple Inc.