HyprWave HiFi is a GTK4/Wayland music control overlay with MPRIS controls, per-application volume, PipeWire-native visualization, album art, notifications, and vertical idle display support.
This repository is the HiFi fork of upstream
hyprwave. Upstream release,
and github:shantanubaddar/hyprwave Nix instructions refer to the original
project unless explicitly stated otherwise. Use this repository URL or the
hyprwave-hifi package name when you want the HiFi fork changes.
| Area | Upstream hyprwave | HyprWave HiFi |
|---|---|---|
| Volume control | General player/system-oriented volume | Per-application sink-input control with MPRIS fallback |
| Visualizer backend | PulseAudio-oriented upstream path | PipeWire native API for capture |
| Visualizer targeting | System audio-oriented | Attempts to target the active MPRIS player's audio |
| Vertical layouts | Dot matrix idle display | Dot matrix idle display plus expanded-section visualizer support |
| Themes in this checkout | Upstream ships a larger theme set | This fork ships base light styling plus CSS files under themes/ |
| Player preference | Config preference list upstream | Last selected player is persisted in ~/.config/hyprwave/preferred_player |
- Per-application volume using PipeWire/Pulse sink-inputs via
pactl, with MPRIS fallback. - PipeWire-native visualizer with automatic gain control.
- MPRIS playback controls for Spotify, Roon, VLC, browsers, and other compatible players.
- Click/drag progress seeking when the active player supports seeking.
- Album art and metadata display.
- Right, left, top, and bottom layer-shell layouts.
- Vertical dot matrix idle display.
- Now-playing notifications.
- Tight Wayland input regions so transparent layer areas do not block desktop clicks.
- Light base styling and optional theme CSS.
| Dark Collapsed | Dark Expanded | Light Collapsed | Light Expanded |
![]() |
![]() |
![]() |
![]() |
Build dependencies:
# Arch Linux
sudo pacman -S base-devel gtk4 gtk4-layer-shell pipewire libsoup3 libpulse
# Ubuntu / Debian
sudo apt install build-essential pkg-config libgtk-4-dev gtk4-layer-shell libpipewire-0.3-dev libgdk-pixbuf-2.0-dev libsoup-3.0-dev pulseaudio-utils
# Fedora
sudo dnf install gcc make pkgconf-pkg-config gtk4-devel gtk4-layer-shell-devel pipewire-devel gdk-pixbuf2-devel libsoup3-devel pulseaudio-utilsRuntime notes:
- PipeWire must be running for visualization.
pactlis required for per-application volume. On PipeWire systems this is normally provided by PulseAudio compatibility packages such aslibpulseorpulseaudio-utils;pipewire-pulseprovides the compatible server.
git clone https://github.com/godlyfast/hyprwave-hifi.git
cd hyprwave-hifi
make
make installmake install installs:
hyprwaveto~/.local/bin/hyprwavehyprwave-toggleto~/.local/bin/hyprwave-toggle- resources to
~/.local/share/hyprwave/
The app creates ~/.config/hyprwave/config.conf on first run if it does not
already exist.
This fork's flake builds the local checkout:
nix build
nix runFrom GitHub, use the fork URL:
nix run github:godlyfast/hyprwave-hifiThe upstream package remains available separately as
github:shantanubaddar/hyprwave.
This fork is published on AUR as hyprwave-hifi:
yay -S hyprwave-hifiFor a package that tracks the latest main branch, use:
yay -S hyprwave-hifi-gitBoth fork packages provide hyprwave and conflict with the upstream hyprwave
package, so keep only one installed. yay -S hyprwave still targets the
original upstream package.
Start HyprWave, then start any MPRIS-compatible music player:
hyprwaveThe toggle helper talks to the running process with Unix signals:
hyprwave-toggle visibility
hyprwave-toggle expand
hyprwave-toggle play
hyprwave-toggle next
hyprwave-toggle prevIf HyprWave is not running, hyprwave-toggle visibility auto-starts it when the
binary is available in PATH or ~/.local/bin. Media actions require a running
HyprWave instance and an active MPRIS player.
Bind the helper script in your compositor config.
bind = SUPER_SHIFT, M, exec, hyprwave-toggle visibility
bind = SUPER, M, exec, hyprwave-toggle expand
bind = , XF86AudioPlay, exec, hyprwave-toggle play
bind = , XF86AudioNext, exec, hyprwave-toggle next
bind = , XF86AudioPrev, exec, hyprwave-toggle prevReload with hyprctl reload.
binds {
Mod+Shift+M { spawn "hyprwave-toggle" "visibility"; }
Mod+M { spawn "hyprwave-toggle" "expand"; }
XF86AudioPlay { spawn "hyprwave-toggle" "play"; }
XF86AudioNext { spawn "hyprwave-toggle" "next"; }
XF86AudioPrev { spawn "hyprwave-toggle" "prev"; }
}Reload with niri msg action reload-config.
bindsym $mod+Shift+M exec hyprwave-toggle visibility
bindsym $mod+M exec hyprwave-toggle expand
bindsym XF86AudioPlay exec hyprwave-toggle play
bindsym XF86AudioNext exec hyprwave-toggle next
bindsym XF86AudioPrev exec hyprwave-toggle prevReload with swaymsg reload.
# Hyprland
exec-once = hyprwave// Niri
spawn-at-startup "hyprwave"Edit ~/.config/hyprwave/config.conf:
# HyprWave Configuration File
[General]
# Edge to anchor HyprWave to: right, left, top, bottom
edge = right
# Margin from the selected screen edge in pixels
margin = 10
# Theme: light or dark
theme = light
# Size: tiny, small, default, large
size = default
# Volume method: auto, pipewire, mpris
volume_method = auto
[Notifications]
enabled = true
now_playing = true
[Visualizer]
# Expanded-section visualizer in all layouts
enabled = true
# Horizontal layouts only: seconds before idle visualizer mode appears.
# Set to 0 to disable automatic idle visualizer mode.
idle_timeout = 30
[VerticalDisplay]
# Vertical layouts only: dot matrix idle display
enabled = true
idle_timeout = 5The vertical dot matrix track-change scroll is constrained to the slim control bar height so track and artist text stays inside the rounded idle display. When playback is paused, the vertical idle display shows the local system clock in 24-hour format.
Player selection is not driven by [MusicPlayer] in this fork. The last chosen
MPRIS player is saved to ~/.config/hyprwave/preferred_player.
| Edge | Layout | Idle mode |
|---|---|---|
right / left |
Vertical | Dot matrix display |
top / bottom |
Horizontal | Visualizer bar |
The expanded section can show the visualizer in both vertical and horizontal layouts when the active player's audio stream can be matched.
| Method | Behavior |
|---|---|
auto |
Try PipeWire/Pulse sink-input control first, then fall back to MPRIS volume |
pipewire |
Require a matching sink-input; useful for Chromium/Electron players |
mpris |
Use only the player's MPRIS Volume property |
The base stylesheet is style.css. theme = light uses that base style.
theme = dark loads themes/dark.css.
Additional community theme snippets live in THEMES.md. In this fork
they are examples to copy into a CSS file, not built-in toggle targets. The
current hyprwave-toggle helper does not provide upstream's dynamic
set-theme command.
For Hyprland, disable blur on the layer surfaces:
layerrule = noblur, hyprwave
layerrule = noblur, hyprwave-notification- Confirm PipeWire is running:
systemctl --user status pipewire. - Confirm
[Visualizer] enabled = true. - Play audio from the selected MPRIS player.
- If the player has no matching sink-input, the visualizer may stay hidden.
Check pactl first:
which pactl
pactl list sink-inputsIf no matching sink-input is found, use volume_method = mpris for players with
a working MPRIS Volume property, or leave volume_method = auto for fallback.
- Language: C11
- GUI: GTK4
- Layer shell: gtk4-layer-shell
- Player control: D-Bus MPRIS2
- Visualizer: libpipewire native capture with AGC
- Per-application volume:
pactlsink-input control with MPRIS fallback - Install resources: local checkout,
~/.local/share/hyprwave/, then/usr/share/hyprwave/ - Memory target: roughly 80-95 MB idle
- CPU target: below 0.3% idle on the author's setup
| Parameter | Value | Purpose |
|---|---|---|
| Attack | 0.9 |
Fast response to louder audio |
| Decay | 0.9995 |
Slow decay during quiet parts |
| Min threshold | 0.0001 |
Avoid amplifying silence |
- Original project: hyprwave by shantanubaddar
- GTK4: gtk.org
- Layer shell: gtk4-layer-shell
- Audio: PipeWire
- Report fork-specific bugs via GitHub Issues
- Send upstream-only issues to shantanubaddar/hyprwave
- Share custom themes and screenshots on r/hyprwave
GPL-3.0. See LICENSE.



