The project's README from github.com/corvofeng/atv-core. As one markdown file: README.md.
English Version | 中文版本
High-performance Rust implementation of the Apple TV Companion Link and MediaRemote (MRP) protocols. Discover, pair, and control targets directly using the native Apple TV Remote widget in iOS / iPadOS Control Center without jailbreak or dedicated hardware:
AppleTVRemote.app) and cross-platform CLI.dadb) + Android Accessibility Service (AtvAccessibilityService), auto-starts on boot with independent mDNS broadcasting.No third-party iOS app required. Simply pull down the iOS Control Center and tap the native Apple TV Remote icon to immediately discover the host Mac (as shown below, connected directly to Yuhao's MacBook (2)):
⏯): Natively linked with macOS system-wide media playback.<): Mapped to macOS Escape key.TV): Triggers configurable desktop actions or Mission Control.When running the daemon or menu bar app on macOS, visit http://127.0.0.1:8765 in your browser to open the interactive inspection console (captured live with active finger swipe vectors and event logs):

Began, Moved, Ended), velocity vectors, and direction detection.0.5x Precise, 1.0x Standard, 1.5x Fast, and 2.2x Ultra-Wide Screen dynamics profiles.Navigate to http://127.0.0.1:8766 to inspect the Swift host process health, active port bindings, and live protocol handshakes:

