Compare commits

..

1 Commits

Author SHA1 Message Date
David Heinemeier Hansson
a34a671dc8 Remove screen recording status until it is stable 2025-08-24 10:58:41 +02:00
617 changed files with 2707 additions and 9409 deletions

View File

@@ -1,9 +0,0 @@
root = true
[*]
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
end_of_line = lf
charset = utf-8

View File

@@ -1,24 +0,0 @@
name: Bug
description: Report a validated bug -- NOT FOR SUPPORT REQUESTS
labels: [bug]
body:
- type: markdown
attributes:
value: |
Remember: Omarchy is an open source gift, not a product you bought from a vendor
- type: input
id: system-details
attributes:
label: System details
placeholder: e.g. AMD 9950X, NVIDIA 5090, Omarchy 2.1.0
validations:
required: true
- type: textarea
id: steps
attributes:
label: What's wrong?
description: Describe the issue, include steps to recreate it if possible, and attach the output of `omarchy-debug` if possible
validations:
required: true

View File

@@ -1,8 +0,0 @@
blank_issues_enabled: false
contact_links:
- name: Suggestion
url: https://github.com/basecamp/omarchy/discussions/categories/suggestions
about: Suggest a new feature, change to existing feature, or other ideas in Discussions.
- name: Support
url: https://omarchy.org/discord
about: Need help? Join our Discord community for support with any issues. GitHub issues should be used for verified bugs only.

View File

