Skip to content

mewset/headsetstatus

Repository files navigation

HeadsetStatus

Lightweight headset battery monitor for Linux

Release AUR Stars Binary size Qt6 C++17 License Ko-fi


A fast, minimal system tray app that shows battery and connection status for wireless/USB headsets. Real-time updates via D-Bus, desktop notifications, and only 39 KB thanks to demoscene-inspired optimizations.

Features

Feature Description
System Tray Native emoji icons with device count badge
Notifications Low battery, charging complete, device disconnect
Headless Mode Run without tray (--no-tray) for servers/scripts
Systemd Service Auto-start on login with user service
Multi-Device Submenu with individual status per device
Real-time Instant updates via D-Bus/UPower
Lightweight 39 KB binary, minimal resource usage
Settings GUI Configure notification preferences and thresholds

Screenshots

Click to expand

System tray with battery status and multi-device menu

Installation

Arch Linux (AUR)

yay -S headsetstatus

From Source

Dependencies:

  • CMake >= 3.16
  • Qt6 (Core, Widgets, DBus)
  • UPower
  • C++17 compiler
git clone https://github.com/mewset/headsetstatus.git
cd headsetstatus
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
sudo cmake --install build --prefix /usr
Build with unit tests
cmake -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON
cmake --build build
ctest --test-dir build --output-on-failure

Usage

# GUI mode (system tray)
HeadsetStatus

# Headless mode (notifications only)
HeadsetStatus --no-tray

# Show version
HeadsetStatus --version

CLI Options

Option Description
-h, --help Show help
-v, --version Show version
-n, --no-tray Headless mode (no system tray)
-d, --debug Enable debug output

Auto-start

Systemd (recommended)

systemctl --user enable --now headsetstatus.service

Hyprland / Sway

# ~/.config/hypr/hyprland.conf
exec-once = HeadsetStatus

# ~/.config/sway/config
exec HeadsetStatus

XDG Autostart

cp /usr/share/applications/HeadsetStatus.desktop ~/.config/autostart/

Configuration

Settings are stored in ~/.config/headsetstatus/config.ini.

Access via tray menu > Settings, or edit directly:

[notifications]
enabled=true
lowBatteryThreshold=20
notifyOnLowBattery=true
notifyOnChargingComplete=true
notifyOnDisconnect=true

Supported Headsets

Auto-detection for 20+ brands:

Jabra, Bose, Sony, Sennheiser, JBL, Beats, HyperX, SteelSeries, Razer, Logitech, Corsair, Plantronics, Audio-Technica, Beyerdynamic, AKG, Skullcandy, Anker, AirPods, Galaxy Buds, Pixel Buds, Surface Headphones

Missing your headset? Open an issue.

Requirements

Requirement Notes
Linux D-Bus support required
Qt6 Core, Widgets, DBus modules
UPower Battery status provider
Notification daemon Optional: libnotify, dunst, mako, swaync

Architecture

HeadsetStatus/
├── main.cpp              # Application entry, CLI parsing, D-Bus listener
├── src/
│   ├── HeadsetManager    # UPower D-Bus device discovery and filtering
│   ├── TrayIconController# System tray icon, menu, emoji rendering
│   ├── NotificationManager# D-Bus notification sending
│   ├── ConfigManager     # Persistent settings (QSettings)
│   ├── SettingsDialog    # Qt GUI for preferences
│   └── HeadsetDevice     # Device data struct
└── tests/                # Qt Test unit tests

Tech Stack

Component Technology
Language C++17
Framework Qt6
IPC D-Bus / UPower
Build CMake 3.16+
Size 39 KB (LTO + UPX)
Tests Qt Test

Size Optimizations

Demoscene-inspired techniques for minimal binary:

  • LTO (Link Time Optimization)
  • Symbol hiding (-fvisibility=hidden)
  • Section garbage collection (-ffunction-sections -fdata-sections)
  • Binary stripping (all symbols removed)
  • UPX LZMA compression (if available)

Result: 431 KB → 39 KB (91% reduction)

Contributing

PRs welcome! Please:

  • Follow existing code style
  • Test before submitting
  • Use clear commit messages
  • Add tests for new functionality

Development

# Debug build with tests
cmake -B build -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON
cmake --build build

# Run tests
ctest --test-dir build --output-on-failure

# Run with debug output
./build/HeadsetStatus --debug

Changelog

See CHANGELOG.md for version history.

Recent Changes (v1.2.0)

  • Headless mode (--no-tray)
  • CLI arguments: --version, --help, --no-tray, --debug
  • Systemd user service
  • 91% binary size reduction (431 KB → 39 KB)

Support

Support on Ko-fi

License

MIT © mewset


39 KB of pure battery anxiety relief

About

A fast Linux tray app for headset battery and connection status

Resources

License

Stars

Watchers

Forks

Sponsor this project

Packages

No packages published