From 40f41a5299a3a12f1f9908ad5a01205bb1927eef Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 24 Apr 2026 09:56:08 +0200 Subject: [PATCH 01/18] Fix hw check for hybrid gpu --- bin/omarchy-hw-hybrid-gpu | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/bin/omarchy-hw-hybrid-gpu b/bin/omarchy-hw-hybrid-gpu index dcd0a8fd..7f26f6af 100755 --- a/bin/omarchy-hw-hybrid-gpu +++ b/bin/omarchy-hw-hybrid-gpu @@ -1,3 +1,9 @@ #!/bin/bash -(($(lspci | grep -cE 'VGA|3D|Display') >= 2)) +# supergfxctl is authoritative: in Integrated mode the dGPU is unbound and +# hidden from lspci, so the controller count would undercount on those systems. +if command -v supergfxctl &>/dev/null; then + supergfxctl -s 2>/dev/null | grep -qw Hybrid +else + (($(lspci | grep -cE 'VGA|3D|Display') >= 2)) +fi From 1cf28a9fda8c3a04f78ec431566da40f2a3b56e9 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 24 Apr 2026 10:00:41 +0200 Subject: [PATCH 02/18] Show detailed battery notification on right-click on Waybar battery icon --- config/waybar/config.jsonc | 1 + migrations/1777017528.sh | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 migrations/1777017528.sh diff --git a/config/waybar/config.jsonc b/config/waybar/config.jsonc index 8d857c69..150cfea6 100644 --- a/config/waybar/config.jsonc +++ b/config/waybar/config.jsonc @@ -93,6 +93,7 @@ "tooltip-format-charging": "{power:>1.0f}W↑ {capacity}%", "interval": 5, "on-click": "omarchy-menu power", + "on-click-right": "notify-send -u low \"$(omarchy-battery-status)\"", "states": { "warning": 20, "critical": 10 diff --git a/migrations/1777017528.sh b/migrations/1777017528.sh new file mode 100644 index 00000000..7f340748 --- /dev/null +++ b/migrations/1777017528.sh @@ -0,0 +1,6 @@ +echo "Show battery status notification on right-click of the waybar battery icon" + +if ! grep -q 'omarchy-battery-status' ~/.config/waybar/config.jsonc; then + sed -i '/"on-click": "omarchy-menu power",/a\ "on-click-right": "notify-send -u low \\"$(omarchy-battery-status)\\"",' ~/.config/waybar/config.jsonc + omarchy-restart-waybar +fi From 0be4648773841a8502432c70ced3e49a58045c84 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 24 Apr 2026 10:38:37 +0200 Subject: [PATCH 03/18] Better guard against scrambled frames in screenrecording on slower systems --- bin/omarchy-cmd-screenrecord | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/bin/omarchy-cmd-screenrecord b/bin/omarchy-cmd-screenrecord index 1e45d4ab..e6538ad7 100755 --- a/bin/omarchy-cmd-screenrecord +++ b/bin/omarchy-cmd-screenrecord @@ -164,12 +164,11 @@ finalize_recording() { latest=$(cat "$RECORDING_FILE" 2>/dev/null) [[ -f $latest ]] || return - # Trim the first frame, and normalize audio to -14 LUFS if present, in a single pass - local args=(-y -ss 0.1 -i "$latest") + # Re-encode to drop scrambled encoder-warmup frames (stream copy can't — it rewinds to the keyframe) + # and normalize audio to -14 LUFS if present, in a single pass + local args=(-y -ss 0.1 -i "$latest" -c:v libx264 -preset veryfast -crf 20) if ffprobe -v error -select_streams a -show_entries stream=codec_type -of csv=p=0 "$latest" 2>/dev/null | grep -q audio; then - args+=(-af loudnorm=I=-14:TP=-1.5:LRA=11 -c:v copy) - else - args+=(-c copy) + args+=(-af loudnorm=I=-14:TP=-1.5:LRA=11) fi local processed="${latest%.mp4}-processed.mp4" From 1d4c859c71611df5a9978a7ccf26a7b0b230fd51 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 24 Apr 2026 10:16:31 +0200 Subject: [PATCH 04/18] Proper fix for using device dark mode in Chrome --- install/config/theme.sh | 2 +- migrations/1777018408.sh | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 migrations/1777018408.sh diff --git a/install/config/theme.sh b/install/config/theme.sh index 439ec08d..0dab91ad 100644 --- a/install/config/theme.sh +++ b/install/config/theme.sh @@ -24,4 +24,4 @@ sudo mkdir -p /etc/brave/policies/managed sudo chmod a+rw /etc/brave/policies/managed # Default Chromium to follow system appearance ("device") instead of dark -echo '{"browser":{"theme":{"color_scheme":0}}}' | sudo tee /usr/lib/chromium/initial_preferences >/dev/null +echo '{"browser":{"theme":{"color_scheme":0,"color_scheme2":0}}}' | sudo tee /usr/lib/chromium/initial_preferences >/dev/null diff --git a/migrations/1777018408.sh b/migrations/1777018408.sh new file mode 100644 index 00000000..af644b53 --- /dev/null +++ b/migrations/1777018408.sh @@ -0,0 +1,9 @@ +echo "Fix Chromium appearance mode to also set color_scheme2 (the field Chromium actually reads now)" + +echo '{"browser":{"theme":{"color_scheme":0,"color_scheme2":0}}}' | sudo tee /usr/lib/chromium/initial_preferences >/dev/null + +# Update existing Chromium profiles so color_scheme2 follows the system, not dark +PREFS="$HOME/.config/chromium/Default/Preferences" +if [[ -f "$PREFS" ]] && command -v jq &>/dev/null; then + jq '.browser.theme.color_scheme = 0 | .browser.theme.color_scheme2 = 0' "$PREFS" > "$PREFS.tmp" && mv "$PREFS.tmp" "$PREFS" +fi From 0041950d46e4080d7c36fe36aa94c77adcdbd5ff Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 24 Apr 2026 10:47:04 +0200 Subject: [PATCH 05/18] Only reencode if we detect garbage frames --- bin/omarchy-cmd-screenrecord | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/bin/omarchy-cmd-screenrecord b/bin/omarchy-cmd-screenrecord index e6538ad7..f07914ca 100755 --- a/bin/omarchy-cmd-screenrecord +++ b/bin/omarchy-cmd-screenrecord @@ -164,9 +164,15 @@ finalize_recording() { latest=$(cat "$RECORDING_FILE" 2>/dev/null) [[ -f $latest ]] || return - # Re-encode to drop scrambled encoder-warmup frames (stream copy can't — it rewinds to the keyframe) - # and normalize audio to -14 LUFS if present, in a single pass - local args=(-y -ss 0.1 -i "$latest" -c:v libx264 -preset veryfast -crf 20) + # Re-encode only when the first GOP contains discardable warmup packets — stream copy can't + # trim those (it rewinds to the keyframe). Clean recordings stay on the fast stream-copy path. + local video_codec=(-c:v copy) + if ffprobe -v error -select_streams v:0 -read_intervals %+0.2 -show_entries packet=flags -of csv=p=0 "$latest" 2>/dev/null | grep -q D; then + video_codec=(-c:v libx264 -preset veryfast -crf 20) + fi + + # Trim the first frame, and normalize audio to -14 LUFS if present, in a single pass + local args=(-y -ss 0.1 -i "$latest" "${video_codec[@]}") if ffprobe -v error -select_streams a -show_entries stream=codec_type -of csv=p=0 "$latest" 2>/dev/null | grep -q audio; then args+=(-af loudnorm=I=-14:TP=-1.5:LRA=11) fi From 2b4d89a9eaf88cd0f6aa5a8d61b56ac3bd574e42 Mon Sep 17 00:00:00 2001 From: Ryan Hughes Date: Fri, 24 Apr 2026 19:23:07 -0400 Subject: [PATCH 06/18] Keep hyprpicker alive until capture is complete to prevent mid-transition screenshots --- bin/omarchy-cmd-screenshot | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/bin/omarchy-cmd-screenshot b/bin/omarchy-cmd-screenshot index 9036c995..99e2976a 100755 --- a/bin/omarchy-cmd-screenshot +++ b/bin/omarchy-cmd-screenshot @@ -63,6 +63,13 @@ get_rectangles() { hyprctl clients -j | jq -r --arg ws "$active_workspace" '.[] | select(.workspace.id == ($ws | tonumber)) | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' } +# Keep hyprpicker alive until after grim captures so the screenshot sees the +# frozen overlay rather than live content shifting during teardown. +cleanup_freeze() { + [[ -n $PID ]] && kill $PID 2>/dev/null +} +trap cleanup_freeze EXIT + # Select based on mode case "$MODE" in region) @@ -70,14 +77,12 @@ region) PID=$! sleep .1 SELECTION=$(slurp 2>/dev/null) - kill $PID 2>/dev/null ;; windows) hyprpicker -r -z >/dev/null 2>&1 & PID=$! sleep .1 SELECTION=$(get_rectangles | slurp -r 2>/dev/null) - kill $PID 2>/dev/null ;; fullscreen) SELECTION=$(hyprctl monitors -j | jq -r "${JQ_MONITOR_GEO} .[] | select(.focused == true) | format_geo") @@ -88,7 +93,6 @@ smart | *) PID=$! sleep .1 SELECTION=$(echo "$RECTS" | slurp 2>/dev/null) - kill $PID 2>/dev/null # If the selection area is L * W < 20, we'll assume you were trying to select whichever # window or output it was inside of to prevent accidental 2px snapshots From e01741afab11296fedbba5fae33e4141bb16db74 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 25 Apr 2026 21:17:18 +0200 Subject: [PATCH 07/18] Hide useless lstopo.desktop --- applications/hidden/lstopo.desktop | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 applications/hidden/lstopo.desktop diff --git a/applications/hidden/lstopo.desktop b/applications/hidden/lstopo.desktop new file mode 100644 index 00000000..e1e3e173 --- /dev/null +++ b/applications/hidden/lstopo.desktop @@ -0,0 +1,2 @@ +[Desktop Entry] +Hidden=true From 4b7fe16029131f744e1caf5e453806ab0cbc01df Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 25 Apr 2026 21:33:46 +0200 Subject: [PATCH 08/18] Offer direct boot as a toggle option --- bin/omarchy-config-direct-boot | 45 ++++++++++++++++++++++------------ bin/omarchy-menu | 3 ++- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/bin/omarchy-config-direct-boot b/bin/omarchy-config-direct-boot index 6bb82123..50f3ba62 100755 --- a/bin/omarchy-config-direct-boot +++ b/bin/omarchy-config-direct-boot @@ -1,6 +1,6 @@ #!/bin/bash -# Add an EFI boot entry for the Omarchy UKI, allowing the system to boot directly +# Add or remove an EFI boot entry for the Omarchy UKI, allowing the system to boot directly # without a bootloader like Limine. Requires UEFI firmware and a built UKI. if [[ ! -d /sys/firmware/efi ]]; then @@ -23,23 +23,36 @@ if cat /sys/class/dmi/id/bios_vendor 2>/dev/null | grep -qi "Apple"; then exit 1 fi -uki_file=$(find /boot/EFI/Linux/ -name "omarchy*.efi" -printf "%f\n" 2>/dev/null | head -1) +existing_entry=$(efibootmgr | grep -E "^Boot[0-9A-Fa-f]+\*? Omarchy([[:space:]]|$)" | head -1) -if [[ -z $uki_file ]]; then - echo "Error: No Omarchy UKI found in /boot/EFI/Linux/" >&2 - exit 1 -fi +if [[ -n $existing_entry ]]; then + boot_num=$(echo "$existing_entry" | sed -n 's/^Boot\([0-9A-Fa-f]\+\).*/\1/p') -boot_source=$(findmnt -n -o SOURCE /boot) -disk=$(echo "$boot_source" | sed 's/p\?[0-9]*$//') -part=$(echo "$boot_source" | grep -o 'p\?[0-9]*$' | sed 's/^p//') + if gum confirm "Disable direct boot (remove Omarchy EFI entry)?"; then + echo "Removing EFI boot entry $boot_num" + sudo efibootmgr --bootnum "$boot_num" --delete-bootnum >/dev/null + fi -if gum confirm "Setup direct boot (so snapshot booting must be done via bios)?"; then - echo "Creating EFI boot entry for $uki_file" + exit 0 +else + uki_file=$(find /boot/EFI/Linux/ -name "omarchy*.efi" -printf "%f\n" 2>/dev/null | head -1) - sudo efibootmgr --create \ - --disk "$disk" \ - --part "$part" \ - --label "Omarchy" \ - --loader "\\EFI\\Linux\\$uki_file" + if [[ -z $uki_file ]]; then + echo "Error: No Omarchy UKI found in /boot/EFI/Linux/" >&2 + exit 1 + fi + + boot_source=$(findmnt -n -o SOURCE /boot) + disk=$(echo "$boot_source" | sed 's/p\?[0-9]*$//') + part=$(echo "$boot_source" | grep -o 'p\?[0-9]*$' | sed 's/^p//') + + if gum confirm "Setup direct boot (so snapshot booting must be done via bios)?"; then + echo "Creating EFI boot entry for $uki_file" + + sudo efibootmgr --create \ + --disk "$disk" \ + --part "$part" \ + --label "Omarchy" \ + --loader "\\EFI\\Linux\\$uki_file" + fi fi diff --git a/bin/omarchy-menu b/bin/omarchy-menu index 4cd677c2..b9595f84 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -168,7 +168,7 @@ show_share_menu() { } show_toggle_menu() { - local options="󱄄 Screensaver\n󰔎 Nightlight\n󱫖 Idle Lock\n󰍜 Top Bar\n󱂬 Workspace Layout\n Window Gaps\n 1-Window Ratio\n󰍹 Monitor Scaling\n" + local options="󱄄 Screensaver\n󰔎 Nightlight\n󱫖 Idle Lock\n󰍜 Top Bar\n󱂬 Workspace Layout\n Window Gaps\n 1-Window Ratio\n󰍹 Monitor Scaling\n Direct Boot" case $(menu "Toggle" "$options") in *Screensaver*) omarchy-toggle-screensaver ;; @@ -179,6 +179,7 @@ show_toggle_menu() { *Ratio*) omarchy-hyprland-window-single-square-aspect-toggle ;; *Gaps*) omarchy-hyprland-window-gaps-toggle ;; *Scaling*) omarchy-hyprland-monitor-scaling-cycle ;; + *"Direct Boot"*) present_terminal omarchy-config-direct-boot ;; *) back_to show_trigger_menu ;; esac } From 89162a4be1b8631fc12567229415f4b014c5faa0 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 26 Apr 2026 08:45:02 +0200 Subject: [PATCH 09/18] Add way to customize the plymouth theme more easily --- bin/omarchy-theme-set-plymouth | 96 ++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100755 bin/omarchy-theme-set-plymouth diff --git a/bin/omarchy-theme-set-plymouth b/bin/omarchy-theme-set-plymouth new file mode 100755 index 00000000..abfca567 --- /dev/null +++ b/bin/omarchy-theme-set-plymouth @@ -0,0 +1,96 @@ +#!/bin/bash + +# Configure the Plymouth boot theme with a custom background color, accent color, and logo. +# Stages the change in a temp dir, previews it as a composited image, then optionally +# commits the staged files to /usr/share and rebuilds the initramfs. + +if [[ $# -ne 3 ]]; then + echo "Usage: omarchy-theme-set-plymouth " >&2 + exit 1 +fi + +bg_hex="${1#\#}" +accent_hex="${2#\#}" +logo_path="$3" + +if ! [[ $bg_hex =~ ^[0-9a-fA-F]{6}$ ]]; then + echo "Invalid background color: $1 (expected #RRGGBB)" >&2 + exit 1 +fi + +if ! [[ $accent_hex =~ ^[0-9a-fA-F]{6}$ ]]; then + echo "Invalid accent color: $2 (expected #RRGGBB)" >&2 + exit 1 +fi + +if [[ ! -f $logo_path ]]; then + echo "Logo file not found: $logo_path" >&2 + exit 1 +fi + +bg_r=$(awk -v n=$((16#${bg_hex:0:2})) 'BEGIN{printf "%.3f", n/255}') +bg_g=$(awk -v n=$((16#${bg_hex:2:2})) 'BEGIN{printf "%.3f", n/255}') +bg_b=$(awk -v n=$((16#${bg_hex:4:2})) 'BEGIN{printf "%.3f", n/255}') + +theme_dir="/usr/share/plymouth/themes/omarchy" +staging_dir=$(mktemp -d) +preview_png=$(mktemp --suffix=.png) +trap 'rm -rf "$staging_dir" "$preview_png"' EXIT + +cp ~/.local/share/omarchy/default/plymouth/* "$staging_dir/" +cp "$logo_path" "$staging_dir/logo.png" + +sed -i \ + -e "s/^Window.SetBackgroundTopColor.*/Window.SetBackgroundTopColor($bg_r, $bg_g, $bg_b);/" \ + -e "s/^Window.SetBackgroundBottomColor.*/Window.SetBackgroundBottomColor($bg_r, $bg_g, $bg_b);/" \ + "$staging_dir/omarchy.script" + +for asset in bullet.png entry.png lock.png progress_bar.png; do + magick "$staging_dir/$asset" -channel RGB +level-colors "#$accent_hex","#$accent_hex" "$staging_dir/$asset" +done + +if gum confirm "Preview changes?"; then + canvas_w=1920 + canvas_h=1080 + + logo_w=$(magick identify -format '%w' "$staging_dir/logo.png") + logo_h=$(magick identify -format '%h' "$staging_dir/logo.png") + entry_w=$(magick identify -format '%w' "$staging_dir/entry.png") + entry_h=$(magick identify -format '%h' "$staging_dir/entry.png") + lock_h=$(awk "BEGIN{print int($entry_h * 0.8)}") + lock_w=$(awk "BEGIN{print int(84 * $lock_h / 96)}") + + logo_x=$(( (canvas_w - logo_w) / 2 )) + logo_y=$(( (canvas_h - logo_h) / 2 )) + entry_x=$(( (canvas_w - entry_w) / 2 )) + entry_y=$(( logo_y + logo_h + 40 )) + lock_x=$(( entry_x - lock_w - 15 )) + lock_y=$(( entry_y + entry_h/2 - lock_h/2 )) + bullet_y=$(( entry_y + entry_h/2 - 4 )) + + bullet_args=() + for i in 0 1 2 3; do + bx=$(( entry_x + 20 + i * 12 )) + bullet_args+=( '(' "$staging_dir/bullet.png" -resize 7x7 ')' -geometry +${bx}+${bullet_y} -composite ) + done + + magick -size ${canvas_w}x${canvas_h} "xc:#$bg_hex" \ + "$staging_dir/logo.png" -geometry +${logo_x}+${logo_y} -composite \ + "$staging_dir/entry.png" -geometry +${entry_x}+${entry_y} -composite \ + \( "$staging_dir/lock.png" -resize ${lock_w}x${lock_h} \) -geometry +${lock_x}+${lock_y} -composite \ + "${bullet_args[@]}" \ + "$preview_png" + + imv -f "$preview_png" +fi + +if gum confirm "Apply changes?"; then + sudo cp -a "$staging_dir/." "$theme_dir/" + sudo plymouth-set-default-theme omarchy + + if omarchy-cmd-present limine-mkinitcpio; then + sudo limine-mkinitcpio + else + sudo mkinitcpio -P + fi +fi From 5f184e5099370616935b1678523a60f2744e9fd1 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 26 Apr 2026 08:45:52 +0200 Subject: [PATCH 10/18] Make it clearer --- bin/omarchy-theme-set-plymouth | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/omarchy-theme-set-plymouth b/bin/omarchy-theme-set-plymouth index abfca567..11f4a446 100755 --- a/bin/omarchy-theme-set-plymouth +++ b/bin/omarchy-theme-set-plymouth @@ -49,7 +49,7 @@ for asset in bullet.png entry.png lock.png progress_bar.png; do magick "$staging_dir/$asset" -channel RGB +level-colors "#$accent_hex","#$accent_hex" "$staging_dir/$asset" done -if gum confirm "Preview changes?"; then +if gum confirm "Preview new login screen?"; then canvas_w=1920 canvas_h=1080 @@ -84,7 +84,7 @@ if gum confirm "Preview changes?"; then imv -f "$preview_png" fi -if gum confirm "Apply changes?"; then +if gum confirm "Apply new login screen?"; then sudo cp -a "$staging_dir/." "$theme_dir/" sudo plymouth-set-default-theme omarchy From b164549b51d790d42a725baa21fc86a34111b00f Mon Sep 17 00:00:00 2001 From: Mikko Nyman Date: Sun, 26 Apr 2026 19:31:43 +0300 Subject: [PATCH 11/18] Add ASUS ExpertBook B9406 display and touchpad fixes for Panther Lake (#5435) * Add ASUS ExpertBook B9406 display and touchpad fixes for Panther Lake * Drop B9406 migration Per DHH's review: the migration's audience is essentially nobody. Anyone running Omarchy on B9406 today is doing so via nomodeset manually at every boot, not via a working unmodified install. Fresh installs after this PR ships will pick up the fixes through the hardware-match install hook; no migration needed. Co-Authored-By: Claude Opus 4.7 (1M context) --------- Co-authored-by: Claude Opus 4.7 (1M context) --- bin/omarchy-hw-asus-expertbook-b9406 | 5 ++++ install/config/all.sh | 2 ++ .../asus/fix-asus-ptl-b9406-display.sh | 21 +++++++++++++++++ .../asus/fix-asus-ptl-b9406-touchpad.sh | 23 +++++++++++++++++++ 4 files changed, 51 insertions(+) create mode 100755 bin/omarchy-hw-asus-expertbook-b9406 create mode 100644 install/config/hardware/asus/fix-asus-ptl-b9406-display.sh create mode 100644 install/config/hardware/asus/fix-asus-ptl-b9406-touchpad.sh diff --git a/bin/omarchy-hw-asus-expertbook-b9406 b/bin/omarchy-hw-asus-expertbook-b9406 new file mode 100755 index 00000000..fa936a70 --- /dev/null +++ b/bin/omarchy-hw-asus-expertbook-b9406 @@ -0,0 +1,5 @@ +#!/bin/bash + +# Detect ASUS ExpertBook B9406 series laptops on Intel Panther Lake. + +omarchy-hw-match "B9406" && omarchy-hw-intel-ptl diff --git a/install/config/all.sh b/install/config/all.sh index 69267195..526449fa 100644 --- a/install/config/all.sh +++ b/install/config/all.sh @@ -47,6 +47,8 @@ run_logged $OMARCHY_INSTALL/config/hardware/intel/fix-wifi7-eht.sh run_logged $OMARCHY_INSTALL/config/hardware/dell/fix-xps-haptic-touchpad.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 run_logged $OMARCHY_INSTALL/config/hardware/asus/fix-mic.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 new file mode 100644 index 00000000..de03d286 --- /dev/null +++ b/install/config/hardware/asus/fix-asus-ptl-b9406-display.sh @@ -0,0 +1,21 @@ +# Display fixes 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 +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-b9406-touchpad.sh b/install/config/hardware/asus/fix-asus-ptl-b9406-touchpad.sh new file mode 100644 index 00000000..d39da070 --- /dev/null +++ b/install/config/hardware/asus/fix-asus-ptl-b9406-touchpad.sh @@ -0,0 +1,23 @@ +# Touchpad quirks for ASUS ExpertBook B9406 (Pixart 093A:4F05 on i2c-hid). +# +# The kernel produces perfect Precision Touchpad reports but libinput's +# jump-detection heuristic discards every motion event as "kernel bug: +# Touch jump detected and discarded" because the pad reports pressure +# values of 0-1, confusing the contact stability check. Button events +# still pass, so clicks register but motion does not. +# +# Mask the pressure axes with a quirks override, same pattern as the +# Asus UX302LA entry in libinput's shipped 50-system-asus.quirks. + +if omarchy-hw-asus-expertbook-b9406; then + sudo mkdir -p /etc/libinput + sudo tee /etc/libinput/asus-expertbook-b9406.quirks >/dev/null < Date: Mon, 27 Apr 2026 08:38:54 +0200 Subject: [PATCH 12/18] Configure user directories with just modern relevancy --- install/config/all.sh | 1 + install/config/user-dirs.sh | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 install/config/user-dirs.sh diff --git a/install/config/all.sh b/install/config/all.sh index 526449fa..1c2a5139 100644 --- a/install/config/all.sh +++ b/install/config/all.sh @@ -14,6 +14,7 @@ run_logged $OMARCHY_INSTALL/config/mise-work.sh run_logged $OMARCHY_INSTALL/config/fix-powerprofilesctl-shebang.sh run_logged $OMARCHY_INSTALL/config/docker.sh run_logged $OMARCHY_INSTALL/config/mimetypes.sh +run_logged $OMARCHY_INSTALL/config/user-dirs.sh run_logged $OMARCHY_INSTALL/config/nautilus-python.sh run_logged $OMARCHY_INSTALL/config/localdb.sh run_logged $OMARCHY_INSTALL/config/walker-elephant.sh diff --git a/install/config/user-dirs.sh b/install/config/user-dirs.sh new file mode 100644 index 00000000..331d5dfc --- /dev/null +++ b/install/config/user-dirs.sh @@ -0,0 +1,12 @@ +mkdir -p ~/Downloads ~/Pictures ~/Videos ~/.config/gtk-3.0 + +xdg-user-dirs-update --set TEMPLATES "$HOME" +xdg-user-dirs-update --set PUBLICSHARE "$HOME" +xdg-user-dirs-update --set DESKTOP "$HOME" + +rmdir ~/Templates ~/Public ~/Desktop 2>/dev/null || true + +touch ~/.config/gtk-3.0/bookmarks +for dir in Downloads Pictures Videos; do + printf 'file://%s/%s %s\n' "$HOME" "$dir" "$dir" >>~/.config/gtk-3.0/bookmarks +done From 44d8d9b00f1d711efd0ca3211d55862b10902e60 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Mon, 27 Apr 2026 08:42:44 +0200 Subject: [PATCH 13/18] Use helper for this test --- bin/omarchy-menu | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/omarchy-menu b/bin/omarchy-menu index b9595f84..e600644e 100755 --- a/bin/omarchy-menu +++ b/bin/omarchy-menu @@ -363,8 +363,8 @@ show_install_terminal_menu() { show_install_ai_menu() { ollama_pkg=$( - (command -v nvidia-smi &>/dev/null && echo ollama-cuda) || - (command -v rocminfo &>/dev/null && echo ollama-rocm) || + (omarchy-cmd-present nvidia-smi && echo ollama-cuda) || + (omarchy-cmd-present rocminfo && echo ollama-rocm) || echo ollama ) From 88da163768294107e2752c5dbadecf2adf08fa73 Mon Sep 17 00:00:00 2001 From: Mathias Eek <51080320+Cliffback@users.noreply.github.com> Date: Mon, 27 Apr 2026 08:49:48 +0200 Subject: [PATCH 14/18] Fix jumping cursor / disable-while-typing on ASUS ROG Flow Z13 detachable keyboard (#5452) * Fix disable-while-typing on ASUS ROG Flow Z13 detachable keyboard * Replace lsusb with DMI detection for Z13 keyboard * Use omarchy-hw-match instead of custom z13_present function --- install/config/all.sh | 1 + .../config/hardware/asus/fix-z13-touchpad.sh | 18 ++++++++++++++++++ migrations/1777072987.sh | 7 +++++++ 3 files changed, 26 insertions(+) create mode 100644 install/config/hardware/asus/fix-z13-touchpad.sh create mode 100644 migrations/1777072987.sh diff --git a/install/config/all.sh b/install/config/all.sh index 1c2a5139..78f249ec 100644 --- a/install/config/all.sh +++ b/install/config/all.sh @@ -52,6 +52,7 @@ 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 run_logged $OMARCHY_INSTALL/config/hardware/asus/fix-mic.sh +run_logged $OMARCHY_INSTALL/config/hardware/asus/fix-z13-touchpad.sh run_logged $OMARCHY_INSTALL/config/hardware/framework/fix-f13-amd-audio-input.sh run_logged $OMARCHY_INSTALL/config/hardware/framework/qmk-hid.sh diff --git a/install/config/hardware/asus/fix-z13-touchpad.sh b/install/config/hardware/asus/fix-z13-touchpad.sh new file mode 100644 index 00000000..0df729ff --- /dev/null +++ b/install/config/hardware/asus/fix-z13-touchpad.sh @@ -0,0 +1,18 @@ +# Fix disable-while-typing on ASUS ROG Flow Z13 detachable keyboard. +# +# The Z13's detachable keyboard touchpad is detected as external by udev, +# which prevents libinput's disable-while-typing (dwt) from pairing it +# with the keyboard. This causes ghost touchpad taps from keyboard +# flex/vibration while typing quickly, jumping the cursor to random positions. +# +# Upstream libinput (50-system-asus.quirks) marks the keyboard as internal +# (AttrKeyboardIntegration=internal), but touchpad integration is controlled +# via udev, not libinput quirks. This udev rule marks the touchpad as internal +# so dwt can properly pair it with the keyboard. + +if omarchy-hw-asus-rog && omarchy-hw-match "GZ302"; then + sudo tee /etc/udev/rules.d/99-omarchy-asus-z13-touchpad.rules > /dev/null <<'EOF' +ACTION=="add|change", KERNEL=="event*", ATTRS{idVendor}=="0b05", ATTRS{idProduct}=="1a30", ENV{ID_INPUT_TOUCHPAD}=="1", ENV{ID_INPUT_TOUCHPAD_INTEGRATION}="internal" +EOF + sudo udevadm control --reload-rules +fi diff --git a/migrations/1777072987.sh b/migrations/1777072987.sh new file mode 100644 index 00000000..e2d6080c --- /dev/null +++ b/migrations/1777072987.sh @@ -0,0 +1,7 @@ +echo "Fix disable-while-typing on ASUS ROG Flow Z13 detachable keyboard" + +source $OMARCHY_PATH/install/config/hardware/asus/fix-z13-touchpad.sh + +if [[ -f /etc/udev/rules.d/99-omarchy-asus-z13-touchpad.rules ]]; then + omarchy-state set reboot-required +fi From 09411c4581602911df5aedadc000404f6f44b27d Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Mon, 27 Apr 2026 11:00:06 +0200 Subject: [PATCH 15/18] Make the "your kernel has been updated" check more resilient --- bin/omarchy-update-restart | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/bin/omarchy-update-restart b/bin/omarchy-update-restart index 3a1bc4e2..e4d835b8 100755 --- a/bin/omarchy-update-restart +++ b/bin/omarchy-update-restart @@ -2,7 +2,21 @@ echo -if find /usr/lib/modules -maxdepth 2 -name vmlinuz -newermt "$(uptime -s)" 2>/dev/null | grep -q .; then +running_kernel=$(uname -r) +kernel_updated=false + +for kernel in /usr/lib/modules/*/vmlinuz; do + if [[ -f $kernel ]] && pacman -Qo "$kernel" &>/dev/null; then + installed_kernel=$(basename "$(dirname "$kernel")") + + if [[ $installed_kernel != $running_kernel ]]; then + kernel_updated=true + break + fi + fi +done + +if [[ $kernel_updated == "true" ]]; then gum confirm "Linux kernel has been updated. Reboot?" && omarchy-system-reboot elif [[ -f $HOME/.local/state/omarchy/reboot-required ]]; then gum confirm "Updates require reboot. Ready?" && omarchy-system-reboot From 542ae346a0bf14c42fabc8ddb7643e48f1e0c0ca Mon Sep 17 00:00:00 2001 From: Mikko Nyman Date: Mon, 27 Apr 2026 12:39:31 +0300 Subject: [PATCH 16/18] Add ASUS ExpertBook B9406 fingerprint reader (FocalTech FT9349) support (#5454) The B9406CAA ships with a Focal Tech FT9349 ESS sensor on USB 2808:a97a. Mainline libfprint at 1.94.x lacks the open-source focaltech_moc driver entirely; the driver is in libfprint master under LGPL but no upstream release has shipped with PID 0xa97a in id_table[]. OPR carries libfprint-git with both the driver and the PID patch. Inline detection in omarchy-setup-fingerprint via /sys/bus/usb so we don't introduce a one-off hardware-match script just for this case. The check is cheap and runs only when the user opts into fingerprint setup (lazy install pattern). Once upstream libfprint catches up, the extra branch becomes harmless because libfprint-git provides=libfprint. Tested end-to-end on B9406CAA: fprintd-enroll completes, fprintd-verify matches enrolled fingers and rejects others, survives suspend/resume. Co-authored-by: Claude Opus 4.7 (1M context) --- bin/omarchy-setup-fingerprint | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/bin/omarchy-setup-fingerprint b/bin/omarchy-setup-fingerprint index 42149651..12f6ee1a 100755 --- a/bin/omarchy-setup-fingerprint +++ b/bin/omarchy-setup-fingerprint @@ -100,6 +100,21 @@ else # Install required packages print_info "Installing required packages..." + + # ASUS ExpertBook B9406CAA ships a FocalTech FT9349 ESS reader (USB + # 2808:a97a). Mainline libfprint at 1.94.x lacks the focaltech_moc + # driver (and its 0xa97a id_table entry); OPR ships libfprint-git + # which carries both. Once upstream catches up, this branch is a + # no-op and `libfprint-git` provides=libfprint anyway. Detect via + # /sys to avoid depending on usbutils being installed first. + for v in /sys/bus/usb/devices/*/idVendor; do + [[ "$(cat "$v" 2>/dev/null)" == "2808" ]] || continue + [[ "$(cat "${v%idVendor}idProduct" 2>/dev/null)" == "a97a" ]] || continue + print_info "FocalTech FT9349 detected (B9406CAA) — using libfprint-git from OPR..." + omarchy-pkg-add libfprint-git + break + done + omarchy-pkg-add fprintd usbutils if ! check_fingerprint_hardware; then From a6bb239919f879e0c0f038b11cee7e72df398e2f Mon Sep 17 00:00:00 2001 From: Mikko Nyman Date: Mon, 27 Apr 2026 15:58:27 +0300 Subject: [PATCH 17/18] omarchy-setup-fingerprint: pre-remove libfprint to avoid noninteractive abort (#5463) libfprint-git provides+conflicts libfprint, so pacman -S --noconfirm defaults the conflict prompt to N and the install aborts. Pre-remove libfprint with -Rdd; libfprint-git's provides=libfprint re-satisfies fprintd's dep immediately after install. replaces=(libfprint) on the OPR PKGBUILD was considered and rejected: it does not affect direct -S installs (only -Syu repo scans), and on a published package it would silently swap libfprint for libfprint-git on every -Syu including machines with no FocalTech sensor. Verified on B9406CAA non-interactively; fprintd-list and fprintd-verify continue to work against existing enrollments. Follow-up to #5454. Co-authored-by: Claude Opus 4.7 (1M context) --- bin/omarchy-setup-fingerprint | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/bin/omarchy-setup-fingerprint b/bin/omarchy-setup-fingerprint index 12f6ee1a..1579b586 100755 --- a/bin/omarchy-setup-fingerprint +++ b/bin/omarchy-setup-fingerprint @@ -111,6 +111,14 @@ else [[ "$(cat "$v" 2>/dev/null)" == "2808" ]] || continue [[ "$(cat "${v%idVendor}idProduct" 2>/dev/null)" == "a97a" ]] || continue print_info "FocalTech FT9349 detected (B9406CAA) — using libfprint-git from OPR..." + # libfprint-git provides+conflicts libfprint; pacman -S --noconfirm + # defaults the conflict prompt to N and aborts. Pre-remove libfprint + # with -Rdd so the install goes silent. -Rdd (not omarchy-pkg-drop's + # -Rns) is required because fprintd requires libfprint; the dep is + # re-satisfied immediately by libfprint-git's provides=libfprint. + if omarchy-pkg-present libfprint; then + sudo pacman -Rdd --noconfirm libfprint + fi omarchy-pkg-add libfprint-git break done From 985a8010e60d834de78783ec50ed733c7fcb732d Mon Sep 17 00:00:00 2001 From: Justin Biard Date: Mon, 27 Apr 2026 07:59:16 -0500 Subject: [PATCH 18/18] chore: update hyprland wiki links (#5466) --- config/hypr/hyprland.conf | 2 +- config/hypr/input.conf | 4 ++-- config/hypr/looknfeel.conf | 8 ++++---- config/hypr/monitors.conf | 2 +- default/hypr/input.conf | 2 +- default/hypr/looknfeel.conf | 26 +++++++++++++------------- default/hypr/windows.conf | 2 +- 7 files changed, 23 insertions(+), 23 deletions(-) diff --git a/config/hypr/hyprland.conf b/config/hypr/hyprland.conf index ff272f9a..cf4f9ad0 100644 --- a/config/hypr/hyprland.conf +++ b/config/hypr/hyprland.conf @@ -1,4 +1,4 @@ -# Learn how to configure Hyprland: https://wiki.hyprland.org/Configuring/ +# Learn how to configure Hyprland: https://wiki.hypr.land/Configuring/ # Use defaults Omarchy defaults (but don't edit these directly!) source = ~/.local/share/omarchy/default/hypr/autostart.conf diff --git a/config/hypr/input.conf b/config/hypr/input.conf index 1dd2e075..c8b0a19c 100644 --- a/config/hypr/input.conf +++ b/config/hypr/input.conf @@ -1,5 +1,5 @@ # Control your input devices -# See https://wiki.hypr.land/Configuring/Variables/#input +# See https://wiki.hypr.land/Configuring/Basics/Variables/#input input { # Use multiple keyboard layouts and switch between them with Left Alt + Right Alt # kb_layout = us,dk,eu @@ -45,7 +45,7 @@ windowrule = match:class (Alacritty|kitty), scroll_touchpad 1.5 windowrule = match:class com.mitchellh.ghostty, scroll_touchpad 0.2 # Enable touchpad gestures for changing workspaces -# See https://wiki.hyprland.org/Configuring/Gestures/ +# See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Gestures/ # gesture = 3, horizontal, workspace # Enable touchpad gestures for moving focus (helpful on scrolling layout) diff --git a/config/hypr/looknfeel.conf b/config/hypr/looknfeel.conf index 2d2b7000..f4a2c00c 100644 --- a/config/hypr/looknfeel.conf +++ b/config/hypr/looknfeel.conf @@ -1,6 +1,6 @@ # Change the default Omarchy look'n'feel -# https://wiki.hyprland.org/Configuring/Variables/#general +# https://wiki.hypr.land/Configuring/Basics/Variables/#general general { # No gaps between windows or borders # gaps_in = 0 @@ -11,7 +11,7 @@ general { # layout = scrolling } -# https://wiki.hyprland.org/Configuring/Variables/#decoration +# https://wiki.hypr.land/Configuring/Basics/Variables/#decoration decoration { # Use round window corners # rounding = 8 @@ -21,13 +21,13 @@ decoration { # dim_strength = 0.15 } -# https://wiki.hyprland.org/Configuring/Variables/#animations +# https://wiki.hypr.land/Configuring/Basics/Variables/#animations animations { # Disable all animations # enabled = no } -# https://wiki.hypr.land/Configuring/Variables/#layout +# https://wiki.hypr.land/Configuring/Basics/Variables/#layout layout { # Avoid overly wide single-window layouts on wide screens # single_window_aspect_ratio = 1 1 diff --git a/config/hypr/monitors.conf b/config/hypr/monitors.conf index 01c9cde1..455c80fe 100644 --- a/config/hypr/monitors.conf +++ b/config/hypr/monitors.conf @@ -1,4 +1,4 @@ -# See https://wiki.hyprland.org/Configuring/Monitors/ +# See https://wiki.hypr.land/Configuring/Basics/Monitors/ # List current monitors and resolutions possible: hyprctl monitors # Format: monitor = [port], resolution, position, scale diff --git a/default/hypr/input.conf b/default/hypr/input.conf index 74b2acab..14e9ccb6 100644 --- a/default/hypr/input.conf +++ b/default/hypr/input.conf @@ -1,4 +1,4 @@ -# https://wiki.hyprland.org/Configuring/Variables/#input +# https://wiki.hypr.land/Configuring/Basics/Variables/#input input { kb_layout = us kb_variant = diff --git a/default/hypr/looknfeel.conf b/default/hypr/looknfeel.conf index f735abda..0bdd6dee 100644 --- a/default/hypr/looknfeel.conf +++ b/default/hypr/looknfeel.conf @@ -1,30 +1,30 @@ -# Refer to https://wiki.hyprland.org/Configuring/Variables/ +# Refer to https://wiki.hypr.land/Configuring/Basics/Variables/ # Variables $activeBorderColor = rgba(33ccffee) rgba(00ff99ee) 45deg $inactiveBorderColor = rgba(595959aa) -# https://wiki.hyprland.org/Configuring/Variables/#general +# https://wiki.hypr.land/Configuring/Basics/Variables/#general general { gaps_in = 5 gaps_out = 10 border_size = 2 - # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors + # https://wiki.hypr.land/Configuring/Basics/Variables/#variable-types for info about colors col.active_border = $activeBorderColor col.inactive_border = $inactiveBorderColor # Set to true enable resizing windows by clicking and dragging on borders and gaps resize_on_border = false - # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on + # Please see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Tearing/ before you turn this on allow_tearing = false layout = dwindle } -# https://wiki.hyprland.org/Configuring/Variables/#decoration +# https://wiki.hypr.land/Configuring/Basics/Variables/#decoration decoration { rounding = 0 @@ -35,7 +35,7 @@ decoration { color = rgba(1a1a1aee) } - # https://wiki.hyprland.org/Configuring/Variables/#blur + # https://wiki.hypr.land/Configuring/Basics/Variables/#blur blur { enabled = true size = 2 @@ -46,7 +46,7 @@ decoration { } } -# https://wiki.hypr.land/Configuring/Variables/#group +# https://wiki.hypr.land/Configuring/Basics/Variables/#group group { col.border_active = $activeBorderColor col.border_inactive = $inactiveBorderColor @@ -77,11 +77,11 @@ group { } -# https://wiki.hyprland.org/Configuring/Variables/#animations +# https://wiki.hypr.land/Configuring/Basics/Variables/#animations animations { enabled = yes, please :) - # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more + # Default animations, see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/ for more bezier = easeOutQuint,0.23,1,0.32,1 bezier = easeInOutCubic,0.65,0.05,0.36,1 @@ -106,19 +106,19 @@ animations { animation = specialWorkspace, 1, 3, easeOutQuint, slidevert } -# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more +# See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ for more dwindle { pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below preserve_split = true # You probably want this force_split = 2 # Always split on the right } -# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more +# See https://wiki.hypr.land/Configuring/Layouts/Master-Layout/ for more master { new_status = master } -# https://wiki.hyprland.org/Configuring/Variables/#misc +# https://wiki.hypr.land/Configuring/Basics/Variables/#misc misc { disable_hyprland_logo = true disable_splash_rendering = true @@ -128,7 +128,7 @@ misc { on_focus_under_fullscreen = 1 } -# https://wiki.hypr.land/Configuring/Variables/#cursor +# https://wiki.hypr.land/Configuring/Basics/Variables/#cursor cursor { hide_on_key_press = true warp_on_change_workspace = 1 diff --git a/default/hypr/windows.conf b/default/hypr/windows.conf index 67a9a6a9..3ceca48f 100644 --- a/default/hypr/windows.conf +++ b/default/hypr/windows.conf @@ -1,4 +1,4 @@ -# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more +# See https://wiki.hypr.land/Configuring/Basics/Window-Rules/ for more # Hyprland 0.53+ syntax windowrule = suppress_event maximize, match:class .*