Features and status
What is supported, experimental, planned or not supported, feature by feature.
Copied from README.md in veil’s repositoryView on GitHub (opens in a new tab)
Supported means: implemented, covered by automated tests, and checked in a compositor (so far a headless sway, see the status above). Experimental means that it works, with a limit you should know about, or that it has not been checked where it matters. Planned features come after 1.0.
| Feature | Status | Notes |
|---|---|---|
Pictures: PNG, JPEG, WebP, BMP, TIFF, GIF and the other formats of the image (opens in a new tab) crate | Supported | Drawn at the monitor's physical resolution, then the decoded copy is freed. Pictures over 16384 pixels per side, or that would need more than 512 MiB, are refused. |
| Videos, looped, without audio | Supported | Any format the installed GStreamer plugins play. Checked: H.264, HEVC, VP8, VP9 and AV1, and ten containers (MP4, WebM, Matroska, QuickTime, AVI, Ogg, ...). |
Scaling: fill, fit, stretch, center, tile, and a background colour | Supported | For pictures and videos (tile acts as center for a video). |
| HiDPI and fractional scaling | Supported | Checked pixel by pixel at scales 1, 1.25, 1.5 and 2. |
| Every monitor, or the ones you name; a wallpaper per monitor; monitors plugged in later | Supported | With pictures. With a video, see the next row. |
| Monitor changes while a video plays | Experimental | A change of any monitor (plugged in, unplugged, rescaled, powered on) crashes the daemon inside GStreamer (known issue 1). Under the systemd unit it is back with its wallpapers in about three seconds. |
veil set, clear, pause, resume, toggle, status, outputs (also as JSON), quit, ping | Supported | Stable exit statuses. A control socket for scripts and status bars (docs/ipc.md). |
| A new wallpaper replaces the old one only once it is ready | Supported | A video takes over when its first frame is on screen; a file that cannot be shown leaves the old wallpaper alone. |
| Wallpapers saved and shown again after a restart | Supported | Per monitor, in ~/.local/state/veil/state.json. |
| Configuration file | Supported | ~/.config/veil/config.toml (docs/configuration.md). |
| systemd user unit | Supported | Ready once every monitor shows its wallpaper, restarted after a crash, a watchdog. |
| Pause a video behind a fullscreen window (or windows that cover it) | Supported on sway, experimental on Hyprland | Read from the compositor's IPC. On Hyprland 0.56.2 a fullscreen window paused its output and closing it played the video again (2026-10-20); with --pause-on covered and other cases it was checked against a fake Hyprland only. |
| Stop a video while the screen is locked or the monitor is off | Supported on sway, experimental elsewhere | Works on any compositor that stops taking the video's frames, as sway does; not checked on Hyprland (lock and DPMS). The video starts again from its beginning. |
| Hardware video decoding | Experimental | NVIDIA (nvcodec) decodes on the GPU, but every frame is converted to RGB on the CPU (known issue 7). Intel and AMD (VA-API) should avoid that conversion; not checked yet. Software decoding always works. |
| Animated GIFs | Supported | Played as videos; needs GStreamer's libav plugins. |
| Hyprland | Experimental | veil's main target. Images, video on two monitors and the automatic pause ran on Hyprland 0.56.2 (2026-10-20); smoothness, scales, lock, power-off and crash recovery were not checked there. |
| Other compositors with layer-shell (river, niri, Wayfire, labwc, KDE Plasma) | Experimental | Should work; nobody has reported yet. No pause behind windows there (the lock and power-off stop still applies). |
| Shell completions (bash, zsh, fish, nushell) and man pages | Supported | Generated by the binary itself. |
| Nix flake and package | Supported | The package brings its GStreamer plugins. |
| Prebuilt binaries for x86_64 and aarch64 Linux | Experimental | See Prebuilt binaries; published with each release. The x86_64 tarball ran on Debian 12 and 13, Ubuntu 22.04 and 24.04, Fedora 44 and Arch; aarch64 was not run. With GStreamer before 1.26, animated GIFs do not play (known issue 8). |
| GNOME, X11 | No | GNOME has no layer-shell. |
| HEIF/HEIC, AVIF, JPEG XL; animated WebP and PNG | No | Refused with the reason; an animated WebP or PNG shows its first frame. |
| Audio, frame-rate cap, playback speed, loop points | Planned | After 1.0. |
| Playlists, directory rotation, transitions | Planned | After 1.0. veil set from a script or a timer works today. |
| Pause when idle or on battery; pause behind windows on niri and river | Planned | After 1.0. |
NixOS and home-manager modules, AUR, .deb and .rpm packages | Planned | After 1.0. |