About neowall.net
neowall runs GLSL shaders as your Linux wallpaper — Wayland and X11, multi-monitor, a single static C binary, no daemon-in-Python anywhere. This site is the community gallery: every shader here is rendered live in your browser with WebGL2, using the exact uniform set neowall feeds the desktop, so the preview is the wallpaper.
Install neowall
Grab the engine, then come back and copy any shader you like.
yay -S neowall-gitgit clone https://github.com/1ay1/neowall && cd neowall
meson setup build && ninja -C build
sudo ninja -C build installPrebuilt binaries are on the releases page. Full docs live in the repo.
The shader format
neowall accepts unmodified Shadertoy GLSL. Your shader defines a single entry point:
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
vec2 uv = fragCoord / iResolution.xy;
fragColor = vec4(uv, 0.5 + 0.5 * sin(iTime), 1.0);
}The engine injects the standard Shadertoy uniforms. These are the ones available:
| Uniform | Type | What it is |
|---|---|---|
iTime | float | Seconds since the shader started. |
iResolution | vec3 | Viewport size in pixels (xy) + pixel aspect (z). |
iMouse | vec4 | Cursor xy + click state (zw). Center on the desktop. |
iFrame | int | Frame counter since start. |
iTimeDelta | float | Seconds since the last frame. |
iFrameRate | float | Frames per second. |
iDate | vec4 | Year, month, day, seconds-in-day. |
iChannel0–3 | sampler2D | Texture channels (images / feedback). |
iChannelResolution[4] | vec3 | Per-channel resolution. |
For convenience, the legacy shims texture2D → texture and iGlobalTime → iTime are defined, so older Shadertoy shaders compile unchanged. This site's preview uses WebGL2 (GLSL ES 3.00) with the same wrapper, so multi-pass and texture-heavy shaders may look slightly different in-browser than on the desktop — the single-pass ones (the vast majority) are pixel-identical.
Wiring it into your config
~/.config/neowall/config.vibe:
default {
shader retro_wave.glsl
shader_speed 0.8
}Per-monitor:
output {
DP-1 { shader matrix_rain.glsl }
HDMI-A-1 { path ~/Pictures/ duration 600 }
}How the live previews work
Each card is a real WebGL2 context that compiles the shader source and animates it. To keep a 60-card grid smooth, previews are lazy (compile only when scrolled into view), hover-gated (animate only what you're pointing at), and budget-capped (a small scheduler keeps the number of simultaneously-animating canvases bounded, so the browser never runs out of GPU contexts). Off-screen and background-tab canvases pause entirely.