A Qt system tray app for AirPods battery levels, noise control and BLE lid detection on Linux, with experimental battery-only support on Windows. It reads battery reports over the connected control link and BLE broadcasts, including the case's closed-lid advertisements. Support depends on the model and firmware; recorded BLE testing used AirPods Pro 3.
Requires Linux, Docker and Make to build. Running requires BlueZ, a Bluetooth adapter, Qt 6 Widgets/SVG, OpenSSL, libsystemd and a desktop system tray. The container uses Arch Linux; the host needs compatible runtime libraries.
make container-build
./build/release/airpodsPair and connect the buds through your desktop's Bluetooth settings for noise control and connected battery reports. Close other clients holding the AirPods control link, such as LibrePods.
Fetch BLE keys once while the buds are connected, then restart the app:
./build/release/airpods --keysKeys enable identifying your pods and decrypting exact BLE battery levels. Keep the key file private and do not combine --keys with --debug, which logs key replies.
Other modes:
./build/release/airpods --console
./build/release/airpods --once
./build/release/airpods --ble
./build/release/airpods --helpBuild with make container-build-windows; the executable is build/windows/airpods.exe. Windows uses BLE advertisements and keys fetched on Linux:
.\airpods.exe --key-file "R:\airpods-keys.conf"Replace R: with your shared drive letter. Noise control and key extraction remain Linux-only. See development for paths and hardware checks.
With no Linux machine to fetch keys on, WSL2 can do it by forwarding the Bluetooth adapter over USB/IP. See WSL; it is the long way round.
- BLE: advertisements, identity and battery freshness.
- L2CAP: connection, handshake and control packets.
- BLE research: captures and remaining hypotheses.
- Development: checks and UI debugging.
- WSL: fetching keys on a Windows-only machine.
Code is licensed under MIT. Noun Project icons retain their CC BY 3.0 attribution and license.