@@ -1,9 +1,10 @@
# Omarchy # Omarchy
Omarchy is a beautiful, modern & opinionated Linux distribution by DHH. Turn a fresh Arch installation into a fully-configured, beautiful, and modern web development system based on Hyprland by running a single command. That's the one-line pitch for Omarchy (like it was for Omakub). No need to write bespoke configs for every essential tool just to get started or to be up on all the latest command-line tools. Omarchy is an opinionated take on what Linux can be at its best.
Read more at [omarchy.org](https://omarchy.org). Read more at [omarchy.org](https://omarchy.org).
## License ## License
Omarchy is released under the [MIT License](https://opensource.org/licenses/MIT). Omarchy is released under the [MIT License](https://opensource.org/licenses/MIT).

View File

@@ -1,21 +0,0 @@
[Desktop Entry]
Type=Application
TryExec=alacritty
Exec=alacritty
Icon=Alacritty
Terminal=false
Categories=System;TerminalEmulator;
Name=Alacritty
GenericName=Terminal
Comment=A fast, cross-platform, OpenGL terminal emulator
StartupNotify=true
StartupWMClass=Alacritty
Actions=New;
X-TerminalArgExec=-e
X-TerminalArgAppId=--class=
X-TerminalArgTitle=--title=
X-TerminalArgDir=--working-directory=
[Desktop Action New]
Name=New Terminal
Exec=alacritty

View File

@@ -1,2 +0,0 @@
[Desktop Entry]
Hidden=true

View File

@@ -1,2 +0,0 @@
[Desktop Entry]
Hidden=true

View File

@@ -1,2 +0,0 @@
[Desktop Entry]
Hidden=true

View File

@@ -1,2 +0,0 @@
[Desktop Entry]
Hidden=true

View File

@@ -1,2 +0,0 @@
[Desktop Entry]
Hidden=true

View File

@@ -1,2 +0,0 @@
[Desktop Entry]
Hidden=true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

12
applications/nvim.desktop Normal file
View File

@@ -0,0 +1,12 @@
[Desktop Entry]
Name=Neovim
GenericName=Text Editor
Comment=Edit text files
Exec=alacritty --class=nvim --title=nvim -e nvim -- %F
Terminal=false
Type=Application
Keywords=Text;editor;
Icon=nvim
Categories=Utility;TextEditor;
StartupNotify=false
MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;

View File

@@ -4,20 +4,27 @@
BATTERY_THRESHOLD=10 BATTERY_THRESHOLD=10
NOTIFICATION_FLAG="/run/user/$UID/omarchy_battery_notified" NOTIFICATION_FLAG="/run/user/$UID/omarchy_battery_notified"
BATTERY_LEVEL=$(omarchy-battery-remaining)
BATTERY_STATE=$(upower -i $(upower -e | grep 'BAT') | grep -E "state" | awk '{print $2}') get_battery_percentage() {
upower -i $(upower -e | grep 'BAT') | grep -E "percentage" | grep -o '[0-9]\+%' | sed 's/%//'
}
get_battery_state() {
upower -i $(upower -e | grep 'BAT') | grep -E "state" | awk '{print $2}'
}
send_notification() { send_notification() {
notify-send -u critical "󱐋 Time to recharge!" "Battery is down to ${1}%" -i battery-caution -t 30000 notify-send -u critical "󱐋 Time to recharge!" "Battery is down to ${1}%" -i battery-caution -t 30000
} }
if [[ -n "$BATTERY_LEVEL" && "$BATTERY_LEVEL" =~ ^[0-9]+$ ]]; then BATTERY_LEVEL=$(get_battery_percentage)
if [[ $BATTERY_STATE == "discharging" && $BATTERY_LEVEL -le $BATTERY_THRESHOLD ]]; then BATTERY_STATE=$(get_battery_state)
if [[ ! -f $NOTIFICATION_FLAG ]]; then
send_notification $BATTERY_LEVEL if [[ "$BATTERY_STATE" == "discharging" && "$BATTERY_LEVEL" -le "$BATTERY_THRESHOLD" ]]; then
touch $NOTIFICATION_FLAG if [[ ! -f "$NOTIFICATION_FLAG" ]]; then
fi send_notification "$BATTERY_LEVEL"
else touch "$NOTIFICATION_FLAG"
rm -f $NOTIFICATION_FLAG
fi fi
else
rm -f "$NOTIFICATION_FLAG"
fi fi

View File

@@ -1,11 +0,0 @@
#!/bin/bash
# Returns the battery percentage remaining as an integer.
upower -i $(upower -e | grep BAT) \
| awk -F: '/percentage/ {
gsub(/[%[:space:]]/, "", $2);
val=$2;
printf("%d\n", (val+0.5))
exit
}'

View File

@@ -3,12 +3,5 @@
if [[ $# -eq 0 ]]; then if [[ $# -eq 0 ]]; then
echo "Adjust Apple Display Brightness by passing +5000 or -5000 (or any range from 0-60000)" echo "Adjust Apple Display Brightness by passing +5000 or -5000 (or any range from 0-60000)"
else else
DEVICE="$(sudo asdcontrol --detect /dev/usb/hiddev* | grep ^/dev/usb/hiddev | cut -d: -f1)" sudo asdcontrol $(sudo asdcontrol --detect /dev/usb/hiddev* | grep ^/dev/usb/hiddev | cut -d: -f1) -- "$1"
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 fi

View File

@@ -1,56 +1,19 @@
#!/bin/bash #!/bin/bash
focused_monitor="$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')" # Find all the audio sinks but exit if there are none
sinks=($(wpctl status | sed -n '/Sinks:/,/Sources:/p' | grep -E '^\s*│\s+\*?\s*[0-9]+\.' | sed -E 's/^[^0-9]*([0-9]+)\..*/\1/'))
[ ${#sinks[@]} -eq 0 ] && exit 1
sinks=$(pactl -f json list sinks | jq '[.[] | select((.ports | length == 0) or ([.ports[]? | .availability != "not available"] | any))]') # Find current audio sink
sinks_count=$(echo "$sinks" | jq '. | length') current=$(wpctl status | sed -n '/Sinks:/,/Sources:/p' | grep '^\s*│\s*\*' | sed -E 's/^[^0-9]*([0-9]+)\..*/\1/')
if [ "$sinks_count" -eq 0 ]; then # Find the next sink (looping around in the list)
swayosd-client \ for i in "${!sinks[@]}"; do
--monitor "$focused_monitor" \ [ "${sinks[$i]}" = "$current" ] && next=${sinks[$(((i + 1) % ${#sinks[@]}))]}
--custom-message "No audio devices found" done
exit 1 next=${next:-${sinks[0]}}
fi
current_sink_name=$(pactl get-default-sink) # Set the next sink and ensure it's not muted
current_sink_index=$(echo "$sinks" | jq -r --arg name "$current_sink_name" 'map(.name) | index($name)') wpctl set-default "$next"
wpctl set-mute "$next" 0
if [ "$current_sink_index" != "null" ]; then
next_sink_index=$(((current_sink_index + 1) % sinks_count))
else
next_sink_index=0
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')
if [ "$next_sink_is_muted" = "true" ] || [ "$next_sink_volume" -eq 0 ]; then
icon_state="muted"
elif [ "$next_sink_volume" -le 33 ]; then
icon_state="low"
elif [ "$next_sink_volume" -le 66 ]; then
icon_state="medium"
else
icon_state="high"
fi
next_sink_volume_icon="sink-volume-${icon_state}-symbolic"
if [ "$next_sink_name" != "$current_sink_name" ]; then
pactl set-default-sink "$next_sink_name"
fi
swayosd-client \
--monitor "$focused_monitor" \
--custom-message "$next_sink_description" \
--custom-icon "$next_sink_volume_icon"

View File

@@ -1,19 +0,0 @@
#!/bin/bash
set -e
FIRST_RUN_MODE=~/.local/state/omarchy/first-run.mode
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
bash "$OMARCHY_PATH/install/first-run/welcome.sh"
bash "$OMARCHY_PATH/install/first-run/wifi.sh"
fi

View File

@@ -1,9 +0,0 @@
#!/bin/bash
for cmd in "$@"; do
if ! command -v "$cmd" &>/dev/null; then
exit 0
fi
done
exit 1

View File

@@ -1,7 +0,0 @@
#!/bin/bash
for cmd in "$@"; do
command -v "$cmd" &>/dev/null || exit 1
done
exit 0

View File

@@ -8,135 +8,25 @@ if [[ ! -d "$OUTPUT_DIR" ]]; then
exit 1 exit 1
fi fi
SCOPE="" screenrecording() {
AUDIO="false" filename="$OUTPUT_DIR/screenrecording-$(date +'%Y-%m-%d_%H-%M-%S').mp4"
WEBCAM="false" notify-send "Screen recording starting..." -t 1000
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 sleep 1
}
start_screenrecording() { if lspci | grep -Eqi 'nvidia|intel.*graphics'; then
local filename="$OUTPUT_DIR/screenrecording-$(date +'%Y-%m-%d_%H-%M-%S').mp4" wf-recorder -f "$filename" -c libx264 -p crf=23 -p preset=medium -p movflags=+faststart "$@"
local audio_args=""
# 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 -SIGINT -f "gpu-screen-recorder" # SIGINT required to save video properly
# 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
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 else
cleanup_webcam wl-screenrec -f "$filename" --ffmpeg-encoder-options="-c:v libx264 -crf 23 -preset medium -movflags +faststart" "$@"
notify-send "Screen recording saved to $OUTPUT_DIR" -t 2000
fi fi
toggle_screenrecording_indicator
} }
toggle_screenrecording_indicator() { if pgrep -x wl-screenrec >/dev/null || pgrep -x wf-recorder >/dev/null; then
pkill -RTMIN+8 waybar pkill -x wl-screenrec
} pkill -x wf-recorder
notify-send "Screen recording saved to $OUTPUT_DIR" -t 2000
screenrecording_active() { elif [[ "$1" == "output" ]]; then
pgrep -f "gpu-screen-recorder" >/dev/null || pgrep -x slurp >/dev/null || pgrep -f "WebcamOverlay" >/dev/null screenrecording
}
if screenrecording_active; then
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
[[ "$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 else
[[ "$WEBCAM" == "true" ]] && start_webcam_overlay region=$(slurp) || exit 1
screenrecording -g "$region"
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 fi

View File

@@ -0,0 +1,7 @@
#!/bin/bash
if pgrep -x wl-screenrec >/dev/null || pgrep -x wf-recorder >/dev/null; then
pkill -x wl-screenrec
pkill -x wf-recorder
notify-send "Screen recording stopped" -t 2000
fi

View File

@@ -1,29 +1,20 @@
#!/bin/bash #!/bin/bash
screensaver_in_focus() { if command -v tte &>/dev/null; then
hyprctl activewindow -j | jq -e '.class == "Screensaver"' >/dev/null 2>&1 while true; do
} effect=$(tte 2>&1 | grep -oP '{\K[^}]+' | tr ',' ' ' | tr ' ' '\n' | sed -n '/^beams$/,$p' | sort -u | shuf -n1)
tte -i ~/.config/omarchy/branding/screensaver.txt \
--frame-rate 240 --canvas-width 0 --canvas-height $(($(tput lines) - 2)) --anchor-canvas c --anchor-text c \
"$effect" &
exit_screensaver() { while pgrep -x tte >/dev/null; do
hyprctl keyword cursor:invisible false if read -n 1 -t 0.01; then
pkill -x tte 2>/dev/null pkill -x tte 2>/dev/null
pkill -f "alacritty --class Screensaver" 2>/dev/null pkill -f "alacritty --class Screensaver" 2>/dev/null
exit 0 exit 0
} fi
done
trap exit_screensaver SIGINT SIGTERM SIGHUP SIGQUIT
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)
tte -i ~/.config/omarchy/branding/screensaver.txt \
--frame-rate 240 --canvas-width 0 --canvas-height $(($(tput lines) - 2)) --anchor-canvas c --anchor-text c \
"$effect" &
while pgrep -x tte >/dev/null; do
if read -n 1 -t 3 || ! screensaver_in_focus; then
exit_screensaver
fi
done done
done else
gum spin --title "Can't find tte. Try: pip install terminaltexteffects" -- sleep 2
fi

View File

@@ -8,76 +8,10 @@ if [[ ! -d "$OUTPUT_DIR" ]]; then
exit 1 exit 1
fi fi
pkill slurp && exit 0 pkill slurp || hyprshot -m ${1:-region} --raw |
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 - \ satty --filename - \
--output-filename "$OUTPUT_DIR/screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png" \ --output-filename "$OUTPUT_DIR/screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png" \
--early-exit \ --early-exit \
--actions-on-enter save-to-clipboard \ --actions-on-enter save-to-clipboard \
--save-after-copy \ --save-after-copy \
--copy-command 'wl-copy' --copy-command 'wl-copy'
else
grim -g "$SELECTION" - | wl-copy
fi

View File

@@ -1,44 +0,0 @@
#!/bin/bash
if (($# == 0)); then
echo "Usage: omarchy-cmd-share [clipboard|file|folder]"
exit 1
fi
MODE="$1"
shift
if [[ $MODE == "clipboard" ]]; then
TEMP_FILE=$(mktemp --suffix=.txt)
wl-paste >"$TEMP_FILE"
FILES="$TEMP_FILE"
else
if (($# > 0)); then
FILES="$*"
else
if [[ $MODE == "folder" ]]; then
# Pick a single folder from home directory
FILES=$(find "$HOME" -type d 2>/dev/null | fzf)
else
# Pick one or more files from home directory
FILES=$(find "$HOME" -type f 2>/dev/null | fzf --multi)
fi
[ -z "$FILES" ] && exit 0
fi
fi
# Run LocalSend in its own systemd service (detached from terminal)
# Convert newline-separated files to space-separated arguments
if [[ $MODE != "clipboard" ]] && echo "$FILES" | grep -q $'\n'; then
# Multiple files selected - convert newlines to array
readarray -t FILE_ARRAY <<<"$FILES"
systemd-run --user --quiet --collect localsend --headless send "${FILE_ARRAY[@]}"
else
# Single file or clipboard mode
systemd-run --user --quiet --collect localsend --headless send "$FILES"
fi
# Note: Temporary file will remain until system cleanup for clipboard mode
# This ensures the file content is available for the LocalSend GUI
exit 0

View File

@@ -2,16 +2,10 @@
# Go from current active terminal to its child shell process and run cwd there # Go from current active terminal to its child shell process and run cwd there
terminal_pid=$(hyprctl activewindow | awk '/pid:/ {print $2}') terminal_pid=$(hyprctl activewindow | awk '/pid:/ {print $2}')
shell_pid=$(pgrep -P "$terminal_pid" | tail -n1) shell_pid=$(pgrep -P "$terminal_pid" | head -n1)
if [[ -n $shell_pid ]]; then if [[ -n $shell_pid ]]; then
cwd=$(readlink -f "/proc/$shell_pid/cwd" 2>/dev/null) readlink -f "/proc/$shell_pid/cwd" 2>/dev/null
if [[ -d $cwd ]]; then
echo "$cwd"
else
echo "$HOME"
fi
else else
echo "$HOME" echo "$HOME"
fi fi

6
bin/omarchy-cmd-tzupdate Executable file
View File

@@ -0,0 +1,6 @@
#!/bin/bash
sudo tzupdate
new_timezone=$(timedatectl show -p Timezone --value)
omarchy-restart-waybar
notify-send "Timezone has been set to $new_timezone"

View File

@@ -1,61 +0,0 @@
#!/bin/bash
LOG_FILE="/tmp/omarchy-debug.log"
cat > "$LOG_FILE" <<EOF
Date: $(date)
Hostname: $(hostname)
Omarchy Branch: $(git -C "$OMARCHY_PATH" branch --show-current 2>/dev/null || echo "unknown")
=========================================
SYSTEM INFORMATION
=========================================
$(inxi -Farz)
=========================================
DMESG
=========================================
$(sudo dmesg)
=========================================
JOURNALCTL (CURRENT BOOT, ERRORS ONLY)
=========================================
$(journalctl -b -p 4..1)
=========================================
INSTALLED PACKAGES
=========================================
$({ expac -S '%n %v (%r)' $(pacman -Qqe) 2>/dev/null; comm -13 <(pacman -Sql | sort) <(pacman -Qqe | sort) | xargs -r expac -Q '%n %v (AUR)'; } | sort)
EOF
OPTIONS=("View log" "Save in current directory")
if ping -c 1 8.8.8.8 >/dev/null 2>&1; then
OPTIONS=("Upload log" "${OPTIONS[@]}")
fi
ACTION=$(gum choose "${OPTIONS[@]}")
case "$ACTION" in
"Upload log")
echo "Uploading debug log to 0x0.st..."
URL=$(curl -sF "file=@$LOG_FILE" -Fexpires=24 https://0x0.st)
if [ $? -eq 0 ] && [ -n "$URL" ]; then
echo "✓ Log uploaded successfully!"
echo "Share this URL:"
echo ""
echo " $URL"
echo ""
echo "This link will expire in 24 hours."
else
echo "Error: Failed to upload log file"
exit 1
fi
;;
"View log")
less "$LOG_FILE"
;;
"Save in current directory")
cp "$LOG_FILE" "./omarchy-debug.log"
echo "✓ Log saved to $(pwd)/omarchy-debug.log"
;;
esac

View File

@@ -1,6 +1,5 @@
#!/bin/bash #!/bin/bash
# FIXME: Update behavior
cd ~/.local/share/omarchy cd ~/.local/share/omarchy
migration_file="$HOME/.local/share/omarchy/migrations/$(git log -1 --format=%cd --date=unix).sh" migration_file="$HOME/.local/share/omarchy/migrations/$(git log -1 --format=%cd --date=unix).sh"
touch $migration_file touch $migration_file

View File

@@ -1,344 +0,0 @@
#!/usr/bin/env python3
"""
Omarchy Disk Configuration Tool
Interactive partition editor and validator for Omarchy installations.
"""
import json
import sys
from pathlib import Path
def _find_root_partition(disk_config):
for dev_mod in disk_config.device_modifications:
for part in dev_mod.partitions:
if part.mountpoint == Path('/'):
return part
if part.btrfs_subvols:
for subvol in part.btrfs_subvols:
if subvol.mountpoint == Path('/'):
return part
return None
def validate_disk_config(config, interactive=True):
from archinstall.lib.models.device import FilesystemType, Size, Unit, EncryptionType
from archinstall.lib.output import info, warn
if not config.disk_config:
return 'CONTINUE'
validation_warnings = []
boot_partition = None
for dev_mod in config.disk_config.device_modifications:
for part in dev_mod.partitions:
if part.mountpoint == Path('/boot') or part.mountpoint == Path('/efi'):
boot_partition = part
break
if boot_partition:
min_boot_size = Size(2, Unit.GiB, boot_partition.length.sector_size)
if boot_partition.length >= min_boot_size:
size_gb = boot_partition.length.convert(Unit.GiB).value
info(f'✓ Boot partition size: {size_gb:.1f} GiB')
else:
size_mb = boot_partition.length.convert(Unit.MiB).value
warn(f'⚠ Boot partition is only {size_mb:.0f} MiB')
warn(' Omarchy recommends at least 2 GiB for boot partition')
warn(' Multiple kernels may not fit')
validation_warnings.append('boot_size')
else:
warn('⚠ Could not find boot partition (/boot or /efi)')
warn(' System may not boot correctly')
validation_warnings.append('no_boot')
root_partition = _find_root_partition(config.disk_config)
if root_partition:
if root_partition.fs_type == FilesystemType.Btrfs:
info('✓ Root filesystem is btrfs')
if root_partition.btrfs_subvols:
subvol_names = [str(sv.name) for sv in root_partition.btrfs_subvols]
subvol_mounts = {str(sv.mountpoint): str(sv.name) for sv in root_partition.btrfs_subvols}
required_subvols = {
'/': '@',
'/home': '@home',
'/var/log': '@log',
'/var/cache/pacman/pkg': '@pkg',
}
missing_subvols = []
for mount, expected_name in required_subvols.items():
if mount not in subvol_mounts:
missing_subvols.append(f'{expected_name} → {mount}')
elif subvol_mounts[mount] != expected_name:
warn(f'⚠ Subvolume at {mount} is named "{subvol_mounts[mount]}" not "{expected_name}"')
if missing_subvols:
warn(f'⚠ Missing recommended subvolumes: {", ".join(missing_subvols)}')
warn(' Omarchy recommends: @, @home, @log, @pkg')
warn(' Some features (like Snapper) may not work optimally')
info(f' Current subvolumes: {", ".join(subvol_names)}')
validation_warnings.append('missing_subvols')
else:
info(f'✓ Btrfs subvolumes: {", ".join(subvol_names)}')
else:
warn('⚠ Btrfs partition has no subvolumes defined')
warn(' Omarchy recommends subvolumes for snapshots')
warn(' Required: @ (root), @home, @log, @pkg')
validation_warnings.append('no_subvols')
else:
fs_name = root_partition.fs_type.value if root_partition.fs_type else 'unknown'
warn(f'⚠ Root filesystem is {fs_name}, not btrfs')
warn(' Omarchy is designed for btrfs with snapshots')
warn(' Some features may not work correctly')
validation_warnings.append('not_btrfs')
is_encrypted = False
if config.disk_config.disk_encryption:
enc = config.disk_config.disk_encryption
if enc.encryption_type != EncryptionType.NoEncryption:
is_encrypted = root_partition in enc.partitions
if is_encrypted:
info('✓ Root partition is encrypted with LUKS')
if config.disk_config.disk_encryption.iter_time != 2000:
old_time = config.disk_config.disk_encryption.iter_time
config.disk_config.disk_encryption.iter_time = 2000
info(f'✓ Adjusted iteration time: {old_time}ms → 2000ms')
else:
info('✓ Iteration time: 2000ms (optimal)')
else:
warn('⚠ Root partition is NOT encrypted')
warn(' Omarchy recommends LUKS encryption for security')
validation_warnings.append('no_encryption')
else:
warn('⚠ Could not identify root partition')
validation_warnings.append('no_root')
if validation_warnings and interactive:
import subprocess
import shutil
gum_path = shutil.which('gum')
if gum_path:
warn('')
try:
result = subprocess.run(
['gum', 'choose', '--header', 'Validation warnings detected. What would you like to do?',
'Re-edit partitions', 'Continue anyway', 'Abort'],
capture_output=True,
text=True,
)
choice = result.stdout.strip() if result.stdout else ''
if choice == 'Re-edit partitions':
return 'RE_EDIT'
elif choice == 'Abort':
return 'ABORT'
else:
info('Continuing despite warnings')
return 'CONTINUE'
except (subprocess.CalledProcessError, KeyboardInterrupt):
return 'ABORT'
return 'CONTINUE'
def apply_omarchy_partition_defaults():
import archinstall.lib.interactions.disk_conf as disk_conf_module
from archinstall.lib.models.device import (
PartitionModification, ModificationStatus, PartitionType,
Size, Unit, SectorSize, FilesystemType, PartitionFlag,
DeviceModification, BDevice
)
from archinstall.lib.interactions.disk_conf import get_default_btrfs_subvols
from archinstall.lib.disk.device_handler import device_handler
def _boot_partition_2gib(sector_size: SectorSize, using_gpt: bool) -> PartitionModification:
flags = [PartitionFlag.BOOT]
size = Size(2, Unit.GiB, sector_size)
start = Size(1, Unit.MiB, sector_size)
if using_gpt:
flags.append(PartitionFlag.ESP)
return PartitionModification(
status=ModificationStatus.Create,
type=PartitionType.Primary,
start=start,
length=size,
mountpoint=Path('/boot'),
fs_type=FilesystemType.Fat32,
flags=flags,
)
def _select_main_filesystem_btrfs() -> FilesystemType:
return FilesystemType.Btrfs
def _select_mount_options_compressed() -> list[str]:
return ['compress=zstd']
def _suggest_single_disk_auto_subvolumes(
device: BDevice,
filesystem_type: FilesystemType | None = None,
separate_home: bool | None = None,
):
if not filesystem_type:
filesystem_type = FilesystemType.Btrfs
if filesystem_type == FilesystemType.Btrfs:
using_subvolumes = True
mount_options = ['compress=zstd']
else:
using_subvolumes = False
mount_options = []
sector_size = device.device_info.sector_size
device_modification = DeviceModification(device, wipe=True)
using_gpt = device_handler.partition_table.is_gpt()
boot_partition = _boot_partition_2gib(sector_size, using_gpt)
device_modification.add_partition(boot_partition)
total_size = device.device_info.total_size
available_space = total_size - boot_partition.length - Size(1, Unit.MiB, sector_size)
root_partition = PartitionModification(
status=ModificationStatus.Create,
type=PartitionType.Primary,
start=boot_partition.start + boot_partition.length,
length=available_space,
mountpoint=None if using_subvolumes else Path('/'),
fs_type=filesystem_type,
mount_options=mount_options,
)
if using_subvolumes:
root_partition.btrfs_subvols = get_default_btrfs_subvols()
device_modification.add_partition(root_partition)
return device_modification
disk_conf_module._boot_partition = _boot_partition_2gib
disk_conf_module.select_main_filesystem_format = _select_main_filesystem_btrfs
disk_conf_module.select_mount_options = _select_mount_options_compressed
disk_conf_module.suggest_single_disk_layout = _suggest_single_disk_auto_subvolumes
def load_config(config_file: Path, creds_file: Path | None = None):
from archinstall.lib.args import ArchConfig, Arguments
with open(config_file) as f:
config_data = json.load(f)
if creds_file and creds_file.exists():
with open(creds_file) as f:
creds_data = json.load(f)
config_data.update(creds_data)
args = Arguments(
config=config_file,
creds=creds_file,
mountpoint=Path('/mnt'),
silent=True,
)
return ArchConfig.from_config(config_data, args)
def save_config(config, output_file: Path):
from archinstall.lib.output import info
try:
config_dict = config.safe_json()
with open(output_file, 'w') as f:
json.dump(config_dict, f, indent=2, default=str)
info(f'✓ Configuration saved to: {output_file}')
except Exception as e:
from archinstall.lib.output import error
error(f'Failed to save config: {e}')
raise
def main():
import argparse
parser = argparse.ArgumentParser(description='Omarchy Disk Configuration Tool')
parser.add_argument('--config', type=Path, required=True, help='Path to config file')
parser.add_argument('--creds', type=Path, help='Path to credentials file')
parser.add_argument('--output', type=Path, help='Output path (default: overwrites input)')
parser.add_argument('--non-interactive', action='store_true', help='Skip interactive prompts')
args = parser.parse_args()
output_file = args.output or args.config
if not args.config.exists():
print(f'ERROR: Config file not found: {args.config}', file=sys.stderr)
sys.exit(1)
if args.creds and not args.creds.exists():
print(f'ERROR: Credentials file not found: {args.creds}', file=sys.stderr)
sys.exit(1)
try:
from archinstall.lib.output import info, error
from archinstall.lib.disk.disk_menu import DiskLayoutConfigurationMenu
from archinstall.tui.curses_menu import Tui
apply_omarchy_partition_defaults()
info('Loading configuration...')
config = load_config(args.config, args.creds)
if not config.disk_config:
error('No disk configuration found in config file')
sys.exit(1)
while True:
info('Launching partition editor...')
with Tui():
edited_disk_config = DiskLayoutConfigurationMenu(config.disk_config).run()
if edited_disk_config:
config.disk_config = edited_disk_config
info('✓ Partition configuration updated')
else:
info('No changes made in partition editor')
interactive = not args.non_interactive
validation_result = validate_disk_config(config, interactive=interactive)
if validation_result == 'RE_EDIT':
continue
elif validation_result == 'ABORT':
info('Disk configuration cancelled by user')
sys.exit(1)
else:
break
save_config(config, output_file)
info('✓ Disk configuration complete!')
except KeyboardInterrupt:
print('\nCancelled by user', file=sys.stderr)
sys.exit(1)
except Exception as e:
print(f'ERROR: {e}', file=sys.stderr)
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == '__main__':
main()

View File

@@ -1,28 +0,0 @@
#!/bin/bash
# Drive, like /dev/nvme0, to display information about
if (($# == 0)); then
echo "Usage: omarchy-drive-info [/dev/drive]"
exit 1
else
drive="$1"
fi
# Find the root drive in case we are looking at partitions
root_drive=$(lsblk -no PKNAME "$drive" 2>/dev/null | tail -n1)
if [[ -n "$root_drive" ]]; then
root_drive="/dev/$root_drive"
else
root_drive="$drive"
fi
# Get basic disk information
size=$(lsblk -dno SIZE "$drive" 2>/dev/null)
model=$(lsblk -dno MODEL "$root_drive" 2>/dev/null)
# Format display string
display="$drive"
[[ -n "$size" ]] && display="$display ($size)"
[[ -n "$model" ]] && display="$display - $model"
echo "$display"

View File

@@ -1,18 +0,0 @@
#!/bin/bash
# Select a drive from a list with info that includes space and brand
if (($# == 0)); then
drives=$(lsblk -dpno NAME | grep -E '/dev/(sd|hd|vd|nvme|mmcblk|xv)')
else
drives="$@"
fi
drives_with_info=""
while IFS= read -r drive; do
[[ -n "$drive" ]] || continue
drives_with_info+="$(omarchy-drive-info "$drive")"$'\n'
done <<<"$drives"
selected_drive="$(printf "%s" "$drives_with_info" | gum choose --header "Select drive")" || exit 1
printf "%s\n" "$selected_drive" | awk '{print $1}'

View File

@@ -1,21 +0,0 @@
#!/bin/bash
encrypted_drives=$(blkid -t TYPE=crypto_LUKS -o device)
if [[ -n $encrypted_drives ]]; then
if [[ $(wc -l <<<"$encrypted_drives") -eq 1 ]]; then
drive_to_change="$encrypted_drives"
else
drive_to_change="$(omarchy-drive-select "$encrypted_drives")"
fi
if [[ -n $drive_to_change ]]; then
echo "Changing full-disk encryption password for $drive_to_change"
sudo cryptsetup luksChangeKey --pbkdf argon2id --iter-time 2000 "$drive_to_change"
else
echo "No drive selected."
fi
else
echo "No encrypted drives available."
exit 1
fi

View File

@@ -0,0 +1,5 @@
#!/bin/bash
if ! curl -s --connect-timeout 10 --head -A "omarchy-update" -o /dev/null "https://aur.archlinux.org/"; then
gum spin --spinner "globe" --title "The AUR package repository is currently unavailable, please try again later" -- sleep 2 && exit 1
fi

View File

@@ -1,3 +1,3 @@
#!/bin/bash #!/bin/bash
grep -oP 'font-family:\s*["'\'']?\K[^;"'\'']+' ~/.config/waybar/style.css | head -n1 grep -oP 'family\s*=\s*"\K[^"]+' ~/.config/alacritty/alacritty.toml | head -n1

View File

@@ -1,3 +1,3 @@
#!/bin/bash #!/bin/bash
fc-list :spacing=100 -f "%{family[0]}\n" | grep -v -i -E 'emoji|signwriting|omarchy' | sort -u fc-list :spacing=100 -f "%{family[0]}\n" | grep -v -i -E 'emoji|signwriting' | sort -u

View File

@@ -4,20 +4,7 @@ font_name="$1"
if [[ -n "$font_name" && "$font_name" != "CNCLD" ]]; then if [[ -n "$font_name" && "$font_name" != "CNCLD" ]]; then
if fc-list | grep -iq "$font_name"; then if fc-list | grep -iq "$font_name"; then
if [[ -f ~/.config/alacritty/alacritty.toml ]]; then sed -i "s/family = \".*\"/family = \"$font_name\"/g" ~/.config/alacritty/alacritty.toml
sed -i "s/family = \".*\"/family = \"$font_name\"/g" ~/.config/alacritty/alacritty.toml
fi
if [[ -f ~/.config/kitty/kitty.conf ]]; then
sed -i "s/^font_family .*/font_family $font_name/g" ~/.config/kitty/kitty.conf
pkill -USR1 kitty
fi
if [[ -f ~/.config/ghostty/config ]]; then
sed -i "s/font-family = \".*\"/font-family = \"$font_name\"/g" ~/.config/ghostty/config
pkill -SIGUSR2 ghostty
fi
sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/waybar/style.css sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/waybar/style.css
sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/swayosd/style.css sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/swayosd/style.css
xmlstarlet ed -L \ xmlstarlet ed -L \
@@ -28,8 +15,6 @@ if [[ -n "$font_name" && "$font_name" != "CNCLD" ]]; then
omarchy-restart-waybar omarchy-restart-waybar
omarchy-restart-swayosd omarchy-restart-swayosd
omarchy-restart-walker omarchy-restart-walker
omarchy-hook font-set "$font_name"
else else
echo "Font '$font_name' not found." echo "Font '$font_name' not found."
exit 1 exit 1

View File

@@ -1,16 +0,0 @@
#!/bin/bash
set -e
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

View File

@@ -1,22 +0,0 @@
#!/bin/bash
# Toggle to pop-out a tile to stay fixed on a display basis.
active=$(hyprctl activewindow -j)
pinned=$(echo "$active" | jq .pinned)
addr=$(echo "$active" | jq -r ".address")
[ -z "$addr" ] && { echo "No active window"; exit 0; }
if [ "$pinned" = "true" ]; then
hyprctl -q --batch \
"dispatch pin address:$addr;" \
"dispatch togglefloating address:$addr;" \
"dispatch tagwindow -pop address:$addr;"
else
hyprctl -q --batch \
"dispatch togglefloating address:$addr;" \
"dispatch centerwindow address:$addr;" \
"dispatch pin address:$addr;" \
"dispatch alterzorder top address:$addr;" \
"dispatch tagwindow +pop address:$addr;"
fi

View File

@@ -1,10 +0,0 @@
#!/bin/bash
workspace_id=$(hyprctl activeworkspace -j | jq -r .id)
gaps=$(hyprctl workspacerules -j | jq -r ".[] | select(.workspaceString==\"$workspace_id\") | .gapsOut[0] // 0")
if [[ $gaps == "0" ]]; then
hyprctl keyword "workspace $workspace_id, gapsout:10, gapsin:5, bordersize:2"
else \
hyprctl keyword "workspace $workspace_id, gapsout:0, gapsin:0, bordersize:0"
fi

View File

@@ -1,258 +0,0 @@
#!/usr/bin/env python3
"""
Omarchy Install
Installs Arch Linux with Omarchy customizations using archinstall as a library.
For disk configuration, use omarchy-disk-config.
"""
import json
import sys
import time
from pathlib import Path
def load_config(config_file: Path, creds_file: Path | None = None):
from archinstall.lib.args import ArchConfig, Arguments
with open(config_file) as f:
config_data = json.load(f)
if creds_file and creds_file.exists():
with open(creds_file) as f:
creds_data = json.load(f)
config_data.update(creds_data)
args = Arguments(
config=config_file,
creds=creds_file,
mountpoint=Path('/mnt'),
silent=True,
skip_ntp=True,
skip_wkd=True,
)
return ArchConfig.from_config(config_data, args)
def load_omarchy_packages() -> list[str]:
omarchy_path = Path('/usr/share/omarchy/install')
packages = []
base_packages_file = omarchy_path / 'omarchy-base.packages'
if base_packages_file.exists():
with open(base_packages_file) as f:
packages.extend([line.strip() for line in f if line.strip() and not line.startswith('#')])
return packages
def perform_installation(config_file: Path, creds_file: Path | None = None) -> None:
from archinstall.lib.disk.filesystem import FilesystemHandler
from archinstall.lib.installer import Installer
from archinstall.lib.models.device import DiskLayoutType, EncryptionType
from archinstall.lib.output import error, info
from archinstall.lib.profile.profiles_handler import profile_handler
from archinstall.lib.authentication.authentication_handler import auth_handler
start_time = time.time()
info('Loading configuration...')
config = load_config(config_file, creds_file)
if not config.disk_config:
error('No disk configuration found in config file')
error('Use omarchy-disk-config to configure disk layout first')
sys.exit(1)
disk_config = config.disk_config
if disk_config.config_type != DiskLayoutType.Pre_mount:
info('Performing filesystem operations...')
fs_handler = FilesystemHandler(disk_config)
fs_handler.perform_filesystem_operations()
mountpoint = Path('/mnt')
info('Loading Omarchy base packages...')
omarchy_packages = load_omarchy_packages()
info('Starting Omarchy installation...')
with Installer(
mountpoint,
disk_config,
kernels=config.kernels or ['linux'],
) as installation:
info('Mounting filesystems...')
if disk_config.config_type != DiskLayoutType.Pre_mount:
installation.mount_ordered_layout()
installation.sanity_check()
if disk_config.disk_encryption and disk_config.disk_encryption.encryption_type != EncryptionType.NoEncryption:
info('Generating encryption keys...')
installation.generate_key_files()
if config.mirror_config:
info('Configuring mirrors...')
installation.set_mirrors(config.mirror_config, on_target=False)
info('Installing base system...')
installation.minimal_installation(
optional_repositories=config.mirror_config.optional_repositories if config.mirror_config else [],
mkinitcpio=not config.uki,
hostname=config.hostname,
locale_config=config.locale_config,
)
if config.mirror_config:
installation.set_mirrors(config.mirror_config, on_target=True)
if config.swap:
info('Setting up swap...')
installation.setup_swap('zram')
all_packages = omarchy_packages + (config.packages or [])
if all_packages:
info(f'Installing {len(all_packages)} packages...')
installation.add_additional_packages(all_packages)
if config.bootloader:
info(f'Installing bootloader: {config.bootloader.value}...')
installation.add_bootloader(config.bootloader, config.uki)
if config.network_config:
info('Configuring network...')
config.network_config.install_network_config(installation, config.profile_config)
if config.auth_config and config.auth_config.users:
info('Creating users...')
installation.create_users(config.auth_config.users)
auth_handler.setup_auth(installation, config.auth_config, config.hostname)
if config.app_config:
info('Installing applications...')
from archinstall.lib.applications.application_handler import application_handler
application_handler.install_applications(installation, config.app_config)
if config.profile_config:
info('Installing profile...')
profile_handler.install_profile_config(installation, config.profile_config)
if config.timezone:
installation.set_timezone(config.timezone)
if config.ntp:
installation.activate_time_synchronization()
from archinstall.lib.installer import accessibility_tools_in_use
if accessibility_tools_in_use():
installation.enable_espeakup()
if config.auth_config and config.auth_config.root_enc_password:
from archinstall.lib.models.users import User
root_user = User('root', config.auth_config.root_enc_password, False)
installation.set_user_password(root_user)
if config.profile_config and config.profile_config.profile:
config.profile_config.profile.post_install(installation)
if config.services:
info('Enabling services...')
installation.enable_service(config.services)
if disk_config.has_default_btrfs_vols():
btrfs_options = disk_config.btrfs_options
snapshot_config = btrfs_options.snapshot_config if btrfs_options else None
snapshot_type = snapshot_config.snapshot_type if snapshot_config else None
if snapshot_type:
installation.setup_btrfs_snapshot(snapshot_type, config.bootloader)
info('Mounting offline resources for chroot access...')
from archinstall.lib.general import SysCommand
import os
import shutil
offline_mirror_src = Path('/var/cache/omarchy/mirror/offline')
offline_mirror_dst = mountpoint / 'var/cache/omarchy/mirror/offline'
packages_src = Path('/opt/packages')
packages_dst = mountpoint / 'opt/packages'
os.makedirs(offline_mirror_dst, exist_ok=True)
os.makedirs(packages_dst, exist_ok=True)
if offline_mirror_src.exists():
SysCommand(f'mount --bind {offline_mirror_src} {offline_mirror_dst}')
if packages_src.exists():
SysCommand(f'mount --bind {packages_src} {packages_dst}')
pacman_conf_src = Path('/etc/pacman.conf')
pacman_conf_dst = mountpoint / 'etc/pacman.conf'
if pacman_conf_src.exists():
shutil.copy(pacman_conf_src, pacman_conf_dst)
info('Copying user info to chroot...')
os.makedirs(mountpoint / 'tmp', exist_ok=True)
if os.path.exists('/tmp/omarchy-user-name.txt'):
shutil.copy('/tmp/omarchy-user-name.txt', mountpoint / 'tmp/omarchy-user-name.txt')
if os.path.exists('/tmp/omarchy-user-email.txt'):
shutil.copy('/tmp/omarchy-user-email.txt', mountpoint / 'tmp/omarchy-user-email.txt')
if config.custom_commands:
info('Running Omarchy custom commands...')
from archinstall.lib.installer import run_custom_user_commands
run_custom_user_commands(config.custom_commands, installation)
info('Generating fstab...')
installation.genfstab()
end_time = time.time()
duration_seconds = int(end_time - start_time)
duration_mins = duration_seconds // 60
duration_secs = duration_seconds % 60
timing_file = mountpoint / 'tmp/omarchy-install-time.txt'
with open(timing_file, 'w') as f:
f.write(f"{duration_mins}m {duration_secs}s\n")
info(f'Installation complete! Total time: {duration_mins}m {duration_secs}s')
def main():
import argparse
parser = argparse.ArgumentParser(description='Omarchy Install')
parser.add_argument('--config', type=Path, required=True, help='Path to config file')
parser.add_argument('--creds', type=Path, help='Path to credentials file')
args = parser.parse_args()
if not args.config.exists():
print(f'ERROR: Config file not found: {args.config}', file=sys.stderr)
sys.exit(1)
if args.creds and not args.creds.exists():
print(f'ERROR: Credentials file not found: {args.creds}', file=sys.stderr)
sys.exit(1)
try:
perform_installation(
config_file=args.config,
creds_file=args.creds,
)
except KeyboardInterrupt:
print('\nInstallation cancelled by user', file=sys.stderr)
sys.exit(1)
except Exception as e:
print(f'ERROR: Installation failed: {e}', file=sys.stderr)
import traceback
traceback.print_exc()
sys.exit(1)
if __name__ == '__main__':
main()

View File

@@ -1,13 +0,0 @@
#!/bin/bash
if [[ -f ~/.config/chromium-flags.conf ]]; then
CONF=~/.config/chromium-flags.conf
grep -qxF -- "--oauth2-client-id=77185425430.apps.googleusercontent.com" "$CONF" ||
echo "--oauth2-client-id=77185425430.apps.googleusercontent.com" >>"$CONF"
grep -qxF -- "--oauth2-client-secret=OTJgUOQcT7lO7GsGZq2G4IlT" "$CONF" ||
echo "--oauth2-client-secret=OTJgUOQcT7lO7GsGZq2G4IlT" >>"$CONF"
echo "Now you can login to your Google Account in Chromium."
fi

View File

@@ -1,12 +1,12 @@
#!/bin/bash #!/bin/bash
if [[ -z "$1" ]]; then if [[ -z "$1" ]]; then
echo "Usage: omarchy-install-dev-env <ruby|node|bun|go|laravel|symfony|php|python|elixir|phoenix|rust|java|ocaml|dotnet|clojure>" >&2 echo "Usage: omarchy-install-dev-env <ruby|node|bun|go|laravel|symfony|php|python|elixir|phoenix|rust|java|ocaml|dotnet>" >&2
exit 1 exit 1
fi fi
install_php() { install_php() {
sudo pacman -S php composer php-sqlite xdebug --noconfirm yay -Sy php composer php-sqlite --noconfirm
# Install Path for Composer # Install Path for Composer
if [[ ":$PATH:" != *":$HOME/.config/composer/vendor/bin:"* ]]; then if [[ ":$PATH:" != *":$HOME/.config/composer/vendor/bin:"* ]]; then
@@ -28,33 +28,22 @@ install_php() {
"pdo_mysql" "pdo_mysql"
) )
# Enable Xdebug
sudo sed -i \
-e 's/^;zend_extension=xdebug.so/zend_extension=xdebug.so/' \
-e 's/^;xdebug.mode=debug/xdebug.mode=debug/' \
/etc/php/conf.d/xdebug.ini
for ext in "${extensions_to_enable[@]}"; do for ext in "${extensions_to_enable[@]}"; do
sudo sed -i "s/^;extension=${ext}/extension=${ext}/" "$php_ini_path" sudo sed -i "s/^;extension=${ext}/extension=${ext}/" "$php_ini_path"
done done
} }
install_node() {
echo -e "Installing Node.js...\n"
mise use --global node@lts
}
case "$1" in case "$1" in
ruby) ruby)
echo -e "Installing Ruby on Rails...\n" echo -e "Installing Ruby on Rails...\n"
omarchy-pkg-add libyaml
mise use --global ruby@latest mise use --global ruby@latest
mise settings add idiomatic_version_file_enable_tools ruby mise settings add idiomatic_version_file_enable_tools ruby
mise x ruby -- gem install rails --no-document mise x ruby -- gem install rails --no-document
echo -e "\nYou can now run: rails new myproject" echo -e "\nYou can now run: rails new myproject"
;; ;;
node) node)
install_node echo -e "Installing Node.js...\n"
mise use --global node@lts
;; ;;
bun) bun)
echo -e "Installing Bun...\n" echo -e "Installing Bun...\n"
@@ -75,14 +64,13 @@ php)
laravel) laravel)
echo -e "Installing PHP and Laravel...\n" echo -e "Installing PHP and Laravel...\n"
install_php install_php
install_node
composer global require laravel/installer composer global require laravel/installer
echo -e "\nYou can now run: laravel new myproject" echo -e "\nYou can now run: laravel new myproject"
;; ;;
symfony) symfony)
echo -e "Installing PHP and Symfony...\n" echo -e "Installing PHP and Symfony...\n"
install_php install_php
omarchy-pkg-add symfony-cli yay -S symfony-cli --noconfirm
echo -e "\nYou can now run: symfony new --webapp myproject" echo -e "\nYou can now run: symfony new --webapp myproject"
;; ;;
python) python)
@@ -120,7 +108,6 @@ java)
zig) zig)
echo -e "Installing Zig...\n" echo -e "Installing Zig...\n"
mise use --global zig@latest mise use --global zig@latest
mise use -g zls@latest
;; ;;
ocaml) ocaml)
echo -e "Installing OCaml...\n" echo -e "Installing OCaml...\n"
@@ -133,9 +120,4 @@ dotnet)
echo -e "Installing .NET...\n" echo -e "Installing .NET...\n"
mise use --global dotnet@latest mise use --global dotnet@latest
;; ;;
clojure)
echo -e "Installing Clojure...\n"
omarchy-pkg-add rlwrap
mise use --global clojure@latest
;;
esac esac

