Daemon for seamless audio handoff between Linux and Apple using AirPods.
- Qt6 (Core, Bluetooth, DBus)
- PulseAudio or PipeWire
- AirPods paired and connected to Linux
Arch Linux:
sudo pacman -S qt6-base qt6-connectivity cmake makeDebian/Ubuntu:
sudo apt install qt6-base-dev libqt6bluetooth6-dev qt6-connectivity-dev cmake build-essentialFedora/RHEL/CentOS:
sudo dnf install qt6-qtbase-devel qt6-qtconnectivity-devel cmake gcc-c++openSUSE:
sudo zypper install qt6-base-devel qt6-connectivity-devel cmake gcc-c++Gentoo:
sudo emerge -av dev-qt/qtbase dev-qt/qtconnectivity dev-util/cmakeVoid Linux:
sudo xbps-install -S qt6-base-devel qt6-connectivity-devel cmake gccNixOS Import the overlay and nixosModule and then use the following
services.airpods-handoff = {
enable = true;
user = "xatuke"; // use your own user or use root idk
macAddress = "F4:55:6F:E5:1A:AF"; // use your airpods mac address
};
git clone https://github.com/xatuke/handoff.git
cd handoff && mkdir build && cd build
cmake ..
makeChange/Set your DeviceID to that of Apple's in /etc/bluetooth/main.conf this is something the AirPods cache so you will have to re-pair your airpods.
DeviceID = bluetooth:004C:0000:0000
After changing this restart the bluetooth service and remove and re-pair your airpods, you only have to do this once.
sudo systemctl restart bluetooth# Get your AirPods MAC address
bluetoothctl devices
# Run the handoff daemon
./airpods-handoff 34:0E:22:49:C4:73Replace 34:0E:22:49:C4:73 with your AirPods Bluetooth MAC address.
To run automatically on login:
# Create systemd user service
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/airpods-handoff.service << EOF
[Unit]
Description=AirPods Linux-Apple Handoff
After=bluetooth.target
[Service]
Type=simple
ExecStart=/path/to/handoff/build/airpods-handoff YOUR_AIRPODS_MAC
Restart=on-failure
[Install]
WantedBy=default.target
EOF
# Enable and start
systemctl --user enable airpods-handoff
systemctl --user start airpods-handoff
# Check status
systemctl --user status airpods-handoffThe app outputs to stdout/stderr. To see logs:
# If running manually
./airpods-handoff 34:0E:22:49:C4:73
# If running as systemd service
journalctl --user -u airpods-handoff -fAudio doesn't switch:
- Check AirPods are connected:
bluetoothctl info YOUR_MAC - Verify A2DP profile is active:
pactl list cards | grep -A 50 bluez - Check logs for errors
Permission denied:
- Add user to
bluetoothgroup:sudo usermod -a -G bluetooth $USER - Logout and login again
MIT