- Low-end first — Every component is optimized for minimal CPU and RAM usage
- Full-stack auto-theming — 25 Jinja2 templates propagate wallpaper colors to 20+ components
- Event-driven cache daemon — Wallpaper cache pre-generates in background so switching is instant
- Safe by design — Every theme generation backs up files and restores on failure
- No bloat — Every script and dependency earns its place
Any system that runs Hyprland. Optimized for low-end devices with 2-4GB RAM. The full desktop stack (Hyprland + waybar + swaync) idles under 300MB.
Arch Linux (including Arch-based), Fedora, Debian/Ubuntu, and NixOS. The installer auto-detects your distro.
Hyprland requires a GPU with basic Vulkan support. Most integrated GPUs from 2012+ work.
The installer supports Arch, Fedora, Debian/Ubuntu, and NixOS. For other distros:
- Install the packages manually (see Installation)
- Link the config files manually
No — use ./install.sh --with-deps to auto-install everything. Without the flag, only configs are linked.
The installer creates symlinks. Your existing configs won't be touched unless they share the same filename.
# Manually run theming
wallust run ~/.cache/current_wallpaper.png --config-dir ~/.config/wallust
~/.config/wallust/reload-theme.shSome images give poor color extraction. Try:
- Use a photo with more color variety
- Convert to PNG
- Manually adjust generated configs
The cache daemon has a 24-hour cooldown for problematic images.
If wallust run takes over 30 seconds or errors with "Not enough colors!", the kmeans backend is struggling with the image. bitzdots defaults to the much faster fastresize backend (seconds, not minutes).
# Verify the backend is set
grep backend ~/.config/wallust/wallust.toml # Should say "fastresize"
# Or force it for a one-off run
wallust run ~/Pictures/Wallpapers/image.jpg --config-dir ~/.config/wallust --backend fastresizebitzdots defaults to dark theme for all apps. If something isn't dark:
GTK apps:
# Check GTK settings
cat ~/.config/gtk-3.0/settings.ini
# Should contain:
# gtk-theme-name=Adwaita
# gtk-application-prefer-dark-theme=1
# gtk-icon-theme-name=Papirus-Dark
# Force GTK3/GTK4 dark mode
gsettings set org.gnome.desktop.interface color-scheme prefer-dark
gsettings set org.gnome.desktop.interface gtk-theme AdwaitaQt apps:
# Verify environment
echo $QT_QPA_PLATFORMTHEME # Should be "qt6ct"
# QT_STYLE_OVERRIDE must be UNSET (empty). If set, remove it:
unset QT_STYLE_OVERRIDE # and remove from hypr/variables.lua / environment.d
# Check qt5ct config
cat ~/.config/qt5ct/qt5ct.conf
# Should have: style=Breeze-Dark, icon_theme=Papirus-Dark
# Check qt6ct config (auto-generated by wallust)
cat ~/.config/qt6ct/qt6ct.conf
# Should have: style=Breeze-Dark, custom_palette=trueIf qt6ct warns "Please remove the QT_STYLE_OVERRIDE environment variable",
the variable is still set (commonly from an old session or hypr/variables.lua).
Unset it and log out/in (or restart the Hyprland session) to re-export env vars.
# Start it manually
waybar &
# Check for errors
journalctl --user -u waybar -fCheck the script runs independently:
~/.config/waybar/scripts/workspaces.shCommon issues:
- Script not executable:
chmod +x script.sh - Missing dependency: check the script's requirements
- Poll interval too long: reduce
intervalin config.jsonc
A media player must be running and exposing MPRIS controls:
- Spotify, Firefox (YouTube), VLC, etc.
- Check with
playerctl -l
The workspace script uses hyprctl workspaces -j. Verify:
hyprctl workspacesBoth Print and SUPER+SHIFT+S save to file AND copy to clipboard via wl-copy. If clipboard is empty:
- Ensure
wl-clipboardis installed - Try pasting with Ctrl+V or middle-click
Ensure wf-recorder is installed with pulse support:
# Arch
sudo pacman -S wf-recorder
# Check audio source
pactl list short sourcesCheck for common issues:
# Stale playerctl processes
pkill -f "playerctl metadata --follow"
# Check powerprofilesctl (should not be running — uses busctl instead)
pgrep powerprofilesctl
# View CPU by process
ps aux --sort=-%cpu | head -10# Check per-process memory
ps aux --sort=-%mem | head -15
# Common memory hogs
# - kitty: ~200MB per window (GPU-accelerated)
# - Browser: 200MB+ per process
# - swaync: ~85MB (album art caching)# Check polling intervals (see performance.md)
cat ~/.config/waybar/config.jsonc | grep interval
# Most common culprit: workspaces.sh at high frequency
# Current: 3s — increase to 5s or 10ssystemctl --user status wallust-cache-daemon.service
journalctl --user -u wallust-cache-daemon.service -fThe daemon runs at Nice=19 (lowest priority). If it uses CPU:
- It's actively processing wallpapers (normal during initial cache)
- After initial cache, it sleeps waiting for inotify events
- Check logs:
journalctl --user -u wallust-cache-daemon.service
Logs show failures:
journalctl --user -u wallust-cache-daemon.service | grep -i "fail\|error"Common causes:
- Image format not supported by wallust
- Image file is corrupted
- 24-hour cooldown active from previous failure
# Restart swaync
swaync-client --reload-css
swaync-client -R # Reload config
swaync-client -t # Toggle panel
# Or fully restart
pkill swaync && swaync &Ensure theme-generated.rasi exists:
ls -la ~/.config/rofi/theme-generated.rasi
# If missing, regenerate theme:
wallust run ~/.cache/current_wallpaper.png --config-dir ~/.config/wallustxdg-desktop-portal-hyprland can enter a CPU loop (90%+) in version 1.4.x. This is a known upstream issue.
# Fix: restart the portal service
systemctl --user restart xdg-desktop-portal-hyprlandThe install script does this automatically at the end of installation.
# Full theme refresh
wallust run ~/.cache/current_wallpaper.png --config-dir ~/.config/wallust
~/.config/wallust/reload-theme.sh
pkill -x waybar && waybar &Configs marked "DO NOT EDIT" are auto-generated by wallust on every theme change. To make permanent changes:
- Edit the Jinja2 templates in
~/.config/wallust/templates/ - Re-run wallust to apply
- See Customization