How to Update vphone‑cli to the Latest Version: Complete Build Guide
To update vphone‑cli, pull the latest commits and submodules with git pull --rebase && git submodule update --init --recursive, refresh the host toolchain via make setup_tools, and rebuild the signed Swift binary using make build.
vphone‑cli is a Swift‑based command‑line tool for managing iOS virtual machines, maintained in the open‑source repository Lakr233/vphone‑cli. Because the project embeds private iOS toolchains (libimobiledevice, trustcache) and compiles a code‑signed release binary, updating requires rebuilding the entire development environment—not just pulling source changes.
Prerequisites for Updating
Before starting, ensure you have:
- Git with submodule support (for
.gitmodulesdependencies) - Xcode or Swift toolchain matching the
Package.swiftmanifest - Make and Homebrew (used by
scripts/setup_tools.shfor dependency resolution)
Step‑by‑Step Update Procedure
The canonical update workflow follows the build orchestration defined in the root Makefile. Execute these phases in order to keep the host tooling, Swift binary, and optional Custom Firmware (CFW) synchronized.
Pull the Latest Source Code
Synchronize the repository and its submodules. The project vendors components like trustcache and insert_dylib under scripts/repos/, controlled by .gitmodules.
git pull --rebase
git submodule update --init --recursive
The --recursive flag ensures nested dependencies are refreshed, which is critical when upstream changes affect the dynamic injection toolchain used by the CLI.
Refresh the Development Environment
Run the setup target to idempotently reinstall host dependencies. According to scripts/setup_tools.sh, this updates Homebrew packages, rebuilds submodule binaries from source, and synchronizes the Python virtual environment in .venv/ against requirements.txt.
make setup_tools
This target (defined at lines 46‑70 in Makefile) detects changes to requirements.txt and automatically upgrades pymobiledevice3, capstone, and other Python helpers used for USB communication with virtual iOS devices.
Rebuild the Signed Swift Binary
Compile the release binary and apply private entitlements. The build target (lines 5‑22 in Makefile) writes the current Git hash into sources/VPhoneBuildInfo.swift, executes swift build -c release, and signs the output with sources/vphone.entitlements.
make build
The resulting binary includes the embedded build identifier and maintains valid code signatures required for amfidont integration and VM management commands.
(Optional) Re‑bundle the macOS Application
If you use the GUI boot flow or the amfidont helper, package the binary into a .app bundle:
make bundle
The bundle target (lines 27‑36) assembles the macOS application structure, ensuring the signed executable retains its entitlements when launched from Finder or via open.
(Optional) Update the Custom Firmware
When the update includes kernel patches or root filesystem changes, reinstall the CFW on the VM disk image. The Makefile provides four installation targets at lines 78‑99:
make cfw_install– Standard firmware with base patchesmake cfw_install_dev– Development build with verbose kernel loggingmake cfw_install_jb– Jailbreak‑enabled firmware for unsigned code executionmake cfw_install_exp– Experimental features (requiresSPOOF_BUILD=1)
make cfw_install_jb
This invokes scripts/cfw_install_host.sh to mount the VM disk and atomically write the patched system image, preserving user data while updating the operating system stack.
Complete Automated Update Script
Combine all steps into a single bash routine for unattended updates:
#!/usr/bin/env bash
set -euo pipefail
# Sync source and submodules
git pull --rebase
git submodule update --init --recursive
# Refresh toolchain and Python environment
make setup_tools
# Build and sign the Swift binary
make build
# Package for GUI usage (optional)
make bundle
# Update jailbreak firmware (optional)
make cfw_install_jb
# Boot with the new version
make boot
Save this as update_vphone.sh, mark it executable with chmod +x, and run it from the repository root.
Troubleshooting Update Issues
Submodule merge conflicts: If git submodule update fails withmerge conflicts, manually reset the submodule to the upstream commit recorded in the main repository:
cd scripts/repos/trustcache
git reset --hard origin/main
cd -
git submodule update --init --recursive
Python environment drift: When pymobiledevice3 reports API errors after an update, force‑recreate the virtual environment:
rm -rf .venv
make setup_tools
Code‑signing failures: Ensure the entitlements file at sources/vphone.entitlements has not been modified, and that your signing certificate is valid in Keychain Access.
Summary
- Pull the latest code with
git pull --rebaseandgit submodule update --init --recursiveto fetch source and dependency changes. - Refresh the host toolchain by running
make setup_tools, which updates the Python venv and rebuilds submodule binaries liketrustcache. - Rebuild the signed CLI using
make build, which compiles the Swift source and applies entitlements fromsources/vphone.entitlements. - Re‑bundle the macOS app with
make bundleif you require GUI launching oramfidontsupport. - Re‑install the CFW only when necessary via
make cfw_install_<variant>(jb, dev, or exp) to update the VM’s operating system. - Boot the VM with
make bootto verify the updated binary and firmware.
Frequently Asked Questions
Do I need to reinstall the CFW every time I update vphone‑cli?
No. Reinstall the Custom Firmware only when the release notes indicate changes to scripts/cfw_install_host.sh, kernel patches, or root filesystem layouts. Routine CLI updates that modify only the Swift source require only make build to refresh the signed binary while preserving the existing VM disk image.
Why does make setup_tools reinstall Python packages?
The setup_tools target is idempotent; it compares the current .venv/ state against requirements.txt and upgrades packages like pymobiledevice3 and capstone when the manifest changes. This ensures the Python helpers remain compatible with the latest iOS debugging protocols without manual pip invocations.
How do I update only the Python environment without rebuilding Swift?
Activate the virtual environment and upgrade dependencies manually: source .venv/bin/activate && pip install -r requirements.txt --upgrade. Alternatively, running make setup_tools skips the Swift build phase and only refreshes the host tooling and Python venv, making it safe to run independently of make build.
What is the difference between the CFW variants (jb, dev, exp)?
The jb (jailbreak) variant patches the kernel to allow unsigned code execution and root access inside the VM. The dev variant adds verbose logging and debug symbols to assist core development. The exp (experimental) variant activates bleeding‑edge features that require the SPOOF_BUILD=1 environment variable, typically used for testing unmerged patches.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →