neowall

1ay1活跃维护

用 GLSL 着色器在 Linux 上跑 GPU 加速的动态壁纸引擎,兼容 Wayland 和 X11,支持多显示器。

GPU-accelerated live wallpaper engine for Linux using GLSL shaders. Runs on Wayland and X11.

v0.8.0发布于 2026-10-26 13:24 UTC269star16fork同步于 2026-11-10 18:03 UTC

怎么上手

由 README 提炼,执行前请确认
yay -S neowall-bin
硬件要求按 README 说明

README 未说明具体显存或 GPU 型号要求;渲染走 EGL → OpenGL 3.3 core,需支持 OpenGL 3.3 的 GPU 与驱动。

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

把 Shadertoy GLSL 着色器直接当 Linux 动态壁纸跑,支持 Wayland 和 X11

用 GLSL 着色器在 Linux 上跑 GPU 加速的动态壁纸引擎,兼容 Wayland 和 X11,支持多显示器。

核心能力

  • 直接加载未修改的 Shadertoy GLSL 着色器
  • 窗口遮挡时自动暂停渲染以省电
  • 内置约 20 个可自由分发的着色器
  • 着色器可读取音频 FFT、CPU/内存/网络等实时数据
  • 支持把 btop、htop 等终端程序渲染成壁纸

容易踩的坑

