Compare commits

...
21 Commits
Author SHA1 Message Date
David Heinemeier Hansson 61d36a3ab5 AI prompt experiments 2026-05-08 14:18:39 +02:00
David Heinemeier Hansson 99b158cbc1 Back to trigger menu on esc 2026-05-08 12:45:31 +02:00
David Heinemeier Hansson f59e9133e1 Use new helper 2026-05-08 12:44:20 +02:00
David Heinemeier Hansson acb2c37b1f Have transcode flow through walker menus rather than gum prompts 2026-05-08 12:40:54 +02:00
David Heinemeier Hansson cbf4044c70 Omarchy menu helpers
Get more stuff out of the terminal
2026-05-08 12:40:37 +02:00
David Heinemeier HanssonandGitHub 129c39448c Reminders (#5669)
* Extract notification command for using the correct spacing

* Add easy to set reminders

* More human

* Clear and direct hotkeys

* Split

* Bake reminders into the skill
2026-05-08 11:58:12 +02:00
David Heinemeier Hansson 9f187b55da Make sure the Omarchy agent skill is available for all harnesses 2026-05-08 11:56:06 +02:00
David Heinemeier Hansson 5971bab9d1 Extract notification command for using the correct spacing 2026-05-08 09:01:09 +02:00
David Heinemeier Hansson a43c304d21 Add post-boot.d hooks and give daily weather as an example 2026-05-08 08:39:25 +02:00
David Heinemeier Hansson 5c3ca6084b Group duplicate notifications 2026-05-08 08:35:28 +02:00
David Heinemeier Hansson 0c6bd1929f Force metric return units 2026-05-07 19:44:19 +02:00
fa1ed01cd7 Run SwayOSD as a session service (#5656)
* Run SwayOSD as a session service

* Restart SwayOSD after clean exits

* We don't need the input backend (as we manage the hotkeys in Hyprland)

* Ensure we cleanup the old service starter

* Not needed

* Not needed either

* Clean up migration

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-05-07 19:43:27 +02:00
Mateusz KowalczykandGitHub 402da79f54 Install hardware video acceleration for non-X-series Panther Lake Chips (#5655)
* Adjust condition to also match non-X series Panther Lake GPUs.

* Add migration to install GPU acceleration on non-X Panther Lake systems.

* Update comment with Non-Arc Panther Lake GPUs mentioned.

* Simplify conditions in the migration
2026-05-07 19:12:48 +02:00
Ryan Hughes 4f502322bd Update pi package source 2026-05-07 12:21:08 -04:00
David Heinemeier Hansson 2293df2913 This requires a full reboot to work 2026-05-07 17:02:08 +02:00
David Heinemeier Hansson 573f75afeb Fix that zed cli is zeditor 2026-05-07 16:55:54 +02:00
Diego RiosandGitHub 9c3520caf9 Enable Bluetooth A2DP auto-connect in WirePlumber (#5336)
* Enable Bluetooth A2DP auto-connect in WirePlumber

* Harden Bluetooth A2DP migration
2026-05-07 16:48:26 +02:00
David Heinemeier Hansson 4831c883e5 Explain the 152 2026-05-07 16:18:23 +02:00
David Heinemeier Hansson e14c685c7e Quoting 2026-05-07 16:16:01 +02:00
David Heinemeier Hansson b794321cd0 Prevent notification text wrapping 2026-05-07 16:15:04 +02:00
David Heinemeier HanssonandGitHub 95d8125e59 Set default terminal, browser, editor explicitly (#5651)
* Set default terminal, browser, editor explicitly

* Consistent glyphs and setup

* Tweaks

* Always there

* Proper order

* Don't make a browser the default just because it's getting installed
2026-05-07 16:11:48 +02:00
45 changed files with 1444 additions and 96 deletions
+3
View File
@@ -32,9 +32,11 @@ GROUP_DESCRIPTIONS[branch]="Omarchy git branch management"
GROUP_DESCRIPTIONS[brightness]="Display and keyboard brightness"
GROUP_DESCRIPTIONS[capture]="Screenshots and screen recording"
GROUP_DESCRIPTIONS[channel]="Omarchy release channel management"
GROUP_DESCRIPTIONS[ai]="AI prompt helpers"
GROUP_DESCRIPTIONS[cmd]="Command and shortcut helpers"
GROUP_DESCRIPTIONS[config]="System configuration helpers"
GROUP_DESCRIPTIONS[debug]="Diagnostics and support logs"
GROUP_DESCRIPTIONS[default]="Default application selection"
GROUP_DESCRIPTIONS[dev]="Omarchy development tools"
GROUP_DESCRIPTIONS[drive]="Drive selection and encryption"
GROUP_DESCRIPTIONS[font]="Font management"
@@ -53,6 +55,7 @@ GROUP_DESCRIPTIONS[plymouth]="Plymouth boot theme management"
GROUP_DESCRIPTIONS[powerprofiles]="Power profile management"
GROUP_DESCRIPTIONS[refresh]="Reset config to defaults"
GROUP_DESCRIPTIONS[reinstall]="Reinstall and reset workflows"
GROUP_DESCRIPTIONS[reminder]="Desktop notification reminders"
GROUP_DESCRIPTIONS[remove]="Removal workflows"
GROUP_DESCRIPTIONS[restart]="Restart Omarchy components"
GROUP_DESCRIPTIONS[setup]="Interactive setup wizards"
+70
View File
@@ -0,0 +1,70 @@
#!/bin/bash
# omarchy:summary=Ask Pi a question and show the answer as a notification
# omarchy:group=ai
# omarchy:name=prompt
# omarchy:args=[--speak] [prompt]
# omarchy:examples=omarchy ai prompt|omarchy-ai-prompt --speak "Summarize this"
set -euo pipefail
state_home=${XDG_STATE_HOME:-$HOME/.local/state}/omarchy
state_dir="$state_home/indicators"
session_file="$state_home/agent/prompt.jsonl"
state_file="$state_dir/ai"
mkdir -p "$state_dir" "$(dirname "$session_file")"
markdown_to_pango() {
sed -E \
-e 's/&/\&amp;/g' \
-e 's/</\&lt;/g' \
-e 's/>/\&gt;/g' \
-e 's/`([^`]+)`/<tt>\1<\/tt>/g' \
-e 's/\*\*([^*]+)\*\*/<b>\1<\/b>/g' \
-e 's/__([^_]+)__/<b>\1<\/b>/g' \
-e 's/\*([^*]+)\*/<i>\1<\/i>/g' \
-e 's/_([^_]+)_/<i>\1<\/i>/g' \
-e 's/~~([^~]+)~~/<s>\1<\/s>/g'
}
speak=false
if (($# > 0)) && [[ ${1:-} == "--speak" ]]; then
speak=true
shift
fi
if (($# > 0)); then
prompt="$*"
else
prompt=$(omarchy-menu-input "Ask AI" --width 800 || true)
fi
prompt=$(sed 's/^[[:space:]]*//; s/[[:space:]]*$//' <<<"$prompt")
[[ -n $prompt ]] || exit 0
cleanup() {
rm -f "$state_file"
pkill -RTMIN+11 waybar 2>/dev/null || true
}
trap cleanup EXIT
echo "thinking" >"$state_file"
pkill -RTMIN+11 waybar 2>/dev/null || true
if answer=$(pi -p \
--session "$session_file" \
--model gemini-2.5-flash-lite \
--skill "$HOME/.pi/agent/skills/omarchy" \
--skill "$HOME/.pi/agent/git/github.com/badlogic/pi-skills/brave-search" \
--append-system-prompt "For Omarchy desktop/system/config questions, load and follow the omarchy skill before answering. For current facts, historical facts, documentation, or questions that need web context, use the brave-search skill when BRAVE_API_KEY is available; otherwise answer from general knowledge and say when uncertain." \
"$prompt" 2>&1); then
if [[ $speak == true ]]; then
omarchy-ai-speak "$answer"
else
formatted_answer=$(markdown_to_pango <<<"$answer")
omarchy-notification-send "󱚣" "Oma" "$formatted_answer" -t 10000
fi
else
omarchy-notification-send "󱚡" "Oma failed" "$answer" -u critical -t 10000
exit 1
fi
+96
View File
@@ -0,0 +1,96 @@
#!/bin/bash
# omarchy:summary=Record speech, transcribe it with Voxtype, and ask Pi
# omarchy:group=ai
# omarchy:name=prompt-transcribe
# omarchy:hidden=true
set -euo pipefail
runtime_dir=${XDG_RUNTIME_DIR:-/tmp}/omarchy
state_dir=${XDG_STATE_HOME:-$HOME/.local/state}/omarchy/indicators
pid_file="$runtime_dir/prompt-transcribe.pid"
wav_file="$runtime_dir/prompt-transcribe.wav"
state_file="$state_dir/ai"
log_file="$runtime_dir/prompt-transcribe.log"
mkdir -p "$runtime_dir" "$state_dir"
log() {
printf '[%s] %s\n' "$(date '+%F %T')" "$*" >>"$log_file"
}
show_indicator() {
echo "listening" >"$state_file"
pkill -RTMIN+11 waybar 2>/dev/null || true
}
hide_indicator() {
rm -f "$state_file"
pkill -RTMIN+11 waybar 2>/dev/null || true
}
log "started: ${1:-toggle}"
case "${1:-toggle}" in
start)
if [[ -s $pid_file ]] && kill -0 "$(<"$pid_file")" 2>/dev/null; then
exit 0
fi
show_indicator
rm -f "$wav_file"
pw-record --target @DEFAULT_SOURCE@ --format s16 --rate 16000 --channels 1 "$wav_file" >>"$log_file" 2>&1 &
echo $! >"$pid_file"
log "recording started with pid $(<"$pid_file")"
;;
stop)
if [[ -s $pid_file ]]; then
pid=$(<"$pid_file")
log "stopping recorder pid $pid"
kill "$pid" 2>/dev/null || true
for _ in {1..20}; do
kill -0 "$pid" 2>/dev/null || break
sleep 0.05
done
rm -f "$pid_file"
else
log "no pid file found"
fi
if [[ ! -s $wav_file ]]; then
log "no recording found, exiting"
hide_indicator
exit 0
fi
log "transcribing $(stat -c%s "$wav_file") bytes"
if transcript=$(voxtype transcribe "$wav_file" 2>>"$log_file"); then
log "transcription length: ${#transcript}"
else
status=$?
rm -f "$wav_file"
log "transcription failed with status $status"
hide_indicator
omarchy-notification-send "󱚣" "AI transcription failed" "Voxtype could not transcribe the prompt." -u critical
exit 1
fi
rm -f "$wav_file"
transcript=$(sed 's/^[[:space:]]*//; s/[[:space:]]*$//' <<<"$transcript")
if [[ -z $transcript ]]; then
log "empty transcription, exiting"
hide_indicator
exit 0
fi
log "sending transcript to omarchy-ai-prompt"
omarchy-ai-prompt --speak "$transcript"
log "omarchy-ai-prompt finished"
;;
*)
echo "Usage: omarchy-ai-prompt-transcribe start|stop"
exit 1
;;
esac
+36
View File
@@ -0,0 +1,36 @@
#!/bin/bash
# omarchy:summary=Speak text using Piper TTS
# omarchy:group=ai
# omarchy:name=speak
# omarchy:args=[text]
# omarchy:examples=omarchy ai speak "Hello"
set -euo pipefail
voice_dir=${XDG_DATA_HOME:-$HOME/.local/share}/omarchy/piper
model="$voice_dir/en_US-amy-medium.onnx"
config="$voice_dir/en_US-amy-medium.onnx.json"
output=${XDG_RUNTIME_DIR:-/tmp}/omarchy-ai-speak.wav
mkdir -p "$voice_dir" "$(dirname "$output")"
if (($# > 0)); then
text="$*"
else
text=$(cat)
fi
text=$(sed 's/^[[:space:]]*//; s/[[:space:]]*$//' <<<"$text")
[[ -n $text ]] || exit 0
if [[ ! -f $model ]]; then
curl -L --fail -o "$model" "https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/amy/medium/en_US-amy-medium.onnx"
fi
if [[ ! -f $config ]]; then
curl -L --fail -o "$config" "https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/amy/medium/en_US-amy-medium.onnx.json"
fi
uvx --from piper-tts piper --model "$model" --config "$config" --output-file "$output" <<<"$text" >/dev/null
pw-play "$output"
+40
View File
@@ -0,0 +1,40 @@
#!/bin/bash
# omarchy:summary=Set the default browser for Omarchy and XDG handlers
# omarchy:args=[chromium|chrome|brave|brave-origin|edge|firefox|zen]
# omarchy:examples=omarchy default browser firefox | omarchy default browser brave
if (($# == 0)); then
case "$(xdg-settings get default-web-browser)" in
chromium.desktop) echo "chromium" ;;
google-chrome.desktop) echo "chrome" ;;
brave-browser.desktop) echo "brave" ;;
brave-origin-beta.desktop) echo "brave-origin" ;;
microsoft-edge.desktop) echo "edge" ;;
firefox.desktop) echo "firefox" ;;
zen.desktop) echo "zen" ;;
*) xdg-settings get default-web-browser ;;
esac
exit 0
fi
case "$1" in
chromium) desktop_id="chromium.desktop"; name="Chromium"; glyph="" ;;
chrome) desktop_id="google-chrome.desktop"; name="Chrome"; glyph="󰊯" ;;
brave) desktop_id="brave-browser.desktop"; name="Brave"; glyph="󰖟" ;;
brave-origin) desktop_id="brave-origin-beta.desktop"; name="Brave Origin"; glyph="󰖟" ;;
edge) desktop_id="microsoft-edge.desktop"; name="Edge"; glyph="󰇩" ;;
firefox) desktop_id="firefox.desktop"; name="Firefox"; glyph="󰈹" ;;
zen) desktop_id="zen.desktop"; name="Zen"; glyph="󰰷" ;;
*)
echo "Usage: omarchy-default-browser <chromium|chrome|brave|brave-origin|edge|firefox|zen>"
exit 1
;;
esac
xdg-settings set default-web-browser "$desktop_id"
xdg-mime default "$desktop_id" x-scheme-handler/http
xdg-mime default "$desktop_id" x-scheme-handler/https
xdg-mime default "$desktop_id" text/html
notify-send -u low "$glyph $name is now the default browser"
+30
View File
@@ -0,0 +1,30 @@
#!/bin/bash
# omarchy:summary=Set the default editor for $EDITOR
# omarchy:args=[code|cursor|zed|sublime_text|helix|vim|emacs|nvim]
# omarchy:examples=omarchy default editor | omarchy default editor code | omarchy default editor helix
if (($# == 0)); then
sed -n 's/^export EDITOR=//p' ~/.config/uwsm/default | head -n 1
exit 0
fi
case "$1" in
code) editor="code"; name="VSCode"; glyph="" ;;
cursor) editor="cursor"; name="Cursor"; glyph="" ;;
zed | zeditor) editor="zeditor"; name="Zed"; glyph="" ;;
sublime_text) editor="sublime_text"; name="Sublime Text"; glyph="" ;;
helix) editor="helix"; name="Helix"; glyph="" ;;
vim) editor="vim"; name="Vim"; glyph="" ;;
emacs) editor="emacs"; name="Emacs"; glyph="" ;;
nvim) editor="nvim"; name="Neovim"; glyph="" ;;
*)
echo "Usage: omarchy-default-editor <code|cursor|zed|sublime_text|helix|vim|emacs|nvim>"
exit 1
;;
esac
sed -i "s/^export EDITOR=.*/export EDITOR=$editor/" ~/.config/uwsm/default
export EDITOR="$editor"
notify-send -u low "$glyph $name is now the default editor" " Effective after logging out"
+36
View File
@@ -0,0 +1,36 @@
#!/bin/bash
# omarchy:summary=Set the default terminal used by xdg-terminal-exec
# omarchy:args=[alacritty|foot|ghostty|kitty]
# omarchy:examples=omarchy default terminal ghostty | omarchy default terminal kitty
if (($# == 0)); then
desktop_id=$(grep -vE '^($|#)' ~/.config/xdg-terminals.list 2>/dev/null | head -n 1)
case "$desktop_id" in
Alacritty.desktop) echo "alacritty" ;;
foot.desktop) echo "foot" ;;
com.mitchellh.ghostty.desktop) echo "ghostty" ;;
kitty.desktop) echo "kitty" ;;
*) echo "$desktop_id" ;;
esac
exit 0
fi
case "$1" in
alacritty) desktop_id="Alacritty.desktop"; name="Alacritty"; glyph="" ;;
foot) desktop_id="foot.desktop"; name="Foot"; glyph="" ;;
ghostty) desktop_id="com.mitchellh.ghostty.desktop"; name="Ghostty"; glyph="" ;;
kitty) desktop_id="kitty.desktop"; name="Kitty"; glyph="" ;;
*)
echo "Usage: omarchy-default-terminal <alacritty|foot|ghostty|kitty>"
exit 1
;;
esac
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
notify-send -u low "$glyph $name is now the default terminal"
+1
View File
@@ -16,6 +16,7 @@ if [[ -f $FIRST_RUN_MODE ]]; then
bash "$OMARCHY_PATH/install/first-run/firewall.sh"
bash "$OMARCHY_PATH/install/first-run/dns-resolver.sh"
bash "$OMARCHY_PATH/install/first-run/gnome-theme.sh"
bash "$OMARCHY_PATH/install/first-run/swayosd.sh"
bash "$OMARCHY_PATH/install/first-run/gtk-primary-paste.sh"
bash "$OMARCHY_PATH/install/first-run/elephant.sh"
omarchy-hook-install post-update "$OMARCHY_PATH/install/first-run/install-voxtype.hook"
+9 -22
View File
@@ -1,24 +1,17 @@
#!/bin/bash
# omarchy:summary=Install a supported browser and make it the default
# omarchy:summary=Install a supported browser
# omarchy:args=<chrome|brave|brave-origin|edge|firefox|zen>
# omarchy:examples=omarchy install browser firefox | omarchy install browser brave
make_default() {
xdg-settings set default-web-browser "$1"
xdg-mime default "$1" x-scheme-handler/http
xdg-mime default "$1" x-scheme-handler/https
xdg-mime default "$1" text/html
}
setup_policy_directory() {
sudo mkdir -p "$1"
sudo chmod a+rw "$1"
}
announce_default_browser() {
announce_browser_installed() {
echo ""
echo "$1 is now the default browser. Start it with Super + Shift + Return."
echo "$1 browser installed. Make it the default via Setup > Defaults > Browser."
}
copy_chromium_flags() {
@@ -45,9 +38,8 @@ chrome)
setup_policy_directory /etc/opt/chrome/policies/managed
copy_chromium_flags ~/.config/chrome-flags.conf
make_default google-chrome.desktop
omarchy-theme-set-browser
announce_default_browser "Chrome"
announce_browser_installed "Chrome"
;;
edge)
echo "Installing Edge..."
@@ -55,9 +47,8 @@ edge)
setup_policy_directory /etc/opt/edge/policies/managed
copy_chromium_flags ~/.config/microsoft-edge-stable-flags.conf
make_default microsoft-edge.desktop
omarchy-theme-set-browser
announce_default_browser "Edge"
announce_browser_installed "Edge"
;;
brave)
echo "Installing Brave..."
@@ -65,9 +56,8 @@ brave)
setup_policy_directory /etc/brave/policies/managed
copy_chromium_flags ~/.config/brave-flags.conf
make_default brave-browser.desktop
omarchy-theme-set-browser
announce_default_browser "Brave"
announce_browser_installed "Brave"
;;
brave-origin)
echo "Installing Brave Origin..."
@@ -77,9 +67,8 @@ brave-origin)
mkdir -p ~/.config
# FIXME: Use normal chromium flags when Brave Origin wrapper has been fixed
echo "--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url" > ~/.config/brave-origin-beta-flags.conf
make_default brave-origin-beta.desktop
omarchy-theme-set-browser
announce_default_browser "Brave Origin"
announce_browser_installed "Brave Origin"
;;
firefox)
echo "Installing Firefox..."
@@ -87,8 +76,7 @@ firefox)
setup_firefox_preferences /usr/lib/firefox/distribution
setup_firefox_wayland
make_default firefox.desktop
announce_default_browser "Firefox"
announce_browser_installed "Firefox"
;;
zen)
echo "Installing Zen..."
@@ -96,8 +84,7 @@ zen)
setup_firefox_preferences /opt/zen-browser/distribution
setup_firefox_wayland
make_default zen.desktop
announce_default_browser "Zen"
announce_browser_installed "Zen"
;;
*)
echo "Usage: omarchy-install-browser <chrome|brave|brave-origin|edge|firefox|zen>"
+152 -16
View File
@@ -93,9 +93,10 @@ show_learn_menu() {
}
show_trigger_menu() {
case $(menu "Trigger" " Capture\n󰧸 Transcode\n Share\n󰔎 Toggle\n Hardware") in
case $(menu "Trigger" "󰔛 Reminder\n Capture\n󰧸 Transcode\n Share\n󰔎 Toggle\n Hardware") in
*Reminder*) show_reminder_menu ;;
*Capture*) show_capture_menu ;;
*Transcode*) show_transcode_menu ;;
*Transcode*) omarchy-transcode || back_to show_trigger_menu ;;
*Share*) show_share_menu ;;
*Toggle*) show_toggle_menu ;;
*Hardware*) show_hardware_menu ;;
@@ -103,6 +104,41 @@ show_trigger_menu() {
esac
}
show_reminder_menu() {
case $(menu "Reminder" "󰔛 Set one\n󰔛 Show all\n󰔛 Clear all") in
*Set*) show_custom_reminder_input ;;
*"Show all"*) omarchy-reminder show ;;
*"Clear all"*) omarchy-reminder clear ;;
*) back_to show_trigger_menu ;;
esac
}
show_custom_reminder_input() {
local minutes
minutes=$(omarchy-menu-input "Remind in minutes")
if [[ $minutes =~ ^[0-9]+$ ]] && ((minutes > 0)); then
show_reminder_message_input "$minutes"
elif [[ -n $minutes ]]; then
omarchy-notification-send "󰔛" "Invalid reminder" "Enter the number of minutes" -u critical
show_custom_reminder_input
else
back_to show_reminder_menu
fi
}
show_reminder_message_input() {
local minutes="$1"
local message
message=$(omarchy-menu-input "Reminder message")
if [[ -n $message ]]; then
omarchy-reminder "$minutes" "$message"
else
omarchy-reminder "$minutes"
fi
}
show_capture_menu() {
case $(menu "Capture" " Screenshot\n Screenrecord\n󰴑 Text Extraction\n󰃉 Color") in
*Screenshot*) omarchy-capture-screenshot ;;
@@ -167,14 +203,6 @@ show_share_menu() {
esac
}
show_transcode_menu() {
case $(menu "Transcode" " Picture\n Video") in
*Picture*) present_terminal "omarchy-transcode --path '$HOME/Pictures'" ;;
*Video*) present_terminal "omarchy-transcode --path '$HOME/Videos'" ;;
*) back_to show_trigger_menu ;;
esac
}
show_toggle_menu() {
local options="󱄄 Screensaver\n󰔎 Nightlight\n󱫖 Idle Lock\n󰂛 Notifications\n󰍜 Top Bar\n󱂬 Workspace Layout\n Window Gaps\n 1-Window Ratio\n󰍹 Monitor Scaling\n Direct Boot\n󰟵 Passwordless Sudo"
@@ -277,7 +305,7 @@ show_setup_menu() {
local options=" Audio\n Wifi\n󰂯 Bluetooth\n󱐋 Power Profile\n System Sleep\n󰍹 Monitors"
[[ -f ~/.config/hypr/bindings.conf ]] && options="$options\n Keybindings"
[[ -f ~/.config/hypr/input.conf ]] && options="$options\n Input"
options="$options\n󰱔 DNS\n Security\n Config"
options="$options\n Defaults\n󰱔 DNS\n Security\n Config"
case $(menu "Setup" "$options") in
*Audio*) omarchy-launch-audio ;;
@@ -288,6 +316,7 @@ show_setup_menu() {
*Monitors*) open_in_editor ~/.config/hypr/monitors.conf ;;
*Keybindings*) open_in_editor ~/.config/hypr/bindings.conf ;;
*Input*) open_in_editor ~/.config/hypr/input.conf ;;
*Defaults*) show_setup_default_menu ;;
*DNS*) present_terminal omarchy-setup-dns ;;
*Security*) show_setup_security_menu ;;
*Config*) show_setup_config_menu ;;
@@ -313,9 +342,114 @@ show_setup_security_menu() {
esac
}
show_setup_default_menu() {
case $(menu "Default" " Browser\n Terminal\n Editor") in
*Browser*) show_setup_default_browser_menu ;;
*Terminal*) show_setup_default_terminal_menu ;;
*Editor*) show_setup_default_editor_menu ;;
*) show_setup_menu ;;
esac
}
browser_desktop_exists() {
[[ -f ~/.local/share/applications/$1 || -f ~/.nix-profile/share/applications/$1 || -f /usr/share/applications/$1 ]]
}
show_setup_default_browser_menu() {
local options=""
browser_desktop_exists chromium.desktop && options="$options Chromium"
browser_desktop_exists google-chrome.desktop && options="${options:+$options\n}󰊯 Chrome"
browser_desktop_exists brave-browser.desktop && options="${options:+$options\n}󰖟 Brave"
browser_desktop_exists brave-origin-beta.desktop && options="${options:+$options\n}󰖟 Brave Origin"
browser_desktop_exists microsoft-edge.desktop && options="${options:+$options\n}󰇩 Edge"
browser_desktop_exists firefox.desktop && options="${options:+$options\n}󰈹 Firefox"
browser_desktop_exists zen.desktop && options="${options:+$options\n}󰖟 Zen"
local current=""
case "$(omarchy-default-browser)" in
chromium) current=" Chromium" ;;
chrome) current="󰊯 Chrome" ;;
brave) current="󰖟 Brave" ;;
brave-origin) current="󰖟 Brave Origin" ;;
edge) current="󰇩 Edge" ;;
firefox) current="󰈹 Firefox" ;;
zen) current="󰖟 Zen" ;;
esac
case $(menu "Default Browser" "$options" "" "$current") in
*Chromium*) omarchy-default-browser chromium ;;
*Chrome*) omarchy-default-browser chrome ;;
*"Brave Origin"*) omarchy-default-browser brave-origin ;;
*Brave*) omarchy-default-browser brave ;;
*Edge*) omarchy-default-browser edge ;;
*Firefox*) omarchy-default-browser firefox ;;
*Zen*) omarchy-default-browser zen ;;
*) show_setup_default_menu ;;
esac
}
show_setup_default_terminal_menu() {
local options=""
omarchy-cmd-present alacritty && options="$options Alacritty"
omarchy-cmd-present foot && options="${options:+$options\n} Foot"
omarchy-cmd-present ghostty && options="${options:+$options\n} Ghostty"
omarchy-cmd-present kitty && options="${options:+$options\n} Kitty"
local current=""
case "$(omarchy-default-terminal)" in
alacritty) current=" Alacritty" ;;
foot) current=" Foot" ;;
ghostty) current=" Ghostty" ;;
kitty) current=" Kitty" ;;
esac
case $(menu "Default Terminal" "$options" "" "$current") in
*Alacritty*) omarchy-default-terminal alacritty ;;
*Foot*) omarchy-default-terminal foot ;;
*Ghostty*) omarchy-default-terminal ghostty ;;
*Kitty*) omarchy-default-terminal kitty ;;
*) show_setup_default_menu ;;
esac
}
show_setup_default_editor_menu() {
local options=""
omarchy-cmd-present nvim && options="$options Neovim"
omarchy-cmd-present code && options="${options:+$options\n} VSCode"
omarchy-cmd-present cursor && options="${options:+$options\n} Cursor"
omarchy-cmd-present zeditor && options="${options:+$options\n} Zed"
omarchy-cmd-present sublime_text && options="${options:+$options\n} Sublime Text"
omarchy-cmd-present helix && options="${options:+$options\n} Helix"
omarchy-cmd-present vim && options="${options:+$options\n} Vim"
omarchy-cmd-present emacs && options="${options:+$options\n} Emacs"
local current=""
case "$(omarchy-default-editor)" in
nvim) current=" Neovim" ;;
code) current=" VSCode" ;;
cursor) current=" Cursor" ;;
zed | zeditor) current=" Zed" ;;
sublime_text) current=" Sublime Text" ;;
helix) current=" Helix" ;;
vim) current=" Vim" ;;
emacs) current=" Emacs" ;;
esac
case $(menu "Default Editor" "$options" "" "$current") in
*Neovim*) omarchy-default-editor nvim ;;
*VSCode*) omarchy-default-editor code ;;
*Cursor*) omarchy-default-editor cursor ;;
*Zed*) omarchy-default-editor zed ;;
*Sublime*) omarchy-default-editor sublime_text ;;
*Helix*) omarchy-default-editor helix ;;
*Vim*) omarchy-default-editor vim ;;
*Emacs*) omarchy-default-editor emacs ;;
*) show_setup_default_menu ;;
esac
}
show_setup_config_menu() {
case $(menu "Setup" " Defaults\n Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar\n󰞅 XCompose") in
*Defaults*) open_in_editor ~/.config/uwsm/default ;;
case $(menu "Setup" " Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar\n󰞅 XCompose") in
*Hyprland*) open_in_editor ~/.config/hypr/hyprland.conf ;;
*Hypridle*) open_in_editor ~/.config/hypr/hypridle.conf && omarchy-restart-hypridle ;;
*Hyprlock*) open_in_editor ~/.config/hypr/hyprlock.conf ;;
@@ -371,7 +505,7 @@ show_install_menu() {
}
show_install_browser_menu() {
case $(menu "Install" " Chrome\n Edge\n Brave\n Brave Origin\n Firefox\n Zen") in
case $(menu "Install" " Chrome\n Edge\n Brave\n Brave Origin\n Firefox\n󰖟 Zen") in
*Chrome*) present_terminal "omarchy-install-browser chrome" ;;
*Edge*) present_terminal "omarchy-install-browser edge" ;;
*"Brave Origin"*) present_terminal "omarchy-install-browser brave-origin" ;;
@@ -395,12 +529,13 @@ show_install_service_menu() {
}
show_install_editor_menu() {
case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Emacs") in
case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Vim\n Emacs") in
*VSCode*) present_terminal omarchy-install-vscode ;;
*Cursor*) install_and_launch "Cursor" "cursor-bin" "cursor" ;;
*Zed*) present_terminal omarchy-install-zed ;;
*Sublime*) install_and_launch "Sublime Text" "sublime-text-4" "sublime_text" ;;
*Helix*) present_terminal omarchy-install-helix ;;
*Vim*) install "Vim" "vim" ;;
*Emacs*) install "Emacs" "emacs-wayland" && systemctl --user enable --now emacs.service ;;
*) show_install_menu ;;
esac
@@ -708,7 +843,8 @@ go_to_menu() {
*toggle*) show_toggle_menu ;;
*hardware*) show_hardware_menu ;;
*share*) show_share_menu ;;
*transcode*) show_transcode_menu ;;
*reminder-set*) show_custom_reminder_input ;;
*reminder*) show_reminder_menu ;;
*background*) show_background_menu ;;
*capture*) show_capture_menu ;;
*style*) show_style_menu ;;
+45
View File
@@ -0,0 +1,45 @@
#!/bin/bash
# omarchy:summary=Pick a file with Walker
# omarchy:group=menu
# omarchy:name=file
# omarchy:args=label paths formats [walker args...]
# omarchy:examples=omarchy menu file "Select image" "$HOME/Pictures" "jpg png webp"|omarchy-menu-file "Select media" "$HOME/Pictures:$HOME/Videos" "jpg png mp4 mov" --width 800
set -euo pipefail
if (( $# < 3 )); then
echo "Usage: omarchy-menu-file <label> <paths> <formats> [walker args...]" >&2
exit 1
fi
label="$1"
paths_arg="$2"
formats_arg="$3"
shift 3
IFS=: read -r -a paths <<<"$paths_arg"
read -r -a formats <<<"$formats_arg"
if (( ${#paths[@]} == 0 || ${#formats[@]} == 0 )); then
echo "Usage: omarchy-menu-file <label> <paths> <formats> [walker args...]" >&2
exit 1
fi
for path in "${paths[@]}"; do
[[ -e $path ]] || { echo "Path not found: $path" >&2; exit 1; }
done
find_args=("${paths[@]}" -type f "(")
for format in "${formats[@]}"; do
if (( ${#find_args[@]} > ${#paths[@]} + 3 )); then
find_args+=(-o)
fi
format="${format#.}"
find_args+=(-iname "*.$format")
done
find_args+=(")")
find "${find_args[@]}" -printf '%T@\t%p\n' 2>/dev/null | sort -rn | cut -f2- |
omarchy-launch-walker --dmenu --width 800 --minheight 1 --maxheight 500 -p "$label…" "$@" 2>/dev/null
+16
View File
@@ -0,0 +1,16 @@
#!/bin/bash
# omarchy:summary=Prompt for text input with Walker
# omarchy:group=menu
# omarchy:name=input
# omarchy:args=prompt [walker args...]
# omarchy:examples=omarchy menu input Reminder|omarchy-menu-input "Reminder in minutes" --width 400
set -euo pipefail
prompt="${1:-Input}"
if (( $# > 0 )); then
shift
fi
omarchy-launch-walker --dmenu --inputonly --width 295 --minheight 1 --maxheight 1 -p "$prompt…" "$@" 2>/dev/null
+38
View File
@@ -0,0 +1,38 @@
#!/bin/bash
# omarchy:summary=Pick one option with Walker
# omarchy:group=menu
# omarchy:name=select
# omarchy:args=prompt option... [-- walker args...]
# omarchy:examples=omarchy menu select Format jpg png|omarchy-menu-select Resolution 4k 1080p 720p -- --width 400
set -euo pipefail
if (( $# < 2 )); then
echo "Usage: omarchy-menu-select <prompt> <option>... [-- walker args...]" >&2
exit 1
fi
prompt="$1"
shift
options=()
walker_args=()
while (( $# > 0 )); do
if [[ $1 == "--" ]]; then
shift
walker_args=("$@")
break
fi
options+=("$1")
shift
done
if (( ${#options[@]} == 0 )); then
echo "Usage: omarchy-menu-select <prompt> <option>... [-- walker args...]" >&2
exit 1
fi
printf '%s\n' "${options[@]}" | omarchy-launch-walker --dmenu --width 295 --minheight 1 --maxheight 300 -p "$prompt…" "${walker_args[@]}" 2>/dev/null
+32
View File
@@ -0,0 +1,32 @@
#!/bin/bash
# omarchy:summary=Send a desktop notification with Omarchy glyph and body spacing
# omarchy:args=<glyph> <headline> [description] [notify-send options]
# omarchy:examples=omarchy notification send "󰔛" "Reminder" "5 minutes are up" -u critical
set -euo pipefail
if (($# < 2)); then
echo "Usage: omarchy-notification-send <glyph> <headline> [description] [notify-send options]"
exit 1
fi
glyph=$1
headline=$2
description=${3:-}
shift 2
if (($# > 0)) && [[ $1 != -* ]]; then
shift
else
description=""
fi
summary="$glyph $headline"
if [[ -n $description ]]; then
description=$(sed 's/^/ /' <<<"$description")
notify-send "$@" "$summary" "$description"
else
notify-send "$@" "$summary"
fi
+139
View File
@@ -0,0 +1,139 @@
#!/bin/bash
# omarchy:summary=Set and show lightweight desktop notification reminders
# omarchy:args=<minutes> [message] | show | clear
# omarchy:examples=omarchy reminder 5 | omarchy reminder 30 "Check the oven" | omarchy reminder show | omarchy reminder clear
set -euo pipefail
format_remaining() {
local seconds=$1
local minutes=$((seconds / 60))
local remainder=$((seconds % 60))
if ((minutes > 0 && remainder > 0)); then
echo "${minutes}m ${remainder}s"
elif ((minutes > 0)); then
echo "${minutes}m"
else
echo "${remainder}s"
fi
}
parse_systemd_timespan() {
local timespan="$1"
local total=0
local value unit whole
while read -r value unit; do
whole=${value%.*}
case $unit in
d) total=$((total + whole * 86400)) ;;
h) total=$((total + whole * 3600)) ;;
min) total=$((total + whole * 60)) ;;
s) total=$((total + whole)) ;;
ms | us) ;;
esac
done < <(grep -oE '[0-9]+([.][0-9]+)?(d|h|min|s|ms|us)' <<<"$timespan" | sed -E 's/^([0-9.]+)([a-z]+)$/\1 \2/')
echo "$total"
}
show_reminders() {
local timers timer next next_seconds uptime remaining body=""
local reminder_dir="${XDG_RUNTIME_DIR:-/tmp}/omarchy-reminders"
local reminder_message=""
timers=$(systemctl --user list-timers --all --no-legend --no-pager "omarchy-reminder-*.timer" 2>/dev/null | awk '{ print $(NF - 1) }')
uptime=${SECONDS_SINCE_BOOT:-$(awk '{ print int($1) }' /proc/uptime)}
for timer in $timers; do
next=$(systemctl --user show -P NextElapseUSecMonotonic "$timer" 2>/dev/null || true)
[[ -z $next ]] && continue
next_seconds=$(parse_systemd_timespan "$next")
((next_seconds <= uptime)) && continue
remaining=$((next_seconds - uptime))
reminder=${timer%.timer}
reminder=${reminder#omarchy-reminder-}
set_at=${reminder##*-}
reminder_minutes=${reminder%%m-*}
reminder_message=""
[[ -f $reminder_dir/${timer%.timer}.message ]] && reminder_message=$(<"$reminder_dir/${timer%.timer}.message")
if [[ -n $reminder_message ]]; then
body+="$reminder_message in $(format_remaining $remaining) ($(date -d "@$((set_at + reminder_minutes * 60))" +%-H:%M))"$'\n'
else
body+="${reminder_minutes}-min reminder in $(format_remaining $remaining) ($(date -d "@$((set_at + reminder_minutes * 60))" +%-H:%M))"$'\n'
fi
done
if [[ -z $body ]]; then
omarchy-notification-send "󰔛" "Upcoming reminders" "No outstanding reminders" -u low
else
omarchy-notification-send "󰔛" "Upcoming reminders" "${body%$'\n'}" -u low
fi
}
clear_reminders() {
local units
local reminder_dir="${XDG_RUNTIME_DIR:-/tmp}/omarchy-reminders"
units=$(systemctl --user list-timers --all --no-legend --no-pager "omarchy-reminder-*.timer" 2>/dev/null | awk '{ print $(NF - 1), $NF }')
if [[ -n $units ]]; then
xargs -r systemctl --user stop <<<"$units" || true
fi
rm -f "$reminder_dir"/omarchy-reminder-*.message 2>/dev/null || true
omarchy-notification-send "󰔛" "All reminders have been cleared" -u low
}
case ${1:-} in
show | list)
show_reminders
exit 0
;;
clear)
clear_reminders
exit 0
;;
esac
minutes=${1:-}
shift || true
message="$*"
custom_message="$message"
if [[ -z $minutes ]] || [[ ! $minutes =~ ^[0-9]+$ ]] || ((minutes == 0)); then
echo "Usage: omarchy-reminder <minutes> [message]"
echo " omarchy-reminder show"
echo " omarchy-reminder clear"
exit 1
fi
if [[ -z $message ]]; then
message="Your ${minutes} minutes are up"
fi
set_at=$(date +%s)
remind_at=$(date -d "+${minutes} minutes" +%H:%M)
unit="omarchy-reminder-${minutes}m-$set_at"
reminder_dir="${XDG_RUNTIME_DIR:-/tmp}/omarchy-reminders"
message_file="$reminder_dir/$unit.message"
confirmation="You'll be reminded at $remind_at"
confirmation_title="Reminder set for ${minutes} minutes"
mkdir -p "$reminder_dir"
if [[ -n $custom_message ]]; then
printf "%s" "$custom_message" >"$message_file"
confirmation_title="$custom_message in ${minutes} minutes"
fi
systemd-run --user --quiet --collect --on-active="${minutes}m" --unit="$unit" \
bash -c 'omarchy-notification-send "󰔛" "Reminder" "$1" -u critical; rm -f "$2"' bash "$message" "$message_file"
omarchy-notification-send "󰔛" "$confirmation_title" "$confirmation" -u low
+6 -2
View File
@@ -2,5 +2,9 @@
# omarchy:summary=Restart the PipeWire audio service to fix audio issues or apply new configuration.
echo -e "Restarting pipewire audio service...\n"
systemctl --user restart pipewire.service
echo -e "Restarting PipeWire audio services...\n"
systemctl --user restart wireplumber.service pipewire.service
if systemctl --user --quiet is-active pipewire-pulse.service; then
systemctl --user restart pipewire-pulse.service
fi
+5 -1
View File
@@ -2,4 +2,8 @@
# omarchy:summary=Restart the SwayOSD server
omarchy-restart-app swayosd-server
if systemctl --user is-enabled --quiet swayosd-server.service; then
systemctl --user restart swayosd-server.service
else
omarchy-restart-app swayosd-server
fi
+15 -39
View File
@@ -13,7 +13,7 @@ usage() {
Usage:
omarchy transcode [--path path] [input] [format] [resolution]
With no input, fuzzy-pick a picture or video from ~/Pictures and ~/Videos,
With no input, pick a picture or video with Walker from ~/Pictures and ~/Videos,
or only from --path when provided. Then pick the output format and resolution.
Options:
@@ -29,30 +29,6 @@ Resolutions:
EOF
}
pick_file() {
local search_path="$1"
local paths=()
if [[ -n $search_path ]]; then
[[ -e $search_path ]] || { echo "Path not found: $search_path" >&2; return 1; }
paths=("$search_path")
else
paths=("$HOME/Pictures" "$HOME/Videos")
fi
find "${paths[@]}" -type f \
\( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.webp' -o -iname '*.gif' -o -iname '*.heic' -o -iname '*.avif' \
-o -iname '*.mp4' -o -iname '*.mov' -o -iname '*.m4v' -o -iname '*.mkv' -o -iname '*.webm' -o -iname '*.avi' \) \
-printf '%T@\t%p\n' 2>/dev/null | sort -rn | cut -f2- | fzf --layout=reverse-list --prompt="Transcode file> "
}
pick_option() {
local prompt="$1"
shift
gum choose --header "$prompt" "$@"
}
media_type() {
local mime
mime=$(file -b --mime-type "$1")
@@ -187,9 +163,10 @@ main() {
input="${positional[0]:-}"
format="${positional[1]:-}"
resolution="${positional[2]:-}"
search_path="${search_path:-$HOME/Pictures:$HOME/Videos}"
if [[ -z $input ]]; then
input=$(pick_file "$search_path")
input=$(omarchy-menu-file "Transcode picture or video" "$search_path" "jpg jpeg png webp gif heic avif mp4 mov m4v mkv webm avi")
fi
[[ -n $input ]] || return 1
@@ -199,33 +176,32 @@ main() {
if [[ -z $format ]]; then
if [[ $type == "picture" ]]; then
format=$(pick_option "Select format..." jpg png)
format=$(omarchy-menu-select "Select format" jpg png)
else
format=$(pick_option "Select format..." mp4 gif)
format=$(omarchy-menu-select "Select format" mp4 gif)
fi
fi
if [[ -z $resolution ]]; then
if [[ $type == "picture" ]]; then
resolution=$(pick_option "Select resolution..." high medium low)
resolution=$(omarchy-menu-select "Select resolution" high medium low)
else
resolution=$(pick_option "Select resolution..." 4k 1080p 720p)
resolution=$(omarchy-menu-select "Select resolution" 4k 1080p 720p)
fi
fi
output=$(output_path "$input" "$format" "$resolution")
if [[ $type == "picture" ]]; then
transcode_picture "$input" "$format" "$resolution" "$output"
else
if [[ $type == "video" ]]; then
omarchy-notification-send "" "Transcoding video…" "$(basename -- "$input") to $format ($resolution)"
transcode_video "$input" "$format" "$resolution" "$output"
echo ""
copy_to_clipboard "$output"
omarchy-notification-send "" "Transcoded to $resolution $format" "Saved and copied to clipboard."
else
transcode_picture "$input" "$format" "$resolution" "$output"
copy_to_clipboard "$output"
omarchy-notification-send "" "Transcoded to $resolution $format" "Saved and copied to clipboard."
fi
copy_to_clipboard "$output"
echo "Your $type has been transcoded into $format as $resolution. It's on your clipboard."
echo ""
echo "It's also in $output"
}
main "$@"
+2 -2
View File
@@ -2,7 +2,7 @@
# omarchy:summary=Returns a formatted weather status string with temperature and wind speed.
weather=$(curl -fsS --max-time 4 "https://wttr.in?format=%l|%t|%w" 2>/dev/null | tr -d '\n')
weather=$(curl -fsS --max-time 4 "https://wttr.in?m&format=%l|%t|%w" 2>/dev/null | tr -d '\n')
if [[ -z $weather ]]; then
echo "Weather unavailable"
@@ -23,4 +23,4 @@ format_temperature() {
temperature=$(format_temperature "$temperature")
wind=${wind//km\// km/}
echo "$(omarchy-weather-icon) $place · Temperature $temperature · Wind $wind"
echo "$(omarchy-weather-icon) $place · Temp $temperature · Wind $wind"
+1 -1
View File
@@ -11,7 +11,7 @@ listener {
on-timeout = pidof hyprlock || omarchy-launch-screensaver
}
# Lock system after 5 minutes
# Lock system after 5 minutes (screensaver resets idle timer, so have to just do half + 2s margin)
listener {
timeout = 152
on-timeout = omarchy-system-lock
@@ -0,0 +1,10 @@
#!/bin/bash
# Show the weather status notification after Omarchy has started.
# To put it into use, remove .sample from this file name.
weather=$(omarchy-weather-status 2>/dev/null) || true
if [[ -n $weather && $weather != "Weather unavailable" ]]; then
notify-send -u low "$weather"
fi
@@ -0,0 +1,13 @@
[Unit]
Description=SwayOSD server
PartOf=graphical-session.target
After=graphical-session.target
[Service]
Type=simple
ExecStart=/usr/bin/swayosd-server
Restart=always
RestartSec=2
[Install]
WantedBy=graphical-session.target
+7 -1
View File
@@ -5,7 +5,7 @@
"spacing": 0,
"height": 26,
"modules-left": ["custom/omarchy", "hyprland/workspaces"],
"modules-center": ["clock", "custom/weather", "custom/update", "custom/voxtype", "custom/screenrecording-indicator", "custom/idle-indicator", "custom/notification-silencing-indicator"],
"modules-center": ["clock", "custom/weather", "custom/update", "custom/ai-indicator", "custom/voxtype", "custom/screenrecording-indicator", "custom/idle-indicator", "custom/notification-silencing-indicator"],
"modules-right": [
"group/tray-expander",
"bluetooth",
@@ -144,6 +144,12 @@
"on-scroll-left": "",
"on-scroll-right": ""
},
"custom/ai-indicator": {
"exec": "$OMARCHY_PATH/default/waybar/indicators/ai.sh",
"signal": 11,
"interval": 1,
"return-type": "json"
},
"custom/screenrecording-indicator": {
"on-click": "omarchy-capture-screenrecording",
"exec": "$OMARCHY_PATH/default/waybar/indicators/screen-recording.sh",
+2
View File
@@ -82,6 +82,7 @@ tooltip {
opacity: 0;
}
#custom-ai-indicator,
#custom-screenrecording-indicator,
#custom-idle-indicator,
#custom-notification-silencing-indicator {
@@ -92,6 +93,7 @@ tooltip {
padding-bottom: 1px;
}
#custom-ai-indicator.active,
#custom-screenrecording-indicator.active {
color: #a55555;
}
+3 -1
View File
@@ -3,7 +3,6 @@ exec-once = uwsm-app -- mako
exec-once = ! omarchy-toggle-enabled waybar-off && uwsm-app -- waybar
exec-once = uwsm-app -- fcitx5 --disable notificationitem
exec-once = uwsm-app -- swaybg -i ~/.config/omarchy/current/background -m fill
exec-once = uwsm-app -- swayosd-server
exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
exec-once = omarchy-first-run
exec-once = omarchy-powerprofiles-init
@@ -12,3 +11,6 @@ exec-once = uwsm-app -- omarchy-hyprland-monitor-watch
# Slow app launch fix -- set systemd vars
exec-once = systemctl --user import-environment $(env | cut -d'=' -f 1)
exec-once = dbus-update-activation-environment --systemd --all
# Run post-boot hooks after startup config has loaded
exec-once = sleep 2 && omarchy-hook post-boot
+9 -1
View File
@@ -4,6 +4,7 @@ bindd = SUPER CTRL, E, Emoji picker, exec, omarchy-launch-walker -m symbols
bindd = SUPER CTRL, C, Capture menu, exec, omarchy-menu capture
bindd = SUPER CTRL, O, Toggle menu, exec, omarchy-menu toggle
bindd = SUPER CTRL, H, Hardware menu, exec, omarchy-menu hardware
bindd = SUPER CTRL, P, AI prompt, exec, omarchy-ai-prompt
bindd = SUPER ALT, SPACE, Omarchy menu, exec, omarchy-menu
bindd = SUPER SHIFT, code:201, Omarchy menu, exec, omarchy-menu
bindd = SUPER, ESCAPE, System menu, exec, omarchy-menu system
@@ -44,7 +45,12 @@ bindd = SUPER CTRL, PRINT, Extract text (OCR) from screenshot, exec, omarchy-cap
bindd = SUPER CTRL, S, Share, exec, omarchy-menu share
# Transcoding
bindd = SUPER CTRL, R, Transcode, exec, omarchy-menu transcode
bindd = SUPER CTRL, PERIOD, Transcode, exec, omarchy-transcode
# Reminders
bindd = SUPER CTRL, R, Set reminder, exec, omarchy-menu reminder-set
bindd = SUPER CTRL ALT, R, Show reminders, exec, omarchy-reminder show
bindd = SUPER SHIFT CTRL, R, Clear reminders, exec, omarchy-reminder clear
# Waybar-less information
bindd = SUPER CTRL ALT, T, Show time, exec, notify-send -u low " $(date +"%A %H:%M · %d %B %Y · Week %V")"
@@ -62,6 +68,8 @@ bindd = SUPER CTRL, X, Toggle dictation, exec, voxtype record toggle
bindd = , F9, Start dictation (push-to-talk), exec, voxtype record start
binddr = , F9, Stop dictation (push-to-talk), exec, voxtype record stop
bindd = , F8, Start AI prompt dictation (push-to-talk), exec, omarchy-ai-prompt-transcribe start
binddr = , F8, Stop AI prompt dictation (push-to-talk), exec, omarchy-ai-prompt-transcribe stop
# Zoom
bindd = SUPER CTRL, Z, Zoom in, exec, hyprctl keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor -j | jq '.float + 1')
+1
View File
@@ -1,4 +1,5 @@
anchor=top-right
group-by=app-name,summary,body
default-timeout=5000
width=420
outer-margin=20
+18 -3
View File
@@ -6,8 +6,8 @@ description: >
~/.config/alacritty/, ~/.config/foot/, ~/.config/kitty/, ~/.config/ghostty/, ~/.config/mako/,
or ~/.config/omarchy/. Triggers: Hyprland, window rules, animations, keybindings,
monitors, gaps, borders, blur, opacity, waybar, walker, terminal config, themes,
wallpaper, night light, idle, lock screen, screenshots, layer rules, workspace
settings, display config, and user-facing omarchy commands. Excludes Omarchy
wallpaper, night light, idle, lock screen, screenshots, reminders, layer rules,
workspace settings, display config, and user-facing omarchy commands. Excludes Omarchy
source development in ~/.local/share/omarchy/ and `omarchy dev` workflows.
---
@@ -30,7 +30,7 @@ It is not for contributing to Omarchy source code.
- Layer rules, workspace settings, display/monitor configuration
- Themes, wallpapers, fonts, appearance changes
- User-facing `omarchy` commands (`omarchy theme ...`, `omarchy refresh ...`, `omarchy restart ...`, etc.)
- Screenshots, screen recording, night light, idle behavior, lock screen
- Screenshots, screen recording, reminders, night light, idle behavior, lock screen
**If you're about to edit a config file in ~/.config/ on this system, STOP and use this skill first.**
@@ -118,6 +118,7 @@ Run `omarchy --help` for the full list. The most common groups:
| `omarchy install` | Install optional software / packages | `omarchy install docker dbs` |
| `omarchy launch` | Launch apps | `omarchy launch browser` |
| `omarchy capture` | Screenshots and recordings | `omarchy capture screenshot` |
| `omarchy reminder` | Desktop notification reminders | `omarchy reminder 15 "Pickup Jack"` |
| `omarchy pkg` | Package management | `omarchy pkg install <pkg>` |
| `omarchy setup` | Initial setup tasks | `omarchy setup fingerprint` |
| `omarchy update` | System updates | `omarchy update` |
@@ -358,6 +359,17 @@ When user requests system changes:
5. **Is it a package install?** Use `omarchy install package <pkgs...>` (or `omarchy pkg aur add <pkgs...>` for AUR-only packages)
6. **Unsure if command exists?** Run `omarchy commands` (or `omarchy <group> --help` for one group)
### Reminder Requests
When the user asks to set a reminder, use `omarchy reminder <minutes> [message]` directly. Convert natural language durations to minutes and title-case short reminder labels when appropriate.
```bash
omarchy reminder 15 "Pickup Jack"
omarchy reminder 60 "Check laundry"
omarchy reminder show
omarchy reminder clear
```
## Out of Scope
This skill intentionally does not cover Omarchy source development. Do not use this skill for:
@@ -372,6 +384,9 @@ This skill intentionally does not cover Omarchy source development. Do not use t
- "Configure my external monitor" -> Edit `~/.config/hypr/monitors.conf`
- "Make the window gaps smaller" -> Edit `~/.config/hypr/looknfeel.conf`
- "Set up night light to turn on at sunset" -> `omarchy toggle nightlight` or edit `~/.config/hypr/hyprsunset.conf`
- "Set a reminder to pickup jack in 15 minutes" -> `omarchy reminder 15 "Pickup Jack"`
- "Show my reminders" -> `omarchy reminder show`
- "Clear all reminders" -> `omarchy reminder clear`
- "Customize the catppuccin theme colors" -> Create `~/.config/omarchy/themes/catppuccin-custom/` by copying from stock, then edit
- "Run a script every time I change themes" -> Create `~/.config/omarchy/hooks/theme-set`
- "Reset waybar to defaults" -> `omarchy refresh waybar`
+19
View File
@@ -0,0 +1,19 @@
#!/bin/bash
state_file=${XDG_STATE_HOME:-$HOME/.local/state}/omarchy/indicators/ai
if [[ -e $state_file ]]; then
state=$(<"$state_file")
if [[ $state == "listening" ]]; then
echo '{"text":"󱚟","class":"active listening","tooltip":"AI is listening"}'
else
if (( $(date +%s) % 2 == 0 )); then
echo '{"text":"󱜙","class":"active thinking","tooltip":"AI is thinking"}'
else
echo '{"text":"󱚥","class":"active thinking","tooltip":"AI is thinking"}'
fi
fi
else
echo '{"text":"","class":"","tooltip":""}'
fi
@@ -0,0 +1,18 @@
## Auto-connect A2DP playback/capture profiles on Bluetooth devices.
## This helps speakers and receivers expose their audio profiles without
## requiring manual PipeWire/WirePlumber recovery.
monitor.bluez.rules = [
{
matches = [
{
device.name = "~bluez_card.*"
}
]
actions = {
update-props = {
bluez5.auto-connect = [ a2dp_sink a2dp_source ]
}
}
}
]
+4
View File
@@ -1,2 +1,6 @@
# Turn on bluetooth by default
chrootable_systemctl_enable bluetooth.service
mkdir -p ~/.config/wireplumber/wireplumber.conf.d/
cp $OMARCHY_PATH/default/wireplumber/wireplumber.conf.d/bluetooth-a2dp-autoconnect.conf \
~/.config/wireplumber/wireplumber.conf.d/
@@ -1,8 +1,8 @@
# This installs hardware video acceleration for Intel GPUs
if INTEL_GPU=$(lspci | grep -iE 'vga|3d|display' | grep -i 'intel'); then
# HD Graphics / Iris / Xe / Arc use intel-media-driver + VPL
if [[ ${INTEL_GPU,,} =~ (hd\ graphics|uhd\ graphics|xe|iris|arc) ]]; then
# HD Graphics / Iris / Xe / Arc / Non-Arc Panther Lake use intel-media-driver + VPL
if [[ ${INTEL_GPU,,} =~ (hd\ graphics|uhd\ graphics|xe|iris|arc|panther\ lake) ]]; then
omarchy-pkg-add intel-media-driver libvpl vpl-gpu-rt
elif [[ ${INTEL_GPU,,} =~ "gma" ]]; then
# Older generations from 2008 to ~2014-2017 use libva-intel-driver
+6 -3
View File
@@ -1,3 +1,6 @@
# Place in ~/.claude/skills since all tools populate from there as well as their own sources
mkdir -p ~/.claude/skills
ln -s $OMARCHY_PATH/default/omarchy-skill ~/.claude/skills/omarchy
# Place in each assistant's global skills directory so the Omarchy skill is available on first install
mkdir -p ~/.agents/skills ~/.claude/skills ~/.codex/skills ~/.pi/agent/skills
ln -sfn "$OMARCHY_PATH/default/omarchy-skill" ~/.agents/skills/omarchy
ln -sfn "$OMARCHY_PATH/default/omarchy-skill" ~/.claude/skills/omarchy
ln -sfn "$OMARCHY_PATH/default/omarchy-skill" ~/.codex/skills/omarchy
ln -sfn "$OMARCHY_PATH/default/omarchy-skill" ~/.pi/agent/skills/omarchy
+2
View File
@@ -0,0 +1,2 @@
systemctl --user daemon-reload
systemctl --user enable --now swayosd-server.service
+1 -1
View File
@@ -3,5 +3,5 @@ omarchy-npx-install @google/gemini-cli gemini
omarchy-npx-install @github/copilot copilot
omarchy-npx-install opencode-ai opencode
omarchy-npx-install playwright playwright-cli
omarchy-npx-install @mariozechner/pi-coding-agent pi
omarchy-npx-install @earendil-works/pi-coding-agent pi
omarchy-npx-install @kitlangton/ghui ghui
+14
View File
@@ -0,0 +1,14 @@
set -e
echo "Enable Bluetooth A2DP auto-connect in WirePlumber"
destination=~/.config/wireplumber/wireplumber.conf.d/bluetooth-a2dp-autoconnect.conf
mkdir -p ~/.config/wireplumber/wireplumber.conf.d/
if [[ ! -f "$destination" ]]; then
cp "$OMARCHY_PATH/default/wireplumber/wireplumber.conf.d/bluetooth-a2dp-autoconnect.conf" \
"$destination"
fi
omarchy-state set reboot-required
+7
View File
@@ -0,0 +1,7 @@
echo "Update Pi CLI wrapper package"
pi_bin="$HOME/.local/bin/pi"
if [[ -f $pi_bin ]] && grep -q '^package="@mariozechner/pi-coding-agent"$' "$pi_bin"; then
sed -i 's|^package="@mariozechner/pi-coding-agent"$|package="@earendil-works/pi-coding-agent"|' "$pi_bin"
fi
+1 -1
View File
@@ -1,3 +1,3 @@
echo "Add Transcode entry to Nautilus context menu"
source $OMARCHY_PATH/install/config/nautilus-python.sh
source "$OMARCHY_PATH/install/config/nautilus-python.sh"
+5
View File
@@ -0,0 +1,5 @@
echo "Install hardware video acceleration for Intel GPUs on non-X Panther Lake systems"
if lspci | grep -iE 'vga|3d|display' | grep -i 'intel' | grep -i 'panther lake' | grep -qi 'intel graphics'; then
bash "$OMARCHY_PATH/install/config/hardware/intel/video-acceleration.sh"
fi
+12
View File
@@ -0,0 +1,12 @@
echo "Run SwayOSD as a supervised session service"
mkdir -p ~/.config/systemd/user
cp "$OMARCHY_PATH/config/systemd/user/swayosd-server.service" ~/.config/systemd/user/swayosd-server.service
if [[ -f ~/.config/hypr/autostart.conf ]]; then
sed -i '/^exec-once = uwsm-app -- swayosd-server$/d' ~/.config/hypr/autostart.conf
fi
pkill -x swayosd-server || true
bash "$OMARCHY_PATH/install/first-run/swayosd.sh"
+7
View File
@@ -0,0 +1,7 @@
echo "Add sample post-boot hook"
mkdir -p ~/.config/omarchy/hooks/post-boot.d
if [[ ! -f ~/.config/omarchy/hooks/post-boot.d/weather.sample ]]; then
cp "$OMARCHY_PATH/config/omarchy/hooks/post-boot.d/weather.sample" ~/.config/omarchy/hooks/post-boot.d/weather.sample
fi
+3
View File
@@ -0,0 +1,3 @@
echo "Add Omarchy AI skill to pi, Codex, and shared Agent Skills directories"
source "$OMARCHY_PATH/install/config/omarchy-ai-skill.sh"
+15
View File
@@ -0,0 +1,15 @@
echo "Add AI prompt command bindings and Waybar indicator"
WAYBAR_CONFIG=~/.config/waybar/config.jsonc
if [[ -f $WAYBAR_CONFIG ]] && ! grep -q "custom/ai-indicator" "$WAYBAR_CONFIG"; then
sed -i 's/"custom\/update", "custom\/voxtype"/"custom\/update", "custom\/ai-indicator", "custom\/voxtype"/' "$WAYBAR_CONFIG"
sed -i '/ "custom\/screenrecording-indicator": {/i\ "custom/ai-indicator": {\n "exec": "$OMARCHY_PATH/default/waybar/indicators/ai.sh",\n "signal": 11,\n "interval": 1,\n "return-type": "json"\n },' "$WAYBAR_CONFIG"
fi
WAYBAR_STYLE=~/.config/waybar/style.css
if [[ -f $WAYBAR_STYLE ]] && ! grep -q "custom-ai-indicator" "$WAYBAR_STYLE"; then
sed -i 's/#custom-screenrecording-indicator,/#custom-ai-indicator,\n#custom-screenrecording-indicator,/' "$WAYBAR_STYLE"
sed -i 's/#custom-screenrecording-indicator.active {/#custom-ai-indicator.active,\n#custom-screenrecording-indicator.active {/' "$WAYBAR_STYLE"
fi
omarchy-refresh-waybar
Binary file not shown.
+493
View File
@@ -0,0 +1,493 @@
{
"audio": {
"sample_rate": 22050,
"quality": "medium"
},
"espeak": {
"voice": "en-us"
},
"inference": {
"noise_scale": 0.667,
"length_scale": 1,
"noise_w": 0.8
},
"phoneme_type": "espeak",
"phoneme_map": {},
"phoneme_id_map": {
"_": [
0
],
"^": [
1
],
"$": [
2
],
" ": [
3
],
"!": [
4
],
"'": [
5
],
"(": [
6
],
")": [
7
],
",": [
8
],
"-": [
9
],
".": [
10
],
":": [
11
],
";": [
12
],
"?": [
13
],
"a": [
14
],
"b": [
15
],
"c": [
16
],
"d": [
17
],
"e": [
18
],
"f": [
19
],
"h": [
20
],
"i": [
21
],
"j": [
22
],
"k": [
23
],
"l": [
24
],
"m": [
25
],
"n": [
26
],
"o": [
27
],
"p": [
28
],
"q": [
29
],
"r": [
30
],
"s": [
31
],
"t": [
32
],
"u": [
33
],
"v": [
34
],
"w": [
35
],
"x": [
36
],
"y": [
37
],
"z": [
38
],
"æ": [
39
],
"ç": [
40
],
"ð": [
41
],
"ø": [
42
],
"ħ": [
43
],
"ŋ": [
44
],
"œ": [
45
],
"ǀ": [
46
],
"ǁ": [
47
],
"ǂ": [
48
],
"ǃ": [
49
],
"ɐ": [
50
],
"ɑ": [
51
],
"ɒ": [
52
],
"ɓ": [
53
],
"ɔ": [
54
],
"ɕ": [
55
],
"ɖ": [
56
],
"ɗ": [
57
],
"ɘ": [
58
],
"ə": [
59
],
"ɚ": [
60
],
"ɛ": [
61
],
"ɜ": [
62
],
"ɞ": [
63
],
"ɟ": [
64
],
"ɠ": [
65
],
"ɡ": [
66
],
"ɢ": [
67
],
"ɣ": [
68
],
"ɤ": [
69
],
"ɥ": [
70
],
"ɦ": [
71
],
"ɧ": [
72
],
"ɨ": [
73
],
"ɪ": [
74
],
"ɫ": [
75
],
"ɬ": [
76
],
"ɭ": [
77
],
"ɮ": [
78
],
"ɯ": [
79
],
"ɰ": [
80
],
"ɱ": [
81
],
"ɲ": [
82
],
"ɳ": [
83
],
"ɴ": [
84
],
"ɵ": [
85
],
"ɶ": [
86
],
"ɸ": [
87
],
"ɹ": [
88
],
"ɺ": [
89
],
"ɻ": [
90
],
"ɽ": [
91
],
"ɾ": [
92
],
"ʀ": [
93
],
"ʁ": [
94
],
"ʂ": [
95
],
"ʃ": [
96
],
"ʄ": [
97
],
"ʈ": [
98
],
"ʉ": [
99
],
"ʊ": [
100
],
"ʋ": [
101
],
"ʌ": [
102
],
"ʍ": [
103
],
"ʎ": [
104
],
"ʏ": [
105
],
"ʐ": [
106
],
"ʑ": [
107
],
"ʒ": [
108
],
"ʔ": [
109
],
"ʕ": [
110
],
"ʘ": [
111
],
"ʙ": [
112
],
"ʛ": [
113
],
"ʜ": [
114
],
"ʝ": [
115
],
"ʟ": [
116
],
"ʡ": [
117
],
"ʢ": [
118
],
"ʲ": [
119
],
"ˈ": [
120
],
"ˌ": [
121
],
"ː": [
122
],
"ˑ": [
123
],
"˞": [
124
],
"β": [
125
],
"θ": [
126
],
"χ": [
127
],
"ᵻ": [
128
],
"ⱱ": [
129
],
"0": [
130
],
"1": [
131
],
"2": [
132
],
"3": [
133
],
"4": [
134
],
"5": [
135
],
"6": [
136
],
"7": [
137
],
"8": [
138
],
"9": [
139
],
"̧": [
140
],
"̃": [
141
],
"̪": [
142
],
"̯": [
143
],
"̩": [
144
],
"ʰ": [
145
],
"ˤ": [
146
],
"ε": [
147
],
"↓": [
148
],
"#": [
149
],
"\"": [
150
],
"↑": [
151
],
"̺": [
152
],
"̻": [
153
]
},
"num_symbols": 256,
"num_speakers": 1,
"speaker_id_map": {},
"piper_version": "1.0.0",
"language": {
"code": "en_US",
"family": "en",
"region": "US",
"name_native": "English",
"name_english": "English",
"country_english": "United States"
},
"dataset": "amy"
}