192.168.101.206), SRP authentication, and MRP encrypted control channel initialization.8765), Web Debug port (8766), MediaRemote port (49152), background PID, text search filter, and process restart controls.Running AppleTVRemote.app places a lightweight native Swift icon in the macOS menu bar, consuming as little as 18MB of RAM:
↑ ↓ ← → and Enter.NX_KEYTYPE_PLAY for YouTube, Safari, Spotify, IINA, etc.).Launch the app on Android TV to monitor driver status and customize key bindings:
| Main Dashboard | Input Injection Mode | Menu Key Binding |
|---|---|---|
![]() |
![]() |
![]() |
/dev/input/event* hardware drivers, local Dadb daemon (127.0.0.1:5555), and AtvAccessibilityService.KEYCODE_MENU for legacy TV apps.Swiping on the iPhone touchpad smoothly shifts the TV focus highlight across the UI grid:
[Top Navigation Tabs (For you / Apps)]
↕ (Swipe Down)
[Featured Hero Banner Focus]
↕ (Swipe Down)
[Application Row (YouTube / VLC / Settings)]
| 1. Top Navigation Focus | 2. Hero Banner Focus | 3. App Card Row Focus |
|---|---|---|
![]() |
![]() |
![]() |
<: Return to previous screen (GLOBAL_ACTION_BACK).Home: Instantly return to the Android TV launcher home screen.Review the following system requirements before initial launch:
Release builds are signed with a dedicated developer certificate (Corvo Development). On macOS, Gatekeeper may flag untrusted apps:
./scripts/import_certificate.sh Corvo_Development.p12
xattr -dr com.apple.quarantine /Applications/AppleTVRemote.app
(Or right-click the app in Finder while holding Control, select Open, and confirm.)Simulating keyboard strokes and smooth mouse cursor movements requires macOS Accessibility permissions:
127.0.0.1:5555 to dispatch Linux keycodes with <8ms ultra-low latency.When the app initializes the local Dadb connection, an Android system security prompt will appear:
⚠️ CRITICAL: Using your physical TV remote, check "Always allow from this computer" and click "Allow / OK". Rejecting this prompt will cause
Unauthorizedconnection errors and prevent remote input.
GLOBAL_ACTION_BACK, GLOBAL_ACTION_HOME).| Step 1: Accessibility List | Step 2: Confirmation Dialog | Step 3: Service Ready |
|---|---|---|
![]() |
![]() |
![]() |
1111 to complete the SRP cryptographic handshake.# Build standalone DMG package
./scripts/build_dmg.sh
Mount build/AppleTVRemote-arm64.dmg and drag the application to /Applications. Launch the app and access controls via the menu bar icon.
# Build and install APK
./scripts/build_android.sh
adb install -r android-tv/app/build/outputs/apk/debug/app-debug.apk
# Launch app
adb shell am start -n com.corvofeng.fakeatv/.MainActivity
For testing inside Android Studio's Android TV Virtual Devices (AVD):
Start an Android TV AVD (API 30+ recommended). Run adb devices to verify emulator-5554 is online.
./scripts/build_android.sh
adb -s emulator-5554 install -r android-tv/app/build/outputs/apk/debug/app-debug.apk
adb -s emulator-5554 shell am start -n com.corvofeng.fakeatv/.MainActivity
# Start background daemon
python3 scripts/bridge_emulator.py start
# Or run foreground with live logs
python3 scripts/bridge_emulator.py start -f
python3 scripts/bridge_emulator.py status # Check port forwarding & mDNS state
python3 scripts/bridge_emulator.py logs -f # Tail bridge logs
python3 scripts/bridge_emulator.py stop # Stop bridge daemon
Android TV Emulator.1111 to start controlling the emulator!When swiping on the iPhone touchpad, the Companion Link protocol streams high-frequency differential delta coordinates. atv-core converts these inputs into smooth grid focus shifts on Android TV and ergonomic cursor acceleration on macOS:
KEYCODE_DPAD_UP/DOWN/LEFT/RIGHT focus events.CGEvent.Because the Android emulator runs within an isolated host NAT subnet (fixed virtual IP 10.0.2.15), local physical devices cannot discover it directly:
49152, 49153, and 49154 are forwarded directly into the emulator guest OS via adb forward._mediaremotetv._tcp and _companion-link._tcp) onto the physical Wi-Fi network.atv-core uses a layered driver strategy to ensure lowest possible latency and dependable fallback:
127.0.0.1:5555 for direct Linux input keycode dispatch (<8ms latency).GLOBAL_ACTION_BACK, GLOBAL_ACTION_HOME).CGEvent): Drives mouse motion, ballistics acceleration, and system-level keystrokes.| Apple TV Remote Action | Android TV (Device / Emulator) | macOS (Mac mini / MacBook) |
|---|---|---|
| Touch Surface Swipe (D-pad) | KEYCODE_DPAD_UP / DOWN / LEFT / RIGHT |
Arrow keys ↑ ↓ ← → |
| Touch Surface Swipe (Cursor) | Touch drag / cursor simulation | Smooth cursor movement via CGEvent |
| Tap / Click SELECT | KEYCODE_DPAD_CENTER / Select |
Enter key / Left Mouse Click |
Back Chevron (<) |
GLOBAL_ACTION_BACK |
Escape key |
TV Icon (Home) |
GLOBAL_ACTION_HOME |
Desktop / Configurable shortcut |
| Single Click ⏯ | KEYCODE_MEDIA_PLAY_PAUSE |
Native Play / Pause (NX_KEYTYPE_PLAY) |
| Double Click ⏯ | Fast forward / Next episode | Next Track (⏭) |
| Triple Click ⏯ | Rewind / Previous episode | Previous Track (⏮) |
Volume Up / Down (+/-) |
KEYCODE_VOLUME_UP / DOWN |
Hardware master volume + native HUD |
Mute (Mute) |
KEYCODE_VOLUME_MUTE |
System master mute |
| Side Siri Key | Voice search (KEYCODE_SEARCH) |
Mode toggle (Mouse ⇄ D-Pad) or Siri |
Power (Power) |
Power dialog (GLOBAL_ACTION_POWER_DIALOG) |
Display sleep / wake |
dns-sd -B _mediaremotetv._tcp to verify local Bonjour advertisement.python3 scripts/bridge_emulator.py status.adb connect <TV_IP>:5555 from your computer to trigger initial trust.Certain customized Android TV skins hide standard accessibility menus. Click the "ACCESSIBILITY SETTINGS" dialog in the app to view terminal activation commands, or run:
adb shell settings put secure enabled_accessibility_services com.corvofeng.fakeatv/.AtvAccessibilityService
adb shell settings put secure accessibility_enabled 1
Strip the Gatekeeper quarantine attribute:
xattr -dr com.apple.quarantine /Applications/AppleTVRemote.app
Or import the repository self-signed certificate:
./scripts/import_certificate.sh Corvo_Development.p12
This project is licensed under the MIT License. Intended for educational and local device interoperability research.