| Crates.io | kairpodsd |
| lib.rs | kairpodsd |
| version | 0.2.2 |
| created_at | 2025-12-06 16:28:24.194864+00 |
| updated_at | 2025-12-06 16:28:24.194864+00 |
| description | D-Bus service for AirPods management in KDE Plasma |
| homepage | https://github.com/can1357/kAirPods |
| repository | https://github.com/can1357/kAirPods |
| max_upload_size | |
| id | 1970394 |
| size | 224,459 |
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 |
sudo apt install build-essential pkg-config libdbus-1-dev libbluetooth-dev
sudo dnf install gcc pkg-config dbus-devel bluez-libs-devel
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
Check bluetooth group (installer handles this automatically):
groups | grep bluetooth
Check service logs:
systemctl --user status kairpodsd
journalctl --user -u kairpodsd -f
Ensure AirPods are paired via KDE Bluetooth settings first
sudo setcap 'cap_net_raw,cap_net_admin+eip' $(command -v kairpodsd)systemctl --user restart plasma-plasmashellIf your AirPods connect but battery information is missing, enable debug logging to help diagnose the issue:
Stop the service:
systemctl --user stop kairpodsd.service
Start in debug mode:
# 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
Reproduce the issue:
Create config file:
mkdir -p ~/.config/kairpods
echo 'log_filter = "debug"' > ~/.config/kairpods/config.toml
Restart the service:
systemctl --user restart kairpodsd.service
View logs:
journalctl --user -u kairpodsd.service -b --no-pager
The debug output will show:
Common causes for missing battery info:
โโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 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"
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.