Repository navigation
Releases
v1.0.1
Python scripts now run on iOS 18, and the play button in the app no longer freezes the app.
Compatibility
| File | Jailbreak | iOS |
|---|---|---|
*_rootless.deb |
Dopamine, Dopamine 3, NathanLR | 15.0 - 18.x |
*_roothide.deb |
Roothide / Serotonin | 15.0 - 16.6.1 |
iOS 18 is tested on 18.5 with Dopamine 3, and iOS 17 on 17.6.
New: zxtouch-runner
iOS 18 does not let SpringBoard start processes, so ZXTouch could not launch scripts there at all. This release adds zxtouch-runner, a small daemon started by launchd. When SpringBoard is refused, scripts and run_shell_command are handed to the runner instead. On iOS 15 to 17 nothing changes and scripts start the way they always have.
You will see a new process, zxtouch-runner, and a LaunchDaemon named com.zjx.zxtouch.runner. It runs as mobile, the same user scripts already ran as, so scripts get no extra permissions. It only takes work from ZXTouch on the same device: registering needs a secret that only mobile can read, and the connection has to come from the device itself.
After installing, respring as usual. The runner starts on its own.
Fixed
- On iOS 18, scripts failed with "Python not installed" even with Python installed. The check asked whether SpringBoard itself was allowed to run the interpreter, and on iOS 18 it is not. It now checks that the interpreter is an executable file and leaves running it to the runner.
- The play button in the app's Scripts list froze the whole app until it was force quit. The app sent commands without the line ending the tweak expects, so the tweak never answered. App commands are now terminated properly, and the app gives up after 10 seconds instead of hanging.
- Two scripts started at the same moment could have their shell paths swapped, because the rootless path helper returns a shared buffer. The path is now copied before anything else runs.
Better error reporting
Errors that happen before a script starts now go to the Logs tab: which interpreter paths were checked and why each was rejected, and the exact reason a launch failed. Alerts point to Logs instead of Console.app.
Not yet confirmed
The roothide path fix from 1.0.0 has still not been confirmed by a roothide user. If scripts do not play on roothide, please open an issue with the output of ls -la "$(jbroot /var/mobile/Library/ZXTouch)".
ZXTouch Rootless
| File | Jailbreak | iOS |
|---|---|---|
*_rootless.deb |
Dopamine, Dopamine 3, NathanLR | 15.0 - 18.x |
*_roothide.deb |
Roothide / Serotonin | 15.0 - 16.6.1 |
Installation
- Download the
.debfor your jailbreak - Install via Filza or SSH:
dpkg -i <file>.deb && killall -9 SpringBoard
Python 3 from Procursus is required for
.pyscripts.
Full Changelog: v1.0.0...v1.0.1
v1.0.0
First 1.0 release. Adds direct screenshot capture over TCP, fixes roothide script paths, and makes the socket server handle multiple clients properly.
Release tags now track the package version, which is why this follows v0.08.30 rather than continuing that numbering.
Compatibility
| File | Jailbreak | iOS |
|---|---|---|
*_rootless.deb |
Dopamine, Dopamine 3, NathanLR | 15.0 - 17.7 |
*_roothide.deb |
Roothide / Serotonin | 15.0 - 16.6.1 |
iOS 17 is supported and tested on an iPad 7th generation running 17.6 with Dopamine 3 and ElleKit. iOS 18 has not been tested.
Installation
- Download the
.debfor your jailbreak - Install via Filza or SSH:
dpkg -i <file>.deb && killall -9 SpringBoard
Python 3 from Procursus is required for .py scripts. Install it from Sileo by searching for python3.
Added
screenshot()returns the current display as raw JPEG bytes over the existing ZXTouch connection. No file is written on the device and SSH is not required. Contributed by @michaelik1 in #5.
Fixed
- Roothide installs looked for scripts, the script registry, and the runtime log inside the jbroot, while the package writes them to the real filesystem. Scripts failed to play with "Python script exited with code 2" and the log appeared empty. The installer now points the jbroot view at the real directory.
- Each socket client gets its own queue. A slow task such as a screenshot encode, OCR, or a sleep no longer blocks commands from other connections.
- Large responses are no longer abandoned part way. A socket that cannot accept bytes at that instant is back-pressure, not a failure, and the write is retried.
- Client state is released when a connection closes instead of accumulating for as long as SpringBoard runs.
- Command parsing no longer uses
strtok, which was not safe to call from the queue it was running on. - A screenshot color space was released that was never owned, and the screen capture surface was locked before it was checked for NULL.
The roothide path fix has not yet been confirmed by a roothide user. If scripts still fail to play, please open an issue with the output of ls -la "$(jbroot /var/mobile/Library/ZXTouch)".
What's Changed
- Add direct screenshot transfer over TCP by @michaelik1 in #5
New Contributors
- @michaelik1 made their first contribution in #5
Full Changelog: v0.08.30...v1.0.0
v0.08.30 - iOS 17 Support & Safe Mode Fix
ZXTouch Rootless
| File | Jailbreak | iOS |
|---|---|---|
*_rootless.deb |
Dopamine | 15.0 – 17.7 |
*_roothide.deb |
Roothide / Serotonin | 15.0 – 16.6.1 |
Installation
- Download the
.debfor your jailbreak - Install via Filza or SSH:
dpkg -i <file>.deb && killall -9 SpringBoard
Python 3 from Procursus is required for
.pyscripts.
Full Changelog: v0.08.29...v0.08.30
v0.08.29 - Orientation & Script Stop Fixes
ZXTouch 0.1.6
- Touch Indicator now honors each foreground app's exact supported orientation mask.
- Landscape-only apps no longer allow the overlay to rotate into portrait.
- Fixed the 180-degree touch mapping in the alternate landscape orientation.
- Stopping Python scripts now terminates the complete tracked process group, including the interpreter, shell, logger, and child processes.
- User-stopped scripts no longer produce false completion or error alerts.
- Closed raw recording files after playback to prevent descriptor leaks.
Installation
- Dopamine / NathanLR: install the _rootless.deb.
- Roothide / Serotonin: install the _roothide.deb.
- Python 3 from Procursus is required for .py scripts.
v0.08.28 - Drop bundled Python 3.7 + NathanLR support
What's Changed
Python runtime now required from Sileo (Procursus)
The bundled Python 3.7 runtime has been removed. It was linked against /usr/lib/libpython3.7m.dylib, a path that doesn't exist on rootless jailbreaks, so it aborted at dyld load (SIGABRT / exit 134) on the majority of installs — it was never really usable.
You must now install python3 from Sileo (Procursus). Then reinstall ZXTouch so its postinst picks up the new interpreter.
NathanLR jailbreak now officially supported
NathanLR (iOS 16.5.1 – 16.6.1, semi-untethered) uses the rootless bootstrap under /var/jb, so install the _rootless.deb (not _roothide.deb). Reopen the NathanLR app after each reboot to reactivate tweaks.
Under the hood
zxtouchPython module relocated frompython3.7/site-packagesto/usr/share/zxtouch/python, so it's independent of any specific interpreter version.- Postinst scripts now prefer
python3.12→3.8, skip 3.7, and print a warning if no Python is present. ScriptPlayerprefers versioned interpreters over the genericpython3symlink, so a stale symlink from a broken install can't win.- New error alerts: "Python interpreter is broken" for the libpython-missing case and "Script could not launch" for
posix_spawnfailures — each with actionable next steps instead of an opaque exit code. - Deb size: ~8 MB → ~1 MB now that the bundled runtime is gone.
Downloads
| File | Jailbreak | iOS |
|---|---|---|
| `*_rootless.deb` | Dopamine, NathanLR | 15.0 – 16.6.1 |
| `*_roothide.deb` | Roothide / Serotonin | 15.0 – 16.6.1 |
Installation
- Install `python3` from Sileo → Procursus (required for `.py` scripts).
- Download and install the `.deb` for your jailbreak: `dpkg -i .deb && killall -9 SpringBoard`
- On NathanLR, reopen the NathanLR app after every reboot.
Full Changelog: v0.08.27...v0.08.28
v0.08.27 - Python script spawn fix
What's Fixed
Python scripts now run on jailbreaks where raw fork() from SpringBoard is denied (palera1n-rootless, some roothide setups).
Previously, users on affected devices saw:
Script Error: Python script exited with code -1. Open Logs for the traceback.
…with an empty log. The root cause: system2() in pccontrol/Common.xm used raw fork() + execl(), which the sandbox blocks in a SpringBoard-injected tweak on some JB variants. fork() returned -1 immediately, so the shell pipeline (and therefore the wrapper that writes the log) never ran.
Fix
system2()now usesposix_spawn— the API iOS actually permits from injected tweaks.- Falls back through
/var/jb/bin/sh→/var/jb/usr/bin/sh→/bin/shifjbroot("/bin/sh")returns something unusable. - Every failure path now logs
strerror(errno)viaNSLog, so if a script still fails you'll see the real reason in Console.app instead of an opaque-1.
Video recording, touch simulation, and other non-Python features were never affected and are unchanged.
Downloads
| File | Jailbreak | iOS |
|---|---|---|
| `*_rootless.deb` | Dopamine | 15.0 – 16.6.1 |
| `*_roothide.deb` | Roothide / Serotonin | 15.0 – 16.6.1 |
Installation
- Download the `.deb` for your jailbreak.
- Install via Filza or SSH: `dpkg -i .deb && killall -9 SpringBoard`
Python 3 from Procursus is recommended for `.py` scripts. ZXTouch also falls back to the bundled runtime when available.
Full Changelog: v0.08.26...v0.08.27
v0.08.26 - Dpkg Installation Fix
ZXTouch v0.08.26
This maintenance release fixes Sileo installs being left in an interrupted or half-configured dpkg state.
Fixed
- Removed forced SpringBoard restarts from rootless and roothide
postinstscripts. - Package configuration now returns to dpkg normally before any user-requested respring.
- Prevents Sileo's install helper from being terminated during the active dpkg transaction.
- Bumped the package version to
0.1.3so affected0.1.2installations receive the repair.
Recovery
If Sileo currently reports Dpkg Interrupted, allow it to finish repairing the transaction, refresh sources, and upgrade ZXTouch to 0.1.3. The fixed package no longer restarts SpringBoard from inside dpkg.
| File | Jailbreak | iOS |
|---|---|---|
*_rootless.deb |
Dopamine | 15.0 - 16.6.1 |
*_roothide.deb |
Roothide / Serotonin | 15.0 - 16.6.1 |
Full changelog: v0.08.25...v0.08.26
v0.08.25 - Recording Editor & Remote Dashboard
ZXTouch v0.08.25
This release adds two major workflows: an in-app recording editor and a persistent, token-protected remote dashboard.
Highlights
- Recording editor: Open raw
.bdlrecordings from the script list, edit action values, reorder or delete steps, duplicate actions, insert taps/swipes/waits/toasts/app launches, then save and test the result. - Persistent remote dashboard: Run and stop scripts, control recording, inspect and export logs, upload script assets, download entries, and view live device diagnostics from another device on the same Wi-Fi.
- Improved status and reliability: Correct screen, orientation, battery, foreground app, script, recording, and service status with clearer error reporting.
Packages
Package version: 0.1.2
| File | Jailbreak | iOS |
|---|---|---|
*_rootless.deb |
Dopamine | 15.0 - 16.6.1 |
*_roothide.deb |
Roothide / Serotonin | 15.0 - 16.6.1 |
Installation
- Download the
.debmatching your jailbreak. - Install it through Sileo, Filza, or SSH.
- Respring when installation completes.
Python 3 from Procursus is recommended for .py scripts. ZXTouch also uses its fallback runtime paths when available.
Full changelog: v0.08.24...v0.08.25
v0.08.24
ZXTouch Rootless
| File | Jailbreak | iOS |
|---|---|---|
*_rootless.deb |
Dopamine | 15.0 – 16.6.1 |
*_roothide.deb |
Roothide / Serotonin | 15.0 – 16.6.1 |
Installation
- Download the
.debfor your jailbreak - Install via Filza or SSH:
dpkg -i <file>.deb && killall -9 SpringBoard
Python 3 from Procursus is recommended for
.pyscripts. ZXTouch also falls back to the bundled runtime when available.
Full Changelog: v0.08.23...v0.08.24
v0.08.23
ZXTouch Rootless
| File | Jailbreak | iOS |
|---|---|---|
*_rootless.deb |
Dopamine | 15.0 – 16.6.1 |
*_roothide.deb |
Roothide / Serotonin | 15.0 – 16.6.1 |
Installation
- Download the
.debfor your jailbreak - Install via Filza or SSH:
dpkg -i <file>.deb && killall -9 SpringBoard
Python scripts require
python3from the Procursus repo.
Full Changelog: v0.08.22...v0.08.23