Skip to content

11.3a: Apple TV and Vision Pro paired by the code they show - #104

Merged
SirReaDy merged 2 commits into
mainfrom
feat/tv-vision-pairing
Oct 30, 2026
Merged

SirReaDy merged 2 commits into
mainfrom
feat/tv-vision-pairing

Conversation

@SirReaDy

Copy link
Copy Markdown
Collaborator

An Apple TV or Apple Vision Pro has no cable, so it's paired over the network with the code it shows on its pairing screen. Installing to them comes with 11.3b.

Not tested with a real Apple TV or Vision Pro. Everything below runs against fakes. iPhones were checked to still work over USB and Wi-Fi.

Device

  • Finding: while its pairing screen is open, a device advertises _remotepairing-manual-pairing._tcp, with its name and model in the TXT record. The mDNS browser also reads AAAA records and TXT name and model.
  • Pair-setup over TCP with the typed code as the SRP PIN, asked once the device answers M2. A failed proof is device.pairing_code_wrong; TLV error 3 or 5 is device.pairing_backoff (with the device's retry delay); a connection that goes away is device.pairing_screen_closed. Pair-verify's refusals are unchanged.
  • Saved like an iPhone's remote pairing, plus a list of devices paired by code (udid, name, model).
  • Found again on the network by its _remotepairing._tcp advert: authTag is 6 bytes of SipHash-2-4 keyed by the device's identity resolving key over its identifier. The byte order is unconfirmed on hardware.
  • open() reaches a device paired by code through its Wi-Fi tunnel, with no classic pair record. tvOS has no Developer Mode; visionOS has it.
  • device-probe tv-browse and tv-pair [--name].

Engine and RPC

  • watchPairableDevices (a live feed, topic pairable), pairByCode (a run with the device.pairing_code question, asked again after a wrong code), codePairedDevices and forgetCodePaired.
  • Each new error has its own recovery: enter the code again, wait and retry, or retry.

UI

  • Pair Apple TV or Vision Pro… on the Devices page and in the device menu: a Find step (where the pairing screen is on each device, the live list, "It doesn't show up" help), then the code (six boxes, a wrong-code message, a countdown after too many tries, back to the list when the screen closes), then Paired.
  • Their own cards on the Devices page (model, tvOS or visionOS, Wi-Fi or not connected), with Forget… and Pair again….
  • Install and Preload stay off while an Apple TV or Vision Pro is in use, and say installing to them comes in a later version.
  • Text in all six languages.

Checks

  • pnpm verify: lint, typecheck, boundaries, locales, 1398 tests. Also passed twice under full CPU load.
  • Browser checks in Docker: 236 passed.
  • Docs: docs/device.md, docs/rpc.md, docs/ui.md, the failure catalogue, AGENTS.md, both roadmaps.

An Apple TV or Apple Vision Pro has no cable, so it's paired over the
network with the code it shows on its pairing screen.

- Devices showing their pairing screen are found on the network
  (`_remotepairing-manual-pairing._tcp`, name and model from the advert).
- Pair-setup takes the code typed in IPAForge as the SRP PIN. A wrong code,
  too many tries and a closed pairing screen are their own errors.
- The pairing is saved like an iPhone's remote pairing, and the device is
  remembered as paired by code. It's found again by its remote pairing
  advert (SipHash-2-4 authTag keyed by the device's identity resolving key)
  and opened through its tunnel, without a classic pairing. tvOS needs no
  Developer Mode.
- The Pair Apple TV or Vision Pro dialog (find, then the code), and their
  cards on the Devices page with Forget and Pair again.
- Install and Preload stay off for an Apple TV or Vision Pro and say that
  installing to them comes in a later version (11.3b).
- Engine: watchPairableDevices, pairByCode, codePairedDevices and
  forgetCodePaired, over RPC too; device-probe tv-browse and tv-pair.
- Text in all six languages; docs and both roadmaps.

Not tested with a real Apple TV or Vision Pro.
…s pairing

- Pairing by code never falls back to the fixed PIN: a device that asks to
  be allowed instead of showing a code is refused, since only the code
  proves it's the device whose screen the user sees.
- The device names its own UDID, so a UDID this computer is already paired
  with another way (by cable, or an iPhone's remote pairing) is refused
  instead of overwritten. Pairing the same device again still works.
- Forget only deletes devices paired by code.
@SirReaDy
SirReaDy merged commit d8e71ae into main Oct 30, 2026
8 checks passed
@SirReaDy
SirReaDy deleted the feat/tv-vision-pairing branch October 30, 2026 19:10
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.

1 participant