How omarchy-menu.jsonc Defines Menu Entries with Shell Conditions
The omarchy-menu.jsonc file uses three optional fields—when, checked, and disabled—to conditionally render menu entries based on shell command exit codes and test expressions.
omarchy-menu.jsonc is a JSONC configuration file that powers the Omarchy desktop menu hierarchy. Located at default/omarchy/omarchy-menu.jsonc, it maps entry IDs to objects containing display properties and optional shell conditions. These conditions let the menu adapt dynamically to hardware capabilities, installed software, and user preferences without requiring procedural code changes.
The Three Shell Condition Fields
Omarchy supports three fields for conditional menu rendering. Each accepts a shell command or test expression that is evaluated when the menu is built.
| Field | Behavior | Shell Exit Code Interpretation |
|---|---|---|
when |
Show or hide the entire entry | Entry omitted if command returns non-zero |
checked |
Display a checkmark (✓) beside the label | Checkmark shown if command returns zero |
disabled |
Dim the entry and prevent selection | Entry dimmed if command returns zero |
These fields are documented in the file header at lines 16–20 of default/omarchy/omarchy-menu.jsonc.
How the when Field Controls Visibility
The when field determines whether an entry appears at all. This is useful for hardware-specific or toggle-dependent options.
Example: Conditional Sleep Entry
The system.suspend entry only appears when the suspend-off toggle is disabled:
"system.suspend": {
"icon": "",
"label": "Suspend",
"when": "! omarchy-toggle-enabled suspend-off",
"action": "systemctl suspend"
}
(source: omarchy-menu.jsonc#L38)
The ! negates the exit code of omarchy-toggle-enabled suspend-off. If the toggle is enabled (command returns 0), the ! makes the expression fail, and the entry is hidden.
Example: Laptop-Only Hardware Options
Display settings for laptop hardware use omarchy-hw-laptop to gate visibility:
"trigger.hardware.laptop-display": {
"icon": "",
"label": "Laptop Display",
"when": "omarchy-hw-laptop",
"action": "omarchy-hyprland-monitor-internal toggle"
}
(source: omarchy-menu.jsonc#L74)
How the checked Field Adds Checkmarks
The checked field marks an entry when its condition evaluates true, typically indicating a current setting or active configuration.
Example: Dell XPS Haptic Touchpad Level
This entry shows a checkmark when the haptic level is set to "low":
"trigger.hardware.touchpad-haptics.low": {
"icon": "",
"label": "low",
"when": "omarchy-hw-dell-xps-haptic-touchpad && omarchy-cmd-present dell-xps-touchpad-haptics",
"checked": "[[ \"$(dell-xps-touchpad-haptics get)\" == \"low\" ]]",
"action": "dell-xps-touchpad-haptics set low"
}
(source: omarchy-menu.jsonc#L79)
Note the combination: when ensures the hardware exists and the command is installed, while checked reflects the runtime state.
Example: Default Browser Selection
Menu entries for default browsers use checked to highlight the current selection:
"setup.default.browser.chromium": {
"icon": "",
"label": "Chromium",
"checked": "[[ \"$(omarchy-default-browser)\" == \"chromium\" ]]",
"action": "omarchy-default-browser chromium"
}
(source: omarchy-menu.jsonc#L51)
Example: DNS Configuration
Similarly, DNS provider entries check against the active configuration:
"setup.network.dns.cloudflare": {
"icon": "",
"label": "Cloudflare",
"checked": "[[ \"$(omarchy-dns)\" == \"Cloudflare\" ]]",
"action": "omarchy-dns Cloudflare"
}
(source: omarchy-menu.jsonc#L32)
How the disabled Field Dims Unavailable Entries
Unlike when, which hides entries entirely, disabled keeps them visible but inactive—useful for showing installed or completed states.
Example: Windows VM Installation
The Windows installation option dims when the VM desktop file already exists:
"install.windows": {
"icon": "",
"label": "Windows",
"disabled": "[[ -f $HOME/.local/share/applications/windows-vm.desktop ]]",
"action": "omarchy-launch-floating-terminal-with-presentation 'omarchy-windows-vm install'"
}
(source: omarchy-menu.jsonc#L14)
The [[ -f ... ]] test checks file existence. When true, the entry remains visible but cannot be selected.
Shell Environment and Helper Commands
Conditions in omarchy-menu.jsonc execute in the Omarchy shell environment, which provides several helper commands:
omarchy-toggle-enabled <name>— Check if a named toggle is activeomarchy-hw-laptop— Succeed if running on laptop hardwareomarchy-hw-dell-xps-haptic-touchpad— Detect specific Dell XPS hardwareomarchy-cmd-present <command>— Verify command availability in$PATHomarchy-default-browser— Return the currently configured default browseromarchy-dns— Return the active DNS provider
These utilities keep menu conditions readable and maintainable without inline shell complexity.
Runtime Evaluation in Menu.qml
The shell conditions are not parsed statically. The file shell/plugins/menu/Menu.qml implements the QML provider that:
- Reads
omarchy-menu.jsoncat menu launch - Executes each
when,checked, anddisabledexpression in a subshell - Constructs the final menu tree based on exit codes
This evaluation happens every time the menu opens, ensuring state changes (toggles, hardware events, configuration updates) reflect immediately without restarting the session.
Supported Shell Expression Patterns
Based on patterns in the source file, valid when/checked/disabled values include:
| Pattern Type | Example | Use Case |
|---|---|---|
| Simple command | "omarchy-hw-laptop" |
Hardware detection |
| Negation | "! omarchy-toggle-enabled suspend-off" |
Inverted toggle check |
| Command substitution | "[[ \"$(omarchy-dns)\" == \"Cloudflare\" ]]" |
Value comparison |
| File test | "[[ -f $HOME/.local/share/applications/windows-vm.desktop ]]" |
Installation state |
| Logical AND | "omarchy-hw-dell-xps-haptic-touchpad && omarchy-cmd-present dell-xps-touchpad-haptics" |
Compound conditions |
Summary
wheninomarchy-menu.jsonccontrols entry visibility based on shell exit codescheckedadds visual checkmarks when conditions evaluate truedisableddims entries without hiding them, indicating unavailable states- Conditions reference Omarchy helper commands like
omarchy-toggle-enabledandomarchy-default-browser - The QML provider at
shell/plugins/menu/Menu.qmlevaluates expressions at menu runtime - File location:
default/omarchy/omarchy-menu.jsonc(definition),docs/menu.md(schema documentation)
Frequently Asked Questions
Can I use arbitrary shell commands in omarchy-menu.jsonc conditions?
Yes. The when, checked, and disabled fields accept any valid shell expression. The Menu.qml provider executes them in a subshell and interprets the exit code. You can use compound tests, command substitution, variables, and logical operators—though for maintainability, the codebase prefers Omarchy's helper commands.
How do I debug why a menu entry isn't appearing?
Check the when condition directly in your terminal. Run the same expression and inspect the exit code with echo $?. A non-zero exit suppresses the entry. Also verify that required helper commands like omarchy-hw-laptop or omarchy-toggle-enabled are in your $PATH.
What's the difference between when and disabled?
when removes the entry entirely when its condition fails. disabled keeps the entry visible but grays it out and prevents selection. Use when for irrelevant options (hardware-specific features on incompatible systems). Use disabled for temporarily unavailable actions (already-installed software, missing prerequisites).
Where are the condition fields documented in the repository?
The schema documentation appears at the top of default/omarchy/omarchy-menu.jsonc (lines 16–20) and is expanded in docs/menu.md. The QML evaluation logic is implemented in shell/plugins/menu/Menu.qml.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →