A minimal wallpaper application for Linux desktops, inspired by Damask, written in Rust with GTK 4 and libadwaita.
Valhalla picks wallpapers from online sources and — most importantly — always matches them to your desktop's light/dark preference, so dark mode never gets a blinding white wallpaper.
- Theme-aware selection: wallpapers are analyzed (average brightness) and matched against the desktop color scheme; selection re-runs immediately when you switch light/dark mode
- Sources: Wallhaven and Unsplash
- Filters: tags, categories, purity (SFW/sketchy/NSFW), resolution, aspect ratio, sorting
- API keys stored in the GNOME Keyring (required for NSFW on Wallhaven and for any Unsplash usage)
- Automatic refresh on an interval, on theme change, or manually
- Runs everywhere the XDG desktop portal does (GNOME, KDE, ...), with a
direct GSettings fallback on GNOME; sets
picture-uriandpicture-uri-darkindependently so a manual theme flip never shows a mismatched wallpaper - Headless daemon (
valhalla --daemon) for refreshing without a window, with an opt-in "Start at login" switch (XDG autostart entry)
Development happens in a distrobox/toolbox container (or any distro with the GNOME stack):
distrobox enter valhalla
cd ~/Projects/valhalla
cargo build --releaseRequirements (Fedora, run inside the container):
sudo dnf install -y rust cargo rustfmt clippy gcc pkgconf-pkg-config \
gtk4-devel libadwaita-devel libsecret-devel glib2-devel blueprint-compiler gitThe app is distributed through a self-hosted Flatpak repository: every
release is built automatically in CI from
flatpak/io.github.tunix.valhalla.json
on the GNOME 49 runtime and published (GPG-signed) to the tunix remote.
Install (recommended): add the remote once, then install like any
Flathub app. Future updates arrive via flatpak update.
flatpak remote-add --if-not-exists tunix \
https://alperkan.at/flatpak/tunix.flatpakrepo
flatpak install tunix io.github.tunix.valhallaOr the single-command version, which adds the remote and installs in one step via the signed ref file:
flatpak install \
https://alperkan.at/flatpak/io.github.tunix.valhalla.flatpakrefOffline / airgapped: every release also ships ready-to-install
.flatpak bundles (x86_64 and aarch64). Grab one from the
releases page and install:
flatpak install ./valhalla-<tag>-x86_64.flatpakThe bundle references its runtime, so the GNOME 49 platform is pulled
from Flathub automatically on first install. Note that bundles are
frozen at their tag: they do not receive updates through
flatpak update — switch to the remote install above for updates.
To build the bundle locally instead:
# regenerate the vendored-crate source list from Cargo.lock
python3 flatpak/flatpak-cargo-generator.py Cargo.lock \
-o flatpak/generated-sources.json
# build (offers to install the GNOME 49 Sdk and the rust-stable
# extension on first run)
flatpak-builder --force-clean --user --default-branch=stable \
--repo=flatpak-repo flatpak-build flatpak/io.github.tunix.valhalla.json
# optional: single-file bundle to share or install
flatpak build-bundle \
--runtime-repo=https://flathub.org/repo/flathub.flatpakrepo \
flatpak-repo valhalla.flatpak io.github.tunix.valhalla stable
flatpak install ./valhalla.flatpakA Flathub submission is planned on top of the same manifest.
cargo run # GUI
cargo run -- --daemon # headless wallpaper refresh serviceTo refresh at boot/login without the window, enable Start at login in
Preferences — Valhalla writes a desktop autostart entry that launches
valhalla --daemon. The entry also shows up in the desktop's own
"Startup Applications" list, so it can be toggled off from either side.
Stored in GSettings (gsettings list-recursively io.github.tunix.valhalla),
API keys in the Secret Service (GNOME Keyring).
GPL-3.0

