OpenXLR is a Wave Link replacement for Linux. Its mixer runs on PipeWire and works with any microphone or audio interface PipeWire can record from: per-application channels, virtual microphones for calls and streams, monitor mixes on any output, ducking, a microphone EQ, LV2, CLAP and VST3 plugin inserts, and an OpenDeck plugin for Stream Deck control. On Elgato hardware it also drives the device itself over reverse-engineered USB protocols: gain, mute, phantom power, the onboard effects and EQ, the headphone outputs and, on the Wave XLR Pro, output routing, a second-computer mix on the USB Aux port, ducking on the unit's own processor and, as an experiment, mixes built in the unit.
The UI from 0.7.0 and the terminal mixer from 0.2.0, both in the Broadcast
skin. This README and the linked guides describe current main; for a
released build, read the docs at its release tag. Not affiliated with or
endorsed by Elgato. The device protocols come from Wave Link USB captures,
prior open-source protocol work and tests on the author's own hardware.
Any capture source PipeWire lists works in the mixer. Bound to XLR 1 or XLR 2 (manual) it gets that strip's sends, volume, meter, EQ, insert chain and Mic setup; its preamp gain and phantom power stay on the device itself.
These Elgato devices also get their hardware controls over USB:
| Device | USB id | Status |
|---|---|---|
| Wave XLR Pro | 0fd9:00b4 | controls and the EQ on the unit verified on hardware; raw capture verified on XLR 1; ducking on the unit accepted by ear on the headphone jacks and the USB Aux port; hardware mixing (experimental) heard on one unit, its maximizer per mix measured there |
| XLR Dock (Stream Deck+ module) | 0fd9:00a6 | gain, mute, headphone volume, 48V phantom power, low impedance; verified |
| Wave XLR | 0fd9:007d | gain, mute, headphone volume, low impedance and phantom power verified by community testers |
| Wave XLR MK.2 | 0fd9:00b6 | gain, mute, phantom power, low impedance, DSP, ClipGuard, compressor, headphone volume, crossfade, verified by a community tester; the EQ on the unit from firmware 1.0.15, verified; raw capture, the LED ring and the unit's own meters from the same firmware, measured on hardware |
| XLR Dock MK.2 (Stream Deck+ module) | 0fd9:00c7 | the Wave XLR MK.2's controls, verified |
| Wave:3 | 0fd9:0070 | gain, mute, ClipGuard, headphone volume and the monitor balance, each written and read back on the maintainer's unit; gain, mute, the monitor balance and the desktop volume controls verified there |
| Wave:3 MK.2 | 0fd9:00ca | gain, mute, headphone volume, crossfade, the EQ on the unit, low cut, compressor and voice tune verified on the maintainer's unit; the compressor and expander settings on the unit written and read back there; ClipGuard mapped from the Wave XLR MK.2 |
| Wave:1 | 0fd9:006e | the Wave:3's controls; gain, mute and headphone volume confirmed by an owner |
Hardware support has every control's state, including what is coded but not yet run on hardware. If you own an untested device, open an issue with a diagnostics archive (Community and issues).
- Hardware control of the devices above, down to the Pro's per-input effects, both headphone outputs and the routing of HP1, HP2, Line Out and USB Aux. Low cut and ClipGuard run in software where the hardware has none. Raw capture on the Pro and the Wave XLR MK.2 sends an input to the computer before the unit's processing (manual), and the Wave XLR MK.2's LED ring takes a brightness and a colour for each of the dial's modes.
- Hardware mixing on the Wave XLR Pro (experimental): each channel streams to the unit on a USB pair of its own and the unit builds the mixes its jacks and USB Aux port play, so the microphones reach the headphones with no delay and ducking runs per channel in the unit. Each mix the unit builds alone has the unit's maximizer (manual).
- Submixer built from PipeWire nodes, no kernel modules: channels for the XLR inputs, Aux In, application groups and any other capture source, monitor mixes on any outputs, virtual microphones other apps record from. You change all of it while audio plays.
- Ducking: one to eight keys, each a microphone or a channel such as Voice Chat, lower chosen channels in chosen mixes while the loudest key is loud, in software everywhere and on the Pro's own processor when the setup fits, with presets or your own sensitivity, amount and speed.
- Microphone processing: an EQ of up to sixteen bands with Wave Link's band types (up to four on the unit where it has an EQ), EQ profiles saved by name and loaded from the UI or a Deck key, a compressor and an expander with their own windows (on the unit's processor where it has them), and Mic setup, which loops a recorded take through the EQ and plugins while you tune them.
- Noise removal first in each microphone's chain, RNNoise or DeepFilterNet 3, built into every package.
- Soundboard: short clips played into the SFX channel from pads in the UI, each with its own gain, press mode and loop, and Stop all. Eighteen CC0 starter sounds come with it.
- Voice changer on any microphone: a robot, a radio, monsters, or your own pitch and formant, from its own window or a Deck key.
- Plugin inserts: LV2, CLAP and VST3 chains on each microphone input
and each mix, with native editors, generated controls and bypass. The
native host measures the delay each plugin adds on its audio, and a
plugin too slow for a small block size can run on its own block.
Windows VST3 and CLAP plugins run through
openxlr-yabridge. Its host reports the system disk's model and serial number the way Windows does, so plugins that tie their licence to a machine ID, such as Elgato Voice Focus, can activate. - Application routing by name rules, Electron and Wine/Proton apps included, with a playback volume for each application; an optional Chromium companion routes single browser tabs, each with a volume of its own (browser routing).
- Profiles: named scenes of hardware settings and the whole submix, recalled from the UI, the API, a Stream Deck key or on connect.
- Daemon and APIs: the daemon owns the device and the graph and keeps running with the UI closed; WebSocket and HTTP APIs on a private Unix socket authenticated by peer credentials.
- Terminal mixer
openxlr-tui(manual), an Omarchy bar plugin (omarchy.md), twenty-five skins as data (skins.md) and seven languages (localization).
Every control, area by area: docs/features.md.
Keys and dials for every switch, mute, level, insert, output and profile. Dials get a touch panel with a knob, a level meter, the value and a mute overlay; one dial can hold several targets.
Keys show an icon and a status lamp: red for a mute, green for an engaged feature or the active monitor output.
After installing, follow Getting started to connect a microphone, choose a listening output and route your first app. The graphical mixer also opens a welcome guide on a clean first launch.
Packages exist for Arch Linux, CachyOS and Omarchy (AUR), Ubuntu (PPA),
Fedora (COPR) and NixOS (flake). Every release also carries a .deb and
an .rpm, with SHA-256 checksums and a build provenance attestation
(gh attestation verify <file> --owner emaspa).
Arch Linux, CachyOS and Omarchy, from the AUR:
yay -S openxlr # or: paru -S openxlr
systemctl --user enable --now openxlr-daemon
openxlr # the mixer UI, also in your application menuOn Omarchy, run openxlr-omarchy-enable once for the bar plugin.
Ubuntu 24.04 and 26.04, from the PPA:
sudo add-apt-repository ppa:sparvoli/openxlr
sudo apt install openxlr
systemctl --user enable --now openxlr-daemon
openxlrFedora 44 or newer, from COPR:
sudo dnf copr enable emaspa/openxlr
sudo dnf install openxlr
systemctl --user enable --now openxlr-daemon
openxlrWithout the PPA or COPR, install the .deb or .rpm from the
latest release with
sudo apt install ./openxlr_*_amd64.deb or
sudo dnf install ./openxlr-*.x86_64.rpm.
NixOS: add inputs.openxlr.url = "github:emaspa/openxlr"; to your
system flake, then these entries to its nixosSystem.modules list:
openxlr.nixosModules.default
{ services.openxlr.enable = true; }The module options cover LV2 plugins, software ClipGuard and the Windows bridge.
After installing, replug an Elgato device once so the udev rule
applies, and log out and back in, or run
systemctl --user restart wireplumber, so the packaged WirePlumber rules
load. For the Stream Deck, install com.emaspa.openxlr.sdPlugin.zip
from the release with OpenDeck's install-from-file. Inserts list the LV2,
CLAP and VST3 plugins you have installed (lsp-plugins-lv2 is a good
start); the software ClipGuard needs swh-plugins; Windows plugins need
openxlr-yabridge from the same place you got OpenXLR
(manual).
Upgrading: reboot, or run systemctl --user restart openxlr-daemon
and reopen the UI. When the release says a WirePlumber rule was added or
changed, run systemctl --user restart wireplumber before the daemon;
replug the interface only when it says the udev rule changed.
From source: the source guide lists the prerequisites, then:
git clone https://github.com/emaspa/openxlr.git
cd openxlr
dotnet restore src/OpenXLR.slnx --locked-mode
dotnet build src/OpenXLR.slnx -c Release --no-restore -warnaserror -p:EnableNativeLv2Host=true
OPENXLR_BUILD_MIXER=1 ./src/OpenXLR.Daemon/bin/Release/net10.0/OpenXLR.Daemon
./src/OpenXLR.UI/bin/Release/net10.0/OpenXLR.UI # in a second terminalSteamOS and Bazzite: each release carries an experimental Flatpak, with steps for Desktop Mode and Game Mode in flatpak.md. OpenXLR will not be published on Flathub, whose rules do not allow AI-assisted development.
- Another brand's microphone or interface gets the mixer, not its hardware controls.
- On the Pro, the unit's ducking runs only on the headphone jacks, Line Out and the USB Aux port, and only with the unit's own inputs as keys, or in hardware mixing a channel on a USB pair; other setups duck in software. Hardware mixing has room for eight channels beside the unit's own inputs, builds only the mixes the unit plays, and takes no plugin on those mixes. The channel booster is not available yet.
- Routing the focused application needs a compositor the UI can ask which
window has focus: KWin, Hyprland, Sway, Niri, X11 through
xprop, or GNOME Shell with the optional OpenXLR Focus extension (gnome-focus.md). Other Wayland compositors have no focus source yet. - Windows plugins depend on Wine and yabridge. An editor that misbehaves there can be swapped for OpenXLR's generated controls.
The roadmap has what comes next, starting with user reports and hardware checks of the 0.2 features.
The documentation index lists every guide. The main ones: the manual, features, hardware support, the WebSocket API and HTTP API, skins, the architecture and the Wave XLR Pro protocol.
Support, hardware reports and release news are on
Discord,
r/OpenXLR and GitHub issues. To
report one, open Options, SUPPORT, Collect diagnostics: it writes
~/openxlr-diagnostics-<timestamp>.tar.gz with the device state, the
PipeWire graph, logs and configs. Nothing is uploaded; attach it yourself.
To contribute, read CONTRIBUTING.md.
Developed and used daily by the author with a Wave XLR Pro, an XLR Dock, an XLR Dock MK.2, a Wave:3, a Wave:3 MK.2 and a Stream Deck + XL; community testers verified the Wave XLR and Wave XLR MK.2. Tests against a private PipeWire server cover setups without Elgato hardware. The two maintainers write the code, with AI tooling (Anthropic's Claude and OpenAI's Codex) assisting with capture analysis, UI design and parts of the coding; the person who opens a pull request is its author and answers for every line of it (AGENTS.md). Every hardware finding was verified on a real device.
GPL-3.0. The native plugin host carries third-party code under
its own licences, each kept beside it: the CLAP headers in native/clap
and the VST3 interface headers in native/vst3 (MIT), Signalsmith Stretch
1.4.0 and the Signalsmith Linear headers it builds on in native/signalsmith
(MIT), RNNoise 0.2 in native/rnnoise (BSD-3-Clause), libDF from DeepFilterNet 0.5.6 in
native/deepfilter/libdf with the DeepFilterNet3 model it embeds (MIT or
Apache-2.0), and the Rust crates DeepFilterNet builds on, listed in
native/deepfilter/Cargo.lock, each under its own package's licence (MIT,
Apache-2.0 or a choice including one of them, Unicode-DFS-2016 beside
those for one crate, CC0-1.0 for tiny-keccak).
If you find OpenXLR useful, consider buying me a coffee or supporting it on Ko-fi.




