QuestCast is an experimental, low-latency casting system for showing a Meta Quest 3 headset view on an Apple TV over a local network. It is built as two small native applications with no PC, cloud service, account, or relay in the middle.
Project site: regularadrian.github.io/QuestCast
Important
QuestCast is an independent community project. It is not affiliated with, endorsed by, or sponsored by Meta or Apple. Meta Quest, Apple TV, tvOS, and their respective marks belong to their owners.
Meta Quest 3 -- Wi-Fi --> local access point -- Ethernet/Wi-Fi --> Apple TV --> television
MediaProjection H.264 access units over UDP VideoToolbox
The Quest sender captures the user-approved display surface with Android MediaProjection, encodes H.264 in hardware, and fragments each access unit into small UDP datagrams. The Apple TV receiver advertises itself with Bonjour, reassembles complete access units, decodes with VideoToolbox, and renders the newest available frame without a playback queue.
This design prioritises responsiveness over perfect delivery: incomplete or late frames are discarded instead of delaying subsequent frames.
- No PC required after building and installing the apps
- Automatic Apple TV discovery with Bonjour (
_questcast._udp) - H.264 hardware encoding and decoding
- 1920 x 1080 at a 60 fps target
- Zero-buffer receiver path designed for low latency
- Video stays on the local network, no cloud or internet services involved
- Optional diagnostics overlay on Apple TV using the Play/Pause button
- Apple TV screensaver remains available while the receiver is idle
- Optional experimental 48 kHz stereo playback audio, off by default
Prebuilt Quest sender APKs are published on GitHub Releases. A downloaded APK is installed as a sideloaded application; Meta release-channel and Store builds remain subject to Meta's distribution process.
Some Meta Quest 3 users can also join the alpha channel on the Meta Quest App Store to easily install the Sender app on their Quest device here: https://www.meta.com/s/4PVHdWsca
The Apple TV receiver app must currently be built and signed with the user's own Apple Developer team in Xcode, as at the moment I am not a paying member of the Apple Developer programme.
Both the Sender and the Receiver app must be installed on the Meta Quest 3 and Apple TV respectively for this casting to work. Both devices must also be on the same local network.
QuestSender/— native Android sender for Meta Horizon OSQuestCastTV/— SwiftUI tvOS receiver sourcesQuestCastTV.xcodeproj/— Xcode project for Apple TVShared/protocol.md— versioned UDP wire protocolStoreAssets/— artwork and representative screenshots
- Meta Quest 3 or compatible Horizon OS headset with Developer Mode enabled for local deployment
- Apple TV running tvOS 17 or later
- Xcode with the tvOS SDK
- Android Studio with Android SDK 35 (if building the Sender app)
- A local network that permits Bonjour/mDNS and direct UDP traffic between the headset and Apple TV
- Television Game Mode recommended
- Open
QuestCastTV.xcodeprojin Xcode. - Select the
QuestCastTVtarget. - Choose your Apple Developer team and use a unique bundle identifier if Xcode requests one.
- Select your paired Apple TV as the run destination.
- Build and run, then leave QuestCast open on the Apple TV.
The receiver listens on UDP port 49152 and publishes QuestCast TV through Bonjour.
- Open
QuestSender/in Android Studio. - Allow Gradle to sync.
- Connect the headset over USB and approve USB debugging.
- Run the
appconfiguration on the headset. - Open QuestCast, select the discovered Apple TV, and approve Horizon OS screen capture.
- Switch to the experience you want to show.
For a command-line debug build:
cd QuestSender
./gradlew :app:assembleDebugThe resulting APK is written under QuestSender/app/build/outputs/apk/debug/.
- Start QuestCast on the Apple TV.
- Start QuestCast on the headset.
- Select Cast to QuestCast TV.
- Approve the system capture prompt.
- Before starting, optionally enable Include headset audio. This requests playback-audio permission; the microphone is not captured.
- Press Play/Pause on the Siri Remote during casting to toggle technical diagnostics.
- Codec: H.264/AVC
- Capture target: 1920 x 1080 at 60 fps
- Bit rate: 16 Mbps
- Keyframe interval: one second
- Datagram size: no more than 1200 bytes
- Incomplete-frame expiry: 80 ms
- Receiver playback/jitter buffer: none
- Optional audio: PCM 16-bit, 48 kHz stereo in 10 ms chunks
- Audio startup/jitter buffer: approximately 50 ms, with continuous silence-safe playback and latency trimming
H.265 may reduce bandwidth, but H.264 is the current default because its hardware path is widely supported and predictable. A future H.265 mode should be measured end-to-end rather than assumed to be faster.
- Capture starts only after the user accepts the Horizon OS
MediaProjectionprompt. - Playback audio is captured only when the user enables it and grants permission. The microphone is not included.
- QuestCast does not upload, store, analyse, or relay the video through an external service.
- The current UDP protocol is intentionally minimal and does not provide authentication or encryption.
- Use it only on a trusted local network. Do not expose UDP port
49152to the internet. - Protected video surfaces may appear black by platform design.
Network ping does not measure capture-to-display latency. For a useful test, show a fast-changing counter or alternating black/white surface in the headset, film the headset and television together at a high frame rate, and count the frames between matching transitions. Compare results with television Game Mode both enabled and disabled.
- Playback audio capture depends on Horizon OS and the foreground app allowing it; protected or opted-out apps may be silent
- No authentication, encryption, retransmission, or forward-error correction
- Packet loss can discard a complete encoded frame
- Tested primarily with Meta Quest 3 and Apple TV on the same local network
- Store-distributed builds require the publisher's own signing and platform review
Contributions and reproducible latency measurements are welcome.
This software is completely without warranty, and the author does not assume any responsibility for damage, the security risks or losses caused by the use of this software.
Anyone using or installing this software does so at their own risk.
This app has primarily been built with AI (OpenAI Codex).
QuestCast is open-source software released under the MIT Licence.