View File

@@ -1,24 +1,16 @@
#!/bin/bash #!/bin/bash
options=("MySQL" "PostgreSQL" "Redis" "MongoDB" "MariaDB" "MSSQL") options=("MySQL" "PostgreSQL" "Redis" "MongoDB" "MariaDB")
choices=$(printf "%s\n" "${options[@]}" | gum choose --no-limit --header "Select databases (space to select, return to install, esc to cancel)") || main_menu
if [[ "$#" -eq 0 ]]; then
choices=$(printf "%s\n" "${options[@]}" | gum choose --header "Select database (return to install, esc to cancel)") || main_menu
else
choices="$@"
fi
if [[ -n "$choices" ]]; then if [[ -n "$choices" ]]; then
for db in $choices; do for db in $choices; do
case $db in case $db in
MySQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:3306:3306" --name=mysql8 -e MYSQL_ROOT_PASSWORD= -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:8.4 ;; MySQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:3306:3306" --name=mysql8 -e MYSQL_ROOT_PASSWORD= -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:8.4 ;;
PostgreSQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:5432:5432" --name=postgres17 -e POSTGRES_HOST_AUTH_METHOD=trust postgres:17 ;; PostgreSQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:5432:5432" --name=postgres16 -e POSTGRES_HOST_AUTH_METHOD=trust postgres:16 ;;
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 ;; 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 ;; 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 ;; 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 esac
done done
else
echo "No databases selected for installation."
fi fi

