LATEST A2854 STATUS (2026-10-25): See the current operational handoff. At
abd69aa, Windows Release 381/381 and Stop-specific 28/28 passed; a real encrypted A2854 GUI session (~27s) ended by window X-close with both CCCDs disabled, accepted Disconnect and actual local 0x16. Earlier64b927cdemonstrated ~100s actual Windows mouse movement (but 0x08 timeout on Stop). New successor85f20a7adds pressure-assisted click wobble protection without synthetic pressure-triggered clicks. It is not yet independently Windows-built or hardware-tested. Direct Stop button then Start remains unverified. Keep the working protected bond, driver and physical calibration untouched. First-generation pairing directions below do not apply to A2854.
A WPF (.NET 10) application plus a user-mode driver to use the gen 1 Siri Remote (Apple TV 2015/2017, A1513/A1962) on Windows 11: touch surface, buttons, tvOS-style gestures and a virtual keyboard.
C# port of a-funk/open-appleremote (MIT, Python/Linux). The decoder and the
gesture engine are line-by-line ports of decode.py and gestures.py; the upstream docs/PROTOCOL.md describes the protocol.
| Remote | Guide |
|---|---|
![]() |
![]() |
| Macros (Blockly editor) | Settings (key mapping, language, Bluetooth driver) |
![]() |
![]() |
No kernel driver. Windows 11 already ships the HID over GATT driver (HidBthLE). Since the remote only exposes vendor-specific
reports (input 0xFC, feature 0xF0), it stays silent until it is unlocked:
| Linux (open-appleremote) | Windows (here) |
|---|---|
/dev/hidrawN, HIDIOCSFEATURE |
SetupAPI + hid.dll: HidD_SetFeature, asynchronous ReadFile |
Unlock: report 0xF0 = 0xAF |
same, buffer padded to FeatureReportByteLength (required by Windows) |
| Reconnect after sleep | reconnect loop + link probe (unlock if silent for more than 8 s) |
/dev/uinput (virtual keyboard) |
SendInput |
A "real" virtual HID keyboard (VHF/KMDF) would need a signed driver; SendInput is enough to drive an application.
src/AppleRemote.Core decoder, gestures (One Euro), keymap, capture replay (net10.0, portable)
src/AppleRemote.Windows HID enumeration, unlock, reading, SendInput (net10.0-windows)
src/AppleRemote.App WPF window (net10.0-windows)
tests/AppleRemote.Tests xunit, runs on any OS (macOS included)
- Pair: hold Menu + Volume + for ~5 s near the PC, then Settings > Bluetooth & devices > Add device (the "Pair" button opens the page). The remote shows up under its serial number.
- Start the application: it looks for the remote, unlocks it and displays keys, fingers and gestures.
- Tick Virtual keyboard to send real key presses (default mapping below).
| Remote | Key |
|---|---|
| swipe / flick up, down, left, right | arrow keys |
| click (press on the surface) | Enter |
| Menu | Esc |
| TV / Home | Browser: home |
| Play/Pause, Volume + / − | media keys |
| Siri | nothing |
Custom mapping: keymap.example.json (entries up down left right click menu tv playpause volup voldown siri;
value = key name, VK code 1-254, or null to disable; names: Keys.cs).
Windows running as administrator ignore key presses from a non-elevated program (UIPI): run the app as administrator in that case.
The AppleRemoteDriver filter is signed with a test certificate, not a Microsoft-issued one, so Windows only loads it
in test-signing mode. Without the filter, the Windows Bluetooth stack drops the remote (see CLAUDE.md); the alternative is the
direct Bluetooth mode (USB adapter under WinUSB), which needs no kernel driver.
- Turn Secure Boot off in the UEFI settings (test-signing is refused while it is on). Check with
Confirm-SecureBootUEFIin PowerShell. Note that some anti-cheat software and BitLocker setups depend on it. - In an administrator terminal, enable test-signing, then restart the PC:
A "Test Mode" watermark appears on the desktop.
bcdedit /set testsigning on - Run the app, then use its install filter button (or
AppleRemote.DriverInstaller, as administrator). It trusts the bundledWDRLocalTestCert.cer(Root and TrustedPublisher stores) and installs the package from thedriver\folder withpnputil. Keep the 4 files ofdriver\together (.sys,.inf,.cat,.cer). No PC restart is needed after that. - Pair the remote again if needed.
To undo: uninstall the filter from the app, remove the certificate if you wish (certmgr.msc, "Trusted Root Certification
Authorities" and "Trusted Publishers"), then bcdedit /set testsigning off, restart, and turn Secure Boot back on.
The released package is signed with the author's test certificate. If you prefer not to trust it, build and sign the filter with a certificate of your own (the private key never leaves your PC):
- Install the prerequisites: Rust, cargo-make, the Windows Driver Kit (WDK) and
LLVM (
LIBCLANG_PATH=C:\Program Files\LLVM\bin). - Enable test-signing as above (steps 1 and 2).
- Clone AppleRemoteWin-Driver and run, in its root:
The build creates a self-signed
cargo make --profile releaseWDRLocalTestCertin your own certificate store (WDRTestCertStore), signs the.catwith it and writes the package, with its.cer, totarget\release\AppleRemoteDriver_package\. (A Release build ofAppleRemote.Appdownloads the latest published package intodriver\instead; replace those files with yours.) - Install that package with the app or
AppleRemote.DriverInstaller: it trusts the.cernext to the.sys, which is now yours.
Every rebuild re-stamps the INF and re-signs the .cat: always install the four files from the same build.
dotnet build AppleRemote.sln # on Windows (Visual Studio 2026 or .NET 10 SDK)
dotnet test tests/AppleRemote.Tests # on any OS
dotnet publish src/AppleRemote.App -c Release -r win-x64 --self-contained true
From macOS/Linux: -p:EnableWindowsTargeting=true lets you compile (not run) the Windows projects.
- "Apple HID devices" lists what Windows sees (VID/PID, usages, report lengths). The gen 1 Siri Remote is
VID 004C PID 026D. Nothing in the list = not paired/connected. - Scan Bluetooth LE listens to advertisements around the PC (without pairing): a remote in pairing mode shows up with the Apple manufacturer (0x004C) and its serial number as name, even if "Add a device" does not list it.
- Record a capture writes a
.jsonlin the format ofmonitor --raw(replayable here via "Replay a capture", or in the Linux tool). Siri audio frames are truncated: voice is never written. - After a long sleep, the button press that wakes the remote may be lost: press again.
35 xunit tests. SampleTests replays sample.jsonl (a real capture of an A1962, from the upstream project) through the whole
pipeline and compares every event (step, fingers, buttons, gestures) with golden.json, produced by the original Python code on the same
capture: the C# port is therefore checked against the reference.
- Windows layer not tested on hardware: it compiles, but the real HID access (collection seen by
HidBthLE, unlock viaHidD_SetFeature) has not been run with an actual remote. If unlocking fails, the log says so; in that case, send the output of "Apple HID devices" and a capture. - Voice (Siri) not decoded; gen 2/3 Siri Remotes not supported (different reports and different unlock); a single remote only.
- Gesture constants tuned for a gen 1 remote under Linux: retune if needed (
Gestures.cs).
GNU AGPL v3 or later (AGPL-3.0-or-later), see LICENSE.
Decoder.cs and Gestures.cs are ports of open-appleremote, released under the MIT license:
its copyright notice is kept in LICENSE-MIT-open-appleremote.
The kernel driver lives in its own repository, AppleRemoteWin-Driver, under the MIT license: see its LICENSE and README.md.



