Docs

Building from source.

Dependencies per distro, the udev rules people forget, the cargo variants, and the whole SteamOS procedure.

Building on Linux

You need the Rust toolchain (via rustup) and a git client. No particular versions are pinned.

Dependencies

# Debian / Ubuntu
sudo apt-get install pkg-config libdbus-1-dev libpulse0

# Fedora
sudo dnf install pkgconf-pkg-config dbus-devel pulseaudio-libs

Only if you want the optional text-to-speech feature:

# Debian / Ubuntu
sudo apt-get install clang libspeechd-dev

# Fedora
sudo dnf install clang speech-dispatcher-devel

Get the source

git clone https://github.com/GoXLR-on-Linux/goxlr-utility.git
cd goxlr-utility

To build a development branch instead of the default, check it out first (git checkout dev-0.12.0). To refresh a clone you already have, git pull.

Device permissions

Packages do this for you; a manual build doesn’t. The rules file ships in the repository root, so from inside the clone:

sudo cp 50-goxlr.rules /etc/udev/rules.d/50-goxlr.rules
sudo udevadm control --reload-rules
sudo udevadm trigger
Skip this and

the build will succeed and the daemon will still refuse to see your mixer. It’s a permissions problem, not a build problem.

Build it

cargo build                              # debug
cargo build --release                    # release
cargo build --features "tts"             # with text-to-speech
cargo build --features "tts" --release

There’s also ci/build-and-install.sh in the repo, which does the build and install in one go.

Binaries land in target/debug or target/release: goxlr-daemon, goxlr-client, goxlr-launcher, goxlr-defaults, goxlr-initialiser (deprecated), and goxlr-firmware — about which the project’s own guide says only that we don’t talk about it.

SteamOS

SteamOS’s root filesystem is read-only, and the usual advice of unlocking it is both risky and undone by the next update. This procedure avoids all of that: everything happens in your home directory, from Desktop Mode, with no sudo and no pacman. The missing development headers come from an Arch bootstrap tarball unpacked as a sysroot.

1. Arch sysroot for the headers

mkdir ~/arch-sysroot
curl -OL https://archive.archlinux.org/iso/2026.07.01/archlinux-bootstrap-x86_64.tar.zst
tar --zstd -xf archlinux-bootstrap-x86_64.tar.zst -C ~/arch-sysroot \
    --strip-components=1 --no-same-owner root.x86_64/usr
export CFLAGS="--sysroot=$HOME/arch-sysroot"

Note that only root.x86_64/usr is extracted, and that CFLAGS has to be exported in the same shell you then build in.

2. Rust

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
. "$HOME/.cargo/env"

The default rustup options are fine.

3. Build

git clone https://github.com/goxlr-on-linux/goxlr-utility
cd goxlr-utility
cargo build --release

4. Keep the binaries somewhere safe

mkdir ~/goxlr-bin
cp target/release/{goxlr-launcher,goxlr-daemon,goxlr-client,goxlr-defaults} ~/goxlr-bin/

Double-click goxlr-launcher in the file manager to start it; the UI is reachable from the system tray icon. Autostart is a setting inside the app, under System → Utility Settings.

Optionally, the project’s UI wrapper AppImage (goxlr-utility-ui-wrapper-app, v0.0.6) dropped into ~/goxlr-bin/ replaces the browser-popup UI with a proper application window.

Limitation

This gets you a working GoXLR in Desktop Mode. It does not make the device available in Game Mode — that needs further steps which aren’t documented.

Written from the GoXLR Utility project’s own documentation (Compilation Guide, GoXLR Utility on SteamOS) and reproduced here in our own words, so you don’t have to leave the site. The project’s originals remain the authority if anything here goes stale.