View File

@@ -1,8 +1,9 @@
#!/bin/bash #!/bin/bash
echo "Installing all dependencies..." echo "Installing all dependencies..."
omarchy-pkg-add dropbox dropbox-cli libappindicator-gtk3 python-gpgme nautilus-dropbox yay -S --noconfirm --needed \
dropbox dropbox-cli libappindicator-gtk3 python-gpgme nautilus-dropbox
echo "Starting 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." echo "See Dropbox icon behind  hover tray in top right and right-click for setup."

View File

@@ -1,110 +0,0 @@
#!/bin/bash
#
# Omarchy Final Configurations Installer
#
# This script runs from archinstall's custom_commands after base packages
# and user creation. It switches to the created user and runs install.sh
# to complete package installation and system configuration.
#
# archinstall runs custom_commands as root via:
# arch-chroot -S /mnt bash /var/tmp/user-command.0.sh
#
set -eEo pipefail
# Setup comprehensive logging for chroot execution
# This ensures all output is captured even though we're running inside chroot
CHROOT_LOG_FILE="/var/log/omarchy-install-chroot.log"
mkdir -p "$(dirname "$CHROOT_LOG_FILE")"
touch "$CHROOT_LOG_FILE"
# Redirect all output to both the log file and stdout
# This way:
# 1. Output is saved to /var/log/omarchy-install-chroot.log (inside chroot = /mnt/var/log on ISO)
# 2. Output still goes to stdout so arch-chroot can potentially capture it
# 3. We use exec to redirect the entire script's output from this point forward
exec > >(tee -a "$CHROOT_LOG_FILE") 2>&1
# Log script start with timestamp
echo "========================================"
echo "Omarchy Chroot Install Starting"
echo "Started at: $(date '+%Y-%m-%d %H:%M:%S')"
echo "Log file: $CHROOT_LOG_FILE"
echo "========================================"
echo
# Find the first non-root user (UID >= 1000, < 60000)
OMARCHY_USER=$(getent passwd | awk -F: '$3 >= 1000 && $3 < 60000 {print $1; exit}')
if [[ -z "$OMARCHY_USER" ]]; then
echo "ERROR: No non-root user found!"
echo "Users created:"
getent passwd | awk -F: '$3 >= 1000 {print $1, $3}'
exit 1
fi
echo "Setting up Omarchy for user: $OMARCHY_USER"
# Setup passwordless sudo (will be removed by post-install)
echo "Setting up passwordless sudo..."
mkdir -p /etc/sudoers.d
cat >/etc/sudoers.d/99-omarchy-installer <<EOF
root ALL=(ALL:ALL) NOPASSWD: ALL
%wheel ALL=(ALL:ALL) NOPASSWD: ALL
$OMARCHY_USER ALL=(ALL:ALL) NOPASSWD: ALL
EOF
chmod 440 /etc/sudoers.d/99-omarchy-installer
# Get user info from /tmp (written by configurator)
if [[ -f /tmp/omarchy-user-name.txt ]]; then
OMARCHY_USER_NAME=$(cat /tmp/omarchy-user-name.txt)
else
OMARCHY_USER_NAME=""
fi
if [[ -f /tmp/omarchy-user-email.txt ]]; then
OMARCHY_USER_EMAIL=$(cat /tmp/omarchy-user-email.txt)
else
OMARCHY_USER_EMAIL=""
fi
# Run install.sh as the user
echo "========================================"
echo "Running Omarchy installation as user: $OMARCHY_USER"
echo "========================================"
echo
# Use runuser instead of su for better output handling
# runuser doesn't go through PAM and preserves stdout/stderr better
runuser -u "$OMARCHY_USER" -- bash -c "
set -eEo pipefail
export PYTHONUNBUFFERED=1
export OMARCHY_CHROOT_INSTALL=1
export OMARCHY_ARCHINSTALL_WRAPPER=1
export OMARCHY_USER='$OMARCHY_USER'
export OMARCHY_USER_NAME='$OMARCHY_USER_NAME'
export OMARCHY_USER_EMAIL='$OMARCHY_USER_EMAIL'
cd ~
source /usr/share/omarchy/install.sh
"
exit_code=$?
if [[ $exit_code -eq 0 ]]; then
echo
echo "========================================"
echo "Omarchy install.sh completed successfully!"
echo "========================================"
echo
echo "========================================"
echo "Omarchy Chroot Install Completed"
echo "Finished at: $(date '+%Y-%m-%d %H:%M:%S')"
echo "Log file: $CHROOT_LOG_FILE"
echo "========================================"
else
echo
echo "========================================"
echo "ERROR: Omarchy install.sh exited with code $exit_code"
echo "========================================"
exit $exit_code
fi

View File

@@ -1,3 +1,9 @@
#!/bin/bash
if ! command -v ufw &>/dev/null; then
yay -S --noconfirm --needed ufw ufw-docker
fi
# Allow nothing in, everything out # Allow nothing in, everything out
sudo ufw default deny incoming sudo ufw default deny incoming
sudo ufw default allow outgoing sudo ufw default allow outgoing
@@ -6,15 +12,15 @@ sudo ufw default allow outgoing
sudo ufw allow 53317/udp sudo ufw allow 53317/udp
sudo ufw allow 53317/tcp sudo ufw allow 53317/tcp
# Allow SSH in
sudo ufw allow 22/tcp
# Allow Docker containers to use DNS on host # Allow Docker containers to use DNS on host
sudo ufw allow in proto udp from 172.16.0.0/12 to 172.17.0.1 port 53 comment 'allow-docker-dns' sudo ufw allow in proto udp from 172.16.0.0/12 to 172.17.0.1 port 53 comment 'allow-docker-dns'
# Turn on the firewall # Turn on the firewall
sudo ufw --force enable sudo ufw --force enable
# Enable UFW systemd service to start on boot
sudo systemctl enable ufw
# Turn on Docker protections # Turn on Docker protections
sudo ufw-docker install sudo ufw-docker install
sudo ufw reload sudo ufw reload

View File

