A live shader wallpaper engine for Wayland compositors, built on Quickshell.
Wallder renders GLSL fragment shaders as animated, full-screen wallpapers across all connected monitors
- Multi-monitor support — renders independently on every screen
- Per-shader configuration — each shader carries a
.metasidecar file for animation parameters - Layer shell integration — sits at
WlrLayer.BackgroundwithexclusiveZone: -1, compatible with any wlr-based compositor (Hyprland, niri, sway, etc.) - No compositor patches required — pure Quickshell/QML; no native code
- Quickshell
- A Wayland compositor implementing the
wlr-layer-shellprotocol - Qt 6 with
QtQuickandQtQuick.Effects - Pre-compiled
.qsbshader files (see Shader Format)
Clone the repository into your Quickshell configuration directory:
git clone https://github.com/eq-desktop/wallder ~/.config/quickshell/wallderThen launch it via Quickshell:
WALLDER_SHADER=eyes qs -c wallder| Variable | Default | Description |
|---|---|---|
WALLDER_SHADERS |
<shellDir>/shaders |
Path to the directory containing shaders |
WALLDER_SHADER |
"eyes" |
Name of the active shader (without extension) |
Each shader consists of two files placed in the shader directory:
A compiled Qt Shader Baker (.qsb) binary. The fragment shader receives the following uniforms:
| Uniform | Type | Description |
|---|---|---|
resolution |
vec2 |
Dimensions of the output surface in pixels |
time |
float |
Animated time value, driven by NumberAnimation |
A minimal shader skeleton:
#version 440
layout(location = 0) in vec2 qt_TexCoord0;
layout(location = 0) out vec4 fragColor;
layout(std140, binding = 0) uniform qt_Uniforms {
mat4 qt_Matrix;
float time;
vec2 resolution;
};
void main() {
vec2 uv = qt_TexCoord0;
fragColor = vec4(uv, 0.5 + 0.5 * sin(time * 0.001), 1.0);
}Compile with qsb:
qsb --glsl 100es,120,150 --hlsl 50 --msl 12 -o shaders/myshader.qsb myshader.fragA plain-text sidecar file with key: value pairs, one per line. Supported keys:
| Key | Description | Example |
|---|---|---|
duration |
Duration of one full animation cycle in milliseconds | duration: 60000 |
goal |
End value of the time uniform per cycle |
goal: 200 |
Example .meta file:
duration: 80000
goal: 150
If no .meta file is present or a key is missing, the values from shaderConfig in shell.qml are used as fallback.
MIT