back

Wall-E

A terminal-first wallpaper manager with smart sources, background scheduling, and history tracking.

Rust
Wall-E preview

Overview

Wall-E is a Rust CLI tool that changes your wallpaper from multiple sources — local folders, GitHub repos, direct image URLs, or the Wallhaven API — with a single command from any terminal.

It supports background scheduling so wallpapers rotate automatically without keeping a terminal open, and tracks history and favourites across sessions using a local JSON store.

Problem

Wallpaper managers are almost universally GUI-only, making them impossible to automate, script, or use in minimal setups.

There was no single tool that could pull wallpapers from multiple sources — local, remote, and API-driven — while running silently in the background across Windows, macOS, and Linux.

Goal: Build a single cross-platform CLI binary that handles wallpaper sourcing, scheduling, and management entirely from the terminal with zero manual setup after first run.

Constraints

True cross-platform support

Windows, macOS, and Linux each handle wallpaper setting differently. The wallpaper crate was used to abstract this, but Windows additionally required absolute paths and specific process creation flags for background spawning.

Background process without a runtime

Auto-rotation needed to survive terminal closure. Rather than requiring a system service, Wall-E spawns a detached child process of itself using OS-specific flags, saves the PID, and exposes --stop and --status commands to manage it.

Multiple remote sources with no auth

Wallhaven required no API key for SFW content but needed careful URL construction. GitHub's API required a User-Agent header and a custom URL transformation from web URLs to API endpoints, including subfolder support.

Config that works from any directory

Since walle is invoked from anywhere in the terminal, the config needed to live at a fixed path (~/.config/walle/walle.toml) with CLI flags always taking priority over stored values.

Key Decisions

Rust for zero-cost startup and cross-platform reach

Rust compiles to a single native binary with near-instant startup — important for a tool invoked frequently. The ecosystem's crates (clap, reqwest, serde, wallpaper) covered every requirement without pulling in a heavy runtime.

Daemon pattern over system schedulers

Rather than requiring users to configure Task Scheduler or cron, Wall-E spawns itself as a detached background process with --daemon, making auto-rotation a single flag rather than a multi-step system configuration.

Setup wizard on first run

Instead of requiring users to hand-write a config file, Wall-E detects a missing config and runs an interactive wizard that writes ~/.config/walle/walle.toml automatically — covering source, mode, interval, and no-repeat preference.

History and favourites as a local JSON store

Every wallpaper set is logged to history.json with its source and timestamp. This powers the --history and --favourites commands and the no-repeat shuffle mode, which tracks seen wallpapers and resets the cycle when all have been shown.

Results

Takeaways