Skip to content

Release v0.3.0-alpha.5: experimental Apple TV support and RSD fixes - #14

Merged
lemehavit merged 34 commits into
mainfrom
appletv-support
Oct 20, 2026
Merged

lemehavit merged 34 commits into
mainfrom
appletv-support

Conversation

@lemehavit

Copy link
Copy Markdown
Owner

Brings appletv-support into main for the v0.3.0-alpha.5 release. main is an ancestor of this branch, so there are no conflicts. It includes the RSD production work from v0.3.0-alpha.4 (rsd-production-install), which was tagged but never merged.

What changes

Added

  • Experimental Apple TV support behind IPHONELOADLY_APPLE_TV=on (requires IPHONELOADLY_RSD_INSTALL=on): discovery, PIN pairing, tvOS device registration and profiles (isideload fork 30228c4), install, refresh and the app list over RSD.
  • iOS/tvOS IPAs are refused on the wrong device class before any Apple account work.
  • Logging of what Apple TV discovery saw, and of why an install job failed to sign.

Changed

  • The install picker says "device" instead of "iPhone".

Fixed

  • AF_NETLINK is allowed in the API unit so mDNS can list interfaces. Without it, Apple TV discovery and iPhone RSD discovery found nothing.
  • Apple TV discovery waits 10 s.
  • The 2FA dialog no longer reopens after a submitted code.
  • The sources, managed and validity lists keep their layout after status messages.
  • The compression-ratio check only applies to IPA entries ≥ 1 MiB (NuvioTV's silent audio file was rejected).
  • A missing IPA file gives a clear error, the app can still be removed, and "Download latest" restores the file.

Verification

  • cargo fmt --all -- --check, cargo clippy --workspace --all-targets --all-features -- -D warnings and cargo test --workspace pass locally.
  • Running in production as B124 (binary from a30ebb3; this PR adds only the version bump, the changelog and a formatting fix). The first Apple TV install (NuvioTV 3.4.5) succeeded.

🤖 Generated with Claude Code

lemehavit and others added 30 commits September 17, 2026 12:13
- IPHONELOADLY_RSD_INSTALL=on lists the remotely paired iPhone and routes its
  install and refresh jobs over RSD (upgrading an existing app); only a
  verified install succeeds and records the team-suffixed bundle id.
- The installed-apps list for that iPhone is read over RSD too.
- Install responses carry an optional bounded signingDiagnostic.
- Builds against the local isideload backport checkout
  (../../../isideload-80045-backport, branch rsd-production-install).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Uses lemehavit/isideload@54e2a20 (branch rsd-production-install), the same
source as the production build, so the repo builds outside this workspace.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Collapse nested ifs, use unwrap_or, drop a needless deref, check the test
read count, and mark the currently unused CoreDevice appservice helpers as
allowed dead code.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Behind IPHONELOADLY_APPLE_TV=on (with IPHONELOADLY_RSD_INSTALL=on), the
dashboard finds an Apple TV showing Remote App and Devices and pairs with
the PIN it shows. The pairing is kept by its own WirelessPairingService
next to the iPhone's, so install, refresh and app listing reuse the RSD
path. The device class comes from the RSD handshake; an Apple TV is
registered on its first install and signed with tvOS profiles through
the isideload fork. Install jobs refuse an IPA built for the other
platform before any Apple account work starts.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W4cV2GPhph8cvFzQDwvpSc
The 4-second window found nothing in the first live test although the
host saw the Apple TV's manual pairing service. Use the same 10 seconds
as the iPhone's RSD discovery, and log found, resolved and ignored
services so the next test shows where discovery stops.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W4cV2GPhph8cvFzQDwvpSc
The login stays in AwaitingTwoFactor until Apple answers, so the poll
right after submit reopened the dialog. Move to Authenticating as soon
as a response is accepted, and keep a single dashboard poll loop.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W4cV2GPhph8cvFzQDwvpSc
mdns-sd enumerates interfaces through getifaddrs, which needs
AF_NETLINK. Without it the Apple TV search sent no queries and found
nothing.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W4cV2GPhph8cvFzQDwvpSc
…essages

Loading and error statuses are written into these list containers, which
replaced their inset-list class with the flex status layout. Rows rendered
afterwards sat side by side and squeezed the text to one letter per line.
Reset the list class before rendering rows, and let rows wrap so long action
groups never squeeze the text column.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
NuvioTV for tvOS ships a 190 KB silent audio file that compresses 217:1,
which tripped the 200:1 zip-bomb check on upload and on GitHub sync.
Only apply the ratio check to entries of 1 MiB or more; the total
expansion cap still applies.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W4cV2GPhph8cvFzQDwvpSc
lemehavit and others added 4 commits October 20, 2026 15:08
Install jobs only logged error_kind=signing_failed, which also covers device
registration failures. Log the bounded SigningError and, when present, the
classified signing diagnostic (stage, error class, HTTP status, Apple code,
local I/O kind).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The install picker also lists the Apple TV now.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W4cV2GPhph8cvFzQDwvpSc
An app whose stored IPA had disappeared failed every install with "The IPA
could not be signed", could not be removed, and "download latest" kept
answering unchanged because the sha256 matched.

- Install jobs fail early with ipa_file_missing and a clear message.
- Removing an app succeeds when its file is already gone.
- A source download with an unchanged sha256 restores the file when it is
  missing.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Bump the version and move the Apple TV work and today's fixes into the
0.3.0-alpha.5 changelog section. Format the new missing-IPA test.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@lemehavit
lemehavit merged commit 122f317 into main Oct 20, 2026
1 check passed
@lemehavit
lemehavit deleted the appletv-support branch October 27, 2026 07:54
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