<a href="https://ko-fi.com/e_tho"><img src="https://img.shields.io/badge/Ko--fi-F16061?style=flat&logo=ko-fi&logoColor=white" alt="Ko-fi"></a>
<a href="https://liberapay.com/e-tho"><img src="https://img.shields.io/badge/Liberapay-F6C915?style=flat&logo=liberapay&logoColor=333333" alt="Liberapay"></a>
<img src="https://github.com/e-tho/pwmenu/raw/v0.4.0/assets/demo.gif" alt="Demonstration of pwmenu: a launcher-driven audio manager for Linux" width="800">
<a href="https://github.com/e-tho/iwmenu" title="Try iwmenu: a launcher-driven Wi-Fi manager for Linux"><img src="https://custom-icon-badges.demolab.com/badge/iwmenu-00AADD?style=for-the-badge&logo=wifi&logoSource=feather&logoColor=white" alt="iwmenu: a launcher-driven Wi-Fi manager for Linux" /></a>
<a href="https://github.com/e-tho/bzmenu" title="Try bzmenu: a launcher-driven Bluetooth manager for Linux"><img src="https://custom-icon-badges.demolab.com/badge/bzmenu-1565C0?style=for-the-badge&logo=bluetooth&logoSource=feather&logoColor=white" alt="bzmenu: a launcher-driver Bluetooth manager for Linux" /></a>
pwmenu (PipeWire Menu) manages audio through your launcher of choice.
Rust (includes cargo)pkg-config – For detecting required librariesclang – For C bindings generationpipewire – For PipeWire development headerspipewire – PipeWire daemonstdin mode support-i xdg, included with DEs or can be installed manually)dunst, fnott, included with DEs or can be installed manually)| Launcher | Font Icons | XDG Icons | Notes |
|---|---|---|---|
| Fuzzel | ✓ | ✓ | XDG icons supported since v1.13.0 |
| Rofi | ✓ | ⧖ | XDG icon support pending via PR #2122 |
| dmenu | ✓ | ✗ | No XDG icon support |
| bemenu | ✓ | ✗ | No XDG icon support |
| Custom (stdin) | ✓ | ? | Depends on launcher implementation |
[!TIP] If your preferred launcher isn't directly supported, use
custommode with appropriate command flags.
Run the following commands:
git clone https://github.com/e-tho/pwmenu
cd pwmenu
cargo build --release
An executable file will be generated at target/release/pwmenu, which you can then copy to a directory in your $PATH.
Add the flake as an input:
inputs.pwmenu.url = "github:e-tho/pwmenu";
Install the package:
{ inputs, ... }:
{
environment.systemPackages = [ inputs.pwmenu.packages.${pkgs.system}.default ];
}
Install from AUR with your favorite helper:
paru -S pwmenu-git
Specify an application using -l or --launcher flag.
pwmenu -l fuzzel
Specify custom as the launcher and set your command using the --launcher-command flag. Ensure your launcher supports stdin mode, and that it is properly configured in the command.
pwmenu -l custom --launcher-command "my_custom_launcher --flag"
Use {hint} as the value for the relevant flag in your command; it will be substituted with the appropriate text as needed.
pwmenu -l custom --launcher-command "my_custom_launcher --placeholder-flag '{hint}'" # or --prompt-flag '{hint}:'
This example demonstrates enabling all available features in custom mode with fuzzel.
pwmenu -l custom --launcher-command "fuzzel -d --placeholder '{hint}'"
| Flag | Description | Supported Values | Default Value |
|---|---|---|---|
-l, --launcher |
Specify the launcher to use (required). | dmenu, rofi, fuzzel, bemenu, custom |
None |
--launcher-command |
Specify the command to use when custom launcher is set. |
Any valid shell command | None |
-i, --icon |
Specify the icon type to use. | font, xdg |
font |
-s, --spaces |
Specify icon to text space count (font icons only). | Any positive integer | 1 |
-m, --menu |
Specify the root menu to start in. | output-devices, input-devices, output-streams, input-streams |
None |
--volume-step |
Specify volume adjustment step as percentage. | 1-25 |
5 |
--interactive |
Stay in menus after actions and return to previous menu on escape. | N/A | false |
Please see CONTRIBUTING.md for contribution guidelines.
This project is licensed under the terms of the GNU General Public License version 3, or (at your option) any later version.
If you find this project useful and would like to help me dedicate more time to its development, consider supporting my work.
$ claude mcp add pwmenu \
-- python -m otcore.mcp_server <graph>