Wallr
GPU-accelerated wallpaper engine for Wayland, rendered natively with wgpu on wlr-layer-shell.
Wallr renders its own background surface on wlr-layer-shell compositors. It does not shell out to hyprpaper, swaybg, or swww.
Features
- Static, GIF, and video wallpapers (MP4, WebM, MKV) with hardware-accelerated decode
- 11 transitions: fade, blur, wipe, slide, zoom, pixelate, ripple, dissolve, wave, grow, outer
- Per-monitor wallpapers and scaling modes
- Background daemon over a Unix socket, with directory watching for auto-apply
- Optional post-apply theming via Matugen, Wallust, or Pywal
- YAML animation packages with an install/search registry
- Near-zero idle overhead: static wallpapers render once and sleep; video and GIFs pace to frame boundaries
- Zero-duration static sets can use a low-memory
wl_shmcompositor buffer; GPU rendering remains available for transitions and live media - Performance harness for live Wayland measurements against
awww(scripts/benchmark-wallpapers.sh)
Screenshots
Install
Usage
# Basic wallpaper change
# Smooth transitions with ergonomic short flags
# Automatic directory rotation
wallr set starts the daemon automatically if it isn't already running. Full flag reference: docs/cli-reference.md.
Configuration
~/.config/wallr/config.yaml:
wallpaper:
default: "~/Pictures/Wallpapers/default.png"
mode: "fill"
animation:
use: "smooth/crossfade"
duration: "2000ms"
theme:
provider: "matugen"
reload:
- "waybar"
- "dunst"
Full schema: docs/config-reference.md.
Requirements
| Compositor | Hyprland, Sway, niri (layer rule required), or KDE Plasma 6: any wlr-layer-shell implementation. GNOME/Mutter is unsupported. |
| Rust | stable, for building from source |
| FFmpeg | required only when building from source, for video wallpapers. Prebuilt release binaries statically link FFmpeg. |
Building from source
# Arch
# Fedora
# Ubuntu/Debian
Architecture
The wallr CLI talks to wallr daemon over a Unix socket. The daemon owns the layer-shell surface, the wgpu renderer, and the animation engine. Wallpaper changes render as GPU transitions from the previous image; GIFs continue playing after the transition ends, and video is decoded by FFmpeg with hardware acceleration where available.
Details: docs/architecture.md.
Performance measurements
Wallr is optimized around event-driven static rendering and bounded live playback. Use the included harness to measure the daemon on your compositor:
It requires a running Wayland session, hyperfine, awww, and release-built
Wallr. Comparisons are machine- and workload-specific; do not interpret one
run as a universal ranking.
Troubleshooting
error while loading shared libraries: libavutil.so.58: the installed binary was built against an older FFmpeg ABI. Reinstall the latest release (statically linked), or rebuild from source:
Wallpaper intercepts input: it shouldn't; the surface runs on Layer::Background with KeyboardInteractivity::None and an empty input region. If it happens: confirm your compositor is supported, check compositor logs for layer-shell errors, restart the daemon (pkill wallr && wallr daemon), and on niri add a layer-shell rule permitting Wallr on the background layer.
Documentation
Changelog · CLI reference · Config reference · Animation authoring · Architecture · Matugen integration · Video wallpapers
Last wallpaper per output is stored at ~/.cache/wallr/last_wallpaper/<OUTPUT>; see CLI reference and Architecture.
Contributing
See CONTRIBUTING.md.
Credits
Sample wallpapers in samples/ are mostly taken from:
All rights belong to their respective owners; thanks to the original authors for sharing their work.
License
MIT; see LICENSE.