● Open research · first published November 2026

Your AirPods
are a mouse.

MousePods reads the motion sensors of AirPods 3 and AirPods Pro on Linux, without any Apple device, and turns your head into a pointer. Along the way, it documents for the first time how AirPods 3 expose those sensors: Apple RemoteHID.

Linux · BlueZ · Wayland & X11 · No root · Apache-2.0 / CC BY 4.0
AirPods Mouse — Motion
The MousePods app showing live head-tracking data from AirPods 3
Firstpublic motion stream from AirPods 3
8hidden sensors documented
~210 Hzmax rate, vs 25 Hz before
0Apple devices required
The problem

AirPods 3 were a dead end.

Apple added head tracking to AirPods 3 in 2021. Open-source tools learned to read it on AirPods Pro and AirPods 4, but never on AirPods 3. Here's the state of things before this project, as of 4 November 2026:

ProjectPlatformAirPods 3 head tracking
LibrePodsAndroid, LinuxNot documented
librepods-rsLinux"Expected: battery, ear detection" only
pods-head-trackerLinuxUntested (built on AirPods 4)
airpods-head-trackWindowsUntested (built on AirPods 4)
aap-head-trackerWindows"Experimental candidate, not tested"
MagicPodsWindowsNo head tracking on genuine AirPods
MousePodsLinuxVerified on hardware, up to ~210 Hz
The discovery

Three things nobody
had written down.

Together they explain why AirPods 3 looked unsupported. Each is backed by real captures and automated tests. The full list of findings, with the open questions, is in DISCOVERIES.md.

1

They ignore the known protocolNEW

Every published start command (SensorDataWX, services 1–31 and 79, in any order) gets no data and no acknowledgement. Their capability list lacks the "sensor data v2" entry that newer AirPods have.

Evidence: ~300 recorded attempts, documented in the journal
2

They speak Apple RemoteHIDNEW

On the legacy RTBuddy channel 0x800, each sensor is a virtual HID device with its own report descriptor, driven with HID Get/SetReport. Writing the "Report Interval" feature report starts the stream.

Evidence: iOS 26.1 RemoteHID.framework, clone firmware, real AirPods 3
3

The MTU hides the sensorsNEW

At Linux's default L2CAP receive MTU (672 bytes), the buds announce only the descriptors that fit, and none of the motion ones do. At 2582, the value iOS uses, all eight appear.

Evidence: announcements captured at both MTUs
How it works

From a bud to a cursor.

One Python process, no kernel module, no root. Gravity sets what "horizontal" means, so the result doesn't depend on how the bud is held.

AirPods3 or Pro 2 L2CAP 0x1001AACP · MTU 2582 RemoteHIDor SensorDataWX Motion enginegyro + gravity Cursoruinput · 120 Hz Bluetoothframes58-byte blockdx, dy auto-detected per modelyaw · pitch · roll, drift-corrected
ConnectEncrypted L2CAP link, receive MTU 2582, standard AACP handshake.
Start the sensorRemoteHID for AirPods 3, SensorDataWX for AirPods Pro and AirPods 4.
Compute motionYaw around the vertical, pitch around a calibrated axis, bias re-estimated when still.
Move the cursorMouse, pointer or glide mode, One-Euro smoothing, rendered at 120 Hz.
The protocol

One frame starts the sensors.

This is the exact message that makes AirPods 3 stream their motion at 100 Hz, decoded byte by byte. The full specification is in REMOTEHID-PROTOCOL.md.

Sub-packet header: a little-endian u32. Bits 0–6 = device ID (7 = devmotion6), bits 7–16 = length (10), bits 17–19 = kind (3 = SetReport).
Report: type 2 (feature), report ID 1 = Report Interval (HID Sensor usage 0x030E), value in µs.
Answer: the buds acknowledge, then send an InputReport every 10 ms, carrying the same 58-byte motion block as AirPods Pro.
PC → AirPods
HostConnect00 02 00 00: "who's there?"
AirPods → PC
DeviceConnect ×8One per sensor, with a plist and a HID report descriptor.
PC → AirPods
SetReportFeature report 1 = interval in µs. 0 stops the stream.
AirPods → PC
InputReportQuaternion, gyro, acceleration, gravity, up to ~210 Hz.
Inside the buds

Eight sensors, mapped.

Each is a virtual HID device announced by AirPods 3. All their report descriptors are decoded in AIRPODS3-SENSORS.md.

