diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000..625c576e
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,9 @@
+root = true
+
+[*]
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
+end_of_line = lf
+charset = utf-8
diff --git a/applications/hidden/electron36.desktop b/applications/hidden/electron36.desktop
new file mode 100644
index 00000000..e1e3e173
--- /dev/null
+++ b/applications/hidden/electron36.desktop
@@ -0,0 +1,2 @@
+[Desktop Entry]
+Hidden=true
diff --git a/applications/hidden/electron37.desktop b/applications/hidden/electron37.desktop
new file mode 100644
index 00000000..e1e3e173
--- /dev/null
+++ b/applications/hidden/electron37.desktop
@@ -0,0 +1,2 @@
+[Desktop Entry]
+Hidden=true
diff --git a/applications/hidden/fcitx5-wayland-launcher.desktop b/applications/hidden/fcitx5-wayland-launcher.desktop
new file mode 100644
index 00000000..e1e3e173
--- /dev/null
+++ b/applications/hidden/fcitx5-wayland-launcher.desktop
@@ -0,0 +1,2 @@
+[Desktop Entry]
+Hidden=true
diff --git a/applications/hidden/java-java-openjdk.desktop b/applications/hidden/java-java-openjdk.desktop
new file mode 100644
index 00000000..e1e3e173
--- /dev/null
+++ b/applications/hidden/java-java-openjdk.desktop
@@ -0,0 +1,2 @@
+[Desktop Entry]
+Hidden=true
diff --git a/applications/hidden/jconsole-java-openjdk.desktop b/applications/hidden/jconsole-java-openjdk.desktop
new file mode 100644
index 00000000..e1e3e173
--- /dev/null
+++ b/applications/hidden/jconsole-java-openjdk.desktop
@@ -0,0 +1,2 @@
+[Desktop Entry]
+Hidden=true
diff --git a/applications/hidden/jshell-java-openjdk.desktop b/applications/hidden/jshell-java-openjdk.desktop
new file mode 100644
index 00000000..e1e3e173
--- /dev/null
+++ b/applications/hidden/jshell-java-openjdk.desktop
@@ -0,0 +1,2 @@
+[Desktop Entry]
+Hidden=true
diff --git a/applications/icons/ChatGPT.png b/applications/icons/ChatGPT.png
index cc68d786..9907eaf8 100644
Binary files a/applications/icons/ChatGPT.png and b/applications/icons/ChatGPT.png differ
diff --git a/applications/icons/GitHub.png b/applications/icons/GitHub.png
index f3248e4f..5a4295c2 100644
Binary files a/applications/icons/GitHub.png and b/applications/icons/GitHub.png differ
diff --git a/applications/icons/X.png b/applications/icons/X.png
index 99131def..22fe6987 100644
Binary files a/applications/icons/X.png and b/applications/icons/X.png differ
diff --git a/applications/icons/windows.png b/applications/icons/windows.png
new file mode 100644
index 00000000..ce7b366d
Binary files /dev/null and b/applications/icons/windows.png differ
diff --git a/applications/nvim.desktop b/applications/nvim.desktop
index ed118590..23fab41f 100644
--- a/applications/nvim.desktop
+++ b/applications/nvim.desktop
@@ -2,7 +2,7 @@
Name=Neovim
GenericName=Text Editor
Comment=Edit text files
-Exec=$TERMINAL --class=nvim --title=nvim -e nvim -- %F
+Exec=omarchy-launch-editor %F
Terminal=false
Type=Application
Keywords=Text;editor;
diff --git a/bin/omarchy-cmd-apple-display-brightness b/bin/omarchy-cmd-apple-display-brightness
index e611e8b7..7ba3d20a 100755
--- a/bin/omarchy-cmd-apple-display-brightness
+++ b/bin/omarchy-cmd-apple-display-brightness
@@ -3,5 +3,12 @@
if [[ $# -eq 0 ]]; then
echo "Adjust Apple Display Brightness by passing +5000 or -5000 (or any range from 0-60000)"
else
- sudo asdcontrol $(sudo asdcontrol --detect /dev/usb/hiddev* | grep ^/dev/usb/hiddev | cut -d: -f1) -- "$1"
+ DEVICE="$(sudo asdcontrol --detect /dev/usb/hiddev* | grep ^/dev/usb/hiddev | cut -d: -f1)"
+ sudo asdcontrol "$DEVICE" -- "$1" >/dev/null
+ VALUE="$(sudo asdcontrol "$DEVICE" | awk -F= '/BRIGHTNESS=/{print $2+0}')"
+ swayosd-client \
+ --monitor "$(hyprctl monitors -j | jq -r '.[]|select(.focused==true).name')" \
+ --custom-icon display-brightness \
+ --custom-progress "$(awk -v v="$VALUE" 'BEGIN{printf "%.2f", v/60000}')" \
+ --custom-progress-text "$(( VALUE * 100 / 60000 ))%"
fi
diff --git a/bin/omarchy-cmd-audio-switch b/bin/omarchy-cmd-audio-switch
index 63ce7a1e..d73205c3 100755
--- a/bin/omarchy-cmd-audio-switch
+++ b/bin/omarchy-cmd-audio-switch
@@ -23,7 +23,13 @@ fi
next_sink=$(echo "$sinks" | jq -r ".[$next_sink_index]")
next_sink_name=$(echo "$next_sink" | jq -r '.name')
+
next_sink_description=$(echo "$next_sink" | jq -r '.description')
+if [ "$next_sink_description" = "(null)" ] || [ "$next_sink_description" = "null" ] || [ -z "$next_sink_description" ]; then
+ sink_id=$(echo "$next_sink" | jq -r '.properties."object.id"')
+ next_sink_description=$(wpctl status | grep -E "\s+\*?\s+${sink_id}\." | sed -E 's/^.*[0-9]+\.\s+//' | sed -E 's/\s+\[.*$//')
+fi
+
next_sink_volume=$(echo "$next_sink" | jq -r \
'.volume | to_entries[0].value.value_percent | sub("%"; "")')
next_sink_is_muted=$(echo "$next_sink" | jq -r '.mute')
diff --git a/bin/omarchy-cmd-first-run b/bin/omarchy-cmd-first-run
index f9b9d578..1031185f 100755
--- a/bin/omarchy-cmd-first-run
+++ b/bin/omarchy-cmd-first-run
@@ -8,7 +8,9 @@ if [[ -f "$FIRST_RUN_MODE" ]]; then
rm -f "$FIRST_RUN_MODE"
bash "$OMARCHY_PATH/install/first-run/battery-monitor.sh"
+ bash "$OMARCHY_PATH/install/first-run/cleanup-reboot-sudoers.sh"
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"
sudo rm -f /etc/sudoers.d/first-run
diff --git a/bin/omarchy-cmd-screenrecord b/bin/omarchy-cmd-screenrecord
index ee4622f2..0ea1e513 100755
--- a/bin/omarchy-cmd-screenrecord
+++ b/bin/omarchy-cmd-screenrecord
@@ -8,31 +8,82 @@ if [[ ! -d "$OUTPUT_DIR" ]]; then
exit 1
fi
-# Selects region or output
-SCOPE="$1"
+SCOPE=""
+AUDIO="false"
+WEBCAM="false"
-# Selects audio inclusion or not
-AUDIO=$([[ $2 == "audio" ]] && echo "--audio")
+for arg in "$@"; do
+ case "$arg" in
+ --with-audio) AUDIO="true" ;;
+ --with-webcam) WEBCAM="true" ;;
+ output|region) SCOPE="$arg" ;;
+ esac
+done
+
+cleanup_webcam() {
+ pkill -f "WebcamOverlay" 2>/dev/null
+}
+
+start_webcam_overlay() {
+ cleanup_webcam
+
+ # Get monitor scale
+ local scale=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .scale')
+
+ # Target width (base 360px, scaled to monitor)
+ local target_width=$(awk "BEGIN {printf \"%.0f\", 360 * $scale}")
+
+ # Try preferred 16:9 resolutions in order, use first available
+ local preferred_resolutions=("640x360" "1280x720" "1920x1080")
+ local video_size_arg=""
+ local available_formats=$(v4l2-ctl --list-formats-ext -d /dev/video0 2>/dev/null)
+
+ for resolution in "${preferred_resolutions[@]}"; do
+ if echo "$available_formats" | grep -q "$resolution"; then
+ video_size_arg="-video_size $resolution"
+ break
+ fi
+ done
+
+ ffplay -f v4l2 $video_size_arg -framerate 30 /dev/video0 \
+ -vf "scale=${target_width}:-1" \
+ -window_title "WebcamOverlay" \
+ -noborder \
+ -fflags nobuffer -flags low_delay \
+ -probesize 32 -analyzeduration 0 \
+ -loglevel quiet &
+ sleep 1
+}
start_screenrecording() {
local filename="$OUTPUT_DIR/screenrecording-$(date +'%Y-%m-%d_%H-%M-%S').mp4"
+ local audio_args=""
- if lspci | grep -qi 'nvidia'; then
- wf-recorder $AUDIO -f "$filename" -c libx264 -p crf=23 -p preset=medium -p movflags=+faststart "$@" &
- else
- wl-screenrec $AUDIO -f "$filename" --ffmpeg-encoder-options="-c:v libx264 -crf 23 -preset medium -movflags +faststart" "$@" &
- fi
+ # Merge audio tracks into one - separate tracks only play one at a time in most players
+ [[ "$AUDIO" == "true" ]] && audio_args="-a default_output|default_input"
+ gpu-screen-recorder -w "$@" -f 60 -c mp4 -o "$filename" $audio_args &
toggle_screenrecording_indicator
}
stop_screenrecording() {
- pkill -x wl-screenrec
- pkill -x wf-recorder
+ pkill -SIGINT -f "gpu-screen-recorder" # SIGINT required to save video properly
- notify-send "Screen recording saved to $OUTPUT_DIR" -t 2000
+ # Wait a maximum of 5 seconds to finish before hard killing
+ local count=0
+ while pgrep -f "gpu-screen-recorder" >/dev/null && [ $count -lt 50 ]; do
+ sleep 0.1
+ count=$((count + 1))
+ done
- sleep 0.2 # ensures the process is actually dead before we check
+ if pgrep -f "gpu-screen-recorder" >/dev/null; then
+ pkill -9 -f "gpu-screen-recorder"
+ cleanup_webcam
+ notify-send "Screen recording error" "Recording process had to be force-killed. Video may be corrupted." -u critical -t 5000
+ else
+ cleanup_webcam
+ notify-send "Screen recording saved to $OUTPUT_DIR" -t 2000
+ fi
toggle_screenrecording_indicator
}
@@ -41,15 +92,51 @@ toggle_screenrecording_indicator() {
}
screenrecording_active() {
- pgrep -x wl-screenrec >/dev/null || pgrep -x wf-recorder >/dev/null
+ pgrep -f "gpu-screen-recorder" >/dev/null || pgrep -x slurp >/dev/null || pgrep -f "WebcamOverlay" >/dev/null
}
if screenrecording_active; then
- stop_screenrecording
+ if pgrep -x slurp >/dev/null; then
+ pkill -x slurp 2>/dev/null
+ elif pgrep -f "WebcamOverlay" >/dev/null && ! pgrep -f "gpu-screen-recorder" >/dev/null; then
+ cleanup_webcam
+ else
+ stop_screenrecording
+ fi
elif [[ "$SCOPE" == "output" ]]; then
- output=$(slurp -o) || exit 1
- start_screenrecording -g "$output"
+ [[ "$WEBCAM" == "true" ]] && start_webcam_overlay
+
+ if ! output=$(slurp -o -f "%o"); then
+ [[ "$WEBCAM" == "true" ]] && cleanup_webcam
+ exit 1
+ fi
+
+ if [[ -z "$output" ]]; then
+ notify-send "Error" "Could not detect monitor" -u critical
+ [[ "$WEBCAM" == "true" ]] && cleanup_webcam
+ exit 1
+ fi
+
+ start_screenrecording "$output"
else
- region=$(slurp) || exit 1
- start_screenrecording -g "$region"
+ [[ "$WEBCAM" == "true" ]] && start_webcam_overlay
+
+ scale=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .scale')
+
+ if ! region=$(slurp -f "%wx%h+%x+%y"); then
+ [[ "$WEBCAM" == "true" ]] && cleanup_webcam
+ exit 1
+ fi
+
+ if [[ "$region" =~ ^([0-9]+)x([0-9]+)\+([0-9]+)\+([0-9]+)$ ]]; then
+ w=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[1]} * $scale}")
+ h=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[2]} * $scale}")
+ x=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[3]} * $scale}")
+ y=$(awk "BEGIN {printf \"%.0f\", ${BASH_REMATCH[4]} * $scale}")
+ scaled_region="${w}x${h}+${x}+${y}"
+ else
+ scaled_region="$region"
+ fi
+
+ start_screenrecording region -region "$scaled_region"
fi
diff --git a/bin/omarchy-cmd-screensaver b/bin/omarchy-cmd-screensaver
index e336c8b0..a53a27ff 100755
--- a/bin/omarchy-cmd-screensaver
+++ b/bin/omarchy-cmd-screensaver
@@ -13,7 +13,7 @@ exit_screensaver() {
trap exit_screensaver SIGINT SIGTERM SIGHUP SIGQUIT
-hyprctl keyword cursor:invisible true
+hyprctl keyword cursor:invisible true &>/dev/null
while true; do
effect=$(tte 2>&1 | grep -oP '{\K[^}]+' | tr ',' ' ' | tr ' ' '\n' | sed -n '/^beams$/,$p' | sort -u | shuf -n1)
diff --git a/bin/omarchy-cmd-screenshot b/bin/omarchy-cmd-screenshot
index 330dde3b..f4450f89 100755
--- a/bin/omarchy-cmd-screenshot
+++ b/bin/omarchy-cmd-screenshot
@@ -8,10 +8,76 @@ if [[ ! -d "$OUTPUT_DIR" ]]; then
exit 1
fi
-pkill slurp || hyprshot -m ${1:-region} --raw |
+pkill slurp && exit 0
+
+MODE="${1:-smart}"
+PROCESSING="${2:-slurp}"
+
+get_rectangles() {
+ local active_workspace=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .activeWorkspace.id')
+ hyprctl monitors -j | jq -r --arg ws "$active_workspace" '.[] | select(.activeWorkspace.id == ($ws | tonumber)) | "\(.x),\(.y) \((.width / .scale) | floor)x\((.height / .scale) | floor)"'
+ hyprctl clients -j | jq -r --arg ws "$active_workspace" '.[] | select(.workspace.id == ($ws | tonumber)) | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"'
+}
+
+# Select based on mode
+case "$MODE" in
+ region)
+ wayfreeze & PID=$!
+ sleep .1
+ SELECTION=$(slurp 2>/dev/null)
+ kill $PID 2>/dev/null
+ ;;
+ windows)
+ wayfreeze & PID=$!
+ sleep .1
+ SELECTION=$(get_rectangles | slurp -r 2>/dev/null)
+ kill $PID 2>/dev/null
+ ;;
+ fullscreen)
+ SELECTION=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | "\(.x),\(.y) \((.width / .scale) | floor)x\((.height / .scale) | floor)"')
+ ;;
+ smart|*)
+ RECTS=$(get_rectangles)
+ wayfreeze & PID=$!
+ sleep .1
+ SELECTION=$(echo "$RECTS" | slurp 2>/dev/null)
+ kill $PID 2>/dev/null
+
+ # If the selction 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
+ if [[ "$SELECTION" =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+)$ ]]; then
+ if (( ${BASH_REMATCH[3]} * ${BASH_REMATCH[4]} < 20 )); then
+ click_x="${BASH_REMATCH[1]}"
+ click_y="${BASH_REMATCH[2]}"
+
+ while IFS= read -r rect; do
+ if [[ "$rect" =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+) ]]; then
+ rect_x="${BASH_REMATCH[1]}"
+ rect_y="${BASH_REMATCH[2]}"
+ rect_width="${BASH_REMATCH[3]}"
+ rect_height="${BASH_REMATCH[4]}"
+
+ if (( click_x >= rect_x && click_x < rect_x+rect_width && click_y >= rect_y && click_y < rect_y+rect_height )); then
+ SELECTION="${rect_x},${rect_y} ${rect_width}x${rect_height}"
+ break
+ fi
+ fi
+ done <<< "$RECTS"
+ fi
+ fi
+ ;;
+esac
+
+[ -z "$SELECTION" ] && exit 0
+
+if [[ $PROCESSING == "slurp" ]]; then
+grim -g "$SELECTION" - |
satty --filename - \
--output-filename "$OUTPUT_DIR/screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png" \
--early-exit \
--actions-on-enter save-to-clipboard \
--save-after-copy \
--copy-command 'wl-copy'
+else
+ grim -g "$SELECTION" - | wl-copy
+fi
diff --git a/bin/omarchy-cmd-terminal-cwd b/bin/omarchy-cmd-terminal-cwd
index 2d3cd0ce..062c35fa 100755
--- a/bin/omarchy-cmd-terminal-cwd
+++ b/bin/omarchy-cmd-terminal-cwd
@@ -2,10 +2,16 @@
# Go from current active terminal to its child shell process and run cwd there
terminal_pid=$(hyprctl activewindow | awk '/pid:/ {print $2}')
-shell_pid=$(pgrep -P "$terminal_pid" | head -n1)
+shell_pid=$(pgrep -P "$terminal_pid" | tail -n1)
if [[ -n $shell_pid ]]; then
- readlink -f "/proc/$shell_pid/cwd" 2>/dev/null || echo "$HOME"
+ cwd=$(readlink -f "/proc/$shell_pid/cwd" 2>/dev/null)
+
+ if [[ -d $cwd ]]; then
+ echo "$cwd"
+ else
+ echo "$HOME"
+ fi
else
echo "$HOME"
fi
diff --git a/bin/omarchy-cmd-tzupdate b/bin/omarchy-cmd-tzupdate
deleted file mode 100755
index eb39bf0a..00000000
--- a/bin/omarchy-cmd-tzupdate
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-
-notify-send " Updating time and timezone..."
-sudo systemctl restart systemd-timesyncd
-sudo tzupdate
-new_timezone=$(timedatectl show -p Timezone --value)
-omarchy-restart-waybar
-notify-send " Time updated and timezone set to $new_timezone"
diff --git a/bin/omarchy-font-set b/bin/omarchy-font-set
index 5ac0ef4b..6cc312d0 100755
--- a/bin/omarchy-font-set
+++ b/bin/omarchy-font-set
@@ -28,6 +28,8 @@ if [[ -n "$font_name" && "$font_name" != "CNCLD" ]]; then
omarchy-restart-waybar
omarchy-restart-swayosd
omarchy-restart-walker
+
+ omarchy-hook font-set "$font_name"
else
echo "Font '$font_name' not found."
exit 1
diff --git a/bin/omarchy-hook b/bin/omarchy-hook
new file mode 100755
index 00000000..caa83988
--- /dev/null
+++ b/bin/omarchy-hook
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+if [[ $# -lt 1 ]]; then
+ echo "Usage: omarchy-hook [name] [args...]"
+ exit 1
+fi
+
+HOOK=$1
+HOOK_PATH="$HOME/.config/omarchy/hooks/$1"
+shift
+
+if [[ -f $HOOK_PATH ]]; then
+ bash "$HOOK_PATH" "$@"
+fi
diff --git a/bin/omarchy-install-docker-dbs b/bin/omarchy-install-docker-dbs
index f7b624ad..658a2b08 100755
--- a/bin/omarchy-install-docker-dbs
+++ b/bin/omarchy-install-docker-dbs
@@ -1,9 +1,9 @@
#!/bin/bash
-options=("MySQL" "PostgreSQL" "Redis" "MongoDB" "MariaDB")
+options=("MySQL" "PostgreSQL" "Redis" "MongoDB" "MariaDB" "MSSQL")
if [[ "$#" -eq 0 ]]; then
- choices=$(printf "%s\n" "${options[@]}" | gum choose --header "Select databases (space to select, return to install, esc to cancel)") || main_menu
+ choices=$(printf "%s\n" "${options[@]}" | gum choose --header "Select database (return to install, esc to cancel)") || main_menu
else
choices="$@"
fi
@@ -16,6 +16,7 @@ if [[ -n "$choices" ]]; then
MariaDB) sudo docker run -d --restart unless-stopped -p "127.0.0.1:3306:3306" --name=mariadb11 -e MARIADB_ROOT_PASSWORD= -e MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=true mariadb:11.8 ;;
Redis) sudo docker run -d --restart unless-stopped -p "127.0.0.1:6379:6379" --name=redis redis:7 ;;
MongoDB) sudo docker run -d --restart unless-stopped -p "127.0.0.1:27017:27017" --name mongodb -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=admin123 mongo:noble ;;
+ MSSQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:1433:1433" --name mssql -e MSSQL_PID=Developer -e ACCEPT_EULA=Y -e "MSSQL_SA_PASSWORD=@dmin123" mcr.microsoft.com/mssql/server:2022-CU12-ubuntu-22.04 ;;
esac
done
else
diff --git a/bin/omarchy-install-dropbox b/bin/omarchy-install-dropbox
index ac5710c8..b4c59298 100755
--- a/bin/omarchy-install-dropbox
+++ b/bin/omarchy-install-dropbox
@@ -4,5 +4,5 @@ echo "Installing all dependencies..."
omarchy-pkg-add dropbox dropbox-cli libappindicator-gtk3 python-gpgme nautilus-dropbox
echo "Starting Dropbox..."
-uwsm app -- dropbox-cli start &>/dev/null &
+uwsm-app -- dropbox-cli start &>/dev/null &
echo "See Dropbox icon behind hover tray in top right and right-click for setup."
diff --git a/bin/omarchy-install-terminal b/bin/omarchy-install-terminal
index 68285068..fbb0c0b3 100755
--- a/bin/omarchy-install-terminal
+++ b/bin/omarchy-install-terminal
@@ -14,6 +14,6 @@ omarchy-pkg-add $package
echo "Setting $package as new default terminal..."
sed -i "/export TERMINAL=/ c\export TERMINAL=$package" ~/.config/uwsm/default
-# Relaunch is needed for new default to take effect
+# Restart is needed for new default to take effect
echo
-gum confirm "Relaunch Hyprland to use new terminal?" && uwsm stop
+gum confirm "Restart to use new terminal?" && systemctl reboot --no-wall
diff --git a/bin/omarchy-install-vscode b/bin/omarchy-install-vscode
new file mode 100755
index 00000000..644a8eb7
--- /dev/null
+++ b/bin/omarchy-install-vscode
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+echo "Installing VSCode..."
+omarchy-pkg-add visual-studio-code-bin
+
+mkdir -p ~/.vscode
+
+cat > ~/.vscode/argv.json << 'EOF'
+// This configuration file allows you to pass permanent command line arguments to VS Code.
+// Only a subset of arguments is currently supported to reduce the likelihood of breaking
+// the installation.
+//
+// PLEASE DO NOT CHANGE WITHOUT UNDERSTANDING THE IMPACT
+//
+// NOTE: Changing this file requires a restart of VS Code.
+{
+ "password-store":"gnome-libsecret"
+}
+EOF
+
+# Ensure VSC's own auto-update feature is turned off
+printf '{\n "update.mode": "none"\n}\n' > ~/.config/Code/User/settings.json
+
+setsid gtk-launch code
diff --git a/bin/omarchy-launch-about b/bin/omarchy-launch-about
index 00722221..797e340f 100755
--- a/bin/omarchy-launch-about
+++ b/bin/omarchy-launch-about
@@ -1,3 +1,3 @@
#!/bin/bash
-exec setsid uwsm app -- alacritty --class=Omarchy -o font.size=9 -e bash -c 'fastfetch; read -n 1 -s'
+exec setsid uwsm-app -- alacritty --class=Omarchy -o font.size=9 -e bash -c 'fastfetch; read -n 1 -s'
diff --git a/bin/omarchy-launch-browser b/bin/omarchy-launch-browser
index 536e212c..d6ae00cb 100755
--- a/bin/omarchy-launch-browser
+++ b/bin/omarchy-launch-browser
@@ -9,4 +9,4 @@ else
private_flag="--incognito"
fi
-exec setsid uwsm app -- "$browser_exec" "${@/--private/$private_flag}"
+exec setsid uwsm-app -- "$browser_exec" "${@/--private/$private_flag}"
diff --git a/bin/omarchy-launch-editor b/bin/omarchy-launch-editor
index 157168a8..dbe84cfd 100755
--- a/bin/omarchy-launch-editor
+++ b/bin/omarchy-launch-editor
@@ -1,10 +1,10 @@
#!/bin/bash
case "${EDITOR:-nvim}" in
-nvim | vim | nano | micro | hx)
- exec setsid uwsm app -- "$TERMINAL" -e "$EDITOR" "$@"
+nvim | vim | nano | micro | hx | helix)
+ exec setsid uwsm-app -- "$TERMINAL" -e "$EDITOR" "$@"
;;
*)
- exec setsid uwsm app -- "$EDITOR" "$@"
+ exec setsid uwsm-app -- "$EDITOR" "$@"
;;
esac
diff --git a/bin/omarchy-launch-floating-terminal-with-presentation b/bin/omarchy-launch-floating-terminal-with-presentation
index 0529f2ae..b6121705 100755
--- a/bin/omarchy-launch-floating-terminal-with-presentation
+++ b/bin/omarchy-launch-floating-terminal-with-presentation
@@ -1,4 +1,4 @@
#!/bin/bash
cmd="$*"
-exec setsid uwsm app -- alacritty --class=Omarchy --title=Omarchy -e bash -c "omarchy-show-logo; $cmd; omarchy-show-done"
+exec setsid uwsm-app -- alacritty -o font.size=9 --class=Omarchy --title=Omarchy -e bash -c "omarchy-show-logo; $cmd; omarchy-show-done"
\ No newline at end of file
diff --git a/bin/omarchy-launch-or-focus b/bin/omarchy-launch-or-focus
index a0075632..270b0251 100755
--- a/bin/omarchy-launch-or-focus
+++ b/bin/omarchy-launch-or-focus
@@ -6,7 +6,7 @@ if (($# == 0)); then
fi
WINDOW_PATTERN="$1"
-LAUNCH_COMMAND="${2:-"uwsm app -- $WINDOW_PATTERN"}"
+LAUNCH_COMMAND="${2:-"uwsm-app -- $WINDOW_PATTERN"}"
WINDOW_ADDRESS=$(hyprctl clients -j | jq -r --arg p "$WINDOW_PATTERN" '.[]|select((.class|test("\\b" + $p + "\\b";"i")) or (.title|test("\\b" + $p + "\\b";"i")))|.address' | head -n1)
if [[ -n $WINDOW_ADDRESS ]]; then
diff --git a/bin/omarchy-launch-or-focus-webapp b/bin/omarchy-launch-or-focus-webapp
index c54159f5..aa56db73 100755
--- a/bin/omarchy-launch-or-focus-webapp
+++ b/bin/omarchy-launch-or-focus-webapp
@@ -1,8 +1,12 @@
#!/bin/bash
if (($# == 0)); then
- echo "Usage: omarchy-launch-or-focus-webapp [window-pattern] [url]"
+ echo "Usage: omarchy-launch-or-focus-webapp [window-pattern] [url-and-flags...]"
exit 1
fi
-exec omarchy-launch-or-focus "$1" "omarchy-launch-webapp '$2'"
+WINDOW_PATTERN="$1"
+shift
+LAUNCH_COMMAND="omarchy-launch-webapp $@"
+
+exec omarchy-launch-or-focus "$WINDOW_PATTERN" "$LAUNCH_COMMAND"
\ No newline at end of file
diff --git a/bin/omarchy-launch-walker b/bin/omarchy-launch-walker
new file mode 100755
index 00000000..805da5c1
--- /dev/null
+++ b/bin/omarchy-launch-walker
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+# Ensure elephant is running before launching walker
+if ! pgrep -x elephant > /dev/null; then
+ setsid uwsm-app -- elephant &
+fi
+
+# Ensure walker service is running
+if ! pgrep -f "walker --gapplication-service" > /dev/null; then
+ setsid uwsm-app -- walker --gapplication-service &
+fi
+
+exec walker --width 644 --maxheight 300 --minheight 300 "$@"
diff --git a/bin/omarchy-launch-webapp b/bin/omarchy-launch-webapp
index 441748ea..1de31278 100755
--- a/bin/omarchy-launch-webapp
+++ b/bin/omarchy-launch-webapp
@@ -7,4 +7,4 @@ google-chrome* | brave-browser* | microsoft-edge* | opera* | vivaldi* | helium-b
*) browser="chromium.desktop" ;;
esac
-exec setsid uwsm app -- $(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,~/.nix-profile,/usr}/share/applications/$browser 2>/dev/null | head -1) --app="$1" "${@:2}"
+exec setsid uwsm-app -- $(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,~/.nix-profile,/usr}/share/applications/$browser 2>/dev/null | head -1) --app="$1" "${@:2}"
diff --git a/bin/omarchy-launch-wifi b/bin/omarchy-launch-wifi
index fe04f846..c9a9b18b 100755
--- a/bin/omarchy-launch-wifi
+++ b/bin/omarchy-launch-wifi
@@ -1,3 +1,3 @@
#!/bin/bash
-exec setsid uwsm app -- "$TERMINAL" --class=Impala -e impala "$@"
+exec setsid uwsm-app -- "$TERMINAL" --class=Impala -e impala "$@"
diff --git a/bin/omarchy-lock-screen b/bin/omarchy-lock-screen
index cad6f814..d3f6276d 100755
--- a/bin/omarchy-lock-screen
+++ b/bin/omarchy-lock-screen
@@ -9,4 +9,4 @@ if pgrep -x "1password" >/dev/null; then
fi
# Avoid running screensaver when locked
-pkill -f "$TERMINAL --class Screensaver"
+pkill -f "alacritty --class Screensaver"
diff --git a/bin/omarchy-menu b/bin/omarchy-menu
index 0dd68ec1..e9c4a692 100755
--- a/bin/omarchy-menu
+++ b/bin/omarchy-menu
@@ -29,11 +29,11 @@ menu() {
local index
index=$(echo -e "$options" | grep -nxF "$preselect" | cut -d: -f1)
if [[ -n "$index" ]]; then
- args+=("-a" "$index")
+ args+=("-c" "$index")
fi
fi
- echo -e "$options" | walker --dmenu --theme dmenu_250 -p "$prompt…" "${args[@]}"
+ echo -e "$options" | omarchy-launch-walker --dmenu --width 295 --minheight 1 --maxheight 600 -p "$prompt…" "${args[@]}" 2>/dev/null
}
terminal() {
@@ -104,21 +104,21 @@ show_capture_menu() {
}
show_screenshot_menu() {
- case $(menu "Screenshot" " Region\n Window\n Display") in
- *Region*) omarchy-cmd-screenshot ;;
- *Window*) omarchy-cmd-screenshot window ;;
- *Display*) omarchy-cmd-screenshot output ;;
+ case $(menu "Screenshot" " Snap with Editing\n Straight to Clipboard") in
+ *Editing*) omarchy-cmd-screenshot smart ;;
+ *Clipboard*) omarchy-cmd-screenshot smart clipboard ;;
*) show_capture_menu ;;
esac
}
show_screenrecord_menu() {
- case $(menu "Screenrecord" " Region\n Region + Audio\n Display\n Display + Audio") in
- *"Region + Audio"*) omarchy-cmd-screenrecord region audio ;;
+ case $(menu "Screenrecord" " Region\n Region + Audio\n Display\n Display + Audio\n Display + Webcam") in
+ *"Region + Audio"*) omarchy-cmd-screenrecord region --with-audio ;;
*Region*) omarchy-cmd-screenrecord ;;
- *"Display + Audio"*) omarchy-cmd-screenrecord output audio ;;
+ *"Display + Audio"*) omarchy-cmd-screenrecord output --with-audio ;;
+ *"Display + Webcam"*) omarchy-cmd-screenrecord output --with-audio --with-webcam ;;
*Display*) omarchy-cmd-screenrecord output ;;
- *) show_capture_menu ;;
+ *) back_to show_capture_menu ;;
esac
}
@@ -163,7 +163,7 @@ show_theme_menu() {
}
show_font_menu() {
- theme=$(menu "Font" "$(omarchy-font-list)" "-w 350" "$(omarchy-font-current)")
+ theme=$(menu "Font" "$(omarchy-font-list)" "--width 350" "$(omarchy-font-current)")
if [[ "$theme" == "CNCLD" || -z "$theme" ]]; then
back_to show_style_menu
else
@@ -232,7 +232,7 @@ show_setup_security_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 Gaming") in
+ 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
*Package*) terminal omarchy-pkg-install ;;
*AUR*) terminal omarchy-pkg-aur-install ;;
*Web*) present_terminal omarchy-webapp-install ;;
@@ -243,6 +243,7 @@ show_install_menu() {
*Editor*) show_install_editor_menu ;;
*Terminal*) show_install_terminal_menu ;;
*AI*) show_install_ai_menu ;;
+ *Windows*) present_terminal "omarchy-windows-vm install" ;;
*Gaming*) show_install_gaming_menu ;;
*) show_main_menu ;;
esac
@@ -260,7 +261,7 @@ show_install_service_menu() {
show_install_editor_menu() {
case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Emacs") in
- *VSCode*) install_and_launch "VSCode" "visual-studio-code-bin" "code" ;;
+ *VSCode*) present_terminal omarchy-install-vscode ;;
*Cursor*) install_and_launch "Cursor" "cursor-bin" "cursor" ;;
*Zed*) install_and_launch "Zed" "zed" "dev.zed.Zed" ;;
*Sublime*) aur_install_and_launch "Sublime Text" "sublime-text-4" "sublime_text" ;;
@@ -286,8 +287,9 @@ show_install_ai_menu() {
echo ollama
)
- case $(menu "Install" " Claude Code\n Gemini [AUR]\n OpenAI Codex [AUR]\n LM Studio\n Ollama\n Crush\n opencode") in
+ case $(menu "Install" " Claude Code\n Cursor CLI [AUR]\n Gemini [AUR]\n OpenAI Codex [AUR]\n LM Studio\n Ollama\n Crush\n opencode") in
*Claude*) install "Claude Code" "claude-code" ;;
+ *Cursor*) aur_install "Cursor CLI" "cursor-cli" ;;
*OpenAI*) aur_install "OpenAI Codex" "openai-codex-bin" ;;
*Gemini*) aur_install "Gemini" "gemini-cli" ;;
*Studio*) install "LM Studio" "lmstudio" ;;
@@ -317,7 +319,7 @@ show_install_style_menu() {
}
show_install_font_menu() {
- case $(menu "Install" " Meslo LG Mono\n Fira Code\n Victor Code\n Bistream Vera Mono" "-w 350") in
+ case $(menu "Install" " Meslo LG Mono\n Fira Code\n Victor Code\n Bistream Vera Mono" "--width 350") in
*Meslo*) install_font "Meslo LG Mono" "ttf-meslo-nerd" "MesloLGL Nerd Font" ;;
*Fira*) install_font "Fira Code" "ttf-firacode-nerd" "FiraCode Nerd Font" ;;
*Victor*) install_font "Victor Code" "ttf-victor-mono-nerd" "VictorMono Nerd Font" ;;
@@ -372,11 +374,12 @@ show_install_elixir_menu() {
}
show_remove_menu() {
- case $(menu "Remove" " Package\n Web App\n TUI\n Theme\n Fingerprint\n Fido2") in
+ case $(menu "Remove" " Package\n Web App\n TUI\n Theme\n Windows\n Fingerprint\n Fido2") in
*Package*) terminal omarchy-pkg-remove ;;
*Web*) present_terminal omarchy-webapp-remove ;;
*TUI*) present_terminal omarchy-tui-remove ;;
*Theme*) present_terminal omarchy-theme-remove ;;
+ *Windows*) present_terminal "omarchy-windows-vm remove" ;;
*Fingerprint*) present_terminal "omarchy-setup-fingerprint --remove" ;;
*Fido2*) present_terminal "omarchy-setup-fido2 --remove" ;;
*) show_main_menu ;;
@@ -384,14 +387,15 @@ show_remove_menu() {
}
show_update_menu() {
- case $(menu "Update" " Omarchy\n Branch\n Config\n Extra Themes\n Process\n Hardware\n Password\n Timezone") in
+ case $(menu "Update" " Omarchy\n Branch\n Config\n Extra Themes\n Process\n Hardware\n Firmware\n Password\n Timezone") in
*Omarchy*) present_terminal omarchy-update ;;
*Branch*) show_update_branch_menu ;;
*Config*) show_update_config_menu ;;
*Themes*) present_terminal omarchy-theme-update ;;
*Process*) show_update_process_menu ;;
*Hardware*) show_update_hardware_menu ;;
- *Timezone*) omarchy-cmd-tzupdate ;;
+ *Firmware*) present_terminal omarchy-update-firmware ;;
+ *Timezone*) present_terminal omarchy-tz-select ;;
*Password*) show_update_password_menu ;;
*) show_main_menu ;;
esac
@@ -447,13 +451,12 @@ show_update_password_menu() {
}
show_system_menu() {
- case $(menu "System" " Lock\n Screensaver\n Suspend\n Relaunch\n Restart\n Shutdown") in
+ case $(menu "System" " Lock\n Screensaver\n Suspend\n Restart\n Shutdown") in
*Lock*) omarchy-lock-screen ;;
*Screensaver*) omarchy-launch-screensaver force ;;
*Suspend*) systemctl suspend ;;
- *Relaunch*) uwsm stop ;;
- *Restart*) systemctl reboot ;;
- *Shutdown*) systemctl poweroff ;;
+ *Restart*) omarchy-state clear re*-required && systemctl reboot --no-wall ;;
+ *Shutdown*) omarchy-state clear re*-required && systemctl poweroff --no-wall ;;
*) back_to show_main_menu ;;
esac
}
diff --git a/bin/omarchy-menu-keybindings b/bin/omarchy-menu-keybindings
index 1d1b40ac..4547a6dc 100755
--- a/bin/omarchy-menu-keybindings
+++ b/bin/omarchy-menu-keybindings
@@ -3,6 +3,69 @@
# A script to display Hyprland keybindings defined in your configuration
# using walker for an interactive search menu.
+declare -A KEYCODE_SYM_MAP
+
+build_keymap_cache() {
+ local keymap
+ keymap="$(xkbcli compile-keymap)" || {
+ echo "Failed to compile keymap" >&2
+ return 1
+ }
+
+ while IFS=, read -r code sym; do
+ [[ -z "$code" || -z "$sym" ]] && continue
+ KEYCODE_SYM_MAP["$code"]="$sym"
+ done < <(
+ awk '
+ BEGIN { sec = "" }
+ /xkb_keycodes/ { sec = "codes"; next }
+ /xkb_symbols/ { sec = "syms"; next }
+ sec == "codes" {
+ if (match($0, /<([A-Za-z0-9_]+)>\s*=\s*([0-9]+)\s*;/, m)) code_by_name[m[1]] = m[2]
+ }
+ sec == "syms" {
+ if (match($0, /key\s*<([A-Za-z0-9_]+)>\s*\{\s*\[\s*([^, \]]+)/, m)) sym_by_name[m[1]] = m[2]
+ }
+ END {
+ for (k in code_by_name) {
+ c = code_by_name[k]
+ s = sym_by_name[k]
+ if (c != "" && s != "" && s != "NoSymbol") print c "," s
+ }
+ }
+ ' <<<"$keymap"
+ )
+}
+
+lookup_keycode_cached() {
+ printf '%s\n' "${KEYCODE_SYM_MAP[$1]}"
+}
+
+parse_keycodes() {
+ local start end elapsed
+ [[ "${DEBUG:-0}" == "1" ]] && start=$(date +%s.%N)
+ while IFS= read -r line; do
+ if [[ "$line" =~ code:([0-9]+) ]]; then
+ code="${BASH_REMATCH[1]}"
+ symbol=$(lookup_keycode_cached "$code" "$XKB_KEYMAP_CACHE")
+ echo "${line/code:${code}/$symbol}"
+ else
+ echo "$line"
+ fi
+ done
+
+ if [[ "$DEBUG" == "1" ]]; then
+ end=$(date +%s.%N)
+ # fall back to awk if bc is missing
+ if command -v bc >/dev/null 2>&1; then
+ elapsed=$(echo "$end - $start" | bc)
+ else
+ elapsed=$(awk -v s="$start" -v e="$end" 'BEGIN{printf "%.6f", (e - s)}')
+ fi
+ echo "[DEBUG] parse_keycodes elapsed: ${elapsed}s" >&2
+ fi
+}
+
# Fetch dynamic keybindings from Hyprland
#
# Also do some pre-processing:
@@ -11,30 +74,31 @@
# - Map numeric modifier key mask to a textual rendition
# - Output comma-separated values that the parser can understand
dynamic_bindings() {
- hyprctl -j binds | \
- jq -r '.[] | {modmask, key, keycode, description, dispatcher, arg} | "\(.modmask),\(.key)@\(.keycode),\(.description),\(.dispatcher),\(.arg)"' | \
+ hyprctl -j binds |
+ jq -r '.[] | {modmask, key, keycode, description, dispatcher, arg} | "\(.modmask),\(.key)@\(.keycode),\(.description),\(.dispatcher),\(.arg)"' |
sed -r \
- -e 's/null//' \
- -e 's,~/.local/share/omarchy/bin/,,' \
- -e 's,uwsm app -- ,,' \
- -e 's/@0//' \
- -e 's/,@/,code:/' \
- -e 's/^0,/,/' \
- -e 's/^1,/SHIFT,/' \
- -e 's/^4,/CTRL,/' \
- -e 's/^5,/SHIFT CTRL,/' \
- -e 's/^8,/ALT,/' \
- -e 's/^9,/SHIFT ALT,/' \
- -e 's/^12,/CTRL ALT,/' \
- -e 's/^13,/SHIFT CTRL ALT,/' \
- -e 's/^64,/SUPER,/' \
- -e 's/^65,/SUPER SHIFT,/' \
- -e 's/^68,/SUPER CTRL,/' \
- -e 's/^69,/SUPER SHIFT CTRL,/' \
- -e 's/^72,/SUPER ALT,/' \
- -e 's/^73,/SUPER SHIFT ALT,/' \
- -e 's/^76,/SUPER CTRL ALT,/' \
- -e 's/^77,/SUPER SHIFT CTRL ALT,/'
+ -e 's/null//' \
+ -e 's,~/.local/share/omarchy/bin/,,' \
+ -e 's,uwsm app -- ,,' \
+ -e 's,uwsm-app -- ,,' \
+ -e 's/@0//' \
+ -e 's/,@/,code:/' \
+ -e 's/^0,/,/' \
+ -e 's/^1,/SHIFT,/' \
+ -e 's/^4,/CTRL,/' \
+ -e 's/^5,/SHIFT CTRL,/' \
+ -e 's/^8,/ALT,/' \
+ -e 's/^9,/SHIFT ALT,/' \
+ -e 's/^12,/CTRL ALT,/' \
+ -e 's/^13,/SHIFT CTRL ALT,/' \
+ -e 's/^64,/SUPER,/' \
+ -e 's/^65,/SUPER SHIFT,/' \
+ -e 's/^68,/SUPER CTRL,/' \
+ -e 's/^69,/SUPER SHIFT CTRL,/' \
+ -e 's/^72,/SUPER ALT,/' \
+ -e 's/^73,/SUPER SHIFT ALT,/' \
+ -e 's/^76,/SUPER CTRL ALT,/' \
+ -e 's/^77,/SUPER SHIFT CTRL ALT,/'
}
# Parse and format keybindings
@@ -86,8 +150,10 @@ parse_bindings() {
monitor_height=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .height')
menu_height=$((monitor_height * 40 / 100))
-dynamic_bindings | \
- sort -u | \
- parse_bindings | \
- walker --dmenu --theme keybindings -p 'Keybindings' -w 800 -h "$menu_height"
+build_keymap_cache
+dynamic_bindings |
+ sort -u |
+ parse_keycodes |
+ parse_bindings |
+ walker --dmenu -p 'Keybindings' --width 800 --height "$menu_height"
diff --git a/bin/omarchy-pkg-add b/bin/omarchy-pkg-add
index 116435be..486a2f45 100755
--- a/bin/omarchy-pkg-add
+++ b/bin/omarchy-pkg-add
@@ -1,8 +1,14 @@
#!/bin/bash
+if omarchy-pkg-missing "$@"; then
+ sudo pacman -S --noconfirm --needed "$@" || exit 1
+fi
+
for pkg in "$@"; do
+ # Secondary check to handle states where pacman doesn't actually register an error
if ! pacman -Q "$pkg" &>/dev/null; then
- sudo pacman -S --noconfirm "$pkg" || exit 1
+ echo -e "\033[31mError: Package '$pkg' did not install\033[0m" >&2
+ exit 1
fi
done
diff --git a/bin/omarchy-pkg-aur-install b/bin/omarchy-pkg-aur-install
index 41710e0e..da0d5884 100755
--- a/bin/omarchy-pkg-aur-install
+++ b/bin/omarchy-pkg-aur-install
@@ -3,7 +3,7 @@
fzf_args=(
--multi
--preview 'yay -Siia {1}'
- --preview-label='alt-p: toggle description, alt-b/B: toggle PKGBUILD, alt-j/k: scroll, tab: multi-select, F11: maximize'
+ --preview-label='alt-p: toggle description, alt-b/B: toggle PKGBUILD, alt-j/k: scroll, tab: multi-select'
--preview-label-pos='bottom'
--preview-window 'down:65%:wrap'
--bind 'alt-p:toggle-preview'
diff --git a/bin/omarchy-pkg-install b/bin/omarchy-pkg-install
index c654e17e..49f7b33b 100755
--- a/bin/omarchy-pkg-install
+++ b/bin/omarchy-pkg-install
@@ -3,7 +3,7 @@
fzf_args=(
--multi
--preview 'pacman -Sii {1}'
- --preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select, F11: maximize'
+ --preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select'
--preview-label-pos='bottom'
--preview-window 'down:65%:wrap'
--bind 'alt-p:toggle-preview'
diff --git a/bin/omarchy-pkg-remove b/bin/omarchy-pkg-remove
index 63c6147e..1da761f9 100755
--- a/bin/omarchy-pkg-remove
+++ b/bin/omarchy-pkg-remove
@@ -3,7 +3,7 @@
fzf_args=(
--multi
--preview 'yay -Qi {1}'
- --preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select, F11: maximize'
+ --preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select'
--preview-label-pos='bottom'
--preview-window 'down:65%:wrap'
--bind 'alt-p:toggle-preview'
diff --git a/bin/omarchy-refresh-walker b/bin/omarchy-refresh-walker
index aa7a0210..04112a4d 100755
--- a/bin/omarchy-refresh-walker
+++ b/bin/omarchy-refresh-walker
@@ -1,4 +1,6 @@
#!/bin/bash
omarchy-refresh-config walker/config.toml
+omarchy-refresh-config elephant/calc.toml
+omarchy-refresh-config elephant/desktopapplications.toml
omarchy-restart-walker
diff --git a/bin/omarchy-restart-app b/bin/omarchy-restart-app
index 8cf2a036..4cc474fa 100755
--- a/bin/omarchy-restart-app
+++ b/bin/omarchy-restart-app
@@ -1,4 +1,4 @@
#!/bin/bash
pkill -x $1
-setsid uwsm app -- $1 >/dev/null 2>&1 &
+setsid uwsm-app -- $1 >/dev/null 2>&1 &
diff --git a/bin/omarchy-restart-walker b/bin/omarchy-restart-walker
index b2dc9a45..4abcb88e 100755
--- a/bin/omarchy-restart-walker
+++ b/bin/omarchy-restart-walker
@@ -1,7 +1,21 @@
#!/bin/bash
+pkill elephant
pkill walker
-# FIXME: Just deal with the memory leak for now.
-# See https://github.com/basecamp/omarchy/issues/698
-setsid uwsm app -- walker --gapplication-service &
-echo # Always end in success so we don't terminate further running
+
+# Detect if we're running as root (from pacman hook)
+if [[ $EUID -eq 0 ]]; then
+ # Get the owner of this script to determine which user to run as
+ SCRIPT_OWNER=$(stat -c '%U' "$0")
+ USER_UID=$(id -u "$SCRIPT_OWNER")
+
+ # Restart services as the script owner
+ systemd-run --uid="$SCRIPT_OWNER" --setenv=XDG_RUNTIME_DIR="/run/user/$USER_UID" \
+ bash -c "
+ setsid uwsm-app -- elephant &
+ setsid uwsm-app -- walker --gapplication-service &
+ "
+else
+ setsid uwsm-app -- elephant &
+ setsid uwsm-app -- walker --gapplication-service &
+fi
diff --git a/bin/omarchy-setup-fingerprint b/bin/omarchy-setup-fingerprint
index 422fb1e4..93b70e6d 100755
--- a/bin/omarchy-setup-fingerprint
+++ b/bin/omarchy-setup-fingerprint
@@ -20,7 +20,7 @@ print_info() {
}
check_fingerprint_hardware() {
- if ! lsusb | grep -Eiq 'fingerprint|synaptics|goodix|elan|validity'; then
+ if ! lsusb | grep -Eiq 'fingerprint|synaptics|goodix|elan|validity|FPC'; then
print_error "\nNo fingerprint sensor detected."
return 1
fi
diff --git a/bin/omarchy-theme-bg-next b/bin/omarchy-theme-bg-next
index 21cddf98..52c1355e 100755
--- a/bin/omarchy-theme-bg-next
+++ b/bin/omarchy-theme-bg-next
@@ -5,13 +5,13 @@
BACKGROUNDS_DIR="$HOME/.config/omarchy/current/theme/backgrounds/"
CURRENT_BACKGROUND_LINK="$HOME/.config/omarchy/current/background"
-mapfile -d '' -t BACKGROUNDS < <(find "$BACKGROUNDS_DIR" -type f -print0 | sort -z)
+mapfile -d '' -t BACKGROUNDS < <(find -L "$BACKGROUNDS_DIR" -type f -print0 | sort -z)
TOTAL=${#BACKGROUNDS[@]}
if [[ $TOTAL -eq 0 ]]; then
notify-send "No background was found for theme" -t 2000
pkill -x swaybg
- setsid uwsm app -- swaybg --color '#000000' >/dev/null 2>&1 &
+ setsid uwsm-app -- swaybg --color '#000000' >/dev/null 2>&1 &
else
# Get current background from symlink
if [[ -L "$CURRENT_BACKGROUND_LINK" ]]; then
@@ -44,5 +44,5 @@ else
# Relaunch swaybg
pkill -x swaybg
- setsid uwsm app -- swaybg -i "$CURRENT_BACKGROUND_LINK" -m fill >/dev/null 2>&1 &
+ setsid uwsm-app -- swaybg -i "$CURRENT_BACKGROUND_LINK" -m fill >/dev/null 2>&1 &
fi
diff --git a/bin/omarchy-theme-set b/bin/omarchy-theme-set
index 73059712..c90d11eb 100755
--- a/bin/omarchy-theme-set
+++ b/bin/omarchy-theme-set
@@ -24,15 +24,21 @@ ln -nsf "$THEME_PATH" "$CURRENT_THEME_DIR"
omarchy-theme-bg-next
# Restart components to apply new theme
-omarchy-restart-waybar
+if pgrep -x waybar >/dev/null; then
+ omarchy-restart-waybar
+fi
omarchy-restart-swayosd
hyprctl reload
pkill -SIGUSR2 btop
makoctl reload
-# Change gnome, browser, vscode themes
+# Change gnome, browser, vscode, cursor themes
omarchy-theme-set-terminal
omarchy-theme-set-gnome
-omarchy-theme-set-eza
omarchy-theme-set-browser
omarchy-theme-set-vscode
+omarchy-theme-set-cursor
+omarchy-theme-set-obsidian
+
+# Call hook on theme set
+omarchy-hook theme-set "$THEME_NAME"
diff --git a/bin/omarchy-theme-set-browser b/bin/omarchy-theme-set-browser
index 759d2c4e..81443091 100755
--- a/bin/omarchy-theme-set-browser
+++ b/bin/omarchy-theme-set-browser
@@ -2,18 +2,30 @@
CHROMIUM_THEME=~/.config/omarchy/current/theme/chromium.theme
-if omarchy-cmd-present chromium || omarchy-cmd-present brave; then
+if omarchy-cmd-present chromium || omarchy-cmd-present helium-browser || omarchy-cmd-present brave; then
if [[ -f $CHROMIUM_THEME ]]; then
- rgb=$(<$CHROMIUM_THEME)
- THEME_HEX_COLOR=$(printf '#%02x%02x%02x' ${rgb//,/ })
+ 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
+ rm -f /etc/chromium/policies/managed/color.json
+ chromium --no-startup-window --set-theme-color="$THEME_RGB_COLOR"
+
+ if [[ -f ~/.config/omarchy/current/theme/light.mode ]]; then
+ chromium --no-startup-window --set-color-scheme="light"
+ else
+ chromium --no-startup-window --set-color-scheme="dark"
+ fi
+ fi
+
+ if omarchy-cmd-present helium-browser; then
echo "{\"BrowserThemeColor\": \"$THEME_HEX_COLOR\"}" | tee "/etc/chromium/policies/managed/color.json" >/dev/null
- chromium --refresh-platform-policy --no-startup-window
+ helium-browser --no-startup-window --refresh-platform-policy
fi
if omarchy-cmd-present brave; then
diff --git a/bin/omarchy-theme-set-cursor b/bin/omarchy-theme-set-cursor
new file mode 100755
index 00000000..2db672e1
--- /dev/null
+++ b/bin/omarchy-theme-set-cursor
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+# Call the VSCode theme setter with Cursor-specific parameters
+omarchy-theme-set-vscode cursor "$HOME/.config/Cursor/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-cursor-theme-changes" Cursor
diff --git a/bin/omarchy-theme-set-eza b/bin/omarchy-theme-set-eza
deleted file mode 100755
index cde362cc..00000000
--- a/bin/omarchy-theme-set-eza
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-
-if [ -f ~/.config/omarchy/current/theme/eza.yml ]; then
- ln -snf ~/.config/omarchy/current/theme/eza.yml ~/.config/eza/theme.yml
-else
- rm -f ~/.config/eza/theme.yml
-fi
diff --git a/bin/omarchy-theme-set-obsidian b/bin/omarchy-theme-set-obsidian
new file mode 100755
index 00000000..e67f0b62
--- /dev/null
+++ b/bin/omarchy-theme-set-obsidian
@@ -0,0 +1,659 @@
+#!/bin/bash
+
+# omarchy-theme-set-obsidian: Bootstrap and update Omarchy theme for Obsidian
+#
+# - Ensures registry at ~/.local/state/omarchy/obsidian-vaults
+# - If missing/empty, bootstraps by scanning ~/Documents/*/.obsidian and ~/Dropbox/*/.obsidian
+# - For each valid vault:
+# - Ensures .obsidian/themes/Omarchy/{manifest.json, theme.css}
+# - Updates theme.css (uses current theme’s obsidian.css if present; otherwise generates -- see below)
+
+# Theme automagic generation logic:
+#
+# - Background/foreground: read from ~/.config/omarchy/current/theme/alacritty.toml [colors.primary]
+# (background/foreground). Fallbacks: bg=#1a1b26, fg=#a9b1d6. Compute bg brightness for light/dark handling.
+# - Palette extraction: collect colors from Alacritty (primary/normal/bright/dim/selection), Waybar (@define-color),
+# and Hyprland (col.*_border; rgba->hex). Normalize, dedupe, and count frequencies.
+# - Slot ordering: remove bg/fg, sort remaining colors by frequency, then fill 13 slots by cycling. Map slots to:
+# h1–h6, links, inline code, marks, interactive accent, blockquote border; muted/faint use border color.
+# - Code colors: code background = closest color to bg (Euclidean RGB); if none, make a subtle bg variant (+/− RGB).
+# code foreground = closest color to fg; fallback #e0e0e0.
+# - Border color: from btop.theme theme[div_line]; else blended mix biased toward bg (≈ (bg+fg)/3).
+# - Selection: from Alacritty [colors.selection] (background/text), honoring CellForeground/Background.
+# If missing, background = 75% bg + 25% fg; text chosen for contrast vs selection background.
+# - Fonts: monospace from Alacritty [font] or fontconfig monospace; UI font from fontconfig sans-serif.
+
+VAULTS_FILE="$HOME/.local/state/omarchy/obsidian-vaults"
+CURRENT_THEME_DIR="$HOME/.config/omarchy/current/theme"
+
+# Ensure the vaults registry exists, or bootstrap from known locations
+ensure_vaults_file() {
+ mkdir -p "$(dirname "$VAULTS_FILE")"
+ # If file exists (even empty), do not scan; treat as authoritative
+ if [ -f "$VAULTS_FILE" ]; then
+ return
+ fi
+ local tmpfile
+ tmpfile="$(mktemp)"
+ # Scan a couple of common locations for //.obsidian
+ for base in "$HOME/Documents" "$HOME/Dropbox"; do
+ [ -d "$base" ] || continue
+ for d in "$base"/*/.obsidian; do
+ [ -d "$d" ] || continue
+ vault_dir="${d%/.obsidian}"
+ printf "%s\n" "$vault_dir" >>"$tmpfile"
+ done
+ done
+ if [ -s "$tmpfile" ]; then
+ sort -u "$tmpfile" >"$VAULTS_FILE"
+ else
+ : >"$VAULTS_FILE"
+ fi
+ rm -f "$tmpfile"
+}
+
+# Ensure theme directory and minimal manifest exist in a vault
+ensure_theme_scaffold() {
+ local vault_path="$1"
+ local theme_dir="$vault_path/.obsidian/themes/Omarchy"
+ mkdir -p "$theme_dir"
+ if [ ! -f "$theme_dir/manifest.json" ]; then
+ cat >"$theme_dir/manifest.json" <<'EOF'
+{
+ "name": "Omarchy",
+ "version": "1.0.0",
+ "minAppVersion": "0.16.0",
+ "description": "Automatically syncs with your current Omarchy system theme colors and fonts",
+ "author": "Omarchy",
+ "authorUrl": "https://omarchy.org"
+}
+EOF
+ fi
+ [ -f "$theme_dir/theme.css" ] || : >"$theme_dir/theme.css"
+}
+
+# Function to extract hex color from string
+extract_hex_color() {
+ echo "$1" | grep -oE '#[0-9a-fA-F]{6}' | head -1
+}
+
+# Function to convert RGB/RGBA to hex
+rgb_to_hex() {
+ local rgb_string="$1"
+ if [[ $rgb_string =~ rgba?\(([0-9]+),\s*([0-9]+),\s*([0-9]+) ]]; then
+ printf "#%02x%02x%02x\n" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
+ fi
+}
+
+# Convert hex to RGB components
+hex_to_rgb() {
+ local hex="${1#\#}"
+ printf "%d %d %d\n" "0x${hex:0:2}" "0x${hex:2:2}" "0x${hex:4:2}"
+}
+
+# Calculate perceived brightness (0-255)
+calculate_brightness() {
+ local hex="$1"
+ read -r r g b <<<"$(hex_to_rgb "$hex")"
+ # Use perceived brightness formula
+ echo $(((r * 299 + g * 587 + b * 114) / 1000))
+}
+
+# Calculate color distance (euclidean in RGB space)
+color_distance() {
+ local hex1="$1"
+ local hex2="$2"
+ read -r r1 g1 b1 <<<"$(hex_to_rgb "$hex1")"
+ read -r r2 g2 b2 <<<"$(hex_to_rgb "$hex2")"
+ echo $(((r1 - r2) * (r1 - r2) + (g1 - g2) * (g1 - g2) + (b1 - b2) * (b1 - b2)))
+}
+
+# Extract all colors with frequency count
+extract_all_colors_with_count() {
+ local -A color_counts
+ local color
+
+ # Extract from Alacritty config
+ if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then
+ # Primary colors
+ while IFS= read -r color; do
+ color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
+ [ -n "$color" ] && ((color_counts["$color"]++))
+ done < <(grep -E "(background|foreground|cursor|text)" "$CURRENT_THEME_DIR/alacritty.toml" | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | grep "^#")
+
+ # Normal colors
+ while IFS= read -r color; do
+ color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
+ [ -n "$color" ] && ((color_counts["$color"]++))
+ done < <(grep -A 20 "\[colors.normal\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep -E "(black|red|green|yellow|blue|magenta|cyan|white)" | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | grep "^#")
+
+ # Bright colors
+ while IFS= read -r color; do
+ # Add # if missing
+ [[ "$color" =~ ^[0-9a-fA-F]{6}$ ]] && color="#$color"
+ color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
+ [[ "$color" =~ ^#[0-9a-f]{6}$ ]] && ((color_counts["$color"]++))
+ done < <(grep -A 20 "\[colors.bright\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep -E "(black|red|green|yellow|blue|magenta|cyan|white)" | sed "s/.*[\"']//;s/[\"'].*//")
+
+ # Dim colors if present
+ while IFS= read -r color; do
+ # Add # if missing
+ [[ "$color" =~ ^[0-9a-fA-F]{6}$ ]] && color="#$color"
+ color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
+ [[ "$color" =~ ^#[0-9a-f]{6}$ ]] && ((color_counts["$color"]++))
+ done < <(grep -A 20 "\[colors.dim\]" "$CURRENT_THEME_DIR/alacritty.toml" 2>/dev/null | grep -E "(black|red|green|yellow|blue|magenta|cyan|white)" | sed "s/.*[\"']//;s/[\"'].*//")
+
+ # Selection colors
+ while IFS= read -r color; do
+ color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
+ [ -n "$color" ] && ((color_counts["$color"]++))
+ done < <(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" 2>/dev/null | grep -E "(background|text)" | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | grep "^#")
+ fi
+
+ # Extract from Waybar CSS
+ if [ -f "$CURRENT_THEME_DIR/waybar.css" ]; then
+ while IFS= read -r color; do
+ color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
+ [ -n "$color" ] && ((color_counts["$color"]++))
+ done < <(grep -oE '@define-color [a-z_-]+ #[0-9a-fA-F]{6}' "$CURRENT_THEME_DIR/waybar.css" | grep -oE '#[0-9a-fA-F]{6}')
+ fi
+
+ # Extract from Hyprland config
+ if [ -f "$CURRENT_THEME_DIR/hyprland.conf" ]; then
+ while IFS= read -r color; do
+ if [[ $color == rgba* ]] || [[ $color == rgb* ]]; then
+ color=$(rgb_to_hex "$color")
+ fi
+ color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
+ [ -n "$color" ] && ((color_counts["$color"]++))
+ done < <(grep -E "col\.(active|inactive)_border" "$CURRENT_THEME_DIR/hyprland.conf" | grep -oE 'rgba?\([^)]+\)|#[0-9a-fA-F]{6,8}' | sed 's/ff$//')
+ fi
+
+ # Output colors with their counts
+ for color in "${!color_counts[@]}"; do
+ echo "${color_counts[$color]} $color"
+ done
+}
+
+# Sort colors by frequency
+sort_colors_by_frequency() {
+ # Input is already "count color" format
+ sort -rn | cut -d' ' -f2
+}
+
+# Fill color slots with cycling if needed
+fill_color_slots() {
+ local -a colors=("$@")
+ local -a slots
+ local num_colors=${#colors[@]}
+
+ # Need 13 slots total (code colors are handled separately)
+ local slots_needed=13
+
+ if [ $num_colors -eq 0 ]; then
+ # No colors available, use defaults
+ colors=("#3d3d3d" "#5d5d5d" "#7d7d7d" "#9d9d9d" "#bd93f9" "#50fa7b")
+ num_colors=6
+ fi
+
+ # Fill slots, cycling if necessary
+ for ((i = 0; i < slots_needed; i++)); do
+ slots[$i]="${colors[$((i % num_colors))]}"
+ done
+
+ echo "${slots[@]}"
+}
+
+# Main color extraction and theme generation
+extract_theme_data() {
+ # Get primary colors from Alacritty
+ local bg_color="#1a1b26"
+ local fg_color="#a9b1d6"
+
+ if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then
+ local extracted_bg=$(grep -A 5 "\[colors.primary\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^background = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]')
+ local extracted_fg=$(grep -A 5 "\[colors.primary\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^foreground = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]')
+ [ -n "$extracted_bg" ] && bg_color="$extracted_bg"
+ [ -n "$extracted_fg" ] && fg_color="$extracted_fg"
+ fi
+
+ # Determine if light or dark theme
+ local bg_brightness=$(calculate_brightness "$bg_color")
+ local is_light_theme=false
+ [ $bg_brightness -gt 127 ] && is_light_theme=true
+
+ # Extract all colors with counts
+ local color_data=$(extract_all_colors_with_count)
+
+ # Filter out background and foreground colors for the main array
+ local filtered_data=$(echo "$color_data" | grep -v "$bg_color" | grep -v "$fg_color")
+
+ # Get all unique colors (including bg/fg) for distance calculations
+ local -a all_unique_colors
+ readarray -t all_unique_colors < <(echo "$color_data" | cut -d' ' -f2 | sort -u)
+
+ # Find the 3 closest colors to background for background variations
+ local -a bg_distances
+ for color in "${all_unique_colors[@]}"; do
+ if [ "$color" != "$bg_color" ]; then
+ distance=$(color_distance "$color" "$bg_color")
+ bg_distances+=("$distance:$color")
+ fi
+ done
+
+ # Sort by distance and get the closest color for code background
+ local -a closest_to_bg
+ readarray -t closest_to_bg < <(printf '%s\n' "${bg_distances[@]}" | sort -n | head -1 | cut -d: -f2)
+
+ # All background variations use the same as primary background
+ local bg_primary_alt="$bg_color"
+ local bg_secondary="$bg_color"
+ local bg_secondary_alt="$bg_color"
+
+ # Code block background uses the closest different color
+ local code_bg="${closest_to_bg[0]}"
+
+ # If no different color available, create a subtle variant for code blocks
+ if [ -z "$code_bg" ]; then
+ read -r r g b <<<"$(hex_to_rgb "$bg_color")"
+ if [ $bg_brightness -gt 127 ]; then
+ r=$((r - 10))
+ g=$((g - 10))
+ b=$((b - 10))
+ else
+ r=$((r + 15))
+ g=$((g + 15))
+ b=$((b + 15))
+ fi
+ [ $r -lt 0 ] && r=0
+ [ $r -gt 255 ] && r=255
+ [ $g -lt 0 ] && g=0
+ [ $g -gt 255 ] && g=255
+ [ $b -lt 0 ] && b=0
+ [ $b -gt 255 ] && b=255
+ code_bg=$(printf "#%02x%02x%02x" "$r" "$g" "$b")
+ fi
+
+ # Find closest color to foreground for code block text
+ local code_fg=""
+ min_distance=999999999
+ for color in "${all_unique_colors[@]}"; do
+ if [ "$color" != "$fg_color" ]; then
+ distance=$(color_distance "$color" "$fg_color")
+ if [ $distance -lt $min_distance ]; then
+ min_distance=$distance
+ code_fg="$color"
+ fi
+ fi
+ done
+ [ -z "$code_fg" ] && code_fg="#e0e0e0" # Fallback
+
+ # Extract text selection colors from Alacritty
+ local selection_bg=""
+ local selection_fg=""
+ if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then
+ selection_bg=$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^background = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]')
+ local selection_text=$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^text = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]')
+
+ # If text is set to CellForeground/CellBackground, use the appropriate color
+ if [ -z "$selection_text" ] || [[ "$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^text = ")" == *"CellForeground"* ]]; then
+ selection_fg="$fg_color"
+ elif [[ "$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^text = ")" == *"CellBackground"* ]]; then
+ selection_fg="$bg_color"
+ else
+ selection_fg="$selection_text"
+ fi
+ fi
+
+ # Fallback if no selection colors found
+ if [ -z "$selection_bg" ]; then
+ read -r r1 g1 b1 <<<"$(hex_to_rgb "$bg_color")"
+ read -r r2 g2 b2 <<<"$(hex_to_rgb "$fg_color")"
+ local r=$(((r1 * 3 + r2) / 4)) # 75% background, 25% foreground
+ local g=$(((g1 * 3 + g2) / 4))
+ local b=$(((b1 * 3 + b2) / 4))
+ selection_bg=$(printf "#%02x%02x%02x" "$r" "$g" "$b")
+ fi
+
+ # Use contrasting color for selection text if not defined
+ if [ -z "$selection_fg" ]; then
+ # Calculate brightness of selection background
+ local sel_brightness=$(calculate_brightness "$selection_bg")
+ if [ $sel_brightness -gt 127 ]; then
+ selection_fg="$bg_color" # Dark text on light selection
+ else
+ selection_fg="$fg_color" # Light text on dark selection
+ fi
+ fi
+
+ # Extract border color from btop theme
+ local border_color=""
+ if [ -f "$CURRENT_THEME_DIR/btop.theme" ]; then
+ # Look for theme[div_line] in btop theme
+ local btop_divline=$(grep 'theme\[div_line\]' "$CURRENT_THEME_DIR/btop.theme" | head -1)
+
+ if [ -n "$btop_divline" ]; then
+ # Extract the color value after the = sign
+ local extracted=$(echo "$btop_divline" | sed 's/.*=//' | xargs)
+
+ # Check if it's a hex color and lowercase it
+ if [[ $extracted =~ ^#[0-9a-fA-F]{6}$ ]]; then
+ border_color=$(echo "$extracted" | tr '[:upper:]' '[:lower:]')
+ elif [[ $extracted =~ ^[0-9a-fA-F]{6}$ ]]; then
+ # Add # if missing and lowercase
+ border_color=$(echo "#$extracted" | tr '[:upper:]' '[:lower:]')
+ fi
+ fi
+ fi
+
+ # Fallback if no border color found
+ if [ -z "$border_color" ]; then
+ # Use a color between bg and fg
+ read -r r1 g1 b1 <<<"$(hex_to_rgb "$bg_color")"
+ read -r r2 g2 b2 <<<"$(hex_to_rgb "$fg_color")"
+ local r=$(((r1 + r2) / 3)) # Closer to background
+ local g=$(((g1 + g2) / 3))
+ local b=$(((b1 + b2) / 3))
+ border_color=$(printf "#%02x%02x%02x" "$r" "$g" "$b")
+ fi
+
+ # Get unique colors array (without bg/fg) sorted by frequency
+ local -a unique_colors
+ readarray -t unique_colors < <(echo "$filtered_data" | sort_colors_by_frequency)
+
+ # Fill the 13 color slots (code colors handled separately)
+ local -a color_slots
+ readarray -t color_slots < <(fill_color_slots "${unique_colors[@]}" | tr ' ' '\n')
+
+ # Extract fonts
+ local monospace_font="CaskaydiaMono Nerd Font"
+ local ui_font="Liberation Sans"
+
+ if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then
+ local alacritty_font=$(grep -A 5 "\[font\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep 'family = ' | head -1 | cut -d'"' -f2)
+ [ -n "$alacritty_font" ] && monospace_font="$alacritty_font"
+ fi
+
+ if [ -f "$HOME/.config/fontconfig/fonts.conf" ]; then
+ local fontconfig_mono=$(xmlstarlet sel -t -v '//match[@target="pattern"][test/string="monospace"]/edit[@name="family"]/string' "$HOME/.config/fontconfig/fonts.conf" 2>/dev/null || true)
+ [ -n "$fontconfig_mono" ] && monospace_font="$fontconfig_mono"
+
+ local fontconfig_sans=$(xmlstarlet sel -t -v '//match[@target="pattern"][test/string="sans-serif"]/edit[@name="family"]/string' "$HOME/.config/fontconfig/fonts.conf" 2>/dev/null || true)
+ [ -n "$fontconfig_sans" ] && ui_font="$fontconfig_sans"
+ fi
+
+ # Generate CSS with 14-slot system
+ cat </dev/null || echo "unknown")") */
+/* Colors sorted by frequency, backgrounds by distance */
+
+.theme-dark, .theme-light {
+ /* Core colors */
+ --background-primary: $bg_color;
+ --text-normal: $fg_color;
+
+ /* Background variations (always distance-based) */
+ --background-primary-alt: $bg_primary_alt;
+ --background-secondary: $bg_secondary;
+ --background-secondary-alt: $bg_secondary_alt;
+
+ /* Code block colors (always distance-based) */
+ --code-background: $code_bg;
+ --code-foreground: $code_fg;
+
+ /* Border color from btop theme */
+ --border-color: $border_color;
+
+ /* Selection colors from Alacritty */
+ --text-selection: $selection_bg;
+ --text-selection-fg: $selection_fg;
+
+ /* 13-slot color system for remaining elements */
+ --text-title-h1: ${color_slots[0]};
+ --text-title-h2: ${color_slots[1]};
+ --text-title-h3: ${color_slots[2]};
+ --text-title-h4: ${color_slots[3]};
+ --text-title-h5: ${color_slots[4]};
+ --text-title-h6: ${color_slots[4]}; /* Same as h5 */
+ --text-link: ${color_slots[5]};
+ --markup-code: ${color_slots[6]};
+ --text-mark: ${color_slots[7]};
+ --interactive-accent: ${color_slots[8]};
+ --blockquote-border: ${color_slots[9]};
+ --text-muted: $border_color; /* Use border color for muted text */
+ --text-faint: $border_color; /* Use border color for faint text */
+
+ /* Additional mappings */
+ --text-accent: var(--interactive-accent);
+ --text-accent-hover: var(--interactive-accent);
+ --text-error: var(--text-title-h1);
+ --text-error-hover: var(--text-title-h1);
+ --text-highlight-bg: $fg_color; /* Use text color as highlight background */
+ --text-on-accent: $bg_color;
+
+ --interactive-normal: var(--code-background);
+ --interactive-hover: var(--interactive-accent);
+ --interactive-accent-hover: var(--interactive-accent);
+ --interactive-success: var(--text-title-h2);
+
+ --scrollbar-bg: var(--background-primary);
+ --scrollbar-thumb-bg: var(--code-background);
+ --scrollbar-active-thumb-bg: var(--interactive-accent);
+
+ --background-modifier-border: var(--border-color);
+ --background-modifier-form-field: var(--code-background);
+ --background-modifier-form-field-highlighted: var(--code-background);
+ --background-modifier-box-shadow: rgba(0, 0, 0, 0.3);
+ --background-modifier-success: var(--interactive-success);
+ --background-modifier-error: var(--text-error);
+ --background-modifier-error-hover: var(--text-error);
+ --background-modifier-cover: rgba(0, 0, 0, 0.8);
+
+ --link-color: var(--text-link);
+ --link-color-hover: var(--text-link);
+ --link-unresolved-color: var(--text-muted);
+ --link-unresolved-opacity: 0.7;
+
+ --tag-color: var(--text-title-h3);
+ --tag-background: var(--code-background);
+
+ --graph-line: var(--text-muted);
+ --graph-node: var(--interactive-accent);
+ --graph-node-unresolved: var(--text-muted);
+ --graph-node-focused: var(--text-link);
+ --graph-node-tag: var(--text-title-h3);
+ --graph-node-attachment: var(--text-title-h2);
+
+ /* Fonts */
+ --font-interface-theme: "$ui_font";
+ --font-text-theme: "$ui_font";
+ --font-monospace-theme: "$monospace_font";
+}
+
+/* Headers */
+.cm-header-1, .markdown-rendered h1 { color: var(--text-title-h1); }
+.cm-header-2, .markdown-rendered h2 { color: var(--text-title-h2); }
+.cm-header-3, .markdown-rendered h3 { color: var(--text-title-h3); }
+.cm-header-4, .markdown-rendered h4 { color: var(--text-title-h4); }
+.cm-header-5, .markdown-rendered h5 { color: var(--text-title-h5); }
+.cm-header-6, .markdown-rendered h6 { color: var(--text-title-h6); }
+
+/* Code blocks */
+.markdown-rendered code {
+ font-family: var(--font-monospace-theme);
+ background-color: var(--code-background);
+ color: var(--markup-code);
+ padding: 2px 4px;
+ border-radius: 3px;
+}
+
+.markdown-rendered pre {
+ background-color: var(--code-background);
+ border: 1px solid var(--background-modifier-border);
+ border-radius: 5px;
+}
+
+.markdown-rendered pre code {
+ background-color: transparent;
+ color: var(--code-foreground);
+}
+
+/* Syntax highlighting */
+.cm-s-obsidian span.cm-keyword { color: var(--text-title-h1); }
+.cm-s-obsidian span.cm-string { color: var(--text-title-h2); }
+.cm-s-obsidian span.cm-number { color: var(--text-title-h3); }
+.cm-s-obsidian span.cm-comment { color: var(--text-muted); }
+.cm-s-obsidian span.cm-operator { color: var(--text-link); }
+.cm-s-obsidian span.cm-variable { color: var(--text-normal); }
+.cm-s-obsidian span.cm-def { color: var(--text-link); }
+
+/* Highlighted text */
+.markdown-rendered mark,
+.cm-s-obsidian span.cm-highlight,
+mark {
+ background-color: var(--text-highlight-bg) !important;
+ color: var(--code-background) !important;
+}
+
+/* Links */
+.markdown-rendered a {
+ color: var(--text-link);
+}
+
+/* Blockquotes */
+.markdown-rendered blockquote {
+ border-left: 4px solid var(--blockquote-border);
+ padding-left: 1em;
+}
+
+/* Status bar */
+.status-bar {
+ background-color: var(--code-background);
+ border-top: 1px solid var(--background-modifier-border);
+}
+
+/* Active file */
+.workspace-leaf.mod-active .workspace-leaf-header-title {
+ color: var(--interactive-accent);
+}
+
+.nav-file-title.is-active {
+ background-color: var(--code-background);
+ color: var(--interactive-accent);
+}
+
+/* Text selection */
+::selection {
+ background-color: var(--text-selection);
+ color: var(--text-selection-fg);
+}
+
+/* Search results */
+.search-result-file-title {
+ color: var(--interactive-accent);
+}
+
+.search-result-file-match {
+ background-color: var(--code-background);
+ color: var(--text-normal);
+ border-left: 3px solid var(--interactive-accent);
+}
+
+.search-result-file-matched-text {
+ color: var(--code-background);
+}
+
+/* Tables */
+.markdown-rendered table {
+ border: 1px solid var(--background-modifier-border);
+}
+
+.markdown-rendered th {
+ background-color: var(--code-background);
+ color: var(--text-accent);
+}
+
+.markdown-rendered td {
+ border: 1px solid var(--background-modifier-border);
+}
+
+/* Callouts */
+.callout {
+ border-left: 4px solid var(--interactive-accent);
+ background-color: var(--code-background);
+}
+.callout * {
+ color: var(--text-normal);
+}
+
+/* Modal dialogs */
+.modal {
+ background-color: var(--background-primary);
+ border: 2px solid var(--background-modifier-border);
+}
+
+/* Settings */
+.vertical-tab-header-group-title {
+ color: var(--interactive-accent);
+}
+
+.vertical-tab-nav-item.is-active {
+ background-color: var(--code-background);
+ color: var(--interactive-accent);
+}
+EOF
+}
+
+# Option handling
+if [ "${1:-}" = "--reset" ]; then
+ echo "♻️ Resetting Omarchy themes and registry..."
+ if [ -f "$VAULTS_FILE" ] && [ -s "$VAULTS_FILE" ]; then
+ while IFS= read -r vault_path || [ -n "$vault_path" ]; do
+ case "$vault_path" in ""|\#*) continue ;; esac
+ vault_path="${vault_path%/}"
+ vault_name=$(basename "$vault_path")
+ theme_dir="$vault_path/.obsidian/themes/Omarchy"
+ if [ -d "$theme_dir" ]; then
+ rm -rf "$theme_dir"
+ echo " ✅ $vault_name (theme removed)"
+ else
+ echo " ℹ️ $vault_name (no theme present)"
+ fi
+ done <"$VAULTS_FILE"
+ fi
+ rm -f "$VAULTS_FILE"
+ echo "✅ Registry removed"
+ exit 0
+fi
+
+# Main update logic
+echo "🔄 Updating Obsidian vaults..."
+
+# Step 1: ensure registry exists (bootstrap if needed)
+ensure_vaults_file
+
+while IFS= read -r vault_path || [ -n "$vault_path" ]; do
+ case "$vault_path" in "" | \#*) continue ;; esac
+ vault_path="${vault_path%/}"
+ vault_name=$(basename "$vault_path")
+
+ # Step 2: verify path exists; log/skip gracefully if invalid
+ if [ ! -d "$vault_path" ] || [ ! -d "$vault_path/.obsidian" ]; then
+ echo " ❌ $vault_name (invalid entry: missing directory or .obsidian)"
+ continue
+ fi
+
+ # Ensure theme files exist for this vault
+ ensure_theme_scaffold "$vault_path"
+ THEME_DIR="$vault_path/.obsidian/themes/Omarchy"
+
+ # Step 3: update theme.css
+ if [ -f "$CURRENT_THEME_DIR/obsidian.css" ]; then
+ cp "$CURRENT_THEME_DIR/obsidian.css" "$THEME_DIR/theme.css"
+ echo " ✅ $vault_name (custom theme)"
+ else
+ extract_theme_data >"$THEME_DIR/theme.css"
+ echo " ✅ $vault_name (generated theme)"
+ fi
+done <"$VAULTS_FILE"
diff --git a/bin/omarchy-theme-set-terminal b/bin/omarchy-theme-set-terminal
index 8a6bdbdd..9e2f7ad0 100755
--- a/bin/omarchy-theme-set-terminal
+++ b/bin/omarchy-theme-set-terminal
@@ -1,7 +1,8 @@
#!/bin/bash
-case "$TERMINAL" in
-"alacritty") touch ~/.config/alacritty/alacritty.toml ;;
-"kitty") killall -SIGUSR1 kitty ;;
-"ghostty") killall -SIGUSR2 ghostty ;;
-esac
+if [[ -f ~/.config/alacritty/alacritty.toml ]]; then
+ touch ~/.config/alacritty/alacritty.toml
+fi
+
+killall -SIGUSR1 kitty
+killall -SIGUSR2 ghostty
diff --git a/bin/omarchy-theme-set-vscode b/bin/omarchy-theme-set-vscode
index 1fa975d1..c04010ca 100755
--- a/bin/omarchy-theme-set-vscode
+++ b/bin/omarchy-theme-set-vscode
@@ -3,44 +3,45 @@
# Note: We cannot use `jq` to update settings.json because it’s JSONC (allows comments),
# which jq doesn’t support.
-VS_CODE_THEME="$HOME/.config/omarchy/current/theme/vscode.json"
-VS_CODE_SETTINGS="$HOME/.config/Code/User/settings.json"
-VS_CODE_SKIP_FLAG="$HOME/.local/state/omarchy/toggles/skip-vscode-theme-changes"
+# Parameters: EDITOR_CMD SETTINGS_PATH SKIP_FLAG EDITOR_NAME
+EDITOR_CMD="${1:-code}"
+SETTINGS_PATH="${2:-$HOME/.config/Code/User/settings.json}"
+SKIP_FLAG="${3:-$HOME/.local/state/omarchy/toggles/skip-vscode-theme-changes}"
+EDITOR_NAME="${4:-VS Code}"
-if omarchy-cmd-present code && [[ ! -f "$VS_CODE_SKIP_FLAG" ]]; then
+VS_CODE_THEME="$HOME/.config/omarchy/current/theme/vscode.json"
+
+if omarchy-cmd-present "$EDITOR_CMD" && [[ ! -f "$SKIP_FLAG" ]]; then
if [[ -f "$VS_CODE_THEME" ]]; then
theme_name=$(jq -r '.name' "$VS_CODE_THEME")
extension=$(jq -r '.extension' "$VS_CODE_THEME")
- # Install VS Code theme extension
- if [[ -n "$extension" ]] && ! code --list-extensions | grep -Fxq "$extension"; then
- notify-send " Installing VS Code theme for $theme_name"
- code --install-extension "$extension" >/dev/null
+ # Install $EDITOR_NAME theme extension
+ if [[ -n "$extension" ]] && ! "$EDITOR_CMD" --list-extensions | grep -Fxq "$extension"; then
+ "$EDITOR_CMD" --install-extension "$extension" >/dev/null
fi
# Create config file if there isn't already one
- mkdir -p "$(dirname "$VS_CODE_SETTINGS")"
- if [[ ! -f "$VS_CODE_SETTINGS" ]]; then
- printf '{\n}\n' > "$VS_CODE_SETTINGS"
+ mkdir -p "$(dirname "$SETTINGS_PATH")"
+ if [[ ! -f "$SETTINGS_PATH" ]]; then
+ printf '{\n}\n' >"$SETTINGS_PATH"
fi
- # Create a `workbench.colorTheme` entry in settings.
- if ! grep -q '"workbench.colorTheme"' "$VS_CODE_SETTINGS"; then
+ # Create a `workbench.colorTheme` entry in settings.
+ if ! grep -q '"workbench.colorTheme"' "$SETTINGS_PATH"; then
# Insert `"workbench.colorTheme": "",` immediately after the first `{`
# Use sed's first-match range (0,/{/) to only replace the first `{`
- sed -i --follow-symlinks -E '0,/\{/{s/\{/{\
- "workbench.colorTheme": "",/}' "$VS_CODE_SETTINGS"
+ sed -i --follow-symlinks -E '0,/\{/{s/\{/{\ "workbench.colorTheme": "",/}' "$SETTINGS_PATH"
fi
# Update theme
sed -i --follow-symlinks -E \
"s/(\"workbench.colorTheme\"[[:space:]]*:[[:space:]]*\")[^\"]*(\")/\1$theme_name\2/" \
- "$VS_CODE_SETTINGS"
+ "$SETTINGS_PATH"
else
- # Remove theme from settings.json when the theme doesn't have vscode support
- if [[ -f "$VS_CODE_SETTINGS" ]]; then
- sed -i --follow-symlinks -E '/"workbench\.colorTheme"[[:space:]]*:[^,}]*,?/d' "$VS_CODE_SETTINGS"
-
+ # Remove theme from settings.json when the theme doesn't have $EDITOR_NAME support
+ if [[ -f "$SETTINGS_PATH" ]]; then
+ sed -i --follow-symlinks -E 's/\"workbench\.colorTheme\"[[:space:]]*:[^,}]*,?//' "$SETTINGS_PATH"
fi
fi
fi
diff --git a/bin/omarchy-toggle-idle b/bin/omarchy-toggle-idle
index a1954614..aa69cf50 100755
--- a/bin/omarchy-toggle-idle
+++ b/bin/omarchy-toggle-idle
@@ -4,6 +4,6 @@ if pgrep -x hypridle >/dev/null; then
pkill -x hypridle
notify-send "Stop locking computer when idle"
else
- uwsm app -- hypridle >/dev/null 2>&1 &
+ uwsm-app -- hypridle >/dev/null 2>&1 &
notify-send "Now locking computer when idle"
fi
diff --git a/bin/omarchy-toggle-nightlight b/bin/omarchy-toggle-nightlight
index 2ab2deb6..99b0286b 100755
--- a/bin/omarchy-toggle-nightlight
+++ b/bin/omarchy-toggle-nightlight
@@ -6,7 +6,7 @@ OFF_TEMP=6000
# Ensure hyprsunset is running
if ! pgrep -x hyprsunset; then
- setsid uwsm app -- hyprsunset &
+ setsid uwsm-app -- hyprsunset &
sleep 1 # Give it time to register
fi
diff --git a/bin/omarchy-toggle-waybar b/bin/omarchy-toggle-waybar
index 9714185f..71387827 100755
--- a/bin/omarchy-toggle-waybar
+++ b/bin/omarchy-toggle-waybar
@@ -3,5 +3,5 @@
if pgrep -x waybar >/dev/null; then
pkill -x waybar
else
- uwsm app -- waybar >/dev/null 2>&1 &
+ uwsm-app -- waybar >/dev/null 2>&1 &
fi
diff --git a/bin/omarchy-tz-select b/bin/omarchy-tz-select
new file mode 100755
index 00000000..24003228
--- /dev/null
+++ b/bin/omarchy-tz-select
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+timezone=$(timedatectl list-timezones | gum filter --height 20 --header "Set timezone") || exit 1
+sudo timedatectl set-timezone "$timezone"
+echo "Timezone is now set to $timezone"
+omarchy-restart-waybar
diff --git a/bin/omarchy-update-branch b/bin/omarchy-update-branch
index 929e1bb4..91bd797e 100755
--- a/bin/omarchy-update-branch
+++ b/bin/omarchy-update-branch
@@ -3,7 +3,7 @@
set -e
if (($# == 0)); then
- echo "Usage: omarchy-verion-branch-set [master|dev]"
+ echo "Usage: omarchy-update-branch [master|dev]"
exit 1
fi
diff --git a/bin/omarchy-update-firmware b/bin/omarchy-update-firmware
new file mode 100755
index 00000000..10e490f4
--- /dev/null
+++ b/bin/omarchy-update-firmware
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+set -e
+echo -e "\e[32mUpdate Firmware\e[0m"
+
+if omarchy-cmd-missing fwupdmgr; then
+ omarchy-pkg-add fwupd
+fi
+
+fwupdmgr refresh
+sudo fwupdmgr update
diff --git a/bin/omarchy-update-perform b/bin/omarchy-update-perform
index f31e3c88..9e68a67b 100755
--- a/bin/omarchy-update-perform
+++ b/bin/omarchy-update-perform
@@ -5,4 +5,5 @@ set -e
omarchy-update-available-reset
omarchy-update-system-pkgs
omarchy-migrate
+omarchy-hook post-update
omarchy-update-restart
diff --git a/bin/omarchy-update-restart b/bin/omarchy-update-restart
index 513cf80b..2811e937 100755
--- a/bin/omarchy-update-restart
+++ b/bin/omarchy-update-restart
@@ -5,9 +5,6 @@ if [ "$(uname -r | sed 's/-arch/\.arch/')" != "$(pacman -Q linux | awk '{print $
elif [ -f "$HOME/.local/state/omarchy/reboot-required" ]; then
gum confirm "Updates require reboot. Ready?" && omarchy-state clear re*-required && sudo reboot now
-
-elif [ -f "$HOME/.local/state/omarchy/relaunch-required" ]; then
- gum confirm "Updates require Hyprland relaunch. Ready?" && omarchy-state clear re*-required && uwsm stop
fi
for file in "$HOME"/.local/state/omarchy/restart-*-required; do
diff --git a/bin/omarchy-version b/bin/omarchy-version
index 4ac84815..5ddc823f 100755
--- a/bin/omarchy-version
+++ b/bin/omarchy-version
@@ -1,3 +1,2 @@
#!/bin/bash
-
-git -C "$OMARCHY_PATH" describe --tags $(git -C "$OMARCHY_PATH" rev-list --tags --max-count=1)
+cat $OMARCHY_PATH/version
diff --git a/bin/omarchy-webapp-handler-hey b/bin/omarchy-webapp-handler-hey
new file mode 100755
index 00000000..37f4cf2d
--- /dev/null
+++ b/bin/omarchy-webapp-handler-hey
@@ -0,0 +1,11 @@
+#!/bin/bash
+url="$1"
+web_url="https://app.hey.com"
+
+# Handle mailto: URLs
+if [[ $url =~ ^mailto: ]]; then
+ email=$(echo "$url" | sed 's/mailto://')
+ web_url="https://app.hey.com/messages/new?to=$email"
+fi
+
+exec omarchy-launch-webapp "$web_url"
diff --git a/bin/omarchy-webapp-remove b/bin/omarchy-webapp-remove
index 833e8989..ca4daefc 100755
--- a/bin/omarchy-webapp-remove
+++ b/bin/omarchy-webapp-remove
@@ -6,7 +6,7 @@ DESKTOP_DIR="$HOME/.local/share/applications/"
if [ "$#" -eq 0 ]; then
# Find all web apps
while IFS= read -r -d '' file; do
- if grep -q '^Exec=.*omarchy-launch-webapp.*' "$file"; then
+ if grep -q '^Exec=.*\(omarchy-launch-webapp\|omarchy-webapp-handler\).*' "$file"; then
WEB_APPS+=("$(basename "${file%.desktop}")")
fi
done < <(find "$DESKTOP_DIR" -name '*.desktop' -print0)
diff --git a/bin/omarchy-windows-vm b/bin/omarchy-windows-vm
new file mode 100755
index 00000000..47e90247
--- /dev/null
+++ b/bin/omarchy-windows-vm
@@ -0,0 +1,445 @@
+#!/bin/bash
+COMPOSE_FILE="$HOME/.config/windows/docker-compose.yml"
+
+check_prerequisites() {
+ local DISK_SIZE_GB=${1:-64}
+ local REQUIRED_SPACE=$((DISK_SIZE_GB + 10)) # Add 10GB for Windows ISO and overhead
+
+ # Check for KVM support
+ if [ ! -e /dev/kvm ]; then
+ gum style \
+ --border normal \
+ --padding "1 2" \
+ --margin "1" \
+ "❌ KVM virtualization not available!" \
+ "" \
+ "Please enable virtualization in BIOS or run:" \
+ " sudo modprobe kvm-intel # for Intel CPUs" \
+ " sudo modprobe kvm-amd # for AMD CPUs"
+ exit 1
+ fi
+
+ # Check disk space
+ AVAILABLE_SPACE=$(df "$HOME" | awk 'NR==2 {print int($4/1024/1024)}')
+ if [ "$AVAILABLE_SPACE" -lt "$REQUIRED_SPACE" ]; then
+ echo "❌ Insufficient disk space!"
+ echo " Available: ${AVAILABLE_SPACE}GB"
+ echo " Required: ${REQUIRED_SPACE}GB (${DISK_SIZE_GB}GB disk + 10GB for Windows image)"
+ exit 1
+ fi
+}
+
+install_windows() {
+ # Set up trap to handle Ctrl+C
+ trap "echo ''; echo 'Installation cancelled by user'; exit 1" INT
+
+ check_prerequisites
+
+ omarchy-pkg-add freerdp openbsd-netcat gum
+
+ mkdir -p "$HOME/.windows"
+ mkdir -p "$HOME/.config/windows"
+ mkdir -p "$HOME/.local/share/applications/icons"
+
+ # Install Windows VM icon and desktop file
+ if [ -f "$OMARCHY_PATH/applications/icons/windows.png" ]; then
+ cp "$OMARCHY_PATH/applications/icons/windows.png" "$HOME/.local/share/applications/icons/windows.png"
+ fi
+
+ cat << EOF | tee "$HOME/.local/share/applications/windows-vm.desktop" > /dev/null
+[Desktop Entry]
+Name=Windows
+Comment=Start Windows VM via Docker and connect with RDP
+Exec=uwsm app -- omarchy-windows-vm launch
+Icon=$HOME/.local/share/applications/icons/windows.png
+Terminal=false
+Type=Application
+Categories=System;Virtualization;
+EOF
+
+ # Get system resources
+ TOTAL_RAM=$(free -h | grep "^Mem:" | awk '{print $2}')
+ TOTAL_RAM_GB=$(free -g | grep "^Mem:" | awk '{print $2}')
+ TOTAL_CORES=$(nproc)
+
+ echo ""
+ echo "System Resources Detected:"
+ echo " Total RAM: $TOTAL_RAM"
+ echo " Total CPU Cores: $TOTAL_CORES"
+ echo ""
+
+ RAM_OPTIONS=""
+ for size in 2 4 8 16 32 64; do
+ if [ $size -le $TOTAL_RAM_GB ]; then
+ RAM_OPTIONS="$RAM_OPTIONS ${size}G"
+ fi
+ done
+
+ SELECTED_RAM=$(echo $RAM_OPTIONS | tr ' ' '\n' | gum choose --selected="4G" --header="How much RAM would you like to allocate to Windows VM?")
+
+ # Check if user cancelled
+ if [ -z "$SELECTED_RAM" ]; then
+ echo "Installation cancelled by user"
+ exit 1
+ fi
+
+ SELECTED_CORES=$(gum input --placeholder="Number of CPU cores (1-$TOTAL_CORES)" --value="2" --header="How many CPU cores would you like to allocate to Windows VM?" --char-limit=2)
+
+ # Check if user cancelled (Ctrl+C in gum input returns empty string)
+ if [ -z "$SELECTED_CORES" ]; then
+ echo "Installation cancelled by user"
+ exit 1
+ fi
+
+ if ! [[ "$SELECTED_CORES" =~ ^[0-9]+$ ]] || [ "$SELECTED_CORES" -lt 1 ] || [ "$SELECTED_CORES" -gt "$TOTAL_CORES" ]; then
+ echo "Invalid input. Using default: 2 cores"
+ SELECTED_CORES=2
+ fi
+
+ AVAILABLE_SPACE=$(df "$HOME" | awk 'NR==2 {print int($4/1024/1024)}')
+ MAX_DISK_GB=$((AVAILABLE_SPACE - 10)) # Leave 10GB for Windows image
+
+ # Check if we have enough space for minimum
+ if [ $MAX_DISK_GB -lt 32 ]; then
+ echo "❌ Insufficient disk space for Windows VM!"
+ echo " Available: ${AVAILABLE_SPACE}GB"
+ echo " Minimum required: 42GB (32GB disk + 10GB for Windows image)"
+ exit 1
+ fi
+
+ DISK_OPTIONS=""
+ for size in 32 64 128 256 512; do
+ if [ $size -le $MAX_DISK_GB ]; then
+ DISK_OPTIONS="$DISK_OPTIONS ${size}G"
+ fi
+ done
+
+ # Default to 64G if available, otherwise 32G
+ DEFAULT_DISK="64G"
+ if ! echo "$DISK_OPTIONS" | grep -q "64G"; then
+ DEFAULT_DISK="32G"
+ fi
+
+ SELECTED_DISK=$(echo $DISK_OPTIONS | tr ' ' '\n' | gum choose --selected="$DEFAULT_DISK" --header="How much disk space would you like to give Windows VM? (64GB+ recommended)")
+
+ # Check if user cancelled
+ if [ -z "$SELECTED_DISK" ]; then
+ echo "Installation cancelled by user"
+ exit 1
+ fi
+
+ # Extract just the number for prerequisite check
+ DISK_SIZE_NUM=$(echo "$SELECTED_DISK" | sed 's/G//')
+
+ # Re-check prerequisites with selected disk size
+ check_prerequisites "$DISK_SIZE_NUM"
+
+ # Prompt for username and password
+ USERNAME=$(gum input --placeholder="Username (Press enter to use default: docker)" --header="Enter Windows username:")
+ if [ -z "$USERNAME" ]; then
+ USERNAME="docker"
+ fi
+
+ PASSWORD=$(gum input --placeholder="Password (Press enter to use default: admin)" --password --header="Enter Windows password:")
+ if [ -z "$PASSWORD" ]; then
+ PASSWORD="admin"
+ PASSWORD_DISPLAY="(default)"
+ else
+ PASSWORD_DISPLAY="(user-defined)"
+ fi
+
+ # Display configuration summary
+ gum style \
+ --border normal \
+ --padding "1 2" \
+ --margin "1" \
+ --align left \
+ --bold \
+ "Windows VM Configuration" \
+ "" \
+ "RAM: $SELECTED_RAM" \
+ "CPU: $SELECTED_CORES cores" \
+ "Disk: $SELECTED_DISK" \
+ "Username: $USERNAME" \
+ "Password: $PASSWORD_DISPLAY"
+
+ # Ask for confirmation
+ echo ""
+ if ! gum confirm "Proceed with this configuration?"; then
+ echo "Installation cancelled by user"
+ exit 1
+ fi
+
+ mkdir -p $HOME/Windows
+
+ # Create docker-compose.yml in user config directory
+ cat << EOF | tee "$COMPOSE_FILE" > /dev/null
+services:
+ windows:
+ image: dockurr/windows
+ container_name: omarchy-windows
+ environment:
+ VERSION: "11"
+ RAM_SIZE: "$SELECTED_RAM"
+ CPU_CORES: "$SELECTED_CORES"
+ DISK_SIZE: "$SELECTED_DISK"
+ USERNAME: "$USERNAME"
+ PASSWORD: "$PASSWORD"
+ devices:
+ - /dev/kvm
+ - /dev/net/tun
+ cap_add:
+ - NET_ADMIN
+ ports:
+ - 8006:8006
+ - 3389:3389/tcp
+ - 3389:3389/udp
+ volumes:
+ - $HOME/.windows:/storage
+ - $HOME/Windows:/shared
+ restart: always
+ stop_grace_period: 2m
+EOF
+
+ echo ""
+ echo "Starting Windows VM installation..."
+ echo "This will download a Windows 11 image (may take 10-15 minutes)."
+ echo ""
+ echo "Monitor installation progress at: http://127.0.0.1:8006"
+ echo ""
+
+ # Start docker-compose with user's config
+ echo "Starting Windows VM with docker-compose..."
+ if ! docker-compose -f "$COMPOSE_FILE" up -d 2>&1; then
+ echo "❌ Failed to start Windows VM!"
+ echo " Common issues:"
+ echo " - Docker daemon not running: sudo systemctl start docker"
+ echo " - Port already in use: check if another VM is running"
+ echo " - Permission issues: make sure you're in the docker group"
+ exit 1
+ fi
+
+ echo ""
+ echo "Windows VM is starting up!"
+ echo ""
+ echo "Opening browser to monitor installation..."
+
+ # Open browser to monitor installation
+ sleep 3
+ xdg-open "http://127.0.0.1:8006"
+
+ echo ""
+ echo "Installation is running in the background."
+ echo "You can monitor progress at: http://127.0.0.1:8006"
+ echo ""
+ echo "Once finished, launch 'Windows' via Super + Space"
+ echo ""
+ echo "To stop the VM: omarchy-windows-vm stop"
+ echo "To change resources: ~/.config/windows/docker-compose.yml"
+ echo ""
+}
+
+remove_windows() {
+ echo "Removing Windows VM..."
+
+ docker-compose -f "$COMPOSE_FILE" down 2>/dev/null || true
+
+ docker rmi dockurr/windows 2>/dev/null || echo "Image already removed or not found"
+
+ rm "$HOME/.local/share/applications/windows-vm.desktop"
+ rm -rf "$HOME/.config/windows"
+ rm -rf "$HOME/.windows"
+
+ echo ""
+ echo "Windows VM removal completed!"
+}
+
+launch_windows() {
+ KEEP_ALIVE=false
+ if [ "$1" = "--keep-alive" ] || [ "$1" = "-k" ]; then
+ KEEP_ALIVE=true
+ fi
+
+ # Check if config exists
+ if [ ! -f "$COMPOSE_FILE" ]; then
+ echo "Windows VM not configured. Please run: omarchy-windows-vm install"
+ exit 1
+ fi
+
+ # Check if container is already running
+ CONTAINER_STATUS=$(docker inspect --format='{{.State.Status}}' omarchy-windows 2>/dev/null)
+
+ if [ "$CONTAINER_STATUS" != "running" ]; then
+ echo "Starting Windows VM..."
+
+ # Send desktop notification
+ notify-send "Windows VM" "Starting Windows VM, this may take a moment..."
+
+ if ! docker-compose -f "$COMPOSE_FILE" up -d 2>&1; then
+ echo "❌ Failed to start Windows VM!"
+ echo " Try checking: omarchy-windows-vm status"
+ echo " View logs: docker logs omarchy-windows"
+ notify-send -u critical "Windows VM" "Failed to start Windows VM"
+ exit 1
+ fi
+
+ # Wait for RDP to be ready
+ echo "Waiting for Windows VM to be ready..."
+ WAIT_COUNT=0
+ while ! nc -z 127.0.0.1 3389 2>/dev/null; do
+ sleep 2
+ WAIT_COUNT=$((WAIT_COUNT + 1))
+ if [ $WAIT_COUNT -gt 60 ]; then # 2 minutes timeout
+ echo "❌ Timeout waiting for RDP!"
+ echo " The VM might still be installing Windows."
+ echo " Check progress at: http://127.0.0.1:8006"
+ exit 1
+ fi
+ done
+
+ # Give it a moment more to fully initialize
+ sleep 3
+ fi
+
+ # Extract credentials from compose file
+ WIN_USER=$(grep "USERNAME:" "$COMPOSE_FILE" | sed 's/.*USERNAME: "\(.*\)"/\1/')
+ WIN_PASS=$(grep "PASSWORD:" "$COMPOSE_FILE" | sed 's/.*PASSWORD: "\(.*\)"/\1/')
+
+ # Use defaults if not found
+ [ -z "$WIN_USER" ] && WIN_USER="docker"
+ [ -z "$WIN_PASS" ] && WIN_PASS="admin"
+
+ # Build the connection info
+ if [ "$KEEP_ALIVE" = true ]; then
+ LIFECYCLE="VM will keep running after RDP closes
+To stop: omarchy-windows-vm stop"
+ else
+ LIFECYCLE="VM will auto-stop when RDP closes"
+ fi
+
+ gum style \
+ --border normal \
+ --padding "1 2" \
+ --margin "1" \
+ --align center \
+ "Connecting to Windows VM" \
+ "" \
+ "$LIFECYCLE"
+
+ # Detect display scale from Hyprland
+ HYPR_SCALE=$(hyprctl monitors -j | jq -r '.[0].scale')
+ SCALE_PERCENT=$(echo "$HYPR_SCALE" | awk '{print int($1 * 100)}')
+
+ RDP_SCALE=""
+ if [ "$SCALE_PERCENT" -ge 170 ]; then
+ RDP_SCALE="/scale:180"
+ elif [ "$SCALE_PERCENT" -ge 130 ]; then
+ RDP_SCALE="/scale:140"
+ fi
+ # If scale is less than 130%, don't set any scale (use default 100)
+
+ # Connect with RDP in fullscreen (auto-detects resolution)
+ xfreerdp3 /u:"$WIN_USER" /p:"$WIN_PASS" /v:127.0.0.1:3389 +f -grab-keyboard /cert:ignore /title:"Windows VM - Omarchy" /floatbar:sticky:off,default:visible,show:fullscreen $RDP_SCALE
+
+ # After RDP closes, stop the container unless --keep-alive was specified
+ if [ "$KEEP_ALIVE" = false ]; then
+ echo ""
+ echo "RDP session closed. Stopping Windows VM..."
+ docker-compose -f "$COMPOSE_FILE" down
+ echo "Windows VM stopped."
+ else
+ echo ""
+ echo "RDP session closed. Windows VM is still running."
+ echo "To stop it: omarchy-windows-vm stop"
+ fi
+}
+
+stop_windows() {
+ if [ ! -f "$COMPOSE_FILE" ]; then
+ echo "Windows VM not configured."
+ exit 1
+ fi
+
+ echo "Stopping Windows VM..."
+ docker-compose -f "$COMPOSE_FILE" down
+ echo "Windows VM stopped."
+}
+
+status_windows() {
+ if [ ! -f "$COMPOSE_FILE" ]; then
+ echo "Windows VM not configured."
+ echo "To set up: omarchy-windows-vm install"
+ exit 1
+ fi
+
+ CONTAINER_STATUS=$(docker inspect --format='{{.State.Status}}' omarchy-windows 2>/dev/null)
+
+ if [ -z "$CONTAINER_STATUS" ]; then
+ echo "Windows VM container not found."
+ echo "To start: omarchy-windows-vm launch"
+ elif [ "$CONTAINER_STATUS" = "running" ]; then
+ gum style \
+ --border normal \
+ --padding "1 2" \
+ --margin "1" \
+ --align left \
+ "Windows VM Status: RUNNING" \
+ "" \
+ "Web interface: http://127.0.0.1:8006" \
+ "RDP available: port 3389" \
+ "" \
+ "To connect: omarchy-windows-vm launch" \
+ "To stop: omarchy-windows-vm stop"
+ else
+ echo "Windows VM is stopped (status: $CONTAINER_STATUS)"
+ echo "To start: omarchy-windows-vm launch"
+ fi
+}
+
+show_usage() {
+ echo "Usage: omarchy-windows-vm [command] [options]"
+ echo ""
+ echo "Commands:"
+ echo " install Install and configure Windows VM"
+ echo " remove Remove Windows VM and optionally its data"
+ echo " launch [options] Start Windows VM (if needed) and connect via RDP"
+ echo " Options:"
+ echo " --keep-alive, -k Keep VM running after RDP closes"
+ echo " stop Stop the running Windows VM"
+ echo " status Show current VM status"
+ echo " help Show this help message"
+ echo ""
+ echo "Examples:"
+ echo " omarchy-windows-vm install # Set up Windows VM for first time"
+ echo " omarchy-windows-vm launch # Connect to VM (auto-stop on exit)"
+ echo " omarchy-windows-vm launch -k # Connect to VM (keep running)"
+ echo " omarchy-windows-vm stop # Shut down the VM"
+}
+
+# Main command dispatcher
+case "$1" in
+ install)
+ install_windows
+ ;;
+ remove)
+ remove_windows
+ ;;
+ launch|start)
+ launch_windows "$2"
+ ;;
+ stop|down)
+ stop_windows
+ ;;
+ status)
+ status_windows
+ ;;
+ help|--help|-h|"")
+ show_usage
+ ;;
+ *)
+ echo "Unknown command: $1" >&2
+ echo "" >&2
+ show_usage >&2
+ exit 1
+ ;;
+esac
diff --git a/config/alacritty/alacritty.toml b/config/alacritty/alacritty.toml
index 63fb85b7..ee1fb6fc 100644
--- a/config/alacritty/alacritty.toml
+++ b/config/alacritty/alacritty.toml
@@ -16,5 +16,6 @@ decorations = "None"
[keyboard]
bindings = [
-{ key = "F11", action = "ToggleFullscreen" }
+{ key = "Insert", mods = "Shift", action = "Paste" },
+{ key = "Insert", mods = "Control", action = "Copy" }
]
diff --git a/config/brave-flags.conf b/config/brave-flags.conf
index d6d120e6..3510e03d 100644
--- a/config/brave-flags.conf
+++ b/config/brave-flags.conf
@@ -1,3 +1,5 @@
--ozone-platform=wayland
--ozone-platform-hint=wayland
--enable-features=TouchpadOverscrollHistoryNavigation
+# Chromium crash workaround for Wayland color management on Hyprland - see https://github.com/hyprwm/Hyprland/issues/11957
+--disable-features=WaylandWpColorManagerV1
diff --git a/config/btop/btop.conf b/config/btop/btop.conf
index c510f3e7..c150ea0a 100644
--- a/config/btop/btop.conf
+++ b/config/btop/btop.conf
@@ -22,7 +22,7 @@ presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:defaul
#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists.
#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift.
-vim_keys = False
+vim_keys = True
#* Rounded corners on boxes, is ignored if TTY mode is ON.
rounded_corners = True
diff --git a/config/chromium-flags.conf b/config/chromium-flags.conf
index 88c8082b..bce00d52 100644
--- a/config/chromium-flags.conf
+++ b/config/chromium-flags.conf
@@ -2,3 +2,5 @@
--ozone-platform-hint=wayland
--enable-features=TouchpadOverscrollHistoryNavigation
--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url
+# Chromium crash workaround for Wayland color management on Hyprland - see https://github.com/hyprwm/Hyprland/issues/11957
+--disable-features=WaylandWpColorManagerV1
diff --git a/config/elephant/calc.toml b/config/elephant/calc.toml
new file mode 100644
index 00000000..95d00d12
--- /dev/null
+++ b/config/elephant/calc.toml
@@ -0,0 +1 @@
+async = false
diff --git a/config/elephant/desktopapplications.toml b/config/elephant/desktopapplications.toml
new file mode 100644
index 00000000..de17325b
--- /dev/null
+++ b/config/elephant/desktopapplications.toml
@@ -0,0 +1,3 @@
+show_actions = false
+only_search_title = true
+history = false
diff --git a/config/ghostty/config b/config/ghostty/config
index e8420d1b..f714edb3 100644
--- a/config/ghostty/config
+++ b/config/ghostty/config
@@ -7,10 +7,12 @@ font-style = Regular
font-size = 9
# Window
+window-theme = ghostty
window-padding-x = 14
window-padding-y = 14
confirm-close-surface=false
resize-overlay = never
+gtk-toolbar-style = flat
# Cursor styling
cursor-style = "block"
@@ -18,4 +20,8 @@ cursor-style-blink = false
shell-integration-features = no-cursor
# Keyboard bindings
-keybind = f11=toggle_fullscreen
+keybind = shift+insert=paste_from_clipboard
+keybind = control+insert=copy_to_clipboard
+
+# SSH session terminfo
+shell-integration-features = ssh-env
diff --git a/config/hypr/autostart.conf b/config/hypr/autostart.conf
index 3b7c62d2..708b3a29 100644
--- a/config/hypr/autostart.conf
+++ b/config/hypr/autostart.conf
@@ -1,2 +1,2 @@
# Extra autostart processes
-# exec-once = uwsm app -- my-service
+# exec-once = uwsm-app -- my-service
diff --git a/config/hypr/bindings.conf b/config/hypr/bindings.conf
index 6076049b..954929ed 100644
--- a/config/hypr/bindings.conf
+++ b/config/hypr/bindings.conf
@@ -1,29 +1,29 @@
# Application bindings
-$terminal = uwsm app -- $TERMINAL
+$terminal = uwsm-app -- $TERMINAL
$browser = omarchy-launch-browser
-bindd = SUPER, return, Terminal, exec, $terminal --working-directory="$(omarchy-cmd-terminal-cwd)"
-bindd = SUPER, F, File manager, exec, uwsm app -- nautilus --new-window
-bindd = SUPER, B, Browser, exec, $browser
-bindd = SUPER SHIFT, B, Browser (private), exec, $browser --private
-bindd = SUPER, M, Music, exec, omarchy-launch-or-focus spotify
-bindd = SUPER, N, Editor, exec, omarchy-launch-editor
-bindd = SUPER, T, Activity, exec, $terminal -e btop
-bindd = SUPER, D, Docker, exec, $terminal -e lazydocker
-bindd = SUPER, G, Signal, exec, omarchy-launch-or-focus signal "uwsm app -- signal-desktop"
-bindd = SUPER, O, Obsidian, exec, omarchy-launch-or-focus obsidian "uwsm app -- obsidian -disable-gpu --enable-wayland-ime"
-bindd = SUPER, slash, Passwords, exec, uwsm app -- 1password
+bindd = SUPER, RETURN, Terminal, exec, $terminal --working-directory="$(omarchy-cmd-terminal-cwd)"
+bindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window
+bindd = SUPER SHIFT, B, Browser, exec, $browser
+bindd = SUPER SHIFT ALT, B, Browser (private), exec, $browser --private
+bindd = SUPER SHIFT, M, Music, exec, omarchy-launch-or-focus spotify
+bindd = SUPER SHIFT, N, Editor, exec, omarchy-launch-editor
+bindd = SUPER SHIFT, T, Activity, exec, $terminal -e btop
+bindd = SUPER SHIFT, D, Docker, exec, $terminal -e lazydocker
+bindd = SUPER SHIFT, G, Signal, exec, omarchy-launch-or-focus signal "uwsm-app -- signal-desktop"
+bindd = SUPER SHIFT, O, Obsidian, exec, omarchy-launch-or-focus "^obsidian$" "uwsm-app -- obsidian -disable-gpu --enable-wayland-ime"
+bindd = SUPER SHIFT, SLASH, Passwords, exec, uwsm-app -- 1password
# If your web app url contains #, type it as ## to prevent hyperland treat it as comments
-bindd = SUPER, A, ChatGPT, exec, omarchy-launch-webapp "https://chatgpt.com"
-bindd = SUPER SHIFT, A, Grok, exec, omarchy-launch-webapp "https://grok.com"
-bindd = SUPER, C, Calendar, exec, omarchy-launch-webapp "https://app.hey.com/calendar/weeks/"
-bindd = SUPER, E, Email, exec, omarchy-launch-webapp "https://app.hey.com"
-bindd = SUPER, Y, YouTube, exec, omarchy-launch-or-focus-webapp YouTube "https://youtube.com/"
-bindd = SUPER SHIFT, G, WhatsApp, exec, omarchy-launch-or-focus-webapp WhatsApp "https://web.whatsapp.com/"
-bindd = SUPER ALT, G, Google Messages, exec, omarchy-launch-or-focus-webapp "Google Messages" "https://messages.google.com/web/conversations"
-bindd = SUPER, X, X, exec, omarchy-launch-webapp "https://x.com/"
-bindd = SUPER SHIFT, X, X Post, exec, omarchy-launch-webapp "https://x.com/compose/post"
+bindd = SUPER SHIFT, A, ChatGPT, exec, omarchy-launch-webapp "https://chatgpt.com"
+bindd = SUPER SHIFT ALT, A, Grok, exec, omarchy-launch-webapp "https://grok.com"
+bindd = SUPER SHIFT, C, Calendar, exec, omarchy-launch-webapp "https://app.hey.com/calendar/weeks/"
+bindd = SUPER SHIFT, E, Email, exec, omarchy-launch-webapp "https://app.hey.com"
+bindd = SUPER SHIFT, Y, YouTube, exec, omarchy-launch-webapp "https://youtube.com/"
+bindd = SUPER SHIFT ALT, G, WhatsApp, exec, omarchy-launch-or-focus-webapp WhatsApp "https://web.whatsapp.com/"
+bindd = SUPER SHIFT CTRL, G, Google Messages, exec, omarchy-launch-or-focus-webapp "Google Messages" "https://messages.google.com/web/conversations"
+bindd = SUPER SHIFT, X, X, exec, omarchy-launch-webapp "https://x.com/"
+bindd = SUPER SHIFT ALT, X, X Post, exec, omarchy-launch-webapp "https://x.com/compose/post"
# Overwrite existing bindings, like putting Omarchy Menu on Super + Space
# unbind = SUPER, SPACE
diff --git a/config/hypr/hyprland.conf b/config/hypr/hyprland.conf
index 3a91c979..f513cd08 100644
--- a/config/hypr/hyprland.conf
+++ b/config/hypr/hyprland.conf
@@ -3,7 +3,8 @@
# Use defaults Omarchy defaults (but don't edit these directly!)
source = ~/.local/share/omarchy/default/hypr/autostart.conf
source = ~/.local/share/omarchy/default/hypr/bindings/media.conf
-source = ~/.local/share/omarchy/default/hypr/bindings/tiling.conf
+source = ~/.local/share/omarchy/default/hypr/bindings/clipboard.conf
+source = ~/.local/share/omarchy/default/hypr/bindings/tiling-v2.conf
source = ~/.local/share/omarchy/default/hypr/bindings/utilities.conf
source = ~/.local/share/omarchy/default/hypr/envs.conf
source = ~/.local/share/omarchy/default/hypr/looknfeel.conf
@@ -18,3 +19,6 @@ source = ~/.config/hypr/bindings.conf
source = ~/.config/hypr/envs.conf
source = ~/.config/hypr/looknfeel.conf
source = ~/.config/hypr/autostart.conf
+
+# Add any other personal Hyprland configuration below
+# windowrule = workspace 5, class:qemu
diff --git a/config/hypr/hyprlock.conf b/config/hypr/hyprlock.conf
index d2df6965..063d793b 100644
--- a/config/hypr/hyprlock.conf
+++ b/config/hypr/hyprlock.conf
@@ -13,7 +13,7 @@ animations {
input-field {
monitor =
- size = 600, 100
+ size = 650, 100
position = 0, 0
halign = center
valign = center
@@ -22,12 +22,12 @@ input-field {
outer_color = $outer_color
outline_thickness = 4
- font_family = CaskaydiaMono Nerd Font
+ font_family = CaskaydiaMono Nerd Font Propo
font_color = $font_color
- placeholder_text = Enter Password
+ placeholder_text = Enter Password
check_color = $check_color
- fail_text = $PAMFAIL ($ATTEMPTS)
+ fail_text = $FAIL ($ATTEMPTS)
rounding = 0
shadow_passes = 0
diff --git a/config/hypr/hyprsunset.conf b/config/hypr/hyprsunset.conf
index 78bba7d0..f51ff746 100644
--- a/config/hypr/hyprsunset.conf
+++ b/config/hypr/hyprsunset.conf
@@ -3,4 +3,10 @@
profile {
time = 07:00
identity = true
-}
\ No newline at end of file
+}
+
+# Enable auto switch to nightlight:
+# profile {
+# time = 20:00
+# temperature = 4000
+# }
diff --git a/config/hypr/input.conf b/config/hypr/input.conf
index ca5f1f5e..6bbee49b 100644
--- a/config/hypr/input.conf
+++ b/config/hypr/input.conf
@@ -3,7 +3,7 @@
input {
# Use multiple keyboard layouts and switch between them with Left Alt + Right Alt
# kb_layout = us,dk,eu
- kb_options = compose:caps # ,grp:alts_toggle
+ kb_options = compose:caps # ,grp:shifts_toggle
# Change speed of keyboard repeat
repeat_rate = 40
@@ -12,7 +12,7 @@ input {
# Start with numlock on by default
numlock_by_default = true
- # Increase sensitity for mouse/trackpack (default: 0)
+ # Increase sensitivity for mouse/trackpad (default: 0)
# sensitivity = 0.35
touchpad {
diff --git a/config/hypr/monitors.conf b/config/hypr/monitors.conf
index 6fc13876..2f1f0db8 100644
--- a/config/hypr/monitors.conf
+++ b/config/hypr/monitors.conf
@@ -1,7 +1,6 @@
# See https://wiki.hyprland.org/Configuring/Monitors/
# List current monitors and resolutions possible: hyprctl monitors
# Format: monitor = [port], resolution, position, scale
-# You must relaunch Hyprland after changing any envs (use Super+Esc, then Relaunch)
# Optimized for retina-class 2x displays, like 13" 2.8K, 27" 5K, 32" 6K.
env = GDK_SCALE,2
diff --git a/config/kitty/kitty.conf b/config/kitty/kitty.conf
index 5e2faf17..88413ad7 100644
--- a/config/kitty/kitty.conf
+++ b/config/kitty/kitty.conf
@@ -13,7 +13,8 @@ show_window_resize_notification no
confirm_os_window_close 0
# Keybindings
-map F11 toggle_fullscreen
+map ctrl+insert copy_to_clipboard
+map shift+insert paste_from_clipboard
# Allow remote access
single_instance yes
@@ -23,7 +24,7 @@ allow_remote_control yes
cursor_shape block
enable_audio_bell no
-# Minimal Tab bar styling
+# Minimal Tab bar styling
tab_bar_edge bottom
tab_bar_style powerline
tab_powerline_style slanted
diff --git a/config/nvim/lazyvim.json b/config/nvim/lazyvim.json
deleted file mode 100644
index 71fc8325..00000000
--- a/config/nvim/lazyvim.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "extras": [
- "lazyvim.plugins.extras.editor.neo-tree"
- ],
- "install_version": 8,
- "news": {
- "NEWS.md": "10960"
- },
- "version": 8
-}
\ No newline at end of file
diff --git a/config/nvim/lua/plugins/snacks-animated-scrolling-off.lua b/config/nvim/lua/plugins/snacks-animated-scrolling-off.lua
deleted file mode 100644
index cbb0a58e..00000000
--- a/config/nvim/lua/plugins/snacks-animated-scrolling-off.lua
+++ /dev/null
@@ -1,8 +0,0 @@
-return {
- "folke/snacks.nvim",
- opts = {
- scroll = {
- enabled = false, -- Disable scrolling animations
- },
- },
-}
diff --git a/config/nvim/lua/plugins/theme.lua b/config/nvim/lua/plugins/theme.lua
deleted file mode 100644
index dad2d30b..00000000
--- a/config/nvim/lua/plugins/theme.lua
+++ /dev/null
@@ -1,8 +0,0 @@
-return {
- {
- "LazyVim/LazyVim",
- opts = {
- colorscheme = "tokyonight",
- },
- },
-}
diff --git a/config/nvim/plugin/after/transparency.lua b/config/nvim/plugin/after/transparency.lua
deleted file mode 100644
index d0090f07..00000000
--- a/config/nvim/plugin/after/transparency.lua
+++ /dev/null
@@ -1,45 +0,0 @@
--- transparent background
-vim.api.nvim_set_hl(0, "Normal", { bg = "none" })
-vim.api.nvim_set_hl(0, "NormalFloat", { bg = "none" })
-vim.api.nvim_set_hl(0, "FloatBorder", { bg = "none" })
-vim.api.nvim_set_hl(0, "Pmenu", { bg = "none" })
-vim.api.nvim_set_hl(0, "Terminal", { bg = "none" })
-vim.api.nvim_set_hl(0, "EndOfBuffer", { bg = "none" })
-vim.api.nvim_set_hl(0, "FoldColumn", { bg = "none" })
-vim.api.nvim_set_hl(0, "Folded", { bg = "none" })
-vim.api.nvim_set_hl(0, "SignColumn", { bg = "none" })
-vim.api.nvim_set_hl(0, "NormalNC", { bg = "none" })
-vim.api.nvim_set_hl(0, "WhichKeyFloat", { bg = "none" })
-vim.api.nvim_set_hl(0, "TelescopeBorder", { bg = "none" })
-vim.api.nvim_set_hl(0, "TelescopeNormal", { bg = "none" })
-vim.api.nvim_set_hl(0, "TelescopePromptBorder", { bg = "none" })
-vim.api.nvim_set_hl(0, "TelescopePromptTitle", { bg = "none" })
-
--- transparent background for neotree
-vim.api.nvim_set_hl(0, "NeoTreeNormal", { bg = "none" })
-vim.api.nvim_set_hl(0, "NeoTreeNormalNC", { bg = "none" })
-vim.api.nvim_set_hl(0, "NeoTreeVertSplit", { bg = "none" })
-vim.api.nvim_set_hl(0, "NeoTreeWinSeparator", { bg = "none" })
-vim.api.nvim_set_hl(0, "NeoTreeEndOfBuffer", { bg = "none" })
-
--- transparent background for nvim-tree
-vim.api.nvim_set_hl(0, "NvimTreeNormal", { bg = "none" })
-vim.api.nvim_set_hl(0, "NvimTreeVertSplit", { bg = "none" })
-vim.api.nvim_set_hl(0, "NvimTreeEndOfBuffer", { bg = "none" })
-
--- transparent notify background
-vim.api.nvim_set_hl(0, "NotifyINFOBody", { bg = "none" })
-vim.api.nvim_set_hl(0, "NotifyERRORBody", { bg = "none" })
-vim.api.nvim_set_hl(0, "NotifyWARNBody", { bg = "none" })
-vim.api.nvim_set_hl(0, "NotifyTRACEBody", { bg = "none" })
-vim.api.nvim_set_hl(0, "NotifyDEBUGBody", { bg = "none" })
-vim.api.nvim_set_hl(0, "NotifyINFOTitle", { bg = "none" })
-vim.api.nvim_set_hl(0, "NotifyERRORTitle", { bg = "none" })
-vim.api.nvim_set_hl(0, "NotifyWARNTitle", { bg = "none" })
-vim.api.nvim_set_hl(0, "NotifyTRACETitle", { bg = "none" })
-vim.api.nvim_set_hl(0, "NotifyDEBUGTitle", { bg = "none" })
-vim.api.nvim_set_hl(0, "NotifyINFOBorder", { bg = "none" })
-vim.api.nvim_set_hl(0, "NotifyERRORBorder", { bg = "none" })
-vim.api.nvim_set_hl(0, "NotifyWARNBorder", { bg = "none" })
-vim.api.nvim_set_hl(0, "NotifyTRACEBorder", { bg = "none" })
-vim.api.nvim_set_hl(0, "NotifyDEBUGBorder", { bg = "none" })
diff --git a/config/omarchy/hooks/font-set.sample b/config/omarchy/hooks/font-set.sample
new file mode 100644
index 00000000..36d8c3ec
--- /dev/null
+++ b/config/omarchy/hooks/font-set.sample
@@ -0,0 +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.
+
+# Example: Show the name of the theme that was just set.
+# notify-send "New font" "Your new font is $1"
diff --git a/config/omarchy/hooks/post-update.sample b/config/omarchy/hooks/post-update.sample
new file mode 100644
index 00000000..486352e5
--- /dev/null
+++ b/config/omarchy/hooks/post-update.sample
@@ -0,0 +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.
+
+# Example: Show notification after the system has been updated.
+# notify-send "Update Performed" "Your system is now up to date"
diff --git a/config/omarchy/hooks/theme-set.sample b/config/omarchy/hooks/theme-set.sample
new file mode 100644
index 00000000..b2a5fe1d
--- /dev/null
+++ b/config/omarchy/hooks/theme-set.sample
@@ -0,0 +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.
+
+# Example: Show the name of the theme that was just set.
+# notify-send "New theme" "Your new theme is $1"
diff --git a/config/systemd/user/omarchy-battery-monitor.service b/config/systemd/user/omarchy-battery-monitor.service
index 3c47283b..6e2e8e99 100644
--- a/config/systemd/user/omarchy-battery-monitor.service
+++ b/config/systemd/user/omarchy-battery-monitor.service
@@ -5,4 +5,5 @@ After=graphical-session.target
[Service]
Type=oneshot
ExecStart=%h/.local/share/omarchy/bin/omarchy-battery-monitor
-Environment=DISPLAY=:0
\ No newline at end of file
+Environment=DISPLAY=:0
+LogLevelMax=warning
diff --git a/config/uwsm/default b/config/uwsm/default
index c072e320..fa7f656d 100644
--- a/config/uwsm/default
+++ b/config/uwsm/default
@@ -1,4 +1,4 @@
-# Changes require a relaunch of Hyprland to take effect.
+# Changes require a restart to take effect.
export TERMINAL=alacritty
export EDITOR=nvim
diff --git a/config/uwsm/env b/config/uwsm/env
index 4fbfa76c..065fcdac 100644
--- a/config/uwsm/env
+++ b/config/uwsm/env
@@ -1,4 +1,4 @@
-# Changes require a relaunch of Hyprland to take effect.
+# Changes require a restart to take effect.
# Ensure Omarchy bins are in the path
export OMARCHY_PATH=$HOME/.local/share/omarchy
diff --git a/config/walker/config.toml b/config/walker/config.toml
index cfd79aab..85a86a12 100644
--- a/config/walker/config.toml
+++ b/config/walker/config.toml
@@ -1,100 +1,145 @@
-close_when_open = true
-theme = "omarchy-default"
-theme_base = []
-theme_location = ["~/.local/share/omarchy/default/walker/themes/"]
-hotreload_theme = true
-force_keyboard_focus = true
-timeout = 60
+force_keyboard_focus = true # forces keyboard forcus to stay in Walker
+close_when_open = true # close walker when invoking while already opened
+selection_wrap = true # wrap list if at bottom or top
+click_to_close = true # closes walker if clicking outside of the main content area
+global_argument_delimiter = "#" # query: firefox#https://benz.dev => part after delimiter will be ignored when querying. this should be the same as in the elephant config
+exact_search_prefix = "'" # disable fuzzy searching
+theme = "omarchy-default" # theme to use
+disable_mouse = false # disable mouse (on input and list only)
+additional_theme_location = "~/.local/share/omarchy/default/walker/themes/"
-[keys.ai]
-run_last_response = ["ctrl e"]
+[shell]
+anchor_top = true
+anchor_bottom = true
+anchor_left = true
+anchor_right = true
-[list]
-max_entries = 200
-cycle = true
+[placeholders]
+"default" = { input = " Search...", list = "No Results" } # placeholders for input and empty list, key is the providers name, so f.e. "desktopapplications" or "menus:other"
-[search]
-placeholder = " Search..."
+[keybinds]
+close = ["Escape"]
+next = ["Down"]
+previous = ["Up"]
+toggle_exact = ["ctrl e"]
+resume_last_query = ["ctrl r"]
+quick_activate = []
-[builtins.hyprland_keybinds]
-path = "~/.config/hypr/hyprland.conf"
-hidden = true
+[providers]
+default = [
+ "desktopapplications",
+ "menus",
+ "websearch",
+] # providers to be queried by default
+empty = ["desktopapplications"] # providers to be queried when query is empty
+max_results = 50 # global max results
-[builtins.applications]
-launch_prefix = "uwsm app -- "
-placeholder = " Search..."
-prioritize_new = false
-context_aware = false
-show_sub_when_single = false
-history = false
-icon = ""
-hidden = true
+[providers.sets] # define your own defaults/empty sets of providers
+[providers.max_results_provider] # define max results per provider in here
-[builtins.applications.actions]
-enabled = false
-hide_category = true
+[[providers.prefixes]]
+prefix = "/"
+provider = "providerlist"
-[builtins.bookmarks]
-hidden = true
-
-[[builtins.bookmarks.entries]]
-label = "Omarchy - Github"
-url = "https://github.com/basecamp/omarchy"
-keywords = ["omarchy", "github"]
-
-[[builtins.bookmarks.entries]]
-label = "Omarchy Manual"
-url = "https://manuals.omamix.org/2/the-omarchy-manual"
-keywords = ["omarchy"]
-
-[builtins.calc]
-name = "Calculator"
-icon = ""
-min_chars = 3
-prefix = "="
-
-[builtins.windows]
-switcher_only = true
-hidden = true
-
-[builtins.clipboard]
-hidden = true
-
-[builtins.commands]
-hidden = true
-
-[builtins.custom_commands]
-hidden = true
-
-[builtins.emojis]
-name = "Emojis"
-icon = ""
-prefix = ":"
-
-[builtins.symbols]
-after_copy = ""
-hidden = true
-
-[builtins.finder]
-use_fd = true
-cmd_alt = "xdg-open $(dirname ~/%RESULT%)"
-icon = "file"
-name = "Finder"
-preview_images = true
-hidden = false
+[[providers.prefixes]]
prefix = "."
+provider = "files"
-[builtins.runner]
-shell_config = ""
-switcher_only = true
-hidden = true
+[[providers.prefixes]]
+prefix = ":"
+provider = "symbols"
-[builtins.ssh]
-hidden = true
+[[providers.prefixes]]
+prefix = "="
+provider = "calc"
-[builtins.websearch]
-switcher_only = true
-hidden = true
+[[providers.prefixes]]
+prefix = "@"
+provider = "websearch"
-[builtins.translation]
-hidden = true
+[[providers.prefixes]]
+prefix = "$"
+provider = "clipboard"
+
+[providers.actions] # This will be MERGED/OVEWRITTEN with what the user specifies
+dmenu = [{ action = "select", default = true, bind = "Return" }]
+
+providerlist = [
+ { action = "activate", default = true, bind = "Return", after = "ClearReload" },
+]
+
+bluetooth = [
+ { action = "find", global = true, bind = "ctrl f", after = "AsyncClearReload" },
+ { action = "trust", bind = "ctrl t", after = "AsyncReload" },
+ { action = "untrust", bind = "ctrl t", after = "AsyncReload" },
+ { action = "pair", bind = "Return", after = "AsyncReload" },
+ { action = "remove", bind = "ctrl d", after = "AsyncReload" },
+ { action = "connect", bind = "Return", after = "AsyncReload" },
+ { action = "disconnect", bind = "Return", after = "AsyncReload" },
+]
+
+archlinuxpkgs = [
+ { action = "install", bind = "Return", default = true },
+ { action = "remove", bind = "Return" },
+]
+
+calc = [
+ { action = "copy", default = true, bind = "Return" },
+ { action = "delete", bind = "ctrl d", after = "AsyncReload" },
+ { action = "save", bind = "ctrl s", after = "AsyncClearReload" },
+]
+
+websearch = [
+ { action = "search", default = true, bind = "Return" },
+ { action = "erase_history", label = "clear hist", bind = "ctrl h", after = "Reload" },
+]
+
+desktopapplications = [
+ { action = "start", default = true, bind = "Return" },
+ { action = "start:keep", label = "open+next", bind = "shift Return", after = "KeepOpen" },
+ { action = "erase_history", label = "clear hist", bind = "ctrl h", after = "AsyncReload" },
+ { action = "pin", bind = "ctrl p", after = "AsyncReload" },
+ { action = "unpin", bind = "ctrl p", after = "AsyncReload" },
+ { action = "pinup", bind = "ctrl n", after = "AsyncReload" },
+ { action = "pindown", bind = "ctrl m", after = "AsyncReload" },
+]
+
+files = [
+ { action = "open", default = true, bind = "Return" },
+ { action = "opendir", label = "open dir", bind = "ctrl Return" },
+ { action = "copypath", label = "copy path", bind = "ctrl shift c" },
+ { action = "copyfile", label = "copy file", bind = "ctrl c" },
+]
+
+todo = [
+ { action = "save", default = true, bind = "Return", after = "ClearReload" },
+ { action = "delete", bind = "ctrl d", after = "ClearReload" },
+ { action = "active", bind = "Return", after = "ClearReload" },
+ { action = "inactive", bind = "Return", after = "ClearReload" },
+ { action = "done", bind = "ctrl f", after = "ClearReload" },
+ { action = "clear", bind = "ctrl x", after = "ClearReload", global = true },
+]
+
+runner = [
+ { action = "run", default = true, bind = "Return" },
+ { action = "runterminal", label = "run in terminal", bind = "shift Return" },
+ { action = "erase_history", label = "clear hist", bind = "ctrl h", after = "Reload" },
+]
+
+symbols = [
+ { action = "run_cmd", label = "select", default = true, bind = "Return" },
+ { action = "erase_history", label = "clear hist", bind = "ctrl h", after = "Reload" },
+]
+
+unicode = [
+ { action = "run_cmd", label = "select", default = true, bind = "Return" },
+ { action = "erase_history", label = "clear hist", bind = "ctrl h", after = "Reload" },
+]
+
+clipboard = [
+ { action = "copy", default = true, bind = "Return" },
+ { action = "remove", bind = "ctrl d", after = "ClearReload" },
+ { action = "remove_all", global = true, label = "clear", bind = "ctrl shift d", after = "ClearReload" },
+ { action = "toggle_images", global = true, label = "toggle images", bind = "ctrl i", after = "ClearReload" },
+ { action = "edit", bind = "ctrl o" },
+]
diff --git a/config/waybar/config.jsonc b/config/waybar/config.jsonc
index adb981ae..8fe19a3c 100644
--- a/config/waybar/config.jsonc
+++ b/config/waybar/config.jsonc
@@ -61,7 +61,7 @@
"format": "{:L%A %H:%M}",
"format-alt": "{:L%d %B W%V %Y}",
"tooltip": false,
- "on-click-right": "omarchy-cmd-tzupdate"
+ "on-click-right": "omarchy-launch-floating-terminal-with-presentation omarchy-tz-select"
},
"network": {
"format-icons": ["", "", "", "", ""],
@@ -122,7 +122,7 @@
"modules": ["custom/expand-icon", "tray"]
},
"custom/expand-icon": {
- "format": " ",
+ "format": "",
"tooltip": false
},
"custom/screenrecording-indicator": {
@@ -133,6 +133,6 @@
},
"tray": {
"icon-size": 12,
- "spacing": 12
+ "spacing": 17
}
}
diff --git a/config/waybar/style.css b/config/waybar/style.css
index 2cf371b3..f2b1e9fe 100644
--- a/config/waybar/style.css
+++ b/config/waybar/style.css
@@ -7,7 +7,7 @@
border: none;
border-radius: 0;
min-height: 0;
- font-family: CaskaydiaMono Nerd Font;
+ font-family: 'CaskaydiaMono Nerd Font';
font-size: 12px;
}
@@ -30,11 +30,8 @@
opacity: 0.5;
}
-#tray,
#cpu,
#battery,
-#network,
-#bluetooth,
#pulseaudio,
#custom-omarchy,
#custom-screenrecording-indicator,
@@ -43,8 +40,20 @@
margin: 0 7.5px;
}
+#tray {
+ margin-right: 16px;
+}
+
+#bluetooth {
+ margin-right: 17px;
+}
+
+#network {
+ margin-right: 13px;
+}
+
#custom-expand-icon {
- margin-right: 7px;
+ margin-right: 20px;
}
tooltip {
diff --git a/default/hypr/apps.conf b/default/hypr/apps.conf
index 6b4ebbbd..354339de 100644
--- a/default/hypr/apps.conf
+++ b/default/hypr/apps.conf
@@ -12,3 +12,4 @@ source = ~/.local/share/omarchy/default/hypr/apps/steam.conf
source = ~/.local/share/omarchy/default/hypr/apps/system.conf
source = ~/.local/share/omarchy/default/hypr/apps/terminals.conf
source = ~/.local/share/omarchy/default/hypr/apps/walker.conf
+source = ~/.local/share/omarchy/default/hypr/apps/webcam-overlay.conf
diff --git a/default/hypr/apps/browser.conf b/default/hypr/apps/browser.conf
index 1ff18150..cf9ae193 100644
--- a/default/hypr/apps/browser.conf
+++ b/default/hypr/apps/browser.conf
@@ -1,5 +1,5 @@
# Browser types
-windowrule = tag +chromium-based-browser, class:([cC]hrom(e|ium)|[bB]rave-browser|Microsoft-edge|Vivaldi-stable)
+windowrule = tag +chromium-based-browser, class:((google-)?[cC]hrom(e|ium)|[bB]rave-browser|Microsoft-edge|Vivaldi-stable|helium)
windowrule = tag +firefox-based-browser, class:([fF]irefox|zen|librewolf)
# Force chromium-based browsers into a tile to deal with --app bug
diff --git a/default/hypr/apps/system.conf b/default/hypr/apps/system.conf
index cfbfe5ee..fbddc65c 100644
--- a/default/hypr/apps/system.conf
+++ b/default/hypr/apps/system.conf
@@ -5,6 +5,7 @@ windowrule = size 800 600, tag:floating-window
windowrule = tag +floating-window, class:(blueberry.py|Impala|Wiremix|org.gnome.NautilusPreviewer|com.gabm.satty|Omarchy|About|TUI.float)
windowrule = tag +floating-window, class:(xdg-desktop-portal-gtk|sublime_text|DesktopEditors|org.gnome.Nautilus), title:^(Open.*Files?|Open [F|f]older.*|Save.*Files?|Save.*As|Save|All Files)
+windowrule = float, class:org.gnome.Calculator
# Fullscreen screensaver
windowrule = fullscreen, class:Screensaver
diff --git a/default/hypr/apps/webcam-overlay.conf b/default/hypr/apps/webcam-overlay.conf
new file mode 100644
index 00000000..eca1c751
--- /dev/null
+++ b/default/hypr/apps/webcam-overlay.conf
@@ -0,0 +1,6 @@
+# Webcam overlay for screen recording
+windowrule = float, title:WebcamOverlay
+windowrule = pin, title:WebcamOverlay
+windowrule = noinitialfocus, title:WebcamOverlay
+windowrule = nodim, title:WebcamOverlay
+windowrule = move 100%-w-40 100%-w-40, title:WebcamOverlay # There's a typo in the hyprland rule so 100%-w on the height param is actually correct here
diff --git a/default/hypr/autostart.conf b/default/hypr/autostart.conf
index 5c2f60b1..43cd3000 100644
--- a/default/hypr/autostart.conf
+++ b/default/hypr/autostart.conf
@@ -1,10 +1,10 @@
-exec-once = uwsm app -- hypridle
-exec-once = uwsm app -- mako
-exec-once = uwsm app -- waybar
-exec-once = uwsm app -- fcitx5
-exec-once = uwsm app -- swaybg -i ~/.config/omarchy/current/background -m fill
-exec-once = uwsm app -- swayosd-server
-exec-once = uwsm app -- walker --gapplication-service &
+exec-once = uwsm-app -- hypridle
+exec-once = uwsm-app -- mako
+exec-once = uwsm-app -- waybar
+exec-once = uwsm-app -- fcitx5
+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 = wl-clip-persist --clipboard regular --all-mime-type-regex '^(?!x-kde-passwordManagerHint).+'
exec-once = omarchy-cmd-first-run
+exec-once = uwsm-app -- elephant
+exec-once = uwsm-app -- walker --gapplication-service
diff --git a/default/hypr/bindings.conf b/default/hypr/bindings.conf
index 2927eb34..20fee804 100644
--- a/default/hypr/bindings.conf
+++ b/default/hypr/bindings.conf
@@ -1,6 +1,6 @@
# Deprecated bindings file. New installations include everything directly.
-bindd = SUPER, return, Terminal, exec, $terminal
+bindd = SUPER, RETURN, Terminal, exec, $terminal
bindd = SUPER, F, File manager, exec, $fileManager
bindd = SUPER, B, Web browser, exec, $browser
bindd = SUPER, M, Music player, exec, $music
@@ -9,7 +9,7 @@ bindd = SUPER, T, Top, exec, $terminal -e btop
bindd = SUPER, D, Lazy Docker, exec, $terminal -e lazydocker
bindd = SUPER, G, Messenger, exec, $messenger
bindd = SUPER, O, Obsidian, exec, obsidian -disable-gpu
-bindd = SUPER, slash, Password manager, exec, $passwordManager
+bindd = SUPER, SLASH, Password manager, exec, $passwordManager
source = ~/.local/share/omarchy/default/hypr/bindings/media.conf
source = ~/.local/share/omarchy/default/hypr/bindings/tiling.conf
diff --git a/default/hypr/bindings/clipboard.conf b/default/hypr/bindings/clipboard.conf
new file mode 100644
index 00000000..7d08d920
--- /dev/null
+++ b/default/hypr/bindings/clipboard.conf
@@ -0,0 +1,5 @@
+# Copy / Paste
+bind = SUPER, C, sendshortcut, CTRL, Insert,
+bind = SUPER, V, sendshortcut, SHIFT, Insert,
+bind = SUPER, X, sendshortcut, CTRL, X,
+bindd = SUPER CTRL, V, Clipboard, exec, omarchy-launch-walker -m clipboard
diff --git a/default/hypr/bindings/tiling-v2.conf b/default/hypr/bindings/tiling-v2.conf
new file mode 100644
index 00000000..85f60216
--- /dev/null
+++ b/default/hypr/bindings/tiling-v2.conf
@@ -0,0 +1,92 @@
+# Close windows
+bindd = SUPER, W, Close active window, killactive,
+bindd = CTRL ALT, DELETE, Close all Windows, exec, omarchy-cmd-close-all-windows
+
+# Control tiling
+bindd = SUPER, J, Toggle split, togglesplit, # dwindle
+bindd = SUPER, P, Pseudo window, pseudo, # dwindle
+bindd = SUPER, T, Toggle floating, togglefloating,
+bindd = SUPER, F, Force full screen, fullscreen, 0
+bindd = SUPER ALT, F, Full width, fullscreen, 1
+
+# Move focus with SUPER + arrow keys
+bindd = SUPER, LEFT, Move focus left, movefocus, l
+bindd = SUPER, RIGHT, Move focus right, movefocus, r
+bindd = SUPER, UP, Move focus up, movefocus, u
+bindd = SUPER, DOWN, Move focus down, movefocus, d
+
+# Switch workspaces with SUPER + [0-9]
+bindd = SUPER, code:10, Switch to workspace 1, workspace, 1
+bindd = SUPER, code:11, Switch to workspace 2, workspace, 2
+bindd = SUPER, code:12, Switch to workspace 3, workspace, 3
+bindd = SUPER, code:13, Switch to workspace 4, workspace, 4
+bindd = SUPER, code:14, Switch to workspace 5, workspace, 5
+bindd = SUPER, code:15, Switch to workspace 6, workspace, 6
+bindd = SUPER, code:16, Switch to workspace 7, workspace, 7
+bindd = SUPER, code:17, Switch to workspace 8, workspace, 8
+bindd = SUPER, code:18, Switch to workspace 9, workspace, 9
+bindd = SUPER, code:19, Switch to workspace 10, workspace, 10
+
+# Move active window to a workspace with SUPER + SHIFT + [0-9]
+bindd = SUPER SHIFT, code:10, Move window to workspace 1, movetoworkspace, 1
+bindd = SUPER SHIFT, code:11, Move window to workspace 2, movetoworkspace, 2
+bindd = SUPER SHIFT, code:12, Move window to workspace 3, movetoworkspace, 3
+bindd = SUPER SHIFT, code:13, Move window to workspace 4, movetoworkspace, 4
+bindd = SUPER SHIFT, code:14, Move window to workspace 5, movetoworkspace, 5
+bindd = SUPER SHIFT, code:15, Move window to workspace 6, movetoworkspace, 6
+bindd = SUPER SHIFT, code:16, Move window to workspace 7, movetoworkspace, 7
+bindd = SUPER SHIFT, code:17, Move window to workspace 8, movetoworkspace, 8
+bindd = SUPER SHIFT, code:18, Move window to workspace 9, movetoworkspace, 9
+bindd = SUPER SHIFT, code:19, Move window to workspace 10, movetoworkspace, 10
+
+# TAB between workspaces
+bindd = SUPER, TAB, Next workspace, workspace, e+1
+bindd = SUPER SHIFT, TAB, Previous workspace, workspace, e-1
+bindd = SUPER CTRL, TAB, Former workspace, workspace, previous
+
+# Swap active window with the one next to it with SUPER + SHIFT + arrow keys
+bindd = SUPER SHIFT, LEFT, Swap window to the left, swapwindow, l
+bindd = SUPER SHIFT, RIGHT, Swap window to the right, swapwindow, r
+bindd = SUPER SHIFT, UP, Swap window up, swapwindow, u
+bindd = SUPER SHIFT, DOWN, Swap window down, swapwindow, d
+
+# Cycle through applications on active workspace
+bindd = ALT, TAB, Cycle to next window, cyclenext
+bindd = ALT SHIFT, TAB, Cycle to prev window, cyclenext, prev
+bindd = ALT, TAB, Reveal active window on top, bringactivetotop
+bindd = ALT SHIFT, TAB, Reveal active window on top, bringactivetotop
+
+# Resize active window
+bindd = SUPER, code:20, Expand window left, resizeactive, -100 0 # - key
+bindd = SUPER, code:21, Shrink window left, resizeactive, 100 0 # = key
+bindd = SUPER SHIFT, code:20, Shrink window up, resizeactive, 0 -100
+bindd = SUPER SHIFT, code:21, Expand window down, resizeactive, 0 100
+
+# Scroll through existing workspaces with SUPER + scroll
+bindd = SUPER, MOUSE_DOWN, Scroll active workspace forward, workspace, e+1
+bindd = SUPER, MOUSE_UP, Scroll active workspace backward, workspace, e-1
+
+# Move/resize windows with mainMod + LMB/RMB and dragging
+bindmd = SUPER, mouse:272, Move window, movewindow
+bindmd = SUPER, mouse:273, Resize window, resizewindow
+
+# Toggle groups
+bindd = SUPER, G, Toggle window grouping, togglegroup
+bindd = SUPER ALT, G, Move active window out of group, moveoutofgroup
+
+# Join groups
+bindd = SUPER ALT, LEFT, Move window to group on left, moveintogroup, l
+bindd = SUPER ALT, RIGHT, Move window to group on right, moveintogroup, r
+bindd = SUPER ALT, UP, Move window to group on top, moveintogroup, u
+bindd = SUPER ALT, DOWN, Move window to group on bottom, moveintogroup, d
+
+# Navigate a single set of grouped windows
+bindd = SUPER ALT, TAB, Next window in group, changegroupactive, f
+bindd = SUPER ALT SHIFT, TAB, Previous window in group, changegroupactive, b
+
+# Activate window in a group by number
+bindd = SUPER ALT, 1, Switch to group window 1, changegroupactive, 1
+bindd = SUPER ALT, 2, Switch to group window 2, changegroupactive, 2
+bindd = SUPER ALT, 3, Switch to group window 3, changegroupactive, 3
+bindd = SUPER ALT, 4, Switch to group window 4, changegroupactive, 4
+bindd = SUPER ALT, 5, Switch to group window 5, changegroupactive, 5
diff --git a/default/hypr/bindings/tiling.conf b/default/hypr/bindings/tiling.conf
index ff2437b9..f0c0190b 100644
--- a/default/hypr/bindings/tiling.conf
+++ b/default/hypr/bindings/tiling.conf
@@ -1,3 +1,6 @@
+# This is now a deprecated file meant for those who did not wish to learn the latest Omarchy hotkeys.
+# Do not make changes here, but bring them to tiling-v2.conf instead.
+
# Close windows
bindd = SUPER, W, Close active window, killactive,
bindd = CTRL ALT, DELETE, Close all Windows, exec, omarchy-cmd-close-all-windows
@@ -5,15 +8,15 @@ bindd = CTRL ALT, DELETE, Close all Windows, exec, omarchy-cmd-close-all-windows
# Control tiling
bindd = SUPER, J, Toggle split, togglesplit, # dwindle
bindd = SUPER, P, Pseudo window, pseudo, # dwindle
-bindd = SUPER, V, Toggle floating, togglefloating,
+bindd = SUPER SHIFT, V, Toggle floating, togglefloating,
bindd = SHIFT, F11, Force full screen, fullscreen, 0
bindd = ALT, F11, Full width, fullscreen, 1
# Move focus with SUPER + arrow keys
-bindd = SUPER, left, Move focus left, movefocus, l
-bindd = SUPER, right, Move focus right, movefocus, r
-bindd = SUPER, up, Move focus up, movefocus, u
-bindd = SUPER, down, Move focus down, movefocus, d
+bindd = SUPER, LEFT, Move focus left, movefocus, l
+bindd = SUPER, RIGHT, Move focus right, movefocus, r
+bindd = SUPER, UP, Move focus up, movefocus, u
+bindd = SUPER, DOWN, Move focus down, movefocus, d
# Switch workspaces with SUPER + [0-9]
bindd = SUPER, code:10, Switch to workspace 1, workspace, 1
@@ -39,22 +42,22 @@ bindd = SUPER SHIFT, code:17, Move window to workspace 8, movetoworkspace, 8
bindd = SUPER SHIFT, code:18, Move window to workspace 9, movetoworkspace, 9
bindd = SUPER SHIFT, code:19, Move window to workspace 10, movetoworkspace, 10
-# Tab between workspaces
+# TAB between workspaces
bindd = SUPER, TAB, Next workspace, workspace, e+1
bindd = SUPER SHIFT, TAB, Previous workspace, workspace, e-1
bindd = SUPER CTRL, TAB, Former workspace, workspace, previous
# Swap active window with the one next to it with SUPER + SHIFT + arrow keys
-bindd = SUPER SHIFT, left, Swap window to the left, swapwindow, l
-bindd = SUPER SHIFT, right, Swap window to the right, swapwindow, r
-bindd = SUPER SHIFT, up, Swap window up, swapwindow, u
-bindd = SUPER SHIFT, down, Swap window down, swapwindow, d
+bindd = SUPER SHIFT, LEFT, Swap window to the left, swapwindow, l
+bindd = SUPER SHIFT, RIGHT, Swap window to the right, swapwindow, r
+bindd = SUPER SHIFT, UP, Swap window up, swapwindow, u
+bindd = SUPER SHIFT, DOWN, Swap window down, swapwindow, d
# Cycle through applications on active workspace
-bindd = ALT, Tab, Cycle to next window, cyclenext
-bindd = ALT SHIFT, Tab, Cycle to prev window, cyclenext, prev
-bindd = ALT, Tab, Reveal active window on top, bringactivetotop
-bindd = ALT SHIFT, Tab, Reveal active window on top, bringactivetotop
+bindd = ALT, TAB, Cycle to next window, cyclenext
+bindd = ALT SHIFT, TAB, Cycle to prev window, cyclenext, prev
+bindd = ALT, TAB, Reveal active window on top, bringactivetotop
+bindd = ALT SHIFT, TAB, Reveal active window on top, bringactivetotop
# Resize active window
bindd = SUPER, code:20, Expand window left, resizeactive, -100 0 # - key
@@ -63,8 +66,8 @@ bindd = SUPER SHIFT, code:20, Shrink window up, resizeactive, 0 -100
bindd = SUPER SHIFT, code:21, Expand window down, resizeactive, 0 100
# Scroll through existing workspaces with SUPER + scroll
-bindd = SUPER, mouse_down, Scroll active workspace forward, workspace, e+1
-bindd = SUPER, mouse_up, Scroll active workspace backward, workspace, e-1
+bindd = SUPER, MOUSE_DOWN, Scroll active workspace forward, workspace, e+1
+bindd = SUPER, MOUSE_UP, Scroll active workspace backward, workspace, e-1
# Move/resize windows with mainMod + LMB/RMB and dragging
bindmd = SUPER, mouse:272, Move window, movewindow
diff --git a/default/hypr/bindings/utilities.conf b/default/hypr/bindings/utilities.conf
index c8b3efdb..ed44654e 100644
--- a/default/hypr/bindings/utilities.conf
+++ b/default/hypr/bindings/utilities.conf
@@ -1,6 +1,6 @@
# Menus
-bindd = SUPER, SPACE, Launch apps, exec, walker -p "Start…"
-bindd = SUPER CTRL, E, Emoji picker, exec, walker -m Emojis
+bindd = SUPER, SPACE, Launch apps, exec, omarchy-launch-walker
+bindd = SUPER CTRL, E, Emoji picker, exec, omarchy-launch-walker -m symbols
bindd = SUPER ALT, SPACE, Omarchy menu, exec, omarchy-menu
bindd = SUPER, ESCAPE, Power menu, exec, omarchy-menu system
bindld = , XF86PowerOff, Power menu, exec, omarchy-menu system
@@ -29,19 +29,11 @@ bindd = CTRL, F1, Apple Display brightness down, exec, omarchy-cmd-apple-display
bindd = CTRL, F2, Apple Display brightness up, exec, omarchy-cmd-apple-display-brightness +5000
bindd = SHIFT CTRL, F2, Apple Display full brightness, exec, omarchy-cmd-apple-display-brightness +60000
-# Screenshots
-bindd = , PRINT, Screenshot of region, exec, omarchy-cmd-screenshot
-bindd = SHIFT, PRINT, Screenshot of window, exec, omarchy-cmd-screenshot window
-bindd = CTRL, PRINT, Screenshot of display, exec, omarchy-cmd-screenshot output
-
-# Screen recordings
-bindd = ALT, PRINT, Screen record a region, exec, omarchy-cmd-screenrecord region
-bindd = ALT SHIFT, PRINT, Screen record a region with audio, exec, omarchy-cmd-screenrecord region audio
-bindd = CTRL ALT, PRINT, Screen record display, exec, omarchy-cmd-screenrecord output
-bindd = CTRL ALT SHIFT, PRINT, Screen record display with audio, exec, omarchy-cmd-screenrecord output audio
-
-# Color picker
-bindd = SUPER, PRINT, Color picker, exec, pkill hyprpicker || hyprpicker -a
+# Captures
+bindd = , PRINT, Screenshot, exec, omarchy-cmd-screenshot
+bindd = SHIFT, PRINT, Screenshot, exec, omarchy-cmd-screenshot smart clipboard
+bindd = ALT, PRINT, Screenrecording, exec, omarchy-menu screenrecord
+bindd = SUPER, PRINT, Color picking, exec, pkill hyprpicker || hyprpicker -a
# File sharing
bindd = CTRL SUPER, S, Share, exec, omarchy-menu share
diff --git a/default/hypr/looknfeel.conf b/default/hypr/looknfeel.conf
index 9b8f3077..823a1121 100644
--- a/default/hypr/looknfeel.conf
+++ b/default/hypr/looknfeel.conf
@@ -1,5 +1,9 @@
# Refer to https://wiki.hyprland.org/Configuring/Variables/
+# Variables
+$activeBorderColor = rgba(33ccffee) rgba(00ff99ee) 45deg
+$inactiveBorderColor = rgba(595959aa)
+
# https://wiki.hyprland.org/Configuring/Variables/#general
general {
gaps_in = 5
@@ -8,8 +12,8 @@ general {
border_size = 2
# https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors
- col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
- col.inactive_border = rgba(595959aa)
+ 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
@@ -35,12 +39,41 @@ decoration {
blur {
enabled = true
size = 3
- passes = 1
-
- vibrancy = 0.1696
+ passes = 3
}
}
+# https://wiki.hypr.land/Configuring/Variables/#group
+group {
+ col.border_active = $activeBorderColor
+ col.border_inactive = $inactiveBorderColor
+ col.border_locked_active = -1
+ col.border_locked_inactive = -1
+
+ groupbar {
+ font_size = 12
+ font_family = monospace
+ font_weight_active = ultraheavy
+ font_weight_inactive = normal
+
+ indicator_height = 0
+ indicator_gap = 5
+ height = 22
+ gaps_in = 5
+ gaps_out = 0
+
+ text_color = rgb(ffffff)
+ text_color_inactive = rgba(ffffff90)
+ col.active = rgba(00000040)
+ col.inactive = rgba(00000020)
+
+ gradients = true
+ gradient_rounding = 0
+ gradient_round_only_edges = false
+ }
+}
+
+
# https://wiki.hyprland.org/Configuring/Variables/#animations
animations {
enabled = yes, please :)
@@ -86,6 +119,7 @@ misc {
disable_hyprland_logo = true
disable_splash_rendering = true
focus_on_activate = true
+ anr_missed_pings = 3
}
# https://wiki.hypr.land/Configuring/Variables/#cursor
diff --git a/default/mako/core.ini b/default/mako/core.ini
index 05f60534..927d8d40 100644
--- a/default/mako/core.ini
+++ b/default/mako/core.ini
@@ -1,7 +1,11 @@
anchor=top-right
default-timeout=5000
width=420
-height=110
+outer-margin=20
+padding=10,15
+border-size=2
+max-icon-size=32
+font=sans-serif 14px
[app-name=Spotify]
invisible=1
@@ -20,3 +24,6 @@ on-button-left=exec sh -c 'omarchy-notification-dismiss "Setup Wi-Fi"; omarchy-l
[summary~="Update System"]
on-button-left=exec sh -c 'omarchy-notification-dismiss "Update System"; omarchy-launch-floating-terminal-with-presentation omarchy-update'
+
+[summary~="Learn Keybindings"]
+on-button-left=exec sh -c 'omarchy-notification-dismiss "Learn Keybindings"; omarchy-menu-keybindings'
diff --git a/default/walker/themes/dmenu_150.css b/default/walker/themes/dmenu_150.css
deleted file mode 100644
index 14bafe7a..00000000
--- a/default/walker/themes/dmenu_150.css
+++ /dev/null
@@ -1,2 +0,0 @@
-@import url("file://~/.local/share/omarchy/default/walker/themes/omarchy-default.css");
-@import url("file://~/.config/omarchy/current/theme/walker.css");
diff --git a/default/walker/themes/dmenu_150.toml b/default/walker/themes/dmenu_150.toml
deleted file mode 100644
index 3c139976..00000000
--- a/default/walker/themes/dmenu_150.toml
+++ /dev/null
@@ -1,10 +0,0 @@
-[ui.window.box]
-width = 150
-
-[ui.window.box.scroll.list]
-max_width = 150
-min_width = 150
-width = 150
-
-[ui.window.box.search]
-hide = false
diff --git a/default/walker/themes/dmenu_250.css b/default/walker/themes/dmenu_250.css
deleted file mode 100644
index 14bafe7a..00000000
--- a/default/walker/themes/dmenu_250.css
+++ /dev/null
@@ -1,2 +0,0 @@
-@import url("file://~/.local/share/omarchy/default/walker/themes/omarchy-default.css");
-@import url("file://~/.config/omarchy/current/theme/walker.css");
diff --git a/default/walker/themes/dmenu_250.toml b/default/walker/themes/dmenu_250.toml
deleted file mode 100644
index b9ffc1e7..00000000
--- a/default/walker/themes/dmenu_250.toml
+++ /dev/null
@@ -1,11 +0,0 @@
-[ui.window.box]
-width = 250
-
-[ui.window.box.scroll.list]
-max_width = 250
-min_width = 250
-width = 250
-max_height = 600
-
-[ui.window.box.search]
-hide = false
diff --git a/default/walker/themes/keybindings.css b/default/walker/themes/keybindings.css
deleted file mode 100644
index 14bafe7a..00000000
--- a/default/walker/themes/keybindings.css
+++ /dev/null
@@ -1,2 +0,0 @@
-@import url("file://~/.local/share/omarchy/default/walker/themes/omarchy-default.css");
-@import url("file://~/.config/omarchy/current/theme/walker.css");
diff --git a/default/walker/themes/keybindings.toml b/default/walker/themes/keybindings.toml
deleted file mode 100644
index c5d1b78d..00000000
--- a/default/walker/themes/keybindings.toml
+++ /dev/null
@@ -1,48 +0,0 @@
-[ui.window.box]
-width = 964
-min_width = 964
-max_width = 964
-
-height = 664
-min_height = 664
-max_height = 664
-
-[ui.window.box.search]
-hide = false
-
-[ui.window.box.scroll]
-v_align = "fill"
-h_align = "fill"
-min_width = 964
-width = 964
-max_width = 964
-min_height = 664
-height = 664
-max_height = 664
-
-[ui.window.box.scroll.list]
-v_align = "fill"
-h_align = "fill"
-min_width = 900
-width = 900
-max_width = 900
-min_height = 600
-height = 600
-max_height = 600
-
-[ui.window.box.scroll.list.item]
-h_align = "fill"
-min_width = 900
-width = 900
-max_width = 900
-
-[ui.window.box.scroll.list.item.activation_label]
-hide = true
-
-[ui.window.box.scroll.list.placeholder]
-v_align = "start"
-h_align = "fill"
-hide = false
-min_width = 900
-width = 900
-max_width = 900
diff --git a/default/walker/themes/omarchy-default.css b/default/walker/themes/omarchy-default.css
deleted file mode 100644
index 6e453b6e..00000000
--- a/default/walker/themes/omarchy-default.css
+++ /dev/null
@@ -1,169 +0,0 @@
-/* Reset all elements */
-#window,
-#box,
-#search,
-#password,
-#input,
-#prompt,
-#clear,
-#typeahead,
-#list,
-child,
-scrollbar,
-slider,
-#item,
-#text,
-#label,
-#sub,
-#activationlabel {
- all: unset;
-}
-
-* {
- font-family: monospace;
- font-size: 18px;
-}
-
-/* Window */
-#window {
- background: transparent;
- color: @text;
-}
-
-/* Main box container */
-#box {
- background: alpha(@base, 0.95);
- padding: 20px;
- border: 2px solid @border;
- border-radius: 0px;
-}
-
-/* Search container */
-#search {
- background: @base;
- padding: 10px;
- margin-bottom: 0;
-}
-
-/* Hide prompt icon */
-#prompt {
- opacity: 0;
- min-width: 0;
- margin: 0;
-}
-
-/* Hide clear button */
-#clear {
- opacity: 0;
- min-width: 0;
-}
-
-/* Input field */
-#input {
- background: none;
- color: @text;
- padding: 0;
-}
-
-#input placeholder {
- opacity: 0.5;
- color: @text;
-}
-
-/* Hide typeahead */
-#typeahead {
- opacity: 0;
-}
-
-/* List */
-#list {
- background: transparent;
-}
-
-/* List items */
-child {
- padding: 0px 12px;
- background: transparent;
- border-radius: 0;
-}
-
-child:selected,
-child:hover {
- background: transparent;
-}
-
-/* Item layout */
-#item {
- padding: 0;
-}
-
-#item.active {
- font-style: italic;
-}
-
-/* Icon */
-#icon {
- margin-right: 10px;
- -gtk-icon-transform: scale(0.7);
-}
-
-/* Text */
-#text {
- color: @text;
- padding: 14px 0;
-}
-
-#label {
- font-weight: normal;
-}
-
-/* Selected state */
-child:selected #text,
-child:selected #label,
-child:hover #text,
-child:hover #label {
- color: @selected-text;
-}
-
-/* Hide sub text */
-#sub {
- opacity: 0;
- font-size: 0;
- min-height: 0;
-}
-
-/* Hide activation label */
-#activationlabel {
- opacity: 0;
- min-width: 0;
-}
-
-/* Scrollbar styling */
-scrollbar {
- opacity: 0;
-}
-
-/* Hide spinner */
-#spinner {
- opacity: 0;
-}
-
-/* Hide AI elements */
-#aiScroll,
-#aiList,
-.aiItem {
- opacity: 0;
- min-height: 0;
-}
-
-/* Bar entry (switcher) */
-#bar {
- opacity: 0;
- min-height: 0;
-}
-
-.barentry {
- opacity: 0;
-}
-
-@import url("file://~/.config/omarchy/current/theme/walker.css");
diff --git a/default/walker/themes/omarchy-default.toml b/default/walker/themes/omarchy-default.toml
deleted file mode 100644
index 9abc5d8f..00000000
--- a/default/walker/themes/omarchy-default.toml
+++ /dev/null
@@ -1,16 +0,0 @@
-[ui.window.box]
-width = 664
-min_width = 664
-max_width = 664
-height = 396
-min_height = 396
-max_height = 396
-
-# List constraints are critical - without these, the window shrinks when empty
-[ui.window.box.scroll.list]
-height = 300
-min_height = 300
-max_height = 300
-
-[ui.window.box.scroll.list.item.icon]
-pixel_size = 40
diff --git a/default/walker/themes/omarchy-default/layout.xml b/default/walker/themes/omarchy-default/layout.xml
new file mode 100644
index 00000000..a79de744
--- /dev/null
+++ b/default/walker/themes/omarchy-default/layout.xml
@@ -0,0 +1,129 @@
+
+
+
+
+
diff --git a/default/walker/themes/omarchy-default/style.css b/default/walker/themes/omarchy-default/style.css
new file mode 100644
index 00000000..f4bbd082
--- /dev/null
+++ b/default/walker/themes/omarchy-default/style.css
@@ -0,0 +1,117 @@
+@import "../../../../../../../.config/omarchy/current/theme/walker.css";
+
+* {
+ all: unset;
+}
+
+* {
+ font-family: monospace;
+ font-size: 18px;
+ color: @text;
+}
+
+scrollbar {
+ opacity: 0;
+}
+
+.normal-icons {
+ -gtk-icon-size: 16px;
+}
+
+.large-icons {
+ -gtk-icon-size: 32px;
+}
+
+.box-wrapper {
+ background: alpha(@base, 0.95);
+ padding: 20px;
+ border: 2px solid @border;
+}
+
+.preview-box {
+}
+
+.box {
+}
+
+.search-container {
+ background: @base;
+ padding: 10px;
+}
+
+.input placeholder {
+ opacity: 0.5;
+}
+
+.input {
+}
+
+.input:focus,
+.input:active {
+ box-shadow: none;
+ outline: none;
+}
+
+.content-container {
+}
+
+.placeholder {
+}
+
+.scroll {
+}
+
+.list {
+}
+
+child,
+child > * {
+}
+
+child:hover .item-box {
+}
+
+child:selected .item-box {
+}
+
+child:selected .item-box * {
+ color: @selected-text;
+}
+
+.item-box {
+ padding-left: 14px;
+}
+
+.item-text-box {
+ all: unset;
+ padding: 14px 0;
+}
+
+.item-text {
+}
+
+.item-subtext {
+ font-size: 0px;
+ min-height: 0px;
+ margin: 0px;
+ padding: 0px;
+}
+
+.item-image {
+ margin-right: 14px;
+ -gtk-icon-transform: scale(0.9);
+}
+
+.current {
+ font-style: italic;
+}
+
+.keybind-hints {
+ background: @background;
+ padding: 10px;
+ margin-top: 10px;
+}
+
+.preview {
+ background: @background;
+}
diff --git a/default/waybar/indicators/screen-recording.sh b/default/waybar/indicators/screen-recording.sh
index d0d00822..bb6cf93c 100755
--- a/default/waybar/indicators/screen-recording.sh
+++ b/default/waybar/indicators/screen-recording.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-if pgrep -x wl-screenrec >/dev/null || pgrep -x wf-recorder >/dev/null; then
+if pgrep -f "gpu-screen-recorder" >/dev/null; then
echo '{"text": "", "tooltip": "Stop recording", "class": "active"}'
else
echo '{"text": ""}'
diff --git a/install/config/all.sh b/install/config/all.sh
index a9affb79..2304d8e9 100644
--- a/install/config/all.sh
+++ b/install/config/all.sh
@@ -14,6 +14,8 @@ 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/localdb.sh
+run_logged $OMARCHY_INSTALL/config/walker-elephant.sh
+run_logged $OMARCHY_INSTALL/config/fast-shutdown.sh
run_logged $OMARCHY_INSTALL/config/sudoless-asdcontrol.sh
run_logged $OMARCHY_INSTALL/config/hardware/network.sh
run_logged $OMARCHY_INSTALL/config/hardware/set-wireless-regdom.sh
@@ -24,6 +26,7 @@ run_logged $OMARCHY_INSTALL/config/hardware/usb-autosuspend.sh
run_logged $OMARCHY_INSTALL/config/hardware/ignore-power-button.sh
run_logged $OMARCHY_INSTALL/config/hardware/nvidia.sh
run_logged $OMARCHY_INSTALL/config/hardware/fix-f13-amd-audio-input.sh
-run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-bcm43xx.sh
+run_logged $OMARCHY_INSTALL/config/hardware/fix-bcm43xx.sh
run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-spi-keyboard.sh
+run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-suspend-nvme.sh
run_logged $OMARCHY_INSTALL/config/hardware/fix-apple-t2.sh
diff --git a/install/config/fast-shutdown.sh b/install/config/fast-shutdown.sh
new file mode 100644
index 00000000..bbbfafdc
--- /dev/null
+++ b/install/config/fast-shutdown.sh
@@ -0,0 +1,7 @@
+sudo mkdir -p /etc/systemd/system.conf.d
+
+cat </dev/null || true)
+
+if [[ "$MACBOOK_MODEL" =~ MacBook(8,1|9,1|10,1)|MacBookPro13,[123]|MacBookPro14,[123] ]]; then
+ echo "Detected MacBook model: $MACBOOK_MODEL"
+
+ NVME_DEVICE="/sys/bus/pci/devices/0000:01:00.0/d3cold_allowed"
+
+ if [[ -f "$NVME_DEVICE" ]]; then
+ echo "Applying NVMe suspend fix..."
+
+ cat </dev/null
+[Unit]
+Description=Omarchy NVMe Suspend Fix for MacBook
+
+[Service]
+ExecStart=/bin/bash -c 'echo 0 > /sys/bus/pci/devices/0000\:01\:00.0/d3cold_allowed'
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+ chrootable_systemctl_enable omarchy-nvme-suspend-fix.service
+ sudo systemctl daemon-reload
+ else
+ echo "Warning: NVMe device not found at expected PCI address (0000:01:00.0)"
+ echo "This fix may not be needed for this MacBook model"
+ fi
+fi
diff --git a/install/config/hardware/fix-bcm43xx.sh b/install/config/hardware/fix-bcm43xx.sh
new file mode 100644
index 00000000..5078f69e
--- /dev/null
+++ b/install/config/hardware/fix-bcm43xx.sh
@@ -0,0 +1,10 @@
+# Install Wi-Fi drivers for Broadcom chips found in some MacBooks, as well as other systems:
+# - BCM4360 (2013–2015 MacBooks)
+# - BCM4331 (2012, early 2013 MacBooks)
+
+pci_info=$(lspci -nnv)
+
+if (echo "$pci_info" | grep -q "14e4:43a0" || echo "$pci_info" | grep -q "14e4:4331"); then
+ echo "BCM4360 / BCM4331 detected"
+ sudo pacman -S --noconfirm --needed broadcom-wl dkms linux-headers
+fi
diff --git a/install/config/hardware/printer.sh b/install/config/hardware/printer.sh
index 781a9871..244368e6 100644
--- a/install/config/hardware/printer.sh
+++ b/install/config/hardware/printer.sh
@@ -6,7 +6,7 @@ echo -e "[Resolve]\nMulticastDNS=no" | sudo tee /etc/systemd/resolved.conf.d/10-
chrootable_systemctl_enable avahi-daemon.service
# Enable mDNS resolution for .local domains
-sudo sed -i 's/^hosts:.*/hosts: mymachines mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns/' /etc/nsswitch.conf
+sudo sed -i 's/^hosts:.*/hosts: mymachines mdns_minimal [NOTFOUND=return] resolve files myhostname dns/' /etc/nsswitch.conf
# Enable automatically adding remote printers
if ! grep -q '^CreateRemotePrinters Yes' /etc/cups/cups-browsed.conf; then
diff --git a/install/config/lazyvim.sh b/install/config/lazyvim.sh
deleted file mode 100644
index 325f6310..00000000
--- a/install/config/lazyvim.sh
+++ /dev/null
@@ -1 +0,0 @@
-omarchy-lazyvim-setup
diff --git a/install/config/mimetypes.sh b/install/config/mimetypes.sh
index 48bb8cfa..ee662f55 100644
--- a/install/config/mimetypes.sh
+++ b/install/config/mimetypes.sh
@@ -33,3 +33,6 @@ xdg-mime default mpv.desktop video/x-ms-asf
xdg-mime default mpv.desktop video/x-ogm+ogg
xdg-mime default mpv.desktop video/x-theora+ogg
xdg-mime default mpv.desktop application/ogg
+
+# Use Hey for mailto: links
+xdg-mime default HEY.desktop x-scheme-handler/mailto
diff --git a/install/config/mise-work.sh b/install/config/mise-work.sh
index 15d71923..64ba12d0 100644
--- a/install/config/mise-work.sh
+++ b/install/config/mise-work.sh
@@ -7,3 +7,19 @@ _.path = "{{ cwd }}/bin"
EOF
mise trust ~/Work/.mise.toml
+
+if [[ -n "${OMARCHY_CHROOT_INSTALL:-}" ]]; then
+ NODE_TARBALL=$(find /opt/packages -name "node-v*-linux-x64.tar.gz" -type f 2>/dev/null | head -n1)
+
+ NODE_VERSION=$(basename "$NODE_TARBALL" | sed 's/node-v\(.*\)-linux-x64.tar.gz/\1/')
+ NODE_INSTALL_DIR="$HOME/.local/share/mise/installs/node/$NODE_VERSION"
+
+ mkdir -p "$NODE_INSTALL_DIR"
+ tar -xzf "$NODE_TARBALL" \
+ --strip-components=1 \
+ -C "$NODE_INSTALL_DIR"
+
+ mise use -g node@"$NODE_VERSION"
+else
+ mise use -g node@latest
+fi
diff --git a/install/config/sudoless-asdcontrol.sh b/install/config/sudoless-asdcontrol.sh
index 120c6fc2..5ae03563 100644
--- a/install/config/sudoless-asdcontrol.sh
+++ b/install/config/sudoless-asdcontrol.sh
@@ -1,3 +1,3 @@
# Setup sudo-less controls for controlling brightness on Apple Displays
-echo "$USER ALL=(ALL) NOPASSWD: /usr/local/bin/asdcontrol" | sudo tee /etc/sudoers.d/asdcontrol
+echo "$USER ALL=(ALL) NOPASSWD: /usr/bin/asdcontrol" | sudo tee /etc/sudoers.d/asdcontrol
sudo chmod 440 /etc/sudoers.d/asdcontrol
diff --git a/install/config/theme.sh b/install/config/theme.sh
index a0a6a694..e88cc748 100644
--- a/install/config/theme.sh
+++ b/install/config/theme.sh
@@ -12,7 +12,7 @@ ln -snf ~/.config/omarchy/themes/tokyo-night ~/.config/omarchy/current/theme
ln -snf ~/.config/omarchy/current/theme/backgrounds/1-scenery-pink-lakeside-sunset-lake-landscape-scenic-panorama-7680x3215-144.png ~/.config/omarchy/current/background
# Set specific app links for current theme
-ln -snf ~/.config/omarchy/current/theme/neovim.lua ~/.config/nvim/lua/plugins/theme.lua
+# ~/.config/omarchy/current/theme/neovim.lua -> ~/.config/nvim/lua/plugins/theme.lua is handled via omarchy-setup-nvim
mkdir -p ~/.config/btop/themes
ln -snf ~/.config/omarchy/current/theme/btop.theme ~/.config/btop/themes/current.theme
diff --git a/install/config/walker-elephant.sh b/install/config/walker-elephant.sh
new file mode 100644
index 00000000..e8e3330f
--- /dev/null
+++ b/install/config/walker-elephant.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+# Create pacman hook to restart walker after updates
+sudo mkdir -p /etc/pacman.d/hooks
+sudo tee /etc/pacman.d/hooks/walker-restart.hook > /dev/null << EOF
+[Trigger]
+Type = Package
+Operation = Upgrade
+Target = walker
+Target = walker-debug
+Target = elephant*
+
+[Action]
+Description = Restarting Walker services after system update
+When = PostTransaction
+Exec = $OMARCHY_PATH/bin/omarchy-restart-walker
+EOF
diff --git a/install/first-run/cleanup-reboot-sudoers.sh b/install/first-run/cleanup-reboot-sudoers.sh
new file mode 100644
index 00000000..ccc9966b
--- /dev/null
+++ b/install/first-run/cleanup-reboot-sudoers.sh
@@ -0,0 +1,3 @@
+if sudo test -f /etc/sudoers.d/99-omarchy-installer-reboot; then
+ sudo rm -f /etc/sudoers.d/99-omarchy-installer-reboot
+fi
diff --git a/install/first-run/dns-resolver.sh b/install/first-run/dns-resolver.sh
new file mode 100644
index 00000000..bf46388a
--- /dev/null
+++ b/install/first-run/dns-resolver.sh
@@ -0,0 +1,4 @@
+# https://wiki.archlinux.org/title/Systemd-resolved
+echo "Symlink resolved stub-resolv to /etc/resolv.conf"
+
+sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
diff --git a/install/first-run/welcome.sh b/install/first-run/welcome.sh
index 3b846610..2da4be2e 100644
--- a/install/first-run/welcome.sh
+++ b/install/first-run/welcome.sh
@@ -1,2 +1,2 @@
notify-send " Update System" "When you have internet, click to update the system." -u critical
-notify-send "👋 Welcome to Omarchy" "You're in for a great computing adventure. Have fun!" -t 30000
+notify-send " Learn Keybindings" "Super + K for cheatsheet.\nSuper + Space for application launcher.\nSuper + Alt + Space for Omarchy Menu." -u critical
diff --git a/install/first-run/wifi.sh b/install/first-run/wifi.sh
index 9d391f1e..d645a5c3 100644
--- a/install/first-run/wifi.sh
+++ b/install/first-run/wifi.sh
@@ -1,3 +1,3 @@
if ! ping -c3 -W1 1.1.1.1 >/dev/null 2>&1; then
- notify-send " Click to Setup Wi-Fi" "Tab between sections, space selects, ? for help." -u critical -t 30000
+ notify-send " Click to Setup Wi-Fi" "Tab to navigate, Space to select, ? for help." -u critical -t 30000
fi
diff --git a/install/login/all.sh b/install/login/all.sh
index e4be282f..2c03df32 100644
--- a/install/login/all.sh
+++ b/install/login/all.sh
@@ -1,4 +1,4 @@
run_logged $OMARCHY_INSTALL/login/plymouth.sh
+run_logged $OMARCHY_INSTALL/login/default-keyring.sh
+run_logged $OMARCHY_INSTALL/login/sddm.sh
run_logged $OMARCHY_INSTALL/login/limine-snapper.sh
-run_logged $OMARCHY_INSTALL/login/enable-mkinitcpio.sh
-run_logged $OMARCHY_INSTALL/login/alt-bootloaders.sh
diff --git a/install/login/alt-bootloaders.sh b/install/login/alt-bootloaders.sh
deleted file mode 100644
index bb35d9b0..00000000
--- a/install/login/alt-bootloaders.sh
+++ /dev/null
@@ -1,115 +0,0 @@
-if ! command -v limine &>/dev/null; then
- # Add kernel hooks
- if ! grep -Eq '^HOOKS=.*plymouth' /etc/mkinitcpio.conf; then
- # Backup original mkinitcpio.conf just in case
- backup_timestamp=$(date +"%Y%m%d%H%M%S")
- sudo cp /etc/mkinitcpio.conf "/etc/mkinitcpio.conf.bak.${backup_timestamp}"
-
- # Add plymouth to HOOKS array after 'base udev' or 'base systemd'
- if grep "^HOOKS=" /etc/mkinitcpio.conf | grep -q "base systemd"; then
- sudo sed -i '/^HOOKS=/s/base systemd/base systemd plymouth/' /etc/mkinitcpio.conf
- elif grep "^HOOKS=" /etc/mkinitcpio.conf | grep -q "base udev"; then
- sudo sed -i '/^HOOKS=/s/base udev/base udev plymouth/' /etc/mkinitcpio.conf
- else
- echo "Couldn't add the Plymouth hook"
- fi
-
- # Regenerate initramfs
- sudo mkinitcpio -P
- fi
-
- # Add kernel parameters for Plymouth
- if [ -d "/boot/loader/entries" ]; then # systemd-boot
- echo "Detected systemd-boot"
-
- for entry in /boot/loader/entries/*.conf; do
- if [ -f "$entry" ]; then
- # Skip fallback entries
- if [[ "$(basename "$entry")" == *"fallback"* ]]; then
- echo "Skipped: $(basename "$entry") (fallback entry)"
- continue
- fi
-
- # Skip if splash it already present for some reason
- if ! grep -q "splash" "$entry"; then
- sudo sed -i '/^options/ s/$/ splash quiet/' "$entry"
- else
- echo "Skipped: $(basename "$entry") (splash already present)"
- fi
- fi
- done
- elif [ -f "/etc/default/grub" ]; then # Grub
- echo "Detected grub"
-
- # Backup GRUB config before modifying
- backup_timestamp=$(date +"%Y%m%d%H%M%S")
- sudo cp /etc/default/grub "/etc/default/grub.bak.${backup_timestamp}"
-
- # Check if splash is already in GRUB_CMDLINE_LINUX_DEFAULT
- if ! grep -q "GRUB_CMDLINE_LINUX_DEFAULT.*splash" /etc/default/grub; then
- # Get current GRUB_CMDLINE_LINUX_DEFAULT value
- current_cmdline=$(grep "^GRUB_CMDLINE_LINUX_DEFAULT=" /etc/default/grub | cut -d'"' -f2)
-
- # Add splash and quiet if not present
- new_cmdline="$current_cmdline"
- if [[ ! "$current_cmdline" =~ splash ]]; then
- new_cmdline="$new_cmdline splash"
- fi
- if [[ ! "$current_cmdline" =~ quiet ]]; then
- new_cmdline="$new_cmdline quiet"
- fi
-
- # Trim any leading/trailing spaces
- new_cmdline=$(echo "$new_cmdline" | xargs)
-
- sudo sed -i "s/^GRUB_CMDLINE_LINUX_DEFAULT=\".*\"/GRUB_CMDLINE_LINUX_DEFAULT=\"$new_cmdline\"/" /etc/default/grub
-
- # Regenerate grub config
- sudo grub-mkconfig -o /boot/grub/grub.cfg
- else
- echo "GRUB already configured with splash kernel parameters"
- fi
- elif [ -d "/etc/cmdline.d" ]; then # UKI
- echo "Detected a UKI setup"
- # Relying on mkinitcpio to assemble a UKI
- # https://wiki.archlinux.org/title/Unified_kernel_image
- if ! grep -q splash /etc/cmdline.d/*.conf; then
- # Need splash, create the omarchy file
- echo "splash" | sudo tee -a /etc/cmdline.d/omarchy.conf
- fi
- if ! grep -q quiet /etc/cmdline.d/*.conf; then
- # Need quiet, create or append the omarchy file
- echo "quiet" | sudo tee -a /etc/cmdline.d/omarchy.conf
- fi
- elif [ -f "/etc/kernel/cmdline" ]; then # UKI Alternate
- # Alternate UKI kernel cmdline location
- echo "Detected a UKI setup"
-
- # Backup kernel cmdline config before modifying
- backup_timestamp=$(date +"%Y%m%d%H%M%S")
- sudo cp /etc/kernel/cmdline "/etc/kernel/cmdline.bak.${backup_timestamp}"
-
- current_cmdline=$(cat /etc/kernel/cmdline)
-
- # Add splash and quiet if not present
- new_cmdline="$current_cmdline"
- if [[ ! "$current_cmdline" =~ splash ]]; then
- new_cmdline="$new_cmdline splash"
- fi
- if [[ ! "$current_cmdline" =~ quiet ]]; then
- new_cmdline="$new_cmdline quiet"
- fi
-
- # Trim any leading/trailing spaces
- new_cmdline=$(echo "$new_cmdline" | xargs)
-
- # Write new file
- echo $new_cmdline | sudo tee /etc/kernel/cmdline
- else
- echo ""
- echo " None of systemd-boot, GRUB, or UKI detected. Please manually add these kernel parameters:"
- echo " - splash (to see the graphical splash screen)"
- echo " - quiet (for silent boot)"
- echo ""
- fi
-fi
diff --git a/install/login/default-keyring.sh b/install/login/default-keyring.sh
new file mode 100644
index 00000000..134fefb6
--- /dev/null
+++ b/install/login/default-keyring.sh
@@ -0,0 +1,22 @@
+KEYRING_DIR="$HOME/.local/share/keyrings"
+KEYRING_FILE="$KEYRING_DIR/Default_keyring.keyring"
+DEFAULT_FILE="$KEYRING_DIR/default"
+
+mkdir -p $KEYRING_DIR
+
+cat << EOF | tee "$KEYRING_FILE"
+[keyring]
+display-name=Default keyring
+ctime=$(date +%s)
+mtime=0
+lock-on-idle=false
+lock-after=false
+EOF
+
+cat << EOF | tee "$DEFAULT_FILE"
+Default_keyring
+EOF
+
+chmod 700 "$KEYRING_DIR"
+chmod 600 "$KEYRING_FILE"
+chmod 644 "$DEFAULT_FILE"
diff --git a/install/login/enable-mkinitcpio.sh b/install/login/enable-mkinitcpio.sh
deleted file mode 100644
index 7422d8db..00000000
--- a/install/login/enable-mkinitcpio.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-echo "Re-enabling mkinitcpio hooks..."
-
-# Restore the specific mkinitcpio pacman hooks
-if [ -f /usr/share/libalpm/hooks/90-mkinitcpio-install.hook.disabled ]; then
- sudo mv /usr/share/libalpm/hooks/90-mkinitcpio-install.hook.disabled /usr/share/libalpm/hooks/90-mkinitcpio-install.hook
-fi
-
-if [ -f /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook.disabled ]; then
- sudo mv /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook.disabled /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook
-fi
-
-echo "mkinitcpio hooks re-enabled"
-
-if command -v limine &>/dev/null; then
- sudo limine-update
-else
- sudo mkinitcpio -P
-fi
diff --git a/install/login/limine-snapper.sh b/install/login/limine-snapper.sh
index 2d9dc292..6a037207 100644
--- a/install/login/limine-snapper.sh
+++ b/install/login/limine-snapper.sh
@@ -1,4 +1,6 @@
if command -v limine &>/dev/null; then
+ sudo pacman -S --noconfirm --needed limine-snapper-sync limine-mkinitcpio-hook
+
sudo tee /etc/mkinitcpio.conf.d/omarchy_hooks.conf </dev/null
HOOKS=(base udev plymouth keyboard autodetect microcode modconf kms keymap consolefont block encrypt filesystems fsck btrfs-overlayfs)
EOF
@@ -34,6 +36,7 @@ KERNEL_CMDLINE[default]="$CMDLINE"
KERNEL_CMDLINE[default]+="quiet splash"
ENABLE_UKI=yes
+CUSTOM_UKI_NAME="omarchy"
ENABLE_LIMINE_FALLBACK=yes
@@ -75,7 +78,6 @@ term_background_bright: 24283b
EOF
- sudo pacman -S --noconfirm --needed limine-snapper-sync limine-mkinitcpio-hook
# Match Snapper configs if not installing from the ISO
if [[ -z ${OMARCHY_CHROOT_INSTALL:-} ]]; then
@@ -96,13 +98,39 @@ EOF
chrootable_systemctl_enable limine-snapper-sync.service
fi
-# Add UKI entry to UEFI machines to skip bootloader showing on normal boot
-if [[ -n $EFI ]] && efibootmgr &>/dev/null && ! efibootmgr | grep -q Omarchy &&
+echo "Re-enabling mkinitcpio hooks..."
+
+# Restore the specific mkinitcpio pacman hooks
+if [ -f /usr/share/libalpm/hooks/90-mkinitcpio-install.hook.disabled ]; then
+ sudo mv /usr/share/libalpm/hooks/90-mkinitcpio-install.hook.disabled /usr/share/libalpm/hooks/90-mkinitcpio-install.hook
+fi
+
+if [ -f /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook.disabled ]; then
+ sudo mv /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook.disabled /usr/share/libalpm/hooks/60-mkinitcpio-remove.hook
+fi
+
+echo "mkinitcpio hooks re-enabled"
+
+sudo limine-update
+
+if [[ -n $EFI ]] && efibootmgr &>/dev/null; then
+ # Remove the archinstall-created Limine entry
+ while IFS= read -r bootnum; do
+ sudo efibootmgr -b "$bootnum" -B >/dev/null 2>&1
+ done < <(efibootmgr | grep -E "^Boot[0-9]{4}\*? Arch Linux Limine" | sed 's/^Boot\([0-9]\{4\}\).*/\1/')
+fi
+
+if [[ -n $EFI ]] && efibootmgr &>/dev/null &&
! cat /sys/class/dmi/id/bios_vendor 2>/dev/null | grep -qi "American Megatrends" &&
! cat /sys/class/dmi/id/bios_vendor 2>/dev/null | grep -qi "Apple"; then
- sudo efibootmgr --create \
- --disk "$(findmnt -n -o SOURCE /boot | sed 's/p\?[0-9]*$//')" \
- --part "$(findmnt -n -o SOURCE /boot | grep -o 'p\?[0-9]*$' | sed 's/^p//')" \
- --label "Omarchy" \
- --loader "\\EFI\\Linux\\$(cat /etc/machine-id)_linux.efi"
+
+ uki_file=$(find /boot/EFI/Linux/ -name "omarchy*.efi" -printf "%f\n" 2>/dev/null | head -1)
+
+ if [[ -n "$uki_file" ]]; then
+ sudo efibootmgr --create \
+ --disk "$(findmnt -n -o SOURCE /boot | sed 's/p\?[0-9]*$//')" \
+ --part "$(findmnt -n -o SOURCE /boot | grep -o 'p\?[0-9]*$' | sed 's/^p//')" \
+ --label "Omarchy" \
+ --loader "\\EFI\\Linux\\$uki_file"
+ fi
fi
diff --git a/install/login/plymouth.sh b/install/login/plymouth.sh
index 72102f27..fad64fe2 100644
--- a/install/login/plymouth.sh
+++ b/install/login/plymouth.sh
@@ -1,151 +1,4 @@
-# Hyprland launched via UWSM and login directly as user, rely on disk encryption + hyprlock for security
-
-# ==============================================================================
-# PLYMOUTH SETUP
-# ==============================================================================
-
if [ "$(plymouth-set-default-theme)" != "omarchy" ]; then
sudo cp -r "$HOME/.local/share/omarchy/default/plymouth" /usr/share/plymouth/themes/omarchy/
sudo plymouth-set-default-theme omarchy
fi
-
-# ==============================================================================
-# SEAMLESS LOGIN
-# ==============================================================================
-
-if [ ! -x /usr/local/bin/seamless-login ]; then
- # Compile the seamless login helper -- needed to prevent seeing terminal between loader and desktop
- cat <<'CCODE' >/tmp/seamless-login.c
-/*
-* Seamless Login - Minimal SDDM-style Plymouth transition
-* Replicates SDDM's VT management for seamless auto-login
-*/
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-int main(int argc, char *argv[]) {
- int vt_fd;
- int vt_num = 1; // TTY1
- char vt_path[32];
-
- if (argc < 2) {
- fprintf(stderr, "Usage: %s \n", argv[0]);
- return 1;
- }
-
- // Open the VT (simple approach like SDDM)
- snprintf(vt_path, sizeof(vt_path), "/dev/tty%d", vt_num);
- vt_fd = open(vt_path, O_RDWR);
- if (vt_fd < 0) {
- perror("Failed to open VT");
- return 1;
- }
-
- // Activate the VT
- if (ioctl(vt_fd, VT_ACTIVATE, vt_num) < 0) {
- perror("VT_ACTIVATE failed");
- close(vt_fd);
- return 1;
- }
-
- // Wait for VT to be active
- if (ioctl(vt_fd, VT_WAITACTIVE, vt_num) < 0) {
- perror("VT_WAITACTIVE failed");
- close(vt_fd);
- return 1;
- }
-
- // Critical: Set graphics mode to prevent console text
- if (ioctl(vt_fd, KDSETMODE, KD_GRAPHICS) < 0) {
- perror("KDSETMODE KD_GRAPHICS failed");
- close(vt_fd);
- return 1;
- }
-
- // Clear VT and close (like SDDM does)
- const char *clear_seq = "\33[H\33[2J";
- if (write(vt_fd, clear_seq, strlen(clear_seq)) < 0) {
- perror("Failed to clear VT");
- }
-
- close(vt_fd);
-
- // Set working directory to user's home
- const char *home = getenv("HOME");
- if (home) chdir(home);
-
- // Now execute the session command
- execvp(argv[1], &argv[1]);
- perror("Failed to exec session");
- return 1;
-}
-CCODE
-
- gcc -o /tmp/seamless-login /tmp/seamless-login.c
- sudo mv /tmp/seamless-login /usr/local/bin/seamless-login
- sudo chmod +x /usr/local/bin/seamless-login
- rm /tmp/seamless-login.c
-fi
-
-if [ ! -f /etc/systemd/system/omarchy-seamless-login.service ]; then
- cat </dev/null </dev/null; then
- systemctl reboot --no-wall 2>/dev/null
+ if [[ -n "${OMARCHY_CHROOT_INSTALL:-}" ]]; then
+ touch /var/tmp/omarchy-install-completed
+ exit 0
else
- reboot 2>/dev/null
+ sudo reboot 2>/dev/null
fi
fi
diff --git a/install/preflight/first-run-mode.sh b/install/preflight/first-run-mode.sh
index 44649496..536058cc 100644
--- a/install/preflight/first-run-mode.sh
+++ b/install/preflight/first-run-mode.sh
@@ -5,9 +5,12 @@ touch ~/.local/state/omarchy/first-run.mode
# Setup sudo-less access for first-run
sudo tee /etc/sudoers.d/first-run >/dev/null </dev/null | grep -q 'Secure Boot: enabled'; then
+ abort "Secure Boot disabled"
+fi
# Must not have Gnome or KDE already install
-pacman -Qe gnome-shell &>/dev/null && abort "Fresh + Vanilla Arch"
-pacman -Qe plasma-desktop &>/dev/null && abort "Fresh + Vanilla Arch"
+if pacman -Qe gnome-shell &>/dev/null || pacman -Qe plasma-desktop &>/dev/null; then
+ abort "Fresh + Vanilla Arch"
+fi
+
+# Must have limine installed
+command -v limine &>/dev/null || abort "Limine bootloader"
+
+# Must have btrfs root filesystem
+[ "$(findmnt -n -o FSTYPE /)" = "btrfs" ] || abort "Btrfs root filesystem"
# Cleared all guards
echo "Guards: OK"
diff --git a/migrations/1751134560.sh b/migrations/1751134560.sh
index d34a2b60..f4267951 100644
--- a/migrations/1751134560.sh
+++ b/migrations/1751134560.sh
@@ -4,12 +4,13 @@ export OMARCHY_PATH="$HOME/.local/share/omarchy"
export PATH="$OMARCHY_PATH/bin:$PATH"
mkdir -p "$HOME/.config/uwsm/"
-omarchy-refresh-config uwsm/env
-
-echo -e "\n\e[31mOmarchy bins have been added to PATH (and OMARCHY_PATH is now system-wide).\nYou must immediately relaunch Hyprland or most Omarchy cmds won't work.\nPlease run Omarchy > Update again after the quick relaunch is complete.\e[0m"
-echo
+cat </dev/null &
+ setsid uwsm-app -- swayosd-server &>/dev/null &
fi
diff --git a/migrations/1753176520.sh b/migrations/1753176520.sh
deleted file mode 100644
index 186b8a76..00000000
--- a/migrations/1753176520.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-echo "Install wf-recorder for screen recording for nvidia"
-
-omarchy-pkg-add wf-recorder
diff --git a/migrations/1753224615.sh b/migrations/1753224615.sh
index cd6c7978..6f9dcfb5 100644
--- a/migrations/1753224615.sh
+++ b/migrations/1753224615.sh
@@ -5,5 +5,5 @@ if [[ ! -d ~/.config/swayosd ]]; then
cp -r ~/.local/share/omarchy/config/swayosd/* ~/.config/swayosd/
pkill swayosd-server
- setsid uwsm app -- swayosd-server &>/dev/null &
+ setsid uwsm-app -- swayosd-server &>/dev/null &
fi
diff --git a/migrations/1755548643.sh b/migrations/1755548643.sh
deleted file mode 100644
index f98b730b..00000000
--- a/migrations/1755548643.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-echo "Install wf-recorder for intel based device"
-
-omarchy-pkg-add wf-recorder
diff --git a/migrations/1755870033.sh b/migrations/1755870033.sh
index fde865be..d7b6e8f9 100644
--- a/migrations/1755870033.sh
+++ b/migrations/1755870033.sh
@@ -1,5 +1,5 @@
echo "Use current terminal shell cwd for new terminal working directories"
if ! grep -q "working-directory" ~/.config/hypr/bindings.conf; then
- sed -i '/bindd = SUPER, return, Terminal, exec, \$terminal/ s|$| --working-directory=$(omarchy-cmd-terminal-cwd)|' ~/.config/hypr/bindings.conf
+ sed -i '/bindd = SUPER, RETURN, Terminal, exec, \$terminal/ s|$| --working-directory=$(omarchy-cmd-terminal-cwd)|' ~/.config/hypr/bindings.conf
fi
diff --git a/migrations/1756060611.sh b/migrations/1756060611.sh
index b1bc95da..67d819b6 100644
--- a/migrations/1756060611.sh
+++ b/migrations/1756060611.sh
@@ -14,7 +14,6 @@ reinstall_package_opr obsidian-bin obsidian
reinstall_package_opr localsend-bin localsend
reinstall_package_opr omarchy-chromium-bin omarchy-chromium
reinstall_package_opr walker-bin
-reinstall_package_opr wl-screenrec
reinstall_package_opr python-terminaltexteffects
reinstall_package_opr tzupdate
reinstall_package_opr typora
diff --git a/migrations/1757361128.sh b/migrations/1757361128.sh
index b6c8413e..0bd0b407 100644
--- a/migrations/1757361128.sh
+++ b/migrations/1757361128.sh
@@ -2,6 +2,6 @@ echo "Enable mDNS resolution for existing Avahi installations"
if systemctl is-enabled avahi-daemon.service >/dev/null 2>&1; then
if ! grep -q "mdns_minimal" /etc/nsswitch.conf; then
- sudo sed -i 's/^hosts:.*/hosts: mymachines mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns/' /etc/nsswitch.conf
+ sudo sed -i 's/^hosts:.*/hosts: mymachines mdns_minimal [NOTFOUND=return] resolve files myhostname dns/' /etc/nsswitch.conf
fi
fi
\ No newline at end of file
diff --git a/migrations/1757535736.sh b/migrations/1757535736.sh
new file mode 100644
index 00000000..25fcd190
--- /dev/null
+++ b/migrations/1757535736.sh
@@ -0,0 +1,9 @@
+echo "Enabling vim keys in btop"
+
+CONFIG_FILE=~/.config/btop/btop.conf
+
+if [[ -f $CONFIG_FILE ]]; then
+ if grep -q "^vim_keys = " "$CONFIG_FILE"; then
+ sed -i 's/^vim_keys = False/vim_keys = True/' "$CONFIG_FILE"
+ fi
+fi
diff --git a/migrations/1757877852.sh b/migrations/1757877852.sh
index a0b88bdd..51ecd105 100644
--- a/migrations/1757877852.sh
+++ b/migrations/1757877852.sh
@@ -2,9 +2,9 @@ echo "Switch select bindings to launch or focus mode"
if [[ -f ~/.config/hypr/bindings.conf ]]; then
sed -i '/SUPER, M, Music, exec/ c\bindd = SUPER, M, Music, exec, omarchy-launch-or-focus spotify' ~/.config/hypr/bindings.conf
- sed -i '/SUPER, O, Obsidian, exec/ c\bindd = SUPER, O, Obsidian, exec, omarchy-launch-or-focus obsidian "uwsm app -- obsidian -disable-gpu --enable-wayland-ime"' ~/.config/hypr/bindings.conf
+ sed -i '/SUPER, O, Obsidian, exec/ c\bindd = SUPER, O, Obsidian, exec, omarchy-launch-or-focus obsidian "uwsm-app -- obsidian -disable-gpu --enable-wayland-ime"' ~/.config/hypr/bindings.conf
- sed -i '/SUPER, G, Signal, exec/ c\bindd = SUPER, G, Signal, exec, omarchy-launch-or-focus signal "uwsm app -- signal-desktop"' ~/.config/hypr/bindings.conf
+ sed -i '/SUPER, G, Signal, exec/ c\bindd = SUPER, G, Signal, exec, omarchy-launch-or-focus signal "uwsm-app -- signal-desktop"' ~/.config/hypr/bindings.conf
sed -i '/SUPER SHIFT, G, WhatsApp, exec/ c\bindd = SUPER SHIFT, G, WhatsApp, exec, omarchy-launch-or-focus-webapp WhatsApp "https://web.whatsapp.com/"' ~/.config/hypr/bindings.conf
sed -i '/SUPER ALT, G, Google Messages, exec/ c\bindd = SUPER ALT, G, Google Messages, exec, omarchy-launch-or-focus-webapp "Google Messages" "https://messages.google.com/web/conversations"' ~/.config/hypr/bindings.conf
fi
diff --git a/migrations/1758019332.sh b/migrations/1758019332.sh
index 003acd56..defe97ab 100644
--- a/migrations/1758019332.sh
+++ b/migrations/1758019332.sh
@@ -3,7 +3,7 @@ echo "Set \$TERMINAL and \$EDITOR in ~/.config/uwsm/default so entire system can
# Set terminal and editor default in uwsm
omarchy-refresh-config uwsm/default
omarchy-refresh-config uwsm/env
-omarchy-state set relaunch-required
+omarchy-state set reboot-required
# Ensure scrolltouchpad setting applies to all terminals
if grep -q "scrolltouchpad 1.5, class:Alacritty" ~/.config/hypr/input.conf; then
@@ -17,5 +17,5 @@ fi
# Use default terminal for keybinding
if grep -q "terminal = uwsm app" ~/.config/hypr/bindings.conf; then
- sed -i '/terminal = uwsm app -- alacritty/ c\$terminal = uwsm app -- $TERMINAL' ~/.config/hypr/bindings.conf
+ sed -i '/terminal = uwsm-app -- alacritty/ c\$terminal = uwsm-app -- $TERMINAL' ~/.config/hypr/bindings.conf
fi
diff --git a/migrations/1758107878.sh b/migrations/1758107878.sh
new file mode 100644
index 00000000..52fe818d
--- /dev/null
+++ b/migrations/1758107878.sh
@@ -0,0 +1,26 @@
+echo "Migrate to Walker 2.0.0"
+
+# Ensure we kill walker even if there's a restarting service running
+kill -9 $(pgrep -x walker)
+
+omarchy-pkg-drop walker-bin walker-bin-debug
+
+omarchy-pkg-add elephant \
+ elephant-calc \
+ elephant-clipboard \
+ elephant-bluetooth \
+ elephant-desktopapplications \
+ elephant-files \
+ elephant-menus \
+ elephant-providerlist \
+ elephant-runner \
+ elephant-symbols \
+ elephant-unicode \
+ elephant-websearch \
+ elephant-todo \
+ walker
+
+source $OMARCHY_PATH/install/config/walker-elephant.sh
+
+rm -rf ~/.config/walker/themes
+omarchy-refresh-walker
diff --git a/migrations/1758142943.sh b/migrations/1758142943.sh
new file mode 100644
index 00000000..ef800abc
--- /dev/null
+++ b/migrations/1758142943.sh
@@ -0,0 +1,21 @@
+echo "Turn off VSCode's own auto-update feature (we rely on pacman)"
+
+# Note: We cannot use `jq` to update settings.json because it’s JSONC (allows comments),
+# which jq doesn’t support.
+
+VS_CODE_SETTINGS="$HOME/.config/Code/User/settings.json"
+
+# If VSCode is installed, ensure that the "update.mode" setting is set to "none"
+if omarchy-cmd-present code; then
+ mkdir -p "$(dirname "$VS_CODE_SETTINGS")"
+
+ if [[ ! -f "$VS_CODE_SETTINGS" ]]; then
+ # If settings.json doesn't exist, create it with just the update.mode setting
+ printf '{\n "update.mode": "none"\n}\n' > "$VS_CODE_SETTINGS"
+ elif ! grep -q '"update.mode"' "$VS_CODE_SETTINGS"; then
+ # Insert "update.mode": "none", immediately after the first "{"
+ # Use sed's first-match range (0,/{/) to only replace the first "{
+ sed -i --follow-symlinks -E '0,/\{/{s/\{/{\
+ "update.mode": "none",/}' "$VS_CODE_SETTINGS"
+ fi
+fi
diff --git a/migrations/1758487660_change_dm_to_sddm.sh b/migrations/1758487660_change_dm_to_sddm.sh
new file mode 100644
index 00000000..3c10c840
--- /dev/null
+++ b/migrations/1758487660_change_dm_to_sddm.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+set -e
+
+error_exit() {
+ echo -e "\033[31mERROR: Migration failed! Manual intervention required.\033[0m" >&2
+ echo -e "\033[31mDO NOT REBOOT - System may be in inconsistent state until the error is fixed.\033[0m" >&2
+ exit 1
+}
+
+trap error_exit ERR
+
+echo "Change display manager to SDDM"
+
+omarchy-pkg-add sddm libsecret gnome-keyring || error_exit
+
+sudo mkdir -p /etc/sddm.conf.d
+
+cat </dev/null 2>&1; then
+ echo -e "\033[31mError: omarchy-seamless-login.service is still enabled\033[0m" >&2
+ error_exit
+fi
+
+if systemctl is-masked plymouth-quit-wait.service >/dev/null 2>&1; then
+ echo -e "\033[31mError: plymouth-quit-wait.service is still masked\033[0m" >&2
+ error_exit
+fi
+
+if ! systemctl is-enabled getty@tty1.service >/dev/null 2>&1; then
+ echo -e "\033[31mError: getty@tty1.service is not enabled\033[0m" >&2
+ error_exit
+fi
+
+if ! systemctl is-enabled sddm.service >/dev/null 2>&1; then
+ echo -e "\033[31mError: sddm.service is not enabled\033[0m" >&2
+ error_exit
+fi
+
+sudo rm -f /usr/local/bin/seamless-login
+sudo rm -f /etc/systemd/system/plymouth-quit.service.d/wait-for-graphical.conf
+sudo rm -f /etc/systemd/system/omarchy-seamless-login.service
diff --git a/migrations/1758487662_move_to_custom_uki.sh b/migrations/1758487662_move_to_custom_uki.sh
new file mode 100644
index 00000000..731bba2a
--- /dev/null
+++ b/migrations/1758487662_move_to_custom_uki.sh
@@ -0,0 +1,38 @@
+echo "Update UKI to custom named entry"
+
+if command -v limine &>/dev/null && [[ -f /etc/default/limine ]]; then
+ if grep -q "^ENABLE_UKI=yes" /etc/default/limine; then
+ if ! grep -q "^CUSTOM_UKI_NAME=" /etc/default/limine; then
+ sudo sed -i '/^ENABLE_UKI=yes/a CUSTOM_UKI_NAME="omarchy"' /etc/default/limine
+ fi
+
+ # Remove the archinstall-created Limine entry
+ while IFS= read -r bootnum; do
+ sudo efibootmgr -b "$bootnum" -B >/dev/null 2>&1
+ done < <(efibootmgr | grep -E "^Boot[0-9]{4}\*? Arch Linux Limine" | sed 's/^Boot\([0-9]\{4\}\).*/\1/')
+
+ sudo limine-update
+
+ uki_file=$(find /boot/EFI/Linux/ -name "omarchy*.efi" -printf "%f\n" 2>/dev/null | head -1)
+
+ if [[ -n "$uki_file" ]]; then
+ while IFS= read -r bootnum; do
+ sudo efibootmgr -b "$bootnum" -B >/dev/null 2>&1
+ done < <(efibootmgr | grep -E "^Boot[0-9]{4}\*? Omarchy" | sed 's/^Boot\([0-9]\{4\}\).*/\1/')
+
+ # Skip EFI entry creation on Apple hardware
+ if ! cat /sys/class/dmi/id/bios_vendor 2>/dev/null | grep -qi "Apple"; then
+ sudo efibootmgr --create \
+ --disk "$(findmnt -n -o SOURCE /boot | sed 's/p\?[0-9]*$//')" \
+ --part "$(findmnt -n -o SOURCE /boot | grep -o 'p\?[0-9]*$' | sed 's/^p//')" \
+ --label "Omarchy" \
+ --loader "\\EFI\\Linux\\$uki_file"
+ fi
+ fi
+ else
+ echo "Not using UKI. Not making any changes."
+ fi
+else
+ echo "Boot config is non-standard. Not making any changes."
+fi
+
diff --git a/migrations/1758562032.sh b/migrations/1758562032.sh
new file mode 100644
index 00000000..5c4c357e
--- /dev/null
+++ b/migrations/1758562032.sh
@@ -0,0 +1,5 @@
+echo "Fix Tailscale split DNS compatibility by removing [!UNAVAIL=return] from nsswitch.conf"
+
+if grep -q '\[!UNAVAIL=return\]' /etc/nsswitch.conf; then
+ sudo sed -i 's/resolve \[!UNAVAIL=return\]/resolve/g' /etc/nsswitch.conf
+fi
\ No newline at end of file
diff --git a/migrations/1758564460.sh b/migrations/1758564460.sh
new file mode 100644
index 00000000..f0b10693
--- /dev/null
+++ b/migrations/1758564460.sh
@@ -0,0 +1,2 @@
+echo "Enable fast shutdown"
+source $OMARCHY_PATH/install/config/fast-shutdown.sh
diff --git a/migrations/1759093827.sh b/migrations/1759093827.sh
new file mode 100644
index 00000000..69cf8963
--- /dev/null
+++ b/migrations/1759093827.sh
@@ -0,0 +1,3 @@
+echo "Adding hidden entries for electron apps"
+
+cp $OMARCHY_PATH/applications/hidden/electron*.desktop ~/.local/share/applications/
diff --git a/migrations/1759270604.sh b/migrations/1759270604.sh
new file mode 100644
index 00000000..dce79803
--- /dev/null
+++ b/migrations/1759270604.sh
@@ -0,0 +1,3 @@
+echo "Update Hyprlock with better placeholder position and show all fail text"
+
+omarchy-refresh-hyprlock
diff --git a/migrations/1759355846.sh b/migrations/1759355846.sh
new file mode 100644
index 00000000..40d0098d
--- /dev/null
+++ b/migrations/1759355846.sh
@@ -0,0 +1,21 @@
+echo "Symlink systemd-resolved to /etc/resolv.conf"
+
+# Backup if /etc/resolv.conf was modified after system birth
+system_birth=$(stat -c %W /)
+resolvconf_modified=$(stat -c %Y /etc/resolv.conf)
+
+# Run a backup if resolv.conf isn't a symlink and was modified after install
+if [[ -s /etc/resolv.conf ]] && [[ ! -L /etc/resolv.conf ]] && [[ $resolvconf_modified > $system_birth ]]; then
+ # Backup the destination file (with timestamp) to avoid clobbering (Ex: resolv.conf.bak.1753817951)
+ backup_file="/etc/resolv.conf.bak.$(date +%s)"
+
+ # Create backup
+ sudo cp -f /etc/resolv.conf "$backup_file" 2>/dev/null
+
+ # Inform users
+ echo -e "\e[31mReplaced /etc/resolv.conf with symlink to systemd-resolved. \nSaved backup as ${backup_file}.\e[0m"
+ echo -e "\e[31mSee https://wiki.archlinux.org/title/Systemd-resolved.\e[0m"
+fi
+
+# Write the symlink
+sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
diff --git a/migrations/1759691413.sh b/migrations/1759691413.sh
new file mode 100644
index 00000000..37fefa7c
--- /dev/null
+++ b/migrations/1759691413.sh
@@ -0,0 +1,5 @@
+echo "Correct path for sudoless asdcontrol for working Apple Display hotkeys"
+
+if [[ $(command -v asdcontrol) == "/usr/bin/asdcontrol" ]]; then
+ echo "$USER ALL=(ALL) NOPASSWD: /usr/bin/asdcontrol" | sudo tee /etc/sudoers.d/asdcontrol
+fi
diff --git a/migrations/1759694076.sh b/migrations/1759694076.sh
new file mode 100644
index 00000000..084d8e2b
--- /dev/null
+++ b/migrations/1759694076.sh
@@ -0,0 +1,4 @@
+echo "Hide OpenJDK applications from app launcher"
+
+cp $OMARCHY_PATH/applications/hidden/*openjdk.desktop ~/.local/share/applications/
+
diff --git a/migrations/1759782459.sh b/migrations/1759782459.sh
new file mode 100644
index 00000000..015fd8e0
--- /dev/null
+++ b/migrations/1759782459.sh
@@ -0,0 +1,3 @@
+echo "Fix opening in nvim from files manager"
+
+cp -f $OMARCHY_PATH/applications/nvim.desktop ~/.local/share/applications/nvim.desktop
diff --git a/migrations/1759895423.sh b/migrations/1759895423.sh
new file mode 100644
index 00000000..fcaeb417
--- /dev/null
+++ b/migrations/1759895423.sh
@@ -0,0 +1,10 @@
+echo "Make shift+insert paste and ctrl+insert copy from clipboard in terminal"
+
+# Add keybindings to Alacritty
+sed -i 's/{ key = "F11", action = "ToggleFullscreen" }/{ key = "F11", action = "ToggleFullscreen" },\n{ key = "Insert", mods = "Shift", action = "Paste" },\n{ key = "Insert", mods = "Control", action = "Copy" }/' ~/.config/alacritty/alacritty.toml
+
+# Add keybindings to Ghostty
+sed -i '/keybind = f11=toggle_fullscreen/a keybind = shift+insert=paste_from_clipboard\nkeybind = control+insert=copy_to_clipboard' ~/.config/ghostty/config
+
+# Add keybindings to Kitty
+sed -i '/map F11 toggle_fullscreen/a map ctrl+insert copy_to_clipboard' ~/.config/kitty/kitty.conf
diff --git a/migrations/1759913695.sh b/migrations/1759913695.sh
new file mode 100644
index 00000000..8ce4ad13
--- /dev/null
+++ b/migrations/1759913695.sh
@@ -0,0 +1,3 @@
+echo "Fix NVMe suspend issues on MacBook models"
+
+bash $OMARCHY_PATH/install/config/hardware/fix-apple-suspend-nvme.sh
diff --git a/migrations/1760144906.sh b/migrations/1760144906.sh
new file mode 100644
index 00000000..4745b187
--- /dev/null
+++ b/migrations/1760144906.sh
@@ -0,0 +1,5 @@
+echo "Change omarchy-screenrecord to use gpu-screen-recorder"
+omarchy-pkg-drop wf-recorder wl-screenrec
+
+# Add slurp in case it hadn't been picked up from an old migration
+omarchy-pkg-add slurp gpu-screen-recorder
diff --git a/migrations/1760301290.sh b/migrations/1760301290.sh
new file mode 100644
index 00000000..b383b6fb
--- /dev/null
+++ b/migrations/1760301290.sh
@@ -0,0 +1,5 @@
+echo "Add the new Flexoki Light theme"
+
+if [[ ! -L ~/.config/omarchy/themes/flexoki-light ]]; then
+ ln -nfs ~/.local/share/omarchy/themes/flexoki-light ~/.config/omarchy/themes/
+fi
diff --git a/migrations/1760304963.sh b/migrations/1760304963.sh
new file mode 100644
index 00000000..e1c519c6
--- /dev/null
+++ b/migrations/1760304963.sh
@@ -0,0 +1,9 @@
+echo "Add a default keyring for gnome-keyring that unlocks on login"
+
+if [ -f "$HOME/.local/share/keyrings/Default_keyring.keyring" ] || [ -f "$HOME/.local/share/keyrings/default" ]; then
+ if gum confirm "Do you want to replace existing keyring with one that's auto-unlocked on login?"; then
+ bash "$OMARCHY_PATH/install/login/default-keyring.sh"
+ fi
+else
+ bash "$OMARCHY_PATH/install/login/default-keyring.sh"
+fi
diff --git a/migrations/1760401344.sh b/migrations/1760401344.sh
new file mode 100644
index 00000000..5e5ca300
--- /dev/null
+++ b/migrations/1760401344.sh
@@ -0,0 +1,15 @@
+echo "Add Chromium crash workaround flag for Hyprland to existing configs"
+
+# Add flag to chromium-flags.conf if it exists and doesn't already have it
+if [[ -f ~/.config/chromium-flags.conf ]]; then
+ if ! grep -qF -- "--disable-features=WaylandWpColorManagerV1" ~/.config/chromium-flags.conf; then
+ sed -i '$a # Chromium crash workaround for Wayland color management on Hyprland - see https://github.com/hyprwm/Hyprland/issues/11957\n--disable-features=WaylandWpColorManagerV1' ~/.config/chromium-flags.conf
+ fi
+fi
+
+# Add flag to brave-flags.conf if it exists and doesn't already have it
+if [[ -f ~/.config/brave-flags.conf ]]; then
+ if ! grep -qF -- "--disable-features=WaylandWpColorManagerV1" ~/.config/brave-flags.conf; then
+ sed -i '$a # Chromium crash workaround for Wayland color management on Hyprland - see https://github.com/hyprwm/Hyprland/issues/11957\n--disable-features=WaylandWpColorManagerV1' ~/.config/brave-flags.conf
+ fi
+fi
diff --git a/migrations/1760434895.sh b/migrations/1760434895.sh
new file mode 100644
index 00000000..e08649f4
--- /dev/null
+++ b/migrations/1760434895.sh
@@ -0,0 +1,6 @@
+echo "Change to omarchy-nvim package"
+omarchy-pkg-drop omarchy-lazyvim
+omarchy-pkg-add omarchy-nvim
+
+# Will trigger to overwrite configs or not to pickup new hot-reload themes
+omarchy-nvim-setup
diff --git a/migrations/1760441237.sh b/migrations/1760441237.sh
new file mode 100644
index 00000000..1c2d89d3
--- /dev/null
+++ b/migrations/1760441237.sh
@@ -0,0 +1,3 @@
+echo "Install Omarchy theme on Obsidian vaults"
+
+omarchy-theme-set-obsidian
diff --git a/migrations/1760462260.sh b/migrations/1760462260.sh
new file mode 100644
index 00000000..fec87d8c
--- /dev/null
+++ b/migrations/1760462260.sh
@@ -0,0 +1,26 @@
+echo -e "Offer new Omarchy hotkeys\n"
+
+cat <