Install a signed iOS build on a real iPhone over the internet
Perfect for AI Agents and vibe coding remotely.
No TestFlight. No hosted storage. No waiting for processing.
Mac → Link / QR code → iPhone Install
remote-installer share ./MyAwesome.appRemote Installer validates the build, opens a temporary HTTPS link, and prints a QR code. Scan it with the iPhone camera, or open the page in Safari to install.
Important: Works with development and ad hoc builds. The target iPhone must already be included in the provisioning profile.
# Install cloudflared for quick tunnels
# It does NOT require Cloudflare account.
brew install cloudflared
# Install remote-installer
# with homebrew
brew install icodesign/tap/remote-installer
# or npm
npm install --global @icodesign/remote-installerFor a one-off run without installing a command globally, use the npm package:
npx --yes @icodesign/remote-installer share /path/to/MyApp.ipaThe Homebrew and npm distributions support macOS arm64 (Apple silicon) and macOS x86_64 (Intel). The command rejects other operating systems because it uses macOS iOS-signing tools.
Share an IPA:
remote-installer share /path/to/MyApp.ipaOr share a signed .app built for a real device:
remote-installer share [PATH_TO_APP_BUILD_OR_IPA]Remote Installer packages the .app as an IPA without re-signing it.
- Keep the command running.
- Open the link in Safari or scan the QR code with the iPhone camera.
- Tap Install.
- A temporary HTTPS install page and QR code
- Support for
.ipaand signed device.appbuilds - Validation before the build is exposed
- Live download progress in the terminal
- Automatic cleanup when sharing ends
- Optional expiry and download limits
- Cloudflare Quick Tunnel by default, or Tailscale Funnel for sensitive builds
Remote Installer distributes an existing build. It does not sign, re-sign, register devices, or make Simulator and App Store builds installable.
This repository includes a skill for coding agents:
npx skills add icodesign/remote-installerExample agent request:
Create a new build with latest changes for my iPhone, and give me the install URL with remote-installer.
remote-installer share MyApp.ipa \
--max-downloads 1 \
--expire-after 1hThe command exits when either limit is reached, after allowing an active download to finish.
| Option | Purpose |
|---|---|
--expire-after 30m |
Stop sharing after a duration |
--timeout 300 |
Stop sharing after a number of seconds |
--max-downloads 3 |
Stop after a number of downloads |
--no-qr |
Do not print the terminal QR code |
Use either --expire-after or --timeout, not both. Run remote-installer share --help for every option.
- The link is the credential. Anyone who receives it can install the build, and it can be forwarded.
- Use
--expire-afterand--max-downloadswhen sharing with someone else. - The build remains on your Mac rather than being uploaded for storage.
- With Cloudflare, TLS terminates at Cloudflare while the build is transferred.
- Stopping the command closes the tunnel and deletes Remote Installer's temporary copy.
| Problem | What to check |
|---|---|
| “Unable to Install” | The iPhone UDID is in the embedded profile, the profile is valid, and the app was rebuilt after registering the device. |
| Install button does nothing | Open the install page in Safari. Some third-party iOS browsers do not hand the install link to the system. |
cloudflared CLI was not found |
Run brew install cloudflared, or pass --cloudflared-bin /path/to/cloudflared. |
app is not an iphoneos device build |
Use Build/Products/Debug-iphoneos/, not Debug-iphonesimulator/. |
| Provisioning profile expired | Refresh signing in Xcode and rebuild. |
Most installation failures are signing or provisioning problems. Remote Installer can validate and distribute a build, but it cannot make an incorrectly signed build installable.