IDNameWhat it isStatus
7devmotion6Fused motion: attitude quaternion, rotation rate, user acceleration, gravityDecoded, used
4accelStandard HID Sensor accelerometer, int32, 10⁻⁵ gDecoded
5gyroStandard HID Sensor gyrometer, int32Decoded
6cmaCoreMotion activity, 182-byte vendor reportStarts, content unknown
1kadabraVendor service, three report familiesUnknown
2mandoVendor service, 8 input reportsUnknown
3neorelayVendor relay, 11 input reportsUnknown
8iedrelayVendor relay, 166-byte input reportUnknown
Live data

Real AirPods 3 data, replayed.

1,873 samples recorded from devmotion6 while turning the head left and right, looking up and down, then tilting it. This is the raw stream, decoded in your browser.

—
gyro Xgyro Ygyro Z°/s, sensor frame
Tool

RemoteHID decoder.

Paste an AACP frame in hex. The decoder handles RemoteHID sub-packets, DeviceConnect announcements, motion reports, SensorDataWX protobuf and the common opcodes. Everything runs locally in your browser.

The app

Everything, in one window.

A local app in the style of macOS Settings. Battery, live 3D orientation, every setting applied instantly, guided calibration, and an explorer to start and query each sensor.

Overview
Overview: batteries, mode, link quality
Sensor explorer
Sensor explorer: every RemoteHID device
Calibration
Calibration: head, bud in hand, pointer corners
Get started

Three commands.

You need Linux with BlueZ, AirPods paired with your PC, and write access to /dev/uinput (granted to the desktop user by uaccess on most distributions).

It can't run in a browser: Web Bluetooth only speaks BLE, and AirPods use Classic Bluetooth.

# clone and install git clone https://github.com/starman-tech/mousepods cd mousepods && python3 -m venv .venv .venv/bin/pip install -r requirements.txt # open the app (starts the controller) .venv/bin/python airpods_mouse_controller.py --ui

Status: what is real, what is not

AirPods 3 motion stream (RemoteHID), up to ~210 HzVerified on hardware
AirPods Pro 2 motion stream (SensorDataWX), 25 HzVerified on hardware
Mouse mode (head, bud in hand), app, shortcutsTried on hardware · 37 tests
Pointer mode with corner calibrationSimulation only
Glide mode (slide a bud on the table)Experimental
Case as a mouse, buds insideImpossible: AirPods 3 sensors are off in the case
FAQ

Questions.

Which AirPods work?

AirPods 3 (A2564/A2565) and AirPods Pro 2 are verified. AirPods 4 and AirPods Pro 3 use the same SensorDataWX protocol as Pro 2, which other projects have confirmed. AirPods 2, AirPods Pro 1 and AirPods Max are untested.

Do I need an iPhone, a Mac, or root?

No. Everything runs on a plain Linux PC as a normal user. It talks to the AirPods over Bluetooth (L2CAP) and moves the cursor through a virtual input device.

Windows or macOS?

Not today. The protocol itself doesn't depend on the OS. Windows needs a driver that exposes L2CAP (like MagicAAP), and macOS keeps the AirPods channel for itself.

Is it safe for my AirPods?

MousePods only reads sensor streams. It doesn't touch the firmware. The app has an advanced panel that can send raw commands, and that panel is clearly marked.

Did an AI do this?

I reverse-engineered it with Claude (Anthropic) as an AI pair engineer. Claude ran the probes, read the public research, disassembled a clone firmware statically, and wrote the code and the tests. I held the AirPods, made the calls and checked every result on real hardware. The journal documents the whole process, failures included.

Reuse

Use it. Credit it.
Tell me.

This work is open, and it was hard to find. If it helps you, keep the credit attached.

Code: Apache-2.0

Use it anywhere, including commercially. Redistributions and derivative works must keep the copyright and the NOTICE, and mark modified files.

Findings: CC BY 4.0

The documentation, protocol write-ups and captures can be reused anywhere (articles, videos, other projects, AI datasets) with credit and a link, saying if anything was changed.

Tell me 👋

Not a legal requirement, just a request: if you use MousePods or its findings, open an issue or mention @starman-tech. I'll link to your project.

How to credit

MousePods by Matteo Gaudioso (starman-tech): https://github.com/starman-tech/mousepods

BibTeX

@misc{gaudioso2026mousepods, author = {Gaudioso, Matteo}, title = {MousePods: AirPods 3 head tracking and the Apple RemoteHID protocol}, year = {2026}, url = {https://github.com/starman-tech/mousepods} }

Built on public work by LibrePods, apple-wireshark, mutix, ntpods and OpenHuilian. Their work on AirPods Pro made this possible.