MyGo 云音乐
Go와 MyGo로 만든 서드파티 네이버 클라우드 뮤직 데스크톱 클라이언트
Linux용 SteelSeries Arctis 헤드셋 관리 앱, 이퀄라이저·채팅·게임·미디어·ANC·배터리·OLED
A Linux application for SteelSeries Arctis headsets: Sonar-style equalizer, ChatMix, a Game/Chat/Media/Output mixer, sidetone, ANC, battery and OLED — built on PipeWire.
미디어Python · ShellGitHub @loteran온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
SteelSeries GG and Sonar alternative for Linux — Sonar EQ with 330+ game presets, ChatMix, Game/Chat/Media mixer, spatial audio, sidetone, ANC, battery and OLED. Arctis Nova Pro Wireless & Wired, Nova Pro Omni, Nova Elite, Nova 7/7P/5/3, Arctis 7/7+/9/Pro Wireless, GameBuds. Built on PipeWire.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
(Arch, CachyOS, EndeavourOS, Manjaro): the signing key was rotated on 2026-09-09. Your next sudo pacman -Syu will fail with an unknown trust signature error until you trust the new key. Fix with either:
• curl -fsSL https://loteran.github.io/Arctis-Sound-Manager/install.sh | bash -s -- --force
• or the manual commands in issue #239
Not affected: AUR, COPR, PPA, PyPI users.
A Linux GUI for SteelSeries Arctis headsets — device settings, 4-channel audio mixer (Game / Chat / Media / Output), automatic media routing, and a full Sonar EQ system powered by PipeWire filter-chain.README 전문 보기 ↗[!NOTE]
🔬 Help map your headset
SteelSeries' specifications list more settings for most headsets than ASM offers today (base station screen, line out, stream mix, mic and Bluetooth EQ…). With ASM 1.6.2 or later and your headset on, run this once — read-only, about a minute, nothing is changed:
asm-cli tools probeThen attach
~/asm-probe.jsonto #331 with your headset's name. One file per model is enough to add what its specification defines.
[!WARNING]
⚠️ WARNING — Pacman repository users
(Arch, CachyOS, EndeavourOS, Manjaro): the repository signing key changed again on 2026-10-12. The key announced in #239 was lost in a CI mistake, and v1.6.0 briefly went out signed with the older retired key (#322). The repository now has a dedicated key, pinned in the release workflow so this cannot silently happen again:
76AA 4ED4 A738 B4FF 07E1 70A2 49F4 994D 1453 1BD4If
sudo pacman -Syufails with anunknown trustsignature error, trust the new key with either:
curl -fsSL https://loteran.github.io/Arctis-Sound-Manager/install.sh | bash -s -- --force- or by hand:
curl -fsSL https://github.com/loteran/Arctis-Sound-Manager/releases/download/pacman-repo/arctis-sound-manager.key -o /tmp/asm.key sudo pacman-key --add /tmp/asm.key sudo pacman-key --lsign-key 76AA4ED4A738B4FF07E170A249F4994D14531BD4 sudo pacman -SyuNot affected: AUR, COPR, PPA, PyPI users.
The SteelSeries GG and Sonar alternative for Linux: manage your SteelSeries Arctis headset on Linux — device settings, 4-channel audio mixer (Game / Chat / Media / Output), automatic media routing, and a full Sonar EQ system powered by PipeWire filter-chain. New here? What works on Linux out of the box, and what ASM adds.
Supported Arctis headsets on Linux: Arctis Nova Pro Wireless, Arctis Nova Pro Wired, Arctis Nova Pro Omni, Arctis Nova Elite, Arctis Nova 7 (Gen 1 & Gen 2), Arctis Nova 7P, Arctis Nova 5 / 5X, Arctis Nova 3 / 3P / 3X, Arctis 7, Arctis 7+, Arctis 5 (2018), Arctis 9 Wireless, Arctis Pro Wireless, Arctis 1 / 7X / 7P Wireless, and Arctis GameBuds / GameBuds X — full list with Product IDs in Supported devices.
🎚️ ASM Presets — browse and share community EQ presets! 🎨 ASM Themes — browse and share color themes, previewed on a miniature of the app! 💬 Join the Discord — chat, share presets and get help from the community! 📝 Share your experience in Discussions — feedback helps improve compatibility for everyone!
Arctis_Media instead of staying on a non-Arctis sinkasm-cli volume game +5, chat mute, media 40, or several at once (game +5 chat -5); bind it to any key in your desktop's own shortcut settings, including the unused function keys a macropad dial sends (details)ASM Clips, wherever your system puts it; change it from the Clips pagepkexec promptasm-daemon --verify-setup, asm-cli diagnose -o file.txt, and asm-cli tools probe, which asks the headset for its state with read-only queries and saves the raw repliesasm-cli status --json gives battery, power, mic and channel levels to Waybar, Polybar or any script (details)ARCTIS_LOG_LEVEL env var — debug / info / warning, honored by daemon, GUI and router| Home — mixer | Sonar EQ |
|---|---|
| Custom EQ | Settings |
|---|---|
| Headset status | DAC — OLED display control |
|---|---|
| Device | Working | Users | Product ID(s) |
|---|---|---|---|
| Arctis 1 / 7X / 7P Wireless | ✅ | 7 | $\color{royalblue}{\textbf{12b3}}$, 12b6, $\color{royalblue}{\textbf{12d5}}$, $\color{royalblue}{\textbf{12d7}}$ |
| Arctis 5 (2018) | ✅ | $\color{royalblue}{\textbf{12aa}}$ | |
| Arctis 7 / 7 2019 / Pro GameDAC | ✅ | 30 | $\color{royalblue}{\textbf{1260}}$, $\color{royalblue}{\textbf{12ad}}$, $\color{royalblue}{\textbf{1280}}$ |
| Arctis Pro 2019 (wired, audio only) | ✅ | $\color{royalblue}{\textbf{1252}}$ | |
| Arctis 7+ / PS5 / Xbox / Destiny | ✅ | 43 | $\color{royalblue}{\textbf{220e}}$, $\color{royalblue}{\textbf{2212}}$, $\color{royalblue}{\textbf{2216}}$, 2236 |
| Arctis 9 Wireless | ✅ | 23 | $\color{royalblue}{\textbf{12c2}}$ |
| Arctis Pro Wireless | ✅ | 64 | $\color{royalblue}{\textbf{1290}}$, $\color{royalblue}{\textbf{1294}}$ |
| Arctis Nova Pro Wireless / X | ✅ | 488 | $\color{royalblue}{\textbf{12e0}}$, $\color{royalblue}{\textbf{12e5}}$, $\color{royalblue}{\textbf{225d}}$ |
| Arctis Nova Pro Wired / Xbox Wired | ✅ | 58 | $\color{royalblue}{\textbf{12cb}}$, $\color{royalblue}{\textbf{12cd}}$ |
| Arctis Nova Pro Omni | ✅ | 66 | $\color{royalblue}{\textbf{2290}}$ |
| Arctis Nova 3 | ✅ | 17 | $\color{royalblue}{\textbf{12ec}}$ |
| Arctis Nova 3P / 3X Wireless | ✅ | 46 | $\color{royalblue}{\textbf{2269}}$, $\color{royalblue}{\textbf{226d}}$ |
| Arctis Nova 5 / 5X | ✅ | 105 | $\color{royalblue}{\textbf{2232}}$, $\color{royalblue}{\textbf{2253}}$, $\color{royalblue}{\textbf{2255}}$, $\color{royalblue}{\textbf{2264}}$ |
| Arctis Nova 7 Gen 1 | ✅ | 59 | $\color{royalblue}{\textbf{2202}}$, $\color{royalblue}{\textbf{2206}}$, $\color{royalblue}{\textbf{223a}}$, $\color{royalblue}{\textbf{227a}}$, $\color{royalblue}{\textbf{22a4}}$ |
| Arctis Nova 7 Gen 2 | ✅ | 229 | $\color{royalblue}{\textbf{22a1}}$, $\color{royalblue}{\textbf{227e}}$, $\color{royalblue}{\textbf{2258}}$, $\color{royalblue}{\textbf{229e}}$, $\color{royalblue}{\textbf{22a9}}$, $\color{royalblue}{\textbf{22a5}}$, $\color{royalblue}{\textbf{22ab}}$ |
✅ Confirmed by at least one opted-in user 🔵 Product IDs shown in blue are actively in use — detected on real users' devices through the app's anonymous usage stats 🔴 Seen in telemetry but not yet declared in a device YAML — support pending
Your model is listed but a setting you know from SteelSeries GG is missing? Run asm-cli tools probe and attach ~/asm-probe.json to #331 — one file per model is enough to add what its specification defines.
Arctis GameBuds charging case (230c, GameBuds X 231a): when the case is plugged into the computer over USB, the Headset page also shows its battery, charging state, lid and which earbuds are seated in it. The case is read alongside the dongle, never instead of it, so plugging or unplugging it does not touch your audio.
Find your headset's Product ID (the 4 hex digits after 1038:):
lsusb -d 1038:
If your PID isn't listed above, ASM doesn't recognise your headset yet — here's how to get it added.
ASM describes each headset with a small YAML "device profile". Adding a new headset means creating (or extending) one of these. Many "new" headsets are just an existing model with a fresh Product ID (e.g. a new colorway) — in that case adding the single PID is enough.
1. Collect your device's USB details
lsusb -d 1038: # your PID = the 4 hex digits after "1038:"
lsusb -v -d 1038:XXXX > lsusb.log # full interface/endpoint layout (replace XXXX with your PID)
asm-cli diagnose -o asm-diagnose.txt # ASM's view of the device
2. New variant of a model already in the table?
Open the matching profile in ~/.config/arctis_manager/devices/ (e.g. nova_elite.yaml) and add your PID under product_ids::
product_ids:
- 0x2244
- 0x2270 # ← your PID
Then restart the daemon and test:
systemctl --user restart arctis-manager.service
If the device controls respond, it works. If the daemon log shows Failed to find interface, your command interface differs: set command_interface_index: [<interface>, <alt_setting>] to the HID interface from your lsusb -v that carries the 64-byte interrupt endpoint (often [3, 0]).
ℹ️ Edits under
~/.config/arctis_manager/devices/are perfect for testing, but may be overwritten on update — do step 3 to make support permanent.
3. Open an issue so it ships for everyone
Open an issue and attach lsusb.log + asm-diagnose.txt (and mention whether the quick edit above worked). Brand-new models can need their HID control protocol reverse-engineered from a Windows USB capture, but the lsusb layout is enough to get most variants added in the next release.
Quick install — any distribution, one command:
curl -fsSL https://loteran.github.io/Arctis-Sound-Manager/install.sh | bash
It detects your distribution, installs the matching native package (pacman repository / COPR / PPA — or a Distrobox container on Bazzite / Silverblue / SteamOS), and runs asm-setup for you. Prefer to read it first? curl … -o asm-install.sh, inspect it, then bash asm-install.sh.
Or install manually for your distribution below. All native packages (AUR / COPR / PPA) pull in every dependency automatically. After installing, run asm-setup once — it configures udev rules, systemd services, PipeWire and downloads the HRIR file.
[!IMPORTANT] Arch users — use the signed pacman repository, not the AUR, for now. The AUR package is behind the latest release: our release automation stopped being able to push to it (issue #229), and the fix has to reach the AUR through that same automation. The signed pacman repository below is independent of the AUR and always carries the latest release — it's the recommended way to install and update ASM on Arch until the AUR catches up.
Needs no AUR helper, compiles nothing, and — unlike the AUR — is visible to Discover and GNOME Software, so ASM can be installed and updated from your software centre like any other application.
The repository is signed with this key — check that it is the one you trust:
76AA 4ED4 A738 B4FF 07E1 70A2 49F4 994D 1453 1BD4
curl -fsSL https://github.com/loteran/Arctis-Sound-Manager/releases/download/pacman-repo/arctis-sound-manager.key -o /tmp/asm.key
sudo pacman-key --add /tmp/asm.key
sudo pacman-key --lsign-key 76AA4ED4A738B4FF07E170A249F4994D14531BD4
sudo tee -a /etc/pacman.conf <<'EOF'
[arctis-sound-manager]
Server = https://github.com/loteran/Arctis-Sound-Manager/releases/download/pacman-repo
EOF
sudo pacman -Sy arctis-sound-manager
asm-setup
Updates then arrive with sudo pacman -Syu, or through your desktop's update
notifier.
For ASM to actually show up in Discover or GNOME Software, those need a PackageKit backend — which most Arch-family installs do not ship by default. On KDE:
sudo pacman -S --needed packagekit packagekit-qt6 # GNOME: packagekit only
Without packagekit-qt6, Discover loads no pacman backend at all and searching
for "arctis" returns nothing, however well the repository is configured. The repository also carries python-pulsectl and
noise-suppression-for-voice, which are AUR-only on plain Arch; if your distro
already provides them (CachyOS does), its own versions keep priority.
[!NOTE] The AUR package is currently behind the latest release (see the note above): the release automation could no longer push to it, which is fixed but has yet to land there. If
yayorparufails withfatal: No current branch, remove the cached clone (rm -rf ~/.cache/yay/arctis-sound-manager) and use the signed pacman repository meanwhile.
paru -S arctis-sound-manager
asm-setup
sudo dnf copr enable loteran/arctis-sound-manager
sudo dnf install arctis-sound-manager
asm-setup
sudo add-apt-repository ppa:loteran/arctis-sound-manager
sudo apt update && sudo apt install arctis-sound-manager
asm-setup
The PPA builds for Ubuntu 24.04 (Noble) and 26.04 (Resolute). Once Ubuntu retires a series, Launchpad stops accepting uploads for it but keeps serving the last package published before then — so 25.10 (Questing) is stuck on 1.2.8, and
aptwill not say so. On any other series, and on Debian, install the.debfrom the latest release instead:sudo add-apt-repository -r ppa:loteran/arctis-sound-manager # if you added it curl -fsSL https://api.github.com/repos/loteran/Arctis-Sound-Manager/releases/latest \ | grep -o 'https://[^"]*_all\.deb' | head -1 | xargs curl -fLO sudo apt install ./arctis-sound-manager_*.debThe installer does this for you: it checks what the PPA really offers before trusting it.
ASM runs inside a Distrobox container and is exported transparently to the host. Run the script for your distro directly — no need to clone:
Bazzite (full deps including noise-suppression-for-voice):
bash <(curl -fsSL https://raw.githubusercontent.com/loteran/Arctis-Sound-Manager/main/scripts/distrobox/bazzite.sh)
SteamOS / Steam Deck:
bash <(curl -fsSL https://raw.githubusercontent.com/loteran/Arctis-Sound-Manager/main/scripts/distrobox/steamos.sh)
udev rules in
/etc/udev/rules.d/are reset on major SteamOS updates — re-run the script after each upgrade.
Fedora Silverblue / Kinoite:
bash <(curl -fsSL https://raw.githubusercontent.com/loteran/Arctis-Sound-Manager/main/scripts/distrobox/silverblue.sh)
Each script is idempotent. Flags: --reinstall (rebuild container), --no-services (skip systemd).
Troubleshooting — text displays as blocks (font rendering issue)
If the ASM interface shows only squares instead of text, your fontconfig cache is likely corrupted. Run inside the Distrobox container:
rm -rf ~/.cache/fontconfig/*
fc-cache -f -v
Then restart ASM. (Thanks to H0DG3 for identifying this fix!)
Troubleshooting — Spatial Audio is silent / audio cuts out inside the container
Inside a Distrobox, ASM's daemon is supposed to talk to your host PipeWire through the sockets the install script forwards (pipewire-0 / pipewire-0-manager) — it must not run a second PipeWire daemon of its own. Two symptoms point at a broken container/host audio split:
A second PipeWire is running in the container. The container should only connect to the host graph, never start its own pipewire.service. Check both sides:
# inside the ASM container
systemctl --user is-active pipewire filter-chain
pipewire --version
# on the host (a normal terminal, NOT `distrobox enter`)
pipewire --version
If the container and host report different PipeWire versions, the container's filter-chain (which links to the host daemon across the forwarded socket) can be unstable — a client/server version skew. Align the container's pipewire package with the host's, or run ASM natively.
filter-chain keeps crashing on PipeWire 1.6.7. A shutdown race in filter-chain 1.6.7 can SIGSEGV when the service is restarted while audio is flowing (which ASM does on EQ/Spatial changes), killing the surround sink. If coredumpctl list pipewire shows repeated crashes tied to toggling Spatial Audio, this is the cause; a PipeWire update on the side that runs filter-chain resolves it.
ASM ships a first-class NixOS module (nix/module.nix) that wires up udev rules, systemd user services, PipeWire filter-chain, and all LADSPA plugins automatically. The module replaces asm-setup, so you normally don't need to run it — but since v1.1.68 it is safe to do so (the crash on the missing update-desktop-database tool has been removed), which is useful for the HRIR repair described below.
Flake-based config — add to your flake.nix:
inputs.arctis-sound-manager = {
url = "github:loteran/Arctis-Sound-Manager?dir=nix";
inputs.nixpkgs.follows = "nixpkgs";
};
Then in your nixosSystem modules:
inputs.arctis-sound-manager.nixosModules.default
{
services.pipewire = { enable = true; alsa.enable = true; pulse.enable = true; };
services.arctis-sound-manager.enable = true;
}
Classic config (flakes disabled):
git clone https://github.com/loteran/Arctis-Sound-Manager.git /etc/nixos/Arctis-Sound-Manager
In /etc/nixos/configuration.nix:
imports = [ /etc/nixos/Arctis-Sound-Manager/nix/module.nix ];
services.pipewire = { enable = true; alsa.enable = true; pulse.enable = true; };
services.arctis-sound-manager.enable = true;
Then rebuild and replug the headset once so udev applies the new rules:
sudo nixos-rebuild switch
⚠️ Spatial Audio first run — required for Game & Media audio: open ASM → Settings → Spatial Audio and pick any HRIR profile. This copies the selected WAV to
~/.local/share/pipewire/hrir_hesuvi/hrir.wav(profiles are bundled, no download needed). Without this step, the Game and Media channels are silent — the filter-chain convolver fails to load and only the Chat channel (which has no convolver) produces audio.
Stub HRIR file (installs older than v1.1.68): the HRIR file shipped in the Nix store is a read-only 3.6 KB stub (epoch timestamp) that leaves Game and Media silent. Since v1.1.68,
asm-setupdetects undersized HRIR files and replaces them automatically. On an older install, repair it manually:rm ~/.local/share/pipewire/hrir_hesuvi/hrir.wav && asm-setup
KDE audio popup: the small "Audio Volume" widget in the KDE taskbar only shows physical hardware sinks. The ASM virtual channels (Arctis_Game / Arctis_Chat / Arctis_Media) appear in
pavucontrol→ Playback tab or in KDE System Settings → Audio → Applications. Use those to route each app to the right channel.
Full module docs and options: nix/README.md.
Install system deps first:
# Debian / Ubuntu
sudo apt install pipx libusb-1.0-0 libpulse0 libudev1 swh-plugins curl
# noise-suppression-for-voice (rnnoise LADSPA) is not packaged for Debian/Ubuntu —
# ASM builds it from source automatically when you enable ClearCast mic suppression.
# Fedora / Nobara
sudo dnf install pipx libusb1 pulseaudio-libs systemd-libs ladspa-swh-plugins curl
sudo dnf copr enable lkiesow/noise-suppression-for-voice
sudo dnf install ladspa-realtime-noise-suppression-plugin
Then install ASM:
git clone --branch main https://github.com/loteran/Arctis-Sound-Manager.git
cd Arctis-Sound-Manager
bash scripts/install.sh
PATH tip: if
asm-cliorasm-daemonare not found after install, run:echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc && source ~/.bashrc
USB permissions: if the headset isn't detected, ASM shows a one-click Install rules dialog at startup. Manual fallback:
sudo asm-cli udev write-rules --force --reload
After asm-setup completes, launch the GUI with:
asm-gui
Or find Arctis Sound Manager in your application launcher (KDE, GNOME, etc.).
The daemon (
arctis-manager.service) starts automatically at login — the GUI is separate and must be opened manually the first time.
asm-gui --systray
Starts minimised to the system tray. From there you can switch Audio Profiles, open the full window, or quit. This is the recommended mode for daily use.
The easiest way is the in-app toggle: Settings → General → Start with system — ASM handles the correct setup for your desktop environment automatically.
If the toggle doesn't work for your DE, use the manual method:
systemctl --user enable --now arctis-gui.service
An arctis-gui.service unit is installed by asm-setup. If missing:
asm-cli desktop write
systemctl --user daemon-reload
systemctl --user enable --now arctis-gui.service
Add to ~/.config/hypr/hyprland.conf (or your compositor's startup config):
exec-once = asm-gui --systray
Add to your WM startup file (~/.config/i3/config, ~/.xinitrc, etc.):
asm-gui --systray &
Or create an XDG autostart entry:
asm-cli desktop write # writes ~/.config/autostart/arctis-sound-manager.desktop
⚠️ Upgrading to 1.2.1 on Arch — remove, then reinstall
Up to 1.2.0, the Arch package shipped its own copies of
dbus-nextandpulsectlinsidesite-packages. From 1.2.1 they are proper dependencies (python-dbus-next,python-pulsectl), so pacman refuses to install those packages over the files the old version still owns, and the upgrade aborts:error: failed to commit transaction (conflicting files) python-dbus-next: /usr/lib/python3.14/site-packages/dbus_next/... exists in filesystemRemove the old package first — it takes its bundled copies with it — then install:
paru -R arctis-sound-manager paru -S arctis-sound-managerYour audio profiles in
~/.config/arctis_manager/profiles/are preserved, andasm-setupruns again on install. Fresh installs are unaffected, and later upgrades work normally.Do not reach for
pacman --overwritehere: it leaves the files owned by both packages, and the ASM upgrade then deletes them on its way out — guttingpython-dbus-nextandpython-pulsectl. If you already did, repair them withsudo pacman -S python-dbus-next python-pulsectl.
paru -Syu arctis-sound-manager && asm-setup
sudo dnf upgrade arctis-sound-manager && asm-setup
sudo apt update && sudo apt upgrade arctis-sound-manager && asm-setup
cd Arctis-Sound-Manager && git pull
pipx install --force .
asm-cli desktop write
asm-cli udev write-rules --force --reload
systemctl --user daemon-reload && systemctl --user restart arctis-manager.service
pipx upgrademay fail on wheel installs — usepipx install --force .instead.
ASM creates virtual sinks on top of your Arctis device plus one external output:
| Sink | Default use | Key |
|---|---|---|
| Arctis_Game | Games, general audio | G |
| Arctis_Chat | Voice apps (Discord, TeamSpeak…) | C |
| Arctis_Media | Browsers, video players | M |
| Arctis_Aux | Anything you want kept apart — off unless you turn it on | A |
| External Output | HDMI, USB speakers, sound card… (5.1 / 7.1 native) | O |
Each channel can also be sent to another device than the headset, from its card on the Home page or next to its EQ.
Streamer mode (off by default, switch next to the Channels menu) adds a second mix for OBS or any recorder. Each Arctis_<Ch> monitor (Game, Chat, Media, Aux) and the processed Mic feed a small stream-mix filter-chain, which publishes one stereo source, <device> Stream Mix (effect_output.sonar-stream-mix). It is tapped before the personal volumes and before the per-channel EQ and spatial audio, so the headphone EQ/HRTF and the ChatMix dial never reach it; 7.1 game audio is downmixed to stereo with the centre kept. Each channel has its own volume and mute (the Stream slider on its card), applied live. Turning the mode on or off restarts the filter-chain once, a short dropout like switching a preset. In OBS, add the source as an Audio Input Capture and remove separate desktop and mic captures.
The media router (asm-router) automatically moves browsers and video players to Arctis_Media. Moving an app yourself — by dragging its icon onto a card, or from its menu — is saved as a persistent override.
The stream guard (asm-stream-guard) decides which of these channels a screen share is allowed to carry. Discord's Linux client offers no source picker: it creates its own capture node and links every playback stream into it, continuously, so the whole system's audio goes out to the call. Pick the allowed channels in the bar at the top of the Sonar page — Game only, by default — and the guard cuts everything else as PipeWire announces it. Sources are matched by the channel they play on, so moving an app to another channel is all it takes to include or exclude it.
The External Output card routes audio directly to the physical sink, bypassing virtual stereo sinks — this preserves true 5.1 / 7.1 passthrough. Pick its device from the Output card.
ASM lets you share any Sonar EQ preset with one click and import presets shared by the community.
arctis-asm://import?data=… deep link to your clipboard..json file you can send directly.arctis-asm://import?data=… (generated by ASM's Share button)https://www.steelseries.com/deeplink/gg/sonar/config/v1/import?url=… (links from the SteelSeries community or GG software)ASM automatically detects the link format, downloads the preset if needed, and saves it locally.
You can also double-click an
arctis-asm://link in a browser if you registered the URL handler withasm-setup.
loteran.github.io/asm-presets — browse, vote for, and download EQ presets shared by the community.
| Action | How |
|---|---|
| Browse presets | Open the site — no login required |
| Filter by channel / device | Use the search bar and dropdowns |
| Import a preset into ASM | Click Import in ASM on any card |
| Vote for a preset | Click the ♡ button (requires GitHub login) |
| Publish a preset | Click Share a Preset, sign in with GitHub, fill in the form |
| Delete your preset | Click 🗑 on your own preset card (only visible when logged in) |
Sonar on Windows let you bind a key to a channel's volume. On Linux the same thing is available, from the other end: ASM exposes the action as a command, and your desktop binds the key.
asm-cli volume game +5 # five points up
asm-cli volume chat -5 # five points down
asm-cli volume media 40 # set an exact level
asm-cli volume game mute # mute, unmute, or toggle
asm-cli volume game +5 chat -5 # several channels from one key
asm-cli volume --list # what each channel is at right now
Bind those in your desktop's keyboard settings — KDE's Custom Shortcuts, GNOME's Custom Shortcuts, or your window manager's config. A macropad that sends an otherwise unused key (F20, F21…) works exactly like any other key here, which is the usual way to get physical dials for the channels.
Why a command rather than a shortcut inside ASM: on Wayland an application cannot claim a key combination for itself — the compositor owns that, and the portal that hands them out is not available on every desktop, nor can it grant a specific key. Binding a command has none of those limits and works the same on X11, Wayland, and any desktop.
The volume is applied straight to PipeWire, so a bound key works whether or not the ASM window is open, and the new level is remembered the same way the sliders' are.
asm-cli status prints the headset's state; --json makes it readable by
Waybar, Polybar, i3blocks, desktop widgets or any script:
asm-cli status --json | jq .status.headset_battery_charge # 90
{"schema": 1, "daemon": true,
"device": {"name": "Arctis Nova Pro Wireless", "vendor_id": "0x1038", "product_id": "0x12e0"},
"power": "on",
"status": {"headset_battery_charge": 90, "mic_status": "muted", "...": "..."},
"channels": {"game": {"present": true, "volume": 100, "muted": false}, "...": {}}}
power is on, off or unknown, the same on every headset family.status holds whatever your headset reports (battery, mic, ANC, base
station…), under the variable names of its profile.1 when asm-daemon is not running; the JSON is printed
anyway, with "daemon": false.Example Waybar module showing the battery, hidden when the headset is off:
"custom/headset": {
"exec": "asm-cli status --json | jq -c 'if .power == \"on\" then {text: \"🎧 \\(.status.headset_battery_charge)%\", tooltip: .device.name} else {text: \"\"} end'",
"return-type": "json",
"interval": 30,
"on-click": "asm-gui"
}
Virtual 7.1 surround is included automatically with the install — it deploys a PipeWire HeSuVi filter-chain and downloads the HRIR file. 57 HRIR profiles from HeSuVi are bundled and selectable from the Settings tab with instant apply.
The Game, Media and Aux channels accept 5.1 / 7.1, so a game set to surround sends its real centre and rear channels to Spatial Audio instead of a stereo mix. With Only for surround sources ticked, the virtual surround turns itself on only while something plays 5.1 / 7.1. A channel sent to a surround receiver or TV gets its channels untouched; on a stereo device with Spatial Audio off, surround is folded into stereo (centre and surrounds at -3 dB).
┌──────────────────────────┐
7.1 audio source │ Virtual Surround Sink │
(game, movie…) ──► (PipeWire filter-chain) ├──► Headset (stereo)
└──────────────────────────┘
Also available as a standalone repo: arctis-virtual-surround — install virtual surround independently with a single
bash install.sh.
bash scripts/setup-surround.sh
This installs the filter-chain config in ~/.config/pipewire/filter-chain.conf.d/, downloads the HRIR file, and enables the filter-chain systemd user service.
Advanced: replace ~/.local/share/pipewire/hrir_hesuvi/hrir.wav with any 14-channel HeSuVi-compatible WAV and restart filter-chain manually.
ASM ships 6 built-in color themes: SteelSeries (default), Aurora Glass, Neon Pulse, Slate Premium, Arctic and Matcha SV. Switch themes from the dropdown in Settings → Interface Theme — the change applies live to every page, dialog and the tray menu, no restart needed.
Click Create theme in Settings to open the theme editor:
User themes are saved as .ini files in ~/.config/arctis-sound-manager/themes/.
Themes are shared exactly like EQ presets, from Settings → Export theme (or the Share button in the theme editor):
arctis-asm://import-theme?data=… deep link to your clipboard..ini file you can send directly.Import theme accepts either form: paste a deep link, load an .ini file, or browse the community site.
loteran.github.io/asm-presets — the same site as the EQ presets, under the Themes tab: browse, vote for, and import themes shared by the community.
Every theme is shown as a miniature of ASM's home page painted in its colors — the sidebar, the four channel cards and their volume sliders — so you can see how a theme actually looks before importing it, not just its palette.
| Action | How |
|---|---|
| Browse themes | Open the site, Themes tab — no login required |
| Import a theme into ASM | Click Import in ASM on any card |
| Vote for a theme | Click the ♡ button (requires GitHub login) |
| Publish a theme | Use Publish to community from ASM, or Share a Theme on the site |
| Delete your theme | Click 🗑 on your own theme card (only visible when logged in) |
Built-in themes cannot be edited or deleted — duplicate one into a custom theme instead.
ASM supports community translations via Crowdin. No release is needed — the app checks GitHub on every startup and silently downloads any updated .ini files.
| Language | Status |
|---|---|
| English | Source (always complete) |
| Français | Bundled |
| Español | Bundled |
| Your language? | Contribute on Crowdin ↗ |
How it works:
~/.config/arctis_manager/lang/To request a new language, open a GitHub issue. See CONTRIBUTING.md for full details.
Based on 1391 unique users (73218 anonymous data points) — last updated 2026-10-29
Anonymous usage data shared voluntarily by opted-in users. View interactive dashboard →
| Distribution | Install method | Users |
|---|---|---|
| CachyOS | 🎯 AUR | 👥 552 |
| Arch Linux | 🎯 AUR | 👥 292 |
| Nobara Linux 44 (KDE Plasma Desktop Edition) | 🎯 COPR | 👥 84 |
| Fedora Linux 44 (KDE Plasma Desktop Edition) | 🎯 COPR | 👥 78 |
| Linux Mint 22.3 | 🎯 PPA | 👥 71 |
| Ubuntu 26.04.1 LTS | 🎯 PPA | 👥 44 |
| Pop!_OS 24.04 LTS | 🎯 PPA | 👥 29 |
| EndeavourOS | 🎯 AUR | 👥 29 |
| Omarchy | 🎯 AUR | 👥 28 |
| Fedora Linux 44 (Workstation Edition) | 🎯 COPR | 👥 27 |
| Ubuntu 26.04 LTS | 🎯 PPA | 👥 18 |
| Nobara Linux 43 (KDE Plasma Desktop Edition) | 🎯 COPR | 👥 14 |
| Garuda Linux | 🎯 AUR | 👥 14 |
| Manjaro Linux | 🎯 AUR | 👥 10 |
| Bazzite | 📦 Source | 👥 10 |
| Ubuntu 24.04.4 LTS | 🎯 PPA | 👥 9 |
| Fedora Linux 44 (Forty Four) | 🎯 COPR | 👥 9 |
| NixOS 26.11 (Zokor) | 📦 Source | 👥 8 |
| NixOS 26.05 (Yarara) | 📦 Source | 👥 6 |
| Debian GNU/Linux 13 (trixie) | 🎯 PPA | 👥 6 |
| Ubuntu 24.04.5 LTS | 🎯 PPA | 👥 5 |
| Zorin OS 18.1 | 🎯 PPA | 👥 4 |
| SteamOS | 📦 Source | 👥 4 |
| PikaOS 4 | 📦 Source | 👥 4 |
| Artix Linux | 🎯 AUR | 👥 4 |
| Fedora Linux 43 (KDE Plasma Desktop Edition) | 🎯 COPR | 👥 3 |
| Ultramarine Linux 44 (Plasma Edition) | 📦 Source | 👥 2 |
| Ubuntu 26.10 | 🎯 PPA |
| Headset | Installs |
|---|---|
| Arctis Nova Pro Wireless | 488 |
| Arctis Nova 7 (Gen 2) | 229 |
| Arctis Nova 5 Wireless | 105 |
| Arctis Nova Pro Omni | 66 |
| Arctis Pro Wireless | 64 |
| Arctis Nova 7 (Gen 1) | 59 |
| Arctis Nova Pro Wired | 58 |
| Arctis Nova Elite | 44 |
| Arctis 7+ | 43 |
| Arctis Nova 3 Wireless | 39 |
| Arctis GameBuds | 35 |
| Arctis Nova 3 | 24 |
| Arctis 7/Pro Gaming | 23 |
| Arctis 9 Wireless | 23 |
| Arctis Nova 7P (Gen 2) | 17 |
| Arctis 1/7X/7P Wireless | 7 |
| Arctis Nova 7P (Gen 1) | 7 |
| Arctis Pro GameDAC | 7 |
| Distribution | Installs |
|---|---|
| CachyOS | 552 |
| Arch Linux | 292 |
| Nobara Linux 44 (KDE Plasma Desktop Edition) | 84 |
| Fedora Linux 44 (KDE Plasma Desktop Edition) | 78 |
| Linux Mint 22.3 | 71 |
| Ubuntu 26.04.1 LTS | 44 |
| Pop!_OS 24.04 LTS | 29 |
| EndeavourOS | 29 |
| Omarchy | 28 |
| Fedora Linux 44 (Workstation Edition) | 27 |
| Ubuntu 26.04 LTS | 18 |
| Nobara Linux 43 (KDE Plasma Desktop Edition) | 14 |
| Garuda Linux | 14 |
| Manjaro Linux | 10 |
| Bazzite | 10 |
Native packages ship a cleanup hook — paru -R / dnf remove / apt remove removes PipeWire configs and restarts pipewire automatically. Audio profiles in ~/.config/arctis_manager/profiles/ are preserved by default.
paru -R arctis-sound-manager # Arch / CachyOS / Manjaro
sudo dnf remove arctis-sound-manager # Fedora
sudo apt remove arctis-sound-manager # Debian / Ubuntu
For source/pipx installs or a full wipe, use the standalone uninstaller:
bash scripts/uninstall.sh # interactive, auto-detects install method
# or without cloning:
curl -fsSL https://raw.githubusercontent.com/loteran/Arctis-Sound-Manager/main/scripts/uninstall.sh | bash
--pipx # only the pipx install
--pkg # only the distro package
--all # both (for duplicate installs)
--all --purge # also wipe PipeWire configs, HRIR, systemd units, udev rules
--yes # non-interactive
--purge still preserves ~/.config/arctis_manager/profiles/. A final prompt offers to delete them too for a true clean slate.
ASM has a safety net for the PipeWire audio filter-chain. If that service crashes in a loop (a known issue with very large HeSuVi 7.1 graphs on some builds, e.g. SteamOS), instead of leaving you with audio that cuts in and out, ASM disables the EQ configs and keeps a stable, flat audio path — this is safe mode. While it's active, the Sonar EQ and the virtual 7.1 surround are turned off.
When safe mode is on, a banner appears at the top of the Sonar page:
The safe-mode state (and the disabled configs) also show up in the in-app bug report, under Filter-chain safe mode & config presence.
If asm-gui in a terminal ends with "xcb-cursor0 or libxcb-cursor0 is needed
to load the Qt xcb platform plugin", Qt is missing one system library. This
happens when PySide6 was installed with pip (Ubuntu 24.04 / Mint 22 have no
PySide6 package). Install it and start ASM again:
sudo apt install libxcb-cursor0 # Debian / Ubuntu / Mint
sudo dnf install xcb-util-cursor # Fedora
sudo pacman -S xcb-util-cursor # Arch
The .deb now depends on it, and asm-gui names the package instead of
crashing.
Sometimes an application ends up playing to the wrong output — a TV over HDMI, an S/PDIF port, or another sound card — instead of your headset, so you hear nothing. This happens when PipeWire/WirePlumber remembers an old output for that app.
Open the system tray menu → Bring audio to headset to fix it in one click. It finds every app currently playing on a non-Arctis device and moves it back to your default Arctis sink (a notification reports how many apps were moved); apps already on a channel are left untouched. It does not change a channel's own output: if you sent a channel to another device, pick the headset on that channel's card to bring it back.
It is safe to click at any time — if nothing is misrouted, it does nothing.
Open ASM → Help page → Report a Bug. The dialog collects a full diagnostic (version, libs, distro, PipeWire state, USB devices, udev rules, last 100 log lines) and either:
gh CLI — uploads as a secret gist and opens a pre-filled issue~/.cache/arctis-sound-manager/reports/ for drag-and-dropasm-daemon --verify-setup # preflight checks, exits 0/1 with per-distro install hints
asm-cli diagnose -o /tmp/asm.txt # full local diagnostic dump
asm-cli tools probe # read-only queries to the headset, raw replies saved to ~/asm-probe.json
ARCTIS_LOG_LEVEL=debug systemctl --user restart arctis-manager
journalctl --user -u arctis-manager -f
python src/arctis_sound_manager/scripts/daemon.py # daemon
python src/arctis_sound_manager/scripts/gui.py --no-enforce-systemd # GUI
python src/arctis_sound_manager/scripts/video_router.py # media router
src/arctis_sound_manager/
│
├── scripts/ # Entry points (installed as CLI commands)
│ ├── daemon.py # asm-daemon — device manager service
│ ├── gui.py # asm-gui — graphical interface
│ ├── video_router.py # asm-router — automatic media routing
│ ├── stream_guard.py # asm-stream-guard — screen-share audio filter
│ ├── cli.py # asm-cli — udev / desktop / diagnose tools
│ └── setup.py # asm-setup — post-install automation
│
├── gui/ # PySide6 user interface
│ ├── main_app.py # Main window + sidebar navigation
│ ├── home_page.py # Audio mixer (Game / Chat / Media / Output cards)
│ ├── sonar_page.py # Sonar EQ — presets, Spatial Audio, macro sliders
│ ├── equalizer_page.py # Custom EQ mode toggle + 10-band sliders
│ ├── headset_page.py # Device info and live status (battery, mic, ANC)
│ ├── device_page.py # App settings (language, startup, update check)
│ ├── dac_page.py # GameDAC OLED control (clock, weather, brightness)
│ ├── help_page.py # Built-in user manual (EN / FR / ES)
│ ├── theme.py # Theme engine — built-in + user themes, QSS
│ ├── theme_editor_page.py # Custom theme editor with live preview
│ ├── eq_curve_widget.py # Interactive parametric EQ curve (biquad RBJ)
│ ├── sonar_toggle_widget.py # Sonar ↔ custom EQ toggle + spatial audio switch
│ ├── anc_widget.py # ANC / Transparent mode control
│ ├── profile_bar.py # Audio profile quick-switch bar
│ ├── systray_app.py # System tray icon + single-instance IPC
│ ├── tray_eq_presets.py # Tray menu EQ preset switcher
│ ├── status_widget.py # Headset status widget (battery, mic, sidetone)
│ ├── settings_widget.py # Settings panel (theme, language, paths)
│ ├── preset_import_dialog.py # Preset import (ASM link / SteelSeries link / file)
│ ├── preset_export_dialog.py # Preset export (copy link / save file / publish)
│ ├── preset_share.py # Preset sharing helpers (deep link encode/decode)
│ ├── report_dialog.py # One-click bug report (gist + GitHub issue)
│ ├── system_deps_dialog.py # Self-healing deps check dialog
│ ├── install_dialogs.py # Package install confirmation dialogs
│ ├── udev_dialog.py # udev rules install / reload dialog
│ ├── first_run_dialog.py # First-run wizard (udev, services, HRIR)
│ ├── telemetry_dialog.py # Anonymous telemetry opt-in dialog
│ ├── dbus_wrapper.py # Synchronous D-Bus client (daemon ↔ GUI bridge)
│ ├── components.py # Reusable UI components (cards, sliders, buttons)
│ ├── ui_utils.py # UI helpers (DPI scaling, icon loading)
│ ├── base_app.py # Shared QApplication base
│ ├── main_app_proto_widget.py # Prototype widget base for pages
│ └── presets/ # Bundled Sonar presets (Game / Chat / Mic)
│
├── core.py # CoreEngine — USB lifecycle, polling, device init
├── config.py # Device YAML parsing + settings definitions
├── constants.py # XDG-compliant path constants (config, data, lang)
├── device_state.py # Shared physical-node names for audio routing
├── dbus_service.py # D-Bus interfaces (Settings / Status / Config)
├── loopback_manager.py # Dynamic pw-loopback sinks (Arctis_Game/Chat/Media)
├── sonar_to_pipewire.py # PipeWire filter-chain (EQ) config generator
├── pw_utils.py # Native PipeWire stream management + routing overrides
├── pactl.py # PulseAudio / PipeWire sink and stream helpers
├── service_control.py # Single entry point for systemctl / dinitctl
├── profile_manager.py # Audio profiles — snapshot, save, load, apply
├── settings.py # Persistent settings (JSON, XDG-compliant)
├── preset_sync.py # EQ preset sync (cloud ↔ local)
├── eq_types.py # EQ band data types (EqBand, BandType…)
├── oled_renderer.py # OLED image renderer (PIL)
├── oled_protocol.py # OLED HID framing (per-device interface / report id)
├── oled_manager.py # OLED scroll / animation loop + weather clock
├── weather_service.py # Weather fetch for the OLED (Open-Meteo)
├── hrir_catalog.py # HRIR profile catalog (57 bundled profiles)
├── bug_reporter.py # Diagnostic collector for bug reports
├── diagnose.py # asm-cli diagnose — full system diagnostic dump
├── system_deps_checker.py # Startup self-healing dependency checker
├── udev_rules.py # udev rule generation (SteelSeries USB rules)
├── udev_checker.py # udev rule presence / content verifier
├── update_checker.py # GitHub release update checker
├── lang_updater.py # Online translation updater (GitHub → ~/.config)
├── telemetry.py # Anonymous opt-in usage telemetry
├── autostart.py # Autostart management (systemd / XDG / DE-specific)
├── init_system.py # Init system detection (systemd vs dinit)
├── systemd.py # systemd user unit helpers
├── status_parser_fn.py # USB HID status frame parser (battery, mic, ANC…)
├── usb_devices_monitor.py # USB hotplug monitor (pyudev)
├── cli_tools.py # Shared CLI utilities
├── log_setup.py # Logging configuration (ARCTIS_LOG_LEVEL)
├── i18n.py # Translation singleton with EN fallback
├── utils.py # Misc helpers
├── lang/ # Bundled translation files (.ini, one per language)
└── devices/ # Per-device configuration YAMLs
scripts/
├── install.sh # Source installer
├── uninstall.sh # Interactive uninstaller (pipx / pkg / all)
├── setup-surround.sh # Standalone virtual surround setup
├── distrobox/ # Distrobox scripts (Bazzite, SteamOS, Silverblue)
├── pipewire/ # PipeWire config templates
└── reverse-engineering/ # USB capture + opcode-decode helpers (new devices)
nix/ # NixOS module
├── module.nix # NixOS module (udev, systemd, filter-chain, LADSPA)
├── package.nix # Nix derivation
└── README.md # NixOS-specific documentation
Tried ASM on your headset or distro? Found a bug or have a feature idea?
Your feedback helps improve compatibility for everyone — especially for headsets not yet confirmed working.
| Area | Maintainer |
|---|---|
| Arctis Sound Manager | loteran |
Clips — capture, library, editor, sharing, and the asm-clipd daemon | Denkiyaa |
Clips was designed and written by Denkiyaa (#156, #159), who maintains it: questions, bug reports and pull requests touching the clip capture pipeline, the editor or the opt-in installer go to them. .github/CODEOWNERS requests their review automatically.
Thanks to everyone who has contributed code, fixes, or community support:
| Contributor | Contribution |
|---|---|
| Denkiyaa | Designed and built the Clips feature — rolling screen capture with one audio track per Sonar channel, poster-frame library, trim/mix editor and sharing, the opt-in package installer, and the asm-clipd daemon (#159); the Channels output-device picker; stopped the Home page rebuilding its application lists twice a second (#187); clips at the game's real frame rate, GPU export and wheel-proof dropdowns (#323); the headset's settings on the Headset page in cards, and a Settings page that no longer scrolls sideways (#333); sidetone left off for headsets nobody configured (#332) |
| Michsior14 | Fix Arctis 7+ power status recognition (#67) |
| H0DG3 | Identified the fontconfig cache fix for font rendering on Bazzite/Distrobox |
| cookiekiller | Diagnosed the loopback watchdog orphan-recreation bug (#84); detailed analysis and fix suggestions for per-channel EQ coupling, Discord routing override, and weather log spam (#85) |
This project is licensed under the GNU General Public License v3.0.
The majority of the source code is original work — Copyright (C) 2026 loteran.
25 files are partially derived from Linux Arctis Manager by Giacomo Furlan (elegos), used under GPL-3.0 — Copyright (C) 2022 Giacomo Furlan (elegos).
The HRIR profiles used by Spatial Audio (src/arctis_sound_manager/hrir_assets/) come from HeSuVi by Matt Gore, used under the MIT License — Copyright 2021 Matt Gore; see LICENSE-HeSuVi.txt. Most are recordings of commercial surround virtualizers made by the HeSuVi community; the product names (Dolby, DTS, Windows Sonic, Razer, Sennheiser…) are trademarks of their owners, and ASM is not affiliated with or endorsed by them.
| Arctis Nova 7P | ✅ | 24 | $\color{royalblue}{\textbf{220a}}$, $\color{royalblue}{\textbf{22a7}}$ |
| Arctis Nova Elite | ✅ | 44 | $\color{royalblue}{\textbf{2244}}$, 2249, $\color{royalblue}{\textbf{2270}}$ |
| Arctis GameBuds / GameBuds X | ✅ | 35 | $\color{royalblue}{\textbf{230a}}$, $\color{royalblue}{\textbf{2317}}$ |
| 👥 2 |
| TUXEDO OS | 📦 Source | 👥 2 |
| OpenMandriva Lx 26.09 (ROME) Rolling | 📦 Source | 👥 2 |
Located the missing sudo on the SteamOS read-only toggle, which stopped the Distrobox installer half way through while looking as though it had worked, and supplied the fix (#188); SteamOS testing on #181 |
| baccatuesday | Reported and tested the SteamOS Game/Media channels having no sound, and found why the headset went undetected after quitting ASM in Distrobox (#181); showed that pw-link works from the host but not inside the container, which pinned down the Sonar silence |
| autune | Reported two bugs that hid behind a working-looking UI: applications stranded on the headset itself, outside every channel and absent from the mixer (fixed in v1.2.34), and the microphone EQ node missing entirely on an install that had never opened the Sonar tab (fixed in v1.3.0) |
| hotdoghotdog5 | Reverse-engineered the Arctis Nova Pro Omni's real protocol on hardware (a Windows GG capture, SteelSeries' own device specification, and Linux writes confirmed by reading values back off the base station) — sidetone, the volume limiter, ANC and its level, transparency, mic volume and LED, the OLED screen, the auto-off timer, and accurate battery/charging/Bluetooth status all came from this (#70, #147) |
| rhavinx | USB captures of the Arctis Nova 3P / 3X Wireless that pinned down ChatMix, mic-mute, battery, connection and charging events, leading to the family's own dedicated device profile (#149) |
| Svenum | Fixed a Nix flake evaluation error and a LADSPA_PATH override needed for filter-chain (PR #83, #79) |
| jgopel | Kept the Nix package building on newer nixpkgs, whose Python packages switched to structured attributes (#344) |
| nobodys-tools | Contributed the missing default HRIR seeding for module-only installs (#79) and the fix for the virtual-microphone hijack bug (#185); found and diagnosed precisely the Home page's endless background refresh (#182) |
| jsuvanto | Diagnosed the USB-permissions boot-time race on Nobara down to its root cause, alongside DefactoCasual (discussion #140) |
| DefactoCasual | Diagnosed the USB-permissions boot-time race on Nobara down to its root cause, alongside jsuvanto (discussion #140) |
| n6dlh | Traced the exact missing PySide6 Qt submodules that stopped ASM from starting on Ubuntu 26.04 (#163) |
| relxek | Fixed per-channel output devices not sticking (#177); diagnosed a pw-dump JSON-doubling bug causing periodic audio dropouts (#164); fixed silent audio loss from a headset's ALSA card profile being changed by a system sound-settings UI (#234) |
| kevinpbaker | Traced the Arctis Nova Pro Omni's dead ChatMix knob to a firmware race — the base station abandons its Game/Chat mode switch if the next command lands within a few milliseconds — and fixed it with a settle pause in device_init (#245); diagnosed and fixed the wake-from-suspend deadlock that regressed in 1.4.25, from a py-spy dump of the hung daemon (#251) |
| AnimeKittyFang | Found that the station volume dial (Nova Pro's DAC master wheel) was read from HID status but never applied to any PipeWire sink, and that the shared percentage() scaling helper flipped direction on inverted ranges, cancelling out its own fix — both confirmed against real Nova Pro Wireless hardware (#255) |
| Kolaigg | Fixed the NixOS build, which was missing the script that generates the Plasma widget translations (#310) |
| rasmus91 | Logs that exposed the SteamOS link-permission errors, including the Game Mode case the repair did not cover (#181); the resume logs that showed ASM losing the dongle until a restart (#325) |
| TheV-git | Narrowed the Nova Pro Wired volume-knob failures down to the custom display and ASM's commands (#321) |
| justfaked | Tracked a desktop session that kept dying on Bazzite down to ASM: the DAC wheel watcher leaked a D-Bus connection on every failed retry until the session bus ran out of file descriptors, and fixed it (#336) |
| FrDrebin | Tested the Nova Pro Omni's settings and screen on hardware, traced its screen glitch to the charging battery, and posted the probe ASM now reads the Omni's base station settings from (#330, #331) |
| PointyKite | Tested the Nova Elite's on-device EQ against GG on Windows, and posted the probe that settled the Elite's settings layout and its microphone / Bluetooth EQ frames (#327, #331) |
| globeFrEak | The Arctis 9 probe that showed ASM never read its status and sent its auto-off delay in seconds (#331) |
| ziggityzack | Reproduced and timed a tray crash on quit while PipeWire stopped answering, and traced it in the code to an uncaught pactl timeout, a "kill" fallback that only sent SIGTERM, and the router re-sending the same move to an idle pinned stream every 5 seconds (#349) |