OmaDock is a native Quickshell overlay for Hyprland. It helps you launch, focus, and cycle through applications while staying out of the way when it is not needed. Think of it as a small graphical command strip—with fewer commands to remember.
The dock hides so your windows can shine. Mostly.
Every entry is a dot-matrix glyph beside a lowercase command label, over an ordered-dither texture. State is a brightness ladder: the application you are on is fully lit, a running one sits below it, and a pinned one that is not running stays dim.
In motion
Smart Hide keeps the dock out of the way until you reach for it, and the bar widget changes any of it live.
<p align="center"> <img src="display.gif" alt="OmaDock revealing on edge hover, switching modes, and reordering pins" width="100%"> </p>Features
- Smart Hide with edge reveal and Hyprland-aware window detection.
- Independent behavior on each monitor.
- Pinned applications and running, unpinned applications.
- Launch, focus, multi-window cycling, and safe context-menu actions.
- Drag reorder for pinned apps, including pinning eligible running apps.
- A bar widget with a preferences panel for hiding, layout, and pointer actions.
- A switch that turns the dock off without removing the plugin.
- Dot-matrix glyphs resolved from the application, its name, its desktop entry categories, or -- for a web application, which declares none of those -- the address it opens.
- Live Omarchy theme integration.
- A JSON configuration file that survives updates and removal.
- No daemon, polling loop, telemetry, network requests, or extra runtime.
OmaDock is not a replacement for the Omarchy bar, a standalone desktop shell, or a macOS dock cosplay contest.
Requirements
- Omarchy Quattro
- Hyprland
- Quickshell
0.3.x - The official
omarchy plugincommand
The first release targets the Omarchy 4.0.1-1 / Quickshell 0.3.1
baseline.
Multi-monitor support is implemented — each monitor keeps its own hide state, and
monitorMode selects all, focused, or a named list — but it has so far only
been exercised on a single display. Reports from multi-monitor setups are
welcome.
Installation
Omarchy plugin
The recommended installation method:
omarchy plugin add https://github.com/matheusmedrado/omadock.git --enable
Manual Git installation
For a regular local checkout:
git clone https://github.com/matheusmedrado/omadock.git \
~/.config/omarchy/plugins/io.github.matheusmedrado.omadock
omarchy-shell shell rescanPlugins
omarchy plugin enable io.github.matheusmedrado.omadock
OmaDock runs inside the existing Omarchy shell. It does not install a separate process or edit Hyprland configuration.
Usage
The dock sits at the bottom edge of each enabled monitor and uses Smart Hide by default:
- Left click: launch, focus, or cycle an application's windows.
- Middle click: launch a new instance.
- Mouse wheel: cycle existing windows.
- Right click: open actions such as pin, unpin, or close the active window.
- Drag: reorder pinned apps, or drag a running app into the pinned region.
- Drag out: pull a pinned app clear of the strip to unpin it. A running application stays in the dock as an unpinned entry until it exits.
- Edge hover: reveal the dock when Smart Hide has tucked it away.
With Reserve space switched on, a revealed dock pushes windows up instead of covering them, and they flow back the moment it hides. Under Smart Hide that makes any tiled window count as a reason to hide, because releasing the space is exactly what would put a window back under the dock; floating windows are exempt, since an exclusive zone never moves them.
Activating a window on another workspace lets Hyprland handle the workspace change; OmaDock does not move the pointer for you.
The dock suspends itself on fullscreen workspaces by default, because games and videos deserve the whole screen—and all the pixels they can get.
Preferences
OmaDock ships a bar widget. Its icon is the dock's own dot-matrix glyph; click it to open a preferences panel covering hiding, layout, glyphs, and pointer actions. Middle-clicking the icon toggles between Smart Hide and never hiding, which is the setting worth reaching for without opening anything.
The first row of the panel is the dock itself. Switching it off leaves the plugin installed and the widget on the bar: the dock's surfaces go away, it stops tracking windows, and every other setting keeps its value for when it comes back. The bar icon dims while the dock is off, and middle-clicking it then switches the dock back on rather than changing the hide mode.
Add it to the bar from the Omarchy plugin UI, or from a terminal:
omarchy-shell shell putBarWidget io.github.matheusmedrado.omadock '{"section":"right"}'
The panel writes to the same config.json described below, through the same
validation, so a change made there is identical to one typed by hand and applies
to the running dock immediately. Pinned applications stay where they belong: on
the dock itself, via right click and drag.
Keybindings
The dock answers to omarchy-shell, so it can be reached without the pointer:
omarchy-shell omadock toggle # focused monitor
omarchy-shell omadock reveal
omarchy-shell omadock conceal
omarchy-shell omadock toggleOn DP-1 # a named monitor
omarchy-shell omadock status # state, per monitor, as JSON
omarchy-shell omadock disable # switch the dock off; the plugin stays
omarchy-shell omadock enable
omarchy-shell omadock toggleEnabled
disable, enable, and toggleEnabled write the same setting the first row of
the preferences panel does. While the dock is off, reveal and toggle answer
disabled and change nothing, rather than latching a dock that is not there.
A reveal is a latch rather than a hover: it holds the dock open over whatever
Smart Hide would otherwise do, until something conceals it. Bind it in
~/.config/hypr/bindings.conf:
bindd = SUPER, D, Toggle the dock, exec, omarchy-shell omadock toggle
The preferences panel answers on its own target, omadock-settings, with
open, close, and toggle.
Configuration
Everything in the panel, and a few settings beyond it, live outside the plugin checkout:
~/.config/omadock/config.json
A minimal configuration looks like this:
{
"version": 1,
"enabled": true,
"position": "bottom",
"monitorMode": "all",
"pinned": [
{ "desktopId": "com.mitchellh.ghostty" }
]
}
enabled is the dock itself: set it to false and the plugin stays installed
and the bar widget stays on the bar, with nothing on screen and no window
tracking, until it is set back. The configuration also supports monitor
selection, compact or comfortable density, appearance, hide behavior, and click
actions. Changes are applied live when valid; invalid edits keep the last
known-good configuration.
Settings the panel does not surface, because they are set once and forgotten:
monitorMode and monitors, aliases for applications whose window class does
not match their desktop entry, and the reveal, hide, and animation timings.
Removing OmaDock preserves the configuration file by default.
Updating and removing
The permanent plugin ID is:
io.github.matheusmedrado.omadock
Update a plugin installation with:
omarchy plugin update io.github.matheusmedrado.omadock
omarchy-restart-shell
The restart is part of the update, not an optional extra. The shell loads a
plugin's QML when it starts, so new files on disk are not new code in the
running shell. omarchy plugin update ends by calling
omarchy-shell shell rescanPlugins, which finds plugins that have been added or
removed but does not rebuild one that is already loaded -- so without the
restart the update looks like it did nothing. It did: the files changed, the
pixels did not.
For a manual Git installation, update the checkout instead:
git -C ~/.config/omarchy/plugins/io.github.matheusmedrado.omadock pull
omarchy-restart-shell
Only ~/.config/omadock/config.json is applied without a restart. It is watched
and re-read on save, which is why a preference set from the bar widget takes
effect immediately while a new version of the dock does not.
Remove the plugin with:
omarchy plugin remove io.github.matheusmedrado.omadock
To remove the configuration as well, delete ~/.config/omadock/ manually
after uninstalling the plugin.
Development
How to set up a working checkout, what the checks enforce, and how a release is
cut are in CONTRIBUTING.md.
Run the local checks with:
./scripts/check
git diff --check
On an Omarchy installation, also run:
omarchy plugin validate .
qmllint -I "$OMARCHY_PATH/shell" \
Overlay.qml components/*.qml services/*.qml tests/*.qml
Troubleshooting
Check the plugin status and shell logs first:
omarchy plugin list --json | jq '.[] | select(.id == "io.github.matheusmedrado.omadock")'
qs log -p "$OMARCHY_PATH/shell" --tail 200
For visibility and window-interaction issues, inspect the compositor state:
hyprctl layers
hyprctl clients -j
hyprctl monitors -j
If the dock is hidden, check the active workspace, fullscreen state, and configured monitor mode before blaming the pixels.
The update ran but nothing changed
Run omarchy-restart-shell. See Updating and removing:
the shell keeps running the QML it started with, so an update is not visible
until it restarts.
To confirm the update itself landed, compare the checkout against the remote:
P=~/.config/omarchy/plugins/io.github.matheusmedrado.omadock
git -C "$P" rev-parse HEAD
git -C "$P" ls-remote origin HEAD
Matching hashes mean the update worked and only the restart is missing. Note
that git status in that checkout may report main as ahead of origin/main
even when it is identical: omarchy plugin update fetches with
git fetch origin HEAD, which records FETCH_HEAD without moving the
origin/main tracking ref that git status compares against. A plain
git -C "$P" fetch origin refreshes it.
Security and privacy
OmaDock runs with the user's permissions and keeps its command surface small:
- No
sudo,pkexec, telemetry, update checker, or runtime network access. - No edits to
~/.config/hypr/. - Application launches use resolved desktop entries and structured arguments.
- User configuration is treated as data, not shell code.
- No persistent helper process is required at idle.
License
OmaDock is licensed under the MIT License.