Native AirPods® integration for KDE Plasma 6 powered by a modern, low-latency Rust backend.

curl -fsSL https://raw.githubusercontent.com/can1357/kAirPods/master/scripts/get.sh | bash
# With options:
curl -fsSL https://raw.githubusercontent.com/can1357/kAirPods/master/scripts/get.sh | bash -s -- --verbose --debug
# Clone the repository
git clone https://github.com/can1357/kAirPods.git
cd kAirPods
# Run the automated installer
./scripts/install.sh
The installer will:
bluetooth group (if it exists)| Component | Minimum Version | Notes |
|---|---|---|
| KDE Plasma | 6.0 | Required for widget support |
| Rust toolchain | 1.88+ | Install Rust |
| BlueZ | 5.50+ | Bluetooth stack (package: bluez or bluez-libs) |
| Linux Kernel | 5.10+ | L2CAP socket support |
| systemd | 247+ | User services support |
| D-Bus | 1.12+ | IPC communication |
Debian/Ubuntu
sudo apt install build-essential pkg-config libdbus-1-dev libbluetooth-dev
Fedora
sudo dnf install gcc pkg-config dbus-devel bluez-libs-devel
Arch Linux
sudo pacman -S base-devel pkgconf dbus bluez-libs
First, pair your AirPods through KDE System Settings → Bluetooth
./scripts/install.sh
Click the widget to see battery levels and control your AirPods
Service won't start / No devices detected
bash
groups | grep bluetooth
bash
systemctl --user status kairpodsd
journalctl --user -u kairpodsd -f
Permission denied errors
sudo setcap 'cap_net_raw,cap_net_admin+eip' $(command -v kairpodsd)Widget not showing up
systemctl --user restart plasma-plasmashellBattery not showing / Debug logging
If your AirPods connect but battery information is missing, enable debug logging to help diagnose the issue:
Stop the service:
bash
systemctl --user stop kairpodsd.service
Start in debug mode: ```bash # Shows general debug info and all Bluetooth packets RUST_LOG=kairpodsd=debug,kairpodsd::bluetooth::l2cap=trace kairpodsd
# Or use the full path if needed RUST_LOG=kairpodsd=debug,kairpodsd::bluetooth::l2cap=trace /usr/bin/kairpodsd ```
Create config file:
bash
mkdir -p ~/.config/kairpods
echo 'log_filter = "debug"' > ~/.config/kairpods/config.toml
Restart the service:
bash
systemctl --user restart kairpodsd.service
View logs:
bash
journalctl --user -u kairpodsd.service -b --no-pager
The debug output will show: - Connection handshake details - All Bluetooth packet exchanges - Battery update messages (or lack thereof) - Any parsing errors or protocol issues
Common causes for missing battery info: - BlueZ experimental features not enabled (installer handles this automatically) - Enhanced Retransmission Mode (ERTM) disabled - Outdated BlueZ version (need ≥ 5.50)
┌─────────────────────────┐
│ Plasma Widget │
│ (Kirigami / QML UI) │
└───────────▲─────────────┘
│ D-Bus IPC
│
┌───────────────────────┐ manages ┌──▼────────────────┐
│ plasmashell (GUI) │◀────────────│ kairpodsd │
│ + panel & widgets │ systemd-u │ (Rust service) │
└───────────────────────┘ └──┬────────────────┘
│ Bluetooth L2CAP
│
┌─────▼───────┐
│ AirPods │
└─────────────┘
kairpodsd) with direct L2CAP accessorg.kairpods.managerFor developers and power users:
# List connected devices
busctl --user call org.kairpods /org/kairpods/manager \
org.kairpods.manager GetDevices
# Control noise mode
busctl --user call org.kairpods /org/kairpods/manager \
org.kairpods.manager SendCommand ssa{sv} "AA:BB:CC:DD:EE:FF" "set_noise_mode" 1 "value" s "anc"
Full API Reference
GetDevices() → s - Returns JSON array of all connected AirPodsGetDevice(address: s) → s - Returns JSON state of specific deviceSendCommand(address: s, action: s, params: a{sv}) → b - Send commandsConnectDevice(address: s) → b - Connect to AirPodsDisconnectDevice(address: s) → b - Disconnect from AirPodsBatteryUpdated(address: s, battery: s) - Battery level changesNoiseControlChanged(address: s, mode: s) - Noise control changesDeviceConnected(address: s) - Connection eventsDeviceDisconnected(address: s) - Disconnection events./scripts/install.sh --uninstall
Or with curl:
curl -fsSL https://raw.githubusercontent.com/can1357/kAirPods/master/scripts/get.sh | bash -s -- --uninstall
This project is licensed under the GNU General Public License v3.0 or later.
See the LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.
For more details on manual installation, advanced configuration, or packaging for distributions, see INSTALL.md.
$ claude mcp add kAirPods \
-- python -m otcore.mcp_server <graph>