Omahub
← All plugins
G

Glass Bar

by Guiestrela

A theme-aware frosted-glass Omarchy bar with generic plugin service compatibility, secure custom module paths, and live font support.

Security review

No obvious issues detected

Deterministic scan — not a security guarantee

None
Risk level
None
Analyzed commit
47e0b8a
Scanned
5 days ago

No potentially dangerous behavior detected in the analyzed commit.

Automated analysis only — not a security guarantee.

AI advisory review

No obvious issues detected

Language-model assessment · ~deepseek/deepseek-v4-flash-latest — advisory only

Low
AI risk level
Low
Recommendation
install
Model
~deepseek/deepseek-v4-flash-latest
Analyzed commit
47e0b8a
Reviewed
5 days ago

The plugin is a well-structured bar replacement with careful path validation for custom modules and plugin services. It runs standard system commands for indicators and widgets, and the command-module feature is explicitly user-controlled. No malicious or obfuscated code was found.

  • Command modules execute shell commands from user configuration; users should only use trusted config.
  • The service bridge loads third-party plugin QML, but it validates the manifest and entry point and restricts to the user plugin directory.
How this check works

This review combines the deterministic scan (the rule-based results above) with an independent look at the plugin's code by a language model. The model reads a trimmed sample of the repository's files, the manifest, and the README, then gives a plain-language risk level and a recommendation: install (no notable danger), review (look closer first), or avoid (clearly dangerous).

It runs on the same analyzed commit as the deterministic scan and is strictly advisory — it is not a security guarantee and never blocks a plugin by itself. A human moderator still reviews plugins before they are listed.

AI advisory only — automated analysis, not a security guarantee.

Install
$ omarchy plugin add https://github.com/guiestrela/glassbar --enable
Appearance #bar

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" />

Glass Bar preview

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.json declares the plugin (id: io.github.guiestrela.glassbar, kind: bar) and points at Bar.qml as the entry point.
  • Bar.qml contains 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 barConfig property; the host loads it from ~/.config/omarchy/shell.json.
  • Commands such as omarchy bar position update only the user shell.json file.

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 family
  • bar.position — "top" | "bottom" | "left" | "right"
  • bar.vertical — boolean shortcut
  • bar.barSize — 26 horizontal / 28 vertical
  • bar.run(command) — fire-and-forget bash exec
  • bar.shellQuote(value) — safe shell-quote a string
  • bar.showTooltip(target, text) / bar.hideTooltip(target) — shared tooltip popup
  • bar.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.