wiremix: a terminal audio mixer that talks to PipeWire directly
Simple TUI audio mixer for PipeWire
At a glance
- What is it?
- wiremix is an Apache-2.0 or MIT licensed Rust TUI mixer for PipeWire, replacing a desktop mixer with a keyboard-driven interface that can route audio between devices and applications and adjust volumes, with a TOML config for keybindings, character sets and tabs. It suits a Linux user on a terminal or a window manager without a mixer, and it is the wrong tool if you want a PulseAudio or JACK server rather than PipeWire.
- Who is it for?
- wiremix fits a Linux user who wants mixer control from a terminal, since the whole interface is keyboard driven, the character sets can be swapped for whatever your terminal renders, and the TOML config makes the bindings and tabs yours to set.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly Rust, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
It is a mixer, and the layout follows familiar ones
wiremix is described as a simple TUI audio mixer for PipeWire, and the README says you can use it to adjust volumes, route audio between devices and applications, and configure audio device settings like input and output ports and profiles. The interface is described as more or less a clone of ncpamixer, which was itself inspired by pavucontrol, so users of either should find it familiar. That lineage explains the structure of the program, with a set of tabs rather than a single screen, and a mouse-driven selection model that also has a full keyboard path. The project description is one line, a simple TUI audio mixer for PipeWire, and the author asks for issues and pull requests.
Installation is a distro package or a cargo install
There is a repology badge, so the tool is packaged for a range of distributions, and the manual route is documented for the rest. The dependencies are Rust and the PipeWire libraries, and the per-distro commands are given. On Ubuntu the install is cargo, the PipeWire development package, pkg-config and clang, and on Debian the same minus cargo, with the note that you will also need a reasonably recent Rust toolchain, and rustup is one way to get it.
sudo apt install cargo libpipewire-0.3-dev pkg-config clangThen the tool itself is installed with cargo.
cargo install wiremixThe Cargo.toml puts the package at version 0.11.0 on edition 2021 with a minimum Rust version of 1.88.0, authored by Thomas Sowell, and the licence is MIT OR Apache-2.0 with both licence files in the repository root.
Five tabs, and the command line can reshape them
The quick start is to run wiremix with default settings and use the mouse and keyboard bindings, with ? displaying the bindings. The arrow keys or hjkl navigate and adjust volume, Tab or HL change tabs, c opens a dropdown to route audio to a different destination, m mutes and unmutes, and d sets an input or output device as the default source or sink. The five tabs are playback, recording, output, input and configuration, and the command line can both pick the initial tab and decide which tabs are present and in what order.
-v, --tab <TAB>
Initial tab view [possible values: playback, recording, output, input,
configuration]
-T, --tabs <TABS>...
Which tabs are present and their order [possible values: playback,
recording, output, input, configuration]Other options cover the remote to connect to with --remote, a target frame rate with --fps where 0 means unlimited, character sets with --char-set, themes with --theme and the peak meter mode with --peaks where the choices are off, mono and auto. Command line options override the corresponding settings in the configuration file, which is stated explicitly.
Volume limits and lazy capture are the two settings worth understanding
Two of the options carry behaviour that is not obvious from the name. The first is the maximum volume percent, which by default is 150, together with an enforce flag that decides whether the slider stops there, and the README documents both directions of that toggle so you can allow or prevent raising the volume past the maximum. The second is lazy capture, which by default is off, meaning peak levels of all nodes are monitored, and enabling it limits monitoring to the nodes actually on screen, which reduces CPU usage at the cost of peaks appearing with a slight delay. For a mixer running on a laptop, that trade is worth understanding, since monitoring every node in a busy PipeWire graph is not free.
The configuration is TOML, and it can rewrite the keybindings
The configuration file is TOML and is searched in three places, in order of precedence, the path given on the command line with -c or --config, then $XDG_CONFIG_HOME/wiremix/wiremix.toml, then ~/.config/wiremix/wiremix.toml. The file is merged with the built-in defaults, so it only needs the options you want to change, and the repository's own wiremix.toml is the documented reference for every default. The basic set of options maps one to one onto the command line.
mouse = true
peaks = "auto"
char_set = "default"
theme = "default"
tab = "playback"
tabs = [ "playback", "recording", "output", "input", "configuration" ]
max_volume_percent = 150.0
enforce_max_volume = false
lazy_capture = falseKeybindings are configurable for all actions, and the README gives two worked examples, one that switches to ncpamixer-style absolute volume bindings and one that uses the F-keys to select tabs.
keybindings = [
{ key = { F = 1 }, action = { SelectTab = 0 } },
{ key = { F = 2 }, action = { SelectTab = 1 } },
]The key syntax looks like a Rust enum, which is a fair hint that the configuration is deserialised with serde into the same types the program uses internally.
Character sets exist because your terminal will not render everything
The default keybinding table is a plain volume-nudge scheme, with l or the right arrow incrementing volume, h or the left arrow decrementing it, m toggling mute, d setting the default source or sink, j and k moving, H and L switching tabs, and the digits 0 to 9 setting an absolute percentage, with the backtick setting zero. The interesting part is the character sets. There are three built in, and the default set may contain symbols that cannot be rendered in your terminal or console, while compat uses only symbols from a cross-platform terminal characters reference and extracompat is the third option for the most limited cases. You switch between them with the char_set option or the -s argument. The mouse path is documented too, with a click on the numeric volume percentage toggling mute, the wheel or the scroll buttons scrolling lists, and a right-click setting the default source or sink.
Rust, ratatui and a build that optimises for size and speed
The dependency list in Cargo.toml describes the stack. The interface is ratatui 0.30.2 with crossterm 0.29.0 for terminal handling, the PipeWire side is the pipewire crate 0.10.1 with the v0_3_44 feature plus libspa and libspa-sys, and the command line is clap 4.5.26 with derive and wrap_help. Configuration is TOML through the toml crate with serde and serde_with and serde_json, and there is a tracing stack behind an optional trace feature, which is a good pattern for a program that talks to a daemon and needs diagnostics when something is off. The release profile sets codegen-units to 1 and enables lto, and the repository also carries a flake.nix, a package.nix and a rust-toolchain.toml, so Nix users get a pinned toolchain and a package definition, plus a wiremix.desktop file for a desktop entry.
Editorial conclusion
wiremix fits a Linux user who wants mixer control from a terminal, since the whole interface is keyboard driven, the character sets can be swapped for whatever your terminal renders, and the TOML config makes the bindings and tabs yours to set. It is a poor fit if you run PulseAudio or JACK rather than PipeWire, since the whole tool is built on the PipeWire libraries, and a poor fit if you want a graphical mixer, since it is a TUI by design even though its layout follows pavucontrol. Verify first that the PipeWire development libraries are present and that your terminal can render the default character set, and note that the default set may include symbols your terminal cannot draw, which is what the compat and extracompat sets exist for.
Frequently asked questions
What is wiremix?
A simple TUI audio mixer for PipeWire, written in Rust, that lets you adjust volumes, route audio between devices and applications, and configure device settings such as input and output ports and profiles. Its interface is a clone of ncpamixer, which was itself inspired by pavucontrol.
How do I install wiremix?
It is packaged for several distributions, and the manual route needs Rust and the PipeWire libraries. On Ubuntu, install cargo, libpipewire-0.3-dev, pkg-config and clang, then run cargo install wiremix. On Debian the same apt install without cargo, plus a recent Rust toolchain.
What can I configure in wiremix.toml?
Every command line option has a matching configuration entry, and the file is merged with the defaults so you only specify what changes. The file is looked up in the path given by --config, then $XDG_CONFIG_HOME/wiremix/wiremix.toml, then ~/.config/wiremix/wiremix.toml, and the repository's own wiremix.toml documents every default.
What are the character sets for in wiremix?
They define the symbols used in the interface, and the default set may include characters your terminal cannot render. The compat set uses only symbols from a cross-platform terminal characters reference, and extracompat is the most conservative option, and you switch with the char_set option or the -s argument.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/tsowell-wiremix)Was this useful?