Wallr
Native Wayland wallpapers. GPU-rendered. Built with Rust.
GPU-accelerated wallpaper engine for Wayland with native wl-layer-shell rendering powered by wgpu.
Introduction
Wallr sets and animates wallpapers on Wayland compositors that support wlr-layer-shell. It renders its own background surface with wgpu — it does not shell out to hyprpaper, swww, or swaybg.
Theme generation (Matugen, Wallust, Pywal) is supported as an optional step that runs after a wallpaper is applied. It is not required and not part of the core rendering path.
Features
- 11 built-in transitions: fade, blur, wipe, slide, zoom, pixelate, ripple, dissolve, wave, grow, outer.
- GIF wallpapers, decoded once and cached to avoid re-decoding on loop.
- Video wallpapers (MP4, WebM, MKV) with hardware-accelerated decoding via FFmpeg.
- Five scaling modes: fill (cover), fit (contain), stretch, center (1:1), tile (repeat).
- Transition duration is wall-clock based, independent of monitor refresh rate.
- Background daemon (
wallr daemon) that owns the surface over a Unix socket. - Directory watching (
wallr watch) to apply new files automatically. - Per-monitor wallpapers and scaling modes.
- Preview mode to test an effect before applying it.
- YAML animation packages with an install/search/publish registry.
- Automatic GPU selection on hybrid graphics systems.
Requirements
- Rust (stable)
- A compositor with
wlr-layer-shell: Hyprland, Sway, niri (with a layer rule), or KDE Plasma 6 - GNOME/Mutter is not supported — it does not implement the protocol
- FFmpeg development libraries, for video wallpapers (detected at build time)
Installation
Or build from source:
# Arch
# Fedora
# Ubuntu/Debian
Quick start
wallr set starts the daemon automatically if it isn't 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"
If Matugen calls wallr set as its own wallpaper command, pass --no-theme on that call to avoid a feedback loop.
Full schema: docs/config-reference.md
Architecture
wallr is a CLI that talks to wallr daemon over a Unix socket. The daemon owns the layer-shell surface, the wgpu renderer, and the animation engine. Wallpaper changes are rendered as GPU transitions from the previous image; GIFs continue playing frame-by-frame once the transition ends, and videos are decoded by FFmpeg with hardware acceleration where available.
Details: docs/architecture.md
Documentation
- Changelog
- CLI reference
- Configuration reference
- Animation authoring
- Architecture
- Matugen integration
- Video wallpaper support
Troubleshooting
Wallpaper blocks clicks or keyboard input. It shouldn't — the surface is rendered on Layer::Background, with KeyboardInteractivity::None and an empty input region. If this happens:
- Confirm your compositor is one of the supported ones.
- Check compositor logs for layer-shell errors.
- Restart the daemon:
pkill wallr && wallr daemon. - On niri, add a layer-shell rule permitting Wallr on the background layer.
Star History
Contributing
See CONTRIBUTING.md.
License
MIT. See LICENSE.