Compare commits

..
413 changed files with 748 additions and 4033 deletions
-1
View File
@@ -12,7 +12,6 @@
All commands start with `omarchy-`. Prefixes indicate purpose:
- `cmd-` - check if commands exist, misc utility commands
- `capture-` - screenshots, screen recordings, and other capture tools
- `pkg-` - package management helpers
- `hw-` - hardware detection (return exit codes for use in conditionals)
- `refresh-` - copy default config to user's `~/.config/`
-2
View File
@@ -1,2 +0,0 @@
[Desktop Entry]
Hidden=true
Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

-1032
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Returns true if AC power is connected.
# Returns true if AC power is connected.
for ac in /sys/class/power_supply/AC* /sys/class/power_supply/ADP*; do
[[ -r $ac/online && $(cat "$ac/online") == "1" ]] && exit 0
-21
View File
@@ -1,21 +0,0 @@
#!/bin/bash
# omarchy:summary=Toggle microphone mute. Drives the hardware mic-mute LED on laptops that expose one.
wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle >/dev/null
if pactl get-source-mute @DEFAULT_SOURCE@ | rg -q 'yes'; then
led=on
osd_message='Microphone muted'
osd_icon='microphone-sensitivity-muted-symbolic'
else
led=off
osd_message='Microphone on'
osd_icon='audio-input-microphone-symbolic'
fi
omarchy-brightness-keyboard-mute "$led"
omarchy-swayosd-client \
--custom-message "$osd_message" \
--custom-icon "$osd_icon"
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash
# omarchy:summary=Returns the battery full capacity in Wh (rounded to whole number).
# Returns the battery full capacity in Wh (rounded to whole number).
# Used by omarchy-battery-status for displaying battery capacity.
battery_info=$(upower -i $(upower -e | grep BAT))
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Designed to be run by systemd timer every 30 seconds and alerts if battery is low
# Designed to be run by systemd timer every 30 seconds and alerts if battery is low
BATTERY_THRESHOLD=10
NOTIFICATION_FLAG="/run/user/$UID/omarchy_battery_notified"
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash
# omarchy:summary=Returns true if a battery is present on the system.
# Returns true if a battery is present on the system.
# Used by the battery monitor and other battery-related checks.
for bat in /sys/class/power_supply/BAT*; do
[[ -r $bat/present ]] &&
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash
# omarchy:summary=Returns the battery percentage remaining as an integer.
# Returns the battery percentage remaining as an integer.
# Used by the battery monitor and the Ctrl + Shift + Super + B hotkey.
upower -i $(upower -e | grep BAT) | awk '/percentage/ {
print int($2)
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Returns the battery time remaining (to empty or full) in a compact format.
# Returns the battery time remaining (to empty or full) in a compact format.
battery_info=$(upower -i $(upower -e | grep BAT))
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash
# omarchy:summary=Returns a formatted battery status string with percentage and power draw/charge.
# Returns a formatted battery status string with percentage and power draw/charge.
# Used by the battery notification hotkey (Ctrl + Shift + Super + B).
battery_info=$(upower -i $(upower -e | grep BAT))
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Set the branch for Omarchy's git repository.
# omarchy:args=<master|rc|dev>
# Set the branch for Omarchy's git repository.
if (($# == 0)); then
echo "Usage: omarchy-branch-set [master|rc|dev]"
+2 -32
View File
@@ -1,15 +1,10 @@
#!/bin/bash
# omarchy:summary=Adjust brightness on the most likely display device.
# omarchy:args=<step>
# Adjust brightness on the most likely display device.
# Usage: omarchy-brightness-display <step>
step="${1:-+5%}"
if omarchy-hyprland-monitor-focused-apple; then
omarchy-brightness-display-apple "$step"
exit
fi
# Start with the first possible output, then refine to the most likely given an order heuristic.
device="$(ls -1 /sys/class/backlight 2>/dev/null | head -n1)"
for candidate in amdgpu_bl* intel_backlight acpi_video*; do
@@ -19,31 +14,6 @@ for candidate in amdgpu_bl* intel_backlight acpi_video*; do
fi
done
# Current brightness percentage
current=$(brightnessctl -d "$device" -m | cut -d',' -f4 | tr -d '%')
# Apply non-uniform step size: 1% steps if at or below 5%, otherwise set an
# absolute target percentage to avoid raw backlight rounding causing uneven OSD steps.
if [[ $step == "+5%" ]]; then
if (( current < 5 )); then
(( target = current + 1 ))
else
(( target = current + 5 ))
fi
(( target > 100 )) && target=100
step="$target%"
elif [[ $step == "5%-" ]]; then
if (( current <= 5 )); then
(( target = current - 1 ))
else
(( target = current - 5 ))
fi
(( target < 1 )) && target=1
step="$target%"
fi
# Set the actual brightness of the display device.
brightnessctl -d "$device" set "$step" >/dev/null
+4 -24
View File
@@ -1,32 +1,12 @@
#!/bin/bash
# omarchy:summary=Adjust the brightness on Apple Studio Displays and Apple XDR Displays using asdcontrol.
# Adjust the brightness on Apple Studio Displays and Apple XDR Displays using asdcontrol.
if (( $# == 0 )); then
echo "Adjust Apple Display brightness by passing +5%, 5%-, or 100%"
echo "Adjust Apple Display Brightness by passing +5000 or -5000 (or any range from 0-60000)"
else
step="$1"
if [[ $step =~ ^([0-9]+)%-$ ]]; then
step="-${BASH_REMATCH[1]}%"
fi
devices=()
for path in /dev/usb/hiddev* /dev/hiddev*; do
[[ -e $path ]] && devices+=("$path")
done
if (( ${#devices[@]} == 0 )); then
echo "No Apple Display HID device found"
exit 1
fi
device="$(sudo asdcontrol --detect "${devices[@]}" | grep -E '^/dev/(usb/)?hiddev' | cut -d: -f1 | head -n1)"
if [[ -z $device ]]; then
echo "No Apple Display HID device found"
exit 1
fi
sudo asdcontrol "$device" -- "$step" >/dev/null
device="$(sudo asdcontrol --detect /dev/usb/hiddev* | grep ^/dev/usb/hiddev | cut -d: -f1)"
sudo asdcontrol "$device" -- "$1" >/dev/null
value="$(sudo asdcontrol "$device" | awk -F= '/BRIGHTNESS=/{print $2+0}')"
omarchy-swayosd-brightness "$(( value * 100 / 60000 ))"
fi
+2 -2
View File
@@ -1,7 +1,7 @@
#!/bin/bash
# omarchy:summary=Adjust keyboard backlight brightness using available steps.
# omarchy:args=<up|down|cycle>
# Adjust keyboard backlight brightness using available steps.
# Usage: omarchy-brightness-keyboard <up|down|cycle>
direction="${1:-up}"
-14
View File
@@ -1,14 +0,0 @@
#!/bin/bash
# omarchy:summary=Set the mic-mute indicator LED on laptops that expose a platform::micmute LED node.
# omarchy:args=<on|off>
if [[ -e /sys/class/leds/platform::micmute/brightness ]]; then
case "$1" in
on) value=1 ;;
off) value=0 ;;
*) echo "Usage: $(basename "$0") <on|off>" >&2; exit 1 ;;
esac
brightnessctl --device="platform::micmute" set "$value" >/dev/null 2>&1 || true
fi
+12 -3
View File
@@ -1,8 +1,17 @@
#!/bin/bash
# omarchy:summary=Set the Omarchy channel, which dictates what git branch and package repository is used.
# omarchy:args=<stable|rc|edge|dev>
# omarchy:requires-sudo=true
# Set the Omarchy channel, which dictates what git branch and package repository is used.
#
# Stable uses the master branch, which only sees updates on official releases, and
# the stable package repository, which typically lags the edge by a month to ensure
# better compatibility.
#
# Edge tracks the latest package repository, but still relies on the master branch,
# so new packages which require config changes may cause conflicts or errors.
#
# Dev tracks the active development dev branch, which may include partial or broken updates,
# as well as the latest package repository. This should only be used by Omarchy developers
# and people with a lot of experience managing Linux systems.
if (($# == 0)); then
echo "Usage: omarchy-channel-set [stable|rc|edge|dev]"
@@ -1,12 +1,16 @@
#!/bin/bash
# omarchy:summary=Switch between audio outputs while preserving the mute status. By default mapped to Super + Mute.
# Switch between audio outputs while preserving the mute status. By default mapped to Super + Mute.
focused_monitor=$(omarchy-hyprland-monitor-focused)
sinks=$(pactl -f json list sinks | jq '[.[] | select((.ports | length == 0) or ([.ports[]? | .availability != "not available"] | any))]')
sinks_count=$(echo "$sinks" | jq '. | length')
if (( sinks_count == 0 )); then
omarchy-swayosd-client --custom-message "No audio devices found"
swayosd-client \
--monitor "$focused_monitor" \
--custom-message "No audio devices found"
exit 1
fi
@@ -53,10 +57,10 @@ fi
next_sink_volume_icon="sink-volume-${icon_state}-symbolic"
if [[ $next_sink_name != $current_sink_name ]]; then
next_sink_wpid=$(echo "$next_sink" | jq -r '.properties."object.id"')
wpctl set-default "$next_sink_wpid"
pactl set-default-sink "$next_sink_name"
fi
omarchy-swayosd-client \
swayosd-client \
--monitor "$focused_monitor" \
--custom-message "$next_sink_description" \
--custom-icon "$next_sink_volume_icon"
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Finish the installation of Omarchy with items that can only be done after logging in.
# omarchy:requires-sudo=true
# Finish the installation of Omarchy with items that can only be done after logging in.
set -e
@@ -11,7 +10,6 @@ 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/recover-internal-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"
+9
View File
@@ -0,0 +1,9 @@
#!/bin/bash
# Toggle microphone mute. Dell XPS systems get special handling for the hardware LED.
if omarchy-hw-match "XPS"; then
omarchy-cmd-mic-mute-xps
else
swayosd-client --monitor "$(omarchy-hyprland-monitor-focused)" --input-volume mute-toggle
fi
+44
View File
@@ -0,0 +1,44 @@
#!/bin/bash
# Toggle microphone mute on Dell XPS systems. Uses wpctl for reliable toggling
# and syncs the ALSA capture switch so the hardware mic mute LED follows state.
wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle >/dev/null
if pactl get-source-mute @DEFAULT_SOURCE@ | rg -q 'yes'; then
alsa_value='off,off'
osd_message='Microphone muted'
osd_icon='microphone-sensitivity-muted-symbolic'
else
alsa_value='on,on'
osd_message='Microphone on'
osd_icon='audio-input-microphone-symbolic'
fi
if [[ -e /sys/class/leds/platform::micmute/brightness ]]; then
default_source=$(pactl get-default-source)
alsa_card=$(pactl -f json list sources | jq -r --arg source "$default_source" '
.[] | select(.name == $source) |
.properties["alsa.card"] // .properties["api.alsa.card"] // .properties["api.alsa.pcm.card"] // empty
' | head -1)
if [[ -n $alsa_card ]]; then
cards=("$alsa_card")
else
mapfile -t cards < <(compgen -G '/proc/asound/card*' | rg -o 'card[0-9]+' | sed 's/card//' | sort -u)
fi
for card in "${cards[@]}"; do
while IFS= read -r control; do
if [[ $control != *"Jack Microphone"* ]]; then
amixer -c "$card" cset "$control" "$alsa_value" >/dev/null 2>&1 || true
break 2
fi
done < <(amixer -c "$card" controls 2>/dev/null | rg -o "name='[^']*Microphone Capture Switch'")
done
fi
swayosd-client \
--monitor "$(omarchy-hyprland-monitor-focused)" \
--custom-message "$osd_message" \
--custom-icon "$osd_icon"
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Check whether any required commands are missing
# Returns true if any of the commands passed in as arguments are missing on the system.
for cmd in "$@"; do
if ! command -v "$cmd" &>/dev/null; then
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Check whether all required commands are available
# Returns true if all the commands passed in as arguments exit on the system.
for cmd in "$@"; do
command -v "$cmd" &>/dev/null || exit 1
@@ -1,10 +1,9 @@
#!/bin/bash
# omarchy:summary=Start or stop screen recording
# omarchy:group=capture
# omarchy:args=[--with-desktop-audio] [--with-microphone-audio] [--with-webcam] [--webcam-device=<device>] [--resolution=<size>] [--stop-recording]
# omarchy:examples=omarchy screenrecord | omarchy capture screenrecord --with-desktop-audio
# omarchy:aliases=omarchy screenrecord
# Start and stop a screenrecording, which will be saved to ~/Videos by default.
# Alternative location can be set via OMARCHY_SCREENRECORD_DIR or XDG_VIDEOS_DIR ENVs.
# Resolution is capped to 4K for monitors above 4K, native otherwise.
# Override via --resolution= (e.g. --resolution=1920x1080, --resolution=0x0 for native).
[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs
OUTPUT_DIR="${OMARCHY_SCREENRECORD_DIR:-${XDG_VIDEOS_DIR:-$HOME/Videos}}"
@@ -135,7 +134,7 @@ stop_screenrecording() {
pkill -9 -f "^gpu-screen-recorder"
notify-send "Screen recording error" "Recording process had to be force-killed. Video may be corrupted." -u critical -t 5000
else
finalize_recording
trim_first_frame
local filename=$(cat "$RECORDING_FILE" 2>/dev/null)
local preview="${filename%.mp4}-preview.png"
@@ -160,29 +159,17 @@ screenrecording_active() {
pgrep -f "^gpu-screen-recorder" >/dev/null
}
finalize_recording() {
trim_first_frame() {
local latest
latest=$(cat "$RECORDING_FILE" 2>/dev/null)
[[ -f $latest ]] || return
# Re-encode only when the first GOP contains discardable warmup packets — stream copy can't
# trim those (it rewinds to the keyframe). Clean recordings stay on the fast stream-copy path.
local video_codec=(-c:v copy)
if ffprobe -v error -select_streams v:0 -read_intervals %+0.2 -show_entries packet=flags -of csv=p=0 "$latest" 2>/dev/null | grep -q D; then
video_codec=(-c:v libx264 -preset veryfast -crf 20)
fi
# Trim the first frame, and normalize audio to -14 LUFS if present, in a single pass
local args=(-y -ss 0.1 -i "$latest" "${video_codec[@]}")
if ffprobe -v error -select_streams a -show_entries stream=codec_type -of csv=p=0 "$latest" 2>/dev/null | grep -q audio; then
args+=(-af loudnorm=I=-14:TP=-1.5:LRA=11)
fi
local processed="${latest%.mp4}-processed.mp4"
if ffmpeg "${args[@]}" "$processed" -loglevel quiet 2>/dev/null; then
mv "$processed" "$latest"
else
rm -f "$processed"
if [[ -n $latest && -f $latest ]]; then
local trimmed="${latest%.mp4}-trimmed.mp4"
if ffmpeg -y -ss 0.1 -i "$latest" -c copy "$trimmed" -loglevel quiet 2>/dev/null; then
mv "$trimmed" "$latest"
else
rm -f "$trimmed"
fi
fi
}
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Run the Omarchy screensaver using random effects from TTE.
# Run the Omarchy screensaver using random effects from TTE.
screensaver_in_focus() {
hyprctl activewindow -j | jq -e '.class == "org.omarchy.screensaver"' >/dev/null 2>&1
@@ -25,7 +25,8 @@ tty=$(tty 2>/dev/null)
while true; do
tte -i ~/.config/omarchy/branding/screensaver.txt \
--frame-rate 120 --canvas-width 0 --canvas-height 0 --reuse-canvas --anchor-canvas c --anchor-text c\
--random-effect --no-eol --no-restore-cursor &
--random-effect --exclude-effects dev_worm \
--no-eol --no-restore-cursor &
while pgrep -t "${tty#/dev/}" -x tte >/dev/null; do
if read -n1 -t 1 || ! screensaver_in_focus; then
@@ -1,10 +1,8 @@
#!/bin/bash
# omarchy:summary=Take a screenshot
# omarchy:group=capture
# omarchy:args=[smart|region|windows|fullscreen] [slurp|copy] [--editor=<name>]
# omarchy:examples=omarchy screenshot | omarchy capture screenshot region
# omarchy:aliases=omarchy screenshot
# Take a screenshot of the whole screen, a specific window, or a user-drawn region.
# Saves to ~/Pictures by default, but that can be changed via OMARCHY_SCREENSHOT_DIR or XDG_PICTURES_DIR ENVs.
# Editor defaults to Satty but can be changed via --editor=<name> or OMARCHY_SCREENSHOT_EDITOR env
[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs
OUTPUT_DIR="${OMARCHY_SCREENSHOT_DIR:-${XDG_PICTURES_DIR:-$HOME/Pictures}}"
@@ -65,13 +63,6 @@ get_rectangles() {
hyprctl clients -j | jq -r --arg ws "$active_workspace" '.[] | select(.workspace.id == ($ws | tonumber)) | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"'
}
# Keep hyprpicker alive until after grim captures so the screenshot sees the
# frozen overlay rather than live content shifting during teardown.
cleanup_freeze() {
[[ -n $PID ]] && kill $PID 2>/dev/null
}
trap cleanup_freeze EXIT
# Select based on mode
case "$MODE" in
region)
@@ -79,12 +70,14 @@ region)
PID=$!
sleep .1
SELECTION=$(slurp 2>/dev/null)
kill $PID 2>/dev/null
;;
windows)
hyprpicker -r -z >/dev/null 2>&1 &
PID=$!
sleep .1
SELECTION=$(get_rectangles | slurp -r 2>/dev/null)
kill $PID 2>/dev/null
;;
fullscreen)
SELECTION=$(hyprctl monitors -j | jq -r "${JQ_MONITOR_GEO} .[] | select(.focused == true) | format_geo")
@@ -95,6 +88,7 @@ smart | *)
PID=$!
sleep .1
SELECTION=$(echo "$RECTS" | slurp 2>/dev/null)
kill $PID 2>/dev/null
# If the selection area is L * W < 20, we'll assume you were trying to select whichever
# window or output it was inside of to prevent accidental 2px snapshots
@@ -1,13 +1,9 @@
#!/bin/bash
# omarchy:summary=Share clipboard, files, or folders with LocalSend
# omarchy:group=share
# omarchy:name=
# omarchy:args=<clipboard|file|folder> [path...]
# omarchy:examples=omarchy share clipboard | omarchy share file ~/Downloads/example.txt
# Share clipboard, file, or folder using LocalSend. Bound to Super + Ctrl + S by default.
if (($# == 0)); then
echo "Usage: omarchy-menu-share [clipboard|file|folder]"
echo "Usage: omarchy-cmd-share [clipboard|file|folder]"
exit 1
fi
+3 -1
View File
@@ -1,7 +1,9 @@
#!/bin/bash
# omarchy:summary=Print the current working directory of the active terminal window
# Returns the current working directory of the active terminal window,
# so a new terminal window can be started in the same directory.
# Go from current active terminal to its child shell process and run cwd there
terminal_pid=$(hyprctl activewindow | awk '/pid:/ {print $2}')
shell_pid=$(pgrep -P "$terminal_pid" | tail -n1)
+20 -33
View File
@@ -1,7 +1,7 @@
#!/bin/bash
# omarchy:summary=Add or remove an EFI boot entry for the Omarchy UKI, allowing the system to boot directly
# omarchy:requires-sudo=true
# Add an EFI boot entry for the Omarchy UKI, allowing the system to boot directly
# without a bootloader like Limine. Requires UEFI firmware and a built UKI.
if [[ ! -d /sys/firmware/efi ]]; then
echo "Error: System is not booted in UEFI mode" >&2
@@ -23,36 +23,23 @@ if cat /sys/class/dmi/id/bios_vendor 2>/dev/null | grep -qi "Apple"; then
exit 1
fi
existing_entry=$(efibootmgr | grep -E "^Boot[0-9A-Fa-f]+\*? Omarchy([[:space:]]|$)" | head -1)
uki_file=$(find /boot/EFI/Linux/ -name "omarchy*.efi" -printf "%f\n" 2>/dev/null | head -1)
if [[ -n $existing_entry ]]; then
boot_num=$(echo "$existing_entry" | sed -n 's/^Boot\([0-9A-Fa-f]\+\).*/\1/p')
if gum confirm "Disable direct boot (remove Omarchy EFI entry)?"; then
echo "Removing EFI boot entry $boot_num"
sudo efibootmgr --bootnum "$boot_num" --delete-bootnum >/dev/null
fi
exit 0
else
uki_file=$(find /boot/EFI/Linux/ -name "omarchy*.efi" -printf "%f\n" 2>/dev/null | head -1)
if [[ -z $uki_file ]]; then
echo "Error: No Omarchy UKI found in /boot/EFI/Linux/" >&2
exit 1
fi
boot_source=$(findmnt -n -o SOURCE /boot)
disk=$(echo "$boot_source" | sed 's/p\?[0-9]*$//')
part=$(echo "$boot_source" | grep -o 'p\?[0-9]*$' | sed 's/^p//')
if gum confirm "Setup direct boot (so snapshot booting must be done via bios)?"; then
echo "Creating EFI boot entry for $uki_file"
sudo efibootmgr --create \
--disk "$disk" \
--part "$part" \
--label "Omarchy" \
--loader "\\EFI\\Linux\\$uki_file"
fi
if [[ -z $uki_file ]]; then
echo "Error: No Omarchy UKI found in /boot/EFI/Linux/" >&2
exit 1
fi
boot_source=$(findmnt -n -o SOURCE /boot)
disk=$(echo "$boot_source" | sed 's/p\?[0-9]*$//')
part=$(echo "$boot_source" | grep -o 'p\?[0-9]*$' | sed 's/^p//')
if gum confirm "Setup direct boot (so snapshot booting must be done via bios)?"; then
echo "Creating EFI boot entry for $uki_file"
sudo efibootmgr --create \
--disk "$disk" \
--part "$part" \
--label "Omarchy" \
--loader "\\EFI\\Linux\\$uki_file"
fi
+1 -4
View File
@@ -1,9 +1,6 @@
#!/bin/bash
# omarchy:summary=Print debugging information
# omarchy:args=[--no-sudo] [--print]
# omarchy:examples=omarchy debug --print --no-sudo
# omarchy:requires-sudo=true
# Return exhaustive debugging information about the system to help diagnose problems.
NO_SUDO=false
PRINT_ONLY=false
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash
# omarchy:summary=Creates a new Omarchy migration named after the unix timestamp of the last commit.
# Creates a new Omarchy migration named after the unix timestamp of the last commit.
# Only intended for Omarchy developers.
cd ~/.local/share/omarchy
migration_file="$HOME/.local/share/omarchy/migrations/$(git log -1 --format=%cd --date=unix).sh"
-111
View File
@@ -1,111 +0,0 @@
#!/bin/bash
# omarchy:summary=Measure Omarchy CLI response times
# omarchy:args=[--repeat=<count>]
# omarchy:examples=omarchy dev benchmark | omarchy dev benchmark --repeat=10
set -euo pipefail
OMARCHY_BIN_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
CLI="$OMARCHY_BIN_DIR/omarchy"
REPEAT=5
show_help() {
cat <<'EOF'
Usage:
omarchy dev benchmark [--repeat=<count>]
Measure response times for common Omarchy CLI surfaces.
Options:
--repeat=<count> Number of times to run each case (default: 5)
EOF
}
now_us() {
local now="${EPOCHREALTIME/./}"
printf '%s' "$now"
}
format_ms() {
local us="$1"
printf '%d.%03d' "$(( us / 1000 ))" "$(( us % 1000 ))"
}
run_case() {
local label="$1"
shift
local total_us=0
local min_us=0
local max_us=0
local elapsed_us=0
local start_us=0
local end_us=0
local status=0
for (( i = 1; i <= REPEAT; i++ )); do
start_us=$(now_us)
if "$@" >/dev/null; then
status=0
else
status=$?
fi
end_us=$(now_us)
if (( status != 0 )); then
printf '%-34s failed (exit %d)\n' "$label" "$status"
return "$status"
fi
elapsed_us=$(( end_us - start_us ))
total_us=$(( total_us + elapsed_us ))
if (( i == 1 || elapsed_us < min_us )); then
min_us=$elapsed_us
fi
if (( elapsed_us > max_us )); then
max_us=$elapsed_us
fi
done
printf '%-34s avg %8s ms min %8s ms max %8s ms\n' \
"$label" \
"$(format_ms "$(( total_us / REPEAT ))")" \
"$(format_ms "$min_us")" \
"$(format_ms "$max_us")"
}
while (( $# > 0 )); do
case "$1" in
--repeat=*)
REPEAT="${1#*=}"
;;
--help | -h)
show_help
exit 0
;;
*)
echo "Unknown option: $1" >&2
show_help >&2
exit 2
;;
esac
shift
done
if [[ ! $REPEAT =~ ^[0-9]+$ ]] || (( REPEAT < 1 )); then
echo "--repeat must be a positive integer" >&2
exit 2
fi
printf 'Omarchy CLI benchmark (%d runs each)\n\n' "$REPEAT"
run_case "omarchy" "$CLI"
run_case "omarchy --help" "$CLI" --help
run_case "omarchy commands" "$CLI" commands
run_case "omarchy commands --json" "$CLI" commands --json
run_case "omarchy commands --all --json" "$CLI" commands --all --json
run_case "omarchy theme set --help" "$CLI" theme set --help
run_case "omarchy screenshot --help" "$CLI" screenshot --help
run_case "omarchy restart --help" "$CLI" restart --help
run_case "omarchy theme current" "$CLI" theme current
-86
View File
@@ -1,86 +0,0 @@
#!/bin/bash
# omarchy:summary=Show Omarchy bin metadata fields and defaults
# omarchy:args=[--json]
set -euo pipefail
show_json() {
jq -n '{
ok: true,
defaults: {
group: "first filename segment after omarchy-",
name: "remaining filename segments with dashes converted to spaces",
route: "omarchy <group> <name>",
binary: "filename",
requires_sudo: false
},
fields: [
{name: "summary", required: true, type: "string", note: "One-line human and agent-facing description."},
{name: "group", required: false, type: "string", note: "Only set when the route group should differ from the filename-derived group."},
{name: "name", required: false, type: "string", note: "Only set when the route name should differ from the filename-derived name. May be empty for root commands."},
{name: "args", required: false, type: "string", note: "Only set when the command accepts arguments."},
{name: "examples", required: false, type: "string", note: "Pipe-separated examples."},
{name: "aliases", required: false, type: "string", note: "Pipe-separated alternate routes, e.g. omarchy screenshot."},
{name: "requires-sudo", required: false, type: "true", default: false, note: "Only include when true."}
]
}'
}
show_help() {
cat <<'EOF'
Omarchy bin metadata
Metadata lives in the top comment block of each executable bin/omarchy-* file.
Keep it slim: define only fields that are required or override defaults.
Required:
# omarchy:summary=<one-line description>
Inferred defaults:
group first filename segment after omarchy-
name remaining filename segments, with dashes converted to spaces
route omarchy <group> <name>
binary filename
requires-sudo false
Optional fields:
# omarchy:group=<group> route override only
# omarchy:name=<name> route override only; may be empty
# omarchy:args=<args> only if the command accepts args
# omarchy:examples=<cmd> | <cmd> pipe-separated examples
# omarchy:aliases=<route> | <route> pipe-separated alternate routes
# omarchy:requires-sudo=true only when true
Do not define:
binary inferred from filename
usage derived from route + args
false flags or empty args
Examples:
# omarchy:summary=Restart Walker and related user services
# omarchy:summary=Take a screenshot
# omarchy:group=capture
# omarchy:args=[smart|region|windows|fullscreen] [slurp|copy] [--editor=<name>]
# omarchy:examples=omarchy screenshot | omarchy capture screenshot region
# omarchy:aliases=omarchy screenshot
EOF
}
case "${1:-}" in
--json)
show_json
;;
--help | -h)
show_help
;;
"")
show_help
;;
*)
echo "Unknown option: $1" >&2
show_help >&2
exit 2
;;
esac
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Print drive information such as size, model, and mount details
# omarchy:args=<drive>
# Returns drive information about a given volumne, like /dev/nvme0, which is used by omarchy-drive-select.
if (($# == 0)); then
echo "Usage: omarchy-drive-info [/dev/drive]"
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Select a drive from a list with info that includes space and brand. Used by omarchy-drive-set-password.
# Select a drive from a list with info that includes space and brand. Used by omarchy-drive-set-password.
if (($# == 0)); then
drives=$(lsblk -dpno NAME | grep -E '/dev/(sd|hd|vd|nvme|mmcblk|xv)')
+2 -3
View File
@@ -1,12 +1,11 @@
#!/bin/bash
# omarchy:summary=Set a new encryption password for a drive selected.
# omarchy:requires-sudo=true
# Set a new encryption password for a drive selected.
encrypted_drives=$(blkid -t TYPE=crypto_LUKS -o device)
if [[ -n $encrypted_drives ]]; then
if (( $(wc -l <<<"$encrypted_drives") == 1 )); then
if (( $(wc -l <<<encrypted_drives) == 1 )); then
drive_to_change="$encrypted_drives"
else
drive_to_change="$(omarchy-drive-select "$encrypted_drives")"
+2 -2
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Show current monospace font
# omarchy:examples=omarchy font current
# Returns the name of the current monospace font being used by extracting it from the Waybar stylesheet.
# This can be changed using omarchy-font-set.
grep -oP 'font-family:\s*["'\'']?\K[^;"'\'']+' ~/.config/waybar/style.css | head -n1
+1 -2
View File
@@ -1,6 +1,5 @@
#!/bin/bash
# omarchy:summary=List available monospace fonts
# omarchy:examples=omarchy font list | omarchy font set "CaskaydiaMono Nerd Font"
# Returns a list of all the monospace fonts available on the system that can be set using omarchy-font-set.
fc-list :spacing=100 -f "%{family[0]}\n" | grep -v -i -E 'emoji|signwriting|omarchy' | sort -u
+2 -3
View File
@@ -1,8 +1,7 @@
#!/bin/bash
# omarchy:summary=Set the system monospace font
# omarchy:args=<font-name>
# omarchy:examples=omarchy font list | omarchy font set "CaskaydiaMono Nerd Font"
# Set the system-wide monospace font that should be used by the terminal, hyprlock, waybar, swayosd, etc.
# The font name must be one of the ones returned by omarchy-font-list.
font_name="$1"
-2
View File
@@ -1,7 +1,5 @@
#!/usr/bin/env python3
# omarchy:summary=Run the Synaptics touchpad haptic feedback daemon
"""Haptic feedback daemon for Synaptics touchpads with Manual Trigger.
Monitors touchpad button press events and sends haptic pulses via HID
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Check if hibernation is supported
# Check if hibernation is supported
if [[ ! -f /sys/power/image_size ]]; then
exit 1
fi
+2 -2
View File
@@ -1,7 +1,7 @@
#!/bin/bash
# omarchy:summary=Remove hibernation setup including swap and boot resume settings
# omarchy:requires-sudo=true
# Removes hibernation setup: disables swap, removes swapfile, removes fstab entry,
# removes resume hook, and removes suspend-then-hibernate configuration.
MKINITCPIO_CONF="/etc/mkinitcpio.conf.d/omarchy_resume.conf"
+13 -28
View File
@@ -1,27 +1,14 @@
#!/bin/bash
# omarchy:summary=Set up hibernation with swap and boot resume configuration
# omarchy:requires-sudo=true
# omarchy:args=[--force] [--no-rebuild]
FORCE=false
NO_REBUILD=false
for arg in "$@"; do
case "$arg" in
--force) FORCE=true ;;
--no-rebuild) NO_REBUILD=true ;;
esac
done
# Creates a swap file in the btrfs subvolume, adds the swap file to /etc/fstab,
# adds a resume hook to mkinitcpio, and configures suspend-then-hibernate.
if [[ ! -f /sys/power/image_size ]]; then
echo -e "Hibernation is not supported on your system" >&2
exit 0
fi
# When --no-rebuild is set, the caller is responsible for the UKI rebuild
# (e.g. running before limine-mkinitcpio-hook is installed during initial
# install), so we only require limine-mkinitcpio when we'd invoke it ourselves.
if ! $NO_REBUILD && ! command -v limine-mkinitcpio &>/dev/null; then
if ! command -v limine-mkinitcpio &>/dev/null; then
echo "Skipping hibernation setup (requires Limine bootloader)"
exit 0
fi
@@ -39,14 +26,15 @@ if [[ -f $MKINITCPIO_CONF ]] && grep -q "^HOOKS+=(resume)$" "$MKINITCPIO_CONF";
echo "Fixing empty resume_offset ($RESUME_OFFSET)"
sudo sed -i "s/resume_offset=\"$/resume_offset=$RESUME_OFFSET\"/" "$RESUME_DROP_IN"
sudo sed -i "s/resume_offset=\"$/resume_offset=$RESUME_OFFSET\"/" /etc/default/limine
$NO_REBUILD || sudo limine-mkinitcpio
sudo limine-mkinitcpio
sudo limine-update
fi
fi
echo "Hibernation is already set up"
exit 0
fi
if ! $FORCE; then
if [[ $1 != "--force" ]]; then
MEM_TOTAL_HUMAN=$(free --human | awk '/Mem/ {print $2}')
if ! gum confirm "Use $MEM_TOTAL_HUMAN on boot drive to make hibernation available?"; then
exit 0
@@ -117,16 +105,13 @@ if grep -q "\[s2idle\]" /sys/power/mem_sleep 2>/dev/null; then
fi
fi
if ! $NO_REBUILD; then
# limine-mkinitcpio rebuilds initramfs/UKI for all kernels and updates the
# /boot/limine.conf entries via limine-entry-tool. The limine bootloader
# binary on the ESP doesn't change here, so we don't need limine-update
# (which would also re-deploy the binary and rebuild a second time).
echo "Regenerating initramfs..."
sudo limine-mkinitcpio
echo
fi
# Regenerate initramfs and boot entry
echo "Regenerating initramfs..."
sudo limine-mkinitcpio
sudo limine-update
if ! $FORCE && ! $NO_REBUILD && gum confirm "Reboot to enable hibernation?"; then
echo
if [[ $1 != "--force" ]] && gum confirm "Reboot to enable hibernation?"; then
omarchy-system-reboot
fi
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Run a named hook, like post-update (available in ~/.config/omarchy/hooks/post-update).
# omarchy:args=[name] [args...]
# Run a named hook, like post-update (available in ~/.config/omarchy/hooks/post-update).
set -e
-5
View File
@@ -1,5 +0,0 @@
#!/bin/bash
# omarchy:summary=Detect ASUS ExpertBook B9406 series laptops on Intel Panther Lake.
omarchy-hw-match "B9406" && omarchy-hw-intel-ptl
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Detect whether the computer is an Asus ROG machine.
# Detect whether the computer is an Asus ROG machine.
[[ $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null) == "ASUSTeK COMPUTER INC." ]] &&
grep -q "ROG" /sys/class/dmi/id/product_family 2>/dev/null
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Match Dell XPS systems with LG OLED panel on Intel Panther Lake (Xe3) GPU.
# Match Dell XPS systems with LG OLED panel on Intel Panther Lake (Xe3) GPU.
omarchy-hw-match "XPS" \
&& omarchy-hw-intel-ptl \
-9
View File
@@ -1,9 +0,0 @@
#!/bin/bash
# omarchy:summary=Returns true when an external monitor is physically connected.
for status in /sys/class/drm/card*-*/status; do
[[ "$status" == *-eDP-*/status ]] && continue
[[ "$(<"$status")" == "connected" ]] && exit 0
done
exit 1
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Detect whether the computer is a Framework Laptop 16.
# Detect whether the computer is a Framework Laptop 16.
[[ $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null) == "Framework" ]] &&
omarchy-hw-match "Laptop 16"
-9
View File
@@ -1,9 +0,0 @@
#!/bin/bash
# omarchy:summary=Detect whether the system has an active hybrid GPU configuration
if command -v supergfxctl &>/dev/null; then
supergfxctl -s 2>/dev/null | grep -qw Hybrid
else
(($(lspci | grep -cE 'VGA|3D|Display') >= 2))
fi
+1 -1
View File
@@ -1,5 +1,5 @@
#!/bin/bash
# omarchy:summary=Detect whether the computer has an Intel CPU.
# Detect whether the computer has an Intel CPU.
[[ $(grep -m1 "vendor_id" /proc/cpuinfo 2>/dev/null | cut -d: -f2 | tr -d ' ') == "GenuineIntel" ]]
+1 -1
View File
@@ -1,5 +1,5 @@
#!/bin/bash
# omarchy:summary=Detect whether the computer has an Intel Panther Lake GPU.
# Detect whether the computer has an Intel Panther Lake GPU.
lspci | grep -iE 'vga|3d|display' | grep -qi 'panther lake'
+3 -4
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Match against the computer's DMI product name or product family (case-insensitive).
# omarchy:args=<pattern>
# Match against the computer's DMI product name (case-insensitive).
# Usage: omarchy-hw-match "XPS"
grep -qi "$1" /sys/class/dmi/id/product_name 2>/dev/null ||
grep -qi "$1" /sys/class/dmi/id/product_family 2>/dev/null
grep -qi "$1" /sys/class/dmi/id/product_name 2>/dev/null
-9
View File
@@ -1,9 +0,0 @@
#!/bin/bash
# omarchy:summary=Clear the internal-monitor-disable toggle if no external display is connected.
TOGGLE="$HOME/.local/state/omarchy/toggles/hypr/internal-monitor-disable.conf"
if [[ -f $TOGGLE ]] && ! omarchy-hw-external-monitors; then
rm -f "$TOGGLE"
fi
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Detect whether the computer is a Microsoft Surface device.
# Detect whether the computer is a Microsoft Surface device.
[[ $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null) == "Microsoft Corporation" ]] &&
omarchy-hw-match "Surface"
-6
View File
@@ -1,6 +0,0 @@
#!/bin/bash
# omarchy:summary=Print the detected Hyprland touchpad or trackpad device name
device=$(hyprctl devices -j | jq -r '[.mice[] | .name | select(test("touchpad|trackpad"; "i"))] | first // empty')
[[ -n $device ]] && echo "$device"
-6
View File
@@ -1,6 +0,0 @@
#!/bin/bash
# omarchy:summary=Print the detected Hyprland touchscreen or tablet device name
device=$(hyprctl devices -j | jq -r '[.touch[]?.name, .tablets[]?.name] | first // empty')
[[ -n $device ]] && echo "$device"
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Detect whether Vulkan is available.
# Detect whether Vulkan is available.
[[ -d /usr/share/vulkan/icd.d ]] &&
find /usr/share/vulkan/icd.d -maxdepth 1 -name "*.json" -print -quit | grep -q .
@@ -1,5 +1,5 @@
#!/bin/bash
# omarchy:summary=Toggles transparency for the currently focused window.
# Toggles transparency for the currently focused window.
hyprctl dispatch setprop "address:$(hyprctl activewindow -j | jq -r '.address')" opaque toggle
+1 -1
View File
@@ -1,5 +1,5 @@
#!/bin/bash
# omarchy:summary=Print the name of the currently focused Hyprland monitor.
# Print the name of the currently focused Hyprland monitor.
hyprctl monitors -j | jq -r '.[] | select(.focused == true).name'
@@ -1,5 +0,0 @@
#!/bin/bash
# omarchy:summary=Return success if the focused Hyprland monitor is an Apple display.
hyprctl monitors -j | jq -e '.[] | select(.focused == true) | select(.make == "Apple Computer Inc" and (.model | test("StudioDisplay|ProDisplayXDR")))' >/dev/null
-46
View File
@@ -1,46 +0,0 @@
#!/bin/bash
# omarchy:summary=Enable, disable, toggle, or recover the internal laptop display
# omarchy:args=<on|off|toggle|recover>
TOGGLE="internal-monitor-disable"
TOGGLE_FLAG="$HOME/.local/state/omarchy/toggles/hypr/$TOGGLE.conf"
MIRROR_TOGGLE="internal-monitor-mirror"
# Get internal monitor name dynamically
INTERNAL=$(hyprctl monitors -j | jq -r '.[] | select(.name | contains("eDP")).name' | head -n 1)
enable() {
if omarchy-hyprland-toggle-enabled "$TOGGLE"; then
omarchy-hyprland-toggle --disabled-notification "󰍹 Laptop display enabled" "$TOGGLE"
fi
}
disable() {
if ! omarchy-hw-external-monitors; then
notify-send -u low "󰍹 Can't disable the only active display"
exit 1
fi
if omarchy-hyprland-toggle-disabled "$TOGGLE" && omarchy-hyprland-toggle-disabled "$MIRROR_TOGGLE"; then
echo "monitor=$INTERNAL,disable" >"$TOGGLE_FLAG"
notify-send -u low "󰍹 Laptop display disabled"
hyprctl reload
fi
}
recover() {
if ! omarchy-hw-external-monitors && omarchy-hyprland-toggle-enabled "$TOGGLE"; then
omarchy-hyprland-toggle "$TOGGLE"
fi
}
case "$1" in
on) enable ;;
off) disable ;;
toggle) if omarchy-hyprland-toggle-enabled "$TOGGLE"; then enable; else disable; fi ;;
recover) recover ;;
*)
echo "Usage: $(basename "$0") {on|off|toggle|recover}" >&2
exit 1
;;
esac
+13
View File
@@ -0,0 +1,13 @@
#!/bin/bash
# Disable the internal laptop display. No-op if already disabled or if it
# would leave no active display.
if omarchy-hyprland-monitors-many; then
if omarchy-hyprland-toggle-disabled internal-monitor-disable; then
omarchy-hyprland-toggle --enabled-notification "󰍹 Laptop display disabled" internal-monitor-disable
fi
else
notify-send -u low "󰍹 Can't disable the only active display"
exit 1
fi
+7
View File
@@ -0,0 +1,7 @@
#!/bin/bash
# Enable the internal laptop display. No-op if already enabled.
if omarchy-hyprland-toggle-enabled internal-monitor-disable; then
omarchy-hyprland-toggle --disabled-notification "󰍹 Laptop display enabled" internal-monitor-disable
fi
@@ -1,58 +0,0 @@
#!/bin/bash
# omarchy:summary=Enable, disable, toggle, or recover mirroring the internal display to an external monitor
# omarchy:args=<on|off|toggle|recover>
TOGGLE="internal-monitor-mirror"
TOGGLE_FLAG="$HOME/.local/state/omarchy/toggles/hypr/$TOGGLE.conf"
DISABLE_TOGGLE="internal-monitor-disable"
# Get names dynamically
INTERNAL=$(hyprctl monitors -j | jq -r '.[] | select(.name | contains("eDP")).name' | head -n 1)
# Get the first available external monitor
EXTERNAL=$(hyprctl monitors -j | jq -r '.[] | select(.name | contains("eDP") | not).name' | head -n 1)
enable() {
if [[ -z "$EXTERNAL" ]]; then
notify-send -u low "󰍹 No external monitors found for mirror"
exit 1
fi
if [[ -z "$INTERNAL" ]]; then
notify-send -u low "󰍹 No laptop monitor found to mirror"
exit 1
fi
if omarchy-hyprland-toggle-enabled "$DISABLE_TOGGLE"; then
omarchy-hyprland-toggle "$DISABLE_TOGGLE"
fi
if omarchy-hyprland-toggle-disabled "$TOGGLE"; then
echo "monitor=$EXTERNAL, preferred, auto, 1, mirror, $INTERNAL" > "$TOGGLE_FLAG"
notify-send -u low "󰍹 Mirroring enabled ($EXTERNAL)"
hyprctl reload
fi
}
disable() {
if omarchy-hyprland-toggle-enabled "$TOGGLE"; then
omarchy-hyprland-toggle --disabled-notification "󰍹 Extended mode restored" "$TOGGLE"
fi
}
recover() {
if ! omarchy-hw-external-monitors && omarchy-hyprland-toggle-enabled "$TOGGLE"; then
omarchy-hyprland-toggle "$TOGGLE"
fi
}
case "$1" in
on) enable ;;
off) disable ;;
toggle) if omarchy-hyprland-toggle-enabled "$TOGGLE"; then disable; else enable; fi ;;
recover) recover ;;
*)
echo "Usage: $(basename "$0") {on|off|toggle|recover}" >&2
exit 1
;;
esac
+9
View File
@@ -0,0 +1,9 @@
#!/bin/bash
# Re-enable the internal display if it was toggled off and no external monitors
# are currently active (e.g. external got disconnected live, during sleep, or
# wasn't present on boot).
if omarchy-hyprland-monitors-none && omarchy-hyprland-toggle-enabled internal-monitor-disable; then
omarchy-hyprland-monitor-internal-enable
fi
+9
View File
@@ -0,0 +1,9 @@
#!/bin/bash
# Toggle the internal laptop display on/off.
if omarchy-hyprland-toggle-enabled internal-monitor-disable; then
omarchy-hyprland-monitor-internal-enable
else
omarchy-hyprland-monitor-internal-disable
fi
+9 -34
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Cycle scaling for the focused Hyprland monitor
# Get the active monitor (the one with the cursor)
MONITOR_INFO=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true)')
ACTIVE_MONITOR=$(echo "$MONITOR_INFO" | jq -r '.name')
CURRENT_SCALE=$(echo "$MONITOR_INFO" | jq -r '.scale')
@@ -9,39 +8,15 @@ WIDTH=$(echo "$MONITOR_INFO" | jq -r '.width')
HEIGHT=$(echo "$MONITOR_INFO" | jq -r '.height')
REFRESH_RATE=$(echo "$MONITOR_INFO" | jq -r '.refreshRate')
# Cycle through scales: 1 → 1.25 → 1.6 → 2 → 3 → 1 (or reverse with --reverse)
SCALES=(1 1.25 1.6 2 3)
# Cycle through scales: 1 → 1.6 → 2 → 3 → 1
CURRENT_INT=$(awk -v s="$CURRENT_SCALE" 'BEGIN { printf "%.0f", s * 10 }')
# Find the index of the scale closest to the current one (Hyprland may
# snap fractional scales to nearby values, so we can't match exactly)
CURRENT_IDX=$(awk -v s="$CURRENT_SCALE" -v list="${SCALES[*]}" 'BEGIN {
n = split(list, arr, " ")
best = 0; best_diff = 1e9
for (i = 1; i <= n; i++) {
d = s - arr[i]; if (d < 0) d = -d
if (d < best_diff) { best_diff = d; best = i - 1 }
}
print best
}')
if [[ "$1" == "--reverse" ]]; then
NEW_IDX=$(( (CURRENT_IDX - 1 + ${#SCALES[@]}) % ${#SCALES[@]} ))
else
NEW_IDX=$(( (CURRENT_IDX + 1) % ${#SCALES[@]} ))
fi
NEW_SCALE=${SCALES[$NEW_IDX]}
case "$CURRENT_INT" in
10) NEW_SCALE=1.6 ;;
16) NEW_SCALE=2 ;;
20) NEW_SCALE=3 ;;
*) NEW_SCALE=1 ;;
esac
hyprctl keyword monitor "$ACTIVE_MONITOR,${WIDTH}x${HEIGHT}@${REFRESH_RATE},auto,$NEW_SCALE"
# Persist to monitors.conf if the user has a single generic catch-all line
# (ignoring disabled monitors), so the scale survives reboots.
MONITOR_CONF="$HOME/.config/hypr/monitors.conf"
if [[ -f $MONITOR_CONF ]]; then
mapfile -t ACTIVE_LINES < <(grep -E '^[[:space:]]*monitor=' "$MONITOR_CONF" | grep -vE 'disable[[:space:]]*$')
if [[ ${#ACTIVE_LINES[@]} -eq 1 ]] && [[ "${ACTIVE_LINES[0]}" =~ ^monitor=,preferred,auto, ]]; then
sed -i -E "s|^(monitor=,preferred,auto,).*|\\1${NEW_SCALE}|" "$MONITOR_CONF"
fi
fi
notify-send -u low "󰍹 Display scaling set to ${NEW_SCALE}x"
+3 -3
View File
@@ -1,14 +1,14 @@
#!/bin/bash
# omarchy:summary=Watch Hyprland monitor events and recover monitor toggles when a monitor is removed
# Listen on Hyprland's event socket and recover the internal display whenever
# a monitor is removed.
SOCKET="$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock"
socat -U - "UNIX-CONNECT:$SOCKET" | while read -r event; do
case "$event" in
monitorremoved\>\>*|monitorremovedv2\>\>*)
omarchy-hyprland-monitor-internal recover
omarchy-hyprland-monitor-internal-mirror recover
omarchy-hyprland-monitor-internal-recover
;;
esac
done
+5
View File
@@ -0,0 +1,5 @@
#!/bin/bash
# Returns true when there are multiple monitors connected (so we can disable the internal one)
(( $(hyprctl monitors -j 2>/dev/null | jq length) > 1 ))
+5
View File
@@ -0,0 +1,5 @@
#!/bin/bash
# Returns true when no monitors are connected
(( $(hyprctl monitors -j 2>/dev/null | jq length) == 0 ))
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Toggle permanent Hyprland flags by copying them into a directory that's sourced entirely.
# omarchy:args=[--enabled-notification <text>] [--disabled-notification <text>] <flag-name>
# Toggle permanent Hyprland flags by copying them into a directory that's sourced entirely.
ENABLED_NOTIFICATION=""
DISABLED_NOTIFICATION=""
+1 -2
View File
@@ -1,6 +1,5 @@
#!/bin/bash
# omarchy:summary=Check if a Hyprland toggle is currently disabled (missing).
# omarchy:args=<flag-name>
# Check if a Hyprland toggle is currently disabled (missing).
[[ ! -f "$HOME/.local/state/omarchy/toggles/hypr/$1.conf" ]]
+1 -2
View File
@@ -1,6 +1,5 @@
#!/bin/bash
# omarchy:summary=Check if a Hyprland toggle is currently enabled.
# omarchy:args=<flag-name>
# Check if a Hyprland toggle is currently enabled.
[[ -f "$HOME/.local/state/omarchy/toggles/hypr/$1.conf" ]]
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Close all open windows
# Close all open windows
hyprctl clients -j | \
jq -r ".[].address" | \
xargs -I{} hyprctl dispatch closewindow address:{}
+1 -1
View File
@@ -1,5 +1,5 @@
#!/bin/bash
# omarchy:summary=Toggles the window gaps globally between no gaps and the default.
# Toggles the window gaps globally between no gaps and the default.
omarchy-hyprland-toggle window-no-gaps
+14 -2
View File
@@ -1,7 +1,19 @@
#!/bin/bash
# omarchy:summary=Toggle to pop-out a tile to stay fixed on a display basis.
# omarchy:args=[width height x y]
# Toggle to pop-out a tile to stay fixed on a display basis.
# Usage:
# omarchy-hyprland-window-pop [width height [x y]]
#
# Arguments:
# width Optional. Width of the floating window. Default: 1300
# height Optional. Height of the floating window. Default: 900
# x Optional. X position of the window. Must provide both X and Y to take effect.
# y Optional. Y position of the window. Must provide both X and Y to take effect.
#
# Behavior:
# - If the window is already pinned, it will be unpinned and removed from the pop layer.
# - If the window is not pinned, it will be floated, resized, moved/centered, pinned, brought to top, and popped.
width=${1:-1300}
height=${2:-900}
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Toggle single-window square aspect ratio.
# Toggle single-window square aspect ratio.
omarchy-hyprland-toggle \
--enabled-notification " Enable single-window square aspect ratio" \
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Toggle the layout on the current active workspace between dwindle and scrolling
# Toggle the layout on the current active workspace between dwindle and scrolling
ACTIVE_WORKSPACE=$(hyprctl activeworkspace -j | jq -r '.id')
CURRENT_LAYOUT=$(hyprctl activeworkspace -j | jq -r '.tiledLayout')
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash
# omarchy:summary=Allow Chromium to sign in to Google accounts by adding the required OAuth credentials
# Allow Chromium to sign in to Google accounts by adding the correct
# oauth client id and secret to ~/.config/chromium-flags.conf.
if [[ -f ~/.config/chromium-flags.conf ]]; then
CONF=~/.config/chromium-flags.conf
+1 -5
View File
@@ -1,10 +1,6 @@
#!/bin/bash
# omarchy:summary=Install a supported development environment
# omarchy:name=dev-env
# omarchy:args=<ruby|node|bun|deno|go|laravel|symfony|php|python|elixir|phoenix|rust|java|zig|ocaml|dotnet|clojure|scala>
# omarchy:examples=omarchy install dev-env ruby | omarchy install dev-env node
# omarchy:requires-sudo=true
# Install one of the supported development environments. Usually called via Install > Development > * in the Omarchy Menu.
if [[ -z $1 ]]; then
echo "Usage: omarchy-install-dev-env <ruby|node|bun|deno|go|laravel|symfony|php|python|elixir|phoenix|rust|java|zig|ocaml|dotnet|clojure|scala>" >&2
+2 -2
View File
@@ -1,7 +1,7 @@
#!/bin/bash
# omarchy:summary=Install one of the supported databases in a Docker container with the suitable development options.
# omarchy:requires-sudo=true
# Install one of the supported databases in a Docker container with the suitable development options.
# Usually called via Install > Development > Docker DB from the Omarchy Menu.
options=("MySQL" "PostgreSQL" "Redis" "MongoDB" "MariaDB" "MSSQL")
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Install and start the Dropbox service. Must then be authenticated via the web.
# Install and start the Dropbox service. Must then be authenticated via the web.
echo "Installing all dependencies..."
omarchy-pkg-add dropbox dropbox-cli libappindicator-gtk3 python-gpgme nautilus-dropbox
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Install and launch Geforce Now.
# Install and launch Geforce Now.
set -e
-28
View File
@@ -1,28 +0,0 @@
#!/bin/bash
# Install Helix and configure it to use the current Omarchy theme.
echo "Installing Helix..."
omarchy-pkg-add helix
mkdir -p ~/.config/helix/themes
# Symlink the rendered Omarchy theme so Helix tracks the active theme
ln -sf ~/.config/omarchy/current/theme/helix.toml ~/.config/helix/themes/omarchy.toml
# Only seed a config.toml if the user does not already have one
if [[ ! -f ~/.config/helix/config.toml ]]; then
cat >~/.config/helix/config.toml <<'EOF'
theme = "omarchy"
EOF
fi
# Ensure the symlink target exists for users whose current theme predates this template
if [[ ! -e ~/.config/omarchy/current/theme/helix.toml ]]; then
omarchy-theme-refresh
fi
# Arch-based distros ship Helix as 'helix' rather than the upstream 'hx'.
if ! grep -q '^alias hx="helix"' ~/.bashrc 2>/dev/null; then
echo 'alias hx="helix"' >>~/.bashrc
fi
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Install the NordVPN service with optional GUI.
# omarchy:requires-sudo=true
# Install the NordVPN service with optional GUI.
echo "Installing NordVPN..."
omarchy-pkg-aur-add nordvpn-bin
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Install the ONCE service, enable its background service, and launch the TUI.
# omarchy:requires-sudo=true
# Install the ONCE service, enable its background service, and launch the TUI.
echo "Installing ONCE..."
omarchy-pkg-add once-bin
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Install Steam and graphics drivers selected for this system
# omarchy:requires-sudo=true
# Install and launch Steam after first letting the user pick the correct grahics card drivers.
set -e
+2 -5
View File
@@ -1,13 +1,10 @@
#!/bin/bash
# omarchy:summary=Install the Tailscale mesh VPN service and a web app for the Tailscale Admin Console.
# omarchy:requires-sudo=true
# Install the Tailscale mesh VPN service and a web app for the Tailscale Admin Console.
echo -e "\nInstalling Tailscale..."
omarchy-pkg-add tailscale
curl -fsSL https://tailscale.com/install.sh | sh
echo -e "\nStarting Tailscale..."
sudo systemctl enable --now tailscaled.service
sudo tailscale up --accept-routes
omarchy-webapp-install "Tailscale" "https://login.tailscale.com/admin/machines" https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/tailscale-light.png
+1 -3
View File
@@ -1,8 +1,6 @@
#!/bin/bash
# omarchy:summary=Install one of the approved terminals and set it as the default for Omarchy (Super + Return etc).
# omarchy:args=<alacritty|ghostty|kitty>
# omarchy:requires-sudo=true
# Install one of the approved terminals and set it as the default for Omarchy (Super + Return etc).
if (($# == 0)); then
echo "Usage: omarchy-install-terminal [alacritty|ghostty|kitty]"
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Install VS Code and configure Omarchy defaults for secrets, updates, and theme
# Install VSCode and configure it to use the gnome-libsecret password store, not to update automatically, and to use the current Omarchy theme.
echo "Installing VSCode..."
omarchy-pkg-add visual-studio-code-bin
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Install support for using Xbox controllers with Steam/RetroArch/etc.
# omarchy:requires-sudo=true
# Install support for using Xbox controllers with Steam/RetroArch/etc.
set -e
+1 -1
View File
@@ -1,5 +1,5 @@
#!/bin/bash
# omarchy:summary=Launch the fastfetch TUI that gives information about the current system.
# Launch the fastfetch TUI that gives information about the current system.
exec omarchy-launch-or-focus-tui "bash -c 'fastfetch; read -n 1 -s'"
+1 -1
View File
@@ -1,5 +1,5 @@
#!/bin/bash
# omarchy:summary=Launch the Omarchy audio controls TUI (provided by wiremix).
# Launch the Omarchy audio controls TUI (provided by wiremix).
omarchy-launch-or-focus-tui wiremix
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash
# omarchy:summary=Launch the Omarchy bluetooth controls TUI (provided by bluetui).
# Launch the Omarchy bluetooth controls TUI (provided by bluetui).
# Also attempts to unblock bluetooth service if rfkill had blocked it.
rfkill unblock bluetooth
exec omarchy-launch-or-focus-tui bluetui
+2 -2
View File
@@ -1,7 +1,7 @@
#!/bin/bash
# omarchy:summary=Launch the default browser as determined by xdg-settings.
# omarchy:args=[url]
# Launch the default browser as determined by xdg-settings.
# Automatically converts --private into the correct flag for the given browser.
default_browser=$(xdg-settings get default-web-browser)
browser_exec=$(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,~/.nix-profile,/usr}/share/applications/$default_browser 2>/dev/null | head -1)
+2 -2
View File
@@ -1,7 +1,7 @@
#!/bin/bash
# omarchy:summary=Launch the default editor as determined by $EDITOR (set via ~/.config/uwsm/default) (or nvim if missing).
# omarchy:args=<path>
# Launch the default editor as determined by $EDITOR (set via ~/.config/uwsm/default) (or nvim if missing).
# Starts suitable editors in a terminal window and otherwise as a regular application.
omarchy-cmd-present "$EDITOR" || EDITOR=nvim
@@ -1,7 +1,7 @@
#!/bin/bash
# omarchy:summary=Launch a floating terminal with the Omarchy presentation wrapper
# omarchy:args=<command>
# Launch a floating terminal with the Omarchy logo presentation, then execute the command passed in, and finally end with the omarchy-show-done presentation.
# Used by actions such as Update System.
cmd="$*"
exec setsid uwsm-app -- xdg-terminal-exec --app-id=org.omarchy.terminal --title=Omarchy -e bash -c "omarchy-show-logo; $cmd; if (( \$? != 130 )); then omarchy-show-done; fi"
+2 -2
View File
@@ -1,7 +1,7 @@
#!/bin/bash
# omarchy:summary=Launch an app or focus an existing window matching a pattern
# omarchy:args=<window-pattern> <launch-command>
# Launch or focus on a given command identified by the passed in window-pattern.
# Use by some default bindings, like the one for Spotify, to ensure there is only one instance of the application open.
if (($# == 0)); then
echo "Usage: omarchy-launch-or-focus [window-pattern] [launch-command]"

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