- 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-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.
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