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.
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.
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:
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#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.
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
Your .zip has downloaded. Run this in a terminal to install and activate it: