Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
706d2f8
Add Apple Vision Pro support: wireless pairing + install over an RP t…
rebelancap Jul 15, 2026
a99df28
Fix macOS Local Network discovery and first-attempt wireless pairing
rebelancap Jul 27, 2026
860b4b0
Bump version to 2.2.9
rebelancap Jul 27, 2026
4d9efa4
Detect default-named Vision Pros; explain unreachable-headset errors
rebelancap Jul 27, 2026
8c79d98
Bump version to 2.2.10
rebelancap Jul 27, 2026
56e016b
Keep the friendly device name; explain Xcode pairing coexistence
rebelancap Jul 27, 2026
be417b9
Bump version to 2.2.11
rebelancap Jul 27, 2026
761a8e4
Don't pair to a withdrawn manual-pairing port
rebelancap Jul 27, 2026
c3d13ec
Bump version to 2.2.12
rebelancap Jul 27, 2026
c946942
Try every advertised address; keep the pairing when unreachable
rebelancap Jul 28, 2026
8a24ac9
Bump version to 2.2.13
rebelancap Jul 28, 2026
79dc7f6
Fix headsets advertising a single address being dropped entirely
rebelancap Jul 28, 2026
ee5ef82
Bump version to 2.2.14
rebelancap Jul 28, 2026
6efd076
Never lose a routable address; keep proven pairings; retry AFC uploads
rebelancap Jul 28, 2026
24dc74f
Bump version to 2.2.15
rebelancap Jul 28, 2026
6516276
Tell instant macOS connect refusals apart from unanswered headsets
rebelancap Jul 28, 2026
7085a28
Bump version to 2.2.16
rebelancap Jul 28, 2026
e621686
Fix the black window on connection errors; log the pairing timeline
rebelancap Jul 28, 2026
69964b6
Bump version to 2.2.17
rebelancap Jul 28, 2026
12c4fd3
Warn when this build is ad-hoc signed (macOS blocks its local traffic)
rebelancap Jul 28, 2026
e04a0f3
Bump version to 2.2.18
rebelancap Jul 28, 2026
e2452ed
Probe the Local Network filter from our own socket
rebelancap Jul 29, 2026
194bb15
Bump version to 2.2.19
rebelancap Jul 29, 2026
288313b
Install LiveContainer2 (the auto-return relay) alongside LiveContaine…
rebelancap Aug 8, 2026
16dd74b
Bump version to 2.2.20
rebelancap Aug 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "iloader",
"private": true,
"version": "2.2.6",
"version": "2.2.20",
"type": "module",
"scripts": {
"dev": "vite",
Expand Down
152 changes: 101 additions & 51 deletions src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 26 additions & 2 deletions src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "iloader"
version = "2.2.6"
version = "2.2.20"
description = "User-friendly sideloader"
authors = ["nab138"]
edition = "2024"
Expand All @@ -22,7 +22,7 @@ tauri = { version = "2", features = ["devtools"] }
tauri-plugin-opener = "2"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
idevice = { version = "0.1.57", features = ["usbmuxd", "house_arrest", "afc", "core_device_proxy", "remote_pairing", "tcp", "tunnel_tcp_stack", "xpc", "rsd", "pair"] }
idevice = { version = "0.1.65", features = ["usbmuxd", "house_arrest", "afc", "installation_proxy", "core_device_proxy", "remote_pairing", "tcp", "tunnel_tcp_stack", "xpc", "rsd", "pair"] }
isideload = { version = "0.2.22", features = ["fs-storage"] }
keyring = { version = "3.6.3", features = ["apple-native", "windows-native", "linux-native-sync-persistent"] }
tauri-plugin-store = "2"
Expand All @@ -44,5 +44,29 @@ rootcause = "0.12.1"
thiserror = "2.0.18"
strum = {version = "0.28.0", features = ["derive"] }

# Vision Pro discovery. On macOS we go through the system Bonjour daemon
# (dns_sd / mDNSResponder) — raw-multicast mDNS is silently dropped by macOS 15+
# Local Network privacy when the OS fails to attribute it (no prompt, no Settings
# entry). Elsewhere there is no such gatekeeper and mdns-sd works fine.
[target.'cfg(target_os = "macos")'.dependencies]
async-dnssd = "0.5.1"

[target.'cfg(not(target_os = "macos"))'.dependencies]
mdns-sd = "0.19"

[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
tauri-plugin-updater = "2"

# Tolerate Apple "device already registered" (developer error 35) during sideload,
# which fires for a Vision Pro registered under visionOS while isideload queries the
# iOS device list. Upstream isideload already carries this fix on git; the published
# 0.2.22 does not, so we vendor a patched copy in-repo (vendor/isideload) with the
# same one-function change. Replace with the upstream release once published.
[patch.crates-io]
isideload = { path = "vendor/isideload" }
# Vision Pro first-time pairing: published idevice hardcodes PIN "000000" when the
# device answers `awaitingUserConsent` (a Trust-dialog assumption). A Vision Pro
# answers that whenever its code screen isn't up yet, so every first pairing attempt
# failed with "missing server proof in SRP response". The vendored copy waits for the
# pairing data and asks the callback for the real on-screen code instead.
idevice = { path = "vendor/idevice" }
17 changes: 17 additions & 0 deletions src-tauri/Info.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- iloader browses mDNS for an Apple Vision Pro (which advertises these
services) to reach it over Wi-Fi. macOS requires declaring local-network
usage and the specific Bonjour service types, or it silently blocks the
multicast discovery. -->
<key>NSLocalNetworkUsageDescription</key>
<string>iloader finds your Apple Vision Pro on your local network to pair with it and install apps over Wi-Fi.</string>
<key>NSBonjourServices</key>
<array>
<string>_remotepairing._tcp</string>
<string>_remotepairing-manual-pairing._tcp</string>
</array>
</dict>
</plist>
Loading