Glass Bar
Version: 1.4.0
A frosted-glass replacement for the Omarchy status bar. The text color follows the active theme automatically: dark text on light themes and light text on dark themes. It updates live when the theme changes, including the text and icons rendered by bar widgets. Left-click empty center-bar space to toggle transparency.
<img width="2560" height="50" alt="image" src="https://github.com/user-attachments/assets/99176fea-6833-4669-aae2-295738fb8aef" />
Install
omarchy plugin add https://github.com/guiestrela/glassbar.git --enable
The --enable option activates Glass Bar and makes it the active bar.
Update
To update an existing installation from GitHub:
omarchy plugin update io.github.guiestrela.glassbar
Remove
To return to the default Omarchy bar and remove Glass Bar:
omarchy bar reset
omarchy plugin remove io.github.guiestrela.glassbar
Add --yes to the remove command to skip the confirmation prompt. Removing
the plugin deletes its installed checkout; it can be installed again with the
installation command above.
How it works
This is a Quickshell plugin loaded by the long-running omarchy-shell
process. The plugin is declared by manifest.json, which uses the ID
io.github.guiestrela.glassbar and the bar entry point in Bar.qml.
manifest.jsondeclares the plugin (id: io.github.guiestrela.glassbar,kind: bar) and points atBar.qmlas the entry point.Bar.qmlcontains the custom bar implementation loaded by the omarchy-shell host.widgets/holds the bar widgets bundled with Glass Bar, with sibling manifests.indicators/holds the indicators used by the bar.- The bar receives its config from the host shell as a
barConfigproperty; the host loads it from~/.config/omarchy/shell.json. - Commands such as
omarchy bar positionupdate only the usershell.jsonfile.
Theme-aware text color
Glass Bar reads the active theme's bar.text color through Omarchy's shared
color palette. Changing themes updates the bar text and widget foregrounds
without requiring a plugin reinstall. Custom widgets can use bar.foreground
to inherit the same live-updating color.
Fonts
Glass Bar follows Omarchy's active monospace font through Style.font.family.
Widgets receive the same value through bar.fontFamily, so changing the system
font with omarchy-font-set updates the bar and its tooltips without editing the
plugin or shell.json.
Security
Custom QML modules are executable code and are limited to
~/.config/omarchy/bar/modules/ and ~/.config/omarchy/plugins/. Paths with
parent-directory traversal or non-QML extensions are ignored. Command modules
remain an explicit advanced feature: their exec and click-action values are
run by the user's shell, so only use commands from configuration you trust.
Plugin service compatibility
Glass Bar provides a generic bridge for third-party plugins that declare both
bar-widget and service kinds. Omarchy 4.0.x removes the private
__sourceDir field before injecting a third-party service manifest; the bridge
reads the plugin's validated manifest from its user plugin directory, restores
that private path, and exposes the resulting service only to its owning widget.
Plugins without a service continue to use the normal bar surface. The generic
path is driven entirely by manifest metadata and contains no plugin-specific
IDs or service adapters.
Customizing
The bar config lives under the bar key of ~/.config/omarchy/shell.json. Once you customize anything via the bar gestures, omarchy bar ..., or by editing shell.json directly, your file is canonical — there is no deep-merge.
The bar is configured directly on the bar itself: drag empty bar space (or click-and-hold) to move the bar to another screen edge, left-click empty center-bar space to toggle the glass/transparency effect, and drag widgets to reorder them. Use the sliders button at the far end of the bar to choose its position (top, bottom, left, or right), screen span (100%, 80%, or 60%), thickness (compact, standard, or large), and surface shape (square, rounded, or pill); selections are saved in shell.json. For top/bottom bars the span controls screen width; for left/right bars it controls screen height. The omarchy bar position, omarchy bar transparent, omarchy bar move, and omarchy bar set commands do the same from scripts. Enable or disable widgets with omarchy plugin enable and omarchy plugin disable (widget ids come from omarchy plugin list).
Example shell.json (bar subtree only shown):
{
"version": 1,
"bar": {
"position": "top",
"size": "standard",
"shape": "rounded",
"length": "full",
"transparent": false,
"centerAnchor": "omarchy.clock",
"layout": {
"left": [
{ "id": "omarchy.menu" },
{ "id": "omarchy.spacer", "size": 12 },
{ "id": "omarchy.workspaces" }
],
"center": [
{ "id": "omarchy.media" },
{ "id": "omarchy.clock", "format": "HH:mm" }
],
"right": [
{ "id": "omarchy.audio" },
{ "id": "omarchy.power" }
]
}
}
}
centerAnchor pins one center module to the exact horizontal/vertical center and flanks others around it. Set to an empty string to disable anchoring (the center list is centered as a group).
Module catalogue
First-party interactive widgets
| Name | What it does | Interactions |
|---|---|---|
omarchy.menu |
Omarchy menu launcher | left = menu · right = terminal |
omarchy.workspaces |
Hyprland workspace switcher | left = focus workspace |
omarchy.clock |
Date/time label + popup with a month grid, ISO week numbers, and month stepping | left = popup · right = cycle label format · middle = timezone selector |
omarchy.media |
MPRIS now-playing — scrolling track + artist, cover-art popup | left = play/pause · middle = next · scroll = prev/next · right = popup |
omarchy.indicators |
Manual state indicators | left = indicator action |
omarchy.system-update |
Available update indicator | left = update |
omarchy.tray |
System tray | hover = reveal drawer · right on chevron = manage |
omarchy.weather |
Weather icon + popup with forecast | left = popup · right = full notification |
omarchy.microphone |
Mic icon + scroll volume | left = mute toggle · middle = audio panel · scroll = source volume |
| omarchy.audio | Volume icon + popup with master slider, output-device picker, per-app mixer | left = popup · right = mute · middle = popup · scroll = volume |
| omarchy.network | Wi-Fi/Ethernet icon + popup with Wi-Fi scan, signal, connect, DNS provider selection | left = popup |
| omarchy.tailscale | Tailscale status, connection switcher, machine browser, and copy actions | left = popup · right = toggle · middle = refresh |
| omarchy.agents | AI coding agent limits with pace, today, last week, and all-time model breakdown | left = panel · right = launch agent · middle = next subscription |
| omarchy.power | Battery/AC icon + popup with battery stats, power profiles, and system info | left = popup · right = toggle percentage |
| omarchy.bluetooth | Bluetooth icon + popup with device list, connect/disconnect, battery | left = popup · right = toggle radio |
| omarchy.monitor | Brightness and laptop display controls | left = popup |
The omarchy.indicators widget loads individual bar indicators from indicators/. Omit items (or set it to an empty array) to show all indicators in the default order, or set items to a subset such as ["Dnd", "Reminder", "NightLight"]. Set alwaysShow to true to keep inactive indicators visible instead of revealing them only on hover. Multiple omarchy.indicators instances are allowed, so different sections can show different subsets.
Orientation
All widgets work in top, bottom, left, and right positions. Popups anchor on the side opposite the bar edge, sliding into the workspace. Vertical bars use 28px width; widgets that show text fall back to compact icon-only forms (e.g. media hides its scrolling label).
Custom user modules
The schema accepts arbitrary module ids that you provide. Set type to command for shell-driven output or qml for a custom QML widget. Both still go under bar.layout.<section> in shell.json.
Command module:
{
"version": 1,
"bar": {
"layout": {
"right": [
{ "id": "omarchy.tray" },
{ "id": "vpn", "type": "command", "exec": "~/.config/omarchy/bar/scripts/vpn-status", "interval": 5, "tooltip": "VPN", "onClick": "nm-connection-editor" },
{ "id": "omarchy.audio" }
]
}
}
}
The command may print plain text or Waybar-style JSON, for example:
{"text":"","tooltip":"Work VPN","class":"active"}
QML module:
{
"version": 1,
"bar": {
"layout": {
"right": [
{ "id": "gpu", "type": "qml" },
{ "id": "omarchy.audio" }
]
}
}
}
Then create ~/.config/omarchy/bar/modules/gpu.qml. If you want to store it in
another allowed user module directory, add a source path under
~/.config/omarchy/bar/modules/ or ~/.config/omarchy/plugins/.
Custom QML modules should be an Item with implicitWidth and implicitHeight. They may optionally define these properties, which the bar fills after loading:
import QtQuick
Item {
property var bar
property string moduleName
property var settings
implicitWidth: 28
implicitHeight: bar ? bar.barSize : 26
Text {
anchors.centerIn: parent
text: "GPU"
color: bar ? bar.foreground : "white"
font.family: bar ? bar.fontFamily : "monospace"
font.pixelSize: 12
}
MouseArea {
anchors.fill: parent
onClicked: if (bar) bar.run("omarchy-launch-or-focus-tui btop")
}
}
Bar properties available to widgets
Widgets receive bar (the shell root), moduleName (string), and settings (object) injected at load time. The bar exposes:
bar.foreground,bar.background,bar.urgent— theme colors (live-updated)bar.fontFamily— current monospace familybar.position—"top" | "bottom" | "left" | "right"bar.vertical— boolean shortcutbar.barSize— 26 horizontal / 28 verticalbar.run(command)— fire-and-forget bash execbar.shellQuote(value)— safe shell-quote a stringbar.showTooltip(target, text)/bar.hideTooltip(target)— shared tooltip popupbar.requestPopout(owner)/bar.releasePopout(owner)— one-popup-at-a-time coordinator
Bar widgets are manifest-backed just like other Omarchy plugins.
Simple widgets carry sibling manifests such as widgets/Workspaces.manifest.json;
richer popup plugins live in feature directories such as ../panels/audio/,
../panels/network/, and ../agents/; and feature plugins such as
omarchy.menu and omarchy.media declare their bar-widget entry points in their own
manifest.json. Bar layout ids are namespaced, e.g. omarchy.audio,
omarchy.network, and omarchy.clock. Older UpperCamelCase ids such as
AudioPanel and Clock are migrated forward; new configs should use the
namespaced ids.
Third-party widgets can be installed under
~/.config/omarchy/plugins/<plugin-id>/ with their own manifest.json.
After installing one, rescan, enable, and place it with
omarchy-shell shell rescanPlugins, omarchy plugin enable, and
omarchy bar move.