@@ -1,5 +1,9 @@
#!/bin/bash #!/bin/bash
echo "Adding multilib repository for 32-bit compatibility"
sudo sed -i '/^\s*#\[multilib\]/,/^$/{s/^\s*#//}' /etc/pacman.conf
sudo pacman -Sy
echo "Now pick dependencies matching your graphics card" echo "Now pick dependencies matching your graphics card"
sudo pacman -Syu --noconfirm steam yay -S steam
setsid gtk-launch steam >/dev/null 2>&1 & setsid gtk-launch steam >/dev/null 2>&1 &

View File

@@ -1,47 +0,0 @@
#!/bin/bash
if (($# == 0)); then
echo "Usage: omarchy-install-terminal [alacritty|ghostty|kitty]"
exit 1
fi
package="$1"
# Map package name to desktop entry ID
case "$package" in
alacritty)
desktop_id="Alacritty.desktop"
;;
ghostty)
desktop_id="com.mitchellh.ghostty.desktop"
;;
kitty)
desktop_id="kitty.desktop"
;;
*)
echo "Unknown terminal: $package"
exit 1
;;
esac
# Install package
if omarchy-pkg-add $package; then
# Set as default terminal
echo "Setting $package as new default terminal..."
sed -i "/export TERMINAL=/ c\export TERMINAL=$package" ~/.config/uwsm/default
# Copy custom desktop entry for alacritty with X-TerminalArg* keys
if [ "$package" = "alacritty" ]; then
mkdir -p ~/.local/share/applications
cp "$OMARCHY_PATH/applications/Alacritty.desktop" ~/.local/share/applications/
fi
# Update xdg-terminals.list to prioritize the proper terminal
cat > ~/.config/xdg-terminals.list << EOF
# Terminal emulator preference order for xdg-terminal-exec
# The first found and valid terminal will be used
$desktop_id
EOF
else
echo "Failed to install $package"
fi

View File

@@ -1,27 +0,0 @@
#!/bin/bash
echo "Installing VSCode..."
omarchy-pkg-add visual-studio-code-bin
mkdir -p ~/.vscode ~/.config/Code/User
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
# Apply Omarchy theme to VSCode
omarchy-theme-set-vscode
setsid gtk-launch code

View File

@@ -1,3 +0,0 @@
#!/bin/bash
exec setsid uwsm-app -- xdg-terminal-exec --app-id=com.omarchy.Omarchy -e bash -c 'fastfetch; read -n 1 -s'

View File

@@ -1,12 +1,3 @@
#!/bin/bash #!/bin/bash
default_browser=$(xdg-settings get default-web-browser) exec setsid uwsm app -- $(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,/usr}/share/applications/$(xdg-settings get default-web-browser) 2>/dev/null | head -1) ${args[@]} $@
browser_exec=$(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,~/.nix-profile,/usr}/share/applications/$default_browser 2>/dev/null | head -1)
if [[ $browser_exec =~ (firefox|zen|librewolf) ]]; then
private_flag="--private-window"
else
private_flag="--incognito"
fi
exec setsid uwsm-app -- "$browser_exec" "${@/--private/$private_flag}"

View File

@@ -1,12 +0,0 @@
#!/bin/bash
omarchy-cmd-present "$EDITOR" || EDITOR=nvim
case "$EDITOR" in
nvim | vim | nano | micro | hx | helix)
exec setsid uwsm-app -- xdg-terminal-exec "$EDITOR" "$@"
;;
*)
exec setsid uwsm-app -- "$EDITOR" "$@"
;;
esac

View File

@@ -1,4 +0,0 @@
#!/bin/bash
cmd="$*"
exec setsid uwsm-app -- xdg-terminal-exec --app-id=com.omarchy.Omarchy --title=Omarchy -e bash -c "omarchy-show-logo; $cmd; omarchy-show-done"

View File

@@ -1,16 +0,0 @@
#!/bin/bash
if (($# == 0)); then
echo "Usage: omarchy-launch-or-focus [window-pattern] [launch-command]"
exit 1
fi
WINDOW_PATTERN="$1"
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
hyprctl dispatch focuswindow "address:$WINDOW_ADDRESS"
else
eval exec $LAUNCH_COMMAND
fi

View File

@@ -1,12 +0,0 @@
#!/bin/bash
if (($# == 0)); then
echo "Usage: omarchy-launch-or-focus-webapp [window-pattern] [url-and-flags...]"
exit 1
fi
WINDOW_PATTERN="$1"
shift
LAUNCH_COMMAND="omarchy-launch-webapp $@"
exec omarchy-launch-or-focus "$WINDOW_PATTERN" "$LAUNCH_COMMAND"

View File

@@ -1,10 +1,5 @@
#!/bin/bash #!/bin/bash
# Exit early if we don't have the tte show
if ! command -v tte &>/dev/null; then
exit 1
fi
# Exit early if screensave is already running # Exit early if screensave is already running
pgrep -f "alacritty --class Screensaver" && exit 0 pgrep -f "alacritty --class Screensaver" && exit 0
@@ -17,8 +12,6 @@ focused=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')
for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do
hyprctl dispatch focusmonitor $m hyprctl dispatch focusmonitor $m
# FIXME: Find a way to make this generic where we it can work for kitty + ghostty
hyprctl dispatch exec -- \ hyprctl dispatch exec -- \
alacritty --class Screensaver \ alacritty --class Screensaver \
--config-file ~/.local/share/omarchy/default/alacritty/screensaver.toml \ --config-file ~/.local/share/omarchy/default/alacritty/screensaver.toml \

View File

@@ -1,13 +0,0 @@
#!/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 "$@"

View File

@@ -3,8 +3,8 @@
browser=$(xdg-settings get default-web-browser) browser=$(xdg-settings get default-web-browser)
case $browser in case $browser in
google-chrome* | brave-browser* | microsoft-edge* | opera* | vivaldi* | helium-browser*) ;; google-chrome* | brave-browser* | microsoft-edge* | opera* | vivaldi*) ;;
*) browser="chromium.desktop" ;; *) browser="chromium.desktop" ;;
esac 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,/usr}/share/applications/$browser 2>/dev/null | head -1) --app="$1" "${@:2}"

View File

@@ -1,3 +0,0 @@
#!/bin/bash
exec setsid uwsm-app -- xdg-terminal-exec --app-id=com.omarchy.Impala -e impala "$@"

View File

