- Two spaces for indentation, no tabs
- Use bash 5 conditionals: use
[[ ]]for string/file tests and(( ))for numeric tests - In
[[ ]], don't quote variables, but do quote string literals when comparing values (e.g.,[[ $branch == "dev" ]]) - Prefer
(( ))over numeric operators inside[[ ]](e.g.,(( count < 50 )), not[[ $count -lt 50 ]]) - For strings/paths with spaces, quote them instead of escaping spaces with
\(e.g.,"$APP_DIR/Disk Usage.desktop", not$APP_DIR/Disk\ Usage.desktop) - Shebangs must use
#!/bin/bashconsistently (never#!/usr/bin/env bash) - Scripts under
install/andmigrations/may be sourced and intentionally omit shebangs
All commands start with omarchy-. Prefixes indicate purpose.
The authoritative command group list lives in bin/omarchy in GROUP_DESCRIPTIONS. Keep GROUP_DESCRIPTIONS updated when adding a new command prefix.
Common prefixes include:
cmd-- check if commands exist, misc utility commandscapture-- screenshots, screen recordings, and other capture toolspkg-- package management helpershw-- hardware detection (return exit codes for use in conditionals)refresh-- copy default config to user's~/.config/restart-- restart a componentlaunch-- open applicationsinstall-- install optional softwaresetup-- interactive setup wizardstoggle-- toggle features on/offtheme-- theme managementupdate-- update components
Other current prefixes include:
ac-,audio-,battery-,branch-,brightness-,channel-,config-,debug-,dev-,drive-,first-,font-,haptic-,hibernation-,hook-,hyprland-,menu-,migrate-,notification-,npx-,plymouth-,powerprofiles-,reinstall-,remove-,screensaver-,show-,snapshot-,state-,sudo-,swayosd-,system-,transcode-,tui-,tz-,upload-,version-,voxtype-,webapp-,wifi-,windows-
Commands in bin/ can declare CLI metadata in comments near the top of the file. bin/omarchy scans the first 80 lines, and tests expect command metadata to remain valid.
Supported metadata keys:
# omarchy:summary=...- short help text# omarchy:group=...- command group when it differs from the filename-derived prefix# omarchy:name=...- command name within the group# omarchy:args=...- usage arguments# omarchy:examples=...- examples separated with|# omarchy:alias=.../# omarchy:aliases=...- alternate routes# omarchy:hidden=true- hide from default command listings# omarchy:requires-sudo=true- mark commands that require sudo
Prefer explicit metadata for user-facing commands. Keep routes consistent with the filename unless there is a deliberate alias or compatibility route.
Example:
# omarchy:summary=Take a screenshot
# omarchy:group=capture
# omarchy:args=[smart|region|windows|fullscreen] [slurp|copy]
# omarchy:examples=omarchy screenshot | omarchy capture screenshot region
# omarchy:aliases=omarchy screenshotInstall entry points (install.sh, boot.sh) use #!/bin/bash. Many scripts under install/ are sourced via run_logged and intentionally do not have shebangs.
Install stage files follow this pattern:
install/*/all.shlists scripts in execution order- leaf scripts are sourced by
run_logged $OMARCHY_INSTALL/path/to/script.sh - avoid
exitin sourced install scripts unless intentionally aborting the install - use
$OMARCHY_INSTALLand$OMARCHY_PATHinstead of hard-coded Omarchy paths - keep hardware-specific logic under
install/config/hardware/ - prefer helper commands for package and command checks where available
Raw command -v, pacman, and pacman-key are acceptable in bootstrap/preflight/package-helper contexts where the helper commands may not be available yet or where direct package-manager behavior is the point of the script.
Use these instead of raw shell commands:
omarchy-cmd-missing/omarchy-cmd-present- check for commandsomarchy-pkg-missing/omarchy-pkg-present- check for packagesomarchy-pkg-add- install packages (handles both pacman and AUR)omarchy-pkg-drop- remove packages; use this instead of rawpacman -R*omarchy-notification-send- send desktop notifications; do not callnotify-senddirectlyomarchy-hw-asus-rog- detect ASUS ROG hardware (and similarhw-*commands)
Exceptions are allowed for bootstrap, preflight, migration, and package-helper scripts where the helper may not be available yet, where the helper itself is being implemented, or where direct package-manager behavior is required.
config/- default configs copied to~/.config/default/themed/*.tpl- templates with{{ variable }}placeholders for theme colorsthemes/*/colors.toml- theme color definitions (accent, background, foreground, color0-15)
When making visual changes, such as Waybar styles or desktop appearance, always take and analyze a screenshot after applying the change to verify the result. Use omarchy capture screenshot fullscreen save for fullscreen screenshots.
For interactive UI work, use wtype to simulate keyboard input when available. Example: start the UI in the background, wait briefly for focus, then run wtype -k Right -k Return to exercise keyboard selection and confirm the resulting command output or state change. Prefer this over manual-only verification when a UI returns a selected value or changes a symlink/config.
When testing layer-shell UI, capture the reference and candidate states as separate screenshots, then compare them visually before further edits. If a launched UI would otherwise remain open, keep track of its PID and stop it after the screenshot; avoid broad process kills unless checking with ps first.
To copy a default config to user config with automatic backup:
omarchy-refresh-config hypr/hyprlock.confThis copies ~/.local/share/omarchy/config/hypr/hyprlock.conf to ~/.config/hypr/hyprlock.conf.
To create a new migration, run omarchy-dev-add-migration --no-edit. This creates a migration file named after the unix timestamp of the last commit.
New migration format:
- File permissions must be
0644(-rw-r--r--); migrations are sourced, not executed directly - No shebang line
- Start with an
echodescribing what the migration does - Use
$OMARCHY_PATHto reference the omarchy directory - Prefer helper commands such as
omarchy-cmd-present,omarchy-cmd-missing,omarchy-pkg-present, andomarchy-pkg-missing
Some older migrations predate these rules. Do not copy older migrations that start with shebangs, omit the leading echo, or hard-code ~/.local/share/omarchy.
Migrations may use raw pacman, command -v, or direct config edits when needed for historical compatibility or one-off repair work.
Example:
echo "Disable fingerprint in hyprlock if fingerprint auth is not configured"
if omarchy-cmd-missing fprintd-list || ! fprintd-list "$USER" 2>/dev/null | grep -q "finger"; then
sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = false/' ~/.config/hypr/hyprlock.conf
fi