JIT without myths
What apps using just-in-time compilation need on iOS 16, 17, 18, 26, and during the iOS 27 transition.
JIT, just-in-time compilation, lets an app create executable machine code while running. Emulators, virtual machines, language runtimes, and some LiveContainer modes rely on it. Most sideloaded apps do not.
Signing an app and enabling JIT are separate operations. An app may install perfectly and still lack JIT.
Requirements that recur
- The target app normally needs
get-task-allow. - Developer Mode must be enabled.
- A debugger or debug service attaches to the target process.
- Modern on-device methods need a valid pairing record and local tunnel/VPN path.
- The helper, OS release, device chip, and target app must agree.
Version map
| OS family | Typical current direction |
|---|---|
| iOS/iPadOS 16 and below | AltJIT and older debugger workflows are comparatively straightforward |
| 17.0 through 17.3 | Newer DeviceDiscovery/RSD changes complicate older workflows; use maintained computer-server guidance |
| 17.4 through 18.x | StikDebug and current SideStore methods can use on-device pairing and LocalDevVPN |
| 26.x | Helper support is not enough; target apps may need script/protocol updates for executable regions |
| 27 RC | Treat support as experimental until public release and app-specific confirmation |
Current tools
- AltJIT: integrated with AltStore; macOS is the supported iOS 17 path in AltStore's current documentation (AltStore).
- SideJITServer: computer-hosted JIT for iOS 17+ on Windows, macOS, and Linux (GitHub).
- StikDebug: on-device debugger/JIT enabler for iOS 17.4+, requiring pairing and LocalDevVPN (GitHub).
- SideStore: current releases expose JIT paths and integrate with the on-device communication stack.
- iloader: free computer app for Windows, macOS and Linux that creates pairing files and places them in StikDebug or SideStore (iloader). Use it once when the on-device pairing route fails.
Phone-only JIT path
When no computer is available, use an on-device debugger with pairing and a local tunnel. A common sequence is to create a fresh pairing record while the device is unlocked and trusted, confirm Developer Mode and LocalDevVPN state, attach the helper to the target app, then launch the target from the helper. Replace stale pairing data after updates or restores. Computer-hosted JIT remains useful for logs and for iOS versions where on-device pairing is not supported.
iOS 26 is the sharp edge
On devices with newer TXM/SPTM behavior, attaching a debugger alone may not make every executable region usable. The target app's allocator must cooperate with the script protocol. StikJIT's maintainers explicitly state that a generic script cannot retrofit an arbitrary JIT engine (StikJIT).
Therefore “JIT enabled successfully” can coexist with an app crash. Confirm the emulator or runtime itself advertises support for your exact iOS release.
Safe troubleshooting order
- Confirm the app actually requires JIT.
- Confirm
get-task-allowis present. - Confirm Developer Mode.
- Replace stale pairing data after updates or restores.
- Confirm LocalDevVPN and Wi-Fi or the method's documented network state.
- Mount or refresh the correct Developer Disk Image if required.
- Check app-specific iOS 26/27 support.
- Preserve the helper's exact log instead of reporting only “JIT failed.”