All notable user-facing and internal changes to go-ios are documented here.
The format is based on Keep a Changelog.
Releases are cut by dispatching the Release-Go-iOS workflow (Actions tab →
Run workflow, or gh workflow run release.yml -f release_notes=... -f bump=patch).
That workflow computes the next version, writes a new ## [x.y.z] - DATE section
here from the notes you provide, and uses the same text as the GitHub release
body — so this file is updated automatically and never needs a manual PR.
Use ## [Unreleased] to jot down notable changes between releases if you like.
- New
ios ui run (wda | devicekit)— bring up a WebDriverAgent or DeviceKit UI-automation runner and forward its port, the run counterpart toui download/ui install(#761). - Accessibility audit —
ios ax auditruns the on-device accessibility audit on iOS 14–18, with structured output (#618). - WebInspector / CDP — new WebInspector service with a Chrome DevTools Protocol bridge, interactive controls, and a JS shell (#744).
- Apple signing + UI automation commands — sign and drive WDA/DeviceKit runners directly from the CLI.
runtest/runxctestnow emit test results as JSON to stdout, always (#573).
- Per-device tunnel stop and refresh (#738).
- Userspace tunnel: IPv6 framing fix and TLS-PSK transport for iOS 18.2+, plus robustness and performance work (#748).
- Limit automatic tunnel lookup to RSD commands (#753); attach tunnel info to
devicestate/resetlocation/setlocationgpx(#756). - Fix a usbmux socket leak in
TunnelManager— skip network devices and back off failed ones (#682). - More reliable single-device reconnect handling (#691).
forward: stop logging normal connection teardown as errors (#754, #639) and make teardown race-free (#762).instruments: retry transient device launch failures (NSError code 2), fixing flakyios launch(#763).- Windows: stop the TUN event loop spinning when a device disconnects (#690).
- Replace a panic with an error return in the archive path (#705).
- Warn that
--pair-record-path=defaultis TCC-blocked on macOS 26+ (#747). - Better error messages explaining why instruments/devmode fail on unsupported devices (#742).
- Go 1.26 across all modules; device command dispatch refactored into per-domain handlers; expanded real-device e2e coverage (pre-iOS17, WebInspector, signing, accessibility) with the data-race detector enabled in unit CI.
This release was made possible by a fantastic group of contributors — thank you all:
- @sakhisheikh (Sakhi Mansoor) — built out the accessibility APIs (toggle caption text, first/last element, AX queries) that underpin
ios ax audit(#618). 🎉 - @aluedeke (Andreas Lüdeke) — sharp-eyed fix to stop
forwardlogging normal connection teardown as errors, with a clean half-duplex refactor (#754). - @lizhizhuanshu (Ponder) — caught and fixed a Windows goroutine that busy-spun forever when a device disconnects (#690). A year-old fix, finally landed — worth the wait!
- @vbragaru — diagnosed and fixed a real usbmux socket leak in
TunnelManager, complete with overnightlsofevidence (#682). Excellent debugging. - @briankrznarich (Brian Krznarich) — spotted spurious errors logged when a forward connection is cleanly closed (#639). Precise root-cause, patiently carried across go-ios's logrus→golog migration.
- @dmdmdm-nz — made
runtest/runxctestemit machine-readable JSON results, so test output is finally pipeable (#573, #574). - @mvanhorn (Matt Van Horn) — replaced a panic with a proper error return in the archive path, making the library safer to embed (#705).
…and @danielpaulus for the WebInspector/CDP bridge, ios ui run, the tunnel and signing work, and shepherding it all in. 🚀
Several of these PRs had been waiting a while and were rebased onto current main with the contributors' original authorship preserved. Thank you for your patience and your excellent work — go-ios is better because of you.
New instruments-backed services for live device telemetry: network statistics, battery, sysmontap system monitoring, and FPS / OpenGL graphics metrics. Useful for profiling app performance and resource usage directly from the CLI/library, with configurable network timeouts.
New wallpaper and icon-layout commands to read the device's home-screen wallpaper and springboard icon arrangement.
Add and remove Wi-Fi connection profiles on a device. Inputs are validated up front, and the command clearly reports when the device must be supervised for the operation to succeed rather than failing obscurely.
New support for shutting a device down programmatically.
ios list now reports each device's ConnectionType (USB or Network), so devices reachable over the network are distinguishable from USB-attached ones. Covered by the e2e device suite.
The tunnel-info HTTP API's bind host is now configurable instead of being hard-coded, making it easier to run the tunnel daemon in containerized or remote setups.
New endpoint to reset a device's iOS accessibility settings (including font size and related options) back to defaults.
GetUsbmuxdSocket / USBMUXD_SOCKET_ADDRESS handling was rewritten: an explicit scheme (unix://, tcp://) is honored as-is (and case-insensitively), a bare host:port is treated as TCP, and a bare path is treated as a unix socket — without the previous panic on unscheme'd host:port values.
go-ios no longer depends on logrus. All library logging now flows through a thin ios/golog slog seam with consistent, filterable attributes (module, udid, and instance identifiers). Library embedders can route go-ios's logs into their own handler with ios.SetLogger(*slog.Logger); if you do nothing, standard slog.Default() behavior applies.
⚠️ Embedder-facing change: the logrus dependency has been removed anddebugproxy's logger-typed signatures changed accordingly. CLI users are unaffected.
- Removed legacy device integration tests now superseded by the gated
e2esuite (#735, @danielpaulus) - Added a contributor
AGENTS.mddocumenting build/test, real-device CI, the logging convention, and the dispatch-only release process (#734, @danielpaulus) - CI fixes for changelog insertion and npm-propagation wait during publish verification (#733, @danielpaulus)
Thanks to everyone who contributed to this release: @kissfu, @aluedeke, @gbalduzzi, @Harrilee, @iSevenDays, and @Ylarod. 🎉
- Redesigned help output —
ios --helpnow shows a clean, sectioned layout (global options + a full command table with one-line descriptions) instead of the raw docopt usage block.ios help <command>,ios <command> --help, andios <command> -hare all equivalent, including nested subcommands likeios help tunnel start. (#716)
- REST API
KillApp— fixed kill-by-bundle-ID, which stopped matching afterCFBundleIdentifier/CFBundleExecutablebecame method calls on the app model. (#729)
First release published to npm since 1.0.213 — npm publishing broke when npm
revoked legacy tokens, and is now restored on secure OIDC trusted publishing.
This release also makes the npm package install correctly on Windows for the
first time.
ostrace --follow— persistent log streaming that survives process restarts. Auto-reconnects when the target process exits/restarts: with--process=<name>it re-resolves the new PID, with an explicit--pidit exits cleanly when that PID ends. (#719)ostraceplain-text output —--nojsonnow prints structured, human-readable lines[timestamp] PID:##### <Level> [subsystem:category] messageinstead of raw JSON, with ANSI color coding (Info=cyan, Debug=gray, Error=red, Fault=bold red). Colors are emitted only when stdout is a TTY, so pipes and files stay clean. (#718)- More reliable Developer Disk Image (DDI) mounting on iOS 17+ — fixes
identity-not-foundfailures on newer chips (e.g. A19 Pro) and adds a manifest fast-path that skips the nonce + Apple TSS round-trip on re-mounts when a valid personalization manifest already exists. (#720, #723)
- Windows npm install —
npm i -g go-iospreviously installed a binary that wasn't onPATH(the postinstall placed it in a non-PATHbinsubfolder), soioswas uncallable on Windows. The binary is now installed to the correct location. (#730) - macOS 26 binary launch — bump the Go toolchain to 1.24.13 so produced binaries carry an
LC_UUIDload command; without it, macOS 26's dyld rejects them withabort trap. (#723)
- npm publishing migrated to OIDC trusted publishing — no more long-lived
NODE_AUTH_TOKEN; releases authenticate per-run via GitHub OIDC, with provenance attestations. (#727) - Cross-platform install verification — release and canary pipelines now install the freshly published package on Windows, Linux and macOS and run the binary, asserting the version matches. (#728, #730)
- Canary release pipeline — manual-dispatch workflow publishing a throwaway
go-ios-canarypackage to validate the full release flow without shipping. (#727) - Releases now gated behind the
make-releaselabel. (#726) - Real-device e2e test suite on the self-hosted macOS/Linux runners, gated to run only after unit tests pass, and runnable on fork PRs via a maintainer
/test-devicescomment. (#723, #725, #726)