@@ -2,21 +2,6 @@
export PATH="$HOME/.local/share/omarchy/bin:$PATH" export PATH="$HOME/.local/share/omarchy/bin:$PATH"
# Set to true when going directly to a submenu, so we can exit directly
BACK_TO_EXIT=false
back_to() {
local parent_menu="$1"
if [[ "$BACK_TO_EXIT" == "true" ]]; then
exit 0
elif [[ -n "$parent_menu" ]]; then
"$parent_menu"
else
show_main_menu
fi
}
menu() { menu() {
local prompt="$1" local prompt="$1"
local options="$2" local options="$2"
@@ -29,48 +14,36 @@ menu() {
local index local index
index=$(echo -e "$options" | grep -nxF "$preselect" | cut -d: -f1) index=$(echo -e "$options" | grep -nxF "$preselect" | cut -d: -f1)
if [[ -n "$index" ]]; then if [[ -n "$index" ]]; then
args+=("-c" "$index") args+=("-a" "$index")
fi fi
fi fi
echo -e "$options" | omarchy-launch-walker --dmenu --width 295 --minheight 1 --maxheight 600 -p "$prompt…" "${args[@]}" 2>/dev/null echo -e "$options" | walker --dmenu --theme dmenu_250 -p "$prompt…" "${args[@]}"
} }
terminal() { terminal() {
xdg-terminal-exec --app-id=com.omarchy.Omarchy "$@" alacritty --class Omarchy -e "$@"
} }
present_terminal() { present_terminal() {
omarchy-launch-floating-terminal-with-presentation $1 alacritty --class Omarchy -e bash -c "omarchy-show-logo; eval \"$1\"; omarchy-show-done;"
} }
open_in_editor() { edit_in_nvim() {
notify-send "Editing config file" "$1" notify-send "Editing config file" "$1"
omarchy-launch-editor "$1" alacritty -e nvim "$1"
} }
install() { install() {
present_terminal "echo 'Installing $1...'; sudo pacman -S --noconfirm $2" present_terminal "echo 'Installing $1...'; yay -Sy --noconfirm $2"
} }
install_and_launch() { install_and_launch() {
present_terminal "echo 'Installing $1...'; sudo pacman -S --noconfirm $2 && setsid gtk-launch $3" present_terminal "echo 'Installing $1...'; yay -Sy --noconfirm $2 && setsid gtk-launch $3"
} }
install_font() { install_font() {
present_terminal "echo 'Installing $1...'; sudo pacman -S --noconfirm --needed $2 && sleep 2 && omarchy-font-set '$3'" present_terminal "echo 'Installing $1...'; yay -Sy --noconfirm --needed $2 && sleep 2 && omarchy-font-set '$3'"
}
install_terminal() {
present_terminal "omarchy-install-terminal $1"
}
aur_install() {
present_terminal "echo 'Installing $1 from AUR...'; yay -S --noconfirm $2"
}
aur_install_and_launch() {
present_terminal "echo 'Installing $1 from AUR...'; yay -S --noconfirm $2 && setsid gtk-launch $3"
} }
show_learn_menu() { show_learn_menu() {
@@ -85,49 +58,58 @@ show_learn_menu() {
esac esac
} }
show_trigger_menu() { show_style_menu() {
case $(menu "Trigger" " Capture\n Share\n󰔎 Toggle") in case $(menu "Style" "󰸌 Theme\n Font\n Background\n󱄄 Screensaver\n About") in
*Capture*) show_capture_menu ;; *Theme*) show_theme_menu ;;
*Share*) show_share_menu ;; *Font*) show_font_menu ;;
*Toggle*) show_toggle_menu ;; *Background*) omarchy-theme-bg-next ;;
*Screensaver*) edit_in_nvim ~/.config/omarchy/branding/screensaver.txt ;;
*About*) edit_in_nvim ~/.config/omarchy/branding/about.txt ;;
*) show_main_menu ;; *) show_main_menu ;;
esac esac
} }
show_theme_menu() {
theme=$(menu "Theme" "$(omarchy-theme-list)" "" "$(omarchy-theme-current)")
if [[ "$theme" == "CNCLD" || -z "$theme" ]]; then
show_main_menu
else
omarchy-theme-set "$theme"
fi
}
show_font_menu() {
theme=$(menu "Font" "$(omarchy-font-list)" "-w 350" "$(omarchy-font-current)")
if [[ "$theme" == "CNCLD" || -z "$theme" ]]; then
show_main_menu
else
omarchy-font-set "$theme"
fi
}
show_capture_menu() { show_capture_menu() {
case $(menu "Capture" " Screenshot\n Screenrecord\n󰃉 Color") in case $(menu "Capture" " Screenshot\n Screenrecord\n󰃉 Color") in
*Screenshot*) show_screenshot_menu ;; *Screenshot*) show_screenshot_menu ;;
*Screenrecord*) show_screenrecord_menu ;; *Screenrecord*) show_screenrecord_menu ;;
*Color*) pkill hyprpicker || hyprpicker -a ;; *Color*) pkill hyprpicker || hyprpicker -a ;;
*) show_trigger_menu ;; *) show_main_menu ;;
esac esac
} }
show_screenshot_menu() { show_screenshot_menu() {
case $(menu "Screenshot" " Snap with Editing\n Straight to Clipboard") in case $(menu "Screenshot" " Region\n Window\n Display") in
*Editing*) omarchy-cmd-screenshot smart ;; *Region*) omarchy-cmd-screenshot ;;
*Clipboard*) omarchy-cmd-screenshot smart clipboard ;; *Window*) omarchy-cmd-screenshot window ;;
*Display*) omarchy-cmd-screenshot output ;;
*) show_capture_menu ;; *) show_capture_menu ;;
esac esac
} }
show_screenrecord_menu() { show_screenrecord_menu() {
case $(menu "Screenrecord" " Region\n Region + Audio\n Display\n Display + Audio\n Display + Webcam") in case $(menu "Screenrecord" " Region\n Display") in
*"Region + Audio"*) omarchy-cmd-screenrecord region --with-audio ;;
*Region*) omarchy-cmd-screenrecord ;; *Region*) omarchy-cmd-screenrecord ;;
*"Display + Audio"*) omarchy-cmd-screenrecord output --with-audio ;;
*"Display + Webcam"*) omarchy-cmd-screenrecord output --with-audio --with-webcam ;;
*Display*) omarchy-cmd-screenrecord output ;; *Display*) omarchy-cmd-screenrecord output ;;
*) back_to show_capture_menu ;; *) show_capture_menu ;;
esac
}
show_share_menu() {
case $(menu "Share" " Clipboard\n File \n Folder") in
*Clipboard*) terminal bash -c "omarchy-cmd-share clipboard" ;;
*File*) terminal bash -c "omarchy-cmd-share file" ;;
*Folder*) terminal bash -c "omarchy-cmd-share folder" ;;
*) back_to show_trigger_menu ;;
esac esac
} }
@@ -137,64 +119,27 @@ show_toggle_menu() {
*Nightlight*) omarchy-toggle-nightlight ;; *Nightlight*) omarchy-toggle-nightlight ;;
*Idle*) omarchy-toggle-idle ;; *Idle*) omarchy-toggle-idle ;;
*Bar*) omarchy-toggle-waybar ;; *Bar*) omarchy-toggle-waybar ;;
*) show_trigger_menu ;;
esac
}
show_style_menu() {
case $(menu "Style" "󰸌 Theme\n Font\n Background\n Hyprland\n󱄄 Screensaver\n About") in
*Theme*) show_theme_menu ;;
*Font*) show_font_menu ;;
*Background*) omarchy-theme-bg-next ;;
*Hyprland*) open_in_editor ~/.config/hypr/looknfeel.conf ;;
*Screensaver*) open_in_editor ~/.config/omarchy/branding/screensaver.txt ;;
*About*) open_in_editor ~/.config/omarchy/branding/about.txt ;;
*) show_main_menu ;; *) show_main_menu ;;
esac esac
} }
show_theme_menu() {
theme=$(menu "Theme" "$(omarchy-theme-list)" "" "$(omarchy-theme-current)")
if [[ "$theme" == "CNCLD" || -z "$theme" ]]; then
back_to show_style_menu
else
omarchy-theme-set "$theme"
fi
}
show_font_menu() {
theme=$(menu "Font" "$(omarchy-font-list)" "--width 350" "$(omarchy-font-current)")
if [[ "$theme" == "CNCLD" || -z "$theme" ]]; then
back_to show_style_menu
else
omarchy-font-set "$theme"
fi
}
show_setup_menu() { show_setup_menu() {
local options=" Audio\n Wifi\n󰂯 Bluetooth\n󱐋 Power Profile\n󰍹 Monitors" local options=" Audio\n Wifi\n󰂯 Bluetooth\n󱐋 Power Profile\n󰍹 Monitors"
[ -f ~/.config/hypr/bindings.conf ] && options="$options\n Keybindings" [ -f ~/.config/hypr/bindings.conf ] && options="$options\n Keybindings"
[ -f ~/.config/hypr/input.conf ] && options="$options\n Input" [ -f ~/.config/hypr/input.conf ] && options="$options\n Input"
options="$options\n Defaults\n󰱔 DNS\n Security\n Config" options="$options\n Config\n󰈷 Fingerprint\n Fido2"
case $(menu "Setup" "$options") in case $(menu "Setup" "$options") in
*Audio*) xdg-terminal-exec --app-id=com.omarchy.Wiremix -e wiremix ;; *Audio*) alacritty --class=Wiremix -e wiremix ;;
*Wifi*) *Wifi*) alacritty --class=Impala -e bash -c "rfkill unblock wifi; impala" ;;
rfkill unblock wifi *Bluetooth*) blueberry ;;
omarchy-launch-wifi
;;
*Bluetooth*)
rfkill unblock bluetooth
blueberry
;;
*Power*) show_setup_power_menu ;; *Power*) show_setup_power_menu ;;
*Monitors*) open_in_editor ~/.config/hypr/monitors.conf ;; *Monitors*) edit_in_nvim ~/.config/hypr/monitors.conf ;;
*Keybindings*) open_in_editor ~/.config/hypr/bindings.conf ;; *Keybindings*) edit_in_nvim ~/.config/hypr/bindings.conf ;;
*Input*) open_in_editor ~/.config/hypr/input.conf ;; *Input*) edit_in_nvim ~/.config/hypr/input.conf ;;
*Defaults*) open_in_editor ~/.config/uwsm/default ;;
*DNS*) present_terminal omarchy-setup-dns ;;
*Security*) show_setup_security_menu ;;
*Config*) show_setup_config_menu ;; *Config*) show_setup_config_menu ;;
*Fingerprint*) present_terminal omarchy-setup-fingerprint ;;
*Fido2*) present_terminal omarchy-setup-fido2 ;;
*) show_main_menu ;; *) show_main_menu ;;
esac esac
} }
@@ -203,7 +148,7 @@ show_setup_power_menu() {
profile=$(menu "Power Profile" "$(omarchy-powerprofiles-list)" "" "$(powerprofilesctl get)") profile=$(menu "Power Profile" "$(omarchy-powerprofiles-list)" "" "$(powerprofilesctl get)")
if [[ "$profile" == "CNCLD" || -z "$profile" ]]; then if [[ "$profile" == "CNCLD" || -z "$profile" ]]; then
back_to show_setup_menu show_main_menu
else else
powerprofilesctl set "$profile" powerprofilesctl set "$profile"
fi fi
@@ -211,99 +156,69 @@ show_setup_power_menu() {
show_setup_config_menu() { show_setup_config_menu() {
case $(menu "Setup" " Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar\n󰞅 XCompose") in case $(menu "Setup" " Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar\n󰞅 XCompose") in
*Hyprland*) open_in_editor ~/.config/hypr/hyprland.conf ;; *Hyprland*) edit_in_nvim ~/.config/hypr/hyprland.conf ;;
*Hypridle*) open_in_editor ~/.config/hypr/hypridle.conf && omarchy-restart-hypridle ;; *Hypridle*) edit_in_nvim ~/.config/hypr/hypridle.conf && omarchy-restart-hypridle ;;
*Hyprlock*) open_in_editor ~/.config/hypr/hyprlock.conf ;; *Hyprlock*) edit_in_nvim ~/.config/hypr/hyprlock.conf ;;
*Hyprsunset*) open_in_editor ~/.config/hypr/hyprsunset.conf && omarchy-restart-hyprsunset ;; *Hyprsunset*) edit_in_nvim ~/.config/hypr/hyprsunset.conf && omarchy-restart-hyprsunset ;;
*Swayosd*) open_in_editor ~/.config/swayosd/config.toml && omarchy-restart-swayosd ;; *Swayosd*) edit_in_nvim ~/.config/swayosd/config.toml && omarchy-restart-swayosd ;;
*Walker*) open_in_editor ~/.config/walker/config.toml && omarchy-restart-walker ;; *Walker*) edit_in_nvim ~/.config/walker/config.toml && omarchy-restart-walker ;;
*Waybar*) open_in_editor ~/.config/waybar/config.jsonc && omarchy-restart-waybar ;; *Waybar*) edit_in_nvim ~/.config/waybar/config.jsonc && omarchy-restart-waybar ;;
*XCompose*) open_in_editor ~/.XCompose && omarchy-restart-xcompose ;; *XCompose*) edit_in_nvim ~/.XCompose && omarchy-restart-xcompose ;;
*) show_main_menu ;; *) show_main_menu ;;
esac esac
} }
show_setup_security_menu() {
case $(menu "Setup" "󰈷 Fingerprint\n Fido2") in
*Fingerprint*) present_terminal omarchy-setup-fingerprint ;;
*Fido2*) present_terminal omarchy-setup-fido2 ;;
*) show_setup_menu ;;
esac
}
show_install_menu() { show_install_menu() {
case $(menu "Install" "󰣇 Package\n󰣇 AUR\n Web App\n TUI\n Service\n Style\n󰵮 Development\n Editor\n Terminal\n󱚤 AI\n󰍲 Windows\n Gaming") in case $(menu "Install" "󰣇 Package\n Web App\n TUI\n Service\n Style\n󰵮 Development\n Editor\n󱚤 AI\n Gaming") in
*Package*) terminal omarchy-pkg-install ;; *Package*) terminal omarchy-pkg-install ;;
*AUR*) terminal omarchy-pkg-aur-install ;;
*Web*) present_terminal omarchy-webapp-install ;; *Web*) present_terminal omarchy-webapp-install ;;
*TUI*) present_terminal omarchy-tui-install ;; *TUI*) present_terminal omarchy-tui-install ;;
*Service*) show_install_service_menu ;; *Service*) show_install_service_menu ;;
*Style*) show_install_style_menu ;; *Style*) show_install_style_menu ;;
*Development*) show_install_development_menu ;; *Development*) show_install_development_menu ;;
*Editor*) show_install_editor_menu ;; *Editor*) show_install_editor_menu ;;
*Terminal*) show_install_terminal_menu ;;
*AI*) show_install_ai_menu ;; *AI*) show_install_ai_menu ;;
*Windows*) present_terminal "omarchy-windows-vm install" ;;
*Gaming*) show_install_gaming_menu ;; *Gaming*) show_install_gaming_menu ;;
*) show_main_menu ;; *) show_main_menu ;;
esac esac
} }
show_install_service_menu() { show_install_service_menu() {
case $(menu "Install" " Dropbox\n Tailscale\n󰟵 Bitwarden\n Chromium Account") in case $(menu "Install" "󱨑 Firewall\n Dropbox\n Tailscale") in
*Firewall*) present_terminal omarchy-install-firewall ;;
*Dropbox*) present_terminal omarchy-install-dropbox ;; *Dropbox*) present_terminal omarchy-install-dropbox ;;
*Tailscale*) present_terminal omarchy-install-tailscale ;; *Tailscale*) present_terminal omarchy-install-tailscale ;;
*Bitwarden*) install_and_launch "Bitwarden" "bitwarden bitwarden-cli" "bitwarden" ;;
*Chromium*) present_terminal omarchy-install-chromium-google-account ;;
*) show_install_menu ;; *) show_install_menu ;;
esac esac
} }
show_install_editor_menu() { show_install_editor_menu() {
case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Emacs") in case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix") in
*VSCode*) present_terminal omarchy-install-vscode ;; *VSCode*) install_and_launch "VSCode" "visual-studio-code-bin" "code" ;;
*Cursor*) install_and_launch "Cursor" "cursor-bin" "cursor" ;; *Cursor*) install_and_launch "Cursor" "cursor-bin" "cursor" ;;
*Zed*) install_and_launch "Zed" "zed" "dev.zed.Zed" ;; *Zed*) install_and_launch "Zed" "zed" "dev.zed.Zed" ;;
*Sublime*) install_and_launch "Sublime Text" "sublime-text-4" "sublime_text" ;; *Sublime*) install_and_launch "Sublime Text" "sublime-text-4" "sublime_text" ;;
*Helix*) install "Helix" "helix" ;; *Helix*) install "Helix" "helix" ;;
*Emacs*) install "Emacs" "emacs-wayland" && systemctl --user enable --now emacs.service ;;
*) show_install_menu ;;
esac
}
show_install_terminal_menu() {
case $(menu "Install" " Alacritty\n Ghostty\n Kitty") in
*Alacritty*) install_terminal "alacritty" ;;
*Ghostty*) install_terminal "ghostty" ;;
*Kitty*) install_terminal "kitty" ;;
*) show_install_menu ;; *) show_install_menu ;;
esac esac
} }
show_install_ai_menu() { show_install_ai_menu() {
ollama_pkg=$( case $(menu "Install" "󱚤 Claude Code\n󱚤 Gemini\n󱚤 LM Studio\n󱚤 Ollama\n󱚤 Crush\n󱚤 opencode") in
(command -v nvidia-smi &>/dev/null && echo ollama-cuda) ||
(command -v rocminfo &>/dev/null && echo ollama-rocm) ||
echo ollama
)
case $(menu "Install" "󱚤 Claude Code\n󱚤 Cursor CLI\n󱚤 Gemini\n󱚤 OpenAI Codex\n󱚤 LM Studio\n󱚤 Ollama\n󱚤 Crush\n󱚤 opencode") in
*Claude*) install "Claude Code" "claude-code" ;; *Claude*) install "Claude Code" "claude-code" ;;
*Cursor*) install "Cursor CLI" "cursor-cli" ;; *Gemini*) install "Gemini" "gemini-cli-bin" ;;
*OpenAI*) install "OpenAI Codex" "openai-codex-bin" ;;
*Gemini*) install "Gemini" "gemini-cli" ;;
*Studio*) install "LM Studio" "lmstudio" ;; *Studio*) install "LM Studio" "lmstudio" ;;
*Ollama*) install "Ollama" $ollama_pkg ;; *Ollama*) install "Ollama" "ollama" ;;
*Crush*) install "Crush" "crush-bin" ;; *Crush*) install "Crush" "crush-bin" ;;
*opencode*) install "opencode" "opencode" ;; *opencode*) install "opencode" "opencode-bin" ;;
*) show_install_menu ;; *) show_install_menu ;;
esac esac
} }
show_install_gaming_menu() { show_install_gaming_menu() {
case $(menu "Install" " Steam\n RetroArch [AUR]\n󰍳 Minecraft") in case $(menu "Install" " Steam\n RetroArch\n󰍳 Minecraft") in
*Steam*) present_terminal omarchy-install-steam ;; *Steam*) present_terminal omarchy-install-steam ;;
*RetroArch*) aur_install_and_launch "RetroArch" "retroarch retroarch-assets libretro libretro-fbneo" "com.libretro.RetroArch.desktop" ;; *RetroArch*) install_and_launch "RetroArch" "retroarch retroarch-assets libretro libretro-fbneo" "com.libretro.RetroArch.desktop" ;;
*Minecraft*) install_and_launch "Minecraft" "minecraft-launcher" "minecraft-launcher" ;; *Minecraft*) install_and_launch "Minecraft" "minecraft-launcher" "minecraft-launcher" ;;
*) show_install_menu ;; *) show_install_menu ;;
esac esac
@@ -319,7 +234,7 @@ show_install_style_menu() {
} }
show_install_font_menu() { show_install_font_menu() {
case $(menu "Install" " Meslo LG Mono\n Fira Code\n Victor Code\n Bistream Vera Mono" "--width 350") in case $(menu "Install" " Meslo LG Mono\n Fira Code\n Victor Code\n Bistream Vera Mono" "-w 350") in
*Meslo*) install_font "Meslo LG Mono" "ttf-meslo-nerd" "MesloLGL Nerd Font" ;; *Meslo*) install_font "Meslo LG Mono" "ttf-meslo-nerd" "MesloLGL Nerd Font" ;;
*Fira*) install_font "Fira Code" "ttf-firacode-nerd" "FiraCode 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" ;; *Victor*) install_font "Victor Code" "ttf-victor-mono-nerd" "VictorMono Nerd Font" ;;
@@ -329,7 +244,7 @@ show_install_font_menu() {
} }
show_install_development_menu() { show_install_development_menu() {
case $(menu "Install" "󰫏 Ruby on Rails\n Docker DB\n JavaScript\n Go\n PHP\n Python\n Elixir\n Zig\n Rust\n Java\n .NET\n OCaml\n Clojure") in case $(menu "Install" "󰫏 Ruby on Rails\n Docker DB\n JavaScript\n Go\n PHP\n Python\n Elixir\n Zig\n Rust\n Java\n .NET\n OCaml") in
*Rails*) present_terminal "omarchy-install-dev-env ruby" ;; *Rails*) present_terminal "omarchy-install-dev-env ruby" ;;
*Docker*) present_terminal omarchy-install-docker-dbs ;; *Docker*) present_terminal omarchy-install-docker-dbs ;;
*JavaScript*) show_install_javascript_menu ;; *JavaScript*) show_install_javascript_menu ;;
@@ -342,7 +257,6 @@ show_install_development_menu() {
*Java*) present_terminal "omarchy-install-dev-env java" ;; *Java*) present_terminal "omarchy-install-dev-env java" ;;
*NET*) present_terminal "omarchy-install-dev-env dotnet" ;; *NET*) present_terminal "omarchy-install-dev-env dotnet" ;;
*OCaml*) present_terminal "omarchy-install-dev-env ocaml" ;; *OCaml*) present_terminal "omarchy-install-dev-env ocaml" ;;
*Clojure*) present_terminal "omarchy-install-dev-env clojure" ;;
*) show_install_menu ;; *) show_install_menu ;;
esac esac
} }
@@ -374,12 +288,11 @@ show_install_elixir_menu() {
} }
show_remove_menu() { show_remove_menu() {
case $(menu "Remove" "󰣇 Package\n Web App\n TUI\n󰸌 Theme\n󰍲 Windows\n󰈷 Fingerprint\n Fido2") in case $(menu "Remove" "󰣇 Package\n Web App\n TUI\n󰸌 Theme\n󰈷 Fingerprint\n Fido2") in
*Package*) terminal omarchy-pkg-remove ;; *Package*) terminal omarchy-pkg-remove ;;
*Web*) present_terminal omarchy-webapp-remove ;; *Web*) present_terminal omarchy-webapp-remove ;;
*TUI*) present_terminal omarchy-tui-remove ;; *TUI*) present_terminal omarchy-tui-remove ;;
*Theme*) present_terminal omarchy-theme-remove ;; *Theme*) present_terminal omarchy-theme-remove ;;
*Windows*) present_terminal "omarchy-windows-vm remove" ;;
*Fingerprint*) present_terminal "omarchy-setup-fingerprint --remove" ;; *Fingerprint*) present_terminal "omarchy-setup-fingerprint --remove" ;;
*Fido2*) present_terminal "omarchy-setup-fido2 --remove" ;; *Fido2*) present_terminal "omarchy-setup-fido2 --remove" ;;
*) show_main_menu ;; *) show_main_menu ;;
@@ -387,16 +300,12 @@ show_remove_menu() {
} }
show_update_menu() { show_update_menu() {
case $(menu "Update" " Omarchy\n Config\n󰸌 Extra Themes\n Process\n󰇅 Hardware\n Firmware\n Password\n Timezone\n Time") in case $(menu "Update" "󰣇 Omarchy\n Config\n󰸌 Themes\n Process\n Timezone") in
*Omarchy*) present_terminal omarchy-update ;; *Omarchy*) present_terminal omarchy-update ;;
*Config*) show_update_config_menu ;; *Config*) show_update_config_menu ;;
*Themes*) present_terminal omarchy-theme-update ;; *Themes*) present_terminal omarchy-theme-update ;;
*Process*) show_update_process_menu ;; *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 ;;
*Time*) present_terminal omarchy-update-time ;;
*Password*) show_update_password_menu ;;
*) show_main_menu ;; *) show_main_menu ;;
esac esac
} }
@@ -408,7 +317,7 @@ show_update_process_menu() {
*Swayosd*) omarchy-restart-swayosd ;; *Swayosd*) omarchy-restart-swayosd ;;
*Walker*) omarchy-restart-walker ;; *Walker*) omarchy-restart-walker ;;
*Waybar*) omarchy-restart-waybar ;; *Waybar*) omarchy-restart-waybar ;;
*) show_update_menu ;; *) show_main_menu ;;
esac esac
} }
@@ -422,64 +331,46 @@ show_update_config_menu() {
*Swayosd*) present_terminal omarchy-refresh-swayosd ;; *Swayosd*) present_terminal omarchy-refresh-swayosd ;;
*Walker*) present_terminal omarchy-refresh-walker ;; *Walker*) present_terminal omarchy-refresh-walker ;;
*Waybar*) present_terminal omarchy-refresh-waybar ;; *Waybar*) present_terminal omarchy-refresh-waybar ;;
*) show_update_menu ;; *) show_main_menu ;;
esac
}
show_update_hardware_menu() {
case $(menu "Restart" " Audio\n󱚾 Wi-Fi\n󰂯 Bluetooth") in
*Audio*) present_terminal omarchy-restart-pipewire ;;
*Wi-Fi*) present_terminal omarchy-restart-wifi ;;
*Bluetooth*) present_terminal omarchy-restart-bluetooth ;;
*) show_update_menu ;;
esac
}
show_update_password_menu() {
case $(menu "Update Password" " Drive Encryption\n User") in
*Drive*) present_terminal omarchy-drive-set-password ;;
*User*) present_terminal passwd ;;
*) show_update_menu ;;
esac esac
} }
show_system_menu() { show_system_menu() {
case $(menu "System" " Lock\n󱄄 Screensaver\n󰤄 Suspend\n󰜉 Restart\n󰐥 Shutdown") in case $(menu "System" " Lock\n󱄄 Screensaver\n󰤄 Suspend\n Relaunch\n󰜉 Restart\n󰐥 Shutdown") in
*Lock*) omarchy-lock-screen ;; *Lock*) omarchy-lock-screen ;;
*Screensaver*) omarchy-launch-screensaver force ;; *Screensaver*) omarchy-launch-screensaver force ;;
*Suspend*) systemctl suspend ;; *Suspend*) systemctl suspend ;;
*Restart*) omarchy-state clear re*-required && systemctl reboot --no-wall ;; *Relaunch*) uwsm stop ;;
*Shutdown*) omarchy-state clear re*-required && systemctl poweroff --no-wall ;; *Restart*) systemctl reboot ;;
*) back_to show_main_menu ;; *Shutdown*) systemctl poweroff ;;
*) show_main_menu ;;
esac esac
} }
show_main_menu() { show_main_menu() {
go_to_menu "$(menu "Go" "󰀻 Apps\n󰧑 Learn\n󱓞 Trigger\n Style\n Setup\n󰉉 Install\n󰭌 Remove\n Update\n About\n System")" go_to_menu "$(menu "Go" "󰀻 Apps\n󰧑 Learn\n Capture\n󰔎 Toggle\n Style\n Setup\n󰉉 Install\n󰭌 Remove\n Update\n About\n System")"
} }
go_to_menu() { go_to_menu() {
case "${1,,}" in case "${1,,}" in
*apps*) walker -p "Launch…" ;; *apps*) walker -p "Launch…" ;;
*learn*) show_learn_menu ;; *learn*) show_learn_menu ;;
*trigger*) show_trigger_menu ;;
*share*) show_share_menu ;;
*style*) show_style_menu ;; *style*) show_style_menu ;;
*theme*) show_theme_menu ;; *theme*) show_theme_menu ;;
*capture*) show_capture_menu ;;
*screenshot*) show_screenshot_menu ;; *screenshot*) show_screenshot_menu ;;
*screenrecord*) show_screenrecord_menu ;; *screenrecord*) show_screenrecord_menu ;;
*toggle*) show_toggle_menu ;;
*setup*) show_setup_menu ;; *setup*) show_setup_menu ;;
*power*) show_setup_power_menu ;;
*install*) show_install_menu ;; *install*) show_install_menu ;;
*remove*) show_remove_menu ;; *remove*) show_remove_menu ;;
*update*) show_update_menu ;; *update*) show_update_menu ;;
*about*) omarchy-launch-about ;;
*system*) show_system_menu ;; *system*) show_system_menu ;;
*about*) terminal bash -c 'fastfetch; read -n 1 -s' ;;
esac esac
} }
if [[ -n "$1" ]]; then if [[ -n "$1" ]]; then
BACK_TO_EXIT=true
go_to_menu "$1" go_to_menu "$1"
else else
show_main_menu show_main_menu

