Skip to content

Latest commit

 

History

43 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ocd — Omarchy Classic Desktop

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.

screenshot-2026-09-03_04-21-44

What is OCD?

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

Installation

curl -fsSL https://raw.githubusercontent.com/fevangelou/ocd/main/boot.sh | bash

Or, from a git clone:

git clone https://github.com/fevangelou/ocd.git
cd ocd
./install.sh

Both 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.

Updating

ocd update

Checks 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.

Uninstallation

ocd uninstall

ocd 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.sh

Known limitations

Toggling 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.

Changelog

  • v1.4Double-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 status no longer dumps the raw listPlugins JSON for every plugin on the system — it prints just OCD's own plugins and their state, with --full for the raw dump when debugging. Removed --dry-run everywhere — from the installer, ocd apply, ocd update and ocd 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 cloned hyprpm enable can only ever report the plugin as missing — so OCD now runs hyprpm update and retries the add, then verifies against hyprctl plugin list rather than trusting hyprpm's exit code, which is 0 even when its own state write failed. It also detects up front when hyprpm's internal sudo can't obtain credentials, instead of half-succeeding silently. Fixed curl | bash aborting at the dependency step. Collapsed the four per-feature toggles into one on/off switch (features.json schema 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 disable take no arguments, and --features= / ocd control-style are gone.
  • v1.2 — Added ocd uninstall (aliases: remove, purge) so uninstalling lives on the CLI alongside apply/status/update instead of only a standalone script. Added ocd upgrade as an alias for ocd update. Fixed ocd status showing a tagged release as <untagged> after an update or fresh install.
  • v1.1 — Added ocd update (plus --main for pulling an unreleased dev build) to update in place from the latest published release without a reinstall. boot.sh now pins to that release's exact commit instead of following main. 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").

To Do

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.

How it's built

  • Bashbin/ocd (the CLI) and lib/*.sh own 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.lua configures Hyprland itself (resize behavior, the minimize keybind, hyprbars styling/buttons, hotkeys) and is hooked into hyprland.lua with a single require("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-patched shell.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?

Code Documentation

Ask DeepWiki

Acknowledgements

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.

License

GNU General Public License v3.0 (GPLv3) — see LICENSE.

Copyrights

Copyright (c) 2026 Fotis Evangelou. All rights reserved.

About

Omarchy Classic Desktop (OCD) - an Omarchy Linux plugin/mod to ease the transition from "traditional" desktops (Windows, MacOS, Gnome, KDE etc.), while respecting Omarchy's desktop paradigm

Topics

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages