A modern wallpaper tool with Gnome dynamic wallpaper support. https://enkei.spacesnek.rocks
Go to file
Johannes Wünsche 3440cb50d1
Let sleep watchdog run indefinitely
2022-03-09 19:29:29 +01:00
.github Add FUNDING.yml 2022-01-30 19:25:57 +01:00
config Add systemd service file 2022-01-29 22:53:43 +01:00
data Add gif to README gitea & github renderer 2022-02-20 20:46:46 +01:00
pkgs Update PKGBUILD 2022-02-24 22:18:10 +01:00
scripts Add scripts 2022-02-20 21:10:08 +01:00
src Let sleep watchdog run indefinitely 2022-03-09 19:29:29 +01:00
.gitignore Initial Commit 2022-01-28 17:55:53 +01:00
COPYING Add License 2022-01-29 23:18:18 +01:00
Cargo.lock Bump version to v0.9.3 2022-02-23 17:52:06 +01:00
Cargo.toml Bump version to v0.9.3 2022-02-23 17:52:06 +01:00
README.md Add note about gifski in README 2022-02-23 00:06:43 +01:00



Donate using Liberapay

enkei is a wallpaper tool created to allow displaying dynamic wallpapers based on the specification format used for example in the Gnome desktop environment. It is designed to offer a smooth transition between wallpapers and gradual change over long and short periods of time. For a fast handling enkei uses OpenGL to render images and blending them for transitions.

Writing a wallpaper tool is nothing new so there are other projects which are similar. There are already solutions for animating GIFs, videos, timed, and static wallpapers in Wayland. But the use cases were quite different from what I wanted or I wasn't happy with their handling of animations, so I started writing enkei.

A video showing enkei running on my laptop.

gif created with gifski


  • Show static wallpapers
  • Show dynamic wallpapers
  • Scale images to fill and fit
  • Filter images after scaling to improve visuals
  • Change wallpaper on-the-fly with enkeictl
  • Support most common image formats (PNG, JPEG, WEBP, BMP,...)

Under the hood we use image and webp which provide the most common image types.

Compositor Requirements

This tool can generally be used with all compositor implementing the core protocols and the following protocols:

These are most of the time wlroots based compositors for example:

and many more; check an incomplete list here: https://github.com/solarkraft/awesome-wlroots#compositors


flag purpose/variants
-f Filter Methods (Fast, Good, Best) [default: Good]
-m Display Mode (Dynamic, Static) [default: Autodetect]
-s Scale (Fill, Fit, None) [default: Fill]

enkei and enkeictl share these options. Specifying options in enkeictl will overwrite them in the running enkei instance.


Available Packages

Fedora, OpenSuse and CentOS

Prebuilt images are currently only available for Fedora 34/35/rawhide, OpenSuse Tumbleweed and Centos-stream 9 via copr.

Add the copr to your system and install enkei with:

# dnf copr enable jwuensche/wayland-tools 
# dnf install enkei


Self-build packages are available for archlinux

$ cd pkgs/archlinux
$ makepkg -i


Patches for packaging of any other distribution are welcome, and will be merged gladly.


If no packages are available for your distribution, you want to manually install, or develop on enkei you can build it yourself locally with the following steps.


You'll need the following dependencies to build this project.


These are the package names on Fedora, for your favorite distribution they might differ.

Building the project

To build the project then clone it and from within the cloned directory:

$ cargo build

Installing from Local Build

You can either install enkei via cargo, to your $CARGO_BIN directory

$ cargo install --path .

or to any other arbitrary directory in your $PATH e.g. /usr/local/bin

$ ./scripts/install.sh --prefix "/usr/local/bin"

By default the install.sh script uses /usr/bin

Using as a systemd-service

Under config/enkei.service an example service can be found to run sway as a systemd service. How to run wayland specific daemons in systemd is well described in the ArchWiki though the article is sway specific this approach can be used in plenitude of scenarios.

Feature Ideas

  • Individual wallpapers on different displays

    The base functionality for this is already present, as each output is treated individually. But logic and interface is missing to realize this.