A curl-installable plugin/mod for Omarchy 4.x ("Quattro") that brings back familiar, conventional desktop-UI affordances on top of its Hyprland + Quickshell stack.
Omarchy is a great on-ramp from Windows, macOS and "traditional" Linux desktops like Gnome or KDE into the Arch/Hyprland world — except that its keyboard-driven, tiling-first design asks a lot of anyone whose muscle memory is a taskbar, a dock, and a mouse. OCD exists to close that gap: it layers the classic desktop conventions most people already know — window titlebars with minimize/maximize/close, a dock, drag-to-move/resize, an Exposé-style window switcher — on top of stock Omarchy, so it feels familiar from day one. No keybindings to memorize, no mental gymnastics — just click what you'd normally click, and grow into Omarchy's keyboard-driven workflows at your own pace, if at all.
Embrace Minimize, Maximize or Close in Omarchy - or as I'd like to call it: Dock, Hoist, Halt ;)
Features:
- Window controls — real titlebars with minimize / maximize / close buttons (via hyprbars), which show their glyphs on hover; double-click a titlebar to maximize
- Mouse window management — resize from a window's own border with no modifier key held (Omarchy already ships SUPER+drag to move/resize)
- Dock — running windows plus your pinned apps, along the bottom edge; always on while there's something in it, and hidden when there isn't
- Exposé — every open window as a live preview, type-to-search. Opens with SUPER+E or by throwing the pointer into the bottom-right corner
- Settings panel — a bar icon and popup to turn OCD on or off, live, no config file editing required
OCD is a single mod with a single on/off switch, in the settings panel or
via the ocd CLI — it works fully or not at all, rather than as a matrix of
independently-toggled parts. Turning it off leaves the settings panel in
place so you can turn it back on. Nothing here is vendored from another
plugin, and installing refuses to proceed (without --force) if it detects
a conflicting community dock/Exposé plugin already set up.
Here's a short video demo as well:
screenrecording-2026-09-03_04-42-49.mp4
curl -fsSL https://raw.githubusercontent.com/fevangelou/ocd/main/boot.sh | bashOr, from a git clone:
git clone https://github.com/fevangelou/ocd.git
cd ocd
./install.shBoth entry points take the same flags:
| Flag | Effect |
|---|---|
--force |
Proceed even if a conflicting community dock/Exposé plugin is detected. |
OCD is one mod with one switch. Turn it off later from the settings panel
(bar icon, or SUPER+,) or with ocd disable + ocd apply; turning it off
leaves the settings panel itself in place, so you can always turn it back
on.
Requires a live Omarchy 4.x session — the installer checks this itself and refuses to run on anything else.
boot.sh never follows the main branch. It hardcodes this repository's
URL and the exact commit tagged for the current release (v1.4 right now),
fetches that commit by SHA and checks it out detached, in one fail-closed
chain, before anything runs — and neither value can be overridden from the
environment. main can move ahead with in-progress work without changing
what curl | bash installs; only cutting a new release tag does that.
ocd updateChecks the repository for the latest published release tag, and if it's
newer than what's installed, fetches and re-runs the installer from that
exact pinned commit — same trust model as the initial install, never main.
Your on/off setting in features.json is left exactly as it is. Flags:
--yes (skip the confirmation prompt). ocd status shows the currently
installed tag/commit.
ocd update --main fetches whatever main currently points to instead of
the latest release — for development use only, not a reviewed/pinned
commit.
ocd uninstallocd remove and ocd purge are aliases for the same command. Fully
reverts every change ocd made — strips the Hyprland config hook, disables
hyprbars if ocd was the one that enabled it, removes all three Quickshell
plugins, and cleans up ~/.local/share/ocd. Safe to run even after a
partially-failed install. Flags: --yes (skip the prompt before deleting
your features.json/pins/overrides).
If ocd itself isn't on your PATH, run the underlying script directly:
~/.local/share/ocd/uninstall.sh
# or, from a checkout:
./uninstall.shToggling from the settings panel can't change the titlebars. hyprbars
is a compiled Hyprland plugin managed by hyprpm, and every hyprpm state
change ends in an internal sudo install ... /var/cache/hyprpm/... — it
needs root, and sudo reads its password from /dev/tty. The settings
panel runs inside Quickshell, which has no controlling terminal, so that
prompt can never appear. Everything else in the toggle (the dock, Exposé,
mouse management) applies immediately; OCD then sends a notification saying
the titlebar half is pending. Run ocd apply in a terminal to finish it.
Titlebar colors don't follow the live theme. hyprbars renders its
titlebar at Hyprland config-load time, and Omarchy's theme switcher doesn't
currently expose a stable Lua-readable "current theme colors" source. The
colors are set in hypr/ocd.lua; retinting needs a config reload.
Dragging a tiled window swaps it rather than moving it freely. That's Hyprland's dwindle/master behavior, not something OCD overrides — float the window first (SUPER+T) if you want freeform drag.
- v1.4 — Double-click a titlebar to maximize/restore, matching the
middle control button. The control buttons now reveal their glyphs
(
─ □ ×) on hover and stay bare colored circles at rest; hyprbars has no text tooltips, and this is its supported equivalent — note that hovering any one button reveals all three, which is how hyprbars scopes it. The buttons are also larger and further apart (16px across, 28px centre to centre, in a 28px bar). The dock now hides itself when it has nothing to show, instead of sitting at the bottom of the screen as an empty strip that still reserves space; it reappears the moment a window opens, and pinned apps count as something to show, so a dock with pins stays put. Moved the Exposé hot corner to the bottom-right (was top-right).ocd statusno longer dumps the rawlistPluginsJSON for every plugin on the system — it prints just OCD's own plugins and their state, with--fullfor the raw dump when debugging. Removed--dry-runeverywhere — from the installer,ocd apply,ocd updateandocd uninstall, along with the internal plumbing behind it. Previewing every mutation was a lot of machinery for a mod this small, and it's gone in favour of doing one obvious thing. - v1.3 — Fixed window controls failing to load, both on a fresh install
and after upgrading to Omarchy 4.0.3. Stale plugin headers block
hyprpm add, and without the repo clonedhyprpm enablecan only ever report the plugin as missing — so OCD now runshyprpm updateand retries the add, then verifies againsthyprctl plugin listrather than trusting hyprpm's exit code, which is0even when its own state write failed. It also detects up front when hyprpm's internalsudocan't obtain credentials, instead of half-succeeding silently. Fixedcurl | bashaborting at the dependency step. Collapsed the four per-feature toggles into one on/off switch (features.jsonschema v2, migrated automatically) — OCD is one mod, not a suite. A failed hyprbars build no longer rewrites your setting; it warns and retries instead. Removed the window-controls "text" style; solid colored buttons are now the only option.ocd enable/ocd disabletake no arguments, and--features=/ocd control-styleare gone. - v1.2 — Added
ocd uninstall(aliases:remove,purge) so uninstalling lives on the CLI alongsideapply/status/updateinstead of only a standalone script. Addedocd upgradeas an alias forocd update. Fixedocd statusshowing a tagged release as<untagged>after an update or fresh install. - v1.1 — Added
ocd update(plus--mainfor pulling an unreleased dev build) to update in place from the latest published release without a reinstall.boot.shnow pins to that release's exact commit instead of followingmain. Removed the config backup/restore mechanism — ocd's Hyprland/shell.json changes are narrow and self-reversible, so a separate snapshot step was unneeded complexity. - v1.0 — Initial upload. Window controls, mouse management, dock, Exposé, and the settings panel, targeting Omarchy 4.x ("Quattro").
For the Dock:
- Add 2 icons to reveal the Omarchy menu and the desktop
- Use a colored dot instead of (min) for minimized apps
- Explore a second more compact dock design option (e.g. with icons) as in Ubuntu Desktop, Gnome, macOS etc. The minimal Omarchy-like option will remain default.
- Explore if it's possible to enable drag and drop for app tabs
For the Popup:
- Switch to the font used in other navbar popups (so things look more "native")
For the Exposé:
- Provide text assistance like 'Close with the "Esc" key'
For the Window Controls:
- Consider 4th control for allowing the window to float
Global:
- Update along with
omarchy update, either by default or as an option to enable in the settings popup.
- Bash —
bin/ocd(the CLI) andlib/*.shown every system mutation: installing, uninstalling, and reconciling actual system state to~/.config/omarchy/ocd/features.json, the single source of truth for whether OCD is wanted. That file records what you asked for, never what happened to work on a given run — a failed hyprbars build warns and retries, it never rewrites your setting. - Lua —
~/.config/hypr/ocd.luaconfigures Hyprland itself (resize behavior, the minimize keybind, hyprbars styling/buttons, hotkeys) and is hooked intohyprland.luawith a singlerequire("ocd")inside a marker block, so it's trivially removable. - QML (Quickshell) — the dock, Exposé, and settings panel are three
independent Quickshell plugins under
plugin/, dropped into~/.config/omarchy/plugins/io.github.fevangelou.ocd.*/and toggled entirely over Omarchy's own shell IPC — no hand-patchedshell.json. - hyprbars — a compiled Hyprland plugin (titlebars), built and loaded
via
hyprpm; ocd configures it but doesn't vendor or fork it.
Nothing here is hidden behind a build step — every file is plain,
inspectable source, and features.json/appid-overrides.json/
dock-pins.json are hand-editable JSON.
Did we mention it was live-built on Omarchy?
Thank you to DHH and the whole Omarchy community — without Omarchy itself and the welcoming, keyboard-driven desktop it introduced to so many newcomers, this mod wouldn't have a home to exist in.
No code from any other plugin is vendored here, but two projects were read as prior art during research and are worth crediting directly:
gardnmi/omarchy-minimize— its hover-triggered live preview (still-frame by default, promoted to a live capture stream only while hovered/focused, torn down on close) independently informed the same approach in Exposé.rosakodu/omarchy-dock— an earlier bar-widget dock for Omarchy; its existence helped confirm that Chromium PWA icon matching is a real, shared pain point worth solving properly here.
GNU General Public License v3.0 (GPLv3) — see LICENSE.
Copyright (c) 2026 Fotis Evangelou. All rights reserved.