Open Source / MIT License / Rust / v0.2.0
Your AirPods. Your Desktop.
Native AirPods support for Linux and Windows. Battery monitoring, ear detection, parametric EQ, ANC control, desktop app, and full CLI — across every AirPods generation. A Rust daemon that speaks the Apple Accessory Protocol over raw Bluetooth.

AirPods Pro 2 (A2698) FW 7A305 Left ██████████████████░░ 92% Right ██████████████████░░ 90% Case ████████████░░░░░░░░ 63% ANC: noise CA: on 1-Bud: off Ears: L=in R=in EQ: Flat
Everything your AirPods can do, from your desktop
ANC Control
Switch between Off, Noise Cancellation, Transparency, and Adaptive modes. Adjust adaptive noise level from 0-100.
Battery Monitoring
Real-time battery levels for Left, Right, and Case. Charging status indicators. Low-battery warnings.
Ear Detection
Auto-pause media when you remove your AirPods. Auto-resume when you put them back in. Works with any MPRIS player.
Parametric EQ
PipeWire filter-chain presets: flat, bass-boost, vocal-clarity, and Crinacle's AirPods Pro target curve.
Auto-Reconnect
Exponential backoff reconnection when your AirPods disconnect. Configurable retry count. Just works.
CLI + D-Bus
Full terminal control via airpods-cli. D-Bus interface for desktop integration. JSON output for scripting.
Supported Devices
| Device | Model Numbers | Features |
|---|---|---|
| AirPods 1 | A1523, A1722 | Battery, Ears, EQ |
| AirPods 2 | A2031, A2032 | Battery, Ears, EQ |
| AirPods 3 | A2564, A2565 | Battery, Ears, EQ |
| AirPods 4 | A3050, A3053, A3054, A3058 | Battery, Ears, EQ |
| AirPods 4 (ANC) | A3055, A3056, A3057, A3059 | ANC, Adaptive, CA |
| AirPods Pro | A2083, A2084, A2190 | ANC |
| AirPods Pro 2 (Lightning) | A2698, A2699, A2700, A2931 | ANC, Adaptive, CA |
| AirPods Pro 2 (USB-C) | A2968, A3047, A3048, A3049 | ANC, Adaptive, CA |
| AirPods Pro 3 | A3063, A3064, A3065, A3122 | ANC, Adaptive, CA |
| AirPods Max | A2096 | ANC |
| AirPods Max 2 | A3184 | ANC, Adaptive, CA |
How It Works
The daemon communicates with AirPods using the Apple Accessory Protocol (AAP) over a raw L2CAP channel on PSM 0x1001. The protocol was reverse-engineered from packet captures between AirPods and Apple devices. After a multi-step handshake, the daemon maintains a persistent connection, sending commands and receiving notifications in a binary format. All state flows through D-Bus on Linux or a local HTTP API on Windows.
┌────────────────────────────┐
│ AirPods (BLE) │
└─────────────┬──────────────┘
│ AAP over L2CAP
┌──────────────┴───────────────┐
│ Daemon (Rust + Tokio) │
│ AAP parser • BLE scan │
│ EQ • MPRIS • reconnect │
└──────┬─────────────┬─────────┘
│ │
Linux │ D-Bus Windows │ HTTP API
│ │
┌──────┴─────┐ ┌─────┴───────┐
│ CLI │ │ Desktop App │
│ Widgets │ │ (Tauri) │
└────────────┘ └─────────────┘CLI Reference
# Status airpods-cli status # full status airpods-cli status --json # JSON for scripts airpods-cli battery # battery only # ANC Control airpods-cli anc noise # noise cancellation airpods-cli anc transparency # transparency airpods-cli anc adaptive # adaptive airpods-cli anc off # disable # Features airpods-cli ca on # conversational awareness airpods-cli eq bass-boost # apply EQ preset airpods-cli eq list # available presets airpods-cli reconnect # force reconnect
Get Started
Linux
Tarball (universal)
Download, extract, run install.sh
AUR (Arch Linux)
yay -S airpods-helper
.deb (Ubuntu/Debian)
Download .deb from releases
Windows
Windows support uses Winsock L2CAP for the AAP protocol with a local HTTP API. BLE discovery via btleplug/WinRT. Includes standalone daemon + Tauri desktop app.