View File

@@ -3,80 +3,6 @@
# A script to display Hyprland keybindings defined in your configuration # A script to display Hyprland keybindings defined in your configuration
# using walker for an interactive search menu. # 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}"
elif [[ "$line" =~ mouse:([0-9]+) ]]; then
code="${BASH_REMATCH[1]}"
case "$code" in
272) symbol="LEFT MOUSE BUTTON" ;;
273) symbol="RIGHT MOUSE BUTTON" ;;
274) symbol="MIDDLE MOUSE BUTTON" ;;
*) symbol="mouse:${code}" ;;
esac
echo "${line/mouse:${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 # Fetch dynamic keybindings from Hyprland
# #
# Also do some pre-processing: # Also do some pre-processing:
@@ -85,35 +11,30 @@ parse_keycodes() {
# - Map numeric modifier key mask to a textual rendition # - Map numeric modifier key mask to a textual rendition
# - Output comma-separated values that the parser can understand # - Output comma-separated values that the parser can understand
dynamic_bindings() { dynamic_bindings() {
hyprctl -j binds | hyprctl -j binds | \
jq -r '.[] | {modmask, key, keycode, description, dispatcher, arg} | "\(.modmask),\(.key)@\(.keycode),\(.description),\(.dispatcher),\(.arg)"' | jq -r '.[] | {modmask, key, keycode, description, dispatcher, arg} | "\(.modmask),\(.key)@\(.keycode),\(.description),\(.dispatcher),\(.arg)"' | \
sed -r \ sed -r \
-e 's/null//' \ -e 's/null//' \
-e 's,uwsm app -- ,,' \ -e 's,~/.local/share/omarchy/bin/,,' \
-e 's,uwsm-app -- ,,' \ -e 's,uwsm app -- ,,' \
-e 's/@0//' \ -e 's/@0//' \
-e 's/,@/,code:/' \ -e 's/,@/,code:/' \
-e 's/^0,/,/' \ -e 's/^0,/,/' \
-e 's/^1,/SHIFT,/' \ -e 's/^1,/SHIFT,/' \
-e 's/^4,/CTRL,/' \ -e 's/^4,/CTRL,/' \
-e 's/^5,/SHIFT CTRL,/' \ -e 's/^5,/SHIFT CTRL,/' \
-e 's/^8,/ALT,/' \ -e 's/^8,/ALT,/' \
-e 's/^9,/SHIFT ALT,/' \ -e 's/^9,/SHIFT ALT,/' \
-e 's/^12,/CTRL ALT,/' \ -e 's/^12,/CTRL ALT,/' \
-e 's/^13,/SHIFT CTRL ALT,/' \ -e 's/^13,/SHIFT CTRL ALT,/' \
-e 's/^64,/SUPER,/' \ -e 's/^64,/SUPER,/' \
-e 's/^65,/SUPER SHIFT,/' \ -e 's/^65,/SUPER SHIFT,/' \
-e 's/^68,/SUPER CTRL,/' \ -e 's/^68,/SUPER CTRL,/' \
-e 's/^69,/SUPER SHIFT CTRL,/' \ -e 's/^69,/SUPER SHIFT CTRL,/' \
-e 's/^72,/SUPER ALT,/' \ -e 's/^72,/SUPER ALT,/' \
-e 's/^73,/SUPER SHIFT ALT,/' \ -e 's/^73,/SUPER SHIFT ALT,/' \
-e 's/^76,/SUPER CTRL ALT,/' \ -e 's/^76,/SUPER CTRL ALT,/' \
-e 's/^77,/SUPER SHIFT CTRL ALT,/' -e 's/^77,/SUPER SHIFT CTRL ALT,/'
}
# Hardcoded bindings, like the copy-url extension and such
static_bindings() {
echo "SHIFT ALT,L,Copy URL from Web App,extension,copy-url"
} }
# Parse and format keybindings # Parse and format keybindings
@@ -162,67 +83,7 @@ parse_bindings() {
}' }'
} }
prioritize_entries() { dynamic_bindings | \
awk ' sort -u | \
{ parse_bindings | \
line = $0 walker --dmenu --theme keybindings -p 'Keybindings'
prio = 50
if (match(line, /Terminal/)) prio = 0
if (match(line, /Browser/) && !match(line, /Browser[[:space:]]*\(/)) prio = 1
if (match(line, /File manager/)) prio = 2
if (match(line, /Launch apps/)) prio = 3
if (match(line, /Omarchy menu/)) prio = 4
if (match(line, /System menu/)) prio = 5
if (match(line, /Theme menu/)) prio = 6
if (match(line, /Full screen/)) prio = 7
if (match(line, /Close window/)) prio = 8
if (match(line, /Toggle window floating/)) prio = 9
if (match(line, /Toggle window split/)) prio = 10
if (match(line, /Universal/)) prio = 11
if (match(line, /Clipboard/)) prio = 12
if (match(line, /Emoji picker/)) prio = 13
if (match(line, /Color picker/)) prio = 14
if (match(line, /Screenshot/)) prio = 15
if (match(line, /Screenrecording/)) prio = 16
if (match(line, /(Switch|Next|Former|Previous).*workspace/)) prio = 17
if (match(line, /Move window to workspace/)) prio = 18
if (match(line, /Swap window/)) prio = 19
if (match(line, /Move window focus/)) prio = 20
if (match(line, /Move window$/)) prio = 21
if (match(line, /Resize window/)) prio = 22
if (match(line, /Expand window/)) prio = 23
if (match(line, /Shrink window/)) prio = 24
if (match(line, /scratchpad/)) prio = 25
if (match(line, /notification/)) prio = 26
if (match(line, /Toggle window transparency/)) prio = 27
if (match(line, /Toggle workspace gaps/)) prio = 28
if (match(line, /Toggle nightlight/)) prio = 29
if (match(line, /group/)) prio = 94
if (match(line, /Scroll active workspace/)) prio = 95
if (match(line, /Cycle to/)) prio = 96
if (match(line, /Reveal active/)) prio = 97
if (match(line, /Apple Display/)) prio = 98
if (match(line, /XF86/)) prio = 99
# print "priority<TAB>line"
printf "%d\t%s\n", prio, line
}' |
sort -k1,1n -k2,2 |
cut -f2-
}
monitor_height=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .height')
menu_height=$((monitor_height * 40 / 100))
build_keymap_cache
{
dynamic_bindings
static_bindings
} |
sort -u |
parse_keycodes |
parse_bindings |
prioritize_entries |
walker --dmenu -p 'Keybindings' --width 800 --height "$menu_height"

