Drop an image to generate an Omarchy theme from its colors. Themes install on Omarchy 4 and Omarchy 3 alike.
Turn any image into an Omarchy theme. Everything runs in your browser — images never leave your device.
The Make a theme tab (default) is the full image-driven flow described below — upload images, get a complete theme. The Just an unlock screen tab is a lighter tool: pick two colours, optionally upload a logo, and you get a tiny zip containing only unlock.png and preview-unlock.png that drops straight into a theme you already have installed. Use it when you like your existing theme and only want to change the boot/lock screen.
After download, run the command shown in the Install panel. It'll look like this:
unzip -o ~/Downloads/my-theme.zip -d ~/.config/omarchy/themes/ \ && omarchy-theme-set my-theme
Omarchy auto-generates the shell, alacritty, kitty, ghostty, btop, neovim, VS Code, Chromium, Obsidian and every other component from your colors.toml — you only need to supply the colors and backgrounds.
Requires Omarchy 3.7 or later — the omarchy-plymouth-set-by-theme helper used by the install command shipped in 3.7. Older Omarchy installs won't pick up the new boot screen.
If you like the theme you're already on and only want a custom boot/lock screen, switch to the Just an unlock screen tab at the top. You pick a background colour, a foreground (logo) colour, and optionally upload a transparent-PNG logo. You don't have to type your theme name — the install command auto-detects whichever theme you currently have active and drops the unlock screen into it. The install command looks like:
THEME=$(cat ~/.config/omarchy/current/theme.name) && \ unzip -o ~/Downloads/omarchy-unlock.zip -d ~/.config/omarchy/themes/"$THEME"/ && \ omarchy-plymouth-set-by-theme "$THEME"
The first line reads the active theme's slug from a file Omarchy keeps up-to-date, the second drops unlock.png and preview-unlock.png into that theme's folder (without touching any of its other files), and the third applies the new boot/lock screen via Plymouth. If you'd rather target a different installed theme, just edit the install command before pasting it. The logo upload follows the same rules as the full-theme unlock toggle (transparent PNG, shape-only, recoloured to the foreground hex). See Window style → ☐ Unlock screen below for the details.
These respect the image's actual colors, biasing which ones get pulled forward.
Typical output for each strategy (same 6 target hues, different chroma and lightness):
These use classical color-theory harmonies anchored to the image's dominant hue.
Same source hue (200°, a teal blue), different harmonic distributions:
The checkboxes and dropdown next to the controls let you customize how windows, panels and the boot screen look. Every option is optional — leave them at defaults to get a stock-Omarchy-style theme. The window-style options update the live preview as you toggle, so you can see the result before downloading.
decoration = { rounding = 4 } to the theme's hyprland.lua, giving every tiled window subtly rounded corners.Requires Omarchy 3.7 or later. Generates a custom boot & login screen matching your theme — solid background in your theme's background hex with a centred logo. Drops unlock.png + preview-unlock.png into the theme. By default your uploaded logo is shipped with its full colour preserved; tick Tint to foreground if you want it flattened to a single-hex silhouette instead.
The logo upload (optional). You can supply your own logo as a transparent PNG, or leave it blank to get the default Omarchy logo. The file you upload is treated as a shape only — its colours, gradients and inner detail are discarded and the silhouette is recoloured to your theme's foreground hex. That keeps the boot screen readable on any theme palette without you having to colour-match by hand.
What works best: any aspect ratio is fine — we crop to the opaque pixels and scale the longer side down to 800 px if larger (the size stock Omarchy themes use), preserving your image's proportions. Sources smaller than 800 px stay at native size so they don't get upscaled. Wide banner-style logos and square marks both work. Use a transparent PNG so anything outside your logo doesn't show up as a solid block on the boot screen.
Applying it is a separate one-time command, omarchy-plymouth-set-by-theme <name>, because it needs sudo and rebuilds the initramfs (a few seconds). The main install command leaves your existing boot screen alone. You can also pick it later from Omarchy menu → Style → Unlock.
[font] base-size in the shell config — the rem root that every omarchy-shell text size derives from. Because scale-with-font is on by default, the bar height, spacing and control sizes scale with it too, so this resizes the whole shell rather than just the launcher. Small (11px) is compact, Medium (12px) is the Omarchy default, Large (14px) is more spacious.All overrides are plain Hyprland Lua and shell TOML (plus standard PNGs for the unlock screen) — no extra dependencies, nothing your Omarchy install doesn't already have. If you don't tick anything, the templated defaults are used and the theme is identical to a stock-styled one.
You can upload several backgrounds for one theme. The palette harmonizes across every image you upload — not just the one you're previewing. All of them get packaged into the theme's backgrounds/ folder so you can cycle through them with omarchy-theme-bg-next.
Omarchy 4 themes are built from a named palette — slots like background and bright_red rather than numbered ANSI positions. The values below come straight from the stock Tokyo Night theme (~/.local/share/omarchy/themes/tokyo-night/colors.toml) so you can see what a real one looks like.
Surfaces — four depths of background, four weights of text.
#1a1b26terminal / app window bg#24283belevated surface — we point the bar, launcher, menu and popups at this#13141crecessed surface#0e0e14deepest surface#a9b1d6main text color#c0caf5highest-contrast text, terminal cursor#565f89comments, disabled text#414868low-emphasis chrome (and ANSI bright black)#7aa2f7active window border, bar highlights, launcher selection#292e42selected text bgNamed colors — these drive terminal output like ls, git diff and grep, plus syntax highlighting everywhere else. Hover any swatch for its slot and hex:
Top row: base colors. Bottom row: their bright variants — orange and brown don't have one, since neither maps to an ANSI slot.
Omarchy 3 only understood the 16 numbered ANSI slots (color0–color15). Omarchy 4 reads the named palette above and works out the ANSI names from it on the fly.
Generated themes carry both: the named palette first, then a legacy block filling in color0–color15 from exactly the same values. Omarchy 4 reads the names and ignores the legacy block; Omarchy 3 reads the legacy block and ignores everything it doesn't recognise. One theme, either version, same result.
Two things are Omarchy-4-only: the shell.*.toml surface overrides (Omarchy 3 had Waybar and Walker instead of omarchy-shell) and hyprland.lua (Omarchy 3 used hyprland.conf). Both are inert on Omarchy 3 rather than broken — you get the colors, just not the panel elevation or the window-style toggles.
Everything colour-related runs entirely in your browser. Your images are never uploaded anywhere — they're read through a hidden canvas element, processed locally, and packaged into a zip by JavaScript that ships with the page. The theme generation pipeline doesn't need a server and never touches one.
The only network activity after the initial page load is a lightweight ping to my self-hosted Plausible analytics instance, recording the page view plus any clicks on outbound links or file downloads. Plausible is cookieless, doesn't fingerprint, and collects nothing personally identifying — no cross-site tracking, no ads, no third parties. You can verify everything in your browser's devtools Network tab.
Every technique Omarchy Colour uses to turn pixels into a theme — explained and illustrated.
When you drop an image, we scale it to 256px on its longest side and read every pixel through a hidden <canvas>. Each pixel's RGB value gets truncated to 5 bits per channel — 32,768 possible colors instead of 16 million — and we count how many pixels fall into each bucket.
We then walk that list in descending order and merge perceptually similar colors until we have about 16 distinct dominant colors. That's the raw palette that feeds everything else.
Thousands of pixels collapse to a handful of dominant colors via frequency + perceptual merging.
When you upload multiple backgrounds, each image contributes equally regardless of size. Every image's bucket counts get normalized so a 4K landscape and an 800×600 snapshot both add up to the same total weight. The resulting palette reflects the average "personality" of all your backgrounds — so the accent colors look good on any of them.
Most color math happens in HSL (hue / saturation / lightness). But HSL lies about perception: an HSL "yellow at L=50%" looks much brighter than an HSL "blue at L=50%", even though the math says they're equally light.
OKLCH is a perceptually uniform color space based on Björn Ottosson's OKLab. A rotation in OKLCH hue looks uniform across the wheel, OKLCH lightness actually matches perceived brightness, and OKLCH chroma matches perceived saturation. This is what Google uses for Material You. Compare:
Notice how HSL yellow and cyan look far brighter than HSL red and blue at the same "lightness" — that's the perceptual distortion OKLCH fixes. The OKLCH strip looks evenly bright across every hue.
OKLCH can describe colors your monitor physically can't display. When we ask for "high-chroma blue at L=0.8", the mathematical answer often falls outside the sRGB color gamut. Instead of clamping the RGB values after the fact (which shifts the hue and produces ugly color casts), we binary-search for the highest chroma that still fits in sRGB, preserving the exact hue and lightness. You get a slightly less saturated color, but zero hue shift.
Each strategy applies a different weight function to the raw bucket list. The formulas below decide which colors rise to the top.
count — pure frequency. Most common wins.count × (0.4 + 3.0·C) — a single vivid flower can punch above a huge patch of grass.count × (1.3 − C) — neutral tones win, vivid colors get suppressed.count × max(0.3, L) × (1.2 − 0.5·C) — brightest and softest regions win.count × (0.25 + 3.5·C) — finds the single most saturated hue, even if rare, to anchor the theme.count × (0.5 + 1.8·C) — moderate vivid bias for a good anchor hue.Some strategies use classical color-theory harmonies. Each takes the image's dominant hue as an anchor and derives the 6 ANSI color slots by rotating around the color wheel. The white dots mark where each strategy places its anchor(s):
White dots mark each harmony's anchor points on an OKLCH hue wheel. All rotations happen in perceptual space, so steps feel uniform regardless of hue.
Auto mode computes the weighted average OKLCH lightness across all uploaded images. If it's below 0.55, we generate a dark theme (near-black background, light text, with background tinted by the dominant hue). Above 0.55 produces a light theme. You can override with Force dark or Force light.
Omarchy themes define 16 ANSI colors (0–15) plus 6 semantic roles. We pick target hues for the six chromatic ANSI slots in OKLCH space — these are the positions the "image" strategy tries to find nearest matches for:
OKLCH target angles: red 29°, yellow 85°, green 150°, cyan 200°, blue 255°, magenta 325°. Note these differ from HSL angles.
The Regenerate button applies a per-click hue shift from a rotation schedule: 0°, +25°, −25°, +50°, −50°, +12°, −12°, +75°, −75°. Because the rotations happen in OKLCH, each step feels perceptually uniform — no weird jumps between cycles. Chroma also gets a small nudge so muted/vibrant variations feel iterative.
When you click the eyedropper or a palette chip, the selected color is used for the accent with its lightness preserved — only clamped into a visibility window against the background. The hue and chroma propagate through verbatim: what you click is what you get.
Six of the named colors — red, yellow, green, cyan, blue and magenta — come in a normal and a bright pair. Rather than arbitrarily lightening, we shift each normal color's OKLCH L by a fixed 0.08 away from the background: brighter on dark themes, darker on light ones. That gives perceptually equal steps across every hue. HSL lightness boosts would come out uneven, because lightness in HSL isn't perceptual — yellows would leap and blues would barely move.
orange and brown have no bright pair, matching the stock palette. Orange is derived as the hue exactly between the finished red and yellow — it has no anchor of its own in any harmony scheme, and sampling it independently made it collide with yellow on warm images. Brown is orange mixed halfway to black.
If every UI surface uses the same dark background color, the bar, launcher and popups blend into terminal windows and the wallpaper, losing visual hierarchy. Many polished themes solve this by hand-picking a slightly elevated "panel" colour that's distinct from the main window background but still part of the same colour family.
We do this automatically. Every theme gets a derived lighter_background slot computed from the main background in OKLCH:
background at L=0.16, lighter_background at L=0.22 — about 6 perceptual points brighter, same hue, slightly higher chroma for warmth.background at L=0.97, lighter_background at L=0.92 — about 5 perceptual points darker, same hue, slightly higher chroma.Because the offset is in perceptual OKLCH lightness, the visible "elevation" is identical regardless of which hue the background lands on. A blue-ish panel and a red-ish panel both feel one step lifted above their main bg in exactly the same way. Doing the same offset in HSL would feel uneven — yellows would jump dramatically and blues would barely move.
Omarchy 4's own shell template points every surface at the plain background, so the elevation needs to be asked for explicitly. Each theme ships a small set of shell.<section>.toml files — one each for the bar, launcher, menu, popups, tooltips and notifications — that re-point those surfaces at lighter_background. Terminal windows and Hyprland keep the deeper main background, so the contrast is always there.
Each of those files replaces one whole section of the generated shell config rather than merging into it, so they restate every key that section defines — otherwise settings like the bar's alert color would silently fall back to a built-in default instead of your theme's red.
Further reading: Björn Ottosson's A perceptual color space for image processing — the OKLab paper that underpins everything here.
Drop one or more images, or click to choose
omarchy-plymouth-set-by-theme command and the per-theme unlock.png convention shipped in 3.7 — older installs won't pick it up.foreground hex, turning the upload into a single-colour silhouette. Use this for monochrome marks or when you want strict palette consistency. Off by default.Generate just the boot & lock screen and drop it into a theme you already have installed. Doesn't touch your existing colours, fonts or wallpapers — only adds (or replaces) unlock.png and preview-unlock.png inside the theme folder. Requires Omarchy 3.7 or later.
Your .zip has downloaded. Run this in a terminal to drop the unlock screen into your existing theme and apply it (sudo + initramfs rebuild — one-time):
Or pick it from Omarchy menu → Style → Unlock after the unzip step.
Generate two different logos — one for the boot screen (Plymouth), a different one for the login screen (SDDM). Stock Omarchy syncs both to a single image; this splits them. Drops into a theme you already have installed and overrides SDDM after the standard apply. Requires Omarchy 3.7 or later.
Your .zip has downloaded. Run this in a terminal — first command applies the boot logo to Plymouth + SDDM (sudo + initramfs rebuild — one-time), the second overrides SDDM with your separate login logo:
SDDM picks up logo.png at next login screen — no rebuild needed for that step.
Your .zip has downloaded. Run this in a terminal to install and activate it:
Then, to apply your custom boot & lock screen (needs sudo, rebuilds initramfs — one-time):
Or pick it from Omarchy menu → Style → Unlock after install.