A Linux system tray application for the SteelSeries Arctis Nova Pro Wireless headset, providing the features normally only available through SteelSeries GG on Windows.
This project builds on the original protocol research by Daniel Fanara (@dfanara), whose work documented the USB descriptor and discovered the ChatMix HID protocol. His original repository — dfanara/Arctis-on-Linux — is the base this was forked from. The LICENSE and original protocol documentation are his.
The following was discovered and implemented on top of that foundation:
- Wireless link detection (
06 b7) - Battery status for both headset and charging bay (
06 b0) - Noise control — ANC and Transparency mode (
06 bd) - Transparency level (
06 b9) - Sidetone (
06 39) - Full Rust implementation with PipeWire ChatMix routing and system tray
- System tray icon — colour-coded connection status (green / amber / grey), with ANC mode toggle in the context menu
- Battery monitoring — separate levels for the active headset and the charging bay, with charging indicator
- ChatMix routing — the physical ChatMix dial on the base station controls the relative volume of two PipeWire sinks in real time, automatically switching the system default output to the headset on connect and restoring it on disconnect
- Noise control — toggle ANC, Transparency, or Off from the tray or the GUI
- Transparency level — fine-grained slider (1–10) when Transparency mode is active
- Sidetone — Off / Low / Medium / High
- Auto sink setup — detects the Arctis headset sink automatically and creates a virtual
Arctis ChatPipeWire sink on launch; no manual audio configuration required
- Linux with PipeWire (tested on Arch Linux / KDE Plasma Wayland)
- Rust toolchain (
rustuprecommended) libdbus(for the system tray — usually already present)
sudo cp udev/70-arctis-nova.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm triggerThe rule uses TAG+="uaccess" which grants access based on your active login session (systemd-logind). No group membership is required.
cargo build --release -p arctis-gui./target/release/arctis-guiThe app starts in the system tray. Left-click the icon or select Show from the context menu to open the GUI window. The window can be closed freely — the app continues running in the tray.
On first launch the app will:
- Detect the Arctis headset sink automatically via
pactl - Create a virtual Arctis Chat PipeWire sink that routes through the headset
- Save both sink names to
~/.config/arctis/config.toml
Route your chat application (e.g. Discord) to the Arctis Chat sink using your audio mixer (e.g. pavucontrol or KDE Audio Settings). Game audio goes directly to the headset sink. The ChatMix dial then controls both volumes independently.
Sink names can be overridden in the GUI under ⚙ Sink settings if auto-detection picks the wrong device.
All communication is via USB HID Interface 4 on the base station (VID=0x1038, PID=0x12e0).
| Direction | Endpoint | Description |
|---|---|---|
| Host → Device | 0x04 (OUT) |
Commands |
| Device → Host | 0x84 (IN) |
Events / responses |
Packets are 64 bytes, zero-padded. Commands use prefix 0x06; spontaneous device events use 0x07.
| Packet | Description |
|---|---|
06 49 01 |
Enable ChatMix |
06 49 00 |
Disable ChatMix |
06 b7 |
Query wireless link status |
06 b0 |
Query battery status |
06 bd 00 |
Set noise control: Off |
06 bd 01 |
Set noise control: Transparency |
06 bd 02 |
Set noise control: ANC |
06 b9 01–06 b9 0a |
Set transparency level (1–10) |
06 39 00 |
Set sidetone: Off |
06 39 01 |
Set sidetone: Low |
06 39 02 |
Set sidetone: Medium |
06 39 03 |
Set sidetone: High |
| Packet | Description |
|---|---|
07 b7 00 |
Wireless link: unlinked |
07 b7 XX (XX ≠ 0) |
Wireless link: linked |
06 b0 CC 00 01 00 04 HL BL ... |
Battery — HL headset level (0–8), BL bay level (0–8), CC=01 charging |
07 45 GG CC |
ChatMix changed — GG game (0–100), CC chat (0–100); both 0x64 at centre |
07 bd 00 |
Noise control changed: Off |
07 bd 01 |
Noise control changed: Transparency |
07 bd 02 |
Noise control changed: ANC |
07 b9 01–07 b9 0a |
Transparency level changed (1–10) |
07 39 |
Sidetone changed: Off |
07 39 01–07 39 03 |
Sidetone changed: Low / Medium / High |
- The base station is always the USB device; the wireless headset link is separate and must be probed via
06 b7. - Battery levels are on a 0–8 scale (
* 100 / 8for a percentage). 06 bd 00sets noise control to Off — there is no distinct query command. Track state from inbound07 bdevents instead.- The base station will reboot if sent unknown command bytes. Only probe commands listed above.
For reference, the full USB descriptor for the base station (from Daniel Fanara's original research):
DEVICE ID 1038:12e0 on Bus 000 Address 001
idVendor : 0x1038 SteelSeries
idProduct : 0x12e0 Arctis Nova Pro Wireless
bNumConfigurations : 0x1
INTERFACE 0–2: Audio (isochronous audio I/O)
INTERFACE 3: HID (2-byte interrupt, volume wheel)
INTERFACE 4: HID (64-byte interrupt IN/OUT — control interface)
ENDPOINT 0x84: Interrupt IN (64 bytes, interval 0x10)
ENDPOINT 0x04: Interrupt OUT (64 bytes, interval 0x10)