GNOME/Mutter 等无 layer-shell 的合成器不支持,会直接报错退出;KDE Plasma 下原生桌面图标可能被壁纸层遮住;音频反应着色器依赖 parec(PipeWire/PulseAudio),未安装时静音降级;构建时缺 libxkbcommon 会导致终端壁纸无键盘输入。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v0.8.0
  1. 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 new so 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.

    DistroFileInstall
    Arch / Manjaroneowall-*-x86_64.pkg.tar.zstsudo pacman -U <file>
    Debian / Mintneowall_*_amd64.debsudo apt install ./<file>
    Ubuntu 24.04+neowall_*-ubuntu24.04_amd64.debsudo apt install ./<file>
    Fedora / RHELneowall-*.fc.x86_64.rpmsudo dnf install ./<file>
    openSUSEneowall-*.suse.x86_64.rpmsudo zypper install ./<file>
    Any (universal)neowall-*-x86_64.AppImagechmod +x <file> && ./<file>

    Plain binaries (no package manager)

    FileBuild
    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-git
    
    From 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 install
    

    Requirements

    • OpenGL 3.3+ capable GPU
    • Wayland compositor with layer-shell (Hyprland, Sway, River, …) or X11

    Verify downloads against SHA256SUMS.txt.

  2. 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 parec so a wallpaper can react to whatever your speakers are playing. It was spawning it without a device argument, and with no device parec records 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 an iChannel bound to audio. Every other wallpaper spawns no parec at all.

    Verify it yourself

    Run pactl list source-outputs while neowall is running. On an affected build there is a parec stream 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.

    DistroFileInstall
    Arch / Manjaroneowall-*-x86_64.pkg.tar.zstsudo pacman -U <file>
    Debian / Mintneowall_*_amd64.debsudo apt install ./<file>
    Ubuntu 24.04+neowall_*-ubuntu24.04_amd64.debsudo apt install ./<file>
    Fedora / RHELneowall-*.fc.x86_64.rpmsudo dnf install ./<file>
    openSUSEneowall-*.suse.x86_64.rpmsudo zypper install ./<file>
    Any (universal)neowall-*-x86_64.AppImagechmod +x <file> && ./<file>

    Plain binaries (no package manager)

    FileBuild
    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-git
    
    From 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 install
    

    Requirements

    • OpenGL 3.3+ capable GPU
    • Wayland compositor with layer-shell (Hyprland, Sway, River, …) or X11

    Verify downloads against SHA256SUMS.txt.

  3. 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.

    DistroFileInstall
    Arch / Manjaroneowall-*-x86_64.pkg.tar.zstsudo pacman -U <file>
    Debian / Mintneowall_*_amd64.debsudo apt install ./<file>
    Ubuntu 24.04+neowall_*-ubuntu24.04_amd64.debsudo apt install ./<file>
    Fedora / RHELneowall-*.fc.x86_64.rpmsudo dnf install ./<file>
    openSUSEneowall-*.suse.x86_64.rpmsudo zypper install ./<file>
    Any (universal)neowall-*-x86_64.AppImagechmod +x <file> && ./<file>

    Plain binaries (no package manager)

    FileBuild
    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-git
    
    From 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 install
    

    Requirements

    • OpenGL 3.3+ capable GPU
    • Wayland compositor with layer-shell (Hyprland, Sway, River, …) or X11

    Verify downloads against SHA256SUMS.txt.

  4. 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.

    DistroFileInstall
    Arch / Manjaroneowall-*-x86_64.pkg.tar.zstsudo pacman -U <file>
    Debian / Mintneowall_*_amd64.debsudo apt install ./<file>
    Ubuntu 24.04+neowall_*-ubuntu24.04_amd64.debsudo apt install ./<file>
    Fedora / RHELneowall-*.fc.x86_64.rpmsudo dnf install ./<file>
    openSUSEneowall-*.suse.x86_64.rpmsudo zypper install ./<file>
    Any (universal)neowall-*-x86_64.AppImagechmod +x <file> && ./<file>

    Plain binaries (no package manager)

    FileBuild
    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-git
    
    From 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 install
    

    Requirements

    • OpenGL 3.3+ capable GPU
    • Wayland compositor with layer-shell (Hyprland, Sway, River, …) or X11

    Verify downloads against SHA256SUMS.txt.

  5. 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.

    DistroFileInstall
    Arch / Manjaroneowall-*-x86_64.pkg.tar.zstsudo pacman -U <file>
    Debian / Mintneowall_*_amd64.debsudo apt install ./<file>
    Ubuntu 24.04+neowall_*-ubuntu24.04_amd64.debsudo apt install ./<file>
    Fedora / RHELneowall-*.fc.x86_64.rpmsudo dnf install ./<file>
    openSUSEneowall-*.suse.x86_64.rpmsudo zypper install ./<file>
    Any (universal)neowall-*-x86_64.AppImagechmod +x <file> && ./<file>

    Plain binaries (no package manager)

    FileBuild
    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-git
    
    From 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 install
    

    Requirements

    • OpenGL 3.3+ capable GPU
    • Wayland compositor with layer-shell (Hyprland, Sway, River, …) or X11

    Verify downloads against SHA256SUMS.txt.

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    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.

    VibeA few
    Livinggarden · circadian_sky · living_aurora
    Naturemoon_ocean · rain_window · fireflies
    Reactiveaudio_pulse · audio_bars · system_deck
    Desktop-awarewindow_light · window_forge · mouse_ripples
    Abstractplasma_touch · neon_city · time
    Spacestar_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.

    ShaderReacts to
    audio_pulse · audio_barssystem audio — spectrum, bass, beats
    mouse_rippleswater ripples from your cursor (click = splash)
    plasma_touchplasma you push around with the mouse
    firefliesa swarm that gathers at your pointer, flares on beat
    starfield_warpwarp speed scales with mouse motion + audio
    system_monitorCPU heat, RAM tide, network pulses, battery
    system_decka command-deck HUD: CPU/RAM gauges, scrolling history graph, per-core meters, net traces, battery, clock
    rain_windowrain on glass — heavier with network, lightning on beat
    circadian_skya 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 iTime is stamped with the vblank each frame is shown at, so animation moves exactly one refresh per refresh.
    • iTime resets 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.frame watchdog + wlr-foreign-toplevel state 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_FULLSCREEN on 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

    neowallswwwmpvpaperhyprpaper
    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.mdevery config key, daemon commands
    docs/SHADER_NOTES.mdwriting shaders: stdlib, scene kit, manifests, workflow
    docs/REACTIVE_SHADERS.mdevery reactive uniform, audio, manifests
    docs/PERFORMANCE.mdwhat costs what, and what to do about it
    docs/ARCHITECTURE.mdlayout, threading, locks, conventions
    docs/architecture/RUNTIME.mdthe event loop and its rules
    docs/architecture/MODERN_C.mdwhere the C architecture is headed, and why
    docs/MULTI_MONITOR_SYNC.mdspanning one scene across monitors
    docs/PACKAGING.mddistro packaging and releases

    Shaders, bug reports, and compositor coverage PRs are all welcome. Issue tracker is the place.

    License

    MIT.