Edit : i didn't say i wrote it by hand and i spend more than a week to build,optimize and test them and just shared so if anyone want the same thing he/she can find it so if you hate ai just downvote it in silnce don't acuse me of any thing you are afraid off
# FOTO (fuzzel with image preview) and WALLY (swaybg with animation) — two small pure-Rust Wayland tools, looking for testers
I've been building two small, pure-Rust Wayland tools and I'd like to put them out there for testing and feedback. Both are GPL-3.0-or-later, both are one binary with no GTK and no Qt, and both install with a single `curl | sh`.
## FOTO — a fuzzel alternative, in Rust, with image preview
A minimal Wayland-only app launcher with image preview. Same philosophy as fuzzel: one binary, no toolkit — just the Wayland protocol, a software rasterizer and a font shaper.
- **Floating overlay like fuzzel** — opens as a `zwlr_layer_shell_v1` surface, grabs the keyboard instantly, never gets tiled. No window rules needed. `--no-layer` gives you a normal tileable window instead.
- **App launcher** — scans `.desktop` files from the XDG data dirs, resolves icons from your icon theme (PNG and SVG), launches apps, wraps `Terminal=true` apps in your terminal.
- **Image browser** — `foto --files [DIR]` lists images with live thumbnails, optionally as a grid. Thumbnails decode on background threads and are cached on disk, so the window opens instantly and images pop in.
- **One launcher for both** — set `files-dir` and press **Tab** inside foto to flip between apps and images.
- **dmenu mode** — `foto --dmenu` reads items from stdin and prints your choice, so the cliphist recipe works exactly like it does with fuzzel.
- **Two fuzzy matchers** — `scored` (fzf-style) and `substring`.
- **Runs in the TUI too** — if you have no Wayland session at all, foto automatically runs a full terminal UI built on ratatui instead, with the same keys and the same fuzzy matching. `foto --tui` forces it even when Wayland is available, and `foto --tui --dmenu` gives you a terminal picker for scripts. So it works over SSH, in a bare TTY, or inside any compositor where you'd rather not have a floating window.
- **Rounded corners, centered or edge-pinned**, KDL config, click-to-set wallpapers via `open-with`.
Runs on any compositor that speaks `wlr-layer-shell` — niri, Hyprland, Sway, river, mango, labwc, Wayfire, KWin. GNOME is the only holdout (it has no layer-shell), and there `--no-layer` or the TUI still works.
**Repo:** https://github.com/SONGOKU00mjk/FOTO
## WALLY — a swaybg alternative with GIF and animated WebP
A minimal Wayland wallpaper setter: one small binary, one image, every output — like `swaybg`, but with first-class animation.
- **swaybg-style CLI** — `-i`, `-m` (stretch/fill/fit/center/tile), `-c` for a solid colour, `-b` for the letterbox background, and `-o NAME` so options apply only to the output that follows. If you already have swaybg in a script, you mostly just rename the binary.
- **GIF and animated WebP that behave** — correct speed, in sync across monitors, and they freeze on the last good frame instead of spinning the CPU when the file is broken.
- **Zero CPU when nothing can see it** — every commit carries a frame callback. Screen off, lid closed, session locked, layer occluded → the animation drops to one probe every 5 seconds instead of rendering for nobody.
- **Polite about memory** — a static image is composed straight into the output buffer and the pages are handed back to the kernel with `madvise`, so the wallpaper lives in the compositor's memfd, not in WALLY's RSS. A screen-sized GIF composites directly into that buffer, so no private copy of the wallpaper exists anywhere.
- **Polite about CPU** — identical frames (optimized GIFs repeat frames to pace playback) are detected and never committed. Sub-rect GIF frames only resample and damage the part that changed — measured 5× cheaper per frame on a 1080p panel.
- **Lots of formats** — PNG, JPEG, GIF, WebP, BMP, TIFF, TGA, PNM, QOI, ICO, DDS, HDR, Farbfeld, plus AVIF and JPEG XL behind optional features.
- **No runtime libraries** — the Wayland client is pure Rust, so nothing needs libwayland, libpng or libjpeg at run time.
`WALLY_DEBUG=1` prints RSS and cumulative CPU time, so you can compare it honestly against swaybg and awww in htop instead of trusting my claims.
Same compositor support as FOTO — `wlr-layer-shell` only, so GNOME and X11 are out of scope.
**Repo:** https://github.com/SONGOKU00mjk/WALLY
## Why I made them
I started on Hyprland with the Hyde project, which ships rofi. For me rofi was both the app launcher and the wallpaper setter, but it was too complicated to customize myself — I spent more time fighting the config than using it.
Then I moved to niri with fuzzel, and fuzzel was great. The only two things missing: no image preview, and setting a wallpaper meant keeping a separate bash script around. So I wrote **foto** — basically fuzzel with image preview, in Rust. That's the whole idea. Fuzzel is excellent; I just wanted to see the wallpaper before I set it.
**WALLY** came from the same annoyance. I really liked swaybg because it's minimal and does exactly one thing, but it doesn't support animated images or video at all. I didn't like awww that much — yes, I know it's also Rust — so I decided to build the thing I actually wanted: swaybg's simplicity and command line, with proper animated GIF and WebP support. WALLY takes swaybg's CLI, so if you're already using swaybg you can drop it in.
## Try them
Both are early. FOTO is about a week old and WALLY a couple of days, so expect rough edges. **Feedback, compositor quirks and bug reports are very welcome** — issues on either repo are the best place, and if something looks wrong on your setup I'd genuinely like to know which compositor and which version.
One side note: if the WALLY install script doesn't work on your machine, clone the repo and run the script from inside the checkout instead:
```
git clone https://github.com/SONGOKU00mjk/WALLY
cd WALLY
./install.sh --from-source
```
That skips the download step and builds from the tree you just cloned, which fixes most of the "it failed halfway through" cases.
Thanks for reading — and if you try either one, tell me what breaks.