View File

@@ -1,27 +1,18 @@
#!/bin/bash #!/bin/bash
set -e
# Where we store an empty file for each migration that has already been performed. # Where we store an empty file for each migration that has already been performed.
STATE_DIR="$HOME/.local/state/omarchy/migrations" STATE_DIR="$HOME/.local/state/omarchy/migrations"
mkdir -p "$STATE_DIR" mkdir -p "$STATE_DIR"
# Skipped migrations are tracked separately
mkdir -p "$STATE_DIR/skipped"
# Run any pending migrations # Run any pending migrations
for file in /usr/share/omarchy/migrations/*.sh; do for file in ~/.local/share/omarchy/migrations/*.sh; do
filename=$(basename "$file") filename=$(basename "$file")
if [[ ! -f "$STATE_DIR/$filename" && ! -f "$STATE_DIR/skipped/$filename" ]]; then if [[ ! -f "$STATE_DIR/$filename" ]]; then
echo -e "\e[32m\nRunning migration (${filename%.sh})\e[0m" echo -e "\e[32m\nRunning migration (${filename%.sh})\e[0m"
source $file
if bash $file; then touch "$STATE_DIR/$filename"
touch "$STATE_DIR/$filename"
else
if gum confirm "Migration ${filename%.sh} failed. Skip and continue?"; then
touch "$STATE_DIR/skipped/$filename"
else
exit 1
fi
fi
fi fi
done done

View File

@@ -1,13 +0,0 @@
#!/bin/bash
if (($# == 0)); then
echo "Usage: omarchy-notification-dismiss <summary>"
exit 1
fi
# Find the first notification whose 'summary' matches the regex in $1
notification_id=$(makoctl list | grep -F "$1" | head -n1 | sed -E 's/^Notification ([0-9]+):.*/\1/')
if [[ -n $notification_id ]]; then
makoctl dismiss -n $notification_id
fi

View File

@@ -1,15 +0,0 @@
#!/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
echo -e "\033[31mError: Package '$pkg' did not install\033[0m" >&2
exit 1
fi
done
exit 0

View File

@@ -1,4 +0,0 @@
#!/bin/bash
curl -sf --connect-timeout 30 --retry 3 --retry-delay 3 -A "omarchy-update" \
"https://aur.archlinux.org/rpc/?v=5&type=info&arg=base" >/dev/null

View File

@@ -1,24 +0,0 @@
#!/bin/bash
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'
--preview-label-pos='bottom'
--preview-window 'down:65%:wrap'
--bind 'alt-p:toggle-preview'
--bind 'alt-d:preview-half-page-down,alt-u:preview-half-page-up'
--bind 'alt-k:preview-up,alt-j:preview-down'
--bind 'alt-b:change-preview:yay -Gpa {1} | tail -n +5'
--bind 'alt-B:change-preview:yay -Siia {1}'
--color 'pointer:green,marker:green'
)
pkg_names=$(yay -Slqa | fzf "${fzf_args[@]}")
if [[ -n "$pkg_names" ]]; then
# Convert newline-separated selections to space-separated for yay
echo "$pkg_names" | tr '\n' ' ' | xargs yay -S --noconfirm
sudo updatedb
omarchy-show-done
fi

View File

@@ -1,7 +0,0 @@
#!/bin/bash
for pkg in "$@"; do
if pacman -Q "$pkg" &>/dev/null; then
sudo pacman -Rns --noconfirm "$pkg"
fi
done

View File

@@ -1,7 +0,0 @@
#!/bin/bash
IGNORED_PACKAGES_FILE="$OMARCHY_PATH/install/packages.ignored"
if [[ -f $IGNORED_PACKAGES_FILE ]]; then
tr '\r\n' ',' <"$IGNORED_PACKAGES_FILE" | sed 's/,$//'
fi

View File

@@ -1,9 +1,11 @@
#!/bin/bash #!/bin/bash
set -e
fzf_args=( fzf_args=(
--multi --multi
--preview 'pacman -Sii {1}' --preview 'yay -Sii {1}'
--preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select' --preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select, F11: maximize'
--preview-label-pos='bottom' --preview-label-pos='bottom'
--preview-window 'down:65%:wrap' --preview-window 'down:65%:wrap'
--bind 'alt-p:toggle-preview' --bind 'alt-p:toggle-preview'
@@ -12,10 +14,11 @@ fzf_args=(
--color 'pointer:green,marker:green' --color 'pointer:green,marker:green'
) )
pkg_names=$(pacman -Slq | fzf "${fzf_args[@]}") pkg_names=$(yay -Slq | fzf "${fzf_args[@]}")
if [[ -n "$pkg_names" ]]; then if [[ -n "$pkg_names" ]]; then
# Convert newline-separated selections to space-separated for yay # Convert newline-separated selections to space-separated for yay
echo "$pkg_names" | tr '\n' ' ' | xargs sudo pacman -S --noconfirm echo "$pkg_names" | tr '\n' ' ' | xargs yay -Sy --noconfirm
sudo updatedb
omarchy-show-done omarchy-show-done
fi fi

View File

@@ -1,9 +0,0 @@
#!/bin/bash
for pkg in "$@"; do
if ! pacman -Q "$pkg" &>/dev/null; then
exit 0
fi
done
exit 1

View File

@@ -1,7 +0,0 @@
#!/bin/bash
PINNED_PACKAGES_FILE="$OMARCHY_PATH/install/packages.pinned"
if [[ -f $PINNED_PACKAGES_FILE ]]; then
tr '\r\n' ',' <"$PINNED_PACKAGES_FILE" | sed 's/,$//'
fi

View File

@@ -1,7 +0,0 @@
#!/bin/bash
for pkg in "$@"; do
pacman -Q "$pkg" &>/dev/null || exit 1
done
exit 0

View File

@@ -3,7 +3,7 @@
fzf_args=( fzf_args=(
--multi --multi
--preview 'yay -Qi {1}' --preview 'yay -Qi {1}'
--preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select' --preview-label='alt-p: toggle description, alt-j/k: scroll, tab: multi-select, F11: maximize'
--preview-label-pos='bottom' --preview-label-pos='bottom'
--preview-window 'down:65%:wrap' --preview-window 'down:65%:wrap'
--bind 'alt-p:toggle-preview' --bind 'alt-p:toggle-preview'
@@ -16,6 +16,7 @@ pkg_names=$(yay -Qqe | fzf "${fzf_args[@]}")
if [[ -n "$pkg_names" ]]; then if [[ -n "$pkg_names" ]]; then
# Convert newline-separated selections to space-separated for yay # Convert newline-separated selections to space-separated for yay
echo "$pkg_names" | tr '\n' ' ' | xargs sudo pacman -Rns --noconfirm echo "$pkg_names" | tr '\n' ' ' | xargs yay -Rns --noconfirm
sudo updatedb
omarchy-show-done omarchy-show-done
fi fi

View File

@@ -2,12 +2,17 @@
# Copy and sync icon files # Copy and sync icon files
mkdir -p ~/.local/share/icons/hicolor/48x48/apps/ mkdir -p ~/.local/share/icons/hicolor/48x48/apps/
cp /usr/share/omarchy/applications/icons/*.png ~/.local/share/icons/hicolor/48x48/apps/ cp ~/.local/share/omarchy/applications/icons/*.png ~/.local/share/icons/hicolor/48x48/apps/
gtk-update-icon-cache ~/.local/share/icons/hicolor &>/dev/null gtk-update-icon-cache ~/.local/share/icons/hicolor &>/dev/null
# Copy .desktop declarations # Copy .desktop declarations
mkdir -p ~/.local/share/applications mkdir -p ~/.local/share/applications
cp /usr/share/omarchy/applications/*.desktop ~/.local/share/applications/ cp ~/.local/share/omarchy/applications/*.desktop ~/.local/share/applications/
cp /usr/share/omarchy/applications/hidden/*.desktop ~/.local/share/applications/ cp ~/.local/share/omarchy/applications/hidden/*.desktop ~/.local/share/applications/
# Only copy xtras if user is not in bare mode
if [[ ! -f ~/.local/state/omarchy/bare.mode ]] && [ -z "$OMARCHY_BARE" ]; then
cp ~/.local/share/omarchy/applications/xtras/*.desktop ~/.local/share/applications/
fi
update-desktop-database ~/.local/share/applications update-desktop-database ~/.local/share/applications

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# This script deploys /etc/skel/.config/X/Y/Z -> ~/.config/X/Y/Z # This script deploys ~/.local/share/omarchy/config/X/Y/Z -> ~/.config/X/Y/Z
config_file=$1 config_file=$1
if [[ -z "$config_file" ]]; then if [[ -z "$config_file" ]]; then
@@ -8,7 +8,7 @@ if [[ -z "$config_file" ]]; then
Usage: $0 [config_file] Usage: $0 [config_file]
Must provide a file path from the .config directory to be refreshed. Must provide a file path from the .config directory to be refreshed.
To copy /etc/skel/.config/hypr/hyprlock.conf to ~/.config/hypr/hyprlock.conf To copy ~/.local/share/omarchy/config/hypr/hyprlock.conf to ~/.config/hypr/hyprlock.conf
$0 hypr/hyprlock.conf $0 hypr/hyprlock.conf
USAGE USAGE
@@ -17,7 +17,7 @@ fi
# Backup the destination file (with timestamp) to avoid clobbering (Ex: hyprlock.conf.bak.1753817951) # Backup the destination file (with timestamp) to avoid clobbering (Ex: hyprlock.conf.bak.1753817951)
user_config_file="${HOME}/.config/$config_file" user_config_file="${HOME}/.config/$config_file"
default_config_file="/etc/skel/.config/$config_file" default_config_file="${HOME}/.local/share/omarchy/config/$config_file"
backup_config_file="$user_config_file.bak.$(date +%s)" backup_config_file="$user_config_file.bak.$(date +%s)"
if [[ -f "$user_config_file" ]]; then if [[ -f "$user_config_file" ]]; then

View File

@@ -1,3 +0,0 @@
#!/bin/bash
omarchy-refresh-config fastfetch/config.jsonc

View File

@@ -1,34 +0,0 @@
#!/bin/bash
if [[ -f /boot/EFI/linux/omarchy_linux.efi ]] && [[ -f /boot/EFI/linux/$(cat /etc/machine-id)_linux.efi ]]; then
echo "Cleanup extra UKI"
sudo rm -f /boot/EFI/Linux/$(cat /etc/machine-id)_linux.efi
fi
echo "Resetting limine config"
sudo mv /boot/limine.conf /boot/limine.conf.bak
sudo tee /boot/limine.conf <<EOF >/dev/null
### Read more at config document: https://github.com/limine-bootloader/limine/blob/trunk/CONFIG.md
#timeout: 3
default_entry: 2
interface_branding: Omarchy Bootloader
interface_branding_color: 2
hash_mismatch_panic: no
term_background: 1a1b26
backdrop: 1a1b26
# Terminal colors (Tokyo Night palette)
term_palette: 15161e;f7768e;9ece6a;e0af68;7aa2f7;bb9af7;7dcfff;a9b1d6
term_palette_bright: 414868;f7768e;9ece6a;e0af68;7aa2f7;bb9af7;7dcfff;c0caf5
# Text colors
term_foreground: c0caf5
term_foreground_bright: c0caf5
term_background_bright: 24283b
EOF
sudo limine-update
sudo limine-snapper-sync

View File

@@ -1,3 +0,0 @@
#!/bin/bash
sudo cp -f /usr/share/omarchy/default/pacman/mirrorlist /etc/pacman.d/mirrorlist

View File

@@ -1,10 +1,6 @@
#!/bin/bash #!/bin/bash
sudo cp /usr/share/omarchy/default/plymouth/* /usr/share/plymouth/themes/omarchy/ if [[ "$1" == "-y" ]] || gum confirm "Refresh Plymouth theme? This will replace your current startup screen with Omarchy defaults."; then
sudo plymouth-set-default-theme omarchy sudo cp ~/.local/share/omarchy/default/plymouth/* /usr/share/plymouth/themes/omarchy/
sudo plymouth-set-default-theme -R omarchy
if command -v limine-mkinitcpio &>/dev/null; then
sudo limine-mkinitcpio
else
sudo mkinitcpio -P
fi fi

View File

@@ -1,6 +1,4 @@
#!/bin/bash #!/bin/bash
omarchy-refresh-config walker/config.toml omarchy-refresh-config walker/config.toml
omarchy-refresh-config elephant/calc.toml
omarchy-refresh-config elephant/desktopapplications.toml
omarchy-restart-walker omarchy-restart-walker

View File

@@ -1,29 +0,0 @@
#!/bin/bash
set -e
if [ "$EUID" -eq 0 ]; then
echo "Error: This script should not be run as root"
exit 1
fi
echo -e "This will reinstall all the default Omarchy packages and reset all default configs.\nWarning: All changes to configs will be lost.\n"
if gum confirm "Are you sure you want to reinstall and lose all config changes?"; then
echo "Reinstalling Omarchy Package"
sudo pacman -Syu --noconfirm --needed omarchy
echo "Reinstalling missing Omarchy packages"
mapfile -t packages < <(grep -v '^#' "$OMARCHY_PATH/install/omarchy-base.packages" | grep -v '^$')
sudo pacman -Syu --noconfirm --needed "${packages[@]}"
echo "Resetting all Omarchy configs"
cp -R /etc/skel/.config/* ~/.config/
$(bash $OMARCHY_PATH/install/config/theme.sh)
$(bash $OMARCHY_PATH/install/config/git.sh)
omarchy-refresh-limine
omarchy-refresh-plymouth
omarchy-nvim-setup
fi

Some files were not shown because too many files have changed in this diff Show More