mirror of
https://github.com/omacom/omarchy.git
synced 2026-09-28 06:13:13 +08:00
3.6 KiB
3.6 KiB
Omarchy Shell Development
Read this before editing the Quickshell desktop under shell/.
The Quickshell desktop runs as a single long-running process out of
shell/. Hyprland autostart launches it directly with quickshell -n -p;
do not start additional standalone Quickshell instances for individual
components.
Run omarchy-restart-shell after making changes to QML files.
Plugin contract
- First-party plugins live directly under
shell/plugins/or one category level deeper, such asshell/plugins/panels/weather/. First-party bar-only widgets may use adjacent*.manifest.jsonfiles. Third-party plugins live at~/.config/omarchy/plugins/<id>/with amanifest.jsonat the root. - Every plugin manifest declares
schemaVersion,id,name,version,kinds, andentryPoints. Seedocs/omarchy-shell.mdandshell/services/PluginRegistry.qmlfor the current contract; fields such asactivationare optional. - Entry-point QML files are
Items (notShellRoot), and accept the shell-injected propertiesomarchyPath,shell,manifest, andpluginRegistry/barWidgetRegistryas appropriate. First-party plugins receive the host objects. Third-party plugins receive capability-scoped facades: ordinary plugins may look up and control only their own service and lifecycle, built-in clones retain narrow source-specific configuration and UI compatibility, menu plugins receive an application-library facade, and plugins can read detached scalar bar state; full-bar plugins additionally receive detached bar configuration and widget-catalog snapshots, narrow proxies for the non-authentication services used by built-in bar widgets, and lifecycle control over configured non-authentication UI plugins. Authentication capabilities must be stamped from trusted first-party manifests, and third-party registry views and bar configuration must be detached snapshots rather than shared objects. These facades reduce accidental authority but are not a same-process QML sandbox: a visual bar widget can walk its parent hierarchy to ordinary host objects. Authentication services must therefore remain outside bothShellRoot._servicesand the host QObject tree. Do not expose authentication services through new third-party-facing properties. - Panel / overlay / menu plugins must expose
open(payloadJson)andclose()lifecycle methods forshell summonandshell hide.
IPC
bin/omarchy-shellis the canonical IPC entry point. It forwards to the running shell and does not start it. Prefer it over re-implementing direct Quickshell socket calls in every CLI.- The
shellIPC target exposes lifecycle and configuration methods includingping,summon,hide,toggle,call,rescanPlugins,reloadConfig,setPluginEnabled, andlistPlugins.shell.qmlalso registersimage-selector, which drives theomarchy.image-pickerpanel. - Individual plugins register their own IPC targets, named for the plugin rather
than for where they appear: the background switcher registers
background, and bar widgets register one target each —omarchy.indicators,omarchy.system-update,omarchy.clock. There is nobartarget.
Editing widget files with glyphs
Widget files in shell/plugins/bar/widgets/ contain Nerd Font glyphs as raw
unicode characters. Agent file-editing tools can strip multi-byte codepoints
in some positions — do not rewrite widget files wholesale through those
tools. For glyph fixes, make a targeted edit with the surrounding context, or
use a Python script that inserts codepoints via chr(0xXXXXX).