A native Linux desktop controller for Soundcore earbuds and headphones.
Soundcore Control brings the most useful Soundcore mobile-app controls to a responsive desktop interface. It talks directly to paired devices through BlueZ and OpenSCQ30's Soundcore protocol implementation.
Important
Soundcore Control currently targets Liberty 4 Pro (verified), plus R60i NC, P20i/P25i/R50i, Life Q30, and Space One Pro. Support for the latter four is new and their Bluetooth device names are best-effort guesses. If your device isn't found, please open an issue with the exact name it advertises.
- Live left, right, and case battery levels
- Continuous ambient control on devices with manual noise-canceling/transparency ranges:
- Levels 1–5 for transparency
- A dedicated Normal mode in the center
- Levels 6–10 for noise canceling
- Mode-only ambient picker (Normal/Transparency/Noise Canceling) on devices without a manual intensity range
- Automatic recovery when supported earbuds omit the active ambient strength during startup
- Soundcore equalizer presets and an eight-band custom equalizer
- Daily controls including wearing detection, Easy Chat, wind-noise reduction, auto power-off, LDAC, and sound leak compensation — shown per device based on what it actually supports
- Configurable left/right press, long-press, and slide gestures
- Persistent system tray menu with battery information, ambient-mode selection, Bluetooth disconnect, reopen, and quit actions
- Responsive, scrollable interface usable down to a 420 px window width
- Control labels follow your system locale via
openscq30-lib's translations (~12 languages)
| Equalizer | Daily and earbud controls |
![]() |
![]() |
- Linux with BlueZ
- A supported device already paired and connected
- A desktop with Wayland or X11
- Rust 1.85 or newer when building from source
Install the build and runtime dependencies on Arch Linux:
sudo pacman -S --needed \
base-devel rustup pkgconf dbus bluez bluez-utils \
libxkbcommon wayland mesa libx11 libxcursor libxi libxrandr
rustup default stablePackage names differ on other distributions.
Clone the repository and run the user-level installer:
git clone https://github.com/d7omdev/soundcore-control.git
cd soundcore-control
./install.shThe installer builds an optimized release and installs:
| Item | Path |
|---|---|
| Binary | ~/.local/bin/soundcore-control |
| Desktop launcher | ~/.local/share/applications/soundcore-control.desktop |
| Application icon | ~/.local/share/icons/hicolor/512x512/apps/soundcore-control.png |
If you have an existing Liberty Control install, install.sh removes its binary, desktop launcher, icon, and systemd watcher unit automatically, and your paired-device database is migrated to the new location on first launch.
Open Soundcore Control from the desktop launcher, or run:
~/.local/bin/soundcore-controlcargo run --releaseIf more than one compatible device is visible, select one by MAC address:
SOUNDCORE_CONTROL_MAC=AA:BB:CC:DD:EE:FF cargo run --releaseWhile Soundcore Control is running, its logo appears in desktops that support the StatusNotifierItem protocol. Click the icon to view battery information, change ambient mode, disconnect the device, reopen the window, or quit the application.
Closing the main window hides it while the tray service and Bluetooth connection continue running. Use Quit Soundcore Control in the tray menu to exit completely. Tray presentation depends on the desktop shell or status bar.
- Confirm the device is awake and connected in your desktop Bluetooth settings.
- Run
bluetoothctl info <MAC>and check that it reportsConnected: yes. - Reopen Soundcore Control or press Try again.
- If your device is one of the newly added models, its Bluetooth name may not match what we guessed — please open an issue with the exact advertised name.
Confirm that your desktop panel supports StatusNotifierItem/AppIndicator tray icons. Some minimal Wayland setups require enabling a tray module in the panel configuration.
On devices with manual noise-canceling/transparency ranges, Soundcore Control repairs an occasionally missing active-mode strength during startup. If the device was connected after the app opened, press Try again to establish a fresh control session.
cargo fmt --all -- --check
cargo test --all-targets
cargo clippy --all-targets -- -D warningsThe app is split into focused modules:
src/device.rs- BlueZ/OpenSCQ30 connection and command workersrc/devices.rs- the supported-device registry, loaded fromassets/devices.tomlsrc/domain.rs- device-to-UI state mapping and command translationsrc/tray.rs- Linux StatusNotifierItem integrationsrc/app.rs- theeframe::Appstate machine (connection/tray event handling)src/ui/- egui screen and widget code, split by feature (ambient, equalizer, controls, header, shared widgets, theme)src/main.rs- CLI entry point and run-mode dispatch
Adding a new device model means adding an entry to assets/devices.toml (and a PNG under assets/icons/ if you have one), not editing Rust code.
Runtime state is stored in ${XDG_DATA_HOME:-~/.local/share}/soundcore-control/devices.sqlite3. Soundcore Control has no telemetry and does not require an internet connection at runtime.
rm -f ~/.local/bin/soundcore-control
rm -f ~/.local/share/applications/soundcore-control.desktop
rm -f ~/.local/share/icons/hicolor/512x512/apps/soundcore-control.pngBluetooth protocol support is provided by openscq30-lib.
Soundcore is a trademark of its respective owner. Soundcore Control is an unofficial community project and is not affiliated with or endorsed by Soundcore or Anker Innovations.
Licensed under the GNU General Public License v3.0 or later.



