From a99030e6edc34c3621c3c1d6e95d6c4a1f6ab019 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 5 May 2026 18:49:14 +0200 Subject: [PATCH 001/111] Revert "Fix overly dark catppuccin borders in neovim" This reverts commit c97dbb8ea149baa045b926c2b6701e9621fb6115. --- themes/catppuccin/neovim.lua | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/themes/catppuccin/neovim.lua b/themes/catppuccin/neovim.lua index 83d07f86..f22267d6 100644 --- a/themes/catppuccin/neovim.lua +++ b/themes/catppuccin/neovim.lua @@ -2,24 +2,7 @@ return { { "catppuccin/nvim", name = "catppuccin", - lazy = false, priority = 1000, - config = function() - require("catppuccin").setup() - - local function brighten_borders() - for _, group in ipairs({ "FloatBorder", "WinSeparator" }) do - vim.api.nvim_set_hl(0, group, { fg = "#6c7086" }) - end - end - - vim.api.nvim_create_autocmd("ColorScheme", { - pattern = "catppuccin*", - callback = brighten_borders, - }) - - brighten_borders() - end, }, { "LazyVim/LazyVim", From 4dd25423291f89be0f7823685c3af00b4d3bd4bf Mon Sep 17 00:00:00 2001 From: Joel Corbalan Date: Tue, 5 May 2026 13:51:00 -0300 Subject: [PATCH 002/111] Theme Catppuccin: Fixed colorscheme name (#5572) --- themes/catppuccin/neovim.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/catppuccin/neovim.lua b/themes/catppuccin/neovim.lua index f22267d6..f0d503f9 100644 --- a/themes/catppuccin/neovim.lua +++ b/themes/catppuccin/neovim.lua @@ -7,7 +7,7 @@ return { { "LazyVim/LazyVim", opts = { - colorscheme = "catppuccin", + colorscheme = "catppuccin-nvim", }, }, } From 4ac9c99a8e875c57fe864369da3f2d84d02167c7 Mon Sep 17 00:00:00 2001 From: Ilya Zarubin <36898027+ilyaZar@users.noreply.github.com> Date: Tue, 5 May 2026 18:53:54 +0200 Subject: [PATCH 003/111] fix: typo themeing -> theming (#5593) --- migrations/1767478687.sh | 2 +- migrations/1769510847.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/migrations/1767478687.sh b/migrations/1767478687.sh index e10e3d58..3793cb1b 100644 --- a/migrations/1767478687.sh +++ b/migrations/1767478687.sh @@ -1,4 +1,4 @@ -echo "Add opencode with system themeing" +echo "Add opencode with system theming" omarchy-pkg-add opencode diff --git a/migrations/1769510847.sh b/migrations/1769510847.sh index d9c5b260..5ddfd508 100644 --- a/migrations/1769510847.sh +++ b/migrations/1769510847.sh @@ -1,4 +1,4 @@ -echo "Switch back to mainline chromium now that it supports full live themeing" +echo "Switch back to mainline chromium now that it supports full live theming" if omarchy-pkg-present omarchy-chromium; then if gum confirm "Ready to switch to mainstream chromium? (Will close Chromium + reset settings)"; then From 581719c64f26c7c3fb1cfb1b89ed8770284aa682 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 5 May 2026 18:59:39 +0200 Subject: [PATCH 004/111] Default to visible third column in scrolling mode but suggest how to make it one --- config/hypr/looknfeel.conf | 6 ++++++ default/hypr/looknfeel.conf | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/config/hypr/looknfeel.conf b/config/hypr/looknfeel.conf index f4a2c00c..ea30461d 100644 --- a/config/hypr/looknfeel.conf +++ b/config/hypr/looknfeel.conf @@ -32,3 +32,9 @@ layout { # Avoid overly wide single-window layouts on wide screens # single_window_aspect_ratio = 1 1 } + +# https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ +scrolling { + # See only one column per screen instead of two + # column_width = 0.97 +} diff --git a/default/hypr/looknfeel.conf b/default/hypr/looknfeel.conf index ab2567c9..2a7792eb 100644 --- a/default/hypr/looknfeel.conf +++ b/default/hypr/looknfeel.conf @@ -113,6 +113,10 @@ dwindle { force_split = 2 # Always split on the right } +scrolling { + column_width = 0.47 +} + # See https://wiki.hypr.land/Configuring/Layouts/Master-Layout/ for more master { new_status = master From 37a7913f3d2c0b3bdc276fc1948170e7bde9cc39 Mon Sep 17 00:00:00 2001 From: Pierre Olivier Martel Date: Tue, 5 May 2026 15:17:27 -0400 Subject: [PATCH 005/111] Bundle Zed editor with omazed for themes syncing (#4873) * Install Zed Editor with omazed for themes syncing * Move Zed theme switching into Omarchy * Launch zed after install * revert * forgot omazed! * omazed is now on OPR --------- Co-authored-by: David Heinemeier Hansson --- bin/omarchy-install-zed | 11 +++++++++++ bin/omarchy-menu | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100755 bin/omarchy-install-zed diff --git a/bin/omarchy-install-zed b/bin/omarchy-install-zed new file mode 100755 index 00000000..427659d2 --- /dev/null +++ b/bin/omarchy-install-zed @@ -0,0 +1,11 @@ +#!/bin/bash + +# Install Zed Editor and omazed to use the current Omarchy theme. + +echo "Installing Zed Editor..." +omarchy-pkg-add zed omazed + +# Apply Omarchy theme to Zed +omazed setup + +setsid gtk-launch dev.zed.Zed diff --git a/bin/omarchy-menu b/bin/omarchy-menu index 1ffa081c..cf871ab5 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -385,7 +385,7 @@ show_install_editor_menu() { case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Emacs") in *VSCode*) present_terminal omarchy-install-vscode ;; *Cursor*) install_and_launch "Cursor" "cursor-bin" "cursor" ;; - *Zed*) install_and_launch "Zed" "zed" "dev.zed.Zed" ;; + *Zed*) present_terminal omarchy-install-zed ;; *Sublime*) install_and_launch "Sublime Text" "sublime-text-4" "sublime_text" ;; *Helix*) present_terminal omarchy-install-helix ;; *Emacs*) install "Emacs" "emacs-wayland" && systemctl --user enable --now emacs.service ;; From cd30fd094eb42f2f88e77bf53a8037b72a2e82f2 Mon Sep 17 00:00:00 2001 From: Miha Rekar Date: Tue, 5 May 2026 21:18:09 +0200 Subject: [PATCH 006/111] Add support for Studio Display XDR (#5599) --- bin/omarchy-hyprland-monitor-focused-apple | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/omarchy-hyprland-monitor-focused-apple b/bin/omarchy-hyprland-monitor-focused-apple index 1593c828..99dd55e8 100755 --- a/bin/omarchy-hyprland-monitor-focused-apple +++ b/bin/omarchy-hyprland-monitor-focused-apple @@ -2,4 +2,4 @@ # omarchy:summary=Return success if the focused Hyprland monitor is an Apple display. -hyprctl monitors -j | jq -e '.[] | select(.focused == true) | select(.make == "Apple Computer Inc" and (.model | test("StudioDisplay|ProDisplayXDR")))' >/dev/null +hyprctl monitors -j | jq -e '.[] | select(.focused == true) | select(.make == "Apple Computer Inc" and (.model | test("StudioDisplay|ProDisplayXDR|Studio XDR")))' >/dev/null From 7debca9f477500d650187a8a160b871bb31c38e9 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 5 May 2026 22:18:02 +0200 Subject: [PATCH 007/111] Add foot terminal as an option --- applications/foot-server.desktop | 4 +++ applications/foot.desktop | 21 +++++++++++++++ applications/footclient.desktop | 4 +++ bin/omarchy-font-set | 8 ++++++ bin/omarchy-install-terminal | 16 ++++++++---- bin/omarchy-launch-screensaver | 8 +++++- bin/omarchy-menu | 3 ++- bin/omarchy-theme-set | 1 + bin/omarchy-theme-set-foot | 27 +++++++++++++++++++ config/foot/foot.ini | 19 ++++++++++++++ config/hypr/input.conf | 2 +- default/foot/screensaver.ini | 7 +++++ default/hypr/apps/system.conf | 2 +- default/hypr/apps/terminals.conf | 2 +- default/omarchy-skill/SKILL.md | 7 ++--- default/themed/foot.ini.tpl | 25 ++++++++++++++++++ migrations/1778008689.sh | 45 ++++++++++++++++++++++++++++++++ 17 files changed, 188 insertions(+), 13 deletions(-) create mode 100644 applications/foot-server.desktop create mode 100644 applications/foot.desktop create mode 100644 applications/footclient.desktop create mode 100755 bin/omarchy-theme-set-foot create mode 100644 config/foot/foot.ini create mode 100644 default/foot/screensaver.ini create mode 100644 default/themed/foot.ini.tpl create mode 100644 migrations/1778008689.sh diff --git a/applications/foot-server.desktop b/applications/foot-server.desktop new file mode 100644 index 00000000..0ab86d65 --- /dev/null +++ b/applications/foot-server.desktop @@ -0,0 +1,4 @@ +[Desktop Entry] +Type=Application +Name=Foot Server +NoDisplay=true diff --git a/applications/foot.desktop b/applications/foot.desktop new file mode 100644 index 00000000..b9f6676a --- /dev/null +++ b/applications/foot.desktop @@ -0,0 +1,21 @@ +[Desktop Entry] +Type=Application +TryExec=foot +Exec=foot +Icon=foot +Terminal=false +Categories=System;TerminalEmulator; +Name=Foot +GenericName=Terminal +Comment=A fast, lightweight and minimalistic Wayland terminal emulator +StartupNotify=true +StartupWMClass=foot +Actions=New; +X-TerminalArgExec=-e +X-TerminalArgAppId=--app-id= +X-TerminalArgTitle=--title= +X-TerminalArgDir=--working-directory= + +[Desktop Action New] +Name=New Terminal +Exec=foot diff --git a/applications/footclient.desktop b/applications/footclient.desktop new file mode 100644 index 00000000..e4590087 --- /dev/null +++ b/applications/footclient.desktop @@ -0,0 +1,4 @@ +[Desktop Entry] +Type=Application +Name=Foot Client +NoDisplay=true diff --git a/bin/omarchy-font-set b/bin/omarchy-font-set index 2327d341..44bb9833 100755 --- a/bin/omarchy-font-set +++ b/bin/omarchy-font-set @@ -22,6 +22,10 @@ if [[ -n $font_name ]]; then pkill -SIGUSR2 ghostty fi + if [[ -f ~/.config/foot/foot.ini ]]; then + sed -i "s/^font=.*/font=$font_name:size=9/g" ~/.config/foot/foot.ini + fi + sed -i "s/font_family = .*/font_family = $font_name/g" ~/.config/hypr/hyprlock.conf sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/waybar/style.css sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/swayosd/style.css @@ -37,6 +41,10 @@ if [[ -n $font_name ]]; then notify-send -u low " You must restart Ghostty to see font change" fi + if pgrep -x foot; then + notify-send -u low " You must restart Foot to see font change" + fi + omarchy-hook font-set "$font_name" else echo "Font '$font_name' not found." diff --git a/bin/omarchy-install-terminal b/bin/omarchy-install-terminal index 146e4167..15a869d1 100755 --- a/bin/omarchy-install-terminal +++ b/bin/omarchy-install-terminal @@ -1,11 +1,11 @@ #!/bin/bash # omarchy:summary=Install one of the approved terminals and set it as the default for Omarchy (Super + Return etc). -# omarchy:args= +# omarchy:args= # omarchy:requires-sudo=true if (($# == 0)); then - echo "Usage: omarchy-install-terminal [alacritty|ghostty|kitty]" + echo "Usage: omarchy-install-terminal [alacritty|foot|ghostty|kitty]" exit 1 fi @@ -14,6 +14,7 @@ package="$1" # Map package name to desktop entry ID case "$package" in alacritty) desktop_id="Alacritty.desktop" ;; +foot) desktop_id="foot.desktop" ;; ghostty) desktop_id="com.mitchellh.ghostty.desktop" ;; kitty) desktop_id="kitty.desktop" ;; *) @@ -26,10 +27,15 @@ echo "Installing $package..." # Install package if omarchy-pkg-add $package; then - # Copy custom desktop entry for alacritty with X-TerminalArg* keys - if [[ $package == "alacritty" ]]; then + # Copy custom desktop entries with X-TerminalArg* keys + if [[ $package == "alacritty" || $package == "foot" ]]; then mkdir -p ~/.local/share/applications - cp $OMARCHY_PATH/applications/Alacritty.desktop ~/.local/share/applications/ + cp "$OMARCHY_PATH/applications/$desktop_id" ~/.local/share/applications/ + fi + + # Copy default config for optional terminals when missing + if [[ ! -e ~/.config/$package ]]; then + cp -Rpf "$OMARCHY_PATH/config/$package" ~/.config/ fi # Update xdg-terminals.list to prioritize the proper terminal diff --git a/bin/omarchy-launch-screensaver b/bin/omarchy-launch-screensaver index e3593ba5..0cd64a70 100755 --- a/bin/omarchy-launch-screensaver +++ b/bin/omarchy-launch-screensaver @@ -37,6 +37,12 @@ for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do --font-size=18 \ -e omarchy-screensaver ;; + *foot*) + hyprctl dispatch exec -- \ + foot --app-id=org.omarchy.screensaver \ + --config="$OMARCHY_PATH/default/foot/screensaver.ini" \ + -e omarchy-screensaver + ;; *kitty*) hyprctl dispatch exec -- \ kitty --class=org.omarchy.screensaver \ @@ -45,7 +51,7 @@ for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do -e omarchy-screensaver ;; *) - notify-send -u low "✋ Screensaver only runs in Alacritty, Ghostty, or Kitty" + notify-send -u low "✋ Screensaver only runs in Alacritty, Foot, Ghostty, or Kitty" ;; esac done diff --git a/bin/omarchy-menu b/bin/omarchy-menu index cf871ab5..abe01a5e 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -394,8 +394,9 @@ show_install_editor_menu() { } show_install_terminal_menu() { - case $(menu "Install" " Alacritty\n Ghostty\n Kitty") in + case $(menu "Install" " Alacritty\n Foot\n Ghostty\n Kitty") in *Alacritty*) install_terminal "alacritty" ;; + *Foot*) install_terminal "foot" ;; *Ghostty*) install_terminal "ghostty" ;; *Kitty*) install_terminal "kitty" ;; *) show_install_menu ;; diff --git a/bin/omarchy-theme-set b/bin/omarchy-theme-set index 9b664af0..555e6e40 100755 --- a/bin/omarchy-theme-set +++ b/bin/omarchy-theme-set @@ -62,6 +62,7 @@ omarchy-restart-mako omarchy-restart-helix # Change app-specific themes +omarchy-theme-set-foot omarchy-theme-set-gnome omarchy-theme-set-browser omarchy-theme-set-vscode diff --git a/bin/omarchy-theme-set-foot b/bin/omarchy-theme-set-foot new file mode 100755 index 00000000..eb11f9c4 --- /dev/null +++ b/bin/omarchy-theme-set-foot @@ -0,0 +1,27 @@ +#!/bin/bash + +# omarchy:summary=Apply current Omarchy theme colors to running Foot terminals + +foot_theme=~/.config/omarchy/current/theme/foot.ini + +if [[ ! -f $foot_theme ]] || ! pgrep -x foot >/dev/null; then + exit 0 +fi + +foot_osc=$(awk -F= ' + function color(value) { return "#" value } + /^foreground=/ { printf "\033]10;%s\007", color($2) } + /^background=/ { printf "\033]11;%s\007", color($2) } + /^cursor=/ { split($2, parts, " "); printf "\033]12;%s\007", color(parts[2]) } + /^selection-background=/ { printf "\033]17;%s\007", color($2) } + /^selection-foreground=/ { printf "\033]19;%s\007", color($2) } + /^regular[0-7]=/ { split($1, parts, "regular"); printf "\033]4;%d;%s\007", parts[2], color($2) } + /^bright[0-7]=/ { split($1, parts, "bright"); printf "\033]4;%d;%s\007", parts[2] + 8, color($2) } +' "$foot_theme") + +for foot_pid in $(pgrep -x foot); do + for child_pid in $(pgrep -P "$foot_pid"); do + tty=$(readlink "/proc/$child_pid/fd/1" 2>/dev/null) + [[ $tty == /dev/pts/* ]] && printf '%b' "$foot_osc" >"$tty" + done +done diff --git a/config/foot/foot.ini b/config/foot/foot.ini new file mode 100644 index 00000000..9cbd91ec --- /dev/null +++ b/config/foot/foot.ini @@ -0,0 +1,19 @@ +[main] +include=~/.config/omarchy/current/theme/foot.ini +term=xterm-256color +font=JetBrainsMono Nerd Font:size=9 +pad=14x14 +initial-window-mode=windowed +workers=0 + +[scrollback] +lines=10000 + +[cursor] +style=block +blink=no + +[key-bindings] +clipboard-copy=Control+Insert +primary-paste=none +clipboard-paste=Shift+Insert diff --git a/config/hypr/input.conf b/config/hypr/input.conf index 36fb4403..ad15ddaf 100644 --- a/config/hypr/input.conf +++ b/config/hypr/input.conf @@ -41,7 +41,7 @@ input { } # Scroll nicely in the terminal -windowrule = match:class (Alacritty|kitty), scroll_touchpad 1.5 +windowrule = match:class (Alacritty|kitty|foot), scroll_touchpad 1.5 windowrule = match:class com.mitchellh.ghostty, scroll_touchpad 0.2 # Enable touchpad gestures for changing workspaces diff --git a/default/foot/screensaver.ini b/default/foot/screensaver.ini new file mode 100644 index 00000000..7130d069 --- /dev/null +++ b/default/foot/screensaver.ini @@ -0,0 +1,7 @@ +[main] +font=JetBrainsMono Nerd Font:size=18 +pad=0x0 + +[colors-dark] +background=000000 +foreground=ffffff diff --git a/default/hypr/apps/system.conf b/default/hypr/apps/system.conf index 443fb069..6f82aa35 100644 --- a/default/hypr/apps/system.conf +++ b/default/hypr/apps/system.conf @@ -3,7 +3,7 @@ windowrule = float on, match:tag floating-window windowrule = center on, match:tag floating-window windowrule = size 875 600, match:tag floating-window -windowrule = tag +floating-window, match:class (org.omarchy.bluetui|org.omarchy.impala|org.omarchy.wiremix|org.omarchy.btop|org.omarchy.terminal|org.omarchy.bash|org.gnome.NautilusPreviewer|org.gnome.Evince|com.gabm.satty|Omarchy|About|TUI.float|imv|mpv) +windowrule = tag +floating-window, match:class (org.omarchy.bluetui|org.omarchy.impala|org.omarchy.wiremix|org.omarchy.btop|org.omarchy.terminal|org.omarchy.bash|org.codeberg.dnkl.foot|org.gnome.NautilusPreviewer|org.gnome.Evince|com.gabm.satty|Omarchy|About|TUI.float|imv|mpv) windowrule = tag +floating-window, match:class (xdg-desktop-portal-gtk|sublime_text|DesktopEditors|org.gnome.Nautilus), match:title ^(Open.*Files?|Open [F|f]older.*|Save.*Files?|Save.*As|Save|All Files|.*wants to [open|save].*|[C|c]hoose.*) windowrule = float on, match:class org.gnome.Calculator diff --git a/default/hypr/apps/terminals.conf b/default/hypr/apps/terminals.conf index ead08dde..b4940720 100644 --- a/default/hypr/apps/terminals.conf +++ b/default/hypr/apps/terminals.conf @@ -1,4 +1,4 @@ # Define terminal tag to style them uniformly -windowrule = tag +terminal, match:class (Alacritty|kitty|com.mitchellh.ghostty) +windowrule = tag +terminal, match:class (Alacritty|kitty|com.mitchellh.ghostty|foot) windowrule = tag -default-opacity, match:tag terminal windowrule = opacity 0.97 0.9, match:tag terminal diff --git a/default/omarchy-skill/SKILL.md b/default/omarchy-skill/SKILL.md index db09dcd4..5f9d5a7e 100644 --- a/default/omarchy-skill/SKILL.md +++ b/default/omarchy-skill/SKILL.md @@ -3,7 +3,7 @@ name: omarchy description: > REQUIRED for end-user customization of Linux desktop, window manager, or system config. Use when editing ~/.config/hypr/, ~/.config/waybar/, ~/.config/walker/, - ~/.config/alacritty/, ~/.config/kitty/, ~/.config/ghostty/, ~/.config/mako/, + ~/.config/alacritty/, ~/.config/foot/, ~/.config/kitty/, ~/.config/ghostty/, ~/.config/mako/, or ~/.config/omarchy/. Triggers: Hyprland, window rules, animations, keybindings, monitors, gaps, borders, blur, opacity, waybar, walker, terminal config, themes, wallpaper, night light, idle, lock screen, screenshots, layer rules, workspace @@ -24,7 +24,7 @@ It is not for contributing to Omarchy source code. - Editing ANY file in `~/.config/hypr/` (window rules, animations, keybindings, monitors, etc.) - Editing ANY file in `~/.config/waybar/`, `~/.config/walker/`, `~/.config/mako/` -- Editing terminal configs (alacritty, kitty, ghostty) +- Editing terminal configs (alacritty, foot, kitty, ghostty) - Editing ANY file in `~/.config/omarchy/` - Window behavior, animations, opacity, blur, gaps, borders - Layer rules, workspace settings, display/monitor configuration @@ -78,7 +78,7 @@ Omarchy is built on: | **Hyprland** | Wayland compositor/WM | `~/.config/hypr/` | | **Waybar** | Status bar | `~/.config/waybar/` | | **Walker** | App launcher | `~/.config/walker/` | -| **Alacritty/Kitty/Ghostty** | Terminals | `~/.config//` | +| **Alacritty/Foot/Kitty/Ghostty** | Terminals | `~/.config//` | | **Mako** | Notifications | `~/.config/mako/` | | **SwayOSD** | On-screen display | `~/.config/swayosd/` | @@ -163,6 +163,7 @@ Run `omarchy --help` for the full list. The most common groups: ``` ~/.config/alacritty/alacritty.toml +~/.config/foot/foot.ini ~/.config/kitty/kitty.conf ~/.config/ghostty/config ``` diff --git a/default/themed/foot.ini.tpl b/default/themed/foot.ini.tpl new file mode 100644 index 00000000..c56dc610 --- /dev/null +++ b/default/themed/foot.ini.tpl @@ -0,0 +1,25 @@ +[colors-dark] +foreground={{ foreground_strip }} +background={{ background_strip }} +selection-foreground={{ selection_foreground_strip }} +selection-background={{ selection_background_strip }} + +cursor={{ background_strip }} {{ cursor_strip }} + +regular0={{ color0_strip }} +regular1={{ color1_strip }} +regular2={{ color2_strip }} +regular3={{ color3_strip }} +regular4={{ color4_strip }} +regular5={{ color5_strip }} +regular6={{ color6_strip }} +regular7={{ color7_strip }} + +bright0={{ color8_strip }} +bright1={{ color9_strip }} +bright2={{ color10_strip }} +bright3={{ color11_strip }} +bright4={{ color12_strip }} +bright5={{ color13_strip }} +bright6={{ color14_strip }} +bright7={{ color15_strip }} diff --git a/migrations/1778008689.sh b/migrations/1778008689.sh new file mode 100644 index 00000000..dbe97743 --- /dev/null +++ b/migrations/1778008689.sh @@ -0,0 +1,45 @@ +echo "Add Foot terminal config and theme support" + +if [[ ! -f ~/.config/foot/foot.ini ]]; then + mkdir -p ~/.config/foot + cp -Rpf "$OMARCHY_PATH/config/foot/foot.ini" ~/.config/foot/foot.ini +elif ! grep -q "^primary-paste=none" ~/.config/foot/foot.ini; then + sed -i '/^clipboard-copy=Control+Insert/a primary-paste=none' ~/.config/foot/foot.ini +fi + +if [[ -f ~/.config/omarchy/current/theme/foot.ini ]]; then + sed -i 's/^\[colors\]$/[colors-dark]/' ~/.config/omarchy/current/theme/foot.ini +fi + +if [[ ! -f ~/.config/omarchy/current/theme/foot.ini && -f ~/.config/omarchy/current/theme/colors.toml ]]; then + sed_script=$(mktemp) + + while IFS='=' read -r key value; do + key="${key//[\"\' ]/}" + [[ $key && $key != \#* ]] || continue + value="${value#*[\"\']}" + value="${value%%[\"\']*}" + + printf 's|{{ %s }}|%s|g\n' "$key" "$value" + printf 's|{{ %s_strip }}|%s|g\n' "$key" "${value#\#}" + done <~/.config/omarchy/current/theme/colors.toml >"$sed_script" + + sed -f "$sed_script" "$OMARCHY_PATH/default/themed/foot.ini.tpl" >~/.config/omarchy/current/theme/foot.ini + rm "$sed_script" +fi + +if omarchy-cmd-present foot; then + mkdir -p ~/.local/share/applications + rm -f ~/.local/share/applications/org.codeberg.dnkl.foot.desktop + cp -Rpf "$OMARCHY_PATH/applications/foot.desktop" ~/.local/share/applications/ + cp -Rpf "$OMARCHY_PATH/applications/footclient.desktop" ~/.local/share/applications/ + cp -Rpf "$OMARCHY_PATH/applications/foot-server.desktop" ~/.local/share/applications/ +fi + +if [[ -f ~/.config/hypr/input.conf ]]; then + sed -Ei 's/match:class \(Alacritty\|kitty\)/match:class (Alacritty|kitty|foot)/' ~/.config/hypr/input.conf +fi + +if [[ -f ~/.config/hypr/apps/terminals.conf ]]; then + sed -Ei 's/match:class \(Alacritty\|kitty\|com\.mitchellh\.ghostty\)/match:class (Alacritty|kitty|com.mitchellh.ghostty|foot)/' ~/.config/hypr/apps/terminals.conf +fi From 0114e793a9e639f786e8fb202b02d366fc12d2ba Mon Sep 17 00:00:00 2001 From: Alex Oxte Date: Tue, 5 May 2026 23:47:48 -0600 Subject: [PATCH 008/111] fix: resolve relative wallpaper paths before creating symlink (#5612) --- bin/omarchy-theme-bg-set | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bin/omarchy-theme-bg-set b/bin/omarchy-theme-bg-set index 4b069086..9c695d0e 100755 --- a/bin/omarchy-theme-bg-set +++ b/bin/omarchy-theme-bg-set @@ -9,9 +9,14 @@ if [[ -z $1 ]]; then exit 1 fi -BACKGROUND="$1" +BACKGROUND="$(realpath "$1")" CURRENT_BACKGROUND_LINK="$HOME/.config/omarchy/current/background" +if [[ ! -f "$BACKGROUND" ]]; then + echo "File does not exist: $BACKGROUND" >&2 + exit 1 +fi + # Create symlink to the new background ln -nsf "$BACKGROUND" "$CURRENT_BACKGROUND_LINK" From abd0113b01f0be4c0e61dfde62343c8aaa15ec56 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 09:29:34 +0200 Subject: [PATCH 009/111] Only just a peak --- default/hypr/looknfeel.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default/hypr/looknfeel.conf b/default/hypr/looknfeel.conf index 2a7792eb..1a6a8d97 100644 --- a/default/hypr/looknfeel.conf +++ b/default/hypr/looknfeel.conf @@ -114,7 +114,7 @@ dwindle { } scrolling { - column_width = 0.47 + column_width = 0.49 } # See https://wiki.hypr.land/Configuring/Layouts/Master-Layout/ for more From f2e38aa1ebad9fa537ca119ffe705d40fc0c25fe Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 09:32:43 +0200 Subject: [PATCH 010/111] Turn extended keys on for tmux So pi will stop complaining about it and so shift + return will just work --- config/tmux/tmux.conf | 3 +++ migrations/1778052575.sh | 7 +++++++ 2 files changed, 10 insertions(+) create mode 100644 migrations/1778052575.sh diff --git a/config/tmux/tmux.conf b/config/tmux/tmux.conf index 083abb63..de772031 100644 --- a/config/tmux/tmux.conf +++ b/config/tmux/tmux.conf @@ -70,6 +70,9 @@ set -g set-clipboard on set -g allow-passthrough on setw -g aggressive-resize on set -g detach-on-destroy off +set -g extended-keys on +set -g extended-keys-format csi-u +set -sg escape-time 10 # Status bar set -g status-position top diff --git a/migrations/1778052575.sh b/migrations/1778052575.sh new file mode 100644 index 00000000..fc6a46cf --- /dev/null +++ b/migrations/1778052575.sh @@ -0,0 +1,7 @@ +echo "Enable extended keyboard support in tmux" + +tmux_config="$HOME/.config/tmux/tmux.conf" + +if [[ -f $tmux_config ]] && ! grep -qxF "set -g extended-keys on" "$tmux_config"; then + sed -i '/^set -g detach-on-destroy off$/a set -g extended-keys on\nset -g extended-keys-format csi-u\nset -sg escape-time 10' "$tmux_config" +fi From b9fdb70e42a77bc80fc6d44a8080ca4aa71ceee7 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 09:54:48 +0200 Subject: [PATCH 011/111] No longer misc --- AGENTS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AGENTS.md b/AGENTS.md index 689f4c50..6f0f5526 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -11,7 +11,7 @@ All commands start with `omarchy-`. Prefixes indicate purpose: -- `cmd-` - check if commands exist, misc utility commands +- `cmd-` - check if commands exist - `capture-` - screenshots, screen recordings, and other capture tools - `pkg-` - package management helpers - `hw-` - hardware detection (return exit codes for use in conditionals) From bc4e26ecf41524a7d9a57d8e32d6c3811b8df1a1 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 09:58:48 +0200 Subject: [PATCH 012/111] Update with the latest sensibilities --- AGENTS.md | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 6f0f5526..e1ddb88c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -6,12 +6,17 @@ - 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/bash` consistently (never `#!/usr/bin/env bash`) +- Scripts under `install/` and `migrations/` may be sourced and intentionally omit shebangs # Command Naming -All commands start with `omarchy-`. Prefixes indicate purpose: +All commands start with `omarchy-`. Prefixes indicate purpose. -- `cmd-` - check if commands exist +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 commands - `capture-` - screenshots, screen recordings, and other capture tools - `pkg-` - package management helpers - `hw-` - hardware detection (return exit codes for use in conditionals) @@ -24,6 +29,51 @@ All commands start with `omarchy-`. Prefixes indicate purpose: - `theme-` - theme management - `update-` - 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-` + +# Command Metadata + +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: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: + +```bash +# 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 screenshot +``` + +# Install Scripts + +Install 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.sh` lists scripts in execution order +- leaf scripts are sourced by `run_logged $OMARCHY_INSTALL/path/to/script.sh` +- avoid `exit` in sourced install scripts unless intentionally aborting the install +- use `$OMARCHY_INSTALL` and `$OMARCHY_PATH` instead 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. + # Helper Commands Use these instead of raw shell commands: @@ -33,6 +83,8 @@ Use these instead of raw shell commands: - `omarchy-pkg-add` - install packages (handles both pacman and AUR) - `omarchy-hw-asus-rog` - detect ASUS ROG hardware (and similar `hw-*` 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 Structure - `config/` - default configs copied to `~/.config/` @@ -53,10 +105,15 @@ This copies `~/.local/share/omarchy/config/hypr/hyprlock.conf` to `~/.config/hyp 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. -Migration format: +New migration format: - No shebang line - Start with an `echo` describing what the migration does - Use `$OMARCHY_PATH` to reference the omarchy directory +- Prefer helper commands such as `omarchy-cmd-present`, `omarchy-cmd-missing`, `omarchy-pkg-present`, and `omarchy-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: ```bash From dd46e965d8edbd3c32d3b4983c5997303170f38a Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 11:16:25 +0200 Subject: [PATCH 013/111] Better system idle (#5619) * Better system idle * Just use refresh Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- bin/omarchy-system-idle | 17 +++++++++++++++++ bin/omarchy-system-idle-resume | 10 ++++++++++ config/hypr/hypridle.conf | 23 +++++++---------------- migrations/1778054328.sh | 3 +++ 4 files changed, 37 insertions(+), 16 deletions(-) create mode 100755 bin/omarchy-system-idle create mode 100755 bin/omarchy-system-idle-resume create mode 100644 migrations/1778054328.sh diff --git a/bin/omarchy-system-idle b/bin/omarchy-system-idle new file mode 100755 index 00000000..1ea458ea --- /dev/null +++ b/bin/omarchy-system-idle @@ -0,0 +1,17 @@ +#!/bin/bash + +# omarchy:summary=Lock the screen from idle and turn the display off after a delay +# omarchy:group=system +# omarchy:name=idle +# omarchy:examples=omarchy system idle + +if ! loginctl lock-session; then + omarchy-system-lock +fi + +( + sleep 10 + pidof hyprlock >/dev/null || exit 0 + brightnessctl -sd '*::kbd_backlight' set 0 >/dev/null 2>&1 + hyprctl dispatch dpms off >/dev/null 2>&1 +) & diff --git a/bin/omarchy-system-idle-resume b/bin/omarchy-system-idle-resume new file mode 100755 index 00000000..d1ce990f --- /dev/null +++ b/bin/omarchy-system-idle-resume @@ -0,0 +1,10 @@ +#!/bin/bash + +# omarchy:summary=Resume displays and brightness after idle +# omarchy:group=system +# omarchy:name=idle resume +# omarchy:examples=omarchy system idle resume + +hyprctl dispatch dpms on >/dev/null 2>&1 +brightnessctl -r >/dev/null 2>&1 +brightnessctl -rd '*::kbd_backlight' >/dev/null 2>&1 diff --git a/config/hypr/hypridle.conf b/config/hypr/hypridle.conf index 7d003275..fab950a4 100644 --- a/config/hypr/hypridle.conf +++ b/config/hypr/hypridle.conf @@ -5,24 +5,15 @@ general { inhibit_sleep = 3 # wait until screen is locked } +# Start screensaver after 2.5 minutes listener { - timeout = 150 # 2.5min - on-timeout = pidof hyprlock || omarchy-launch-screensaver # start screensaver (if we haven't locked already) + timeout = 150 + on-timeout = pidof hyprlock || omarchy-launch-screensaver } +# Idle system after 5 minutes listener { - timeout = 151 # 5min - on-timeout = loginctl lock-session # lock screen when timeout has passed -} - -listener { - timeout = 330 # 5.5min - on-timeout = brightnessctl -sd '*::kbd_backlight' set 0 # save state and turn off keyboard backlight - on-resume = brightnessctl -rd '*::kbd_backlight' # restore keyboard backlight -} - -listener { - timeout = 330 # 5.5min - on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed - on-resume = hyprctl dispatch dpms on && brightnessctl -r # screen on when activity is detected + timeout = 152 + on-timeout = omarchy-system-idle + on-resume = omarchy-system-idle-resume } diff --git a/migrations/1778054328.sh b/migrations/1778054328.sh new file mode 100644 index 00000000..b7b15fd3 --- /dev/null +++ b/migrations/1778054328.sh @@ -0,0 +1,3 @@ +echo "Use omarchy-system-idle and omarchy-system-idle-resume in hypridle" + +omarchy-refresh-hypridle From ca74b4d1c5fef51ffa330a04d2dd8012cdf228da Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 11:40:34 +0200 Subject: [PATCH 014/111] Simplify but letting omarchy-system-lock be responsible for turning off display and keyboard brightness --- bin/omarchy-system-idle | 17 ----------------- bin/omarchy-system-lock | 7 +++++++ ...y-system-idle-resume => omarchy-system-wake} | 6 +++--- config/hypr/hypridle.conf | 6 +++--- migrations/1778054328.sh | 2 +- 5 files changed, 14 insertions(+), 24 deletions(-) delete mode 100755 bin/omarchy-system-idle rename bin/{omarchy-system-idle-resume => omarchy-system-wake} (55%) diff --git a/bin/omarchy-system-idle b/bin/omarchy-system-idle deleted file mode 100755 index 1ea458ea..00000000 --- a/bin/omarchy-system-idle +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -# omarchy:summary=Lock the screen from idle and turn the display off after a delay -# omarchy:group=system -# omarchy:name=idle -# omarchy:examples=omarchy system idle - -if ! loginctl lock-session; then - omarchy-system-lock -fi - -( - sleep 10 - pidof hyprlock >/dev/null || exit 0 - brightnessctl -sd '*::kbd_backlight' set 0 >/dev/null 2>&1 - hyprctl dispatch dpms off >/dev/null 2>&1 -) & diff --git a/bin/omarchy-system-lock b/bin/omarchy-system-lock index 0ccd4d90..5ffa2db9 100755 --- a/bin/omarchy-system-lock +++ b/bin/omarchy-system-lock @@ -17,3 +17,10 @@ fi # Avoid running screensaver when locked pkill -f org.omarchy.screensaver + +( + sleep 10 + pidof hyprlock >/dev/null || exit 0 + brightnessctl -sd '*::kbd_backlight' set 0 >/dev/null 2>&1 + hyprctl dispatch dpms off >/dev/null 2>&1 +) & diff --git a/bin/omarchy-system-idle-resume b/bin/omarchy-system-wake similarity index 55% rename from bin/omarchy-system-idle-resume rename to bin/omarchy-system-wake index d1ce990f..df3df739 100755 --- a/bin/omarchy-system-idle-resume +++ b/bin/omarchy-system-wake @@ -1,9 +1,9 @@ #!/bin/bash -# omarchy:summary=Resume displays and brightness after idle +# omarchy:summary=Wake displays and restore brightness after idle # omarchy:group=system -# omarchy:name=idle resume -# omarchy:examples=omarchy system idle resume +# omarchy:name=wake +# omarchy:examples=omarchy system wake hyprctl dispatch dpms on >/dev/null 2>&1 brightnessctl -r >/dev/null 2>&1 diff --git a/config/hypr/hypridle.conf b/config/hypr/hypridle.conf index fab950a4..dc4df233 100644 --- a/config/hypr/hypridle.conf +++ b/config/hypr/hypridle.conf @@ -11,9 +11,9 @@ listener { on-timeout = pidof hyprlock || omarchy-launch-screensaver } -# Idle system after 5 minutes +# Lock system after 5 minutes listener { timeout = 152 - on-timeout = omarchy-system-idle - on-resume = omarchy-system-idle-resume + on-timeout = omarchy-system-lock + on-resume = omarchy-system-wake } diff --git a/migrations/1778054328.sh b/migrations/1778054328.sh index b7b15fd3..1722c7b4 100644 --- a/migrations/1778054328.sh +++ b/migrations/1778054328.sh @@ -1,3 +1,3 @@ -echo "Use omarchy-system-idle and omarchy-system-idle-resume in hypridle" +echo "Use omarchy-system-lock and omarchy-system-wake in hypridle" omarchy-refresh-hypridle From 4d11f8cc06505e8d5503997a6db593c801dab406 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 12:12:26 +0200 Subject: [PATCH 015/111] Extract turning brightness devices on/off --- bin/omarchy-brightness-display | 20 ++++++++++++++------ bin/omarchy-brightness-keyboard | 10 +++++++++- bin/omarchy-system-wake | 5 ++--- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/bin/omarchy-brightness-display b/bin/omarchy-brightness-display index 558a47de..8f79443f 100755 --- a/bin/omarchy-brightness-display +++ b/bin/omarchy-brightness-display @@ -1,15 +1,10 @@ #!/bin/bash # omarchy:summary=Adjust brightness on the most likely display device. -# omarchy:args= +# omarchy:args= step="${1:-+5%}" -if omarchy-hyprland-monitor-focused-apple; then - omarchy-brightness-display-apple "$step" - exit -fi - # Start with the first possible output, then refine to the most likely given an order heuristic. device="$(ls -1 /sys/class/backlight 2>/dev/null | head -n1)" for candidate in amdgpu_bl* intel_backlight acpi_video*; do @@ -19,6 +14,19 @@ for candidate in amdgpu_bl* intel_backlight acpi_video*; do fi done +if [[ $step == "off" ]]; then + hyprctl dispatch dpms off >/dev/null 2>&1 + exit 0 +elif [[ $step == "on" ]]; then + hyprctl dispatch dpms on >/dev/null 2>&1 + exit 0 +fi + +if omarchy-hyprland-monitor-focused-apple; then + omarchy-brightness-display-apple "$step" + exit +fi + # Current brightness percentage current=$(brightnessctl -d "$device" -m | cut -d',' -f4 | tr -d '%') diff --git a/bin/omarchy-brightness-keyboard b/bin/omarchy-brightness-keyboard index f161da47..7e5febe6 100755 --- a/bin/omarchy-brightness-keyboard +++ b/bin/omarchy-brightness-keyboard @@ -1,7 +1,7 @@ #!/bin/bash # omarchy:summary=Adjust keyboard backlight brightness using available steps. -# omarchy:args= +# omarchy:args= direction="${1:-up}" @@ -19,6 +19,14 @@ if [[ -z $device ]]; then exit 1 fi +if [[ $direction == "off" ]]; then + brightnessctl -sd "$device" set 0 >/dev/null + exit 0 +elif [[ $direction == "restore" ]]; then + brightnessctl -rd "$device" >/dev/null + exit 0 +fi + # Get current and max brightness to determine step size. max_brightness="$(brightnessctl -d "$device" max)" current_brightness="$(brightnessctl -d "$device" get)" diff --git a/bin/omarchy-system-wake b/bin/omarchy-system-wake index df3df739..e5b90389 100755 --- a/bin/omarchy-system-wake +++ b/bin/omarchy-system-wake @@ -5,6 +5,5 @@ # omarchy:name=wake # omarchy:examples=omarchy system wake -hyprctl dispatch dpms on >/dev/null 2>&1 -brightnessctl -r >/dev/null 2>&1 -brightnessctl -rd '*::kbd_backlight' >/dev/null 2>&1 +omarchy-brightness-display on +omarchy-brightness-keyboard restore From 90ac2b8ccc7b5176f079bc08fb3a0e81612ddf04 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 12:12:40 +0200 Subject: [PATCH 016/111] Ensure manually locking the screen also turns off display after 10s --- bin/omarchy-system-lock | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/bin/omarchy-system-lock b/bin/omarchy-system-lock index 5ffa2db9..ac62867c 100755 --- a/bin/omarchy-system-lock +++ b/bin/omarchy-system-lock @@ -5,7 +5,12 @@ # omarchy:name=lock # omarchy:examples=omarchy system lock -pidof hyprlock || hyprlock & +if ! pidof hyprlock >/dev/null; then + ( + hyprlock + omarchy-system-wake + ) & +fi # Set keyboard layout to default (first layout) hyprctl switchxkblayout all 0 > /dev/null 2>&1 @@ -21,6 +26,6 @@ pkill -f org.omarchy.screensaver ( sleep 10 pidof hyprlock >/dev/null || exit 0 - brightnessctl -sd '*::kbd_backlight' set 0 >/dev/null 2>&1 - hyprctl dispatch dpms off >/dev/null 2>&1 + omarchy-brightness-keyboard off + omarchy-brightness-display off ) & From 99357bf54904f50ce6e2afd57e03548d2fb91ea2 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 12:14:00 +0200 Subject: [PATCH 017/111] Better documentation --- bin/omarchy-brightness-display | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/omarchy-brightness-display b/bin/omarchy-brightness-display index 8f79443f..193bdb1b 100755 --- a/bin/omarchy-brightness-display +++ b/bin/omarchy-brightness-display @@ -1,7 +1,8 @@ #!/bin/bash # omarchy:summary=Adjust brightness on the most likely display device. -# omarchy:args= +# omarchy:args=<+N%|N%-|N%|off|on> +# omarchy:examples=omarchy brightness display +5% | omarchy brightness display 5%- | omarchy brightness display 50% | omarchy brightness display off | omarchy brightness display on step="${1:-+5%}" From 647cae0ca07f24f2bc80e22bc1e837c072e0006b Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 12:18:57 +0200 Subject: [PATCH 018/111] cli doc improvements --- bin/omarchy-brightness-display-apple | 2 ++ bin/omarchy-hyprland-monitor-scaling-cycle | 2 +- bin/omarchy-swayosd-brightness | 3 ++- bin/omarchy-swayosd-kbd-brightness | 3 ++- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/bin/omarchy-brightness-display-apple b/bin/omarchy-brightness-display-apple index 28c9e2ea..480b9fe7 100755 --- a/bin/omarchy-brightness-display-apple +++ b/bin/omarchy-brightness-display-apple @@ -1,6 +1,8 @@ #!/bin/bash # omarchy:summary=Adjust the brightness on Apple Studio Displays and Apple XDR Displays using asdcontrol. +# omarchy:args=<+N%|N%-|N%> +# omarchy:examples=omarchy brightness display apple +5% | omarchy brightness display apple 5%- | omarchy brightness display apple 50% if (( $# == 0 )); then echo "Adjust Apple Display brightness by passing +5%, 5%-, or 100%" diff --git a/bin/omarchy-hyprland-monitor-scaling-cycle b/bin/omarchy-hyprland-monitor-scaling-cycle index 32f61e50..984057b6 100755 --- a/bin/omarchy-hyprland-monitor-scaling-cycle +++ b/bin/omarchy-hyprland-monitor-scaling-cycle @@ -1,6 +1,6 @@ #!/bin/bash -# omarchy:summary=Cycle scaling for the focused Hyprland monitor +# omarchy:summary=Cycle focused Hyprland monitor scaling through 1x, 1.25x, 1.6x, 2x, and 3x MONITOR_INFO=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true)') ACTIVE_MONITOR=$(echo "$MONITOR_INFO" | jq -r '.name') diff --git a/bin/omarchy-swayosd-brightness b/bin/omarchy-swayosd-brightness index cf089a86..8a1e852d 100755 --- a/bin/omarchy-swayosd-brightness +++ b/bin/omarchy-swayosd-brightness @@ -1,7 +1,8 @@ #!/bin/bash # omarchy:summary=Display brightness level using SwayOSD on the current monitor. -# omarchy:args= +# omarchy:args=<0-100> +# omarchy:examples=omarchy swayosd brightness 0 | omarchy swayosd brightness 50 | omarchy swayosd brightness 100 percent="$1" diff --git a/bin/omarchy-swayosd-kbd-brightness b/bin/omarchy-swayosd-kbd-brightness index 9252d475..52e7959a 100755 --- a/bin/omarchy-swayosd-kbd-brightness +++ b/bin/omarchy-swayosd-kbd-brightness @@ -1,7 +1,8 @@ #!/bin/bash # omarchy:summary=Display keyboard brightness level using SwayOSD on the current monitor. -# omarchy:args= +# omarchy:args=<0-100> +# omarchy:examples=omarchy swayosd kbd brightness 0 | omarchy swayosd kbd brightness 50 | omarchy swayosd kbd brightness 100 percent="$1" From 6111ee1341260763bfb1ea92b21aa2f5c43d25d3 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 12:35:40 +0200 Subject: [PATCH 019/111] Reduce screen off after system lock to 3s --- bin/omarchy-system-lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/omarchy-system-lock b/bin/omarchy-system-lock index ac62867c..9a2765f6 100755 --- a/bin/omarchy-system-lock +++ b/bin/omarchy-system-lock @@ -24,7 +24,7 @@ fi pkill -f org.omarchy.screensaver ( - sleep 10 + sleep 3 pidof hyprlock >/dev/null || exit 0 omarchy-brightness-keyboard off omarchy-brightness-display off From 080feaf2f62f2d7548a3ae42b963fbe9b631b5bc Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 12:37:28 +0200 Subject: [PATCH 020/111] Better explanation --- bin/omarchy-system-lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/omarchy-system-lock b/bin/omarchy-system-lock index 9a2765f6..4b2ad183 100755 --- a/bin/omarchy-system-lock +++ b/bin/omarchy-system-lock @@ -1,6 +1,6 @@ #!/bin/bash -# omarchy:summary=Lock the screen +# omarchy:summary=Lock the computer and turn off the display # omarchy:group=system # omarchy:name=lock # omarchy:examples=omarchy system lock From 7330c0f9a574407fad22178d5bfe110e446a1909 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 12:44:23 +0200 Subject: [PATCH 021/111] Quiet stdout for hook Don't need all that omazed chatter --- bin/omarchy-theme-set | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/omarchy-theme-set b/bin/omarchy-theme-set index 555e6e40..fe57c2af 100755 --- a/bin/omarchy-theme-set +++ b/bin/omarchy-theme-set @@ -70,4 +70,4 @@ omarchy-theme-set-obsidian omarchy-theme-set-keyboard # Call hook on theme set -omarchy-hook theme-set "$THEME_NAME" +omarchy-hook theme-set "$THEME_NAME" >/dev/null From 4e4a688fdff831566567dd2e01ed8ed10149e895 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 12:52:17 +0200 Subject: [PATCH 022/111] Prevent flicker on waking from sleep --- bin/omarchy-system-lock | 14 ++++++++------ config/hypr/hypridle.conf | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/bin/omarchy-system-lock b/bin/omarchy-system-lock index 4b2ad183..a1ea82b4 100755 --- a/bin/omarchy-system-lock +++ b/bin/omarchy-system-lock @@ -23,9 +23,11 @@ fi # Avoid running screensaver when locked pkill -f org.omarchy.screensaver -( - sleep 3 - pidof hyprlock >/dev/null || exit 0 - omarchy-brightness-keyboard off - omarchy-brightness-display off -) & +if [[ ${OMARCHY_LOCK_ONLY:-false} != "true" ]]; then + ( + sleep 3 + pidof hyprlock >/dev/null || exit 0 + omarchy-brightness-keyboard off + omarchy-brightness-display off + ) & +fi diff --git a/config/hypr/hypridle.conf b/config/hypr/hypridle.conf index dc4df233..32ecb12d 100644 --- a/config/hypr/hypridle.conf +++ b/config/hypr/hypridle.conf @@ -1,7 +1,7 @@ general { lock_cmd = omarchy-system-lock # lock screen and 1password - before_sleep_cmd = loginctl lock-session # lock before suspend. - after_sleep_cmd = sleep 1 && hyprctl dispatch dpms on # delay for PAM readiness, then turn on display. + before_sleep_cmd = OMARCHY_LOCK_ONLY=true omarchy-system-lock # lock before suspend without scheduling display off. + after_sleep_cmd = sleep 1 && omarchy-system-wake # delay for PAM readiness, then turn on display. inhibit_sleep = 3 # wait until screen is locked } From fb117e56d824956db93d7747b8876e461fe63434 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 12:56:49 +0200 Subject: [PATCH 023/111] Hide certain commands from the list that aren't relevant to the vast majority --- bin/omarchy | 37 +++++++++++++++++++------ bin/omarchy-battery-monitor | 1 + bin/omarchy-cmd-terminal-cwd | 1 + bin/omarchy-dev-bin-metadata | 5 +++- bin/omarchy-install-zed | 2 +- bin/omarchy-theme-colors-from-alacritty | 1 + bin/omarchy-theme-set-keyboard-asus-rog | 1 + bin/omarchy-theme-set-keyboard-f16 | 1 + 8 files changed, 39 insertions(+), 10 deletions(-) diff --git a/bin/omarchy b/bin/omarchy index 77b75fd7..57501171 100755 --- a/bin/omarchy +++ b/bin/omarchy @@ -17,6 +17,7 @@ declare -A COMMAND_USAGE declare -A COMMAND_ARGS declare -A COMMAND_EXAMPLES declare -A COMMAND_REQUIRES_SUDO +declare -A COMMAND_HIDDEN declare -A COMMAND_ALIASES declare -A COMMAND_HAS_SUMMARY declare -A COMMAND_METADATA_ERRORS @@ -131,6 +132,7 @@ register_command() { local examples="" local aliases="" local requires_sudo="" + local hidden="" local line="" local metadata_key="" local metadata_value="" @@ -186,6 +188,10 @@ register_command() { requires_sudo="$metadata_value" [[ $metadata_value == "true" ]] || metadata_errors=$(append_pipe_value "$metadata_errors" "requires-sudo must be omitted or true") ;; + hidden) + hidden="$metadata_value" + [[ $metadata_value == "true" ]] || metadata_errors=$(append_pipe_value "$metadata_errors" "hidden must be omitted or true") + ;; *) ;; esac @@ -229,6 +235,7 @@ register_command() { fi [[ $requires_sudo == "true" ]] || requires_sudo="false" + [[ $hidden == "true" ]] || hidden="false" local key="$file_binary" COMMAND_KEYS+=("$key") @@ -242,6 +249,7 @@ register_command() { COMMAND_ARGS["$key"]="$args" COMMAND_EXAMPLES["$key"]="$examples" COMMAND_REQUIRES_SUDO["$key"]="$requires_sudo" + COMMAND_HIDDEN["$key"]="$hidden" COMMAND_HAS_SUMMARY["$key"]="$has_summary" COMMAND_METADATA_ERRORS["$key"]="$metadata_errors" @@ -377,6 +385,9 @@ sorted_keys() { local key="" for key in "${COMMAND_KEYS[@]}"; do + if [[ $include_all != "true" && ${COMMAND_HIDDEN[$key]} == "true" ]]; then + continue + fi printf '%s\t%s\n' "${COMMAND_ROUTE[$key]}" "$key" done | sort -u | cut -f2- } @@ -420,6 +431,10 @@ sorted_group_keys() { local route="" for key in "${COMMAND_KEYS[@]}"; do + if [[ $include_all != "true" && ${COMMAND_HIDDEN[$key]} == "true" ]]; then + continue + fi + fallback_group=$(fallback_group_for_key "$key") if [[ ${COMMAND_GROUP[$key]} != "$group" && $fallback_group != "$group" ]]; then continue @@ -510,7 +525,7 @@ Usage: List commands known to the Omarchy command center. Options: - --all Accepted for compatibility + --all Include commands explicitly marked hidden --json Emit machine-readable JSON --markdown Emit a Markdown command table --check Validate command metadata and route collisions @@ -562,6 +577,9 @@ show_commands() { for route in "${!ROUTE_IS_ALIAS[@]}"; do key="${ROUTE_TO_KEY[$route]}" + if [[ $include_all != "true" && ${COMMAND_HIDDEN[$key]} == "true" ]]; then + continue + fi alias_rows+="$route"$'\t'"${COMMAND_ROUTE[$key]}"$'\n' done @@ -600,13 +618,14 @@ emit_command_records() { while IFS= read -r key; do [[ -n $key ]] || continue - printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \ + printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \ "${COMMAND_ROUTE[$key]}" \ "${COMMAND_BINARY[$key]}" \ "${COMMAND_GROUP[$key]}" \ "${COMMAND_NAME[$key]}" \ "${COMMAND_SUMMARY[$key]}" \ "${COMMAND_REQUIRES_SUDO[$key]}" \ + "${COMMAND_HIDDEN[$key]}" \ "${COMMAND_ARGS[$key]}" \ "${COMMAND_EXAMPLES[$key]}" \ "${COMMAND_ALIASES[$key]}" \ @@ -624,11 +643,12 @@ commands_json_filter() { name: .[3], summary: .[4], requires_sudo: (.[5] == "true"), - args: .[6], - examples: (.[7] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))), - aliases: (.[8] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))), - filename_route: .[9], - routes: ([.[0], .[9]] + (.[8] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))) | unique) + hidden: (.[6] == "true"), + args: .[7], + examples: (.[8] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))), + aliases: (.[9] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))), + filename_route: .[10], + routes: ([.[0], .[10]] + (.[9] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))) | unique) }] | {ok: true, commands: .} EOF } @@ -682,13 +702,14 @@ show_command_json() { local key="$1" printf '%s\n' "$key" | while IFS= read -r key; do - printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \ + printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \ "${COMMAND_ROUTE[$key]}" \ "${COMMAND_BINARY[$key]}" \ "${COMMAND_GROUP[$key]}" \ "${COMMAND_NAME[$key]}" \ "${COMMAND_SUMMARY[$key]}" \ "${COMMAND_REQUIRES_SUDO[$key]}" \ + "${COMMAND_HIDDEN[$key]}" \ "${COMMAND_ARGS[$key]}" \ "${COMMAND_EXAMPLES[$key]}" \ "${COMMAND_ALIASES[$key]}" \ diff --git a/bin/omarchy-battery-monitor b/bin/omarchy-battery-monitor index 63b33277..1238791e 100755 --- a/bin/omarchy-battery-monitor +++ b/bin/omarchy-battery-monitor @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Designed to be run by systemd timer every 30 seconds and alerts if battery is low +# omarchy:hidden=true BATTERY_THRESHOLD=10 NOTIFICATION_FLAG="/run/user/$UID/omarchy_battery_notified" diff --git a/bin/omarchy-cmd-terminal-cwd b/bin/omarchy-cmd-terminal-cwd index d0f731a4..88da9a69 100755 --- a/bin/omarchy-cmd-terminal-cwd +++ b/bin/omarchy-cmd-terminal-cwd @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Print the current working directory of the active terminal window +# omarchy:hidden=true terminal_pid=$(hyprctl activewindow | awk '/pid:/ {print $2}') shell_pid=$(pgrep -P "$terminal_pid" | tail -n1) diff --git a/bin/omarchy-dev-bin-metadata b/bin/omarchy-dev-bin-metadata index c63667b9..99e87e86 100755 --- a/bin/omarchy-dev-bin-metadata +++ b/bin/omarchy-dev-bin-metadata @@ -22,7 +22,8 @@ show_json() { {name: "args", required: false, type: "string", note: "Only set when the command accepts arguments."}, {name: "examples", required: false, type: "string", note: "Pipe-separated examples."}, {name: "aliases", required: false, type: "string", note: "Pipe-separated alternate routes, e.g. omarchy screenshot."}, - {name: "requires-sudo", required: false, type: "true", default: false, note: "Only include when true."} + {name: "requires-sudo", required: false, type: "true", default: false, note: "Only include when true."}, + {name: "hidden", required: false, type: "true", default: false, note: "Hide from default command listings; visible with --all."} ] }' } @@ -43,6 +44,7 @@ Inferred defaults: route omarchy binary filename requires-sudo false + hidden false Optional fields: # omarchy:group= route override only @@ -51,6 +53,7 @@ Optional fields: # omarchy:examples= | pipe-separated examples # omarchy:aliases= | pipe-separated alternate routes # omarchy:requires-sudo=true only when true + # omarchy:hidden=true hide from default command listings Do not define: binary inferred from filename diff --git a/bin/omarchy-install-zed b/bin/omarchy-install-zed index 427659d2..9fa9f0ae 100755 --- a/bin/omarchy-install-zed +++ b/bin/omarchy-install-zed @@ -1,6 +1,6 @@ #!/bin/bash -# Install Zed Editor and omazed to use the current Omarchy theme. +# omarchy:summary=Install Zed Editor and configure it with the current Omarchy theme echo "Installing Zed Editor..." omarchy-pkg-add zed omazed diff --git a/bin/omarchy-theme-colors-from-alacritty b/bin/omarchy-theme-colors-from-alacritty index 7c41b5ec..a740c0ed 100755 --- a/bin/omarchy-theme-colors-from-alacritty +++ b/bin/omarchy-theme-colors-from-alacritty @@ -2,6 +2,7 @@ # omarchy:summary=Generate a theme's colors.toml from its alacritty.toml palette # omarchy:args= +# omarchy:hidden=true set -e diff --git a/bin/omarchy-theme-set-keyboard-asus-rog b/bin/omarchy-theme-set-keyboard-asus-rog index 971097e6..c485e795 100755 --- a/bin/omarchy-theme-set-keyboard-asus-rog +++ b/bin/omarchy-theme-set-keyboard-asus-rog @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Apply the current theme keyboard color to ASUS ROG keyboards +# omarchy:hidden=true ASUSCTL_THEME=~/.config/omarchy/current/theme/keyboard.rgb diff --git a/bin/omarchy-theme-set-keyboard-f16 b/bin/omarchy-theme-set-keyboard-f16 index 466690d4..c8fb283e 100755 --- a/bin/omarchy-theme-set-keyboard-f16 +++ b/bin/omarchy-theme-set-keyboard-f16 @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Apply the current theme keyboard color to Framework Laptop 16 keyboards +# omarchy:hidden=true FRAMEWORK16_THEME=~/.config/omarchy/current/theme/keyboard.rgb From 538ebcd935693b2c9cc4dc74d2249e03dc7849d6 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 12:58:55 +0200 Subject: [PATCH 024/111] Simplify --- bin/{omarchy-drive-set-password => omarchy-drive-password} | 0 bin/omarchy-drive-select | 2 +- bin/omarchy-menu | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename bin/{omarchy-drive-set-password => omarchy-drive-password} (100%) diff --git a/bin/omarchy-drive-set-password b/bin/omarchy-drive-password similarity index 100% rename from bin/omarchy-drive-set-password rename to bin/omarchy-drive-password diff --git a/bin/omarchy-drive-select b/bin/omarchy-drive-select index 117cde4d..0ee1f195 100755 --- a/bin/omarchy-drive-select +++ b/bin/omarchy-drive-select @@ -1,6 +1,6 @@ #!/bin/bash -# omarchy:summary=Select a drive from a list with info that includes space and brand. Used by omarchy-drive-set-password. +# omarchy:summary=Select a drive from a list with info that includes space and brand. Used by omarchy-drive-password. if (($# == 0)); then drives=$(lsblk -dpno NAME | grep -E '/dev/(sd|hd|vd|nvme|mmcblk|xv)') diff --git a/bin/omarchy-menu b/bin/omarchy-menu index abe01a5e..54dcc9dc 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -642,7 +642,7 @@ show_update_hardware_menu() { show_update_password_menu() { case $(menu "Update Password" " Drive Encryption\n User") in - *Drive*) present_terminal omarchy-drive-set-password ;; + *Drive*) present_terminal omarchy-drive-password ;; *User*) present_terminal passwd ;; *) show_update_menu ;; esac From f398cd274b45fbc1f90e65a2941a637c486e5a1b Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 13:02:21 +0200 Subject: [PATCH 025/111] Consistent command naming --- ...rency-toggle => omarchy-hyprland-window-transparency-toggle} | 0 default/hypr/bindings/utilities.conf | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename bin/{omarchy-hyprland-active-window-transparency-toggle => omarchy-hyprland-window-transparency-toggle} (100%) diff --git a/bin/omarchy-hyprland-active-window-transparency-toggle b/bin/omarchy-hyprland-window-transparency-toggle similarity index 100% rename from bin/omarchy-hyprland-active-window-transparency-toggle rename to bin/omarchy-hyprland-window-transparency-toggle diff --git a/default/hypr/bindings/utilities.conf b/default/hypr/bindings/utilities.conf index 32dc0170..083a4c91 100644 --- a/default/hypr/bindings/utilities.conf +++ b/default/hypr/bindings/utilities.conf @@ -15,7 +15,7 @@ bindd = , XF86Calculator, Calculator, exec, gnome-calculator bindd = SUPER SHIFT, SPACE, Toggle top bar, exec, omarchy-toggle-waybar bindd = SUPER CTRL, SPACE, Theme background menu, exec, omarchy-menu background bindd = SUPER SHIFT CTRL, SPACE, Theme menu, exec, omarchy-menu theme -bindd = SUPER, BACKSPACE, Toggle window transparency, exec, omarchy-hyprland-active-window-transparency-toggle +bindd = SUPER, BACKSPACE, Toggle window transparency, exec, omarchy-hyprland-window-transparency-toggle bindd = SUPER SHIFT, BACKSPACE, Toggle window gaps, exec, omarchy-hyprland-window-gaps-toggle bindd = SUPER CTRL, BACKSPACE, Toggle single-window square aspect, exec, omarchy-hyprland-window-single-square-aspect-toggle From 60156309a43245a50595baeaf067811f4c5318b5 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 13:05:20 +0200 Subject: [PATCH 026/111] No need to list this twice --- bin/omarchy | 11 ----------- bin/omarchy-pkg-add | 4 +--- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/bin/omarchy b/bin/omarchy index 57501171..0684591e 100755 --- a/bin/omarchy +++ b/bin/omarchy @@ -329,16 +329,6 @@ command_requires_args() { [[ -n $required ]] } -load_group_extra_commands() { - local group="$1" - - case "$group" in - install) - load_command_by_binary omarchy-pkg-add - ;; - esac -} - load_group_commands() { local group="$1" local file="" @@ -352,7 +342,6 @@ load_group_commands() { register_command "$file" done - load_group_extra_commands "$group" } resolve_direct_route() { diff --git a/bin/omarchy-pkg-add b/bin/omarchy-pkg-add index 5c18ae02..4db19e05 100755 --- a/bin/omarchy-pkg-add +++ b/bin/omarchy-pkg-add @@ -1,10 +1,8 @@ #!/bin/bash # omarchy:summary=Install Arch packages if they are missing -# omarchy:group=install -# omarchy:name=package # omarchy:args= -# omarchy:examples=omarchy install package jq ripgrep +# omarchy:examples=omarchy pkg add jq ripgrep # omarchy:requires-sudo=true if omarchy-pkg-missing "$@"; then From feea828e072c5be44d830a39dfabf6ce71bd70d1 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 13:06:09 +0200 Subject: [PATCH 027/111] Not relevant for most --- bin/omarchy | 2 -- 1 file changed, 2 deletions(-) diff --git a/bin/omarchy b/bin/omarchy index 0684591e..50e7d3f0 100755 --- a/bin/omarchy +++ b/bin/omarchy @@ -501,8 +501,6 @@ Discovery: omarchy commands --all Include commands explicitly marked hidden omarchy commands --json Machine-readable command list omarchy commands --check Validate command metadata and routes - omarchy dev benchmark Measure CLI response times - omarchy dev bin metadata Show bin metadata fields and defaults EOF } From 5b6684d69031283a1d44f78d287711bdf8916604 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 13:09:33 +0200 Subject: [PATCH 028/111] Add examples --- bin/omarchy-plymouth-preview | 1 + bin/omarchy-plymouth-set | 1 + 2 files changed, 2 insertions(+) diff --git a/bin/omarchy-plymouth-preview b/bin/omarchy-plymouth-preview index 88cc71df..b3724f5a 100755 --- a/bin/omarchy-plymouth-preview +++ b/bin/omarchy-plymouth-preview @@ -2,6 +2,7 @@ # omarchy:summary=Preview a Plymouth boot screen with custom colors and logo # omarchy:args= +# omarchy:examples=omarchy plymouth preview '#1d2021' '#ebdbb2' ~/.config/omarchy/current/theme/plymouth/logo.png /tmp/plymouth-preview.png # Render a Plymouth login-screen preview PNG by compositing the staged omarchy # theme assets (recolored with the given text color) onto the background. diff --git a/bin/omarchy-plymouth-set b/bin/omarchy-plymouth-set index 46a4a9a8..ff9ca27d 100755 --- a/bin/omarchy-plymouth-set +++ b/bin/omarchy-plymouth-set @@ -2,6 +2,7 @@ # omarchy:summary=Set the Plymouth boot theme colors and logo # omarchy:args= +# omarchy:examples=omarchy plymouth set '#1d2021' '#ebdbb2' ~/.config/omarchy/current/theme/plymouth/logo.png # omarchy:requires-sudo=true # Configure the Plymouth boot theme with a custom background color, text color, and logo. From 61ee5d2cf2567f9cd5672bbdbee1abe66a1dfa9f Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 13:13:34 +0200 Subject: [PATCH 029/111] Shorter command naming --- bin/omarchy-menu | 4 ++-- ...{omarchy-screensaver-set-logo => omarchy-screensaver-logo} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename bin/{omarchy-screensaver-set-logo => omarchy-screensaver-logo} (97%) diff --git a/bin/omarchy-menu b/bin/omarchy-menu index 54dcc9dc..d7fe9aeb 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -235,7 +235,7 @@ show_style_menu() { show_screensaver_menu() { case $(menu "Screensaver" " Set From Image\n Restore Default\n Edit Text\n󱄄 Preview") in *Image*) set_screensaver_from_image ;; - *Default*) terminal bash -lc 'omarchy-screensaver-set-logo default; echo; read -n 1 -s -r -p "Press any key to close..."' ;; + *Default*) terminal bash -lc 'omarchy-screensaver-logo default; echo; read -n 1 -s -r -p "Press any key to close..."' ;; *Text*) open_in_editor ~/.config/omarchy/branding/screensaver.txt ;; *Preview*) omarchy-launch-screensaver force ;; *) show_style_menu ;; @@ -246,7 +246,7 @@ set_screensaver_from_image() { terminal bash -lc ' image=$(fd --type file --ignore-case --extension svg --extension png . "$HOME" 2>/dev/null | fzf --prompt "Logo image> ") if [[ -n $image ]]; then - if omarchy-screensaver-set-logo "$image"; then + if omarchy-screensaver-logo "$image"; then echo echo "Preview with: omarchy-launch-screensaver force" fi diff --git a/bin/omarchy-screensaver-set-logo b/bin/omarchy-screensaver-logo similarity index 97% rename from bin/omarchy-screensaver-set-logo rename to bin/omarchy-screensaver-logo index d3f21899..1c51a648 100755 --- a/bin/omarchy-screensaver-set-logo +++ b/bin/omarchy-screensaver-logo @@ -2,13 +2,13 @@ # omarchy:summary=Set the screensaver logo text from an SVG/PNG or the default # omarchy:args= [--width ] [--height ] [--mode ] [--threshold ] [--invert] [--stdout] -# omarchy:examples=omarchy screensaver set logo ~/logo.svg | omarchy screensaver set logo default | omarchy screensaver set logo ~/logo.png --width 80 --mode block --stdout +# omarchy:examples=omarchy screensaver logo ~/logo.svg | omarchy screensaver logo default | omarchy screensaver logo ~/logo.png --width 80 --mode block --stdout set -o pipefail usage() { cat <<'EOF' -Usage: omarchy-screensaver-set-logo [options] +Usage: omarchy-screensaver-logo [options] Sets the screensaver logo text from an image. Pass "default" instead of an image path to restore the Omarchy default. From 11a54d1745120d7fd69bd3e5bb5767f44198458a Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 13:15:22 +0200 Subject: [PATCH 030/111] More natural order --- bin/omarchy-menu | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/omarchy-menu b/bin/omarchy-menu index d7fe9aeb..2dae932e 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -233,11 +233,11 @@ show_style_menu() { } show_screensaver_menu() { - case $(menu "Screensaver" " Set From Image\n Restore Default\n Edit Text\n󱄄 Preview") in - *Image*) set_screensaver_from_image ;; - *Default*) terminal bash -lc 'omarchy-screensaver-logo default; echo; read -n 1 -s -r -p "Press any key to close..."' ;; + case $(menu "Screensaver" " Edit Text\n Set From Image\n󱄄 Preview\n Restore Default") in *Text*) open_in_editor ~/.config/omarchy/branding/screensaver.txt ;; + *Image*) set_screensaver_from_image ;; *Preview*) omarchy-launch-screensaver force ;; + *Default*) terminal bash -lc 'omarchy-screensaver-logo default; echo; read -n 1 -s -r -p "Press any key to close..."' ;; *) show_style_menu ;; esac } From cc378a1f7b34dfaabe7390ab7f1693f1c9bf95d7 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 13:20:34 +0200 Subject: [PATCH 031/111] Hide more irrelevant stuff for users --- bin/omarchy | 1 - bin/omarchy-state | 1 + bin/omarchy-theme-set-browser | 1 + bin/omarchy-theme-set-foot | 1 + bin/omarchy-theme-set-gnome | 1 + bin/omarchy-theme-set-keyboard | 1 + bin/omarchy-theme-set-obsidian | 1 + bin/omarchy-theme-set-templates | 1 + bin/omarchy-theme-set-vscode | 1 + 9 files changed, 8 insertions(+), 1 deletion(-) diff --git a/bin/omarchy b/bin/omarchy index 50e7d3f0..ad5d02fc 100755 --- a/bin/omarchy +++ b/bin/omarchy @@ -58,7 +58,6 @@ GROUP_DESCRIPTIONS[restart]="Restart Omarchy components" GROUP_DESCRIPTIONS[setup]="Interactive setup wizards" GROUP_DESCRIPTIONS[screensaver]="Screensaver branding and animation" GROUP_DESCRIPTIONS[snapshot]="System snapshots" -GROUP_DESCRIPTIONS[state]="Persistent Omarchy state" GROUP_DESCRIPTIONS[sudo]="Sudo configuration helpers" GROUP_DESCRIPTIONS[swayosd]="SwayOSD status display helpers" GROUP_DESCRIPTIONS[system]="Reboot, shutdown, logout, and lock" diff --git a/bin/omarchy-state b/bin/omarchy-state index 2a294df4..4fda5b3a 100755 --- a/bin/omarchy-state +++ b/bin/omarchy-state @@ -2,6 +2,7 @@ # omarchy:summary=Manage persistent state files for Omarchy toggles and settings. # omarchy:args= +# omarchy:hidden=true STATE_DIR="$HOME/.local/state/omarchy" mkdir -p "$STATE_DIR" diff --git a/bin/omarchy-theme-set-browser b/bin/omarchy-theme-set-browser index e43f0634..89194c74 100755 --- a/bin/omarchy-theme-set-browser +++ b/bin/omarchy-theme-set-browser @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Apply the current theme color to Chromium and Brave +# omarchy:hidden=true CHROMIUM_THEME=~/.config/omarchy/current/theme/chromium.theme diff --git a/bin/omarchy-theme-set-foot b/bin/omarchy-theme-set-foot index eb11f9c4..f7268d22 100755 --- a/bin/omarchy-theme-set-foot +++ b/bin/omarchy-theme-set-foot @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Apply current Omarchy theme colors to running Foot terminals +# omarchy:hidden=true foot_theme=~/.config/omarchy/current/theme/foot.ini diff --git a/bin/omarchy-theme-set-gnome b/bin/omarchy-theme-set-gnome index 66e3e204..379f76ec 100755 --- a/bin/omarchy-theme-set-gnome +++ b/bin/omarchy-theme-set-gnome @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Apply the current theme to GNOME color mode and icon settings +# omarchy:hidden=true if [[ -f ~/.config/omarchy/current/theme/light.mode ]]; then gsettings set org.gnome.desktop.interface color-scheme "prefer-light" diff --git a/bin/omarchy-theme-set-keyboard b/bin/omarchy-theme-set-keyboard index 7fc9c7a5..0fd1a202 100755 --- a/bin/omarchy-theme-set-keyboard +++ b/bin/omarchy-theme-set-keyboard @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Apply the current theme keyboard color to supported keyboards +# omarchy:hidden=true omarchy-theme-set-keyboard-asus-rog omarchy-theme-set-keyboard-f16 diff --git a/bin/omarchy-theme-set-obsidian b/bin/omarchy-theme-set-obsidian index dd9468aa..e92bf6f5 100755 --- a/bin/omarchy-theme-set-obsidian +++ b/bin/omarchy-theme-set-obsidian @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Sync Omarchy theme to all Obsidian vaults +# omarchy:hidden=true CURRENT_THEME_DIR="$HOME/.config/omarchy/current/theme" diff --git a/bin/omarchy-theme-set-templates b/bin/omarchy-theme-set-templates index f272ffff..92236d19 100755 --- a/bin/omarchy-theme-set-templates +++ b/bin/omarchy-theme-set-templates @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Generate themed config files from Omarchy templates +# omarchy:hidden=true TEMPLATES_DIR="$OMARCHY_PATH/default/themed" USER_TEMPLATES_DIR="$HOME/.config/omarchy/themed" diff --git a/bin/omarchy-theme-set-vscode b/bin/omarchy-theme-set-vscode index 703b1563..d0e0331c 100755 --- a/bin/omarchy-theme-set-vscode +++ b/bin/omarchy-theme-set-vscode @@ -1,6 +1,7 @@ #!/bin/bash # omarchy:summary=Sync Omarchy theme to VS Code, VSCodium, and Cursor +# omarchy:hidden=true VS_CODE_THEME="$HOME/.config/omarchy/current/theme/vscode.json" From 207d4f1ec8f8af4006c58b29955a06e7b532ca0b Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 13:21:55 +0200 Subject: [PATCH 032/111] Don't need to show this --- bin/omarchy-update-without-idle | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/omarchy-update-without-idle b/bin/omarchy-update-without-idle index 62a38fa4..bea1400b 100755 --- a/bin/omarchy-update-without-idle +++ b/bin/omarchy-update-without-idle @@ -1,3 +1,4 @@ #!/bin/bash # omarchy:summary=No-op now that omarchy-update-perform is responsible for idle management. +# omarchy:hidden=true From f284cda94cb25ad22fdb1ae2b83ac4cab5d866d3 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 13:23:12 +0200 Subject: [PATCH 033/111] Not necessary to show either --- bin/omarchy | 1 - bin/omarchy-upload-log | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/omarchy b/bin/omarchy index ad5d02fc..ad743ce7 100755 --- a/bin/omarchy +++ b/bin/omarchy @@ -67,7 +67,6 @@ GROUP_DESCRIPTIONS[transcode]="Image and video transcoding" GROUP_DESCRIPTIONS[tui]="Terminal UI launchers" GROUP_DESCRIPTIONS[tz]="Timezone selection" GROUP_DESCRIPTIONS[update]="Omarchy and system updates" -GROUP_DESCRIPTIONS[upload]="Upload helpers" GROUP_DESCRIPTIONS[version]="Version and channel information" GROUP_DESCRIPTIONS[voxtype]="Voxtype dictation" GROUP_DESCRIPTIONS[webapp]="Web app launchers" diff --git a/bin/omarchy-upload-log b/bin/omarchy-upload-log index 6d38eee8..7d06ac3b 100755 --- a/bin/omarchy-upload-log +++ b/bin/omarchy-upload-log @@ -2,6 +2,7 @@ # omarchy:summary=Upload logs to 0x0.st # omarchy:args= +# omarchy:hidden=true LOG_TYPE="${1:-install}" TEMP_LOG="/tmp/upload-log.txt" From 4072fc6b1fa737cfc7b490ccc5818092f4ec8cff Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 16:26:21 +0200 Subject: [PATCH 034/111] Install a new default browser (#5627) --- bin/omarchy-install-browser | 106 ++++++++++++++++++++++++++++ bin/omarchy-menu | 32 ++++++++- bin/omarchy-remove-browser | 73 +++++++++++++++++++ bin/omarchy-theme-set-browser | 61 +++++++++------- config/brave-flags.conf | 1 - config/brave-origin-beta-flags.conf | 1 - default/firefox/policies.json | 26 +++++++ install/config/theme.sh | 6 +- 8 files changed, 272 insertions(+), 34 deletions(-) create mode 100755 bin/omarchy-install-browser create mode 100755 bin/omarchy-remove-browser delete mode 100644 config/brave-flags.conf delete mode 120000 config/brave-origin-beta-flags.conf create mode 100644 default/firefox/policies.json diff --git a/bin/omarchy-install-browser b/bin/omarchy-install-browser new file mode 100755 index 00000000..eba726e3 --- /dev/null +++ b/bin/omarchy-install-browser @@ -0,0 +1,106 @@ +#!/bin/bash + +# omarchy:summary=Install a supported browser and make it the default +# omarchy:args= +# omarchy:examples=omarchy install browser firefox | omarchy install browser brave + +make_default() { + xdg-settings set default-web-browser "$1" + xdg-mime default "$1" x-scheme-handler/http + xdg-mime default "$1" x-scheme-handler/https + xdg-mime default "$1" text/html +} + +setup_policy_directory() { + sudo mkdir -p "$1" + sudo chmod a+rw "$1" +} + +announce_default_browser() { + echo "" + echo "$1 is now the default browser. Start it with Super + Shift + Return." +} + +copy_chromium_flags() { + mkdir -p ~/.config + cp -f "${OMARCHY_PATH:-$HOME/.local/share/omarchy}/config/chromium-flags.conf" "$1" +} + +setup_firefox_preferences() { + local distribution_dir="$1" + + setup_policy_directory "$distribution_dir" + sudo cp -f "$OMARCHY_PATH/default/firefox/policies.json" "$distribution_dir/policies.json" +} + +setup_firefox_wayland() { + mkdir -p ~/.config/environment.d + echo "MOZ_ENABLE_WAYLAND=1" > ~/.config/environment.d/omarchy-firefox-wayland.conf +} + +case $1 in +chrome) + echo "Installing Chrome..." + omarchy-pkg-aur-add google-chrome || exit 1 + + setup_policy_directory /etc/opt/chrome/policies/managed + copy_chromium_flags ~/.config/chrome-flags.conf + make_default google-chrome.desktop + omarchy-theme-set-browser + announce_default_browser "Chrome" + ;; +edge) + echo "Installing Edge..." + omarchy-pkg-aur-add microsoft-edge-stable-bin || exit 1 + + setup_policy_directory /etc/opt/edge/policies/managed + copy_chromium_flags ~/.config/microsoft-edge-stable-flags.conf + make_default microsoft-edge.desktop + omarchy-theme-set-browser + announce_default_browser "Edge" + ;; +brave) + echo "Installing Brave..." + omarchy-pkg-aur-add brave-bin || exit 1 + + setup_policy_directory /etc/brave/policies/managed + copy_chromium_flags ~/.config/brave-flags.conf + make_default brave-browser.desktop + omarchy-theme-set-browser + announce_default_browser "Brave" + ;; +brave-origin) + echo "Installing Brave Origin..." + omarchy-pkg-aur-add brave-origin-beta-bin || exit 1 + + setup_policy_directory /etc/brave/policies/managed + mkdir -p ~/.config + # FIXME: Use normal chromium flags when Brave Origin wrapper has been fixed + echo "--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url" > ~/.config/brave-origin-beta-flags.conf + make_default brave-origin-beta.desktop + omarchy-theme-set-browser + announce_default_browser "Brave Origin" + ;; +firefox) + echo "Installing Firefox..." + omarchy-pkg-add firefox || exit 1 + + setup_firefox_preferences /usr/lib/firefox/distribution + setup_firefox_wayland + make_default firefox.desktop + announce_default_browser "Firefox" + ;; +zen) + echo "Installing Zen..." + omarchy-pkg-aur-add zen-browser-bin || exit 1 + + setup_firefox_preferences /opt/zen-browser/distribution + setup_firefox_wayland + make_default zen.desktop + announce_default_browser "Zen" + ;; +*) + echo "Usage: omarchy-install-browser " + exit 1 + ;; +esac diff --git a/bin/omarchy-menu b/bin/omarchy-menu index 2dae932e..b7068741 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -352,7 +352,7 @@ show_setup_system_menu() { } show_install_menu() { - case $(menu "Install" "󰣇 Package\n󰣇 AUR\n Web App\n TUI\n Service\n Style\n󰵮 Development\n Editor\n Terminal\n󱚤 AI\n󰍲 Windows\n Gaming") in + case $(menu "Install" "󰣇 Package\n󰣇 AUR\n Web App\n TUI\n Service\n Style\n󰵮 Development\n Editor\n Terminal\n Browser\n󱚤 AI\n Gaming\n󰍲 Windows") in *Package*) terminal omarchy-pkg-install ;; *AUR*) terminal omarchy-pkg-aur-install ;; *Web*) present_terminal omarchy-webapp-install ;; @@ -362,13 +362,26 @@ show_install_menu() { *Development*) show_install_development_menu ;; *Editor*) show_install_editor_menu ;; *Terminal*) show_install_terminal_menu ;; + *Browser*) show_install_browser_menu ;; + *Gaming*) show_install_gaming_menu ;; *AI*) show_install_ai_menu ;; *Windows*) present_terminal "omarchy-windows-vm install" ;; - *Gaming*) show_install_gaming_menu ;; *) show_main_menu ;; esac } +show_install_browser_menu() { + case $(menu "Install" " Chrome\n Edge\n Brave\n Brave Origin\n Firefox\n Zen") in + *Chrome*) present_terminal "omarchy-install-browser chrome" ;; + *Edge*) present_terminal "omarchy-install-browser edge" ;; + *"Brave Origin"*) present_terminal "omarchy-install-browser brave-origin" ;; + *Brave*) present_terminal "omarchy-install-browser brave" ;; + *Firefox*) present_terminal "omarchy-install-browser firefox" ;; + *Zen*) present_terminal "omarchy-install-browser zen" ;; + *) show_install_menu ;; + esac +} + show_install_service_menu() { case $(menu "Install" " Dropbox\n Tailscale\n󱇱 NordVPN [AUR]\n󰏖 ONCE\n󰟵 Bitwarden\n Chromium Account") in *Dropbox*) present_terminal omarchy-install-dropbox ;; @@ -502,8 +515,9 @@ show_install_elixir_menu() { } show_remove_menu() { - case $(menu "Remove" "󰣇 Package\n Web App\n TUI\n󰵮 Development\n Gaming\n󰏓 Preinstalls\n Dictation\n󰸌 Theme\n󰍲 Windows\n󰈷 Fingerprint\n Fido2") in + case $(menu "Remove" "󰣇 Package\n Browser\n Web App\n TUI\n󰵮 Development\n Gaming\n󰏓 Preinstalls\n Dictation\n󰸌 Theme\n󰍲 Windows\n󰈷 Fingerprint\n Fido2") in *Package*) terminal omarchy-pkg-remove ;; + *Browser*) show_remove_browser_menu ;; *Web*) present_terminal omarchy-webapp-remove ;; *TUI*) present_terminal omarchy-tui-remove ;; *Development*) show_remove_development_menu ;; @@ -518,6 +532,18 @@ show_remove_menu() { esac } +show_remove_browser_menu() { + case $(menu "Remove" " Chrome\n Edge\n Brave\n Brave Origin\n Firefox\n Zen") in + *Chrome*) present_terminal "omarchy-remove-browser chrome" ;; + *Edge*) present_terminal "omarchy-remove-browser edge" ;; + *"Brave Origin"*) present_terminal "omarchy-remove-browser brave-origin" ;; + *Brave*) present_terminal "omarchy-remove-browser brave" ;; + *Firefox*) present_terminal "omarchy-remove-browser firefox" ;; + *Zen*) present_terminal "omarchy-remove-browser zen" ;; + *) show_remove_menu ;; + esac +} + show_remove_gaming_menu() { case $(menu "Remove" " Steam\n RetroArch\n󰍳 Minecraft\n󰢹 NVIDIA GeForce NOW\n Xbox Cloud Gaming\n󰖺 Xbox Controller (󰂯)\n󰍹 Moonlight (GameStream)\n Lutris (Battle.net)\n󱓟 Heroic (Epic Games)") in *Steam*) present_terminal omarchy-remove-gaming-steam ;; diff --git a/bin/omarchy-remove-browser b/bin/omarchy-remove-browser new file mode 100755 index 00000000..6ae076df --- /dev/null +++ b/bin/omarchy-remove-browser @@ -0,0 +1,73 @@ +#!/bin/bash + +# omarchy:summary=Remove a supported browser and clean up Omarchy browser defaults +# omarchy:args= +# omarchy:examples=omarchy remove browser firefox | omarchy remove browser brave +# omarchy:requires-sudo=true + +set_fallback_default_browser() { + local current_browser + current_browser=$(xdg-settings get default-web-browser) + + if [[ $current_browser != "$1" ]]; then + return + fi + + if omarchy-cmd-present chromium; then + xdg-settings set default-web-browser chromium.desktop + xdg-mime default chromium.desktop x-scheme-handler/http + xdg-mime default chromium.desktop x-scheme-handler/https + xdg-mime default chromium.desktop text/html + fi +} + +case $1 in +chrome) + echo "Removing Chrome..." + set_fallback_default_browser google-chrome.desktop + omarchy-pkg-drop google-chrome + rm -f ~/.config/chrome-flags.conf + sudo rm -f /etc/opt/chrome/policies/managed/color.json + ;; +edge) + echo "Removing Edge..." + set_fallback_default_browser microsoft-edge.desktop + omarchy-pkg-drop microsoft-edge-stable-bin + rm -f ~/.config/microsoft-edge-stable-flags.conf + sudo rm -f /etc/opt/edge/policies/managed/color.json + ;; +brave) + echo "Removing Brave..." + set_fallback_default_browser brave-browser.desktop + omarchy-pkg-drop brave-bin + rm -f ~/.config/brave-flags.conf + + if omarchy-pkg-missing brave-origin-beta-bin; then + sudo rm -rf /etc/brave + fi + ;; +brave-origin) + echo "Removing Brave Origin..." + set_fallback_default_browser brave-origin-beta.desktop + omarchy-pkg-drop brave-origin-beta-bin + rm -f ~/.config/brave-origin-beta-flags.conf + + if omarchy-pkg-missing brave-bin; then + sudo rm -rf /etc/brave + fi + ;; +firefox) + echo "Removing Firefox..." + set_fallback_default_browser firefox.desktop + omarchy-pkg-drop firefox + ;; +zen) + echo "Removing Zen..." + set_fallback_default_browser zen.desktop + omarchy-pkg-drop zen-browser-bin + ;; +*) + echo "Usage: omarchy-remove-browser " + exit 1 + ;; +esac diff --git a/bin/omarchy-theme-set-browser b/bin/omarchy-theme-set-browser index 89194c74..ee189d17 100755 --- a/bin/omarchy-theme-set-browser +++ b/bin/omarchy-theme-set-browser @@ -1,31 +1,44 @@ #!/bin/bash -# omarchy:summary=Apply the current theme color to Chromium and Brave +# omarchy:summary=Apply the current theme color to Chromium, Chrome, Edge, and Brave # omarchy:hidden=true CHROMIUM_THEME=~/.config/omarchy/current/theme/chromium.theme -if omarchy-cmd-present chromium || omarchy-cmd-present brave || omarchy-cmd-present brave-origin-beta; then - if [[ -f $CHROMIUM_THEME ]]; then - THEME_RGB_COLOR=$(<$CHROMIUM_THEME) - THEME_HEX_COLOR=$(printf '#%02x%02x%02x' ${THEME_RGB_COLOR//,/ }) - else - # Use a default, neutral grey if theme doesn't have a color - THEME_RGB_COLOR="28,32,39" - THEME_HEX_COLOR="#1c2027" - fi - - if omarchy-cmd-present chromium; then - echo "{\"BrowserThemeColor\": \"$THEME_HEX_COLOR\", \"BrowserColorScheme\": \"device\"}" | tee "/etc/chromium/policies/managed/color.json" >/dev/null - pgrep -x chromium >/dev/null && chromium --refresh-platform-policy --no-startup-window &>/dev/null - fi - - # Brave and Brave Origin Beta share /etc/brave/policies, so a single write covers both - if omarchy-cmd-present brave || omarchy-cmd-present brave-origin-beta; then - echo "{\"BrowserThemeColor\": \"$THEME_HEX_COLOR\", \"BrowserColorScheme\": \"device\"}" | tee "/etc/brave/policies/managed/color.json" >/dev/null - if pgrep -x brave >/dev/null; then - omarchy-cmd-present brave && brave --refresh-platform-policy --no-startup-window &>/dev/null - omarchy-cmd-present brave-origin-beta && brave-origin-beta --refresh-platform-policy --no-startup-window &>/dev/null - fi - fi +if [[ -f $CHROMIUM_THEME ]]; then + THEME_RGB_COLOR=$(<$CHROMIUM_THEME) + THEME_HEX_COLOR=$(printf '#%02x%02x%02x' ${THEME_RGB_COLOR//,/ }) +else + # Use a default, neutral grey if theme doesn't have a color + THEME_HEX_COLOR="#1c2027" fi + +set_browser_policy() { + local policy_dir="$1" + + [[ -d $policy_dir ]] || return + echo "{\"BrowserThemeColor\": \"$THEME_HEX_COLOR\", \"BrowserColorScheme\": \"device\"}" | tee "$policy_dir/color.json" >/dev/null +} + +refresh_running_browser() { + local process="$1" + local command="$2" + local pgrep_args="${3:--x}" + + if omarchy-cmd-present "$command" && pgrep $pgrep_args "$process" >/dev/null; then + "$command" --refresh-platform-policy --no-startup-window &>/dev/null + fi +} + +set_browser_policy /etc/chromium/policies/managed +refresh_running_browser chromium chromium + +set_browser_policy /etc/opt/chrome/policies/managed +refresh_running_browser chrome google-chrome-stable || refresh_running_browser chrome google-chrome + +set_browser_policy /etc/opt/edge/policies/managed +refresh_running_browser msedge microsoft-edge-stable + +set_browser_policy /etc/brave/policies/managed +refresh_running_browser brave brave +refresh_running_browser brave-origin-beta brave-origin-beta -f diff --git a/config/brave-flags.conf b/config/brave-flags.conf deleted file mode 100644 index 57eba524..00000000 --- a/config/brave-flags.conf +++ /dev/null @@ -1 +0,0 @@ ---load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url diff --git a/config/brave-origin-beta-flags.conf b/config/brave-origin-beta-flags.conf deleted file mode 120000 index f3609ca7..00000000 --- a/config/brave-origin-beta-flags.conf +++ /dev/null @@ -1 +0,0 @@ -brave-flags.conf \ No newline at end of file diff --git a/default/firefox/policies.json b/default/firefox/policies.json new file mode 100644 index 00000000..d102c51c --- /dev/null +++ b/default/firefox/policies.json @@ -0,0 +1,26 @@ +{ + "policies": { + "Preferences": { + "apz.overscroll.enabled": { + "Value": true, + "Status": "default" + }, + "media.ffmpeg.vaapi.enabled": { + "Value": true, + "Status": "default" + }, + "media.hardware-video-decoding.force-enabled": { + "Value": true, + "Status": "default" + }, + "widget.disable-swipe-tracker": { + "Value": false, + "Status": "default" + }, + "widget.wayland.fractional-scale.enabled": { + "Value": true, + "Status": "default" + } + } + } +} diff --git a/install/config/theme.sh b/install/config/theme.sh index 83e2b8dd..fe7e9112 100644 --- a/install/config/theme.sh +++ b/install/config/theme.sh @@ -5,14 +5,10 @@ sudo ln -snf /usr/share/icons/Adwaita/symbolic/actions/go-next-symbolic.svg /usr # Setup user theme folder mkdir -p ~/.config/omarchy/themes -# Add managed policy directories for Chromium and Brave for theme changes. -# Must exist before the first omarchy-theme-set, which writes color.json into them. +# Chromium policy directory for theme sudo mkdir -p /etc/chromium/policies/managed sudo chmod a+rw /etc/chromium/policies/managed -sudo mkdir -p /etc/brave/policies/managed -sudo chmod a+rw /etc/brave/policies/managed - # Set initial theme omarchy-theme-set "Tokyo Night" rm -rf ~/.config/chromium/SingletonLock # otherwise archiso will own the chromium singleton From d6b5e645f8eb3156b30e97d4d1cc93a0ffc93d85 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 16:34:08 +0200 Subject: [PATCH 035/111] Add Amiga, C64, Amstrad cores to default RetroArch setup --- bin/omarchy-install-gaming-retroarch | 2 +- bin/omarchy-remove-gaming-retroarch | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/omarchy-install-gaming-retroarch b/bin/omarchy-install-gaming-retroarch index cb3f512b..828acfc4 100755 --- a/bin/omarchy-install-gaming-retroarch +++ b/bin/omarchy-install-gaming-retroarch @@ -21,7 +21,7 @@ omarchy-pkg-add \ libretro-parallel-n64 libretro-picodrive libretro-play libretro-ppsspp \ libretro-sameboy libretro-scummvm libretro-shaders-slang libretro-snes9x \ libretro-yabause \ - libretro-fbneo-git \ + libretro-cap32-git libretro-fbneo-git libretro-uae-git libretro-vice-git \ libretro-database-git \ retroarch-joypad-autoconfig-git diff --git a/bin/omarchy-remove-gaming-retroarch b/bin/omarchy-remove-gaming-retroarch index 5b89732b..16e549f2 100755 --- a/bin/omarchy-remove-gaming-retroarch +++ b/bin/omarchy-remove-gaming-retroarch @@ -21,7 +21,7 @@ omarchy-pkg-drop \ libretro-parallel-n64 libretro-picodrive libretro-play libretro-ppsspp \ libretro-sameboy libretro-scummvm libretro-shaders-slang libretro-snes9x \ libretro-yabause \ - libretro-fbneo-git \ + libretro-cap32-git libretro-fbneo-git libretro-uae-git libretro-vice-git \ retroarch-joypad-autoconfig-git rm -rf \ From d1056a271bf08397c6766557732be5173a8a3bc2 Mon Sep 17 00:00:00 2001 From: Mikko Nyman Date: Wed, 6 May 2026 10:39:37 -0400 Subject: [PATCH 036/111] Install sof-firmware on Intel Panther Lake for DSP audio (#5606) * Install sof-firmware on Intel Panther Lake for DSP audio Co-Authored-By: Claude Opus 4.7 (1M context) * Need to have the sof-firmware package available during original offline install --------- Co-authored-by: Claude Opus 4.7 (1M context) Co-authored-by: David Heinemeier Hansson --- install/config/all.sh | 1 + install/config/hardware/intel/sof-firmware.sh | 8 ++++++++ install/omarchy-other.packages | 1 + migrations/1778026496.sh | 11 +++++++++++ 4 files changed, 21 insertions(+) create mode 100644 install/config/hardware/intel/sof-firmware.sh create mode 100644 migrations/1778026496.sh diff --git a/install/config/all.sh b/install/config/all.sh index bdd3f4ba..1656a2d5 100644 --- a/install/config/all.sh +++ b/install/config/all.sh @@ -47,6 +47,7 @@ run_logged $OMARCHY_INSTALL/config/hardware/intel/ipu7-camera.sh run_logged $OMARCHY_INSTALL/config/hardware/intel/ptl-kernel.sh run_logged $OMARCHY_INSTALL/config/hardware/intel/fred.sh run_logged $OMARCHY_INSTALL/config/hardware/intel/fix-wifi7-eht.sh +run_logged $OMARCHY_INSTALL/config/hardware/intel/sof-firmware.sh run_logged $OMARCHY_INSTALL/config/hardware/dell/fix-xps-haptic-touchpad.sh diff --git a/install/config/hardware/intel/sof-firmware.sh b/install/config/hardware/intel/sof-firmware.sh new file mode 100644 index 00000000..36b0be95 --- /dev/null +++ b/install/config/hardware/intel/sof-firmware.sh @@ -0,0 +1,8 @@ +# Install Sound Open Firmware for the audio DSP on non-XPS Intel Panther +# Lake systems. XPS PTL stays on linux-ptl, which hard-deps sof-firmware. +# Mainline `linux` only optdeps it, so without this the DSP fails to boot +# and only auto_null shows up in PipeWire. + +if omarchy-hw-intel-ptl && ! omarchy-hw-match "XPS"; then + omarchy-pkg-add sof-firmware +fi diff --git a/install/omarchy-other.packages b/install/omarchy-other.packages index a68ecd30..e5f88998 100644 --- a/install/omarchy-other.packages +++ b/install/omarchy-other.packages @@ -41,6 +41,7 @@ pipewire-jack pipewire-pulse qt6-wayland snapper +sof-firmware thermald webp-pixbuf-loader yay-debug diff --git a/migrations/1778026496.sh b/migrations/1778026496.sh new file mode 100644 index 00000000..d9d7b893 --- /dev/null +++ b/migrations/1778026496.sh @@ -0,0 +1,11 @@ +echo "Install sof-firmware on Intel Panther Lake to restore DSP audio" + +# linux-ptl hard-depped sof-firmware, mainline linux only optdeps it, so the +# orphan sweep after migration 1777572869 removed it. Force explicit so a +# subsequent orphan sweep in the same update cycle cannot take it again. + +if omarchy-hw-intel-ptl && ! omarchy-hw-match "XPS"; then + omarchy-pkg-add sof-firmware + sudo pacman -D --asexplicit sof-firmware >/dev/null + omarchy-state set reboot-required +fi From 590da72ff6d80218a12eee4777aae3d5e128c53d Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 16:52:44 +0200 Subject: [PATCH 037/111] Next version is 3.8 --- version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version b/version index a76ccff2..19811903 100644 --- a/version +++ b/version @@ -1 +1 @@ -3.7.1 +3.8.0 From 36f26d758497beb650067e37fa2fb197d5db8c1c Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 20:34:27 +0200 Subject: [PATCH 038/111] Make sure we regenerate the npx stubs too --- bin/omarchy-refresh-applications | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bin/omarchy-refresh-applications b/bin/omarchy-refresh-applications index 550d1c86..50c55ed2 100755 --- a/bin/omarchy-refresh-applications +++ b/bin/omarchy-refresh-applications @@ -1,6 +1,6 @@ #!/bin/bash -# omarchy:summary=Ensure all default .desktop, web apps, and TUIs are installed. +# omarchy:summary=Ensure all default .desktop, web apps, TUIs, and npx wrappers are installed. mkdir -p ~/.local/share/icons/hicolor/48x48/apps/ cp ~/.local/share/omarchy/applications/icons/*.png ~/.local/share/icons/hicolor/48x48/apps/ @@ -11,9 +11,10 @@ mkdir -p ~/.local/share/applications cp ~/.local/share/omarchy/applications/*.desktop ~/.local/share/applications/ cp ~/.local/share/omarchy/applications/hidden/*.desktop ~/.local/share/applications/ -# Refresh the webapps and TUIs +# Refresh the webapps, TUIs, and npx wrappers bash $OMARCHY_PATH/install/packaging/icons.sh bash $OMARCHY_PATH/install/packaging/webapps.sh bash $OMARCHY_PATH/install/packaging/tuis.sh +bash $OMARCHY_PATH/install/packaging/npx.sh update-desktop-database ~/.local/share/applications From 2a5db9ed781bd9f009280b997807ffdfef98a354 Mon Sep 17 00:00:00 2001 From: Luke Hsiao Date: Wed, 6 May 2026 12:38:08 -0600 Subject: [PATCH 039/111] Fix helix theme's word selection colors (#5630) * Fix helix theme's word selection colors Without this fix, if users enabled `editor.cursorline`, the word selection would not be visually distinct from the cursorline selection. Closes: https://github.com/basecamp/omarchy/issues/5580 Signed-off-by: Luke Hsiao * Make Retro-82 color0 visually distinct from background Signed-off-by: Luke Hsiao * Make matte-black selection background distinct from color0 Signed-off-by: Luke Hsiao --------- Signed-off-by: Luke Hsiao --- default/themed/helix.toml.tpl | 2 +- themes/matte-black/colors.toml | 2 +- themes/retro-82/colors.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/default/themed/helix.toml.tpl b/default/themed/helix.toml.tpl index 90ba441c..3cbe3067 100644 --- a/default/themed/helix.toml.tpl +++ b/default/themed/helix.toml.tpl @@ -87,7 +87,7 @@ "ui.virtual.jump-label" = { fg = "color1", modifiers = ["bold"] } "ui.virtual.whitespace" = "color8" -"ui.selection" = { bg = "color0" } +"ui.selection" = { bg = "selection_background", fg = "selection_foreground" } "ui.cursor" = { fg = "background", bg = "cursor" } "ui.cursor.primary" = { fg = "background", bg = "cursor" } diff --git a/themes/matte-black/colors.toml b/themes/matte-black/colors.toml index f0f1d3a6..5e1a8cca 100644 --- a/themes/matte-black/colors.toml +++ b/themes/matte-black/colors.toml @@ -3,7 +3,7 @@ cursor = "#eaeaea" foreground = "#bebebe" background = "#121212" selection_foreground = "#bebebe" -selection_background = "#333333" +selection_background = "#515151" color0 = "#333333" color1 = "#D35F5F" diff --git a/themes/retro-82/colors.toml b/themes/retro-82/colors.toml index 21cf8103..1b5285d1 100644 --- a/themes/retro-82/colors.toml +++ b/themes/retro-82/colors.toml @@ -15,7 +15,7 @@ selection_foreground = "#00172e" selection_background = "#faa968" # Normal colors (ANSI 0-7) -color0 = "#00172e" +color0 = "#303442" color1 = "#f85525" color2 = "#028391" color3 = "#e97b3c" From f838cbb63f85e98226b9c328acb9a342a22709f2 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 21:03:43 +0200 Subject: [PATCH 040/111] Use proper .desktop files --- applications/foot-server.desktop | 4 ---- applications/footclient.desktop | 4 ---- applications/hidden/foot-server.desktop | 2 ++ applications/hidden/footclient.desktop | 2 ++ bin/omarchy-install-terminal | 5 ++++- bin/omarchy-refresh-applications | 4 ++++ {applications => default/foot}/foot.desktop | 0 migrations/1778008689.sh | 6 +++--- 8 files changed, 15 insertions(+), 12 deletions(-) delete mode 100644 applications/foot-server.desktop delete mode 100644 applications/footclient.desktop create mode 100644 applications/hidden/foot-server.desktop create mode 100644 applications/hidden/footclient.desktop rename {applications => default/foot}/foot.desktop (100%) diff --git a/applications/foot-server.desktop b/applications/foot-server.desktop deleted file mode 100644 index 0ab86d65..00000000 --- a/applications/foot-server.desktop +++ /dev/null @@ -1,4 +0,0 @@ -[Desktop Entry] -Type=Application -Name=Foot Server -NoDisplay=true diff --git a/applications/footclient.desktop b/applications/footclient.desktop deleted file mode 100644 index e4590087..00000000 --- a/applications/footclient.desktop +++ /dev/null @@ -1,4 +0,0 @@ -[Desktop Entry] -Type=Application -Name=Foot Client -NoDisplay=true diff --git a/applications/hidden/foot-server.desktop b/applications/hidden/foot-server.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/foot-server.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/applications/hidden/footclient.desktop b/applications/hidden/footclient.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/footclient.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true diff --git a/bin/omarchy-install-terminal b/bin/omarchy-install-terminal index 15a869d1..2fb040dd 100755 --- a/bin/omarchy-install-terminal +++ b/bin/omarchy-install-terminal @@ -28,9 +28,12 @@ echo "Installing $package..." # Install package if omarchy-pkg-add $package; then # Copy custom desktop entries with X-TerminalArg* keys - if [[ $package == "alacritty" || $package == "foot" ]]; then + if [[ $package == "alacritty" ]]; then mkdir -p ~/.local/share/applications cp "$OMARCHY_PATH/applications/$desktop_id" ~/.local/share/applications/ + elif [[ $package == "foot" ]]; then + mkdir -p ~/.local/share/applications + cp "$OMARCHY_PATH/default/foot/$desktop_id" ~/.local/share/applications/ fi # Copy default config for optional terminals when missing diff --git a/bin/omarchy-refresh-applications b/bin/omarchy-refresh-applications index 50c55ed2..9eb4e9de 100755 --- a/bin/omarchy-refresh-applications +++ b/bin/omarchy-refresh-applications @@ -11,6 +11,10 @@ mkdir -p ~/.local/share/applications cp ~/.local/share/omarchy/applications/*.desktop ~/.local/share/applications/ cp ~/.local/share/omarchy/applications/hidden/*.desktop ~/.local/share/applications/ +if omarchy-cmd-present foot; then + cp ~/.local/share/omarchy/default/foot/foot.desktop ~/.local/share/applications/ +fi + # Refresh the webapps, TUIs, and npx wrappers bash $OMARCHY_PATH/install/packaging/icons.sh bash $OMARCHY_PATH/install/packaging/webapps.sh diff --git a/applications/foot.desktop b/default/foot/foot.desktop similarity index 100% rename from applications/foot.desktop rename to default/foot/foot.desktop diff --git a/migrations/1778008689.sh b/migrations/1778008689.sh index dbe97743..de066e72 100644 --- a/migrations/1778008689.sh +++ b/migrations/1778008689.sh @@ -31,9 +31,9 @@ fi if omarchy-cmd-present foot; then mkdir -p ~/.local/share/applications rm -f ~/.local/share/applications/org.codeberg.dnkl.foot.desktop - cp -Rpf "$OMARCHY_PATH/applications/foot.desktop" ~/.local/share/applications/ - cp -Rpf "$OMARCHY_PATH/applications/footclient.desktop" ~/.local/share/applications/ - cp -Rpf "$OMARCHY_PATH/applications/foot-server.desktop" ~/.local/share/applications/ + cp -Rpf "$OMARCHY_PATH/default/foot/foot.desktop" ~/.local/share/applications/ + cp -Rpf "$OMARCHY_PATH/applications/hidden/footclient.desktop" ~/.local/share/applications/ + cp -Rpf "$OMARCHY_PATH/applications/hidden/foot-server.desktop" ~/.local/share/applications/ fi if [[ -f ~/.config/hypr/input.conf ]]; then From ec428fa549d8fbf238aadbf29e7bfbc23f8e2ca0 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 21:05:24 +0200 Subject: [PATCH 041/111] Just focus on the window rules --- migrations/1778008689.sh | 38 +------------------------------------- 1 file changed, 1 insertion(+), 37 deletions(-) diff --git a/migrations/1778008689.sh b/migrations/1778008689.sh index de066e72..2baefc54 100644 --- a/migrations/1778008689.sh +++ b/migrations/1778008689.sh @@ -1,40 +1,4 @@ -echo "Add Foot terminal config and theme support" - -if [[ ! -f ~/.config/foot/foot.ini ]]; then - mkdir -p ~/.config/foot - cp -Rpf "$OMARCHY_PATH/config/foot/foot.ini" ~/.config/foot/foot.ini -elif ! grep -q "^primary-paste=none" ~/.config/foot/foot.ini; then - sed -i '/^clipboard-copy=Control+Insert/a primary-paste=none' ~/.config/foot/foot.ini -fi - -if [[ -f ~/.config/omarchy/current/theme/foot.ini ]]; then - sed -i 's/^\[colors\]$/[colors-dark]/' ~/.config/omarchy/current/theme/foot.ini -fi - -if [[ ! -f ~/.config/omarchy/current/theme/foot.ini && -f ~/.config/omarchy/current/theme/colors.toml ]]; then - sed_script=$(mktemp) - - while IFS='=' read -r key value; do - key="${key//[\"\' ]/}" - [[ $key && $key != \#* ]] || continue - value="${value#*[\"\']}" - value="${value%%[\"\']*}" - - printf 's|{{ %s }}|%s|g\n' "$key" "$value" - printf 's|{{ %s_strip }}|%s|g\n' "$key" "${value#\#}" - done <~/.config/omarchy/current/theme/colors.toml >"$sed_script" - - sed -f "$sed_script" "$OMARCHY_PATH/default/themed/foot.ini.tpl" >~/.config/omarchy/current/theme/foot.ini - rm "$sed_script" -fi - -if omarchy-cmd-present foot; then - mkdir -p ~/.local/share/applications - rm -f ~/.local/share/applications/org.codeberg.dnkl.foot.desktop - cp -Rpf "$OMARCHY_PATH/default/foot/foot.desktop" ~/.local/share/applications/ - cp -Rpf "$OMARCHY_PATH/applications/hidden/footclient.desktop" ~/.local/share/applications/ - cp -Rpf "$OMARCHY_PATH/applications/hidden/foot-server.desktop" ~/.local/share/applications/ -fi +echo "Add Foot terminal window rules where terminals are described" if [[ -f ~/.config/hypr/input.conf ]]; then sed -Ei 's/match:class \(Alacritty\|kitty\)/match:class (Alacritty|kitty|foot)/' ~/.config/hypr/input.conf From 3f5300c13dfba1b8b6dffdc8423a3e0b2e3c71e9 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 6 May 2026 21:06:24 +0200 Subject: [PATCH 042/111] Update meta data ruel --- AGENTS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AGENTS.md b/AGENTS.md index e1ddb88c..c5eea9b8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -45,6 +45,7 @@ Supported metadata keys: - `# 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. From 95ba1c429665404f2d7c9ead61240c39bb4c2bc5 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 09:06:16 +0200 Subject: [PATCH 043/111] Reference new F9 push-to-talk button --- bin/omarchy-voxtype-install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/omarchy-voxtype-install b/bin/omarchy-voxtype-install index 9cb7af75..e2ab8a53 100755 --- a/bin/omarchy-voxtype-install +++ b/bin/omarchy-voxtype-install @@ -21,5 +21,5 @@ if gum confirm "Install Voxtype + AI model (~150MB) to enable dictation?"; then voxtype setup systemd omarchy-restart-waybar - notify-send " Voxtype Dictation Ready" "Press Super + Ctrl + X to toggle dictation.\nEdit ~/.config/voxtype/config.toml for options." -t 10000 + notify-send " Voxtype Dictation Ready" "Hold F9 (or toggle Super + Ctrl + X) to dictate.\nEdit ~/.config/voxtype/config.toml for options." -t 10000 fi From 6a0935d248c59c97c38536b9618b805a208dd5b5 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 09:34:04 +0200 Subject: [PATCH 044/111] Improve notification --- bin/omarchy-voxtype-install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/omarchy-voxtype-install b/bin/omarchy-voxtype-install index e2ab8a53..32a1153e 100755 --- a/bin/omarchy-voxtype-install +++ b/bin/omarchy-voxtype-install @@ -21,5 +21,5 @@ if gum confirm "Install Voxtype + AI model (~150MB) to enable dictation?"; then voxtype setup systemd omarchy-restart-waybar - notify-send " Voxtype Dictation Ready" "Hold F9 (or toggle Super + Ctrl + X) to dictate.\nEdit ~/.config/voxtype/config.toml for options." -t 10000 + notify-send " Voxtype Dictation Ready" "Hold F9 to dictate (or toggle with Super + Ctrl + X)." -t 10000 fi From f0969c6793e92a2504b8cfc07f620adf392b64e2 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 09:46:00 +0200 Subject: [PATCH 045/111] Allow hooks to live in a .d directory --- bin/omarchy-hook | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/bin/omarchy-hook b/bin/omarchy-hook index 85b5a180..db647881 100755 --- a/bin/omarchy-hook +++ b/bin/omarchy-hook @@ -1,6 +1,6 @@ #!/bin/bash -# omarchy:summary=Run a named hook, like post-update (available in ~/.config/omarchy/hooks/post-update). +# omarchy:summary=Run a named hook from ~/.config/omarchy/hooks/ and ~/.config/omarchy/hooks/.d/. # omarchy:args=[name] [args...] set -e @@ -12,8 +12,16 @@ fi HOOK=$1 HOOK_PATH="$HOME/.config/omarchy/hooks/$1" +HOOK_DIR="$HOOK_PATH.d" shift if [[ -f $HOOK_PATH ]]; then bash "$HOOK_PATH" "$@" fi + +if [[ -d $HOOK_DIR ]]; then + for hook in "$HOOK_DIR"/*; do + [[ -f $hook ]] || continue + bash "$hook" "$@" + done +fi From fe0ea4de3e8a5d779782a4b3754ee452a79c9343 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 09:59:18 +0200 Subject: [PATCH 046/111] Move to .d directories for hooks instead of a single file Easier to manage especially with separate installs --- bin/omarchy-hook | 1 + .../play-warning-sound.sample} | 2 +- .../show-font-notification.sample} | 4 ++-- .../show-update-notification.sample} | 2 +- .../show-theme-notification.sample} | 2 +- migrations/1772990935.sh | 6 +++--- 6 files changed, 9 insertions(+), 8 deletions(-) rename config/omarchy/hooks/{battery-low.sample => battery-low.d/play-warning-sound.sample} (95%) rename config/omarchy/hooks/{font-set.sample => font-set.d/show-font-notification.sample} (57%) rename config/omarchy/hooks/{post-update.sample => post-update.d/show-update-notification.sample} (79%) rename config/omarchy/hooks/{theme-set.sample => theme-set.d/show-theme-notification.sample} (78%) diff --git a/bin/omarchy-hook b/bin/omarchy-hook index db647881..c6c6f87f 100755 --- a/bin/omarchy-hook +++ b/bin/omarchy-hook @@ -22,6 +22,7 @@ fi if [[ -d $HOOK_DIR ]]; then for hook in "$HOOK_DIR"/*; do [[ -f $hook ]] || continue + [[ $hook == *.sample ]] && continue bash "$hook" "$@" done fi diff --git a/config/omarchy/hooks/battery-low.sample b/config/omarchy/hooks/battery-low.d/play-warning-sound.sample similarity index 95% rename from config/omarchy/hooks/battery-low.sample rename to config/omarchy/hooks/battery-low.d/play-warning-sound.sample index dc3726a9..61da3320 100644 --- a/config/omarchy/hooks/battery-low.sample +++ b/config/omarchy/hooks/battery-low.d/play-warning-sound.sample @@ -1,7 +1,7 @@ #!/bin/bash # This hook is called with the current battery percentage when the low battery -# notification is sent. To put it into use, remove .sample from the name. +# notification is sent. To put it into use, remove .sample from this file name. SOUND_FILE="/usr/share/sounds/freedesktop/stereo/dialog-warning.oga" diff --git a/config/omarchy/hooks/font-set.sample b/config/omarchy/hooks/font-set.d/show-font-notification.sample similarity index 57% rename from config/omarchy/hooks/font-set.sample rename to config/omarchy/hooks/font-set.d/show-font-notification.sample index 3f0109a9..a75f2fa8 100644 --- a/config/omarchy/hooks/font-set.sample +++ b/config/omarchy/hooks/font-set.d/show-font-notification.sample @@ -1,7 +1,7 @@ #!/bin/bash # This hook is called with the snake-cased name of the font that has just been set. -# To put it into use, remove .sample from the name. +# To put it into use, remove .sample from this file name. -# Example: Show the name of the theme that was just set. +# Example: Show the name of the font that was just set. # notify-send -u low "New font" "Your new font is $1" diff --git a/config/omarchy/hooks/post-update.sample b/config/omarchy/hooks/post-update.d/show-update-notification.sample similarity index 79% rename from config/omarchy/hooks/post-update.sample rename to config/omarchy/hooks/post-update.d/show-update-notification.sample index f740d5bb..f6ba07b0 100644 --- a/config/omarchy/hooks/post-update.sample +++ b/config/omarchy/hooks/post-update.d/show-update-notification.sample @@ -1,7 +1,7 @@ #!/bin/bash # This hook is called after an Omarchy system update has been performed. -# To put it into use, remove .sample from the name. +# To put it into use, remove .sample from this file name. # Example: Show notification after the system has been updated. # notify-send -u low "Update Performed" "Your system is now up to date" diff --git a/config/omarchy/hooks/theme-set.sample b/config/omarchy/hooks/theme-set.d/show-theme-notification.sample similarity index 78% rename from config/omarchy/hooks/theme-set.sample rename to config/omarchy/hooks/theme-set.d/show-theme-notification.sample index 2d13287f..db19b298 100644 --- a/config/omarchy/hooks/theme-set.sample +++ b/config/omarchy/hooks/theme-set.d/show-theme-notification.sample @@ -1,7 +1,7 @@ #!/bin/bash # This hook is called with the snake-cased name of the theme that has just been set. -# To put it into use, remove .sample from the name. +# To put it into use, remove .sample from this file name. # Example: Show the name of the theme that was just set. # notify-send -u low "New theme" "Your new theme is $1" diff --git a/migrations/1772990935.sh b/migrations/1772990935.sh index 2f3526c2..2b58912d 100644 --- a/migrations/1772990935.sh +++ b/migrations/1772990935.sh @@ -1,7 +1,7 @@ echo "Add sample low battery notification hook" -mkdir -p ~/.config/omarchy/hooks +mkdir -p ~/.config/omarchy/hooks/battery-low.d -if [[ ! -f ~/.config/omarchy/hooks/battery-low.sample ]]; then - cp "$OMARCHY_PATH/config/omarchy/hooks/battery-low.sample" ~/.config/omarchy/hooks/battery-low.sample +if [[ ! -f ~/.config/omarchy/hooks/battery-low.d/play-warning-sound.sample ]]; then + cp "$OMARCHY_PATH/config/omarchy/hooks/battery-low.d/play-warning-sound.sample" ~/.config/omarchy/hooks/battery-low.d/play-warning-sound.sample fi From c9aece1cb74f4b966c2adaced18db2834eab8532 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 10:33:12 +0200 Subject: [PATCH 047/111] Make sure individual hooks can't halt the process --- bin/omarchy-hook | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/omarchy-hook b/bin/omarchy-hook index c6c6f87f..8c2a59d9 100755 --- a/bin/omarchy-hook +++ b/bin/omarchy-hook @@ -16,13 +16,13 @@ HOOK_DIR="$HOOK_PATH.d" shift if [[ -f $HOOK_PATH ]]; then - bash "$HOOK_PATH" "$@" + bash "$HOOK_PATH" "$@" || echo "Hook failed: $HOOK_PATH" fi if [[ -d $HOOK_DIR ]]; then for hook in "$HOOK_DIR"/*; do [[ -f $hook ]] || continue [[ $hook == *.sample ]] && continue - bash "$hook" "$@" + bash "$hook" "$@" || echo "Hook failed: $hook" done fi From c8f65ccdb1643dde6e959d54255921e299c47195 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 10:34:28 +0200 Subject: [PATCH 048/111] Add a structured way to install a hook --- bin/omarchy-hook-install | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100755 bin/omarchy-hook-install diff --git a/bin/omarchy-hook-install b/bin/omarchy-hook-install new file mode 100755 index 00000000..7c536482 --- /dev/null +++ b/bin/omarchy-hook-install @@ -0,0 +1,31 @@ +#!/bin/bash + +# omarchy:summary=Install a hook into ~/.config/omarchy/hooks/.d/ +# omarchy:group=hook +# omarchy:name=install +# omarchy:args= +# omarchy:examples=omarchy hook install post-update ~/my-hook + +set -e + +if (( $# != 2 )); then + echo "Usage: omarchy-hook-install " + exit 1 +fi + +HOOK_TYPE=$1 +HOOK_FILE=$2 +HOOK_DIR="$HOME/.config/omarchy/hooks/$HOOK_TYPE.d" +HOOK_NAME=$(basename "$HOOK_FILE") +HOOK_PATH="$HOOK_DIR/$HOOK_NAME" + +if [[ ! -f $HOOK_FILE ]]; then + echo "Hook file not found: $HOOK_FILE" + exit 1 +fi + +mkdir -p "$HOOK_DIR" +cp "$HOOK_FILE" "$HOOK_PATH" +chmod 755 "$HOOK_PATH" + +echo "Installed $HOOK_TYPE hook: $HOOK_PATH" From 42cd7472cfc3093ca7e0180bc94c156717f4ed8d Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 10:35:23 +0200 Subject: [PATCH 049/111] Give people an invitation to install dictation after the first update --- bin/omarchy-first-run | 1 + default/mako/core.ini | 3 +++ install/first-run/install-voxtype.hook | 8 ++++++++ 3 files changed, 12 insertions(+) create mode 100644 install/first-run/install-voxtype.hook diff --git a/bin/omarchy-first-run b/bin/omarchy-first-run index 8fde0534..6ad54141 100755 --- a/bin/omarchy-first-run +++ b/bin/omarchy-first-run @@ -18,6 +18,7 @@ if [[ -f $FIRST_RUN_MODE ]]; then bash "$OMARCHY_PATH/install/first-run/gnome-theme.sh" bash "$OMARCHY_PATH/install/first-run/gtk-primary-paste.sh" bash "$OMARCHY_PATH/install/first-run/elephant.sh" + omarchy-hook-install post-update "$OMARCHY_PATH/install/first-run/install-voxtype.hook" sudo rm -f /etc/sudoers.d/first-run bash "$OMARCHY_PATH/install/first-run/welcome.sh" diff --git a/default/mako/core.ini b/default/mako/core.ini index 203d4e8c..78c24452 100644 --- a/default/mako/core.ini +++ b/default/mako/core.ini @@ -29,6 +29,9 @@ on-button-left=exec sh -c 'omarchy-notification-dismiss "Update System"; omarchy [summary~="Learn Keybindings"] on-button-left=exec sh -c 'omarchy-notification-dismiss "Learn Keybindings"; omarchy-menu-keybindings' +[summary~="Install Dictation with Voxtype"] +on-button-left=exec sh -c 'omarchy-notification-dismiss "Install Dictation with Voxtype"; omarchy-launch-floating-terminal-with-presentation omarchy-voxtype-install' + [summary~="Screenshot copied & saved"] max-icon-size=80 format=%s\n%b diff --git a/install/first-run/install-voxtype.hook b/install/first-run/install-voxtype.hook new file mode 100644 index 00000000..5513c4e6 --- /dev/null +++ b/install/first-run/install-voxtype.hook @@ -0,0 +1,8 @@ +#!/bin/bash + +set -e + +# Remove this hook after use +rm -f "$0" + +notify-send " Install Dictation with Voxtype" "Click to install voice dictation for Omarchy." -u critical From 6b6d71a9d2c2228f0e22e92cdfdf155ffe96c496 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 10:48:32 +0200 Subject: [PATCH 050/111] Add live weather (#5633) * Add live weather * Just use jq * Add Weather app and make it click target * Simplify * Looks better * Nicer flow * Simplify * Move to using the notification instead of tooltip * No longer needed --- bin/omarchy | 1 + bin/omarchy-weather-icon | 36 ++++++++++++++++++++++++++++ bin/omarchy-weather-status | 26 ++++++++++++++++++++ config/waybar/config.jsonc | 9 ++++++- config/waybar/style.css | 11 +++++++++ default/hypr/bindings/utilities.conf | 1 + default/waybar/weather.sh | 10 ++++++++ migrations/1778139028.sh | 29 ++++++++++++++++++++++ 8 files changed, 122 insertions(+), 1 deletion(-) create mode 100755 bin/omarchy-weather-icon create mode 100755 bin/omarchy-weather-status create mode 100755 default/waybar/weather.sh create mode 100644 migrations/1778139028.sh diff --git a/bin/omarchy b/bin/omarchy index ad743ce7..29b7cfb4 100755 --- a/bin/omarchy +++ b/bin/omarchy @@ -69,6 +69,7 @@ GROUP_DESCRIPTIONS[tz]="Timezone selection" GROUP_DESCRIPTIONS[update]="Omarchy and system updates" GROUP_DESCRIPTIONS[version]="Version and channel information" GROUP_DESCRIPTIONS[voxtype]="Voxtype dictation" +GROUP_DESCRIPTIONS[weather]="Weather status" GROUP_DESCRIPTIONS[webapp]="Web app launchers" GROUP_DESCRIPTIONS[wifi]="Wi-Fi helpers" GROUP_DESCRIPTIONS[windows]="Windows VM management" diff --git a/bin/omarchy-weather-icon b/bin/omarchy-weather-icon new file mode 100755 index 00000000..072af706 --- /dev/null +++ b/bin/omarchy-weather-icon @@ -0,0 +1,36 @@ +#!/bin/bash + +# omarchy:summary=Returns a weather condition icon, adjusted for live sunrise and sunset. + +weather_data=$(curl -fsS --max-time 3 "https://wttr.in?format=j1" 2>/dev/null | jq -er '[.current_condition[0].weatherCode, .weather[0].astronomy[0].sunrise, .weather[0].astronomy[0].sunset] | select(all(. != null and . != "")) | @tsv' 2>/dev/null) || exit 1 + +IFS=$'\t' read -r weather_code sunrise sunset <<< "$weather_data" +if [[ ! $weather_code =~ ^[0-9]+$ || ! $sunrise =~ ^[0-9]{1,2}:[0-9]{2}\ [AP]M$ || ! $sunset =~ ^[0-9]{1,2}:[0-9]{2}\ [AP]M$ ]]; then + exit 1 +fi + +now_epoch=$(date +%s) +sunrise_epoch=$(date -d "today $sunrise" +%s 2>/dev/null || echo 0) +sunset_epoch=$(date -d "today $sunset" +%s 2>/dev/null || echo 0) + +if (( sunrise_epoch > 0 && sunset_epoch > 0 && (now_epoch < sunrise_epoch || now_epoch >= sunset_epoch) )); then + night=true +else + night=false +fi + +case $weather_code in + 113) [[ $night == "true" ]] && icon="" || icon="" ;; + 116) [[ $night == "true" ]] && icon="" || icon="" ;; + 119|122) icon="" ;; + 143|248|260) icon="" ;; + 176|263|266|293|296|353) [[ $night == "true" ]] && icon="" || icon="" ;; + 179|227|230|323|326|368) [[ $night == "true" ]] && icon="" || icon="" ;; + 182|185|281|284|311|314|317|320|350|362|365|374|377) icon="" ;; + 200|386|389|392|395) icon="" ;; + 299|302|305|308|356|359) icon="" ;; + 329|332|335|338|371) icon="" ;; + *) icon="" ;; +esac + +printf '%s\n' "$icon" diff --git a/bin/omarchy-weather-status b/bin/omarchy-weather-status new file mode 100755 index 00000000..126d6582 --- /dev/null +++ b/bin/omarchy-weather-status @@ -0,0 +1,26 @@ +#!/bin/bash + +# omarchy:summary=Returns a formatted weather status string with temperature and wind speed. + +weather=$(curl -fsS --max-time 4 "https://wttr.in?format=%l|%t|%w" 2>/dev/null | tr -d '\n') + +if [[ -z $weather ]]; then + echo "Weather unavailable" + exit 1 +fi + +IFS='|' read -r place temperature wind <<< "$weather" +place=${place%%,*} +place=${place^} +format_temperature() { + local celsius=${1#+} + celsius=${celsius//°/} + celsius=${celsius%C} + + echo "${celsius}°c / $((celsius * 9 / 5 + 32))°f" +} + +temperature=$(format_temperature "$temperature") +wind=${wind//km\// km/} + +echo "$(omarchy-weather-icon) $place · Temperature $temperature · Wind $wind" diff --git a/config/waybar/config.jsonc b/config/waybar/config.jsonc index cbf211c3..61a11eca 100644 --- a/config/waybar/config.jsonc +++ b/config/waybar/config.jsonc @@ -5,7 +5,7 @@ "spacing": 0, "height": 26, "modules-left": ["custom/omarchy", "hyprland/workspaces"], - "modules-center": ["clock", "custom/update", "custom/voxtype", "custom/screenrecording-indicator", "custom/idle-indicator", "custom/notification-silencing-indicator"], + "modules-center": ["clock", "custom/weather", "custom/update", "custom/voxtype", "custom/screenrecording-indicator", "custom/idle-indicator", "custom/notification-silencing-indicator"], "modules-right": [ "group/tray-expander", "bluetooth", @@ -66,6 +66,13 @@ "tooltip": false, "on-click-right": "omarchy-launch-floating-terminal-with-presentation omarchy-tz-select" }, + "custom/weather": { + "exec": "$OMARCHY_PATH/default/waybar/weather.sh", + "return-type": "json", + "interval": 600, + "tooltip": false, + "on-click": "notify-send -u low \"$(omarchy-weather-status)\"" + }, "network": { "format-icons": ["󰤯", "󰤟", "󰤢", "󰤥", "󰤨"], "format": "{icon}", diff --git a/config/waybar/style.css b/config/waybar/style.css index 4bbf0ddb..63302efa 100644 --- a/config/waybar/style.css +++ b/config/waybar/style.css @@ -67,6 +67,17 @@ tooltip { margin-left: 8.75px; } +#custom-weather { + margin-left: 7.5px; + margin-right: 7.5px; +} + +#custom-weather.unavailable { + min-width: 0; + margin: 0; + padding: 0; +} + .hidden { opacity: 0; } diff --git a/default/hypr/bindings/utilities.conf b/default/hypr/bindings/utilities.conf index 083a4c91..c152f884 100644 --- a/default/hypr/bindings/utilities.conf +++ b/default/hypr/bindings/utilities.conf @@ -49,6 +49,7 @@ bindd = SUPER CTRL, R, Transcode, exec, omarchy-menu transcode # Waybar-less information bindd = SUPER CTRL ALT, T, Show time, exec, notify-send -u low " $(date +"%A %H:%M · %d %B %Y · Week %V")" bindd = SUPER CTRL ALT, B, Show battery remaining, exec, notify-send -u low "$(omarchy-battery-status)" +bindd = SUPER CTRL ALT, W, Show weather, exec, notify-send -u low "$(omarchy-weather-status)" # Control panels bindd = SUPER CTRL, A, Audio controls, exec, omarchy-launch-audio diff --git a/default/waybar/weather.sh b/default/waybar/weather.sh new file mode 100755 index 00000000..02e7bc2b --- /dev/null +++ b/default/waybar/weather.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +icon=$(omarchy-weather-icon 2>/dev/null) + +if [[ -n $icon ]]; then + icon=$(printf '%s' "$icon" | sed 's/["\\]/\\&/g') + printf '{"text":"%s"}\n' "$icon" +else + printf '{"text":"","class":"unavailable"}\n' +fi diff --git a/migrations/1778139028.sh b/migrations/1778139028.sh new file mode 100644 index 00000000..e5728ced --- /dev/null +++ b/migrations/1778139028.sh @@ -0,0 +1,29 @@ +echo "Add weather widget to Waybar" + +WAYBAR_CONFIG="$HOME/.config/waybar/config.jsonc" +WAYBAR_STYLE="$HOME/.config/waybar/style.css" + +if [[ -f $WAYBAR_CONFIG ]]; then + if ! grep -q '"custom/weather"' "$WAYBAR_CONFIG"; then + sed -i 's/"modules-center": \["clock",/"modules-center": ["clock", "custom\/weather",/' "$WAYBAR_CONFIG" + sed -i '/"network": {/i\ "custom/weather": {\n "exec": "$OMARCHY_PATH/default/waybar/weather.sh",\n "return-type": "json",\n "interval": 600,\n "tooltip": false,\n "on-click": "notify-send -u low \\"$(omarchy-weather-status)\\""\n },' "$WAYBAR_CONFIG" + fi +fi + +if [[ -f $WAYBAR_STYLE ]] && ! grep -q '#custom-weather' "$WAYBAR_STYLE"; then + cat >>"$WAYBAR_STYLE" <<'EOF' + +#custom-weather { + margin-left: 7.5px; + margin-right: 7.5px; +} + +#custom-weather.unavailable { + min-width: 0; + margin: 0; + padding: 0; +} +EOF +fi + +omarchy-restart-waybar From 5cf83d207382aaa8ab7e2eb912204f5ec93b67f3 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 11:16:40 +0200 Subject: [PATCH 051/111] Match sddm to decrypt style (#5645) * Make SDDM screen match the normal decrypt screen as close as possible * Try with a different error style on wrong pw * Do red lock on failure too --- bin/omarchy-plymouth-set | 10 +- default/sddm/omarchy/Main.qml | 173 ++++++++++++++------------ default/sddm/omarchy/bullet.png | Bin 0 -> 293 bytes default/sddm/omarchy/entry-failed.png | Bin 0 -> 419 bytes default/sddm/omarchy/entry.png | Bin 0 -> 694 bytes default/sddm/omarchy/lock-failed.png | Bin 0 -> 1444 bytes default/sddm/omarchy/lock.png | Bin 0 -> 1537 bytes default/sddm/omarchy/logo.png | Bin 0 -> 3072 bytes default/sddm/omarchy/logo.svg | 1 - 9 files changed, 103 insertions(+), 81 deletions(-) create mode 100644 default/sddm/omarchy/bullet.png create mode 100644 default/sddm/omarchy/entry-failed.png create mode 100644 default/sddm/omarchy/entry.png create mode 100644 default/sddm/omarchy/lock-failed.png create mode 100644 default/sddm/omarchy/lock.png create mode 100644 default/sddm/omarchy/logo.png delete mode 100644 default/sddm/omarchy/logo.svg diff --git a/bin/omarchy-plymouth-set b/bin/omarchy-plymouth-set index ff9ca27d..c92ca53c 100755 --- a/bin/omarchy-plymouth-set +++ b/bin/omarchy-plymouth-set @@ -68,10 +68,16 @@ sddm_dir="/usr/share/sddm/themes/omarchy" sddm_template="$HOME/.local/share/omarchy/default/sddm/omarchy/Main.qml" sed \ - -e "s/#000000/#$bg_hex/g" \ + -e "s/#1a1b26/#$bg_hex/g" \ -e "s/#ffffff/#$text_hex/g" \ - -e 's|source: "logo.svg"|source: "logo.png"|' \ "$sddm_template" | sudo tee "$sddm_dir/Main.qml" >/dev/null sudo cp "$logo_path" "$sddm_dir/logo.png" +for asset in bullet.png entry.png lock.png; do + sudo cp "$staging_dir/$asset" "$sddm_dir/$asset" +done +for asset in entry lock; do + magick "$staging_dir/$asset.png" -channel RGB +level-colors "#f7768e","#f7768e" "$staging_dir/$asset-failed.png" + sudo cp "$staging_dir/$asset-failed.png" "$sddm_dir/$asset-failed.png" +done sudo rm -f "$sddm_dir/logo.svg" diff --git a/default/sddm/omarchy/Main.qml b/default/sddm/omarchy/Main.qml index d074913e..a65411e2 100644 --- a/default/sddm/omarchy/Main.qml +++ b/default/sddm/omarchy/Main.qml @@ -2,98 +2,115 @@ import QtQuick 2.0 import SddmComponents 2.0 Rectangle { - id: root - width: 640 - height: 480 - color: "#000000" + id: root + width: 640 + height: 480 + color: "#1a1b26" - property string currentUser: userModel.lastUser - property int sessionIndex: { - for (var i = 0; i < sessionModel.rowCount(); i++) { - var name = (sessionModel.data(sessionModel.index(i, 0), Qt.DisplayRole) || "").toString() - if (name.indexOf("uwsm") !== -1) - return i - } - return sessionModel.lastIndex + property string currentUser: userModel.lastUser + property bool loginFailed: false + property int sessionIndex: { + for (var i = 0; i < sessionModel.rowCount(); i++) { + var name = (sessionModel.data(sessionModel.index(i, 0), Qt.DisplayRole) || "").toString() + if (name.indexOf("uwsm") !== -1) + return i + } + return sessionModel.lastIndex + } + + Connections { + target: sddm + function onLoginFailed() { + root.loginFailed = true + password.text = "" + password.focus = true + } + function onLoginSucceeded() { + root.loginFailed = false + } + } + + Column { + anchors.centerIn: parent + spacing: 40 + + Image { + id: logo + source: "logo.png" + width: Math.min(sourceSize.width, root.width * 0.8) + height: sourceSize.width > 0 ? Math.round(width * sourceSize.height / sourceSize.width) : 0 + fillMode: Image.PreserveAspectFit + anchors.horizontalCenter: parent.horizontalCenter } - Connections { - target: sddm - function onLoginFailed() { - errorMessage.text = "Login failed" - password.text = "" - password.focus = true - } - function onLoginSucceeded() { - errorMessage.text = "" - } - } + Row { + anchors.horizontalCenter: parent.horizontalCenter + spacing: 15 - Column { - anchors.centerIn: parent - spacing: root.height * 0.04 - width: parent.width + Image { + source: root.loginFailed ? "lock-failed.png" : "lock.png" + width: 34 + height: 38 + fillMode: Image.PreserveAspectFit + anchors.verticalCenter: parent.verticalCenter + } + + Item { + width: entry.width + height: entry.height Image { - source: "logo.svg" - width: root.width * 0.35 - height: Math.round(width * sourceSize.height / sourceSize.width) - fillMode: Image.PreserveAspectFit - anchors.horizontalCenter: parent.horizontalCenter + id: entry + source: root.loginFailed ? "entry-failed.png" : "entry.png" + anchors.centerIn: parent } Row { - anchors.horizontalCenter: parent.horizontalCenter - spacing: root.width * 0.007 + anchors.left: parent.left + anchors.leftMargin: 20 + anchors.verticalCenter: parent.verticalCenter + spacing: 5 - Text { - text: "\uf023" - color: "#ffffff" - font.family: "JetBrainsMono Nerd Font" - font.pixelSize: root.height * 0.025 - anchors.verticalCenter: parent.verticalCenter - } - - Rectangle { - width: root.width * 0.17 - height: root.height * 0.04 - color: "#000000" - border.color: "#ffffff" - border.width: 1 - clip: true - - TextInput { - id: password - anchors.fill: parent - anchors.margins: root.height * 0.008 - verticalAlignment: TextInput.AlignVCenter - echoMode: TextInput.Password - font.family: "JetBrainsMono Nerd Font" - font.pixelSize: root.height * 0.02 - font.letterSpacing: root.height * 0.004 - passwordCharacter: "\u2022" - color: "#ffffff" - focus: true - - Keys.onPressed: { - if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { - sddm.login(root.currentUser, password.text, root.sessionIndex) - event.accepted = true - } - } - } + Repeater { + model: Math.min(password.text.length, 21) + + Image { + source: "bullet.png" + width: 7 + height: 7 } + } } - Text { - id: errorMessage - text: "" - color: "#f7768e" - font.family: "JetBrainsMono Nerd Font" - font.pixelSize: root.height * 0.018 - anchors.horizontalCenter: parent.horizontalCenter + TextInput { + id: password + anchors.fill: parent + anchors.leftMargin: 20 + anchors.rightMargin: 20 + verticalAlignment: TextInput.AlignVCenter + echoMode: TextInput.Password + font.family: "JetBrainsMono Nerd Font" + font.pixelSize: 24 + font.letterSpacing: 5 + passwordCharacter: "\u2022" + color: "transparent" + selectionColor: "transparent" + selectedTextColor: "transparent" + focus: true + + onTextChanged: root.loginFailed = false + + Keys.onPressed: { + if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { + sddm.login(root.currentUser, password.text, root.sessionIndex) + event.accepted = true + } + } } + } } - Component.onCompleted: password.forceActiveFocus() + } + + Component.onCompleted: password.forceActiveFocus() } diff --git a/default/sddm/omarchy/bullet.png b/default/sddm/omarchy/bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..62249b3bd82b0b670a8a503a3bb69bbfe79cc4f4 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK^6z-MIEH9U zoIA;|uZcmx^}qZQCjEr9ou<6JoZt7m0FRe~3I-q?kdfVZu-@kQlF=GdcP{_{ literal 0 HcmV?d00001 diff --git a/default/sddm/omarchy/entry-failed.png b/default/sddm/omarchy/entry-failed.png new file mode 100644 index 0000000000000000000000000000000000000000..a42f9188478f536ac0e439b61bcf86db9919346e GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y&04Op0gq^TK)IFM3E_6YK2V5m}KU}$JzVE6?T zYIwoGP-?)y@G60U!DUO_QmvAUQh^kM zk%5t!u7Rnpfq965g_Ws+m4T7A0gyCcysEw%MMG|WN@iLmZVd$;^VxwKG~hOrWag$8 zmn7yEpzATSGBSWz^562tX`r4sPZ!6Kh{JDhItn%z2(TRNZgvn6U>Etf_n^7pfxC;{ z9k17!-wIqQ_ju(MS>@_UOV1advx>Dr0j!T6Lcq_%lWPUv)H{A_-Sk&e7pV9j(}Cj3 VCsvWJ$AC65c)I$ztaD0e0su?Dgzo?V literal 0 HcmV?d00001 diff --git a/default/sddm/omarchy/entry.png b/default/sddm/omarchy/entry.png new file mode 100644 index 0000000000000000000000000000000000000000..5c7891792b8872db933f17a667a449a478c0be53 GIT binary patch literal 694 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y&04FuSLa@a2CEqi4B`cIb_Lo1CD@X@-Ch2J0cXVbJ3tZk5>H=O_LuA|BAOCC zHaNEIWB8gpRxhIrP-q3h6ugFYL#HXzL zs@XQt|A*ck*2`WtwNt_B=Yyw}k1W;qd^{d$X}`l_w|(sWyd1OlR=bb4vobhzyu2J; zZnSHU?(>Dgw^zkpzx{Xds&+;O9q+{%->h5%r*w;NJ|6l0@y}PwUNtf>?BDuhVsPE} zg8wPcOLO0+EPi#6fx-T(fyDNE?akAVe!dFQ`p5hrGs6*K8wLlPp~KkoX?J(~!5v@i zWcGyE3NSoazmLT~cXe58{`dY>a%>D6be?{Bxz<`T_MTZ++WO$HQVb2Mv&zq@Pirx0 z4OBAy4vaL_64!{5l*E!$tK_0oAjM#0U}UOmV6JOm5@KXvWnyS$WTI_gU}a!%k#!|7 zD3LVe=BH$)RpQpLAVSa+oZUJsR-+c`p0rfC=y85}Sb4q9e01cG# AHUIzs literal 0 HcmV?d00001 diff --git a/default/sddm/omarchy/lock-failed.png b/default/sddm/omarchy/lock-failed.png new file mode 100644 index 0000000000000000000000000000000000000000..a88afece7ac58e0a76d6177d7d4cb9ce11791138 GIT binary patch literal 1444 zcmeAS@N?(olHy`uVBq!ia0vp^AwZnK!3-p~#4YszQVPi)LB0$ORcZ_j4J`}|zkosw zFBlj~4Hy_+B``2p&0t^k#5KkdlGMqr5NmIV0) zGcf5zHOyPTn>%*RTa7ti6j%IXtNwn<^?mp+cjZs)XIs}*hPoUH-1^YRaFgKbxy&NJ zv+wX8aN_u}-O(Zc5#!XEI}?vuU(|Y_5V!2g2d?J3pFgsk&$wqbjpvowAIn7^asn!0 zX{Ym?cg)v3>AOLQf5kOEpv8o>z%ybP*bq&lz3@ofn4Xg}|v<-ly z0pnHm-6$Gz^HVa@DsgKl=$OwA)Sv;kp(HamwYVfPw*Xy_rIm>R#F7)ST?ZK$m=<}u zIEF+VetRQ4{F8$~!$XZMod^cOz>qgdj=VP<-e^edPI}KOGUI=Jwu`E;S6SoEpMQ+X zPRyQ`R?M1` zJ)4!QZ|T~tK9{nx+ZSEV+dQpwcG(5lYDx3k4;hYGSb3RR&(#q=a5HjN=B5q4Pd^(? zO)4wAlm0Aj_m8uA;`2Elyn1F@T~+DZa8J%}i~j%SvhVyne0*Paf8H-tTeHmaJFl$N zxw?yM4?FM7*S_yx=2Ct2#f)!HHwM0at!%T*z547AmplW*b-Fe(FP1#((#)@WIQNpu z#2oKo3N_^d-g4V`$3(I2lW85D~G2eA~yDV-; z=OJFUU9Gn^#7Ve46l1>Y_O>r>NAsavX44Dx5?@^x?dFS|_EGMX>T8~RMT+o7rUKza_YIo(!ps~bw$nP<;4{WmliK7b9OVXWBwbx;+U9?ukd49;3 zP9D+FDe2RX>~wRjJImpJw$p09F}wZ3^mR|CRNt+ytgWuDeVG0K9^X+1Z^y@9GGaU~ zEap7hsCkj4wY=&}tbpB$v;0prCoXZD9DjbE$l95wY?LntJ)L9~^y~SZu7IhV)KfAy zl`BkjTOR9K{ZygBc4o1jIG@_1e_U$wIMVo!*)vAG@La=^Dg-QE85lfW{an^LB{Ts5 D{FkOh literal 0 HcmV?d00001 diff --git a/default/sddm/omarchy/lock.png b/default/sddm/omarchy/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..3046de1b6a3f20d194f010fee671c936326beb27 GIT binary patch literal 1537 zcmaKseKgYx7{|AHUkq{cvLRb`y@V2`mnmXdjLEhr)$(pBuF;Fg7MiYcO37PGhEj}Q zjkx2~FG}6iyi`n^Yf__8QcEw2yZ-5)d(J)Q^E}@_p65B=bDrm%=QKHZn*rPs4uL=n zhyi{()JjnYT~}M3b6C_2wdkb;L@*(cWhOrZ3aPkg4uNP1iGDtmqZi-uNcB{I6qr4G z#i8)RDVJ5cL1!Nt{l+uGVeBIuqiPA1leLuzROguk=T?Ra9MON;!yO9zRCRCo6Z~dO zZEkEpocTDP92U}<@#4T*rj2a+(x$Pv@seyCNY93qf#zr(*_!G?;{%hf$7{)0wjI)D_X( zm}u}Ln8`jY-p@J5VO8CjI08(3E0;){?Q-|cD59AsumI2J9^x48{P#=1M@1> z`3H_14&4M@jmRG{e0-T%a$_};xp+UGO5W(w?k>lx9F;;;TAULlesb+OonM22Q!c81az}6c*t>v7~tOVPm zhU!UpisjNWSukBNpiE6b9Q+!olgTZa?zW>>3@H1~d|7^cD&u?XCD2;IcY{V&A|v%} zdgu$wb94J!*DI4eckMCCA2lAHSD>gLRdsonw|WzWbCTnPs>+EhLc?+2mx$6;Pv&90 z`0L*_g4}j}dR=HC;<$8$V8H_R+5)ZzLV8t}3+GKlEaK#JdXNo5RObC<{#qWnTDYlq z)?=4}W)I5KWoU07<8~IqmNFI8_hC%4r#B}#Xw19S$T7|LGujzt$Su_wD^oXACsp6Y z@KIlS8YxqxORtv@zY6`OX~XEy`ZfP$tM|_>py#PwsWV|^yI&|}5<#J-3naFWlPt&0 zMM1pA=0DF$cD`C*@wVbov-TLG5Xo`|Cp3#t1lw$AGfc{*?c{bf87cSbWy55&%tM%p zeXIrPK75<{GLPwF=XCHZ+fTLU^X`|rK`Cd;+jrMtGa(^cXr+} zgVU;=CUsvl!V_DzOK)XsWtP;Abb!{3qlSAP;8kvbDCe<{Y>C!!vz1@u+lCa}en)#) z;t*rZHexumT)tUH-d4SN1?85h(q5JM8U5Fz3%*u)MG1WJ{{KN~pSIm6Hn6(LH){pv ze0V$g{08_ag*>vOzNWv9Sb-lDoN*GiYdmB~>U7k^= z!sR4-SaIB}#^(07LNV=C+^Wxvp#$8peZDi2`#_iZs= zqu`0Tb?EN1+Q1#UGG4l`!VHb{C~R_k3u*CyVN%VraV9KWDT5xw*ws95W?`)tyZ4)2<_Ue8M2_Lb zaSg1=`gadV(~oTBd5ZNyUQ=(QUE*OKK)-|hxBH_7i+@D@94nGF6k#qnb#ZuUGt_nK Vg$$|X5%o`p5dDMwntbUe{{_St%Ul2e literal 0 HcmV?d00001 diff --git a/default/sddm/omarchy/logo.png b/default/sddm/omarchy/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f185b2660763bebf2343775d2a682133d5bf78d2 GIT binary patch literal 3072 zcmb7`dpwi<8^>>l=qXa_p(N|vOGGPYhGLi+QCbc)wX$TC#G18HejOx@XQ8JxE6K`X zni(~wJcT0b$sxxnDQvUJlO34D@2)?7uU^03^Splfp+o^$^kjx+aiZi_`>w)u{kD<}Yyv zeX!A-4*(fnfCd1x%wG)v?j{=A0N}GO8MHgnS8w=p-P`fatOEAO!K#L|&c*B8BJ5M< zKTSV+EHKwLpyqmJcfOpk{n|E_MGu=qNKy`O^J;{ui5ORG$7dcaKi;t+n=PAUG1*BC z9+J4%*>d_gEW)Fd84A6l&>FGCJa;HhxZB%z1KHOuXXIuXGIZREkfeQiu2;uQ#xJKp zEx4|f5M>JEU>yWf;lByG)84pCVe-XJWr3+F2(wM9M&-E}kQE*iGsPs{%609P)>asy zT&O#<_&uZC-vFaEE=_9+!IPBdnX~w_c=C|SQs<+QB^ZPBpNv7G!CDu-L+@yzIg+z9 zD%|iG^G#dhgzS`7@Fj(8`VCL)TLOWX)QX4WtojaImapJK?-JH0mQ)oqKsVG?iR$Sc zpAc=7r~#9$I*f}#~e0iq6IL%hfZ)qb6 zaAN%3S z+lpX@bZ4-hBXqiQR?Tqk2o0sT=InY1fv<|WXoVqpr3c^OK`dmnv=kz8yNE60>F$}< zl(ILc$m{xig^`rdp-EFtjxnVG)trDwnxUecHk6<<-FdHGsxBkXg&00rDU-2PYpbPDT%+$8$2anSv(+QmRX&$t= zz#RQ%RIf5XIk2?qA6XLrw>{Un4C%^pW1hXtMxJn=bsZRJVdQ|ysSx_ zCiyVv{ZdgS$-UXvMkAj#)Cvwnhb=_zWn`J9b!|EDU+Jg4cn&)K$;ELN0Pybpv2+!W zQjDrZk6H$a4VyHI^(w(X#kiRMo7IAh3d$s3m_Is}0?g{g4k^TVhNw<=JJaX50jfO|E6`y!)ZlW>SU`3ue<5~ z3ufkPwENsnBwU|<$W)N{s~ytPV^mqGQ+Bzwgjyqcfq%VCudAT~qyB3~_VyTVzJ_+V zepU#>yF?B3+*?ZO%bJHy-@Hm^y>J&H^nBw&NKV5I}W0OZ=765$6i{evd{UOT!7aRo=*Ni|i7Xe*2lwS?2{sg!tqMWjDA#uYXtkjQ;OHjz4q7}b@A zV}+@&B!WK>x96?5*x(vj+5>^}oYMP;(<~x_N$fUNwK-M5MdhuCu@0380u}WEvoIZ- zho9fZn|}kg?R#fe(Pk&U!)@-Gqt5_CjzTNR$b$6-Z?B4ynOS!;sVrXW*OcHT?si?D zx4qjmTAHe&W9pB$cSb@Ij&McacNy!Lo%|HU;296;dgxpdIgO;3RyIoT#P+1dIh|&& zcyIYCR1S(Qgh62}e0Rg_m0vsXR|jrJAM8MZ1uTul3luX0B;-fiPV9DiQ-`p9g||HM zVz%7-Q+`p5WO5P-jKa}jTO=*U>f$OeqKcuJHJ1t2aN_G49HlF-D8{*hNXPOuUrr0L z_Oo3Glu%UHPgcWA&jBLmy4crb`N^kG93!3mds{~rDR%v`{|cg}=)NaG{S2C7;QOCH zC!BPNQr25Q-1C0F-8^c_sB`bV0JfMv(c68O0J3z)zev#y?X;o@bxiT&iM|sCYo<0- z+?pKW;pk`Dqu+P?F}%82%%=Or%ux1~4G)k?&-S;p-F{+9tkJ9NSb;)@-xcDYud0Tf zbS4gDNa7+%nM$Vh3?J-CB&P+7_y#swE5lRx4sK_AT$|T+e5~!G_GFHXPkng6ABJ5& zU*10;%b=duu)8=Xg|9ec=mZpB3^~+M^4BmU3+G>9t(A=44QM1k4f?43Dja|VTOH<9 bg1%yVhS4QqD-cs);|n0*ex9tI;TQf5WcB8Z literal 0 HcmV?d00001 diff --git a/default/sddm/omarchy/logo.svg b/default/sddm/omarchy/logo.svg deleted file mode 100644 index 0853b047..00000000 --- a/default/sddm/omarchy/logo.svg +++ /dev/null @@ -1 +0,0 @@ - From ec4a3d024915114bd770bd98ea6eba7958e1a9ca Mon Sep 17 00:00:00 2001 From: Gavin Nugent Date: Thu, 7 May 2026 10:19:31 +0100 Subject: [PATCH 052/111] Add Transcode entry to Nautilus context menu (#5635) * Add Transcode entry to Nautilus context menu Right-click on image or video files in Nautilus to send them to omarchy-transcode in a presentation terminal, mirroring the existing LocalSend integration. Co-Authored-By: Claude Opus 4.7 (1M context) * Use shlex.quote for shell-safe command construction in transcode.py Quote both the resolved binary path and file paths via shlex.quote instead of a custom escaper. Addresses Copilot review on #5635. Co-Authored-By: Claude Opus 4.7 (1M context) * Style changes --------- Co-authored-by: Claude Opus 4.7 (1M context) Co-authored-by: David Heinemeier Hansson --- .../nautilus-python/extensions/transcode.py | 94 +++++++++++++++++++ install/config/nautilus-python.sh | 1 + migrations/1778099894.sh | 3 + 3 files changed, 98 insertions(+) create mode 100644 default/nautilus-python/extensions/transcode.py create mode 100644 migrations/1778099894.sh diff --git a/default/nautilus-python/extensions/transcode.py b/default/nautilus-python/extensions/transcode.py new file mode 100644 index 00000000..be1dfe4b --- /dev/null +++ b/default/nautilus-python/extensions/transcode.py @@ -0,0 +1,94 @@ +import shlex +import shutil + +from gi import require_version + +require_version("Nautilus", "4.1") + +from gi.repository import GObject, Gio, Nautilus + + +SUPPORTED_MIME_PREFIXES = ("image/", "video/") +SUPPORTED_EXTENSIONS = { + ".jpg", ".jpeg", ".png", ".webp", ".gif", ".heic", ".avif", + ".mp4", ".mov", ".m4v", ".mkv", ".webm", ".avi", +} + + +class TranscodeAction(GObject.GObject, Nautilus.MenuProvider): + def _launch_transcode(self, paths): + wrapper = shutil.which("omarchy-launch-floating-terminal-with-presentation") + binary = shutil.which("omarchy-transcode") + if not wrapper or not binary: + return + + if len(paths) == 1: + cmd = shlex.join([binary, paths[0]]) + else: + cmd = "; ".join( + f"echo {shlex.quote(f'Transcoding {path}')} && " + f"{shlex.join([binary, path])} || true" + for path in paths + ) + + Gio.Subprocess.new([wrapper, cmd], Gio.SubprocessFlags.NONE) + + def _is_supported(self, file): + mime = file.get_mime_type() or "" + if mime.startswith(SUPPORTED_MIME_PREFIXES): + return True + + location = file.get_location() + if not location: + return False + path = location.get_path() or "" + lower = path.lower() + return any(lower.endswith(ext) for ext in SUPPORTED_EXTENSIONS) + + def _selected_paths(self, files): + paths = [] + seen = set() + + for file in files: + if file.is_directory(): + continue + if not self._is_supported(file): + continue + location = file.get_location() + if not location: + continue + path = location.get_path() + if path and path not in seen: + seen.add(path) + paths.append(path) + return paths + + def _make_item(self, paths): + label = "Transcode" if len(paths) == 1 else f"Transcode {len(paths)} items" + item = Nautilus.MenuItem( + name="OmarchyTranscodeNautilus::transcode", + label=label, + icon="media-playback-start", + ) + item.connect("activate", self._on_activate, paths) + return item + + def _on_activate(self, _menu, paths): + self._launch_transcode(paths) + + def _tools_available(self): + return bool( + shutil.which("omarchy-launch-floating-terminal-with-presentation") + and shutil.which("omarchy-transcode") + ) + + def get_file_items(self, *args): + files = args[0] if len(args) == 1 else args[1] + if not self._tools_available(): + return [] + + paths = self._selected_paths(files) + if not paths: + return [] + + return [self._make_item(paths)] diff --git a/install/config/nautilus-python.sh b/install/config/nautilus-python.sh index fd2ef0f7..76266353 100644 --- a/install/config/nautilus-python.sh +++ b/install/config/nautilus-python.sh @@ -2,3 +2,4 @@ EXTENSIONS_DIR="$HOME/.local/share/nautilus-python/extensions" mkdir -p "$EXTENSIONS_DIR" cp "$OMARCHY_PATH/default/nautilus-python/extensions/localsend.py" "$EXTENSIONS_DIR/" +cp "$OMARCHY_PATH/default/nautilus-python/extensions/transcode.py" "$EXTENSIONS_DIR/" diff --git a/migrations/1778099894.sh b/migrations/1778099894.sh new file mode 100644 index 00000000..bf83d6d1 --- /dev/null +++ b/migrations/1778099894.sh @@ -0,0 +1,3 @@ +echo "Add Transcode entry to Nautilus context menu" + +source $OMARCHY_PATH/install/config/nautilus-python.sh From ba1d699c11b40b4a66a7319e99e9c8f03b7d72d8 Mon Sep 17 00:00:00 2001 From: Vitalii Bondar Date: Thu, 7 May 2026 11:49:44 +0200 Subject: [PATCH 053/111] Allow configuring OCR languages via OMARCHY_OCR_LANGS (#5623) Hardcoded -l eng makes SUPER+CTRL+PRINT produce garbage on any non-ASCII English text. Read the language list from OMARCHY_OCR_LANGS instead, defaulting to eng for backward compatibility. --- bin/omarchy-capture-text-extraction | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/omarchy-capture-text-extraction b/bin/omarchy-capture-text-extraction index cb0c62b5..4b49b16b 100755 --- a/bin/omarchy-capture-text-extraction +++ b/bin/omarchy-capture-text-extraction @@ -18,7 +18,7 @@ SELECTION=$(slurp 2>/dev/null) [[ -z $SELECTION ]] && exit 0 -TEXT=$(grim -g "$SELECTION" - | tesseract stdin stdout --oem 1 --psm 6 -l eng --dpi 300 -c preserve_interword_spaces=1 2>/dev/null) || exit 1 +TEXT=$(grim -g "$SELECTION" - | tesseract stdin stdout --oem 1 --psm 6 -l "${OMARCHY_OCR_LANGS:-eng}" --dpi 300 -c preserve_interword_spaces=1 2>/dev/null) || exit 1 [[ -z $TEXT ]] && exit 1 From b3a62245f503a5b87046227e12d2c66f6a2defeb Mon Sep 17 00:00:00 2001 From: Iqbal Attila Date: Thu, 7 May 2026 16:51:27 +0700 Subject: [PATCH 054/111] Add bass speaker fix for Lenovo Yoga Pro 7 14IAH10 (#5597) * Add bass speaker fix for Lenovo Yoga Pro 7 14IAH10 The ALC287 codec on Yoga Pro 7 14IAH10 requires the alc287-yoga9-bass-spk-pin quirk to properly route audio to both amplifier speakers. Without this fix, only one speaker works and bass output is missing. This adds: - Hardware detection script (omarchy-hw-lenovo-yoga-pro7-bass) - Audio fix that creates /etc/modprobe.d/lenovo-yoga-pro7-bass.conf Tested on Lenovo Yoga Pro 7 14IAH10 (Intel Core Ultra 9 285H). Reference: https://wiki.archlinux.org/title/Lenovo_Yoga_9i_2022_(14AiPI7) * Add Lenovo Yoga Pro 7 bass fix to install flow Addresses review feedback: the hardware fix script was not invoked during installation. Add it to install/config/all.sh so it runs automatically on matching hardware. * Fix implementation --------- Co-authored-by: David Heinemeier Hansson --- install/config/all.sh | 2 ++ .../hardware/lenovo/fix-yoga-pro7-bass-speakers.sh | 10 ++++++++++ migrations/1778001804.sh | 3 +++ 3 files changed, 15 insertions(+) create mode 100644 install/config/hardware/lenovo/fix-yoga-pro7-bass-speakers.sh create mode 100755 migrations/1778001804.sh diff --git a/install/config/all.sh b/install/config/all.sh index 1656a2d5..a7b28c02 100644 --- a/install/config/all.sh +++ b/install/config/all.sh @@ -64,6 +64,8 @@ run_logged $OMARCHY_INSTALL/config/hardware/apple/fix-spi-keyboard.sh run_logged $OMARCHY_INSTALL/config/hardware/apple/fix-suspend-nvme.sh run_logged $OMARCHY_INSTALL/config/hardware/apple/fix-t2.sh +run_logged $OMARCHY_INSTALL/config/hardware/lenovo/fix-yoga-pro7-bass-speakers.sh + run_logged $OMARCHY_INSTALL/config/hardware/fix-bcm43xx.sh run_logged $OMARCHY_INSTALL/config/hardware/fix-surface-keyboard.sh run_logged $OMARCHY_INSTALL/config/hardware/fix-yt6801-ethernet-adapter.sh diff --git a/install/config/hardware/lenovo/fix-yoga-pro7-bass-speakers.sh b/install/config/hardware/lenovo/fix-yoga-pro7-bass-speakers.sh new file mode 100644 index 00000000..4459f0ae --- /dev/null +++ b/install/config/hardware/lenovo/fix-yoga-pro7-bass-speakers.sh @@ -0,0 +1,10 @@ +# Fix bass speakers on Lenovo Yoga Pro 7 14IAH10 +# The ALC287 codec needs a pin quirk to route audio to both AMP speakers. +# Without this quirk, only one speaker works and bass output is missing. +# Reference: https://wiki.archlinux.org/title/Lenovo_Yoga_9i_2022_(14AiPI7) + +if omarchy-hw-match "Yoga Pro 7 14IAH10"; then + sudo tee /etc/modprobe.d/lenovo-yoga-pro7-bass.conf <<'EOF' +options snd-sof-intel-hda-generic hda_model=alc287-yoga9-bass-spk-pin +EOF +fi diff --git a/migrations/1778001804.sh b/migrations/1778001804.sh new file mode 100755 index 00000000..38413d36 --- /dev/null +++ b/migrations/1778001804.sh @@ -0,0 +1,3 @@ +echo "Fix bass speakers on Lenovo Yoga Pro 7 14IAH10" + +source "$OMARCHY_PATH/install/config/hardware/lenovo/fix-yoga-pro7-bass-speakers.sh" From 81aaade827982e3d65aeb3d41903bfff36aa88b1 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 12:09:30 +0200 Subject: [PATCH 055/111] Make sub matches show which commands are available under it --- bin/omarchy | 23 +++++++++++++++++++++++ test/omarchy-cli-test.sh | 4 ++++ 2 files changed, 27 insertions(+) diff --git a/bin/omarchy b/bin/omarchy index 29b7cfb4..16aa9502 100755 --- a/bin/omarchy +++ b/bin/omarchy @@ -788,6 +788,25 @@ show_group_help() { fi } +show_prefix_help() { + local prefix="$1" + local prefix_with_space="$prefix " + local key="" + local rows="" + + while IFS= read -r key; do + [[ -n $key ]] || continue + if [[ ${COMMAND_USAGE[$key]} == $prefix_with_space* ]]; then + rows+="${COMMAND_USAGE[$key]}"$'\t'$'\t'"${COMMAND_SUMMARY[$key]}"$'\n' + fi + done < <(sorted_keys false) + + [[ -n $rows ]] || return 1 + + echo "${prefix#omarchy } commands:" + print_command_table "$rows" +} + show_related_commands() { local key="$1" local group="${COMMAND_GROUP[$key]}" @@ -1005,6 +1024,10 @@ dispatch_or_help() { return 0 fi + if show_prefix_help "omarchy ${args[*]}"; then + return 0 + fi + echo "Unknown Omarchy command: omarchy ${args[*]}" >&2 suggestion=$(suggest_command "${args[0]}") if [[ -n $suggestion ]]; then diff --git a/test/omarchy-cli-test.sh b/test/omarchy-cli-test.sh index 5763920a..9b9a8dfb 100644 --- a/test/omarchy-cli-test.sh +++ b/test/omarchy-cli-test.sh @@ -100,6 +100,10 @@ output=$("$CLI" hw --help) assert_output_contains "hardware group help renders" "$output" "omarchy hw asus rog" assert_output_contains "hardware group includes touchpad" "$output" "omarchy hw touchpad" +output=$("$CLI" hw asus) +assert_output_contains "partial hardware prefix renders matching commands" "$output" "omarchy hw asus rog" +assert_output_contains "partial hardware prefix includes nested match" "$output" "omarchy hw asus zenbook ux5406aa" + output=$("$CLI" menu --help) assert_output_contains "menu group includes share fallback route" "$output" "omarchy menu share" From bc62c23351d81e8a97389dbf72f9a5e6ef2d4864 Mon Sep 17 00:00:00 2001 From: Mateusz Kowalczyk Date: Thu, 7 May 2026 12:10:45 +0200 Subject: [PATCH 056/111] Asus Zenbook UX5406AA Display Backlight Fix (#5620) * Extract ASUS Expertbook B9406 display backlight fix and apply it for Zenbook ux5406aa too * Add migration for Panther Lake Asus display bakclight fix * Check if limine-update exists before executing it in the migration Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- bin/omarchy-hw-asus-zenbook-ux5406aa | 5 +++++ install/config/all.sh | 1 + .../hardware/asus/fix-asus-ptl-b9406-display.sh | 10 ++-------- .../asus/fix-asus-ptl-display-backlight.sh | 16 ++++++++++++++++ migrations/1777938402.sh | 15 +++++++++++++++ 5 files changed, 39 insertions(+), 8 deletions(-) create mode 100755 bin/omarchy-hw-asus-zenbook-ux5406aa create mode 100644 install/config/hardware/asus/fix-asus-ptl-display-backlight.sh create mode 100644 migrations/1777938402.sh diff --git a/bin/omarchy-hw-asus-zenbook-ux5406aa b/bin/omarchy-hw-asus-zenbook-ux5406aa new file mode 100755 index 00000000..9f8da811 --- /dev/null +++ b/bin/omarchy-hw-asus-zenbook-ux5406aa @@ -0,0 +1,5 @@ +#!/bin/bash + +# omarchy:summary=Detect ASUS Zenbook UX5406AA series laptops on Intel Panther Lake. + +omarchy-hw-match "ux5406aa" && omarchy-hw-intel-ptl diff --git a/install/config/all.sh b/install/config/all.sh index a7b28c02..39d5c6d1 100644 --- a/install/config/all.sh +++ b/install/config/all.sh @@ -51,6 +51,7 @@ run_logged $OMARCHY_INSTALL/config/hardware/intel/sof-firmware.sh run_logged $OMARCHY_INSTALL/config/hardware/dell/fix-xps-haptic-touchpad.sh +run_logged $OMARCHY_INSTALL/config/hardware/asus/fix-asus-ptl-display-backlight.sh run_logged $OMARCHY_INSTALL/config/hardware/asus/fix-asus-ptl-b9406-display.sh run_logged $OMARCHY_INSTALL/config/hardware/asus/fix-asus-ptl-b9406-touchpad.sh run_logged $OMARCHY_INSTALL/config/hardware/asus/fix-audio-mixer.sh diff --git a/install/config/hardware/asus/fix-asus-ptl-b9406-display.sh b/install/config/hardware/asus/fix-asus-ptl-b9406-display.sh index de03d286..b77a45c4 100644 --- a/install/config/hardware/asus/fix-asus-ptl-b9406-display.sh +++ b/install/config/hardware/asus/fix-asus-ptl-b9406-display.sh @@ -1,21 +1,15 @@ -# Display fixes for ASUS ExpertBook B9406 (Panther Lake / Xe3 iGPU). +# Display fix for ASUS ExpertBook B9406 (Panther Lake / Xe3 iGPU). # # Panel Replay is Xe3-new, default-on in the xe driver, and has a broken # exit/wake path on this eDP panel: the panel latches the last-presented # frame in self-refresh and never wakes for subsequent atomic commits, so # the screen only updates on a full modeset (e.g. a VT switch). The older # xe.enable_psr=0 knob does not cover Panel Replay. -# -# The panel's EDID on eDP-1 reads as empty, so xe takes backlight type from -# VBT (which says PWM) but the panel actually wants DPCD AUX backlight. -# Without xe.enable_dpcd_backlight=1, intel_backlight sysfs writes succeed -# but produce no visible change; brightness is effectively binary. if omarchy-hw-asus-expertbook-b9406; then sudo mkdir -p /etc/limine-entry-tool.d cat </dev/null -# ASUS ExpertBook B9406 (Panther Lake / Xe3) display workarounds +# ASUS ExpertBook B9406 (Panther Lake / Xe3) display workaround KERNEL_CMDLINE[default]+=" xe.enable_panel_replay=0" -KERNEL_CMDLINE[default]+=" xe.enable_dpcd_backlight=1" EOF fi diff --git a/install/config/hardware/asus/fix-asus-ptl-display-backlight.sh b/install/config/hardware/asus/fix-asus-ptl-display-backlight.sh new file mode 100644 index 00000000..cc851061 --- /dev/null +++ b/install/config/hardware/asus/fix-asus-ptl-display-backlight.sh @@ -0,0 +1,16 @@ +# Display backlight fix for ASUS Panther Lake / Xe3 iGPU laptops. +# Enabled only for ExpertBook B9406 and Zenbook UX5406AA for now. +# Other models need confirmation whether the issue exists there too. +# +# The panel's EDID on eDP-1 reads as empty, so xe takes backlight type from +# VBT (which says PWM) but the panel actually wants DPCD AUX backlight. +# Without xe.enable_dpcd_backlight=1, intel_backlight sysfs writes succeed +# but produce no visible change; brightness is effectively binary. + +if omarchy-hw-asus-expertbook-b9406 || omarchy-hw-asus-zenbook-ux5406aa; then + sudo mkdir -p /etc/limine-entry-tool.d + cat </dev/null +# ASUS Panther Lake display backlight fix +KERNEL_CMDLINE[default]+=" xe.enable_dpcd_backlight=1" +EOF +fi diff --git a/migrations/1777938402.sh b/migrations/1777938402.sh new file mode 100644 index 00000000..24099ee5 --- /dev/null +++ b/migrations/1777938402.sh @@ -0,0 +1,15 @@ +echo "Fix display backlight on supported ASUS Panther Lake laptops" + +EXPERTBOOK_DROP_IN="/etc/limine-entry-tool.d/asus-expertbook-b9406-display.conf" + +if omarchy-hw-asus-expertbook-b9406 || omarchy-hw-asus-zenbook-ux5406aa; then + if [[ -f $EXPERTBOOK_DROP_IN ]]; then + sudo sed -i '/xe\.enable_dpcd_backlight/d' "$EXPERTBOOK_DROP_IN" + fi + + source "$OMARCHY_PATH/install/config/hardware/asus/fix-asus-ptl-display-backlight.sh" + + if omarchy-cmd-present limine-update; then + sudo limine-update + fi +fi From 4eb3a9198d53025f2b7b7eef073bde559809eca2 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 12:56:26 +0200 Subject: [PATCH 057/111] Ensure SDDM never tries to start an x11 session, just go straight to wayland Closes #5643 --- install/login/sddm.sh | 8 ++++++++ migrations/1778148645.sh | 10 ++++++++++ 2 files changed, 18 insertions(+) create mode 100644 migrations/1778148645.sh diff --git a/install/login/sddm.sh b/install/login/sddm.sh index 21696b48..b04dd027 100644 --- a/install/login/sddm.sh +++ b/install/login/sddm.sh @@ -6,6 +6,14 @@ sudo mkdir -p /usr/local/share/wayland-sessions sudo cp "$OMARCHY_PATH/default/wayland-sessions/omarchy.desktop" /usr/local/share/wayland-sessions/omarchy.desktop sudo mkdir -p /etc/sddm.conf.d +cat </dev/null +[General] +DisplayServer=wayland + +[Wayland] +CompositorCommand=Hyprland +EOF + if [[ ! -f /etc/sddm.conf.d/autologin.conf ]]; then cat </dev/null +[General] +DisplayServer=wayland + +[Wayland] +CompositorCommand=Hyprland +EOF From cd2c41f618b091a45bac873f50f235110a935841 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 15:02:18 +0200 Subject: [PATCH 058/111] Add dark/light mode theme syncing to pi agent --- .../agent/extensions/omarchy-system-theme.ts | 41 +++++++++++++++++++ install/config/all.sh | 1 + install/config/pi.sh | 2 + migrations/1778151386.sh | 4 ++ 4 files changed, 48 insertions(+) create mode 100644 default/pi/agent/extensions/omarchy-system-theme.ts create mode 100644 install/config/pi.sh create mode 100644 migrations/1778151386.sh diff --git a/default/pi/agent/extensions/omarchy-system-theme.ts b/default/pi/agent/extensions/omarchy-system-theme.ts new file mode 100644 index 00000000..18c6fef6 --- /dev/null +++ b/default/pi/agent/extensions/omarchy-system-theme.ts @@ -0,0 +1,41 @@ +/** + * Syncs pi's light/dark theme with the active Omarchy theme. + * + * Omarchy light themes include: + * ~/.config/omarchy/current/theme/light.mode + */ + +import { existsSync } from "node:fs"; +import { join } from "node:path"; +import type { ExtensionAPI } from "@mariozechner/pi-coding-agent"; + +const home = process.env.HOME ?? ""; +const lightModePath = join(home, ".config/omarchy/current/theme/light.mode"); + +function omarchyPiTheme(): "light" | "dark" { + return existsSync(lightModePath) ? "light" : "dark"; +} + +export default function (pi: ExtensionAPI) { + let intervalId: ReturnType | null = null; + + pi.on("session_start", (_event, ctx) => { + let currentTheme = omarchyPiTheme(); + ctx.ui.setTheme(currentTheme); + + intervalId = setInterval(() => { + const nextTheme = omarchyPiTheme(); + if (nextTheme !== currentTheme) { + currentTheme = nextTheme; + ctx.ui.setTheme(currentTheme); + } + }, 2000); + }); + + pi.on("session_shutdown", () => { + if (intervalId) { + clearInterval(intervalId); + intervalId = null; + } + }); +} diff --git a/install/config/all.sh b/install/config/all.sh index 39d5c6d1..72effc32 100644 --- a/install/config/all.sh +++ b/install/config/all.sh @@ -24,6 +24,7 @@ run_logged $OMARCHY_INSTALL/config/unmount-fuse.sh run_logged $OMARCHY_INSTALL/config/sudoless-asdcontrol.sh run_logged $OMARCHY_INSTALL/config/input-group.sh run_logged $OMARCHY_INSTALL/config/omarchy-ai-skill.sh +run_logged $OMARCHY_INSTALL/config/pi.sh run_logged $OMARCHY_INSTALL/config/omarchy-toggles.sh run_logged $OMARCHY_INSTALL/config/kernel-modules-hook.sh run_logged $OMARCHY_INSTALL/config/powerprofilesctl-rules.sh diff --git a/install/config/pi.sh b/install/config/pi.sh new file mode 100644 index 00000000..4afefecb --- /dev/null +++ b/install/config/pi.sh @@ -0,0 +1,2 @@ +mkdir -p ~/.pi/agent/extensions +cp "$OMARCHY_PATH/default/pi/agent/extensions/omarchy-system-theme.ts" ~/.pi/agent/extensions/ diff --git a/migrations/1778151386.sh b/migrations/1778151386.sh new file mode 100644 index 00000000..5f9fb388 --- /dev/null +++ b/migrations/1778151386.sh @@ -0,0 +1,4 @@ +echo "Add Omarchy pi system theme extension" + +mkdir -p "$HOME/.pi/agent/extensions" +cp "$OMARCHY_PATH/default/pi/agent/extensions/omarchy-system-theme.ts" "$HOME/.pi/agent/extensions/" From 2cc4a263ba2ca57aa9e64cf7f6ef250bb700e2ed Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 15:04:10 +0200 Subject: [PATCH 059/111] Use a minimal Hyprland config for the SDDM Wayland greeter --- default/sddm/hyprland.conf | 11 +++++++++++ install/login/sddm.sh | 3 ++- migrations/1778158938.sh | 5 +++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 default/sddm/hyprland.conf create mode 100644 migrations/1778158938.sh diff --git a/default/sddm/hyprland.conf b/default/sddm/hyprland.conf new file mode 100644 index 00000000..4ce15a75 --- /dev/null +++ b/default/sddm/hyprland.conf @@ -0,0 +1,11 @@ +# Minimal Hyprland config for the SDDM Wayland greeter. +# SDDM starts the greeter itself after the compositor is ready. +misc { + disable_hyprland_logo = true + disable_splash_rendering = true + force_default_wallpaper = 0 +} + +animations { + enabled = false +} diff --git a/install/login/sddm.sh b/install/login/sddm.sh index b04dd027..c3410e5d 100644 --- a/install/login/sddm.sh +++ b/install/login/sddm.sh @@ -4,6 +4,7 @@ omarchy-refresh-sddm # Setup SDDM login service sudo mkdir -p /usr/local/share/wayland-sessions sudo cp "$OMARCHY_PATH/default/wayland-sessions/omarchy.desktop" /usr/local/share/wayland-sessions/omarchy.desktop +sudo cp "$OMARCHY_PATH/default/sddm/hyprland.conf" /usr/share/sddm/hyprland.conf sudo mkdir -p /etc/sddm.conf.d cat </dev/null @@ -11,7 +12,7 @@ cat </dev/null DisplayServer=wayland [Wayland] -CompositorCommand=Hyprland +CompositorCommand=Hyprland --config /usr/share/sddm/hyprland.conf EOF if [[ ! -f /etc/sddm.conf.d/autologin.conf ]]; then diff --git a/migrations/1778158938.sh b/migrations/1778158938.sh new file mode 100644 index 00000000..fdd31f87 --- /dev/null +++ b/migrations/1778158938.sh @@ -0,0 +1,5 @@ +echo "Use a minimal Hyprland config for the SDDM Wayland greeter" + +sudo cp "$OMARCHY_PATH/default/sddm/hyprland.conf" /usr/share/sddm/hyprland.conf +sudo mkdir -p /etc/sddm.conf.d +sudo sed -i 's|^CompositorCommand=Hyprland$|CompositorCommand=Hyprland --config /usr/share/sddm/hyprland.conf|' /etc/sddm.conf.d/10-wayland.conf From 4fbd7509166fee1c91947463c7f934f3c43c8579 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 15:09:53 +0200 Subject: [PATCH 060/111] Add note about correct perms for migrations --- AGENTS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AGENTS.md b/AGENTS.md index c5eea9b8..cc9ec853 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -107,6 +107,7 @@ This copies `~/.local/share/omarchy/config/hypr/hyprlock.conf` to `~/.config/hyp 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 `echo` describing what the migration does - Use `$OMARCHY_PATH` to reference the omarchy directory From 6f03b72870c457ac9badb240f61ece5fec85a3c7 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 15:12:25 +0200 Subject: [PATCH 061/111] Start hyprland for sddm without producing errors --- install/login/sddm.sh | 2 +- migrations/1778148645.sh | 3 ++- migrations/1778158938.sh | 5 ----- 3 files changed, 3 insertions(+), 7 deletions(-) delete mode 100644 migrations/1778158938.sh diff --git a/install/login/sddm.sh b/install/login/sddm.sh index c3410e5d..f97243cb 100644 --- a/install/login/sddm.sh +++ b/install/login/sddm.sh @@ -12,7 +12,7 @@ cat </dev/null DisplayServer=wayland [Wayland] -CompositorCommand=Hyprland --config /usr/share/sddm/hyprland.conf +CompositorCommand=start-hyprland -- --config /usr/share/sddm/hyprland.conf EOF if [[ ! -f /etc/sddm.conf.d/autologin.conf ]]; then diff --git a/migrations/1778148645.sh b/migrations/1778148645.sh index d9bc031c..c085858e 100644 --- a/migrations/1778148645.sh +++ b/migrations/1778148645.sh @@ -1,10 +1,11 @@ echo "Configure SDDM to use Wayland for the greeter" +sudo cp "$OMARCHY_PATH/default/sddm/hyprland.conf" /usr/share/sddm/hyprland.conf sudo mkdir -p /etc/sddm.conf.d cat </dev/null [General] DisplayServer=wayland [Wayland] -CompositorCommand=Hyprland +CompositorCommand=start-hyprland -- --config /usr/share/sddm/hyprland.conf EOF diff --git a/migrations/1778158938.sh b/migrations/1778158938.sh deleted file mode 100644 index fdd31f87..00000000 --- a/migrations/1778158938.sh +++ /dev/null @@ -1,5 +0,0 @@ -echo "Use a minimal Hyprland config for the SDDM Wayland greeter" - -sudo cp "$OMARCHY_PATH/default/sddm/hyprland.conf" /usr/share/sddm/hyprland.conf -sudo mkdir -p /etc/sddm.conf.d -sudo sed -i 's|^CompositorCommand=Hyprland$|CompositorCommand=Hyprland --config /usr/share/sddm/hyprland.conf|' /etc/sddm.conf.d/10-wayland.conf From 95d8125e5922fd8d8b6a49ceee53e8ea040a9e0d Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 16:11:48 +0200 Subject: [PATCH 062/111] Set default terminal, browser, editor explicitly (#5651) * Set default terminal, browser, editor explicitly * Consistent glyphs and setup * Tweaks * Always there * Proper order * Don't make a browser the default just because it's getting installed --- bin/omarchy | 1 + bin/omarchy-default-browser | 40 ++++++++++++ bin/omarchy-default-editor | 30 +++++++++ bin/omarchy-default-terminal | 36 +++++++++++ bin/omarchy-install-browser | 31 +++------- bin/omarchy-menu | 117 +++++++++++++++++++++++++++++++++-- 6 files changed, 228 insertions(+), 27 deletions(-) create mode 100755 bin/omarchy-default-browser create mode 100755 bin/omarchy-default-editor create mode 100755 bin/omarchy-default-terminal diff --git a/bin/omarchy b/bin/omarchy index 16aa9502..d4fd2570 100755 --- a/bin/omarchy +++ b/bin/omarchy @@ -35,6 +35,7 @@ GROUP_DESCRIPTIONS[channel]="Omarchy release channel management" GROUP_DESCRIPTIONS[cmd]="Command and shortcut helpers" GROUP_DESCRIPTIONS[config]="System configuration helpers" GROUP_DESCRIPTIONS[debug]="Diagnostics and support logs" +GROUP_DESCRIPTIONS[default]="Default application selection" GROUP_DESCRIPTIONS[dev]="Omarchy development tools" GROUP_DESCRIPTIONS[drive]="Drive selection and encryption" GROUP_DESCRIPTIONS[font]="Font management" diff --git a/bin/omarchy-default-browser b/bin/omarchy-default-browser new file mode 100755 index 00000000..0b38d760 --- /dev/null +++ b/bin/omarchy-default-browser @@ -0,0 +1,40 @@ +#!/bin/bash + +# omarchy:summary=Set the default browser for Omarchy and XDG handlers +# omarchy:args=[chromium|chrome|brave|brave-origin|edge|firefox|zen] +# omarchy:examples=omarchy default browser firefox | omarchy default browser brave + +if (($# == 0)); then + case "$(xdg-settings get default-web-browser)" in + chromium.desktop) echo "chromium" ;; + google-chrome.desktop) echo "chrome" ;; + brave-browser.desktop) echo "brave" ;; + brave-origin-beta.desktop) echo "brave-origin" ;; + microsoft-edge.desktop) echo "edge" ;; + firefox.desktop) echo "firefox" ;; + zen.desktop) echo "zen" ;; + *) xdg-settings get default-web-browser ;; + esac + exit 0 +fi + +case "$1" in +chromium) desktop_id="chromium.desktop"; name="Chromium"; glyph="" ;; +chrome) desktop_id="google-chrome.desktop"; name="Chrome"; glyph="󰊯" ;; +brave) desktop_id="brave-browser.desktop"; name="Brave"; glyph="󰖟" ;; +brave-origin) desktop_id="brave-origin-beta.desktop"; name="Brave Origin"; glyph="󰖟" ;; +edge) desktop_id="microsoft-edge.desktop"; name="Edge"; glyph="󰇩" ;; +firefox) desktop_id="firefox.desktop"; name="Firefox"; glyph="󰈹" ;; +zen) desktop_id="zen.desktop"; name="Zen"; glyph="󰰷" ;; +*) + echo "Usage: omarchy-default-browser " + exit 1 + ;; +esac + +xdg-settings set default-web-browser "$desktop_id" +xdg-mime default "$desktop_id" x-scheme-handler/http +xdg-mime default "$desktop_id" x-scheme-handler/https +xdg-mime default "$desktop_id" text/html + +notify-send -u low "$glyph $name is now the default browser" diff --git a/bin/omarchy-default-editor b/bin/omarchy-default-editor new file mode 100755 index 00000000..f0495504 --- /dev/null +++ b/bin/omarchy-default-editor @@ -0,0 +1,30 @@ +#!/bin/bash + +# omarchy:summary=Set the default editor for $EDITOR +# omarchy:args=[code|cursor|zed|sublime_text|helix|vim|emacs|nvim] +# omarchy:examples=omarchy default editor | omarchy default editor code | omarchy default editor helix + +if (($# == 0)); then + sed -n 's/^export EDITOR=//p' ~/.config/uwsm/default | head -n 1 + exit 0 +fi + +case "$1" in +code) editor="code"; name="VSCode"; glyph="" ;; +cursor) editor="cursor"; name="Cursor"; glyph="" ;; +zed) editor="zed"; name="Zed"; glyph="" ;; +sublime_text) editor="sublime_text"; name="Sublime Text"; glyph="" ;; +helix) editor="helix"; name="Helix"; glyph="" ;; +vim) editor="vim"; name="Vim"; glyph="" ;; +emacs) editor="emacs"; name="Emacs"; glyph="" ;; +nvim) editor="nvim"; name="Neovim"; glyph="" ;; +*) + echo "Usage: omarchy-default-editor " + exit 1 + ;; +esac + +sed -i "s/^export EDITOR=.*/export EDITOR=$editor/" ~/.config/uwsm/default + +export EDITOR="$editor" +notify-send -u low "$glyph $name is now the default editor" " Effective after logging out" diff --git a/bin/omarchy-default-terminal b/bin/omarchy-default-terminal new file mode 100755 index 00000000..b44b0511 --- /dev/null +++ b/bin/omarchy-default-terminal @@ -0,0 +1,36 @@ +#!/bin/bash + +# omarchy:summary=Set the default terminal used by xdg-terminal-exec +# omarchy:args=[alacritty|foot|ghostty|kitty] +# omarchy:examples=omarchy default terminal ghostty | omarchy default terminal kitty + +if (($# == 0)); then + desktop_id=$(grep -vE '^($|#)' ~/.config/xdg-terminals.list 2>/dev/null | head -n 1) + case "$desktop_id" in + Alacritty.desktop) echo "alacritty" ;; + foot.desktop) echo "foot" ;; + com.mitchellh.ghostty.desktop) echo "ghostty" ;; + kitty.desktop) echo "kitty" ;; + *) echo "$desktop_id" ;; + esac + exit 0 +fi + +case "$1" in +alacritty) desktop_id="Alacritty.desktop"; name="Alacritty"; glyph="" ;; +foot) desktop_id="foot.desktop"; name="Foot"; glyph="" ;; +ghostty) desktop_id="com.mitchellh.ghostty.desktop"; name="Ghostty"; glyph="" ;; +kitty) desktop_id="kitty.desktop"; name="Kitty"; glyph="" ;; +*) + echo "Usage: omarchy-default-terminal " + exit 1 + ;; +esac + +cat >~/.config/xdg-terminals.list < # omarchy:examples=omarchy install browser firefox | omarchy install browser brave -make_default() { - xdg-settings set default-web-browser "$1" - xdg-mime default "$1" x-scheme-handler/http - xdg-mime default "$1" x-scheme-handler/https - xdg-mime default "$1" text/html -} - setup_policy_directory() { sudo mkdir -p "$1" sudo chmod a+rw "$1" } -announce_default_browser() { +announce_browser_installed() { echo "" - echo "$1 is now the default browser. Start it with Super + Shift + Return." + echo "$1 browser installed. Make it the default via Setup > Defaults > Browser." } copy_chromium_flags() { @@ -45,9 +38,8 @@ chrome) setup_policy_directory /etc/opt/chrome/policies/managed copy_chromium_flags ~/.config/chrome-flags.conf - make_default google-chrome.desktop omarchy-theme-set-browser - announce_default_browser "Chrome" + announce_browser_installed "Chrome" ;; edge) echo "Installing Edge..." @@ -55,9 +47,8 @@ edge) setup_policy_directory /etc/opt/edge/policies/managed copy_chromium_flags ~/.config/microsoft-edge-stable-flags.conf - make_default microsoft-edge.desktop omarchy-theme-set-browser - announce_default_browser "Edge" + announce_browser_installed "Edge" ;; brave) echo "Installing Brave..." @@ -65,9 +56,8 @@ brave) setup_policy_directory /etc/brave/policies/managed copy_chromium_flags ~/.config/brave-flags.conf - make_default brave-browser.desktop omarchy-theme-set-browser - announce_default_browser "Brave" + announce_browser_installed "Brave" ;; brave-origin) echo "Installing Brave Origin..." @@ -77,9 +67,8 @@ brave-origin) mkdir -p ~/.config # FIXME: Use normal chromium flags when Brave Origin wrapper has been fixed echo "--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url" > ~/.config/brave-origin-beta-flags.conf - make_default brave-origin-beta.desktop omarchy-theme-set-browser - announce_default_browser "Brave Origin" + announce_browser_installed "Brave Origin" ;; firefox) echo "Installing Firefox..." @@ -87,8 +76,7 @@ firefox) setup_firefox_preferences /usr/lib/firefox/distribution setup_firefox_wayland - make_default firefox.desktop - announce_default_browser "Firefox" + announce_browser_installed "Firefox" ;; zen) echo "Installing Zen..." @@ -96,8 +84,7 @@ zen) setup_firefox_preferences /opt/zen-browser/distribution setup_firefox_wayland - make_default zen.desktop - announce_default_browser "Zen" + announce_browser_installed "Zen" ;; *) echo "Usage: omarchy-install-browser " diff --git a/bin/omarchy-menu b/bin/omarchy-menu index b7068741..fd7210fe 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -277,7 +277,7 @@ show_setup_menu() { local options=" Audio\n Wifi\n󰂯 Bluetooth\n󱐋 Power Profile\n System Sleep\n󰍹 Monitors" [[ -f ~/.config/hypr/bindings.conf ]] && options="$options\n Keybindings" [[ -f ~/.config/hypr/input.conf ]] && options="$options\n Input" - options="$options\n󰱔 DNS\n Security\n Config" + options="$options\n Defaults\n󰱔 DNS\n Security\n Config" case $(menu "Setup" "$options") in *Audio*) omarchy-launch-audio ;; @@ -288,6 +288,7 @@ show_setup_menu() { *Monitors*) open_in_editor ~/.config/hypr/monitors.conf ;; *Keybindings*) open_in_editor ~/.config/hypr/bindings.conf ;; *Input*) open_in_editor ~/.config/hypr/input.conf ;; + *Defaults*) show_setup_default_menu ;; *DNS*) present_terminal omarchy-setup-dns ;; *Security*) show_setup_security_menu ;; *Config*) show_setup_config_menu ;; @@ -313,9 +314,114 @@ show_setup_security_menu() { esac } +show_setup_default_menu() { + case $(menu "Default" " Browser\n Terminal\n Editor") in + *Browser*) show_setup_default_browser_menu ;; + *Terminal*) show_setup_default_terminal_menu ;; + *Editor*) show_setup_default_editor_menu ;; + *) show_setup_menu ;; + esac +} + +browser_desktop_exists() { + [[ -f ~/.local/share/applications/$1 || -f ~/.nix-profile/share/applications/$1 || -f /usr/share/applications/$1 ]] +} + +show_setup_default_browser_menu() { + local options="" + browser_desktop_exists chromium.desktop && options="$options Chromium" + browser_desktop_exists google-chrome.desktop && options="${options:+$options\n}󰊯 Chrome" + browser_desktop_exists brave-browser.desktop && options="${options:+$options\n}󰖟 Brave" + browser_desktop_exists brave-origin-beta.desktop && options="${options:+$options\n}󰖟 Brave Origin" + browser_desktop_exists microsoft-edge.desktop && options="${options:+$options\n}󰇩 Edge" + browser_desktop_exists firefox.desktop && options="${options:+$options\n}󰈹 Firefox" + browser_desktop_exists zen.desktop && options="${options:+$options\n}󰖟 Zen" + + local current="" + case "$(omarchy-default-browser)" in + chromium) current=" Chromium" ;; + chrome) current="󰊯 Chrome" ;; + brave) current="󰖟 Brave" ;; + brave-origin) current="󰖟 Brave Origin" ;; + edge) current="󰇩 Edge" ;; + firefox) current="󰈹 Firefox" ;; + zen) current="󰖟 Zen" ;; + esac + + case $(menu "Default Browser" "$options" "" "$current") in + *Chromium*) omarchy-default-browser chromium ;; + *Chrome*) omarchy-default-browser chrome ;; + *"Brave Origin"*) omarchy-default-browser brave-origin ;; + *Brave*) omarchy-default-browser brave ;; + *Edge*) omarchy-default-browser edge ;; + *Firefox*) omarchy-default-browser firefox ;; + *Zen*) omarchy-default-browser zen ;; + *) show_setup_default_menu ;; + esac +} + +show_setup_default_terminal_menu() { + local options="" + omarchy-cmd-present alacritty && options="$options Alacritty" + omarchy-cmd-present foot && options="${options:+$options\n} Foot" + omarchy-cmd-present ghostty && options="${options:+$options\n} Ghostty" + omarchy-cmd-present kitty && options="${options:+$options\n} Kitty" + + local current="" + case "$(omarchy-default-terminal)" in + alacritty) current=" Alacritty" ;; + foot) current=" Foot" ;; + ghostty) current=" Ghostty" ;; + kitty) current=" Kitty" ;; + esac + + case $(menu "Default Terminal" "$options" "" "$current") in + *Alacritty*) omarchy-default-terminal alacritty ;; + *Foot*) omarchy-default-terminal foot ;; + *Ghostty*) omarchy-default-terminal ghostty ;; + *Kitty*) omarchy-default-terminal kitty ;; + *) show_setup_default_menu ;; + esac +} + +show_setup_default_editor_menu() { + local options="" + omarchy-cmd-present nvim && options="$options Neovim" + omarchy-cmd-present code && options="${options:+$options\n} VSCode" + omarchy-cmd-present cursor && options="${options:+$options\n} Cursor" + omarchy-cmd-present zed && options="${options:+$options\n} Zed" + omarchy-cmd-present sublime_text && options="${options:+$options\n} Sublime Text" + omarchy-cmd-present helix && options="${options:+$options\n} Helix" + omarchy-cmd-present vim && options="${options:+$options\n} Vim" + omarchy-cmd-present emacs && options="${options:+$options\n} Emacs" + + local current="" + case "$(omarchy-default-editor)" in + nvim) current=" Neovim" ;; + code) current=" VSCode" ;; + cursor) current=" Cursor" ;; + zed) current=" Zed" ;; + sublime_text) current=" Sublime Text" ;; + helix) current=" Helix" ;; + vim) current=" Vim" ;; + emacs) current=" Emacs" ;; + esac + + case $(menu "Default Editor" "$options" "" "$current") in + *Neovim*) omarchy-default-editor nvim ;; + *VSCode*) omarchy-default-editor code ;; + *Cursor*) omarchy-default-editor cursor ;; + *Zed*) omarchy-default-editor zed ;; + *Sublime*) omarchy-default-editor sublime_text ;; + *Helix*) omarchy-default-editor helix ;; + *Vim*) omarchy-default-editor vim ;; + *Emacs*) omarchy-default-editor emacs ;; + *) show_setup_default_menu ;; + esac +} + show_setup_config_menu() { - case $(menu "Setup" " Defaults\n Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar\n󰞅 XCompose") in - *Defaults*) open_in_editor ~/.config/uwsm/default ;; + case $(menu "Setup" " Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar\n󰞅 XCompose") in *Hyprland*) open_in_editor ~/.config/hypr/hyprland.conf ;; *Hypridle*) open_in_editor ~/.config/hypr/hypridle.conf && omarchy-restart-hypridle ;; *Hyprlock*) open_in_editor ~/.config/hypr/hyprlock.conf ;; @@ -371,7 +477,7 @@ show_install_menu() { } show_install_browser_menu() { - case $(menu "Install" " Chrome\n Edge\n Brave\n Brave Origin\n Firefox\n Zen") in + case $(menu "Install" " Chrome\n Edge\n Brave\n Brave Origin\n Firefox\n󰖟 Zen") in *Chrome*) present_terminal "omarchy-install-browser chrome" ;; *Edge*) present_terminal "omarchy-install-browser edge" ;; *"Brave Origin"*) present_terminal "omarchy-install-browser brave-origin" ;; @@ -395,12 +501,13 @@ show_install_service_menu() { } show_install_editor_menu() { - case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Emacs") in + case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Vim\n Emacs") in *VSCode*) present_terminal omarchy-install-vscode ;; *Cursor*) install_and_launch "Cursor" "cursor-bin" "cursor" ;; *Zed*) present_terminal omarchy-install-zed ;; *Sublime*) install_and_launch "Sublime Text" "sublime-text-4" "sublime_text" ;; *Helix*) present_terminal omarchy-install-helix ;; + *Vim*) install "Vim" "vim" ;; *Emacs*) install "Emacs" "emacs-wayland" && systemctl --user enable --now emacs.service ;; *) show_install_menu ;; esac From b794321cd034e0258d8ff532a4209edd1dceb259 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 16:15:03 +0200 Subject: [PATCH 063/111] Prevent notification text wrapping --- bin/omarchy-weather-status | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/omarchy-weather-status b/bin/omarchy-weather-status index 126d6582..4175e345 100755 --- a/bin/omarchy-weather-status +++ b/bin/omarchy-weather-status @@ -23,4 +23,4 @@ format_temperature() { temperature=$(format_temperature "$temperature") wind=${wind//km\// km/} -echo "$(omarchy-weather-icon) $place · Temperature $temperature · Wind $wind" +echo "$(omarchy-weather-icon) $place · Temp $temperature · Wind $wind" From e14c685c7e3833bc977b7044c2779b63167af392 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 16:16:01 +0200 Subject: [PATCH 064/111] Quoting --- migrations/1778099894.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migrations/1778099894.sh b/migrations/1778099894.sh index bf83d6d1..7a7fec9d 100644 --- a/migrations/1778099894.sh +++ b/migrations/1778099894.sh @@ -1,3 +1,3 @@ echo "Add Transcode entry to Nautilus context menu" -source $OMARCHY_PATH/install/config/nautilus-python.sh +source "$OMARCHY_PATH/install/config/nautilus-python.sh" From 4831c883e52383df05764d731b1326915452315e Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 16:18:23 +0200 Subject: [PATCH 065/111] Explain the 152 --- config/hypr/hypridle.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/hypr/hypridle.conf b/config/hypr/hypridle.conf index 32ecb12d..08b27ef8 100644 --- a/config/hypr/hypridle.conf +++ b/config/hypr/hypridle.conf @@ -11,7 +11,7 @@ listener { on-timeout = pidof hyprlock || omarchy-launch-screensaver } -# Lock system after 5 minutes +# Lock system after 5 minutes (screensaver resets idle timer, so have to just do half + 2s margin) listener { timeout = 152 on-timeout = omarchy-system-lock From 9c3520caf9ff03e1b70003850553c9adce4e0f72 Mon Sep 17 00:00:00 2001 From: Diego Rios Date: Thu, 7 May 2026 08:48:26 -0600 Subject: [PATCH 066/111] Enable Bluetooth A2DP auto-connect in WirePlumber (#5336) * Enable Bluetooth A2DP auto-connect in WirePlumber * Harden Bluetooth A2DP migration --- bin/omarchy-restart-pipewire | 8 ++++++-- .../bluetooth-a2dp-autoconnect.conf | 18 ++++++++++++++++++ install/config/hardware/bluetooth.sh | 4 ++++ migrations/1776346552.sh | 14 ++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 default/wireplumber/wireplumber.conf.d/bluetooth-a2dp-autoconnect.conf create mode 100644 migrations/1776346552.sh diff --git a/bin/omarchy-restart-pipewire b/bin/omarchy-restart-pipewire index 14276bad..f69be512 100755 --- a/bin/omarchy-restart-pipewire +++ b/bin/omarchy-restart-pipewire @@ -2,5 +2,9 @@ # omarchy:summary=Restart the PipeWire audio service to fix audio issues or apply new configuration. -echo -e "Restarting pipewire audio service...\n" -systemctl --user restart pipewire.service +echo -e "Restarting PipeWire audio services...\n" +systemctl --user restart wireplumber.service pipewire.service + +if systemctl --user --quiet is-active pipewire-pulse.service; then + systemctl --user restart pipewire-pulse.service +fi diff --git a/default/wireplumber/wireplumber.conf.d/bluetooth-a2dp-autoconnect.conf b/default/wireplumber/wireplumber.conf.d/bluetooth-a2dp-autoconnect.conf new file mode 100644 index 00000000..d6234ab9 --- /dev/null +++ b/default/wireplumber/wireplumber.conf.d/bluetooth-a2dp-autoconnect.conf @@ -0,0 +1,18 @@ +## Auto-connect A2DP playback/capture profiles on Bluetooth devices. +## This helps speakers and receivers expose their audio profiles without +## requiring manual PipeWire/WirePlumber recovery. + +monitor.bluez.rules = [ + { + matches = [ + { + device.name = "~bluez_card.*" + } + ] + actions = { + update-props = { + bluez5.auto-connect = [ a2dp_sink a2dp_source ] + } + } + } +] diff --git a/install/config/hardware/bluetooth.sh b/install/config/hardware/bluetooth.sh index 65fc90d1..2157f07b 100644 --- a/install/config/hardware/bluetooth.sh +++ b/install/config/hardware/bluetooth.sh @@ -1,2 +1,6 @@ # Turn on bluetooth by default chrootable_systemctl_enable bluetooth.service + +mkdir -p ~/.config/wireplumber/wireplumber.conf.d/ +cp $OMARCHY_PATH/default/wireplumber/wireplumber.conf.d/bluetooth-a2dp-autoconnect.conf \ + ~/.config/wireplumber/wireplumber.conf.d/ diff --git a/migrations/1776346552.sh b/migrations/1776346552.sh new file mode 100644 index 00000000..b602340e --- /dev/null +++ b/migrations/1776346552.sh @@ -0,0 +1,14 @@ +set -e + +echo "Enable Bluetooth A2DP auto-connect in WirePlumber" + +destination=~/.config/wireplumber/wireplumber.conf.d/bluetooth-a2dp-autoconnect.conf + +mkdir -p ~/.config/wireplumber/wireplumber.conf.d/ + +if [[ ! -f "$destination" ]]; then + cp "$OMARCHY_PATH/default/wireplumber/wireplumber.conf.d/bluetooth-a2dp-autoconnect.conf" \ + "$destination" +fi + +omarchy-restart-pipewire From 573f75afeba8fd8be96b5a9d1a09dc6c5e701c50 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 16:55:54 +0200 Subject: [PATCH 067/111] Fix that zed cli is zeditor --- bin/omarchy-default-editor | 2 +- bin/omarchy-menu | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/omarchy-default-editor b/bin/omarchy-default-editor index f0495504..31846450 100755 --- a/bin/omarchy-default-editor +++ b/bin/omarchy-default-editor @@ -12,7 +12,7 @@ fi case "$1" in code) editor="code"; name="VSCode"; glyph="" ;; cursor) editor="cursor"; name="Cursor"; glyph="" ;; -zed) editor="zed"; name="Zed"; glyph="" ;; +zed | zeditor) editor="zeditor"; name="Zed"; glyph="" ;; sublime_text) editor="sublime_text"; name="Sublime Text"; glyph="" ;; helix) editor="helix"; name="Helix"; glyph="" ;; vim) editor="vim"; name="Vim"; glyph="" ;; diff --git a/bin/omarchy-menu b/bin/omarchy-menu index fd7210fe..ec9a5aae 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -389,7 +389,7 @@ show_setup_default_editor_menu() { omarchy-cmd-present nvim && options="$options Neovim" omarchy-cmd-present code && options="${options:+$options\n} VSCode" omarchy-cmd-present cursor && options="${options:+$options\n} Cursor" - omarchy-cmd-present zed && options="${options:+$options\n} Zed" + omarchy-cmd-present zeditor && options="${options:+$options\n} Zed" omarchy-cmd-present sublime_text && options="${options:+$options\n} Sublime Text" omarchy-cmd-present helix && options="${options:+$options\n} Helix" omarchy-cmd-present vim && options="${options:+$options\n} Vim" @@ -400,7 +400,7 @@ show_setup_default_editor_menu() { nvim) current=" Neovim" ;; code) current=" VSCode" ;; cursor) current=" Cursor" ;; - zed) current=" Zed" ;; + zed | zeditor) current=" Zed" ;; sublime_text) current=" Sublime Text" ;; helix) current=" Helix" ;; vim) current=" Vim" ;; From 2293df2913328b261765a3cf304170605e4fd843 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 17:02:08 +0200 Subject: [PATCH 068/111] This requires a full reboot to work --- migrations/1776346552.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migrations/1776346552.sh b/migrations/1776346552.sh index b602340e..b1a04802 100644 --- a/migrations/1776346552.sh +++ b/migrations/1776346552.sh @@ -11,4 +11,4 @@ if [[ ! -f "$destination" ]]; then "$destination" fi -omarchy-restart-pipewire +omarchy-state set reboot-required From 4f502322bd0d6dfc91831856954299a2fc09896d Mon Sep 17 00:00:00 2001 From: Ryan Hughes Date: Thu, 7 May 2026 12:21:04 -0400 Subject: [PATCH 069/111] Update pi package source --- install/packaging/npx.sh | 2 +- migrations/1778079164.sh | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 migrations/1778079164.sh diff --git a/install/packaging/npx.sh b/install/packaging/npx.sh index c68c83f7..172a37a2 100644 --- a/install/packaging/npx.sh +++ b/install/packaging/npx.sh @@ -3,5 +3,5 @@ omarchy-npx-install @google/gemini-cli gemini omarchy-npx-install @github/copilot copilot omarchy-npx-install opencode-ai opencode omarchy-npx-install playwright playwright-cli -omarchy-npx-install @mariozechner/pi-coding-agent pi +omarchy-npx-install @earendil-works/pi-coding-agent pi omarchy-npx-install @kitlangton/ghui ghui diff --git a/migrations/1778079164.sh b/migrations/1778079164.sh new file mode 100644 index 00000000..6e8fa632 --- /dev/null +++ b/migrations/1778079164.sh @@ -0,0 +1,7 @@ +echo "Update Pi CLI wrapper package" + +pi_bin="$HOME/.local/bin/pi" + +if [[ -f $pi_bin ]] && grep -q '^package="@mariozechner/pi-coding-agent"$' "$pi_bin"; then + sed -i 's|^package="@mariozechner/pi-coding-agent"$|package="@earendil-works/pi-coding-agent"|' "$pi_bin" +fi From 402da79f54e6442b0b63724106a6ae99e1fe723a Mon Sep 17 00:00:00 2001 From: Mateusz Kowalczyk Date: Thu, 7 May 2026 19:12:48 +0200 Subject: [PATCH 070/111] Install hardware video acceleration for non-X-series Panther Lake Chips (#5655) * Adjust condition to also match non-X series Panther Lake GPUs. * Add migration to install GPU acceleration on non-X Panther Lake systems. * Update comment with Non-Arc Panther Lake GPUs mentioned. * Simplify conditions in the migration --- install/config/hardware/intel/video-acceleration.sh | 4 ++-- migrations/1778165347.sh | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 migrations/1778165347.sh diff --git a/install/config/hardware/intel/video-acceleration.sh b/install/config/hardware/intel/video-acceleration.sh index 33cc6fbe..bbcc1fe9 100644 --- a/install/config/hardware/intel/video-acceleration.sh +++ b/install/config/hardware/intel/video-acceleration.sh @@ -1,8 +1,8 @@ # This installs hardware video acceleration for Intel GPUs if INTEL_GPU=$(lspci | grep -iE 'vga|3d|display' | grep -i 'intel'); then - # HD Graphics / Iris / Xe / Arc use intel-media-driver + VPL - if [[ ${INTEL_GPU,,} =~ (hd\ graphics|uhd\ graphics|xe|iris|arc) ]]; then + # HD Graphics / Iris / Xe / Arc / Non-Arc Panther Lake use intel-media-driver + VPL + if [[ ${INTEL_GPU,,} =~ (hd\ graphics|uhd\ graphics|xe|iris|arc|panther\ lake) ]]; then omarchy-pkg-add intel-media-driver libvpl vpl-gpu-rt elif [[ ${INTEL_GPU,,} =~ "gma" ]]; then # Older generations from 2008 to ~2014-2017 use libva-intel-driver diff --git a/migrations/1778165347.sh b/migrations/1778165347.sh new file mode 100644 index 00000000..cbd35fec --- /dev/null +++ b/migrations/1778165347.sh @@ -0,0 +1,5 @@ +echo "Install hardware video acceleration for Intel GPUs on non-X Panther Lake systems" + +if lspci | grep -iE 'vga|3d|display' | grep -i 'intel' | grep -i 'panther lake' | grep -qi 'intel graphics'; then + bash "$OMARCHY_PATH/install/config/hardware/intel/video-acceleration.sh" +fi From fa1ed01cd72246b91f94a5996e5f19a05201931f Mon Sep 17 00:00:00 2001 From: Patrick Rodrigues <263442757+patrickrodrigues-aa@users.noreply.github.com> Date: Thu, 7 May 2026 11:43:27 -0600 Subject: [PATCH 071/111] Run SwayOSD as a session service (#5656) * Run SwayOSD as a session service * Restart SwayOSD after clean exits * We don't need the input backend (as we manage the hotkeys in Hyprland) * Ensure we cleanup the old service starter * Not needed * Not needed either * Clean up migration --------- Co-authored-by: David Heinemeier Hansson --- bin/omarchy-first-run | 1 + bin/omarchy-restart-swayosd | 6 +++++- config/systemd/user/swayosd-server.service | 13 +++++++++++++ default/hypr/autostart.conf | 1 - install/first-run/swayosd.sh | 2 ++ migrations/1778171768.sh | 12 ++++++++++++ 6 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 config/systemd/user/swayosd-server.service create mode 100644 install/first-run/swayosd.sh create mode 100644 migrations/1778171768.sh diff --git a/bin/omarchy-first-run b/bin/omarchy-first-run index 6ad54141..023d1a65 100755 --- a/bin/omarchy-first-run +++ b/bin/omarchy-first-run @@ -16,6 +16,7 @@ if [[ -f $FIRST_RUN_MODE ]]; then bash "$OMARCHY_PATH/install/first-run/firewall.sh" bash "$OMARCHY_PATH/install/first-run/dns-resolver.sh" bash "$OMARCHY_PATH/install/first-run/gnome-theme.sh" + bash "$OMARCHY_PATH/install/first-run/swayosd.sh" bash "$OMARCHY_PATH/install/first-run/gtk-primary-paste.sh" bash "$OMARCHY_PATH/install/first-run/elephant.sh" omarchy-hook-install post-update "$OMARCHY_PATH/install/first-run/install-voxtype.hook" diff --git a/bin/omarchy-restart-swayosd b/bin/omarchy-restart-swayosd index 19f4e78d..22a14217 100755 --- a/bin/omarchy-restart-swayosd +++ b/bin/omarchy-restart-swayosd @@ -2,4 +2,8 @@ # omarchy:summary=Restart the SwayOSD server -omarchy-restart-app swayosd-server +if systemctl --user is-enabled --quiet swayosd-server.service; then + systemctl --user restart swayosd-server.service +else + omarchy-restart-app swayosd-server +fi diff --git a/config/systemd/user/swayosd-server.service b/config/systemd/user/swayosd-server.service new file mode 100644 index 00000000..55c7f9c2 --- /dev/null +++ b/config/systemd/user/swayosd-server.service @@ -0,0 +1,13 @@ +[Unit] +Description=SwayOSD server +PartOf=graphical-session.target +After=graphical-session.target + +[Service] +Type=simple +ExecStart=/usr/bin/swayosd-server +Restart=always +RestartSec=2 + +[Install] +WantedBy=graphical-session.target diff --git a/default/hypr/autostart.conf b/default/hypr/autostart.conf index 394a5f32..5cdb875d 100644 --- a/default/hypr/autostart.conf +++ b/default/hypr/autostart.conf @@ -3,7 +3,6 @@ exec-once = uwsm-app -- mako exec-once = ! omarchy-toggle-enabled waybar-off && uwsm-app -- waybar exec-once = uwsm-app -- fcitx5 --disable notificationitem exec-once = uwsm-app -- swaybg -i ~/.config/omarchy/current/background -m fill -exec-once = uwsm-app -- swayosd-server exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 exec-once = omarchy-first-run exec-once = omarchy-powerprofiles-init diff --git a/install/first-run/swayosd.sh b/install/first-run/swayosd.sh new file mode 100644 index 00000000..49db63f3 --- /dev/null +++ b/install/first-run/swayosd.sh @@ -0,0 +1,2 @@ +systemctl --user daemon-reload +systemctl --user enable --now swayosd-server.service diff --git a/migrations/1778171768.sh b/migrations/1778171768.sh new file mode 100644 index 00000000..ae7e5789 --- /dev/null +++ b/migrations/1778171768.sh @@ -0,0 +1,12 @@ +echo "Run SwayOSD as a supervised session service" + +mkdir -p ~/.config/systemd/user +cp "$OMARCHY_PATH/config/systemd/user/swayosd-server.service" ~/.config/systemd/user/swayosd-server.service + +if [[ -f ~/.config/hypr/autostart.conf ]]; then + sed -i '/^exec-once = uwsm-app -- swayosd-server$/d' ~/.config/hypr/autostart.conf +fi + +pkill -x swayosd-server || true + +bash "$OMARCHY_PATH/install/first-run/swayosd.sh" From 0c6bd1929fd32ba9ef9eed6a4da484998e613e04 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 7 May 2026 19:44:19 +0200 Subject: [PATCH 072/111] Force metric return units --- bin/omarchy-weather-status | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/omarchy-weather-status b/bin/omarchy-weather-status index 4175e345..e3e5b6bb 100755 --- a/bin/omarchy-weather-status +++ b/bin/omarchy-weather-status @@ -2,7 +2,7 @@ # omarchy:summary=Returns a formatted weather status string with temperature and wind speed. -weather=$(curl -fsS --max-time 4 "https://wttr.in?format=%l|%t|%w" 2>/dev/null | tr -d '\n') +weather=$(curl -fsS --max-time 4 "https://wttr.in?m&format=%l|%t|%w" 2>/dev/null | tr -d '\n') if [[ -z $weather ]]; then echo "Weather unavailable" From 5c3ca6084b057db29970bd7b4518bfca5e7a7463 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 8 May 2026 08:35:28 +0200 Subject: [PATCH 073/111] Group duplicate notifications --- default/mako/core.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/default/mako/core.ini b/default/mako/core.ini index 78c24452..d8837b92 100644 --- a/default/mako/core.ini +++ b/default/mako/core.ini @@ -1,4 +1,5 @@ anchor=top-right +group-by=app-name,summary,body default-timeout=5000 width=420 outer-margin=20 From a43c304d212a6753f8973d93f3dc39276a17a5e1 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 8 May 2026 08:39:25 +0200 Subject: [PATCH 074/111] Add post-boot.d hooks and give daily weather as an example --- config/omarchy/hooks/post-boot.d/weather.sample | 10 ++++++++++ default/hypr/autostart.conf | 3 +++ migrations/1778222128.sh | 7 +++++++ 3 files changed, 20 insertions(+) create mode 100644 config/omarchy/hooks/post-boot.d/weather.sample create mode 100644 migrations/1778222128.sh diff --git a/config/omarchy/hooks/post-boot.d/weather.sample b/config/omarchy/hooks/post-boot.d/weather.sample new file mode 100644 index 00000000..60a1c88f --- /dev/null +++ b/config/omarchy/hooks/post-boot.d/weather.sample @@ -0,0 +1,10 @@ +#!/bin/bash + +# Show the weather status notification after Omarchy has started. +# To put it into use, remove .sample from this file name. + +weather=$(omarchy-weather-status 2>/dev/null) || true + +if [[ -n $weather && $weather != "Weather unavailable" ]]; then + notify-send -u low "$weather" +fi diff --git a/default/hypr/autostart.conf b/default/hypr/autostart.conf index 5cdb875d..0a226db1 100644 --- a/default/hypr/autostart.conf +++ b/default/hypr/autostart.conf @@ -11,3 +11,6 @@ exec-once = uwsm-app -- omarchy-hyprland-monitor-watch # Slow app launch fix -- set systemd vars exec-once = systemctl --user import-environment $(env | cut -d'=' -f 1) exec-once = dbus-update-activation-environment --systemd --all + +# Run post-boot hooks after startup config has loaded +exec-once = sleep 2 && omarchy-hook post-boot diff --git a/migrations/1778222128.sh b/migrations/1778222128.sh new file mode 100644 index 00000000..d348b389 --- /dev/null +++ b/migrations/1778222128.sh @@ -0,0 +1,7 @@ +echo "Add sample post-boot hook" + +mkdir -p ~/.config/omarchy/hooks/post-boot.d + +if [[ ! -f ~/.config/omarchy/hooks/post-boot.d/weather.sample ]]; then + cp "$OMARCHY_PATH/config/omarchy/hooks/post-boot.d/weather.sample" ~/.config/omarchy/hooks/post-boot.d/weather.sample +fi From 5971bab9d1dc9319267ece2a496fcb9e621137e1 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 8 May 2026 09:01:09 +0200 Subject: [PATCH 075/111] Extract notification command for using the correct spacing --- bin/omarchy-notification-send | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100755 bin/omarchy-notification-send diff --git a/bin/omarchy-notification-send b/bin/omarchy-notification-send new file mode 100755 index 00000000..0a1c4e7c --- /dev/null +++ b/bin/omarchy-notification-send @@ -0,0 +1,32 @@ +#!/bin/bash + +# omarchy:summary=Send a desktop notification with Omarchy glyph and body spacing +# omarchy:args= [description] [notify-send options] +# omarchy:examples=omarchy notification send "󰔛" "Reminder" "5 minutes are up" -u critical + +set -euo pipefail + +if (($# < 2)); then + echo "Usage: omarchy-notification-send [description] [notify-send options]" + exit 1 +fi + +glyph=$1 +headline=$2 +description=${3:-} +shift 2 + +if (($# > 0)) && [[ $1 != -* ]]; then + shift +else + description="" +fi + +summary="$glyph $headline" + +if [[ -n $description ]]; then + description=$(sed 's/^/ /' <<<"$description") + notify-send "$@" "$summary" "$description" +else + notify-send "$@" "$summary" +fi From 9f187b55da990fac72d3a47b20deb157a0e6e082 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 8 May 2026 11:56:06 +0200 Subject: [PATCH 076/111] Make sure the Omarchy agent skill is available for all harnesses --- install/config/omarchy-ai-skill.sh | 9 ++++++--- migrations/1778233760.sh | 3 +++ 2 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 migrations/1778233760.sh diff --git a/install/config/omarchy-ai-skill.sh b/install/config/omarchy-ai-skill.sh index 31f748cf..8eec4b95 100644 --- a/install/config/omarchy-ai-skill.sh +++ b/install/config/omarchy-ai-skill.sh @@ -1,3 +1,6 @@ -# Place in ~/.claude/skills since all tools populate from there as well as their own sources -mkdir -p ~/.claude/skills -ln -s $OMARCHY_PATH/default/omarchy-skill ~/.claude/skills/omarchy +# Place in each assistant's global skills directory so the Omarchy skill is available on first install +mkdir -p ~/.agents/skills ~/.claude/skills ~/.codex/skills ~/.pi/agent/skills +ln -sfn "$OMARCHY_PATH/default/omarchy-skill" ~/.agents/skills/omarchy +ln -sfn "$OMARCHY_PATH/default/omarchy-skill" ~/.claude/skills/omarchy +ln -sfn "$OMARCHY_PATH/default/omarchy-skill" ~/.codex/skills/omarchy +ln -sfn "$OMARCHY_PATH/default/omarchy-skill" ~/.pi/agent/skills/omarchy diff --git a/migrations/1778233760.sh b/migrations/1778233760.sh new file mode 100644 index 00000000..522f14ab --- /dev/null +++ b/migrations/1778233760.sh @@ -0,0 +1,3 @@ +echo "Add Omarchy AI skill to pi, Codex, and shared Agent Skills directories" + +source "$OMARCHY_PATH/install/config/omarchy-ai-skill.sh" From 129c39448c8f44342861957def7e27838507b4a8 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 8 May 2026 11:58:12 +0200 Subject: [PATCH 077/111] Reminders (#5669) * Extract notification command for using the correct spacing * Add easy to set reminders * More human * Clear and direct hotkeys * Split * Bake reminders into the skill --- bin/omarchy | 1 + bin/omarchy-menu | 46 ++++++++- bin/omarchy-reminder | 139 +++++++++++++++++++++++++++ default/hypr/bindings/utilities.conf | 7 +- default/omarchy-skill/SKILL.md | 21 +++- 5 files changed, 209 insertions(+), 5 deletions(-) create mode 100755 bin/omarchy-reminder diff --git a/bin/omarchy b/bin/omarchy index d4fd2570..eda79a74 100755 --- a/bin/omarchy +++ b/bin/omarchy @@ -54,6 +54,7 @@ GROUP_DESCRIPTIONS[plymouth]="Plymouth boot theme management" GROUP_DESCRIPTIONS[powerprofiles]="Power profile management" GROUP_DESCRIPTIONS[refresh]="Reset config to defaults" GROUP_DESCRIPTIONS[reinstall]="Reinstall and reset workflows" +GROUP_DESCRIPTIONS[reminder]="Desktop notification reminders" GROUP_DESCRIPTIONS[remove]="Removal workflows" GROUP_DESCRIPTIONS[restart]="Restart Omarchy components" GROUP_DESCRIPTIONS[setup]="Interactive setup wizards" diff --git a/bin/omarchy-menu b/bin/omarchy-menu index ec9a5aae..c8746cfb 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -43,6 +43,12 @@ menu() { echo -e "$options" | omarchy-launch-walker --dmenu --width 295 --minheight 1 --maxheight 630 -p "$prompt…" "${args[@]}" 2>/dev/null } +input() { + local prompt="$1" + + omarchy-launch-walker --dmenu --inputonly --width 295 --minheight 1 --maxheight 1 -p "$prompt…" 2>/dev/null +} + terminal() { xdg-terminal-exec --app-id=org.omarchy.terminal "$@" } @@ -93,7 +99,8 @@ show_learn_menu() { } show_trigger_menu() { - case $(menu "Trigger" " Capture\n󰧸 Transcode\n Share\n󰔎 Toggle\n Hardware") in + case $(menu "Trigger" "󰔛 Reminder\n Capture\n󰧸 Transcode\n Share\n󰔎 Toggle\n Hardware") in + *Reminder*) show_reminder_menu ;; *Capture*) show_capture_menu ;; *Transcode*) show_transcode_menu ;; *Share*) show_share_menu ;; @@ -103,6 +110,41 @@ show_trigger_menu() { esac } +show_reminder_menu() { + case $(menu "Reminder" "󰔛 Set one\n󰔛 Show all\n󰔛 Clear all") in + *Set*) show_custom_reminder_input ;; + *"Show all"*) omarchy-reminder show ;; + *"Clear all"*) omarchy-reminder clear ;; + *) back_to show_trigger_menu ;; + esac +} + +show_custom_reminder_input() { + local minutes + minutes=$(input "Remind in minutes") + + if [[ $minutes =~ ^[0-9]+$ ]] && ((minutes > 0)); then + show_reminder_message_input "$minutes" + elif [[ -n $minutes ]]; then + omarchy-notification-send "󰔛" "Invalid reminder" "Enter the number of minutes" -u critical + show_custom_reminder_input + else + back_to show_reminder_menu + fi +} + +show_reminder_message_input() { + local minutes="$1" + local message + message=$(input "Reminder message") + + if [[ -n $message ]]; then + omarchy-reminder "$minutes" "$message" + else + omarchy-reminder "$minutes" + fi +} + show_capture_menu() { case $(menu "Capture" " Screenshot\n Screenrecord\n󰴑 Text Extraction\n󰃉 Color") in *Screenshot*) omarchy-capture-screenshot ;; @@ -816,6 +858,8 @@ go_to_menu() { *hardware*) show_hardware_menu ;; *share*) show_share_menu ;; *transcode*) show_transcode_menu ;; + *reminder-set*) show_custom_reminder_input ;; + *reminder*) show_reminder_menu ;; *background*) show_background_menu ;; *capture*) show_capture_menu ;; *style*) show_style_menu ;; diff --git a/bin/omarchy-reminder b/bin/omarchy-reminder new file mode 100755 index 00000000..1dc59097 --- /dev/null +++ b/bin/omarchy-reminder @@ -0,0 +1,139 @@ +#!/bin/bash + +# omarchy:summary=Set and show lightweight desktop notification reminders +# omarchy:args= [message] | show | clear +# omarchy:examples=omarchy reminder 5 | omarchy reminder 30 "Check the oven" | omarchy reminder show | omarchy reminder clear + +set -euo pipefail + +format_remaining() { + local seconds=$1 + local minutes=$((seconds / 60)) + local remainder=$((seconds % 60)) + + if ((minutes > 0 && remainder > 0)); then + echo "${minutes}m ${remainder}s" + elif ((minutes > 0)); then + echo "${minutes}m" + else + echo "${remainder}s" + fi +} + +parse_systemd_timespan() { + local timespan="$1" + local total=0 + local value unit whole + + while read -r value unit; do + whole=${value%.*} + + case $unit in + d) total=$((total + whole * 86400)) ;; + h) total=$((total + whole * 3600)) ;; + min) total=$((total + whole * 60)) ;; + s) total=$((total + whole)) ;; + ms | us) ;; + esac + done < <(grep -oE '[0-9]+([.][0-9]+)?(d|h|min|s|ms|us)' <<<"$timespan" | sed -E 's/^([0-9.]+)([a-z]+)$/\1 \2/') + + echo "$total" +} + +show_reminders() { + local timers timer next next_seconds uptime remaining body="" + local reminder_dir="${XDG_RUNTIME_DIR:-/tmp}/omarchy-reminders" + local reminder_message="" + + timers=$(systemctl --user list-timers --all --no-legend --no-pager "omarchy-reminder-*.timer" 2>/dev/null | awk '{ print $(NF - 1) }') + uptime=${SECONDS_SINCE_BOOT:-$(awk '{ print int($1) }' /proc/uptime)} + + for timer in $timers; do + next=$(systemctl --user show -P NextElapseUSecMonotonic "$timer" 2>/dev/null || true) + [[ -z $next ]] && continue + + next_seconds=$(parse_systemd_timespan "$next") + ((next_seconds <= uptime)) && continue + + remaining=$((next_seconds - uptime)) + reminder=${timer%.timer} + reminder=${reminder#omarchy-reminder-} + set_at=${reminder##*-} + reminder_minutes=${reminder%%m-*} + reminder_message="" + [[ -f $reminder_dir/${timer%.timer}.message ]] && reminder_message=$(<"$reminder_dir/${timer%.timer}.message") + + if [[ -n $reminder_message ]]; then + body+="$reminder_message in $(format_remaining $remaining) ($(date -d "@$((set_at + reminder_minutes * 60))" +%-H:%M))"$'\n' + else + body+="${reminder_minutes}-min reminder in $(format_remaining $remaining) ($(date -d "@$((set_at + reminder_minutes * 60))" +%-H:%M))"$'\n' + fi + done + + if [[ -z $body ]]; then + omarchy-notification-send "󰔛" "Upcoming reminders" "No outstanding reminders" -u low + else + omarchy-notification-send "󰔛" "Upcoming reminders" "${body%$'\n'}" -u low + fi +} + +clear_reminders() { + local units + local reminder_dir="${XDG_RUNTIME_DIR:-/tmp}/omarchy-reminders" + + units=$(systemctl --user list-timers --all --no-legend --no-pager "omarchy-reminder-*.timer" 2>/dev/null | awk '{ print $(NF - 1), $NF }') + + if [[ -n $units ]]; then + xargs -r systemctl --user stop <<<"$units" || true + fi + + rm -f "$reminder_dir"/omarchy-reminder-*.message 2>/dev/null || true + omarchy-notification-send "󰔛" "All reminders have been cleared" -u low +} + +case ${1:-} in +show | list) + show_reminders + exit 0 + ;; +clear) + clear_reminders + exit 0 + ;; +esac + +minutes=${1:-} +shift || true +message="$*" +custom_message="$message" + +if [[ -z $minutes ]] || [[ ! $minutes =~ ^[0-9]+$ ]] || ((minutes == 0)); then + echo "Usage: omarchy-reminder [message]" + echo " omarchy-reminder show" + echo " omarchy-reminder clear" + exit 1 +fi + +if [[ -z $message ]]; then + message="Your ${minutes} minutes are up" +fi + +set_at=$(date +%s) +remind_at=$(date -d "+${minutes} minutes" +%H:%M) +unit="omarchy-reminder-${minutes}m-$set_at" +reminder_dir="${XDG_RUNTIME_DIR:-/tmp}/omarchy-reminders" +message_file="$reminder_dir/$unit.message" +confirmation="You'll be reminded at $remind_at" +confirmation_title="Reminder set for ${minutes} minutes" + +mkdir -p "$reminder_dir" + +if [[ -n $custom_message ]]; then + printf "%s" "$custom_message" >"$message_file" + confirmation_title="$custom_message in ${minutes} minutes" +fi + +systemd-run --user --quiet --collect --on-active="${minutes}m" --unit="$unit" \ + bash -c 'omarchy-notification-send "󰔛" "Reminder" "$1" -u critical; rm -f "$2"' bash "$message" "$message_file" + +omarchy-notification-send "󰔛" "$confirmation_title" "$confirmation" -u low diff --git a/default/hypr/bindings/utilities.conf b/default/hypr/bindings/utilities.conf index c152f884..8bac901a 100644 --- a/default/hypr/bindings/utilities.conf +++ b/default/hypr/bindings/utilities.conf @@ -44,7 +44,12 @@ bindd = SUPER CTRL, PRINT, Extract text (OCR) from screenshot, exec, omarchy-cap bindd = SUPER CTRL, S, Share, exec, omarchy-menu share # Transcoding -bindd = SUPER CTRL, R, Transcode, exec, omarchy-menu transcode +bindd = SUPER CTRL, PERIOD, Transcode, exec, omarchy-menu transcode + +# Reminders +bindd = SUPER CTRL, R, Set reminder, exec, omarchy-menu reminder-set +bindd = SUPER CTRL ALT, R, Show reminders, exec, omarchy-reminder show +bindd = SUPER SHIFT CTRL, R, Clear reminders, exec, omarchy-reminder clear # Waybar-less information bindd = SUPER CTRL ALT, T, Show time, exec, notify-send -u low " $(date +"%A %H:%M · %d %B %Y · Week %V")" diff --git a/default/omarchy-skill/SKILL.md b/default/omarchy-skill/SKILL.md index 5f9d5a7e..8aa5ffaf 100644 --- a/default/omarchy-skill/SKILL.md +++ b/default/omarchy-skill/SKILL.md @@ -6,8 +6,8 @@ description: > ~/.config/alacritty/, ~/.config/foot/, ~/.config/kitty/, ~/.config/ghostty/, ~/.config/mako/, or ~/.config/omarchy/. Triggers: Hyprland, window rules, animations, keybindings, monitors, gaps, borders, blur, opacity, waybar, walker, terminal config, themes, - wallpaper, night light, idle, lock screen, screenshots, layer rules, workspace - settings, display config, and user-facing omarchy commands. Excludes Omarchy + wallpaper, night light, idle, lock screen, screenshots, reminders, layer rules, + workspace settings, display config, and user-facing omarchy commands. Excludes Omarchy source development in ~/.local/share/omarchy/ and `omarchy dev` workflows. --- @@ -30,7 +30,7 @@ It is not for contributing to Omarchy source code. - Layer rules, workspace settings, display/monitor configuration - Themes, wallpapers, fonts, appearance changes - User-facing `omarchy` commands (`omarchy theme ...`, `omarchy refresh ...`, `omarchy restart ...`, etc.) -- Screenshots, screen recording, night light, idle behavior, lock screen +- Screenshots, screen recording, reminders, night light, idle behavior, lock screen **If you're about to edit a config file in ~/.config/ on this system, STOP and use this skill first.** @@ -118,6 +118,7 @@ Run `omarchy --help` for the full list. The most common groups: | `omarchy install` | Install optional software / packages | `omarchy install docker dbs` | | `omarchy launch` | Launch apps | `omarchy launch browser` | | `omarchy capture` | Screenshots and recordings | `omarchy capture screenshot` | +| `omarchy reminder` | Desktop notification reminders | `omarchy reminder 15 "Pickup Jack"` | | `omarchy pkg` | Package management | `omarchy pkg install ` | | `omarchy setup` | Initial setup tasks | `omarchy setup fingerprint` | | `omarchy update` | System updates | `omarchy update` | @@ -358,6 +359,17 @@ When user requests system changes: 5. **Is it a package install?** Use `omarchy install package ` (or `omarchy pkg aur add ` for AUR-only packages) 6. **Unsure if command exists?** Run `omarchy commands` (or `omarchy --help` for one group) +### Reminder Requests + +When the user asks to set a reminder, use `omarchy reminder [message]` directly. Convert natural language durations to minutes and title-case short reminder labels when appropriate. + +```bash +omarchy reminder 15 "Pickup Jack" +omarchy reminder 60 "Check laundry" +omarchy reminder show +omarchy reminder clear +``` + ## Out of Scope This skill intentionally does not cover Omarchy source development. Do not use this skill for: @@ -372,6 +384,9 @@ This skill intentionally does not cover Omarchy source development. Do not use t - "Configure my external monitor" -> Edit `~/.config/hypr/monitors.conf` - "Make the window gaps smaller" -> Edit `~/.config/hypr/looknfeel.conf` - "Set up night light to turn on at sunset" -> `omarchy toggle nightlight` or edit `~/.config/hypr/hyprsunset.conf` +- "Set a reminder to pickup jack in 15 minutes" -> `omarchy reminder 15 "Pickup Jack"` +- "Show my reminders" -> `omarchy reminder show` +- "Clear all reminders" -> `omarchy reminder clear` - "Customize the catppuccin theme colors" -> Create `~/.config/omarchy/themes/catppuccin-custom/` by copying from stock, then edit - "Run a script every time I change themes" -> Create `~/.config/omarchy/hooks/theme-set` - "Reset waybar to defaults" -> `omarchy refresh waybar` From cbf4044c70f3692002f7db4eafce7de9c52441c2 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 8 May 2026 12:40:37 +0200 Subject: [PATCH 078/111] Omarchy menu helpers Get more stuff out of the terminal --- bin/omarchy-menu-file | 45 +++++++++++++++++++++++++++++++++++++++++ bin/omarchy-menu-input | 16 +++++++++++++++ bin/omarchy-menu-select | 38 ++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100755 bin/omarchy-menu-file create mode 100755 bin/omarchy-menu-input create mode 100755 bin/omarchy-menu-select diff --git a/bin/omarchy-menu-file b/bin/omarchy-menu-file new file mode 100755 index 00000000..37048e9e --- /dev/null +++ b/bin/omarchy-menu-file @@ -0,0 +1,45 @@ +#!/bin/bash + +# omarchy:summary=Pick a file with Walker +# omarchy:group=menu +# omarchy:name=file +# omarchy:args=label paths formats [walker args...] +# omarchy:examples=omarchy menu file "Select image" "$HOME/Pictures" "jpg png webp"|omarchy-menu-file "Select media" "$HOME/Pictures:$HOME/Videos" "jpg png mp4 mov" --width 800 + +set -euo pipefail + +if (( $# < 3 )); then + echo "Usage: omarchy-menu-file