Change your Omarchy theme once and let your desktop follow.
Omarchroma applies your active palette to GTK 3/4, libadwaita, GNOME settings, Qt/KDE Frameworks, Dark Reader, Pear Desktop (YouTube Music), Flatpak apps, and the browsers Omarchy does not theme itself: Firefox, Floorp, Zen, LibreWolf, Waterfox and Vivaldi.
It runs as a standalone user service (hyprchroma) with an optional Omarchy
bar widget for convenience.
With the bar widget:
omarchy plugin add https://github.com/NobleDoodle/omarchroma --enableOpen the panel and press i. A setup terminal will prompt you to select
optional frameworks, then verify the dependencies those need. Type
I understand to build.
Standalone (service only):
git clone --depth 1 https://github.com/NobleDoodle/omarchroma
cd omarchroma/packaging && makepkg -si
systemctl --user enable --now hyprchromad.serviceUpdating this way, re-run the same three commands. enable --now only starts
the service if it was not already running, so on an update it keeps executing
whatever it had already loaded — add systemctl --user restart hyprchromad.service
afterward to pick up the new build. The bar widget's setup terminal offers
this restart, and the Omarchy shell's own, automatically.
| Theme | What it shows |
|---|---|
| GTK/libadwaita, Qt/KDE surfaces, Dark Reader, and Pear Desktop following a custom palette. | |
| The same app set following a Nord palette after a theme change. |
hyprchroma # sync only what changed
hyprchroma --force # rewrite everything
hyprchroma --target=gtk --force # gtk | qt-kde | dark-reader | pear | flatpak | browsers
hyprchroma framework remove pear # remove from the panel and revert
hyprchroma framework restore pear # put it back and sync
hyprchroma palette --capture # pin the current palette to a file
hyprchroma restore --stock # revert everything to stock defaultsWith the bar widget:
| Input | Action |
|---|---|
| Left click palette icon | Open/close the panel |
1 – 6 |
Toggle kept frameworks |
r |
Refresh every enabled framework |
/ |
Show apps still using the old theme, and any removed frameworks |
i |
Install, update, or start hyprchroma when prompted |
Esc |
Go back or close the panel |
- While applications are still showing the previous theme, the icon takes your
theme's alert color with a small count of how many windows to close;
/lists the applications, with how many windows each has open. - When the installed service is older than the plugin, the icon alerts the same way, counting the update as one, and the panel's Update button is lit in that color until it is run.
- Turning a framework off reverts it to its original state.
- Removing one hides it from the panel entirely (press
/and its number to restore). - GTK and Qt/KDE are always included; Dark Reader, Pear Desktop, Flatpak apps and Additional browsers are optional. Install the Dark Reader browser extension manually for it to theme on the next sync.
- Dark Reader is themed in every browser profile it is installed in, not only your default browser: Chromium, Chrome, Brave, Vivaldi, Helium, Firefox, Floorp, Zen, LibreWolf and Waterfox. A browser that is open is themed when it closes, since its settings live in the browser's own database.
- Flatpak apps is off until you switch it on: it changes a permission for every Flatpak app you have (see below). Each app picks it up on its next launch.
- Additional browsers is off until you switch it on: it writes into your browser profiles (see below). Each browser picks it up on its next start. Chromium, Chrome, Brave and Helium are not included; Omarchy colors those itself.
Omarchy: The daemon installs theme-set and font-set hooks. Omarchy's own
resolver answers, so derived shades match what Omarchy computes.
Standalone (plain Hyprland, Quickshell, etc.):
hyprchroma palette --template > ~/.config/hyprchroma/palette.toml
$EDITOR ~/.config/hyprchroma/palette.toml
hyprchroma --forceRequires twenty named #rrggbb keys (mode is inferred from the background).
This file overrides Omarchy if present. Use palette --capture to save the
active palette and palette --source to verify the active source.
Requires a palette source (Omarchy or the TOML file). Without one, the daemon stops and changes nothing.
| Dependency | Needed for | If missing |
|---|---|---|
hyprland |
Event stream | Restarts until Hyprland appears |
jq, python3 |
JSON I/O | Required |
adw-gtk-theme |
GTK 3 applications | GTK 3 apps keep system defaults |
python-plyvel |
Dark Reader in Chromium | Chromium browsers are skipped |
| Dark Reader | Browser page theming | Web pages won't be themed |
| Pear Desktop | YouTube Music theming | Setup offers to install it from the AUR |
flatpak |
Flatpak app theming | Not offered |
| Firefox, Floorp, Zen, LibreWolf, Waterfox or Vivaldi | Additional browsers | Not offered |
The daemon runs rootless, modifying only files in your home directory (only pacman installation requires sudo).
- GTK: Injects a single
@importline at the top ofgtk.cssto load generated colors fromhyprchroma.css. Custom overrides remain intact. - KDE: Edits
kdeglobalsin place, touching only the color sections Omarchroma manages. - Flatpak apps (only when switched on): adds four read-only grants to your
user's global Flatpak override, so every Flatpak app can read the theme files
above, and keeps
GTK_THEMEout of the sandbox. Nothing of hyprchroma's own state is granted. Switching it off removes exactly those entries and leaves the rest of your overrides as they were. - Additional browsers (only when switched on): colors the tabs, toolbar and
menus of every supported browser with a profile. Each Firefox-family profile
gets its own
chrome/hyprchroma.css, one@importline at the top ofuserChrome.css, and one line inuser.jsthat lets the browser load it. Vivaldi gets a custom theme named Omarchy, selected, and written only while Vivaldi is closed. AuserChrome.css,user.jsorPreferencesthat is a link (dotfiles, arkenfox) is left alone. Switching it off removes exactly what it added, byte for byte, and puts your own Vivaldi theme back.
Generated output is never included in backups.
~/.config/gtk-{3,4}.0/hyprchroma.css generated colors
~/.config/gtk-{3,4}.0/gtk.css one @import line, nothing else
~/.config/kdeglobals only the color sections
~/.config/*rc only [UiSettings] ColorScheme
~/.config/YouTube Music/hyprchroma.css
~/.local/share/color-schemes/Hyprchroma.colors
~/.local/{share,state}/hyprchroma/
~/.config/omarchy/hooks/{theme-set,font-set}.d/hyprchroma
~/.local/share/flatpak/overrides/global Flatpak apps only, when switched on:
xdg-config/gtk-3.0:ro xdg-config/gtk-4.0:ro xdg-config/kdeglobals:ro
xdg-data/color-schemes:ro and GTK_THEME unset
<browser profile>/chrome/hyprchroma.css Additional browsers only, when switched on
<browser profile>/chrome/userChrome.css one @import line, nothing else
<browser profile>/user.js one preference line, nothing else
<Vivaldi profile>/Preferences the Omarchy theme, selected
Omarchroma does not edit your Hyprland config. Bind your own keys in
~/.config/hypr/bindings.lua:
local om = "omarchy-shell io.github.nobledoodle.omarchroma"
o.bind("SUPER + ALT + G", "Omarchroma: toggle GTK", om .. " toggleGtk")
o.bind("SUPER + ALT + K", "Omarchroma: toggle Qt/KDE", om .. " toggleQtKde")
o.bind("SUPER + ALT + D", "Omarchroma: toggle Dark Reader", om .. " toggleDarkReader")
o.bind("SUPER + ALT + P", "Omarchroma: toggle Pear Desktop", om .. " togglePear")
o.bind("SUPER + ALT + F", "Omarchroma: toggle Flatpak apps", om .. " toggleFlatpak")
o.bind("SUPER + ALT + B", "Omarchroma: toggle additional browsers", om .. " toggleBrowsers")
o.bind("SUPER + ALT + R", "Omarchroma: refresh", om .. " refresh")These drive the bar widget. If running standalone, map to hyprchroma --force
instead.
hyprchroma restore --stock # Do this first (or use --captured)
systemctl --user disable --now hyprchromad.service
sudo pacman -R hyprchroma
omarchy plugin remove io.github.nobledoodle.omarchroma