Drop an image to generate an Omarchy theme from its colors.
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 waybar, alacritty, hyprlock, mako 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 hyprland.conf, giving every tiled window subtly rounded corners.rgba at 82% so the wallpaper shows through, (3) Walker becomes a glass-effect launcher with translucent panels and a soft drop shadow.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.
window * { font-size } to outrank Omarchy's default rule.All overrides are pure Hyprland / GTK CSS (and 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.
Every Omarchy theme is built from these 22 color slots. The values below are taken directly from the stock Tokyo Night theme (~/.local/share/omarchy/themes/tokyo-night/colors.toml) so you can see exactly what a real theme looks like:
#1a1b26terminal / app window bg#24283belevated surface — waybar, walker, popups#a9b1d6main text color#7aa2f7active window border, waybar dot, walker selection#c0caf5terminal cursor#7aa2f7selected text bg#c0caf5selected text fgThe 16 ANSI palette slots (color0–color15) — these drive terminal output like ls, git diff, grep. Values straight from Tokyo Night:
Top row: color0–color7 (normal). Bottom row: color8–color15 (bright). Hover any swatch for its exact hex.
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 single lightweight page-view ping to my self-hosted Umami analytics instance. Umami is cookieless, doesn't fingerprint, and only counts anonymous page views — 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.
Omarchy needs 16 ANSI colors, split into a "normal" (0–7) and "bright" (8–15) set. Rather than arbitrarily lightening, we boost each normal color's OKLCH L by a fixed 0.08 — perceptually equal brightness steps across every hue. HSL lightness boosts would produce uneven steps because lightness in HSL isn't perceptual.
If every UI surface uses the same dark background color, panels (waybar, walker, mako, swayosd) 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 panel_background slot computed from the main background in OKLCH:
background at L=0.16, panel_background at L=0.22 — about 6 perceptual points brighter, same hue, slightly higher chroma for warmth.background at L=0.97, panel_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.
The panel_background value is shipped as part of colors.toml and used by our generated waybar.css and walker.css overrides. Terminal windows and Hyprland use the deeper main background, so the contrast is always there.
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.
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.