Skip to content

Apple Vision Pro support: wireless pairing + install over an RP tunnel#565

Open
rebelancap wants to merge 1 commit into
nab138:mainfrom
rebelancap:visionos-tunnel
Open

Apple Vision Pro support: wireless pairing + install over an RP tunnel#565
rebelancap wants to merge 1 commit into
nab138:mainfrom
rebelancap:visionos-tunnel

Conversation

@rebelancap

Copy link
Copy Markdown

A Wi-Fi Apple Vision Pro isn't carried by usbmuxd, so it can't be reached through iloader's usbmux device path like an iPhone/iPad. This adds a parallel Vision Pro transport that reuses the RemotePairing (RSD) tunnel, alongside the completely unchanged iOS/iPad usbmux path.

What it does

  • Discovers a Vision Pro over mDNS via a persistent background browser (_remotepairing-manual-pairing._tcp when unpaired, _remotepairing._tcp once paired — a paired VP stops advertising manual-pairing), and lists it next to usbmux devices.
  • First-time pairs with the 6-digit code shown on the headset (Settings → General → Remote Devices) — no cable, dev strap, or Xcode.
  • Reaches install services over the RP tunnel: pair-verify on RSD :49152 → TLS-PSK CDTunnel → software TCP stack → RSD handshake → installation_proxy/AFC. Signs with isideload (transport-agnostic) and installs over the tunnel, then places the RP pairing file into the app.

Structure

  • src-tauri/src/vision.rs — the whole VP transport (new module).
  • device.rs / sideload.rs / pairing.rs — branch on a new DeviceTransport{Usbmux,Vision} discriminator on DeviceInfo; the iOS/iPad usbmux path is untouched.
  • Frontend (Device.tsx / App.tsx) — a Vision Pro device card and a "enter the code from your headset" modal.
  • src-tauri/Info.plist — declares NSLocalNetworkUsageDescription + NSBonjourServices (required for mDNS multicast on macOS; without them a packaged build silently finds no devices).

Notes for review

  • isideload is vendored in src-tauri/vendor/isideload as a stopgap: a VP registered under Apple's separate visionOS device platform makes isideload's ensure_device_registered hit "device already registered" (developer error 35); the tolerance for that is on isideload's git HEAD but not yet in a crates.io release. Once released, this reverts to a normal dependency.
  • For a VP, the installers fetch the patched visionOS SideStore / LiveContainer builds (rebelancap forks), since the stock arm64 builds lack the visionOS fixes.
  • Validated end-to-end on a real Apple Vision Pro (visionOS 27): wireless pair → install SideStore → sideload an app over Wi-Fi.

Companion visionOS patches live on the rebelancap SideStore + AltSign forks.

…unnel

A Wi-Fi Apple Vision Pro isn't carried by usbmuxd, so it can't be reached
through iloader's usbmux device path like an iPhone/iPad. This adds a parallel
Vision Pro transport that reuses the RemotePairing (RSD) tunnel, alongside the
unchanged iOS/iPad usbmux path.

- src-tauri/src/vision.rs: the whole VP transport — a persistent mDNS browser
  (browses _remotepairing-manual-pairing._tcp for unpaired VPs and
  _remotepairing._tcp for already-paired ones), first-time pairing via the
  headset 6-digit code (vision_pair, driven by vision-pair-status/-code events),
  the tunnel (pair-verify on RSD 49152 -> TLS-PSK CDTunnel -> RSD services), and
  sign-then-install over the tunnel. RP pairing cached by a canonical device name.
- device.rs: DeviceTransport{Usbmux,Vision} + ip/paired on DeviceInfo;
  list_devices joins usbmux and mDNS discovery; set_selected_device verifies a
  stored VP pairing.
- sideload.rs / pairing.rs: branch on transport — a VP signs via isideload
  sign_app then installs over the tunnel and places rp_pairing_file.plist; routes
  to the patched visionOS SideStore / LiveContainer builds.
- secure_storage.rs: memoize the keychain-availability probe.
- Info.plist: declare NSLocalNetworkUsageDescription + NSBonjourServices, or
  macOS silently blocks the mDNS multicast a packaged build discovers the VP over.
- Frontend: a Vision Pro device card + headset code-entry modal.
- Vendor the patched isideload in-repo (stopgap until the dev-error-35 tolerance
  for a visionOS-registered device ships in a crates.io release).

Validated on a real Apple Vision Pro (visionOS 27): pair -> install SideStore ->
sideload over Wi-Fi.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@barlarb

barlarb commented Jul 19, 2026

Copy link
Copy Markdown

This is amazing! Thank you so much for your work on this! I have now successfully installed Livecontainer and Sidestore and sideloaded apps on my Vision Pro. The only issue I've come across is I am unable to enable JIT despite having the pairing file. It says the Developer Disk Image is not mounted. Any suggestions you have would be really appreciated—and thank you again!

@rebelancap

Copy link
Copy Markdown
Author

Glad it’s working for you. Check out my repo for ports for visionOS with SideStore sources! I’m working on several others yet to come.

I was not optimistic about JIT so I didn’t give it a real try. But I should take another look (well Claude Fable should - he’s doing the legwork here).

@barlarb

barlarb commented Jul 19, 2026

Copy link
Copy Markdown

Just had a look! Fantastic, thank you!
If you could (with Claude's help) I would be really grateful! I really hope to play PS2 games on it. Do you have a Ko-fi page or similar to support you?

@rebelancap

Copy link
Copy Markdown
Author

@barlarb Unfortunately worked on this all afternoon, and visionOS 27 blocks every JIT attempt. Can mount the DDI, can attach a debugger, SideStore confirms CS_DEBUGGED, but visionOS blocks every attempt to actually execute JIT code. This is different than iOS. We can revisit in the future, perhaps when current OS is out of beta. But I'm not optimistic.

@barlarb

barlarb commented Jul 20, 2026

Copy link
Copy Markdown

Thank you for trying! Hopefully it can be figured out at some point, once OS27 is out, as you say. Finger's crossed! It feels a shame for Vision Pro to miss out on JIT. Thanks again for making sideloading such a breeze now! Really appreciate it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants