GNOME/Mutter 等无 layer-shell 的合成器不支持,会直接报错退出;KDE Plasma 下原生桌面图标可能被壁纸层遮住;音频反应着色器依赖 parec(PipeWire/PulseAudio),未安装时静音降级;构建时缺 libxkbcommon 会导致终端壁纸无键盘输入。
neowall
1ay1活跃维护用 GLSL 着色器在 Linux 上跑 GPU 加速的动态壁纸引擎,兼容 Wayland 和 X11,支持多显示器。
GPU-accelerated live wallpaper engine for Linux using GLSL shaders. Runs on Wayland and X11.
yay -S neowall-binREADME 未说明具体显存或 GPU 型号要求;渲染走 EGL → OpenGL 3.3 core,需支持 OpenGL 3.3 的 GPU 与驱动。
把 Shadertoy GLSL 着色器直接当 Linux 动态壁纸跑,支持 Wayland 和 X11
用 GLSL 着色器在 Linux 上跑 GPU 加速的动态壁纸引擎,兼容 Wayland 和 X11,支持多显示器。
核心能力
- 直接加载未修改的 Shadertoy GLSL 着色器
- 窗口遮挡时自动暂停渲染以省电
- 内置约 20 个可自由分发的着色器
- 着色器可读取音频 FFT、CPU/内存/网络等实时数据
- 支持把 btop、htop 等终端程序渲染成壁纸
容易踩的坑
- v0.8.0NeoWall v0.8.0最新正式版2026-10-26 · 2026-10-26 13:24 UTC
NeoWall 0.8.0
GPU-accelerated live shader wallpapers for Wayland & X11.
Changes
- release: neowall 0.8.0
- frame clock: stamp iTime with the vblank the frame is shown at
- shader clock: reset a never-hidden wallpaper behind a cross-fade
- garden: stop the motes teleporting when the wind changes
- app: coalesce terminal wakes
- app: don't free the loop while a thread is posting to it
- children: start with a clean signal state
- garden: cut the frame cost in half, same image
- optimizers: never lower what's drawn
- adaptive: don't scale a shader down before measuring it
- terminal: let an idle terminal sleep, and wake it on output
- x11: pace vsync at the refresh rate, and stop the pacer double-stepping
- cli: talk to the daemon over a unix socket
- replace the event loop with a small elm-style runtime
- fix two data races tsan found
- Revert "add jaal as a submodule at external/jaal"
- add jaal as a submodule at external/jaal
- eventloop: stop one output or a slow sensor read from stalling every frame
- fix: default vsync to true when an output has no parsed config
- fix: record output monitor, not the microphone, and only when asked
- shader: make passes and inputs counts instead of array bounds
- shader: give gl objects their own layer so the graph has something to sit on
- shader: make every live machine signal bindable, not just the 24 in the enum
- shader: open up the data plane so inputs stop being a fixed list
- shader: let shaders load their own images as channels
- shaders: add window_forge, the showpiece for window awareness
- shader: let wallpapers see where your windows are
- cli: add
neowall newso writing a shader starts with a working shader - shader: give the scene kit materials, reflections and a real shadow
- shader: add a scene kit so a 3D wallpaper is ten lines, not three hundred
Packages
Pick the native package for your distro — each pulls in the right runtime deps.
Distro File Install Arch / Manjaro neowall-*-x86_64.pkg.tar.zstsudo pacman -U <file>Debian / Mint neowall_*_amd64.debsudo apt install ./<file>Ubuntu 24.04+ neowall_*-ubuntu24.04_amd64.debsudo apt install ./<file>Fedora / RHEL neowall-*.fc.x86_64.rpmsudo dnf install ./<file>openSUSE neowall-*.suse.x86_64.rpmsudo zypper install ./<file>Any (universal) neowall-*-x86_64.AppImagechmod +x <file> && ./<file>Plain binaries (no package manager)
File Build neowall-linux-x86_64-arch.tar.gzglibc (Arch) neowall-linux-x86_64-debian.tar.gzglibc (Debian bookworm) neowall-linux-x86_64-fedora.tar.gzglibc (Fedora) neowall-0.8.0-source.tar.gzsource tar -xzf neowall-linux-x86_64-*.tar.gz sudo install -m755 neowall /usr/local/bin/Arch (AUR, tracks git)
yay -S neowall-gitFrom source
tar -xzf neowall-0.8.0-source.tar.gz cd neowall-0.8.0 meson setup build --buildtype=release ninja -C build sudo ninja -C build installRequirements
- OpenGL 3.3+ capable GPU
- Wayland compositor with layer-shell (Hyprland, Sway, River, …) or X11
Verify downloads against
SHA256SUMS.txt. - v0.7.2NeoWall v0.7.22026-09-21 · 2026-09-21 22:21 UTC
查看更新说明
NeoWall 0.7.2
GPU-accelerated live shader wallpapers for Wayland & X11.
Privacy fix — update if you are on 0.5.0 or newer
neowall was opening your microphone. If your desktop warned you that neowall was using the mic, it was telling the truth. Details below.
What happened
The audio path spawns
parecso a wallpaper can react to whatever your speakers are playing. It was spawning it without a device argument, and with no deviceparecrecords the default source — which on a normal desktop is your microphone, not the speaker loopback. The comment directly above the code said "capturing the default monitor", so the intent was always right and the implementation quietly did the opposite.It was also doing this whether or not anything needed audio. The capture thread started with the daemon, so even a static image wallpaper opened a recording stream.
What did not happen
None of that audio left your machine. The samples land in a stack buffer that is reduced to a volume level, an FFT spectrum and a downsampled envelope, then uploaded to a GPU texture to be drawn. Nothing is written to disk, nothing is logged, and neowall contains no network code at all — no telemetry, no uploads, no crash reporting. Nothing was recorded or transmitted.
That does not make opening the mic acceptable. It should not have shipped.
The fix
- Capture now runs against
@DEFAULT_MONITOR@, the loopback of your default output. It can no longer reach an input device. - Capture is opt-in. It only starts if the shader you loaded actually reads
audio — an
iAudio*uniform, one of the stdlib helpers (spectrum(),waveform(),beat(),audioBand()), or aniChannelbound toaudio. Every other wallpaper spawns noparecat all.
Verify it yourself
Run
pactl list source-outputswhile neowall is running. On an affected build there is aparecstream on your input device. Here there is no stream at all unless your shader uses audio — and when there is, it is attached to your output monitor, not your mic.Affects 0.5.0 through 0.7.1, introduced with the reactive shader library. Fixes #84, reported by @mastermach50.
Packages
Pick the native package for your distro — each pulls in the right runtime deps.
Distro File Install Arch / Manjaro neowall-*-x86_64.pkg.tar.zstsudo pacman -U <file>Debian / Mint neowall_*_amd64.debsudo apt install ./<file>Ubuntu 24.04+ neowall_*-ubuntu24.04_amd64.debsudo apt install ./<file>Fedora / RHEL neowall-*.fc.x86_64.rpmsudo dnf install ./<file>openSUSE neowall-*.suse.x86_64.rpmsudo zypper install ./<file>Any (universal) neowall-*-x86_64.AppImagechmod +x <file> && ./<file>Plain binaries (no package manager)
File Build neowall-linux-x86_64-arch.tar.gzglibc (Arch) neowall-linux-x86_64-debian.tar.gzglibc (Debian bookworm) neowall-linux-x86_64-fedora.tar.gzglibc (Fedora) neowall-0.7.2-source.tar.gzsource tar -xzf neowall-linux-x86_64-*.tar.gz sudo install -m755 neowall /usr/local/bin/Arch (AUR, tracks git)
yay -S neowall-gitFrom source
tar -xzf neowall-0.7.2-source.tar.gz cd neowall-0.7.2 meson setup build --buildtype=release ninja -C build sudo ninja -C build installRequirements
- OpenGL 3.3+ capable GPU
- Wayland compositor with layer-shell (Hyprland, Sway, River, …) or X11
Verify downloads against
SHA256SUMS.txt. - Capture now runs against
- v0.7.1NeoWall v0.7.12026-09-16 · 2026-09-16 00:22 UTC
查看更新说明
NeoWall 0.7.1
GPU-accelerated live shader wallpapers for Wayland & X11.
Changes
- release: neowall 0.7.1
- release: recognise the AUR's current banner so publishing is not skipped
- reactive: wake capture threads instead of abandoning them at exit
- meta: rename staticwall to neowall in issue templates and metadata
- docs: point the README shader table at shaders that ship
- wayland: honour vsync so shader motion stops jerking
- render: stop the shader clock rebasing in full view of the user
- shader: stop the std-lib from colliding with shader-defined names
- release: fix Fedora RPM Wayland dependencies
Packages
Pick the native package for your distro — each pulls in the right runtime deps.
Distro File Install Arch / Manjaro neowall-*-x86_64.pkg.tar.zstsudo pacman -U <file>Debian / Mint neowall_*_amd64.debsudo apt install ./<file>Ubuntu 24.04+ neowall_*-ubuntu24.04_amd64.debsudo apt install ./<file>Fedora / RHEL neowall-*.fc.x86_64.rpmsudo dnf install ./<file>openSUSE neowall-*.suse.x86_64.rpmsudo zypper install ./<file>Any (universal) neowall-*-x86_64.AppImagechmod +x <file> && ./<file>Plain binaries (no package manager)
File Build neowall-linux-x86_64-arch.tar.gzglibc (Arch) neowall-linux-x86_64-debian.tar.gzglibc (Debian bookworm) neowall-linux-x86_64-fedora.tar.gzglibc (Fedora) neowall-0.7.1-source.tar.gzsource tar -xzf neowall-linux-x86_64-*.tar.gz sudo install -m755 neowall /usr/local/bin/Arch (AUR, tracks git)
yay -S neowall-gitFrom source
tar -xzf neowall-0.7.1-source.tar.gz cd neowall-0.7.1 meson setup build --buildtype=release ninja -C build sudo ninja -C build installRequirements
- OpenGL 3.3+ capable GPU
- Wayland compositor with layer-shell (Hyprland, Sway, River, …) or X11
Verify downloads against
SHA256SUMS.txt. - v0.7.0NeoWall v0.7.02026-09-09 · 2026-09-09 21:32 UTC
查看更新说明
NeoWall 0.7.0
GPU-accelerated live shader wallpapers for Wayland & X11.
Changes
- release: neowall 0.7.0
- render: fix three causes of shader stutter at a solid 60 FPS
- shaders: add garden.glsl, a wallpaper that grows over days
- cli: add preview/watch, and make version drift visible
- shader: persist iState across restarts
- clock: add a virtual shader clock so day-scale shaders are testable
- shader: stop comments and stray words from steering the pipeline
- shader: bump iCpuCores to 64
Packages
Pick the native package for your distro — each pulls in the right runtime deps.
Distro File Install Arch / Manjaro neowall-*-x86_64.pkg.tar.zstsudo pacman -U <file>Debian / Mint neowall_*_amd64.debsudo apt install ./<file>Ubuntu 24.04+ neowall_*-ubuntu24.04_amd64.debsudo apt install ./<file>Fedora / RHEL neowall-*.fc.x86_64.rpmsudo dnf install ./<file>openSUSE neowall-*.suse.x86_64.rpmsudo zypper install ./<file>Any (universal) neowall-*-x86_64.AppImagechmod +x <file> && ./<file>Plain binaries (no package manager)
File Build neowall-linux-x86_64-arch.tar.gzglibc (Arch) neowall-linux-x86_64-debian.tar.gzglibc (Debian bookworm) neowall-linux-x86_64-fedora.tar.gzglibc (Fedora) neowall-0.7.0-source.tar.gzsource tar -xzf neowall-linux-x86_64-*.tar.gz sudo install -m755 neowall /usr/local/bin/Arch (AUR, tracks git)
yay -S neowall-gitFrom source
tar -xzf neowall-0.7.0-source.tar.gz cd neowall-0.7.0 meson setup build --buildtype=release ninja -C build sudo ninja -C build installRequirements
- OpenGL 3.3+ capable GPU
- Wayland compositor with layer-shell (Hyprland, Sway, River, …) or X11
Verify downloads against
SHA256SUMS.txt. - v0.6.1NeoWall v0.6.12026-09-05 · 2026-09-05 17:10 UTC
查看更新说明
NeoWall 0.6.1
GPU-accelerated live shader wallpapers for Wayland & X11.
Changes
- release: neowall 0.6.1
- tests: add a GCC-compatible driver for the libFuzzer harnesses
- image: fix center-pad heap overflow and modes never reaching exact size
- chore: add flake.lock
- ci: distinguish AUR outage from a rejected key; fix freshness dedup
Packages
Pick the native package for your distro — each pulls in the right runtime deps.
Distro File Install Arch / Manjaro neowall-*-x86_64.pkg.tar.zstsudo pacman -U <file>Debian / Mint neowall_*_amd64.debsudo apt install ./<file>Ubuntu 24.04+ neowall_*-ubuntu24.04_amd64.debsudo apt install ./<file>Fedora / RHEL neowall-*.fc.x86_64.rpmsudo dnf install ./<file>openSUSE neowall-*.suse.x86_64.rpmsudo zypper install ./<file>Any (universal) neowall-*-x86_64.AppImagechmod +x <file> && ./<file>Plain binaries (no package manager)
File Build neowall-linux-x86_64-arch.tar.gzglibc (Arch) neowall-linux-x86_64-debian.tar.gzglibc (Debian bookworm) neowall-linux-x86_64-fedora.tar.gzglibc (Fedora) neowall-0.6.1-source.tar.gzsource tar -xzf neowall-linux-x86_64-*.tar.gz sudo install -m755 neowall /usr/local/bin/Arch (AUR, tracks git)
yay -S neowall-gitFrom source
tar -xzf neowall-0.6.1-source.tar.gz cd neowall-0.6.1 meson setup build --buildtype=release ninja -C build sudo ninja -C build installRequirements
- OpenGL 3.3+ capable GPU
- Wayland compositor with layer-shell (Hyprland, Sway, River, …) or X11
Verify downloads against
SHA256SUMS.txt.
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Paste a Shadertoy shader into a file, point neowall at it, get an animated desktop. Wayland + X11, multi-monitor, single static binary, no daemon-in-Python anywhere.
neowall
It pauses itself the moment a window covers the wallpaper, so it isn't burning your battery while you actually use the computer.
Install
# Arch (AUR)
yay -S neowall-bin # prebuilt, tracks each release
yay -S neowall-git # builds from git
# Prebuilt binary
# https://github.com/1ay1/neowall/releases/latest
tar -xzf neowall-linux-x86_64-*.tar.gz
sudo install -m755 neowall /usr/local/bin/
# From source
git clone https://github.com/1ay1/neowall && cd neowall
meson setup build && ninja -C build
sudo ninja -C build install
# Debian/Ubuntu
sudo apt install build-essential meson ninja-build libwayland-dev libwayland-bin \
libgles2-mesa-dev libpng-dev libjpeg-dev wayland-protocols \
libx11-dev libxrandr-dev libxkbcommon-dev
# Arch
sudo pacman -S base-devel meson ninja wayland mesa libpng libjpeg-turbo \
wayland-protocols libx11 libxrandr libxkbcommon
# Fedora
sudo dnf install gcc meson ninja-build wayland-devel mesa-libGLES-devel \
libpng-devel libjpeg-turbo-devel wayland-protocols-devel \
libX11-devel libXrandr-devel libxkbcommon-devel
libxkbcommon is optional at build time, but without it the terminal
wallpaper compiles fine and then silently has no keyboard input — install it.
Config
~/.config/neowall/config.vibe
default {
shader garden.glsl
shader_speed 0.8
}
Image slideshow:
default {
path ~/Pictures/Wallpapers/
duration 300
transition glitch
}
Per-output:
output {
DP-1 { shader moon_ocean.glsl }
HDMI-A-1 { path ~/Pictures/ duration 600 }
}
Full reference: config/docs/CONFIG.md.
Commands
neowall # start
neowall kill # stop
neowall reload # re-read the config (a broken file is refused, the old one stays)
neowall next # next wallpaper / shader
neowall pause # pause cycling
neowall resume
neowall pause-shader # freeze the shader animation in place
neowall resume-shader # resume a frozen shader animation
neowall list # show queue
neowall set 3 # jump to index
neowall current # print what's playing, and which binary the daemon runs
neowall set-terminal "btop" # swap the live terminal-wallpaper command
Writing a shader:
neowall new aurora # scaffold a working shader and tell you how to run it
neowall new hud --template=reactive # or: scene (default), flat, reactive
neowall watch aurora # live-reload as you edit; errors as file:line + "did you mean"
neowall preview aurora # run it once, without touching your wallpaper
neowall import export.json # bring in a Shadertoy shader (all passes, cube maps, bindings)
neowall docs fbm # look up a built-in helper or uniform
Shaders
About 20 in the box, all freely licensed. Bring your own: neowall accepts unmodified Shadertoy GLSL. Drop a .glsl file into ~/.config/neowall/shaders/ and reference it from your config.
| Vibe | A few |
|---|---|
| Living | garden · circadian_sky · living_aurora |
| Nature | moon_ocean · rain_window · fireflies |
| Reactive | audio_pulse · audio_bars · system_deck |
| Desktop-aware | window_light · window_forge · mouse_ripples |
| Abstract | plasma_touch · neon_city · time |
| Space | star_next · starfield_warp |
More community ports whose licenses don't allow redistribution live in
contrib/shaders-unlicensed/; they're not
installed, but copy any of them into ~/.config/neowall/shaders/ for
personal use.
Pair it with GLEditor for a live-preview shader workflow that one-clicks into neowall.
Reactive shaders — a living desktop
neowall is a superset of Shadertoy: on top of full compatibility it feeds
shaders live data from your machine and ships a GLSL std-lib (noise, SDFs,
palettes, tonemap) injected automatically — no #include. Shaders can react to
system audio (FFT), CPU/RAM/network load, battery, the real time of day, and
your mouse/keyboard. See docs/REACTIVE_SHADERS.md.
| Shader | Reacts to |
|---|---|
audio_pulse · audio_bars | system audio — spectrum, bass, beats |
mouse_ripples | water ripples from your cursor (click = splash) |
plasma_touch | plasma you push around with the mouse |
fireflies | a swarm that gathers at your pointer, flares on beat |
starfield_warp | warp speed scales with mouse motion + audio |
system_monitor | CPU heat, RAM tide, network pulses, battery |
system_deck | a command-deck HUD: CPU/RAM gauges, scrolling history graph, per-core meters, net traces, battery, clock |
rain_window | rain on glass — heavier with network, lightning on beat |
circadian_sky | a sky synced to your real clock: dawn → noon → dusk → stars |
Drop a .neowall sidecar next to any shader for explicit channel bindings and
custom reactive uniforms (e.g. uniform uGlow audio_bass). Audio capture uses
parec (PipeWire/PulseAudio) and degrades to silence if it's not installed. It
records your speaker output (the default sink's monitor), never the
microphone, and only starts when the loaded shader actually reads audio.
Changing what feeds iChannel0..3 (audio, noise, self-feedback, another
buffer, a texture, a bitmap font atlas): a bare .glsl guesses via a heuristic;
a .neowall sidecar lets you bind each channel explicitly — channel0 audio,
channel1 self, channel2 font, etc.
See docs/REACTIVE_SHADERS.md.
Window-aware shaders. On Hyprland a shader can see your windows:
iWindows[] / iWindowCount give their rects and iFocusedWindow the
fullscreen one, so the wallpaper can glow around them, light them, or grow
around them. window_forge shows it off. Elsewhere iWindowCount is 0.
Terminal as wallpaper
Any terminal program can be the wallpaper. neowall ships its own in-tree,
dependency-free VT/xterm-class terminal emulator (real PTY, spec-correct
ANSI/DEC parser, cell grid with SGR truecolour, scroll regions, the alternate
screen, mouse reporting and colour emoji) and renders its cell grid on the GPU —
so btop, htop, cava, vim or a scrolling journalctl -f run live behind
your windows.
default {
terminal btop
term_cols 0 # 0 = auto-fit the whole display
term_rows 0
}
default {
terminal "journalctl -f"
term_font_size 16
term_shader crt.glsl # optional: pipe the terminal through a CRT/glow pass
}
It's a real terminal, not a screenshot: it answers the startup handshake (cursor-position report, Device Attributes) so probing TUIs enter their render loop and animate, forwards the pointer when the app enables mouse reporting, and auto-restarts the command if it exits. No libvterm, no external terminal — every byte of the parser and screen model is in-tree, in the same spirit as neowall's hand-rolled event loop and config parser.
Full key reference (term_font, term_font_size, term_fg/term_bg,
term_cwd, term_env, term_shader, …) is in
config/docs/CONFIG.md.
An idle terminal costs nothing: when the child stops printing and the effects settle, neowall stops drawing it until the next byte arrives.
How it works
Single C binary. One loop thread runs a small Elm-style runtime: signals, the compositor socket, the control socket, timers and worker threads all become messages folded into one model, and frames are drawn after each step that changed something. Sensor sampling, audio capture and terminal PTYs run on their own threads and only hand data over. Rendering goes through EGL → OpenGL 3.3 core.
config.vibe → runtime loop ─┬─→ EGL / OpenGL 3.3
├─→ Wayland (layer-shell)
└─→ X11 (root window + EWMH)
Smooth by construction:
- Each monitor is paced by its own frame callback, so a slow one can't stall the rest.
- On Wayland
iTimeis stamped with the vblank each frame is shown at, so animation moves exactly one refresh per refresh. iTimeresets before float32 gets coarse, behind a cross-fade if the wallpaper never goes hidden, so a wallpaper that runs for weeks stays as smooth as on day one.- Every pass renders at full resolution; neowall never quietly scales your shader down.
More in docs/ARCHITECTURE.md and
docs/PERFORMANCE.md.
Smart pause is the main thing that separates neowall from the obvious one-evening hack:
- Wayland:
wl_surface.framewatchdog +wlr-foreign-toplevelstate bits, plus a Hyprland-specific IPC path that handles the awkward "tiled mosaic of small windows covers the wallpaper" case - X11: EWMH
_NET_WM_STATE_FULLSCREENon every output
Result: while a fullscreen game, a maximized browser, or a wall of tiled terminals is covering the screen, neowall draws zero frames. The moment you switch workspaces, it picks back up.
Compared to
| neowall | swww | mpvpaper | hyprpaper | |
|---|---|---|---|---|
| Animated GLSL shaders | ✓ | – | – | – |
| Drop-in Shadertoy support | ✓ | – | – | – |
| Terminal / TUI as wallpaper | ✓ | – | – | – |
| Image slideshow | ✓ | ✓ | – | ✓ |
| Video | – | gifs only | ✓ | – |
| Wayland | ✓ | ✓ | ✓ | ✓ |
| X11 | ✓ | – | – | – |
| Pauses when occluded | ✓ | – | – | – |
If you want video wallpapers, use mpvpaper — neowall is deliberately not that.
Caveats, honestly
- KDE Plasma: native desktop icons may hide while neowall owns the background layer. Use a dock or
plasma-desktop's widgets. - GNOME/Mutter and other compositors without layer-shell: unsupported. Wayland does not allow a client to map a visible wallpaper from a bare
wl_surface; neowall exits with an actionable error instead of silently selecting a non-visible fallback. - No video: by design.
Hacking
meson setup build --buildtype=debug
ninja -C build
./build/neowall -f -v
Run the test suite (headless, no display server needed) with
meson test -C build. For the memory-safety and concurrency gates use a
sanitized build, the same as CI:
meson setup build-asan -Db_sanitize=address,undefined && meson test -C build-asan
meson setup build-tsan -Db_sanitize=thread -Db_lundef=false && \
meson test -C build-tsan output_refcount foundation runtime terminal_wake ipc child_signals
Docs:
config/docs/CONFIG.md | every config key, daemon commands |
docs/SHADER_NOTES.md | writing shaders: stdlib, scene kit, manifests, workflow |
docs/REACTIVE_SHADERS.md | every reactive uniform, audio, manifests |
docs/PERFORMANCE.md | what costs what, and what to do about it |
docs/ARCHITECTURE.md | layout, threading, locks, conventions |
docs/architecture/RUNTIME.md | the event loop and its rules |
docs/architecture/MODERN_C.md | where the C architecture is headed, and why |
docs/MULTI_MONITOR_SYNC.md | spanning one scene across monitors |
docs/PACKAGING.md | distro packaging and releases |
Shaders, bug reports, and compositor coverage PRs are all welcome. Issue tracker is the place.
License
MIT.