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.

Arch (AUR)
yay -S neowall-git
From source
git clone https://github.com/1ay1/neowall && cd neowall
meson setup build && ninja -C build
sudo ninja -C build install

Prebuilt 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:

UniformTypeWhat it is
iTimefloatSeconds since the shader started.
iResolutionvec3Viewport size in pixels (xy) + pixel aspect (z).
iMousevec4Cursor xy + click state (zw). Center on the desktop.
iFrameintFrame counter since start.
iTimeDeltafloatSeconds since the last frame.
iFrameRatefloatFrames per second.
iDatevec4Year, month, day, seconds-in-day.
iChannel0–3sampler2DTexture channels (images / feedback).
iChannelResolution[4]vec3Per-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.

Share your own shader →