Omahub
← All plugins
N

omawall

by Nathan Ollerenshaw (matjam)

Replaces the Omarchy background service with a folder-backed one. Each display can have its own folder, shuffle through it or stay pinned to one image, and scale it to taste. Can also generate an Omarchy theme from the primary display's wallpaper, so the whole desktop tracks the picture behind it.

Install
$ omarchy plugin add https://github.com/matjam/omawall --enable
Appearance #quickshell

omawall

Folder-backed wallpapers for Omarchy Quattro. Every display gets its own image, its own settings if you want them, and your whole desktop theme can follow along.

Written by Claude, Anthropic's coding agent. Tested on real hardware, but tested isn't proven — and Omarchy plugins run unsandboxed inside your shell process, with your permissions. Read the source first. No promises about your cat.

omawall

Features

  • Per-display configuration — each screen gets its own folder, mode and scaling, or share one configuration across all of them.
  • Shuffle or pin — rotate a folder, or hold one image chosen from a thumbnail grid. Mix the two across screens.
  • Four scaling modes — zoom, fit height, fit width, or actual size.
  • Every image before any repeat — picks come off a shuffled queue that only reshuffles when it empties.
  • Shuffle on a timer, on unlock and screensaver exit, or by hand.
  • Recursive scan of .jpg .jpeg .png .gif .bmp .webp.
  • Skips files it can't decode and re-deals that display.
  • Theme from wallpaper — recolors everything Omarchy themes. Needs matugen.
  • Bar widget for all of it. Middle-click the icon for the next image; hover it to see thumbnails of what each display is about to get.

With no folder set it behaves like the built-in background service, so you can install it and decide later.

Install

omarchy plugin add https://github.com/matjam/omawall.git --enable

Put the widget on the right when prompted. This disables the built-in omarchy.background — they would fight over the wallpaper — and removing omawall restores it.

Theme generation needs matugen, which omawall does not install for you:

sudo pacman -S matugen    # Arch extra repo, no AUR helper needed

Everything else works without it, and the panel tells you when it's missing. Add it whenever; nothing needs reinstalling.

omarchy plugin update matjam.omawall    # update
omarchy plugin remove matjam.omawall    # remove, leaves nothing behind

Settings

Click the wallpaper icon in the bar. Three tabs: Displays, Shuffling, Theme. Actions and what's on each screen stay visible below them.

Displays — per display, or shared by all of them:

Setting Default Does
Primary display auto Whose image drives the generated theme. Marked ★ in the tabs.
Configure each display separately off On: a tab per display. Off: one shared configuration.
Folder empty Where images come from. Empty = theme backgrounds.
Search subfolders on Scan recursively.
Mode Shuffle Single pins one image, chosen from a thumbnail grid.
Scaling Zoom Zoom, Fit ↕, Fit ↔, or Actual.

Shuffling — global:

Setting Default Does
Auto-shuffle every 0 Seconds. 0 is off.
Shuffle on unlock or wake off Shuffle on unlock or screensaver exit instead.
Different image per display on Off mirrors one image across displays sharing a folder.

Theme — global: generate from wallpaper, and light or dark. See Theme from wallpaper.

Mixing displays

Set one display to Single and another to Shuffle and you get exactly that: the pinned one never moves while the other rotates. Displays pointed at the same folder share a pool and a deal queue, so they never show the same image at once and still see every image before repeating; displays on different folders rotate independently.

The four scaling modes only differ when the image and the screen disagree about shape. A 3440×1440 wallpaper on a 3440×1440 screen looks identical under Zoom, Fit ↕ and Actual, because it is.

Next image

The pool is dealt from a shuffled queue that only reshuffles once it empties, so there is always a next image waiting rather than a fresh roll of the dice. Next image hands it out — to every display set to Shuffle, leaving the pinned ones alone. With every display pinned there is no next image and the button is not shown.

Middle-click the bar icon for the same thing. Hovering it shows a thumbnail of what each display is about to get.

Keys while the panel is open: n next image · r rescan · b browse · t generate theme

omarchy-shell background next           # next image (shuffle is an alias)
omarchy-shell background generateTheme  # rebuild the theme
omarchy-shell background rescan         # re-read the folder
omarchy-shell background status         # JSON state

# hyprland bind
bind = SUPER SHIFT, W, exec, omarchy-shell -q background next

Theme from wallpaper

Derives a palette from the primary display's image, writes ~/.config/omarchy/themes/omawall/colors.toml, and applies it — bar, terminals, btop, neovim, browser, VS Code. Leave the toggle off and press t to do it by hand instead.

Your wallpaper is never touched: the theme is applied with OMARCHY_THEME_SKIP_BACKGROUND=1, which also stops a shuffle triggering a theme triggering another shuffle. While the toggle is on, switching to another theme won't stick.

It stalls the session for a moment. omarchy-theme-set retints every themed app, and the compositor stops accepting input while it does — the pointer freezes, and a held key can repeat. That's the cost of any Omarchy theme change; omawall just triggers it more often. So don't pair it with a short interval. Either turn on Shuffle on unlock or wake and set the interval to 0, or keep the interval and generate by hand. If you game, prefer neither.

<details> <summary><b>How the palette is built</b></summary>

matugen supplies Material You tonal palettes. Its surface and on-surface tiers become Omarchy's background and foreground ramps, and its primary the accent.

The eight ANSI colors can't come from matugen: Material harmonises a scheme around one seed hue, so its base16 output is a monochrome ramp — every "color" a different lightness of the same hue — and a terminal needs red to be red. Each is synthesised instead, starting at its canonical hue, nudged up to 15° toward the image's hue, at a saturation taken from the image and clamped to a band so a near-grey wallpaper still gives colors you can tell apart. The mapping is bin/omawall-colors.jq.

Run the generator directly:

bin/omawall-generate-theme --image ~/Pictures/wall.jpg --mode dark [--no-apply]
</details>

Requirements

Omarchy Quattro · zenity for the Browse button (ships with Omarchy) · matugen for theme generation only.

matugen is GPL-2.0 and omawall is MIT; omawall only executes it as a separate process, so the licenses stay independent. No network access, and nothing is written outside ~/.config/omarchy.

Credits

Extends Omarchy's built-in omarchy.background (basecamp/omarchy, MIT).

MIT — see LICENSE.