Roadmap
What is left before 1.0, and what comes after it.
Copied from docs/roadmap.md in veil’s repositoryView on GitHub (opens in a new tab)
What is left before veil 1.0, and what is deliberately left for after it. Everything in the feature table of the README is implemented and tested; what remains before the release is checking by hand where no test can, and publishing.
What 1.0 is: a wallpaper daemon that the user changes by hand (veil set and the other commands, a configuration file), that survives restarts and recovers from the GStreamer crash of known issue 1 by itself, whose resource claims are measured (measurements.md), and that is packaged for Nix and as release binaries. Video plays without audio.
The beta (1.0.0-beta.1)#
The first public release, 1.0.0-beta.1 (published on 2026-11-04), is a beta, and it relaxes the 1.0 checklist below. Required, and done: the release workflow run on the release tag itself. Not required, and said to be untested in the support matrix instead: the full checklist of manual-tests.md (opens in a new tab), "In a real Hyprland session" (only part of it was run, see below), the 24-hour soak, a run on ARM, Intel and AMD graphics, other distributions and compositors. The beta is free and source-available (LICENSE), takes no issues or pull requests (reports go to GitHub Discussions), and is distributed as the release tarballs, the Nix flake and, after the release, an AUR veil-bin package.
Before 1.0#
Checks in a real Hyprland session#
Almost everything was checked in a headless sway; on Hyprland 0.56.2 only images, a video on two monitors and the pause behind a fullscreen window were run (2026-10-20). The checklist is in manual-tests.md (opens in a new tab), "In a real Hyprland session": the pause behind fullscreen windows, the lock screen and DPMS, whether a video in fill stands still at every loop (known issue 5), whether it plays smoothly (known issue 6), the systemd unit, crash recovery, logout, completions, and the Hyprland row of the compatibility table in troubleshooting.md. A problem found there is fixed, or recorded as a known issue, before the release.
The release workflow#
.github/workflows/release.yml ran on GitHub for the tag v1.0.0-beta.1 (2026-11-04) and published the release as a pre-release with the x86_64 and aarch64 tarballs and SHA256SUMS (see manual-tests.md (opens in a new tab), "The release tarball", for what was checked locally before). Before 1.0:
- Run the aarch64 tarball on an ARM machine with a compositor: nothing has shown a picture or a video with it yet.
- Confirm or change the decision of known issue 8 (animated GIFs and frame drops with the GStreamer of Debian 12 and Ubuntu 22.04 and 24.04: documented, not worked around).
Release checklist#
All of these must be true for 1.0:
- CI green on
main:cargo fmt --check, clippy with-D warnings,cargo test,nix build,cargo deny check, the MSRV build, and the release build. - A crash recovers by itself: under the systemd unit the daemon comes back with its saved wallpaper (known issue 1, option D).
- Soak: flat resident memory, threads and descriptors over 24 hours of a looping video and over 500 wallpaper switches (
scripts/bench/soak.sh loop --duration 86400, once with the hardware decoder and once withGST_PLUGIN_FEATURE_RANK=nvh264dec:0, which crept for its first minutes;scripts/bench/soak.sh switch; both with the shippedMALLOC_ARENA_MAX=1). - Idle: 0.0 % CPU for static images and for fully covered or paused video.
- Verified on at least Hyprland and one other wlroots compositor, on Intel, AMD and NVIDIA graphics (or the unsupported ones are documented).
- Every example in the documents executes as written.
- No
unwrap()in production paths and everyunsafedocumented (the lints inCargo.tomlenforce it; confirm that nothing has silenced them). - A security review of the control socket (
SECURITY.md). CODE_OF_CONDUCT.mdnames the GitHub account of the maintainer as its contact, private vulnerability reporting is turned on for the repository, and Discussions has its "Reports" category (seemanual-tests.md(opens in a new tab), "Governance files").CHANGELOG.mdand the version inCargo.tomlandflake.nixare bumped.
Open decisions#
- Known issue 1: whether to report the
waylandsinkcrash upstream after all. Not blocking. - Other distributions and compositors: veil is developed on NixOS and Hyprland, at the maintainer's own pace. Another system is looked at when people who use it show interest, not ahead of time (Discussions, "Reports" (opens in a new tab)).
- The crate name:
veilis taken on crates.io; decided on 2026-10-19 not to publish there for 1.0.
After 1.0#
Not started before the release. None of these is needed to change wallpapers by hand, and waiting locks nothing in: the state file has a version, the configuration file has no keys for features that do not exist, and new IPC commands are additive.
- Playback options: audio (muted today; with one pipeline per output it first needs a decision on which output plays the sound), a frame-rate cap (
videoratedrops frames after they are decoded, so whether it saves anything is a question for the measurements), playback speed, loop points, a decoder preference. Forcing software decoding already works throughGST_PLUGIN_FEATURE_RANK(troubleshooting.md). - Playlists and rotation:
veil set <dir> --interval 30m [--shuffle],next/prev, on acallooptimer and not a thread. Rotation can be scripted withveil setmeanwhile. - Transitions: an optional fade between images. The two-engine hand-over of
RenderStateis what a fade would build on, and it would have to be redone ifwaylandsinkis replaced. - More compositor backends and triggers: the niri and river backends (sway and Hyprland exist), and pausing when the session is idle or on battery.
- Replacing
waylandsink: a sink of veil's own would remove known issues 1 and 2, the conversion cost of known issue 7 on NVIDIA, and the wake-ups measured inmeasurements.md. Large. - A frame-callback loop at the video's frame rate instead of the display's (known issue 6): not tried.
- Packaging: NixOS and home-manager modules (
programs.veil.enable,settingsrendered to TOML), AUR,.deband.rpmpackages. Flatpak is out of scope: it cannot reach the compositor's IPC socket by default. - Dependency hygiene: fewer
notify-rustfeatures or a direct call toorg.freedesktop.Notifications; upgrades ofgstreamer(0.22),thiserror(1 to 2) andsmithay-client-toolkit, which remove the exceptions indeny.toml; theimagefeatures veil does not use (the default features build an AV1 encoder and the OpenEXR codec); Dependabot or Renovate. - Tests and documentation: fuzzing (
cargo-fuzzfor the IPC request parser, the configuration parser, the Hyprland event parser andengine::media::sniff;proptestfor the scaling geometry), a comparison withmpvpaperandswwwon the same clips and hardware (docs/benchmarks.md), rustdoc for the public traits and#![warn(missing_docs)]. - Diagnostics:
--log-level,--log-format {pretty,json}, andveil doctor(Wayland globals, GStreamer plugins, VA-API, socket permissions, configuration). - After the release: a label scheme for bug triage, a release cadence (patch releases for fixes), a deprecation policy for the
--daemonalias, and the compatibility reports of users.