Compare commits

...

140 Commits

Author SHA1 Message Date
David Heinemeier Hansson
e8bcad0c23 Fix template generation for rgb colors 2026-01-03 18:18:19 -08:00
David Heinemeier Hansson
a6b9bee8b9 Just rely on the system theme for opencode and get ready for USRSIG2 being available to live reload 2026-01-03 18:04:12 -08:00
David Heinemeier Hansson
edc964e458 Fix quoting 2026-01-03 17:55:37 -08:00
David Heinemeier Hansson
7194176fe5 Install user backgrounds in the correct path 2026-01-03 17:53:21 -08:00
David Heinemeier Hansson
2829279884 Migrate existing user backgrounds to the new proper location 2026-01-03 17:48:20 -08:00
David Heinemeier Hansson
63a4710a88 Look for backgrounds matching the new theme.name
We no longer have symlinks
2026-01-03 17:47:48 -08:00
David Heinemeier Hansson
b86fb24403 Need yq to parse colors.toml 2026-01-03 16:51:41 -08:00
David Heinemeier Hansson
615e13bbba Merge branch 'dev' into colors-gemini 2026-01-03 16:50:53 -08:00
David Heinemeier Hansson
de2757466b Add opencode (#4071) 2026-01-03 16:50:10 -08:00
David Heinemeier Hansson
6dfa5f0807 This would trigger before screensaver/hyprlock
So need a different way to deal with resetting of the idle timer
2026-01-03 16:21:22 -08:00
David Heinemeier Hansson
4e802d8058 No longer used either 2026-01-03 14:18:07 -08:00
David Heinemeier Hansson
5e75c2d3a9 Never did use pinning
Better served with our stable setup
2026-01-03 14:16:22 -08:00
David Heinemeier Hansson
2c8f71c179 Need yq for toml 2026-01-03 14:14:38 -08:00
David Heinemeier Hansson
f4f356659f Merge branch 'dev' into colors-gemini 2026-01-03 14:08:09 -08:00
David Heinemeier Hansson
d20ad9032f Label hyprwhspr as Dictation and launch setup post install 2026-01-03 14:02:38 -08:00
David Heinemeier Hansson
9e2ff7be1d Allow menu extensions to be set by the user
Closes #4012
Co-authored-by: @DarrenVictoriano
2026-01-03 13:57:26 -08:00
Ryan Hughes
e1b3a88126 Add hyprwhspr to AI install menu 2026-01-03 16:34:53 -05:00
Ryan Hughes
16a9bc295c Add --no-sudo and --print to debug 2026-01-03 16:34:53 -05:00
David Heinemeier Hansson
fdee76e2d2 Fix windowrule sizing changes 2026-01-03 13:31:50 -08:00
Justin Mißmahl
941e1c2dd8 omarchy remove dev (#4065)
Co-authored-by: JustinMissmahl <github@emeruslabs.com~>
2026-01-03 13:23:43 -08:00
David Heinemeier Hansson
c723411049 Comply with changed layerrule syntax in Hyprland 0.53 2026-01-03 13:10:43 -08:00
Ryan Hughes
c82b1bfb7e Add --print option to output keybindings to terminal 2026-01-03 13:34:30 -05:00
David Heinemeier Hansson
36095c1ac8 Fix with variable 2026-01-02 21:20:52 -08:00
David Heinemeier Hansson
57bbe425df Unused variable 2026-01-02 21:20:44 -08:00
Vaibhav Verma
d90bc6d3f3 Add theming support for VSCodium (#2519) 2026-01-02 21:09:17 -08:00
Omar Skalli
dbc3c006dd Make sure to re-install chromium google accounts when refreshing config (#1737) 2026-01-02 20:58:42 -08:00
David Heinemeier Hansson
807c74d405 The idle counter is reset between each listener
Re: #641
Co-authored-by: @marcinczenko
2026-01-02 20:31:16 -08:00
David Heinemeier Hansson
a9cea21463 Add missing up/down for moving workspaces to other monitors
Closes #844
Co-authored-by: @erdostom
2026-01-02 20:14:17 -08:00
David Heinemeier Hansson
fee7746362 Look for user background images in dedicated directory 2026-01-02 21:12:12 -07:00
Jeff Nunn
c832b7dc75 Skip "press any key" message when user cancels TUI or Web App install (#3866)
with Ctrl+C
2026-01-02 20:03:54 -08:00
David Heinemeier Hansson
b08b419bfc Use encapsulated reboot command 2026-01-02 19:49:52 -08:00
David Heinemeier Hansson
5d712d3ff1 Get current theme name from the new theme.name file 2026-01-01 16:43:02 -07:00
David Heinemeier Hansson
32dbe60a02 No longer need omarchy-theme-next since themes are now fully rendered, not symlinks 2026-01-01 16:26:47 -07:00
David Heinemeier Hansson
9ecf5a089b Cleanup 2026-01-01 16:23:48 -07:00
David Heinemeier Hansson
4ead763559 Explicitly store the name of the current theme 2026-01-01 16:22:17 -07:00
David Heinemeier Hansson
a308000390 Migrate to the new setup where default themes live inside omarchy 2026-01-01 16:13:44 -07:00
David Heinemeier Hansson
1b8da49425 Look for both user themes and default themes
Plus speed things up
2026-01-01 16:06:10 -07:00
David Heinemeier Hansson
934285b7c4 Fix paths 2026-01-01 16:03:15 -07:00
David Heinemeier Hansson
fdd3b6d787 Split user themes and default themes 2026-01-01 15:56:40 -07:00
David Heinemeier Hansson
0b04881a6f Move the templates together with the others in default 2026-01-01 15:35:02 -07:00
David Heinemeier Hansson
222386639b Fix colors for readability 2026-01-01 14:15:32 -07:00
David Heinemeier Hansson
a7d925de51 Set opencode colors too 2026-01-01 14:12:58 -07:00
David Heinemeier Hansson
8460be15c2 Correct the blue 2026-01-01 13:45:01 -07:00
David Heinemeier Hansson
a57e2b48e7 No longe have $THEMES_DIR 2026-01-01 13:05:10 -07:00
David Heinemeier Hansson
b07c54fff1 Consistent const naming 2026-01-01 12:58:19 -07:00
David Heinemeier Hansson
277495b875 Remove redundant const 2026-01-01 12:56:58 -07:00
David Heinemeier Hansson
d448664726 Explain why 2026-01-01 12:55:23 -07:00
David Heinemeier Hansson
14e140285f No longer used by walker to cancel 2026-01-01 12:55:16 -07:00
David Heinemeier Hansson
b95a4a44df Make an atomic swap of the theme directories 2026-01-01 12:52:04 -07:00
David Heinemeier Hansson
79b31144d0 Bring back explicit btop themes
They're too involved to derive from a basic color set
2026-01-01 12:41:23 -07:00
David Heinemeier Hansson
cf5f4423e1 Fix colors for regular hex format 2026-01-01 12:35:23 -07:00
David Heinemeier Hansson
01135724d4 Provide stripped values too 2026-01-01 12:33:45 -07:00
David Heinemeier Hansson
ff9474e0eb Fix missing colors 2026-01-01 12:33:36 -07:00
David Heinemeier Hansson
b14297ea21 Better presentation 2026-01-01 12:15:51 -07:00
David Heinemeier Hansson
3db3705370 Merge branch 'dev' into colors-gemini 2026-01-01 12:12:45 -07:00
David Heinemeier Hansson
bd6992c58c Variables are lowercase 2026-01-01 12:09:17 -07:00
David Heinemeier Hansson
3dc59e5404 Fix vars 2026-01-01 12:08:40 -07:00
David Heinemeier Hansson
3ecdcb262b Pull out the dynamic template rendering again, but simpler 2026-01-01 12:06:31 -07:00
David Heinemeier Hansson
8ea021744d Combine render into -set 2026-01-01 11:55:03 -07:00
David Heinemeier Hansson
6952e80710 Slim down 2026-01-01 11:49:08 -07:00
Pierre Olivier Martel
2643967424 Use omarchy-launch-audio stub in waybar and menu (#4043)
* Use omarchy-launch-audio in waybar

* Use omarchy-launch-audio in omarchy-menu
2025-12-31 18:13:12 -07:00
David Heinemeier Hansson
8abeac68dc Cleanup 2025-12-31 18:04:39 -07:00
Derek Wierson
64f254653f Fix windowrule syntax change for kanagawa theme (#4032) 2025-12-31 17:12:09 -07:00
Lázaro Nixon
687ac4567e Add github-copilot-cli to the AI install menu (#4041)
* Add github-copilot-cli to the AI install menu

* Mark the copilot package as coming from AUR

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2025-12-31 17:06:22 -07:00
Pierre Olivier Martel
72cecc600d Move btop binding to Control Panels utilities (#4042)
Co-authored-by: David Heinemeier Hansson <david@hey.com>
2025-12-31 17:03:23 -07:00
David Heinemeier Hansson
1cd2f5b979 Attempt to templaterize the theme specific files 2025-12-31 17:00:30 -07:00
Marco Troisi
7fbc139cb5 Google Maps as a default webapp (#4028)
* Google Maps as a default webapp

* Using icon from DashboardIcons
2025-12-30 16:27:01 -08:00
me
7c213db46d add fresh to omarchy-launch-editor (#4015)
fixes #4014
2025-12-30 16:22:41 -08:00
LunarLollipop
5dd4bec68a Fix Hyprland 0.53 windowrule syntax breaking changes (#4025)
* Fix Hyprland 0.53 windowrule syntax breaking changes

Hyprland 0.53 introduced breaking changes to windowrule syntax:

- Props now use `match:` prefix: `class:pattern` → `match:class pattern`
- Boolean effects require `on` suffix: `float` → `float on`
- Snake_case naming: `nofocus` → `no_focus`, `stayfocused` → `stay_focused`
- `noborder` replaced with `border_size 0`
- `noanim` replaced with `animation none`
- layerrule syntax: `noanim, X` → `animation none, match:namespace X`
- `misc:new_window_takes_over_fullscreen` → `misc:on_focus_under_fullscreen`

See: https://github.com/hyprwm/hyprland-wiki/pull/1278

* Correct for the new style

* Migrate the scrolltouchpad setting in userland too

* Need a reboot to pair with new Hyprland

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2025-12-30 16:21:59 -08:00
David Heinemeier Hansson
4311a00ca4 Just install latest node 2025-12-30 15:40:02 -08:00
Ryan Hughes
cd224e7ecd Merge pull request #3956 from ashddev/fix/nvidia-legacy-driver-for-older-gpus
fix(nvidia): install legacy NVIDIA driver on older GPUs
2025-12-28 13:42:13 -05:00
Ryan Hughes
7e12473f80 Don't continue if we don't have a GPU 2025-12-28 13:27:52 -05:00
Ryan Hughes
2c7480135a Add migration 2025-12-28 13:27:33 -05:00
Ryan Hughes
df0a019c6a Add migration 2025-12-28 12:34:13 -05:00
Jack Blakely
083715c8c6 Fix omarchy-update failing outside Hyprland session (#4002) 2025-12-28 08:46:44 -08:00
Ryan Hughes
d0aabc162a Add packages to others 2025-12-27 22:20:44 -05:00
Ryan Hughes
e416988d4e Rearrange and don't hard-fail 2025-12-27 22:20:38 -05:00
Ryan Hughes
314abce4e8 We know what we're doing 2025-12-27 21:47:17 -05:00
Ryan Hughes
fe8927b351 Simplify further 2025-12-27 21:46:43 -05:00
Ryan Hughes
13390441a9 Don't need to run this 2025-12-27 21:42:35 -05:00
Ryan Hughes
65a238d805 Simplify 2025-12-27 21:42:26 -05:00
Ryan Hughes
c535b19235 These already get installed or are dependencies 2025-12-27 21:06:04 -05:00
Ryan Hughes
9c8c789453 Simplify this check 2025-12-27 21:05:45 -05:00
Jan L. Große
2bc88ebf25 Update PostgresSQL version in installation script from 17 to 18 (#3990)
Bumping PostgresSQL DB from 17 to 18.
2025-12-26 21:11:03 +01:00
David Heinemeier Hansson
2573da8f5e Make impressionism the default 2025-12-24 22:40:19 +01:00
David Heinemeier Hansson
e44e937284 Ensure that noidle is turned off after update is complete
Closees #3982
Co-authored-by: @sgruendel
2025-12-24 19:25:18 +01:00
David Heinemeier Hansson
fd952c2323 Add The Backwater as a second Gruvbox background image 2025-12-24 18:27:49 +01:00
Ash Daly
4e09523127 fix(nvidia): do not install nvidia-580xx-dkms for GPUs older than Maxwell 2025-12-23 11:19:11 +00:00
Fredrik Mikal Wold
643cf35448 fix: stop paging git diff output when running omarchy-update (#3959)
* fix: stop paging git diff output when running omarchy-update

* Keep option list similar between the two

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2025-12-22 13:56:02 -08:00
Ash Daly
1fd1b65cd0 chore: add noconfirm to yay command 2025-12-21 16:13:53 +00:00
Ash Daly
9a704fdadb chore: edit comment 2025-12-21 16:12:06 +00:00
Ash Daly
a252a42772 fix(nvidia): install legacy driver on older GPUs 2025-12-21 16:11:05 +00:00
David Heinemeier Hansson
c59089e9f3 Use omarchy-launch-* stubs for all control panels 2025-12-18 16:24:55 -08:00
David Heinemeier Hansson
ca8f25fba1 Switch to our bluetooth launcher 2025-12-18 13:54:27 -08:00
David Heinemeier Hansson
dae89574dd Add Super + Ctrl + A/B for Audio and Bluetooth controls
Also, move waybar-less information notifications to Super + Ctrl + Alt +
T/B to make room. These are very specialized and probably not broadly
used.

Closes #3909
Co-authored-by: @ddVital
2025-12-18 09:19:38 -08:00
SantiagoH10
49a9ce14b8 fix: unquoted variable expansion was breaking omarchy-launch-about (#3933) 2025-12-18 09:08:13 -08:00
David Heinemeier Hansson
d2ea6ad183 Canceling the screensaver on mouse movement doesn't work with bluetooth mice
Could not get it to stop existing with a Logitech MX4 when connected via
bluetooth.
2025-12-17 15:04:10 -08:00
David Heinemeier Hansson
d5066561ca Got lost on a bad merge
Closes #3853
Co-authored-by: @nirabyte
2025-12-16 09:24:38 -08:00
Diogo Ferreira
fe9493bd86 openai-codex-bin -> openai-codex in menus (#3894)
This was done in a migration in 0588cc8e5b but the menu entry was never updated. So, installs after the migration will get the outdated version.

Added a new migration as well for those that installed after the
previous one.
2025-12-16 07:50:45 -08:00
David Heinemeier Hansson
f578880bc8 Guard against crash bug when scrolling over expand icon in tray
Closes #3892
2025-12-16 07:49:17 -08:00
David Heinemeier Hansson
7ce838565c Add missing dotnet-runtime-9.0 needed for Pinta
Closes #3859
2025-12-16 07:41:52 -08:00
Ryan Hughes
aacc40c954 Alert user if unable to restart 2025-12-15 19:58:59 -05:00
Ryan Hughes
f3b9ca2149 Prevent error if service doesn't exist 2025-12-15 18:47:13 -05:00
David Heinemeier Hansson
ee8f62d967 Only run update if limine-update is available
It won't be on grub
2025-12-15 14:48:44 -08:00
David Heinemeier Hansson
32592e2e28 Merge pull request #3852 from basecamp/dev
Omarchy 3.2.3
2025-12-15 14:09:38 -08:00
David Heinemeier Hansson
adf7fba2b3 Prepare for release 2025-12-15 10:20:44 -08:00
David Heinemeier Hansson
021d66f9b6 Channel changes should prompt a full update 2025-12-15 10:04:00 -08:00
David Heinemeier Hansson
1a34be257c Add backdoor to start alacritty
Will help folks who have trouble with ghostty to still get a terminal
going
2025-12-15 09:58:08 -08:00
David Heinemeier Hansson
1f4c50eddf Pull noidle setting out into its own step 2025-12-15 09:55:09 -08:00
Ryan Hughes
92af9f41f2 Reorder 2025-12-15 12:38:28 -05:00
Ryan Hughes
8ed20d0524 And create the folder 2025-12-15 12:35:47 -05:00
Ryan Hughes
2d00b2a02f Actually add the config in the migration 2025-12-15 12:35:05 -05:00
David Heinemeier Hansson
97396f5fb2 Fix excessive size for Fizzy 2025-12-15 08:28:28 -08:00
Wolfgang Woehl
46c85e49a3 Quit Walker before screensaver launch (#3873)
Screensaver launch is broken when Walker is open: It will fail to go fullscreen and exits right after input read's first iteration, due to the screensaver_in_focus() check. See https://github.com/basecamp/omarchy/issues/2992 for an example report.

This addition will silently quit an opened Walker menu before launching the screensaver terminal. It is mildly intrusive, alas, as a return from screensaver will not present the pre-screensaver state exactly.
2025-12-15 08:24:31 -08:00
David Heinemeier Hansson
8357dd3da2 Use the traffic light metaphor for channel setting 2025-12-14 12:40:12 -08:00
David Heinemeier Hansson
860624d3f4 Add channel setting menu 2025-12-14 12:34:20 -08:00
Ryan Hughes
a15d3740a9 Increase faillock to 10 2025-12-14 15:32:40 -05:00
Ryan Hughes
7b05dcfe0c Merge pull request #1894 from sgruendel/mkinitcpio_module_thunderbolt
Add thunderbolt module in omarchy hook.
2025-12-14 15:25:55 -05:00
Ryan Hughes
df8b69bf27 Add portal restart to pickup changes 2025-12-14 15:24:48 -05:00
David Heinemeier Hansson
f39c2a91a5 Run the migration after switching channel 2025-12-14 12:24:20 -08:00
Ryan Hughes
906baa8fee Rework migration 2025-12-14 15:19:35 -05:00
Ryan Hughes
457b954db5 Move module to a separate file 2025-12-14 15:19:25 -05:00
Ryan Hughes
9b78e3c571 Enable btrfs quota to allow space-aware algorithms to work
Co-authored-by: Raul Salinas <nacapulque@gmail.com>

Replaces #3858

Fixes #3850
Fixes #3055
2025-12-14 14:23:28 -05:00
Ryan Hughes
88e9c9db49 Tell the user what we're doing 2025-12-14 14:19:37 -05:00
Ryan Hughes
64a8d7bb04 Add new default limine location for archinstall
Co-authored-by: madhurdhama <madhurdhama@gmail.com>
2025-12-14 13:06:43 -05:00
Ryan Hughes
c11a1c7989 Merge pull request #3492 from SoAp9035/fix-limine-uki-path
fix the UKI directory checks in omarchy-refresh-limine
2025-12-14 12:51:46 -05:00
Ryan Hughes
c37ef6d78c Update limine logic to check all .conf locations
Co-authored-by: Tjalve Aarflot <tjalve.github@proton.me>
2025-12-14 12:47:21 -05:00
Ryan Hughes
4d5dab3e32 Add walker emergency mode entry 2025-12-14 11:33:43 -05:00
Ryan Hughes
133d54f600 Refresh daemon if we change it 2025-12-14 11:32:39 -05:00
Ryan Hughes
4194c649a1 Restarts handled via systemd now 2025-12-14 11:09:16 -05:00
Ryan Hughes
33eabb0c88 Change to non-git version 2025-12-13 20:29:31 -05:00
Ryan Hughes
573cbd8ec3 Prevent idle while updating 2025-12-13 19:12:25 -05:00
Ryan Hughes
fec0731c17 Merge pull request #3857 from basecamp/share-picker
Add better portal share picker
2025-12-13 00:50:27 -05:00
Stefan Gründel
0a9e7205c3 add bolt to omarchy base packages 2025-12-01 13:34:24 +01:00
Stefan Gründel
a810b8058b Merge branch 'dev' into mkinitcpio_module_thunderbolt 2025-12-01 13:29:23 +01:00
Ahmet Burhan Kayalı
930246aee5 Merge branch 'basecamp:master' into fix-limine-uki-path 2025-11-26 10:22:13 +03:00
SoAp9035
f9450e1fb7 Fix limine UKI cleanup path 2025-11-21 10:59:08 +03:00
Stefan Gründel
d6dc1c7b86 add bolt to omarchy base packages 2025-09-27 13:55:46 +02:00
Stefan Gruendel
e39269f9f0 add migration script 2025-09-23 20:52:17 +02:00
Stefan Gruendel
74f2900db1 Add thunderbolt module in omarchy hook. 2025-09-23 06:40:56 +02:00
257 changed files with 1368 additions and 3454 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 932 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -13,3 +13,5 @@ case "$channel" in
"dev") omarchy-branch-set "dev" && omarchy-refresh-pacman "edge" ;; "dev") omarchy-branch-set "dev" && omarchy-refresh-pacman "edge" ;;
*) echo "Unknown channel: $channel"; exit 1; ;; *) echo "Unknown channel: $channel"; exit 1; ;;
esac esac
omarchy-update -y

View File

@@ -13,8 +13,6 @@ exit_screensaver() {
# Exit the screensaver on signals and input from keyboard and mouse # Exit the screensaver on signals and input from keyboard and mouse
trap exit_screensaver SIGINT SIGTERM SIGHUP SIGQUIT trap exit_screensaver SIGINT SIGTERM SIGHUP SIGQUIT
printf '\e[?1000h\e[?1003h' # Enable mouse tracking (clicks: 1000, movement: 1003)
while read -rsn1 -t 0.1; do :; done # Flush any pending input
printf '\033]11;rgb:00/00/00\007' # Set background color to black printf '\033]11;rgb:00/00/00\007' # Set background color to black
@@ -29,7 +27,7 @@ while true; do
--no-eol --no-restore-cursor & --no-eol --no-restore-cursor &
while pgrep -t "${tty#/dev/}" -x tte >/dev/null; do while pgrep -t "${tty#/dev/}" -x tte >/dev/null; do
if read -rsn1 -t 1 || ! screensaver_in_focus; then if read -n1 -t 1 || ! screensaver_in_focus; then
exit_screensaver exit_screensaver
fi fi
done done

View File

@@ -1,7 +1,34 @@
#!/bin/bash #!/bin/bash
NO_SUDO=false
PRINT_ONLY=false
while [[ $# -gt 0 ]]; do
case "$1" in
--no-sudo)
NO_SUDO=true
shift
;;
--print)
PRINT_ONLY=true
shift
;;
*)
echo "Unknown option: $1"
echo "Usage: omarchy-debug [--no-sudo] [--print]"
exit 1
;;
esac
done
LOG_FILE="/tmp/omarchy-debug.log" LOG_FILE="/tmp/omarchy-debug.log"
if [ "$NO_SUDO" = true ]; then
DMESG_OUTPUT="(skipped - --no-sudo flag used)"
else
DMESG_OUTPUT="$(sudo dmesg)"
fi
cat > "$LOG_FILE" <<EOF cat > "$LOG_FILE" <<EOF
Date: $(date) Date: $(date)
Hostname: $(hostname) Hostname: $(hostname)
@@ -15,7 +42,7 @@ $(inxi -Farz)
========================================= =========================================
DMESG DMESG
========================================= =========================================
$(sudo dmesg) $DMESG_OUTPUT
========================================= =========================================
JOURNALCTL (CURRENT BOOT, ERRORS ONLY) JOURNALCTL (CURRENT BOOT, ERRORS ONLY)
@@ -28,6 +55,11 @@ INSTALLED PACKAGES
$({ expac -S '%n %v (%r)' $(pacman -Qqe) 2>/dev/null; comm -13 <(pacman -Sql | sort) <(pacman -Qqe | sort) | xargs -r expac -Q '%n %v (AUR)'; } | sort) $({ expac -S '%n %v (%r)' $(pacman -Qqe) 2>/dev/null; comm -13 <(pacman -Sql | sort) <(pacman -Qqe | sort) | xargs -r expac -Q '%n %v (AUR)'; } | sort)
EOF EOF
if [ "$PRINT_ONLY" = true ]; then
cat "$LOG_FILE"
exit 0
fi
OPTIONS=("View log" "Save in current directory") OPTIONS=("View log" "Save in current directory")
if ping -c 1 8.8.8.8 >/dev/null 2>&1; then if ping -c 1 8.8.8.8 >/dev/null 2>&1; then
OPTIONS=("Upload log" "${OPTIONS[@]}") OPTIONS=("Upload log" "${OPTIONS[@]}")

View File

@@ -41,7 +41,7 @@ install_php() {
install_node() { install_node() {
echo -e "Installing Node.js...\n" echo -e "Installing Node.js...\n"
mise use --global node@lts mise use --global node
} }
case "$1" in case "$1" in

View File

@@ -12,7 +12,7 @@ if [[ -n "$choices" ]]; then
for db in $choices; do for db in $choices; do
case $db in case $db in
MySQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:3306:3306" --name=mysql8 -e MYSQL_ROOT_PASSWORD= -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:8.4 ;; MySQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:3306:3306" --name=mysql8 -e MYSQL_ROOT_PASSWORD= -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:8.4 ;;
PostgreSQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:5432:5432" --name=postgres17 -e POSTGRES_HOST_AUTH_METHOD=trust postgres:17 ;; PostgreSQL) sudo docker run -d --restart unless-stopped -p "127.0.0.1:5432:5432" --name=postgres18 -e POSTGRES_HOST_AUTH_METHOD=trust postgres:18 ;;
MariaDB) sudo docker run -d --restart unless-stopped -p "127.0.0.1:3306:3306" --name=mariadb11 -e MARIADB_ROOT_PASSWORD= -e MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=true mariadb:11.8 ;; MariaDB) sudo docker run -d --restart unless-stopped -p "127.0.0.1:3306:3306" --name=mariadb11 -e MARIADB_ROOT_PASSWORD= -e MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=true mariadb:11.8 ;;
Redis) sudo docker run -d --restart unless-stopped -p "127.0.0.1:6379:6379" --name=redis redis:7 ;; Redis) sudo docker run -d --restart unless-stopped -p "127.0.0.1:6379:6379" --name=redis redis:7 ;;
MongoDB) sudo docker run -d --restart unless-stopped -p "127.0.0.1:27017:27017" --name mongodb -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=admin123 mongo:noble ;; MongoDB) sudo docker run -d --restart unless-stopped -p "127.0.0.1:27017:27017" --name mongodb -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=admin123 mongo:noble ;;

3
bin/omarchy-launch-audio Executable file
View File

@@ -0,0 +1,3 @@
#!/bin/bash
omarchy-launch-or-focus-tui wiremix

View File

@@ -3,7 +3,7 @@
omarchy-cmd-present "$EDITOR" || EDITOR=nvim omarchy-cmd-present "$EDITOR" || EDITOR=nvim
case "$EDITOR" in case "$EDITOR" in
nvim | vim | nano | micro | hx | helix) nvim | vim | nano | micro | hx | helix | fresh)
exec omarchy-launch-tui "$EDITOR" "$@" exec omarchy-launch-tui "$EDITOR" "$@"
;; ;;
*) *)

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/bin/bash
cmd="$*" cmd="$*"
exec setsid uwsm-app -- xdg-terminal-exec --app-id=org.omarchy.terminal --title=Omarchy -e bash -c "omarchy-show-logo; $cmd; omarchy-show-done" exec setsid uwsm-app -- xdg-terminal-exec --app-id=org.omarchy.terminal --title=Omarchy -e bash -c "omarchy-show-logo; $cmd; if [ \$? -ne 130 ]; then omarchy-show-done; fi"

3
bin/omarchy-launch-opencode Executable file
View File

@@ -0,0 +1,3 @@
#!/bin/bash
exec setsid uwsm-app -- xdg-terminal-exec --app-id=org.omarchy.opencode -e bash -c 'cd ~/Work; opencode'

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
APP_ID="org.omarchy.$(basename $1)" APP_ID="org.omarchy.$(basename "$1")"
LAUNCH_COMMAND="omarchy-launch-tui $@" LAUNCH_COMMAND="omarchy-launch-tui $@"
exec omarchy-launch-or-focus "$APP_ID" "$LAUNCH_COMMAND" exec omarchy-launch-or-focus "$APP_ID" "$LAUNCH_COMMAND"

View File

@@ -13,6 +13,9 @@ if [[ -f ~/.local/state/omarchy/toggles/screensaver-off ]] && [[ $1 != "force" ]
exit 1 exit 1
fi fi
# Silently quit Walker on overlay
walker -q
focused=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name') focused=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')
terminal=$(xdg-terminal-exec --print-id) terminal=$(xdg-terminal-exec --print-id)

View File

@@ -173,7 +173,7 @@ show_setup_menu() {
options="$options\n Defaults\n󰱔 DNS\n Security\n Config" options="$options\n Defaults\n󰱔 DNS\n Security\n Config"
case $(menu "Setup" "$options") in case $(menu "Setup" "$options") in
*Audio*) omarchy-launch-or-focus-tui wiremix ;; *Audio*) omarchy-launch-audio ;;
*Wifi*) omarchy-launch-wifi ;; *Wifi*) omarchy-launch-wifi ;;
*Bluetooth*) omarchy-launch-bluetooth ;; *Bluetooth*) omarchy-launch-bluetooth ;;
*Power*) show_setup_power_menu ;; *Power*) show_setup_power_menu ;;
@@ -276,15 +276,16 @@ show_install_ai_menu() {
echo ollama echo ollama
) )
case $(menu "Install" "󱚤 Claude Code\n󱚤 Cursor CLI\n󱚤 Gemini\n󱚤 OpenAI Codex\n󱚤 LM Studio\n󱚤 Ollama\n󱚤 Crush\n󱚤 opencode") in case $(menu "Install" " Dictation [AUR]\n󱚤 Claude Code\n󱚤 Copilot CLI [AUR]\n󱚤 Cursor CLI\n󱚤 Gemini\n󱚤 OpenAI Codex\n󱚤 LM Studio\n󱚤 Ollama\n󱚤 Crush") in
*Dictation*) present_terminal "echo 'Installing Hyprwhspr from AUR...'; yay -S --noconfirm hyprwhspr && hyprwhspr setup" ;;
*Claude*) install "Claude Code" "claude-code" ;; *Claude*) install "Claude Code" "claude-code" ;;
*Copilot*) aur_install "Copilot CLI" "github-copilot-cli" ;;
*Cursor*) install "Cursor CLI" "cursor-cli" ;; *Cursor*) install "Cursor CLI" "cursor-cli" ;;
*OpenAI*) install "OpenAI Codex" "openai-codex-bin" ;;
*Gemini*) install "Gemini" "gemini-cli" ;; *Gemini*) install "Gemini" "gemini-cli" ;;
*OpenAI*) install "OpenAI Codex" "openai-codex" ;;
*Studio*) install "LM Studio" "lmstudio" ;; *Studio*) install "LM Studio" "lmstudio" ;;
*Ollama*) install "Ollama" $ollama_pkg ;; *Ollama*) install "Ollama" $ollama_pkg ;;
*Crush*) install "Crush" "crush-bin" ;; *Crush*) install "Crush" "crush-bin" ;;
*opencode*) install "opencode" "opencode" ;;
*) show_install_menu ;; *) show_install_menu ;;
esac esac
} }
@@ -302,7 +303,7 @@ show_install_gaming_menu() {
show_install_style_menu() { show_install_style_menu() {
case $(menu "Install" "󰸌 Theme\n Background\n Font") in case $(menu "Install" "󰸌 Theme\n Background\n Font") in
*Theme*) present_terminal omarchy-theme-install ;; *Theme*) present_terminal omarchy-theme-install ;;
*Background*) nautilus ~/.config/omarchy/current/theme/backgrounds ;; *Background*) omarchy-theme-bg-install ;;
*Font*) show_install_font_menu ;; *Font*) show_install_font_menu ;;
*) show_install_menu ;; *) show_install_menu ;;
esac esac
@@ -365,10 +366,11 @@ show_install_elixir_menu() {
} }
show_remove_menu() { show_remove_menu() {
case $(menu "Remove" "󰣇 Package\n Web App\n TUI\n󰸌 Theme\n󰍲 Windows\n󰈷 Fingerprint\n Fido2") in case $(menu "Remove" "󰣇 Package\n Web App\n TUI\n󰵮 Development\n󰸌 Theme\n󰍲 Windows\n󰈷 Fingerprint\n Fido2") in
*Package*) terminal omarchy-pkg-remove ;; *Package*) terminal omarchy-pkg-remove ;;
*Web*) present_terminal omarchy-webapp-remove ;; *Web*) present_terminal omarchy-webapp-remove ;;
*TUI*) present_terminal omarchy-tui-remove ;; *TUI*) present_terminal omarchy-tui-remove ;;
*Development*) show_remove_development_menu ;;
*Theme*) present_terminal omarchy-theme-remove ;; *Theme*) present_terminal omarchy-theme-remove ;;
*Windows*) present_terminal "omarchy-windows-vm remove" ;; *Windows*) present_terminal "omarchy-windows-vm remove" ;;
*Fingerprint*) present_terminal "omarchy-setup-fingerprint --remove" ;; *Fingerprint*) present_terminal "omarchy-setup-fingerprint --remove" ;;
@@ -377,9 +379,54 @@ show_remove_menu() {
esac esac
} }
show_remove_development_menu() {
case $(menu "Remove" "󰫏 Ruby on Rails\n JavaScript\n Go\n PHP\n Python\n Elixir\n Zig\n Rust\n Java\n .NET\n OCaml\n Clojure") in
*Rails*) present_terminal "omarchy-remove-dev-env ruby" ;;
*JavaScript*) show_remove_javascript_menu ;;
*Go*) present_terminal "omarchy-remove-dev-env go" ;;
*PHP*) show_remove_php_menu ;;
*Python*) present_terminal "omarchy-remove-dev-env python" ;;
*Elixir*) show_remove_elixir_menu ;;
*Zig*) present_terminal "omarchy-remove-dev-env zig" ;;
*Rust*) present_terminal "omarchy-remove-dev-env rust" ;;
*Java*) present_terminal "omarchy-remove-dev-env java" ;;
*NET*) present_terminal "omarchy-remove-dev-env dotnet" ;;
*OCaml*) present_terminal "omarchy-remove-dev-env ocaml" ;;
*Clojure*) present_terminal "omarchy-remove-dev-env clojure" ;;
*) show_remove_menu ;;
esac
}
show_remove_javascript_menu() {
case $(menu "Remove" " Node.js\n Bun\n Deno") in
*Node*) present_terminal "omarchy-remove-dev-env node" ;;
*Bun*) present_terminal "omarchy-remove-dev-env bun" ;;
*Deno*) present_terminal "omarchy-remove-dev-env deno" ;;
*) show_remove_development_menu ;;
esac
}
show_remove_php_menu() {
case $(menu "Remove" " PHP\n Laravel\n Symfony") in
*PHP*) present_terminal "omarchy-remove-dev-env php" ;;
*Laravel*) present_terminal "omarchy-remove-dev-env laravel" ;;
*Symfony*) present_terminal "omarchy-remove-dev-env symfony" ;;
*) show_remove_development_menu ;;
esac
}
show_remove_elixir_menu() {
case $(menu "Remove" " Elixir\n Phoenix") in
*Elixir*) present_terminal "omarchy-remove-dev-env elixir" ;;
*Phoenix*) present_terminal "omarchy-remove-dev-env phoenix" ;;
*) show_remove_development_menu ;;
esac
}
show_update_menu() { show_update_menu() {
case $(menu "Update" " Omarchy\n Config\n󰸌 Extra Themes\n Process\n󰇅 Hardware\n Firmware\n Password\n Timezone\n Time") in case $(menu "Update" " Omarchy\n󰔫 Channel\n Config\n󰸌 Extra Themes\n Process\n󰇅 Hardware\n Firmware\n Password\n Timezone\n Time") in
*Omarchy*) present_terminal omarchy-update ;; *Omarchy*) present_terminal omarchy-update ;;
*Channel*) show_update_channel_menu ;;
*Config*) show_update_config_menu ;; *Config*) show_update_config_menu ;;
*Themes*) present_terminal omarchy-theme-update ;; *Themes*) present_terminal omarchy-theme-update ;;
*Process*) show_update_process_menu ;; *Process*) show_update_process_menu ;;
@@ -392,6 +439,14 @@ show_update_menu() {
esac esac
} }
show_update_channel_menu() {
case $(menu "Update channel" "🟢 Stable\n🟡 Edge\n🔴 Dev") in
*Stable*) present_terminal "omarchy-channel-set stable" ;;
*Edge*) present_terminal "omarchy-channel-set edge" ;;
*Dev*) present_terminal "omarchy-channel-set dev" ;;
*) show_update_menu ;;
esac
}
show_update_process_menu() { show_update_process_menu() {
case $(menu "Restart" " Hypridle\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar") in case $(menu "Restart" " Hypridle\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar") in
*Hypridle*) omarchy-restart-hypridle ;; *Hypridle*) omarchy-restart-hypridle ;;
@@ -468,6 +523,10 @@ go_to_menu() {
esac esac
} }
# Allow user extensions and overrides
USER_EXTENSIONS="$HOME/.config/omarchy/extensions/menu.sh"
[[ -f $USER_EXTENSIONS ]] && source "$USER_EXTENSIONS"
if [[ -n "$1" ]]; then if [[ -n "$1" ]]; then
BACK_TO_EXIT=true BACK_TO_EXIT=true
go_to_menu "$1" go_to_menu "$1"

View File

@@ -212,18 +212,26 @@ prioritize_entries() {
cut -f2- cut -f2-
} }
monitor_height=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .height') output_keybindings() {
menu_height=$((monitor_height * 40 / 100)) build_keymap_cache
build_keymap_cache {
dynamic_bindings
static_bindings
} |
sort -u |
parse_keycodes |
parse_bindings |
prioritize_entries
}
{ if [[ "$1" == "--print" || "$1" == "-p" ]]; then
dynamic_bindings output_keybindings
static_bindings else
} | monitor_height=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .height')
sort -u | menu_height=$((monitor_height * 40 / 100))
parse_keycodes |
parse_bindings | output_keybindings |
prioritize_entries | walker --dmenu -p 'Keybindings' --width 800 --height "$menu_height"
walker --dmenu -p 'Keybindings' --width 800 --height "$menu_height" fi

View File

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

19
bin/omarchy-refresh-chromium Executable file
View File

@@ -0,0 +1,19 @@
#!/bin/bash
CONFIG_FILE="$HOME/.config/chromium-flags.conf"
INSTALL_GOOGLE_ACCOUNTS=false
# Check if google accounts were installed
if [[ -f "$CONFIG_FILE" ]] && \
grep -q -- "--oauth2-client-id" "$CONFIG_FILE" && \
grep -q -- "--oauth2-client-secret" "$CONFIG_FILE"; then
INSTALL_GOOGLE_ACCOUNTS=true
fi
# Refresh the Chromium configuration
omarchy-refresh-config chromium-flags.conf
# Re-install Google accounts if previously configured
if [[ "$INSTALL_GOOGLE_ACCOUNTS" == true ]]; then
omarchy-install-chromium-google-account
fi

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
if [[ -f /boot/EFI/linux/omarchy_linux.efi ]] && [[ -f /boot/EFI/linux/$(cat /etc/machine-id)_linux.efi ]]; then if [[ -f /boot/EFI/Linux/omarchy_linux.efi ]] && [[ -f /boot/EFI/Linux/$(cat /etc/machine-id)_linux.efi ]]; then
echo "Cleanup extra UKI" echo "Cleanup extra UKI"
sudo rm -f /boot/EFI/Linux/$(cat /etc/machine-id)_linux.efi sudo rm -f /boot/EFI/Linux/$(cat /etc/machine-id)_linux.efi
fi fi

View File

@@ -20,6 +20,3 @@ echo
# Reset all package DBs and then update # Reset all package DBs and then update
sudo pacman -Syyu --noconfirm sudo pacman -Syyu --noconfirm
# Offer a reboot if a new kernel was installed
omarchy-update-restart

View File

@@ -3,6 +3,7 @@
# Ensure walker is set to autostart # Ensure walker is set to autostart
mkdir -p ~/.config/autostart/ mkdir -p ~/.config/autostart/
cp $OMARCHY_PATH/autostart/walker.desktop ~/.config/autostart/ cp $OMARCHY_PATH/autostart/walker.desktop ~/.config/autostart/
systemctl --user daemon-reload
omarchy-refresh-config walker/config.toml omarchy-refresh-config walker/config.toml
omarchy-refresh-config elephant/calc.toml omarchy-refresh-config elephant/calc.toml

102
bin/omarchy-remove-dev-env Executable file
View File

@@ -0,0 +1,102 @@
#!/bin/bash
if [[ -z "$1" ]]; then
echo "Usage: omarchy-remove-dev-env <ruby|node|bun|deno|go|php|laravel|symfony|python|elixir|phoenix|zig|rust|java|dotnet|ocaml|clojure>" >&2
exit 1
fi
remove_php() {
sudo pacman -Rns --noconfirm php composer php-sqlite xdebug 2>/dev/null || true
}
case "$1" in
ruby)
echo -e "Removing Ruby...\n"
mise uninstall ruby --all
mise rm -g ruby
rm -f ~/.gemrc
;;
node)
echo -e "Removing Node.js...\n"
mise uninstall node --all
mise rm -g node
;;
bun)
echo -e "Removing Bun...\n"
mise uninstall bun --all
mise rm -g bun
;;
deno)
echo -e "Removing Deno...\n"
mise uninstall deno --all
mise rm -g deno
;;
go)
echo -e "Removing Go...\n"
mise uninstall go --all
mise rm -g go
;;
php)
echo -e "Removing PHP...\n"
remove_php
;;
laravel)
echo -e "Removing Laravel...\n"
composer global remove laravel/installer 2>/dev/null || true
;;
symfony)
echo -e "Removing Symfony CLI...\n"
sudo pacman -Rns --noconfirm symfony-cli 2>/dev/null || true
;;
python)
echo -e "Removing Python...\n"
mise uninstall python --all
mise rm -g python
rm -rf ~/.local/bin/uv ~/.local/bin/uvx ~/.cargo/bin/uv 2>/dev/null || true
;;
elixir|phoenix)
echo -e "Removing Elixir/Erlang...\n"
mise uninstall elixir --all
mise uninstall erlang --all
mise rm -g elixir
mise rm -g erlang
;;
zig)
echo -e "Removing Zig...\n"
mise uninstall zig --all
mise uninstall zls --all
mise rm -g zig
mise rm -g zls
;;
rust)
echo -e "Removing Rust...\n"
rustup self uninstall -y 2>/dev/null || true
;;
java)
echo -e "Removing Java...\n"
mise uninstall java --all
mise rm -g java
;;
dotnet)
echo -e "Removing .NET...\n"
mise uninstall dotnet --all
mise rm -g dotnet
;;
ocaml)
echo -e "Removing OCaml...\n"
opam switch remove default -y 2>/dev/null || true
rm -rf ~/.opam 2>/dev/null || true
sudo rm -f /usr/local/bin/opam 2>/dev/null || true
;;
clojure)
echo -e "Removing Clojure...\n"
mise uninstall clojure --all
mise rm -g clojure
;;
*)
echo "Unknown environment: $1"
exit 1
;;
esac
echo -e "\nDone!"

View File

@@ -1,22 +1,22 @@
#!/bin/bash #!/bin/bash
pkill elephant restart_services() {
pkill walker if systemctl --user is-enabled elephant.service &>/dev/null; then
systemctl --user restart elephant.service
fi
if systemctl --user is-enabled app-walker@autostart.service &>/dev/null; then
systemctl --user restart app-walker@autostart.service
else
echo -e "\e[31mUnable to restart Walker -- RESTART MANUALLY\e[0m"
fi
}
# Detect if we're running as root (from pacman hook)
if [[ $EUID -eq 0 ]]; then if [[ $EUID -eq 0 ]]; then
# Get the owner of this script to determine which user to run as
SCRIPT_OWNER=$(stat -c '%U' "$0") SCRIPT_OWNER=$(stat -c '%U' "$0")
USER_UID=$(id -u "$SCRIPT_OWNER") USER_UID=$(id -u "$SCRIPT_OWNER")
# Restart services as the script owner
systemd-run --uid="$SCRIPT_OWNER" --setenv=XDG_RUNTIME_DIR="/run/user/$USER_UID" \ systemd-run --uid="$SCRIPT_OWNER" --setenv=XDG_RUNTIME_DIR="/run/user/$USER_UID" \
bash -c " bash -c "$(declare -f restart_services); restart_services"
systemctl --user restart elephant.service
setsid walker --gapplication-service &
"
else else
elephant service enable 2>/dev/null restart_services
systemctl --user restart elephant.service
setsid walker --gapplication-service &
fi fi

7
bin/omarchy-theme-bg-install Executable file
View File

@@ -0,0 +1,7 @@
#!/bin/bash
CURRENT_THEME_NAME=$(cat "$HOME/.config/omarchy/current/theme.name")
THEME_USER_BACKGROUNDS="$HOME/.config/omarchy/backgrounds/$CURRENT_THEME_NAME"
mkdir -p "$THEME_USER_BACKGROUNDS"
nautilus "$THEME_USER_BACKGROUNDS"

View File

@@ -2,10 +2,12 @@
# Cycles through the background images available # Cycles through the background images available
BACKGROUNDS_DIR="$HOME/.config/omarchy/current/theme/backgrounds/" THEME_NAME=$(cat "$HOME/.config/omarchy/current/theme.name" 2>/dev/null)
THEME_BACKGROUNDS_PATH="$HOME/.config/omarchy/current/theme/backgrounds/"
USER_BACKGROUNDS_PATH="$HOME/.config/omarchy/backgrounds/$THEME_NAME/"
CURRENT_BACKGROUND_LINK="$HOME/.config/omarchy/current/background" CURRENT_BACKGROUND_LINK="$HOME/.config/omarchy/current/background"
mapfile -d '' -t BACKGROUNDS < <(find -L "$BACKGROUNDS_DIR" -type f -print0 | sort -z) mapfile -d '' -t BACKGROUNDS < <(find -L "$USER_BACKGROUNDS_PATH" "$THEME_BACKGROUNDS_PATH" -maxdepth 1 -type f -print0 2>/dev/null | sort -z)
TOTAL=${#BACKGROUNDS[@]} TOTAL=${#BACKGROUNDS[@]}
if [[ $TOTAL -eq 0 ]]; then if [[ $TOTAL -eq 0 ]]; then

View File

@@ -1,3 +1,9 @@
#!/bin/bash #!/bin/bash
basename "$(realpath "$HOME/.config/omarchy/current/theme")" | sed -E 's/(^|-)([a-z])/\1\u\2/g; s/-/ /g' THEME_NAME_PATH="$HOME/.config/omarchy/current/theme.name"
if [[ -f $THEME_NAME_PATH ]]; then
cat $THEME_NAME_PATH | sed -E 's/(^|-)([a-z])/\1\u\2/g; s/-/ /g'
else
echo "Unknown"
fi

View File

@@ -1,5 +1,8 @@
#!/bin/bash #!/bin/bash
find ~/.config/omarchy/themes/ -mindepth 1 -maxdepth 1 \( -type d -o -type l \) | sort | while read -r path; do {
echo "$(basename "$path" | sed -E 's/(^|-)([a-z])/\1\u\2/g; s/-/ /g')" find ~/.config/omarchy/themes/ -mindepth 1 -maxdepth 1 \( -type d -o -type l \) -printf '%f\n'
find "$OMARCHY_PATH/themes/" -mindepth 1 -maxdepth 1 -type d -printf '%f\n'
} | sort -u | while read -r name; do
echo "$name" | sed -E 's/(^|-)([a-z])/\1\u\2/g; s/-/ /g'
done done

View File

@@ -1,34 +0,0 @@
#!/bin/bash
THEMES_DIR="$HOME/.config/omarchy/themes/"
CURRENT_THEME_LINK="$HOME/.config/omarchy/current/theme"
THEMES=($(find "$THEMES_DIR" -mindepth 1 -maxdepth 1 | sort))
TOTAL=${#THEMES[@]}
# Get current theme from symlink
if [[ -L "$CURRENT_THEME_LINK" ]]; then
CURRENT_THEME=$(realpath "$CURRENT_THEME_LINK")
else
# Default to first theme if no symlink exists
CURRENT_THEME=$(realpath "${THEMES[0]}")
fi
# Find current theme index
INDEX=0
for i in "${!THEMES[@]}"; do
THEMES[$i]=$(realpath "${THEMES[$i]}")
if [[ "${THEMES[$i]}" == "$CURRENT_THEME" ]]; then
INDEX=$i
break
fi
done
# Get next theme (wrap around)
NEXT_INDEX=$(((INDEX + 1) % TOTAL))
NEW_THEME=${THEMES[$NEXT_INDEX]}
NEW_THEME_NAME=$(basename "$NEW_THEME")
omarchy-theme-set $NEW_THEME_NAME
notify-send "Theme changed to $NEW_THEME_NAME" -t 2000

View File

@@ -31,10 +31,5 @@ if [ ! -d "$THEME_PATH" ]; then
exit 1 exit 1
fi fi
# Move to the next theme if the current theme is the one being removed
if [ "$(readlink -f "$CURRENT_DIR/theme")" = "$(readlink -f "$THEME_PATH")" ]; then
omarchy-theme-next
fi
# Now remove the theme directory for THEME_NAME # Now remove the theme directory for THEME_NAME
rm -rf "$THEME_PATH" rm -rf "$THEME_PATH"

View File

@@ -1,24 +1,42 @@
#!/bin/bash #!/bin/bash
if [[ -z $1 && $1 != "CNCLD" ]]; then if [[ -z $1 ]]; then
echo "Usage: omarchy-theme-set <theme-name>" echo "Usage: omarchy-theme-set <theme-name>"
exit 1 exit 1
fi fi
THEMES_DIR="$HOME/.config/omarchy/themes/" CURRENT_THEME_PATH="$HOME/.config/omarchy/current/theme"
CURRENT_THEME_DIR="$HOME/.config/omarchy/current/theme" NEXT_THEME_PATH="$HOME/.config/omarchy/current/next-theme"
USER_THEMES_PATH="$HOME/.config/omarchy/themes"
OMARCHY_THEMES_PATH="$OMARCHY_PATH/themes"
THEME_NAME=$(echo "$1" | sed -E 's/<[^>]+>//g' | tr '[:upper:]' '[:lower:]' | tr ' ' '-') THEME_NAME=$(echo "$1" | sed -E 's/<[^>]+>//g' | tr '[:upper:]' '[:lower:]' | tr ' ' '-')
THEME_PATH="$THEMES_DIR/$THEME_NAME"
# Check if the theme entered exists if [[ -d "$USER_THEMES_PATH/$THEME_NAME" ]]; then
if [[ ! -d "$THEME_PATH" ]]; then THEME_PATH="$USER_THEMES_PATH/$THEME_NAME"
echo "Theme '$THEME_NAME' does not exist in $THEMES_DIR" elif [[ -d "$OMARCHY_THEMES_PATH/$THEME_NAME" ]]; then
THEME_PATH="$OMARCHY_THEMES_PATH/$THEME_NAME"
else
echo "Theme '$THEME_NAME' does not exist"
exit 1 exit 1
fi fi
# Update theme symlinks # Setup clean next theme directory (for atomic theme config swapping)
ln -nsf "$THEME_PATH" "$CURRENT_THEME_DIR" rm -rf "$NEXT_THEME_PATH"
mkdir -p "$NEXT_THEME_PATH"
# Copy static configs
cp -r "$THEME_PATH/"* "$NEXT_THEME_PATH/" 2>/dev/null
# Generate dynamic configs
omarchy-theme-set-templates
# Swap next theme in as current
rm -rf "$CURRENT_THEME_PATH"
mv "$NEXT_THEME_PATH" "$CURRENT_THEME_PATH"
# Store theme name for reference
echo "$THEME_NAME" > "$HOME/.config/omarchy/current/theme.name"
# Change background with theme # Change background with theme
omarchy-theme-bg-next omarchy-theme-bg-next
@@ -31,12 +49,14 @@ omarchy-restart-swayosd
omarchy-restart-terminal omarchy-restart-terminal
hyprctl reload hyprctl reload
pkill -SIGUSR2 btop pkill -SIGUSR2 btop
# pkill -SIGUSR2 opencode
makoctl reload makoctl reload
# Change gnome, browser, vscode, cursor themes # Change app-specific themes
omarchy-theme-set-gnome omarchy-theme-set-gnome
omarchy-theme-set-browser omarchy-theme-set-browser
omarchy-theme-set-vscode omarchy-theme-set-vscode
omarchy-theme-set-vscodium
omarchy-theme-set-cursor omarchy-theme-set-cursor
omarchy-theme-set-obsidian omarchy-theme-set-obsidian

View File

@@ -1,4 +1,4 @@
#!/bin/bash #!/bin/bash
# Call the VSCode theme setter with Cursor-specific parameters # Call the VSCode theme setter with Cursor-specific parameters
omarchy-theme-set-vscode cursor "$HOME/.config/Cursor/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-cursor-theme-changes" Cursor omarchy-theme-set-vscode cursor "$HOME/.config/Cursor/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-cursor-theme-changes"

44
bin/omarchy-theme-set-templates Executable file
View File

@@ -0,0 +1,44 @@
#!/bin/bash
TEMPLATES_DIR="$OMARCHY_PATH/default/themed"
NEXT_THEME_DIR="$HOME/.config/omarchy/current/next-theme"
COLORS_FILE="$NEXT_THEME_DIR/colors.toml"
# Convert hex color to decimal RGB (e.g., "#1e1e2e" -> "30,30,46")
hex_to_rgb() {
local hex="${1#\#}"
printf "%d,%d,%d" "0x${hex:0:2}" "0x${hex:2:2}" "0x${hex:4:2}"
}
# Only generate dynamic templates for themes with a colors.toml definition
if [[ -f $COLORS_FILE ]]; then
# Parse TOML using yq (treating it as YAML since the flat key=value structure is compatible)
# We convert 'key = value' to 'key: value' to make it valid YAML, then use yq/jq to generate the replacement commands.
sed_script=$(mktemp)
# Generate standard and _strip substitutions
sed 's/=/:/' "$COLORS_FILE" | yq -r 'to_entries[] | "s|{{ \(.key) }}|\(.value)|g", "s|{{ \(.key)_strip }}|\(.value | sub("^#";""))|g"' > "$sed_script"
# Generate _rgb substitutions for hex colors
while IFS='=' read -r key value; do
key=$(echo "$key" | xargs)
value=$(echo "$value" | xargs | tr -d '"')
if [[ $value =~ ^# ]]; then
rgb=$(hex_to_rgb "$value")
echo "s|{{ ${key}_rgb }}|${rgb}|g" >> "$sed_script"
fi
done < "$COLORS_FILE"
shopt -s nullglob
for tpl in "$TEMPLATES_DIR"/*.tpl; do
filename=$(basename "$tpl" .tpl)
output_path="$NEXT_THEME_DIR/$filename"
# Don't overwrite configs already exists in the output directory (copied from theme specific folder)
if [[ ! -f $output_path ]]; then
sed -f "$sed_script" "$tpl" > "$output_path"
fi
done
rm "$sed_script"
fi

View File

@@ -7,8 +7,6 @@
EDITOR_CMD="${1:-code}" EDITOR_CMD="${1:-code}"
SETTINGS_PATH="${2:-$HOME/.config/Code/User/settings.json}" SETTINGS_PATH="${2:-$HOME/.config/Code/User/settings.json}"
SKIP_FLAG="${3:-$HOME/.local/state/omarchy/toggles/skip-vscode-theme-changes}" SKIP_FLAG="${3:-$HOME/.local/state/omarchy/toggles/skip-vscode-theme-changes}"
EDITOR_NAME="${4:-VS Code}"
VS_CODE_THEME="$HOME/.config/omarchy/current/theme/vscode.json" VS_CODE_THEME="$HOME/.config/omarchy/current/theme/vscode.json"
if omarchy-cmd-present "$EDITOR_CMD" && [[ ! -f "$SKIP_FLAG" ]]; then if omarchy-cmd-present "$EDITOR_CMD" && [[ ! -f "$SKIP_FLAG" ]]; then
@@ -16,7 +14,7 @@ if omarchy-cmd-present "$EDITOR_CMD" && [[ ! -f "$SKIP_FLAG" ]]; then
theme_name=$(jq -r '.name' "$VS_CODE_THEME") theme_name=$(jq -r '.name' "$VS_CODE_THEME")
extension=$(jq -r '.extension' "$VS_CODE_THEME") extension=$(jq -r '.extension' "$VS_CODE_THEME")
# Install $EDITOR_NAME theme extension # Install theme extension
if [[ -n "$extension" ]] && ! "$EDITOR_CMD" --list-extensions | grep -Fxq "$extension"; then if [[ -n "$extension" ]] && ! "$EDITOR_CMD" --list-extensions | grep -Fxq "$extension"; then
"$EDITOR_CMD" --install-extension "$extension" >/dev/null "$EDITOR_CMD" --install-extension "$extension" >/dev/null
fi fi
@@ -39,7 +37,7 @@ if omarchy-cmd-present "$EDITOR_CMD" && [[ ! -f "$SKIP_FLAG" ]]; then
"s/(\"workbench.colorTheme\"[[:space:]]*:[[:space:]]*\")[^\"]*(\")/\1$theme_name\2/" \ "s/(\"workbench.colorTheme\"[[:space:]]*:[[:space:]]*\")[^\"]*(\")/\1$theme_name\2/" \
"$SETTINGS_PATH" "$SETTINGS_PATH"
else else
# Remove theme from settings.json when the theme doesn't have $EDITOR_NAME support # Remove theme from settings.json when the theme doesn't have editor support
if [[ -f "$SETTINGS_PATH" ]]; then if [[ -f "$SETTINGS_PATH" ]]; then
sed -i --follow-symlinks -E 's/\"workbench\.colorTheme\"[[:space:]]*:[^,}]*,?//' "$SETTINGS_PATH" sed -i --follow-symlinks -E 's/\"workbench\.colorTheme\"[[:space:]]*:[^,}]*,?//' "$SETTINGS_PATH"
fi fi

4
bin/omarchy-theme-set-vscodium Executable file
View File

@@ -0,0 +1,4 @@
#!/bin/bash
# Call the VSCode theme setter with VSCodium-specific parameters
omarchy-theme-set-vscode codium "$HOME/.config/VSCodium/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-codium-theme-changes"

View File

@@ -1,5 +1,7 @@
#!/bin/bash #!/bin/bash
set -e
if [ "$#" -ne 4 ]; then if [ "$#" -ne 4 ]; then
echo -e "\e[32mLet's create a TUI shortcut you can start with the app launcher.\n\e[0m" echo -e "\e[32mLet's create a TUI shortcut you can start with the app launcher.\n\e[0m"
APP_NAME=$(gum input --prompt "Name> " --placeholder "My TUI") APP_NAME=$(gum input --prompt "Name> " --placeholder "My TUI")

View File

@@ -1,5 +1,7 @@
#!/bin/bash #!/bin/bash
set -e
ICON_DIR="$HOME/.local/share/applications/icons" ICON_DIR="$HOME/.local/share/applications/icons"
DESKTOP_DIR="$HOME/.local/share/applications/" DESKTOP_DIR="$HOME/.local/share/applications/"

View File

@@ -4,7 +4,7 @@ set -e
trap 'echo ""; echo -e "\033[0;31mSomething went wrong during the update!\n\nPlease review the output above carefully, correct the error, and retry the update.\n\nIf you need assistance, get help from the community at https://omarchy.org/discord\033[0m"' ERR trap 'echo ""; echo -e "\033[0;31mSomething went wrong during the update!\n\nPlease review the output above carefully, correct the error, and retry the update.\n\nIf you need assistance, get help from the community at https://omarchy.org/discord\033[0m"' ERR
if omarchy-update-confirm; then if [[ $1 == "-y" ]] || omarchy-update-confirm; then
omarchy-snapshot create || [ $? -eq 127 ] omarchy-snapshot create || [ $? -eq 127 ]
omarchy-update-git omarchy-update-git
omarchy-update-perform omarchy-update-perform

View File

@@ -5,4 +5,4 @@ set -e
echo -e "\e[32mUpdate Omarchy\e[0m" echo -e "\e[32mUpdate Omarchy\e[0m"
git -C $OMARCHY_PATH pull --autostash git -C $OMARCHY_PATH pull --autostash
git -C $OMARCHY_PATH diff --check || git -C $OMARCHY_PATH reset --merge git -C $OMARCHY_PATH --no-pager diff --check || git -C $OMARCHY_PATH reset --merge

View File

@@ -2,6 +2,10 @@
set -e set -e
# Ensure screensaver/sleep doesn't set in during updates
hyprctl dispatch tagwindow +noidle &> /dev/null || true
# Perform all update steps
omarchy-update-time omarchy-update-time
omarchy-update-keyring omarchy-update-keyring
omarchy-update-available-reset omarchy-update-available-reset
@@ -9,3 +13,6 @@ omarchy-update-system-pkgs
omarchy-migrate omarchy-migrate
omarchy-hook post-update omarchy-hook post-update
omarchy-update-restart omarchy-update-restart
# Re-enable screensaver/sleep after updates
hyprctl dispatch tagwindow -- -noidle &> /dev/null || true

View File

@@ -1,10 +1,10 @@
#!/bin/bash #!/bin/bash
if [ "$(uname -r | sed 's/-arch/\.arch/')" != "$(pacman -Q linux | awk '{print $2}')" ]; then if [ "$(uname -r | sed 's/-arch/\.arch/')" != "$(pacman -Q linux | awk '{print $2}')" ]; then
gum confirm "Linux kernel has been updated. Reboot?" && omarchy-state clear re*-required && sudo reboot now gum confirm "Linux kernel has been updated. Reboot?" && omarchy-cmd-reboot
elif [ -f "$HOME/.local/state/omarchy/reboot-required" ]; then elif [ -f "$HOME/.local/state/omarchy/reboot-required" ]; then
gum confirm "Updates require reboot. Ready?" && omarchy-state clear re*-required && sudo reboot now gum confirm "Updates require reboot. Ready?" && omarchy-cmd-reboot
fi fi
for file in "$HOME"/.local/state/omarchy/restart-*-required; do for file in "$HOME"/.local/state/omarchy/restart-*-required; do

View File

@@ -0,0 +1,5 @@
#!/bin/bash
# No-op now that omarchy-update-perform is responsible for idle management.
# But this file can't be removed since it was referenced in old omarchy-update files,
# which would fail if this file is missing.

View File

@@ -1,5 +1,7 @@
#!/bin/bash #!/bin/bash
set -e
if [ "$#" -lt 3 ]; then if [ "$#" -lt 3 ]; then
echo -e "\e[32mLet's create a new web app you can start with the app launcher.\n\e[0m" echo -e "\e[32mLet's create a new web app you can start with the app launcher.\n\e[0m"
APP_NAME=$(gum input --prompt "Name> " --placeholder "My favorite web app") APP_NAME=$(gum input --prompt "Name> " --placeholder "My favorite web app")

View File

@@ -1,5 +1,7 @@
#!/bin/bash #!/bin/bash
set -e
ICON_DIR="$HOME/.local/share/applications/icons" ICON_DIR="$HOME/.local/share/applications/icons"
DESKTOP_DIR="$HOME/.local/share/applications/" DESKTOP_DIR="$HOME/.local/share/applications/"

View File

@@ -5,7 +5,6 @@ bindd = SUPER SHIFT, B, Browser, exec, omarchy-launch-browser
bindd = SUPER SHIFT ALT, B, Browser (private), exec, omarchy-launch-browser --private bindd = SUPER SHIFT ALT, B, Browser (private), exec, omarchy-launch-browser --private
bindd = SUPER SHIFT, M, Music, exec, omarchy-launch-or-focus spotify bindd = SUPER SHIFT, M, Music, exec, omarchy-launch-or-focus spotify
bindd = SUPER SHIFT, N, Editor, exec, omarchy-launch-editor bindd = SUPER SHIFT, N, Editor, exec, omarchy-launch-editor
bindd = SUPER SHIFT, T, Activity, exec, omarchy-launch-tui btop
bindd = SUPER SHIFT, D, Docker, exec, omarchy-launch-tui lazydocker bindd = SUPER SHIFT, D, Docker, exec, omarchy-launch-tui lazydocker
bindd = SUPER SHIFT, G, Signal, exec, omarchy-launch-or-focus ^signal$ "uwsm-app -- signal-desktop" bindd = SUPER SHIFT, G, Signal, exec, omarchy-launch-or-focus ^signal$ "uwsm-app -- signal-desktop"
bindd = SUPER SHIFT, O, Obsidian, exec, omarchy-launch-or-focus ^obsidian$ "uwsm-app -- obsidian -disable-gpu --enable-wayland-ime" bindd = SUPER SHIFT, O, Obsidian, exec, omarchy-launch-or-focus ^obsidian$ "uwsm-app -- obsidian -disable-gpu --enable-wayland-ime"
@@ -15,6 +14,7 @@ bindd = SUPER SHIFT, SLASH, Passwords, exec, uwsm-app -- 1password
# If your web app url contains #, type it as ## to prevent hyprland treating it as a comment # If your web app url contains #, type it as ## to prevent hyprland treating it as a comment
bindd = SUPER SHIFT, A, ChatGPT, exec, omarchy-launch-webapp "https://chatgpt.com" bindd = SUPER SHIFT, A, ChatGPT, exec, omarchy-launch-webapp "https://chatgpt.com"
bindd = SUPER SHIFT ALT, A, Grok, exec, omarchy-launch-webapp "https://grok.com" bindd = SUPER SHIFT ALT, A, Grok, exec, omarchy-launch-webapp "https://grok.com"
bindd = SUPER SHIFT CTRL, A, opencode, exec, omarchy-launch-opencode
bindd = SUPER SHIFT, C, Calendar, exec, omarchy-launch-webapp "https://app.hey.com/calendar/weeks/" bindd = SUPER SHIFT, C, Calendar, exec, omarchy-launch-webapp "https://app.hey.com/calendar/weeks/"
bindd = SUPER SHIFT, E, Email, exec, omarchy-launch-webapp "https://app.hey.com" bindd = SUPER SHIFT, E, Email, exec, omarchy-launch-webapp "https://app.hey.com"
bindd = SUPER SHIFT, Y, YouTube, exec, omarchy-launch-webapp "https://youtube.com/" bindd = SUPER SHIFT, Y, YouTube, exec, omarchy-launch-webapp "https://youtube.com/"

View File

@@ -11,7 +11,7 @@ listener {
} }
listener { listener {
timeout = 300 # 5min timeout = 150 # 5min
on-timeout = loginctl lock-session # lock screen when timeout has passed on-timeout = loginctl lock-session # lock screen when timeout has passed
} }

View File

@@ -31,8 +31,8 @@ input {
} }
# Scroll nicely in the terminal # Scroll nicely in the terminal
windowrule = scrolltouchpad 1.5, class:(Alacritty|kitty) windowrule = match:class (Alacritty|kitty), scroll_touchpad 1.5
windowrule = scrolltouchpad 0.2, class:com.mitchellh.ghostty windowrule = match:class com.mitchellh.ghostty, scroll_touchpad 0.2
# Enable touchpad gestures for changing workspaces # Enable touchpad gestures for changing workspaces
# See https://wiki.hyprland.org/Configuring/Gestures/ # See https://wiki.hyprland.org/Configuring/Gestures/

View File

@@ -0,0 +1,4 @@
{
"$schema": "https://opencode.ai/config.json",
"theme": "system"
}

View File

@@ -43,3 +43,7 @@ provider = "websearch"
[[providers.prefixes]] [[providers.prefixes]]
prefix = "$" prefix = "$"
provider = "clipboard" provider = "clipboard"
[[emergencies]]
text = "Restart Walker"
command = "omarchy-restart-walker"

View File

@@ -57,7 +57,8 @@
"cpu": { "cpu": {
"interval": 5, "interval": 5,
"format": "󰍛", "format": "󰍛",
"on-click": "omarchy-launch-or-focus-tui btop" "on-click": "omarchy-launch-or-focus-tui btop",
"on-click-right": "alacritty"
}, },
"clock": { "clock": {
"format": "{:L%A %H:%M}", "format": "{:L%A %H:%M}",
@@ -99,6 +100,7 @@
}, },
"bluetooth": { "bluetooth": {
"format": "", "format": "",
"format-off": "󰂲",
"format-disabled": "󰂲", "format-disabled": "󰂲",
"format-connected": "󰂱", "format-connected": "󰂱",
"format-no-controller": "", "format-no-controller": "",
@@ -107,7 +109,7 @@
}, },
"pulseaudio": { "pulseaudio": {
"format": "{icon}", "format": "{icon}",
"on-click": "omarchy-launch-or-focus-tui wiremix", "on-click": "omarchy-launch-audio",
"on-click-right": "pamixer -t", "on-click-right": "pamixer -t",
"tooltip-format": "Playing at {volume}%", "tooltip-format": "Playing at {volume}%",
"scroll-step": 5, "scroll-step": 5,
@@ -126,7 +128,11 @@
}, },
"custom/expand-icon": { "custom/expand-icon": {
"format": "", "format": "",
"tooltip": false "tooltip": false,
"on-scroll-up": "",
"on-scroll-down": "",
"on-scroll-left": "",
"on-scroll-right": ""
}, },
"custom/screenrecording-indicator": { "custom/screenrecording-indicator": {
"on-click": "omarchy-cmd-screenrecord", "on-click": "omarchy-cmd-screenrecord",

View File

@@ -31,6 +31,7 @@ alias ...='cd ../..'
alias ....='cd ../../..' alias ....='cd ../../..'
# Tools # Tools
alias c='opencode'
alias d='docker' alias d='docker'
alias r='rails' alias r='rails'
n() { if [ "$#" -eq 0 ]; then nvim .; else nvim "$@"; fi; } n() { if [ "$#" -eq 0 ]; then nvim .; else nvim "$@"; fi; }

View File

@@ -4,67 +4,93 @@
Name = "omarchythemes" Name = "omarchythemes"
NamePretty = "Omarchy Themes" NamePretty = "Omarchy Themes"
-- Check if file exists using Lua (no subprocess)
local function file_exists(path)
local f = io.open(path, "r")
if f then
f:close()
return true
end
return false
end
-- Get first matching file from directory using ls (single call for fallback)
local function first_image_in_dir(dir)
local handle = io.popen("ls -1 '" .. dir .. "' 2>/dev/null | head -n 1")
if handle then
local file = handle:read("*l")
handle:close()
if file and file ~= "" then
return dir .. "/" .. file
end
end
return nil
end
-- The main function elephant will call -- The main function elephant will call
function GetEntries() function GetEntries()
local entries = {} local entries = {}
local theme_dir = os.getenv("HOME") .. "/.config/omarchy/themes" local user_theme_dir = os.getenv("HOME") .. "/.config/omarchy/themes"
local omarchy_path = os.getenv("OMARCHY_PATH") or ""
local default_theme_dir = omarchy_path .. "/themes"
-- First, get all theme directories local seen_themes = {}
local find_dirs_cmd = "find -L '" .. theme_dir .. "' -mindepth 1 -maxdepth 1 -type d 2>/dev/null"
local handle = io.popen(find_dirs_cmd) -- Helper function to process themes from a directory
if not handle then local function process_themes_from_dir(theme_dir)
return entries -- Single find call to get all theme directories
end local handle = io.popen("find -L '" .. theme_dir .. "' -mindepth 1 -maxdepth 1 -type d 2>/dev/null")
if not handle then
return
end
for theme_path in handle:lines() do for theme_path in handle:lines() do
local theme_name = theme_path:match(".*/(.+)$") local theme_name = theme_path:match(".*/(.+)$")
if theme_name then if theme_name and not seen_themes[theme_name] then
-- find preview image seen_themes[theme_name] = true
local find_preview_cmd = "find -L '"
.. theme_path
.. "' -maxdepth 1 -type f \\( -name 'preview.png' -o -name 'preview.jpg' \\) 2>/dev/null | head -n 1"
local preview_handle = io.popen(find_preview_cmd)
local preview_path = nil
if preview_handle then -- Check for preview images directly (no subprocess)
preview_path = preview_handle:read("*l") local preview_path = nil
preview_handle:close() local preview_png = theme_path .. "/preview.png"
end local preview_jpg = theme_path .. "/preview.jpg"
-- If no preview found, use first image from backgrounds folder if file_exists(preview_png) then
if not preview_path or preview_path == "" then preview_path = preview_png
local bg_cmd = "find -L '" elseif file_exists(preview_jpg) then
.. theme_path preview_path = preview_jpg
.. "/backgrounds' -maxdepth 1 -type f \\( -iname '*.png' -o -iname '*.jpg' -o -iname '*.jpeg' \\) 2>/dev/null | head -n 1" else
local bg_handle = io.popen(bg_cmd) -- Fallback: get first image from backgrounds (one ls call)
if bg_handle then preview_path = first_image_in_dir(theme_path .. "/backgrounds")
preview_path = bg_handle:read("*l") end
bg_handle:close()
if preview_path and preview_path ~= "" then
local display_name = theme_name:gsub("_", " "):gsub("%-", " ")
display_name = display_name:gsub("(%a)([%w_']*)", function(first, rest)
return first:upper() .. rest:lower()
end)
display_name = display_name .. " "
table.insert(entries, {
Text = display_name,
Preview = preview_path,
PreviewType = "file",
Actions = {
activate = "omarchy-theme-set " .. theme_name,
},
})
end end
end end
if preview_path and preview_path ~= "" then
local display_name = theme_name:gsub("_", " "):gsub("%-", " ")
display_name = display_name:gsub("(%a)([%w_']*)", function(first, rest)
return first:upper() .. rest:lower()
end)
display_name = display_name .. " "
table.insert(entries, {
Text = display_name,
Preview = preview_path,
PreviewType = "file",
Actions = {
activate = "omarchy-theme-set " .. theme_name,
},
})
end
end end
handle:close()
end end
handle:close() -- Process user themes first (they take precedence)
process_themes_from_dir(user_theme_dir)
-- Then process default themes (only if not already seen)
process_themes_from_dir(default_theme_dir)
return entries return entries
end end

View File

@@ -1,2 +1,2 @@
windowrule = noscreenshare, class:^(1[p|P]assword)$ windowrule = no_screen_share on, match:class ^(1[p|P]assword)$
windowrule = tag +floating-window, class:^(1[p|P]assword)$ windowrule = tag +floating-window, match:class ^(1[p|P]assword)$

View File

@@ -1,2 +1,2 @@
windowrule = noscreenshare, class:^(Bitwarden)$ windowrule = no_screen_share on, match:class ^(Bitwarden)$
windowrule = tag +floating-window, class:^(Bitwarden)$ windowrule = tag +floating-window, match:class ^(Bitwarden)$

View File

@@ -1,13 +1,13 @@
# Browser types # Browser types
windowrule = tag +chromium-based-browser, class:((google-)?[cC]hrom(e|ium)|[bB]rave-browser|[mM]icrosoft-edge|Vivaldi-stable|helium) windowrule = tag +chromium-based-browser, match:class ((google-)?[cC]hrom(e|ium)|[bB]rave-browser|[mM]icrosoft-edge|Vivaldi-stable|helium)
windowrule = tag +firefox-based-browser, class:([fF]irefox|zen|librewolf) windowrule = tag +firefox-based-browser, match:class ([fF]irefox|zen|librewolf)
# Force chromium-based browsers into a tile to deal with --app bug # Force chromium-based browsers into a tile to deal with --app bug
windowrule = tile, tag:chromium-based-browser windowrule = tile on, match:tag chromium-based-browser
# Only a subtle opacity change, but not for video sites # Only a subtle opacity change, but not for video sites
windowrule = opacity 1 0.97, tag:chromium-based-browser windowrule = opacity 1 0.97, match:tag chromium-based-browser
windowrule = opacity 1 0.97, tag:firefox-based-browser windowrule = opacity 1 0.97, match:tag firefox-based-browser
# Some video sites should never have opacity applied to them # Some video sites should never have opacity applied to them
windowrule = opacity 1.0 1.0, initialTitle:((?i)(?:[a-z0-9-]+\.)*youtube\.com_/|app\.zoom\.us_/wc/home) windowrule = opacity 1.0 1.0, match:initial_title ((?i)(?:[a-z0-9-]+\.)*youtube\.com_/|app\.zoom\.us_/wc/home)

View File

@@ -1,2 +1,2 @@
# Focus floating DaVinci Resolve dialog windows # Focus floating DaVinci Resolve dialog windows
windowrule = stayfocused, class:.*[Rr]esolve.*, floating:1 windowrule = stay_focused on, match:class .*[Rr]esolve.*, match:float 1

View File

@@ -1,2 +1,2 @@
# Remove 1px border around hyprshot screenshots # Remove 1px border around hyprshot screenshots
layerrule = noanim, selection layerrule = no_anim on, match:namespace selection

View File

@@ -1,22 +1,22 @@
# Fix splash screen showing in weird places and prevent annoying focus takeovers # Fix splash screen showing in weird places and prevent annoying focus takeovers
windowrule = tag +jetbrains-splash, class:^(jetbrains-.*)$, title:^(splash)$, floating:1 windowrule = tag +jetbrains-splash, match:class ^(jetbrains-.*)$, match:title ^(splash)$, match:float 1
windowrule = center, tag:jetbrains-splash windowrule = center on, match:tag jetbrains-splash
windowrule = nofocus, tag:jetbrains-splash windowrule = no_focus on, match:tag jetbrains-splash
windowrule = noborder, tag:jetbrains-splash windowrule = border_size 0, match:tag jetbrains-splash
# Center popups/find windows # Center popups/find windows
windowrule = tag +jetbrains, class:^(jetbrains-.*), title:^()$, floating:1 windowrule = tag +jetbrains, match:class ^(jetbrains-.*), match:title ^()$, match:float 1
windowrule = center, tag:jetbrains windowrule = center on, match:tag jetbrains
# Enabling this makes it possible to provide input in popup dialogs (search window, new file, etc.) # Enabling this makes it possible to provide input in popup dialogs (search window, new file, etc.)
windowrule = stayfocused, tag:jetbrains windowrule = stay_focused on, match:tag jetbrains
windowrule = noborder, tag:jetbrains windowrule = border_size 0, match:tag jetbrains
# For some reason tag:jetbrains does not work for size rule # For some reason tag:jetbrains does not work for size rule
windowrule = size >50% >50%, class:^(jetbrains-.*), title:^()$, floating:1 windowrule = min_size (monitor_w*0.5) (monitor_h*0.5), match:class ^(jetbrains-.*), match:title ^()$, match:float 1
# Disable window flicker when autocomplete or tooltips appear # Disable window flicker when autocomplete or tooltips appear
windowrule = noinitialfocus, class:^(jetbrains-.*)$, title:^(win.*)$, floating:1 windowrule = no_initial_focus on, match:class ^(jetbrains-.*)$, match:title ^(win.*)$, match:float 1
# Disable mouse focus # Disable mouse focus
windowrule = nofollowmouse, class:^(jetbrains-.*)$ windowrule = no_follow_mouse on, match:class ^(jetbrains-.*)$

View File

@@ -1,3 +1,3 @@
# Float LocalSend and fzf file picker # Float LocalSend and fzf file picker
windowrule = float, class:(Share|localsend) windowrule = float on, match:class (Share|localsend)
windowrule = center, class:(Share|localsend) windowrule = center on, match:class (Share|localsend)

View File

@@ -1,9 +1,9 @@
# Picture-in-picture overlays # Picture-in-picture overlays
windowrule = tag +pip, title:(Picture.?in.?[Pp]icture) windowrule = tag +pip, match:title (Picture.?in.?[Pp]icture)
windowrule = float, tag:pip windowrule = float on, match:tag pip
windowrule = pin, tag:pip windowrule = pin on, match:tag pip
windowrule = size 600 338, tag:pip windowrule = size 600 338, match:tag pip
windowrule = keepaspectratio, tag:pip windowrule = keep_aspect_ratio on, match:tag pip
windowrule = noborder, tag:pip windowrule = border_size 0, match:tag pip
windowrule = opacity 1 1, tag:pip windowrule = opacity 1 1, match:tag pip
windowrule = move 100%-w-40 4%, tag:pip windowrule = move (monitor_w-window_w-40) (monitor_h*0.04), match:tag pip

View File

@@ -1 +1 @@
windowrule = opacity 1 1, class:qemu windowrule = opacity 1 1, match:class qemu

View File

@@ -1,4 +1,3 @@
windowrule = fullscreen, class:com.libretro.RetroArch windowrule = fullscreen on, match:class com.libretro.RetroArch
windowrule = opacity 1 1, class:com.libretro.RetroArch windowrule = opacity 1 1, match:class com.libretro.RetroArch
windowrule = idleinhibit fullscreen, class:com.libretro.RetroArch windowrule = idle_inhibit fullscreen, match:class com.libretro.RetroArch

View File

@@ -1,7 +1,7 @@
# Float Steam # Float Steam
windowrule = float, class:steam windowrule = float on, match:class steam
windowrule = center, class:steam, title:Steam windowrule = center on, match:class steam, match:title Steam
windowrule = opacity 1 1, class:steam windowrule = opacity 1 1, match:class steam
windowrule = size 1100 700, class:steam, title:Steam windowrule = size 1100 700, match:class steam, match:title Steam
windowrule = size 460 800, class:steam, title:Friends List windowrule = size 460 800, match:class steam, match:title Friends List
windowrule = idleinhibit fullscreen, class:steam windowrule = idle_inhibit fullscreen, match:class steam

View File

@@ -1,18 +1,21 @@
# Floating windows # Floating windows
windowrule = float, tag:floating-window windowrule = float on, match:tag floating-window
windowrule = center, tag:floating-window windowrule = center on, match:tag floating-window
windowrule = size 875 600, tag:floating-window windowrule = size 875 600, match:tag floating-window
windowrule = tag +floating-window, class:(org.omarchy.bluetui|org.omarchy.impala|org.omarchy.wiremix|org.omarchy.btop|org.omarchy.terminal|org.omarchy.bash|org.gnome.NautilusPreviewer|org.gnome.Evince|com.gabm.satty|Omarchy|About|TUI.float|imv|mpv) windowrule = tag +floating-window, match:class (org.omarchy.bluetui|org.omarchy.impala|org.omarchy.wiremix|org.omarchy.btop|org.omarchy.terminal|org.omarchy.bash|org.gnome.NautilusPreviewer|org.gnome.Evince|com.gabm.satty|Omarchy|About|TUI.float|imv|mpv)
windowrule = tag +floating-window, class:(xdg-desktop-portal-gtk|sublime_text|DesktopEditors|org.gnome.Nautilus), title:^(Open.*Files?|Open [F|f]older.*|Save.*Files?|Save.*As|Save|All Files|.*wants to [open|save].*|[C|c]hoose.*) windowrule = tag +floating-window, match:class (xdg-desktop-portal-gtk|sublime_text|DesktopEditors|org.gnome.Nautilus), match:title ^(Open.*Files?|Open [F|f]older.*|Save.*Files?|Save.*As|Save|All Files|.*wants to [open|save].*|[C|c]hoose.*)
windowrule = float, class:org.gnome.Calculator windowrule = float on, match:class org.gnome.Calculator
# Fullscreen screensaver # Fullscreen screensaver
windowrule = fullscreen, class:org.omarchy.screensaver windowrule = fullscreen on, match:class org.omarchy.screensaver
windowrule = float, class:org.omarchy.screensaver windowrule = float on, match:class org.omarchy.screensaver
# No transparency on media windows # No transparency on media windows
windowrule = opacity 1 1, class:^(zoom|vlc|mpv|org.kde.kdenlive|com.obsproject.Studio|com.github.PintaProject.Pinta|imv|org.gnome.NautilusPreviewer)$ windowrule = opacity 1 1, match:class ^(zoom|vlc|mpv|org.kde.kdenlive|com.obsproject.Studio|com.github.PintaProject.Pinta|imv|org.gnome.NautilusPreviewer)$
# Popped window rounding # Popped window rounding
windowrule = rounding 8, tag:pop windowrule = rounding 8, match:tag pop
# Prevent idle while open
windowrule = idle_inhibit always, match:tag noidle

View File

@@ -1,2 +1,2 @@
# Define terminal tag to style them uniformly # Define terminal tag to style them uniformly
windowrule = tag +terminal, class:(Alacritty|kitty|com.mitchellh.ghostty) windowrule = tag +terminal, match:class (Alacritty|kitty|com.mitchellh.ghostty)

View File

@@ -1,2 +1,2 @@
# Application-specific animation # Application-specific animation
layerrule = noanim, walker layerrule = no_anim on, match:namespace walker

View File

@@ -1,6 +1,6 @@
# Webcam overlay for screen recording # Webcam overlay for screen recording
windowrule = float, title:WebcamOverlay windowrule = float on, match:title WebcamOverlay
windowrule = pin, title:WebcamOverlay windowrule = pin on, match:title WebcamOverlay
windowrule = noinitialfocus, title:WebcamOverlay windowrule = no_initial_focus on, match:title WebcamOverlay
windowrule = nodim, title:WebcamOverlay windowrule = no_dim on, match:title WebcamOverlay
windowrule = move 100%-w-40 100%-w-40, title:WebcamOverlay # There's a typo in the hyprland rule so 100%-w on the height param is actually correct here windowrule = move (monitor_w-window_w-40) (monitor_h-window_h-40), match:title WebcamOverlay

View File

@@ -65,6 +65,8 @@ bindd = SUPER CTRL, TAB, Former workspace, workspace, previous
# Move workspaces to other monitors # Move workspaces to other monitors
bindd = SUPER SHIFT ALT, LEFT, Move workspace to left monitor, movecurrentworkspacetomonitor, l bindd = SUPER SHIFT ALT, LEFT, Move workspace to left monitor, movecurrentworkspacetomonitor, l
bindd = SUPER SHIFT ALT, RIGHT, Move workspace to right monitor, movecurrentworkspacetomonitor, r bindd = SUPER SHIFT ALT, RIGHT, Move workspace to right monitor, movecurrentworkspacetomonitor, r
bindd = SUPER SHIFT ALT, UP, Move workspace to up monitor, movecurrentworkspacetomonitor, u
bindd = SUPER SHIFT ALT, DOWN, Move workspace to down monitor, movecurrentworkspacetomonitor, d
# Swap active window with the one next to it with SUPER + SHIFT + arrow keys # Swap active window with the one next to it with SUPER + SHIFT + arrow keys
bindd = SUPER SHIFT, LEFT, Swap window to the left, swapwindow, l bindd = SUPER SHIFT, LEFT, Swap window to the left, swapwindow, l

View File

@@ -42,5 +42,11 @@ bindd = SUPER, PRINT, Color picker, exec, pkill hyprpicker || hyprpicker -a
bindd = SUPER CTRL, S, Share, exec, omarchy-menu share bindd = SUPER CTRL, S, Share, exec, omarchy-menu share
# Waybar-less information # Waybar-less information
bindd = SUPER CTRL, T, Show time, exec, notify-send " $(date +"%A %H:%M — %d %B W%V %Y")" bindd = SUPER CTRL ALT, T, Show time, exec, notify-send " $(date +"%A %H:%M — %d %B W%V %Y")"
bindd = SUPER CTRL, B, Show battery remaining, exec, notify-send "󰁹 Battery is at $(omarchy-battery-remaining)%" bindd = SUPER CTRL ALT, B, Show battery remaining, exec, notify-send "󰁹 Battery is at $(omarchy-battery-remaining)%"
# Control panels
bindd = SUPER CTRL, A, Audio controls, exec, omarchy-launch-audio
bindd = SUPER CTRL, B, Bluetooth controls, exec, omarchy-launch-bluetooth
bindd = SUPER CTRL, W, Wifi controls, exec, omarchy-launch-wifi
bindd = SUPER CTRL, T, Activity, exec, omarchy-launch-tui btop

View File

@@ -123,7 +123,7 @@ misc {
disable_splash_rendering = true disable_splash_rendering = true
focus_on_activate = true focus_on_activate = true
anr_missed_pings = 3 anr_missed_pings = 3
new_window_takes_over_fullscreen = 1 on_focus_under_fullscreen = 1
} }
# https://wiki.hypr.land/Configuring/Variables/#cursor # https://wiki.hypr.land/Configuring/Variables/#cursor

View File

@@ -1,11 +1,12 @@
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more # See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
windowrule = suppressevent maximize, class:.* # Hyprland 0.53+ syntax
windowrule = suppress_event maximize, match:class .*
# Just dash of opacity by default # Just dash of opacity by default
windowrule = opacity 0.97 0.9, class:.* windowrule = opacity 0.97 0.9, match:class .*
# Fix some dragging issues with XWayland # Fix some dragging issues with XWayland
windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0 windowrule = no_focus on, match:class ^$, match:title ^$, match:xwayland 1, match:float 1, match:fullscreen 0, match:pin 0
# App-specific tweaks # App-specific tweaks
source = ~/.local/share/omarchy/default/hypr/apps.conf source = ~/.local/share/omarchy/default/hypr/apps.conf

View File

@@ -0,0 +1,47 @@
[colors.primary]
background = "{{ background }}"
foreground = "{{ foreground }}"
[colors.cursor]
text = "{{ background }}"
cursor = "{{ cursor }}"
[colors.vi_mode_cursor]
text = "{{ background }}"
cursor = "{{ cursor }}"
[colors.search.matches]
foreground = "{{ background }}"
background = "{{ color3 }}"
[colors.search.focused_match]
foreground = "{{ background }}"
background = "{{ color1 }}"
[colors.footer_bar]
foreground = "{{ background }}"
background = "{{ foreground }}"
[colors.selection]
text = "{{ selection_foreground }}"
background = "{{ selection_background }}"
[colors.normal]
black = "{{ color0 }}"
red = "{{ color1 }}"
green = "{{ color2 }}"
yellow = "{{ color3 }}"
blue = "{{ color4 }}"
magenta = "{{ color5 }}"
cyan = "{{ color6 }}"
white = "{{ color7 }}"
[colors.bright]
black = "{{ color8 }}"
red = "{{ color9 }}"
green = "{{ color10 }}"
yellow = "{{ color11 }}"
blue = "{{ color12 }}"
magenta = "{{ color13 }}"
cyan = "{{ color14 }}"
white = "{{ color15 }}"

View File

@@ -0,0 +1,83 @@
# Main background, empty for terminal default, need to be empty if you want transparent background
theme[main_bg]="{{ background }}"
# Main text color
theme[main_fg]="{{ foreground }}"
# Title color for boxes
theme[title]="{{ foreground }}"
# Highlight color for keyboard shortcuts
theme[hi_fg]="{{ accent }}"
# Background color of selected item in processes box
theme[selected_bg]="{{ color8 }}"
# Foreground color of selected item in processes box
theme[selected_fg]="{{ accent }}"
# Color of inactive/disabled text
theme[inactive_fg]="{{ color8 }}"
# Color of text appearing on top of graphs, i.e uptime and current network graph scaling
theme[graph_text]="{{ foreground }}"
# Background color of the percentage meters
theme[meter_bg]="{{ color8 }}"
# Misc colors for processes box including mini cpu graphs, details memory graph and details status text
theme[proc_misc]="{{ foreground }}"
# CPU, Memory, Network, Proc box outline colors
theme[cpu_box]="{{ color5 }}"
theme[mem_box]="{{ color2 }}"
theme[net_box]="{{ color1 }}"
theme[proc_box]="{{ accent }}"
# Box divider line and small boxes line color
theme[div_line]="{{ color8 }}"
# Temperature graph color (Green -> Yellow -> Red)
theme[temp_start]="{{ color2 }}"
theme[temp_mid]="{{ color3 }}"
theme[temp_end]="{{ color1 }}"
# CPU graph colors (Teal -> Lavender)
theme[cpu_start]="{{ color6 }}"
theme[cpu_mid]="{{ color4 }}"
theme[cpu_end]="{{ color5 }}"
# Mem/Disk free meter (Mauve -> Lavender -> Blue)
theme[free_start]="{{ color5 }}"
theme[free_mid]="{{ color4 }}"
theme[free_end]="{{ color6 }}"
# Mem/Disk cached meter (Sapphire -> Lavender)
theme[cached_start]="{{ color4 }}"
theme[cached_mid]="{{ color6 }}"
theme[cached_end]="{{ color5 }}"
# Mem/Disk available meter (Peach -> Red)
theme[available_start]="{{ color3 }}"
theme[available_mid]="{{ color1 }}"
theme[available_end]="{{ color1 }}"
# Mem/Disk used meter (Green -> Sky)
theme[used_start]="{{ color2 }}"
theme[used_mid]="{{ color6 }}"
theme[used_end]="{{ color4 }}"
# Download graph colors (Peach -> Red)
theme[download_start]="{{ color3 }}"
theme[download_mid]="{{ color1 }}"
theme[download_end]="{{ color1 }}"
# Upload graph colors (Green -> Sky)
theme[upload_start]="{{ color2 }}"
theme[upload_mid]="{{ color6 }}"
theme[upload_end]="{{ color4 }}"
# Process box color gradient for threads, mem and cpu usage (Sapphire -> Mauve)
theme[process_start]="{{ color6 }}"
theme[process_mid]="{{ color4 }}"
theme[process_end]="{{ color5 }}"

View File

@@ -0,0 +1,22 @@
background = {{ background }}
foreground = {{ foreground }}
cursor-color = {{ cursor }}
selection-background = {{ selection_background }}
selection-foreground = {{ selection_foreground }}
palette = 0={{ color0 }}
palette = 1={{ color1 }}
palette = 2={{ color2 }}
palette = 3={{ color3 }}
palette = 4={{ color4 }}
palette = 5={{ color5 }}
palette = 6={{ color6 }}
palette = 7={{ color7 }}
palette = 8={{ color8 }}
palette = 9={{ color9 }}
palette = 10={{ color10 }}
palette = 11={{ color11 }}
palette = 12={{ color12 }}
palette = 13={{ color13 }}
palette = 14={{ color14 }}
palette = 15={{ color15 }}

View File

@@ -1,12 +1,12 @@
@define-color foreground #ffcead; @define-color foreground {{ foreground }};
@define-color background #060B1E; @define-color background {{ background }};
@define-color accent #7d82d9; @define-color accent {{ accent }};
@define-color muted #6d7db6; @define-color muted {{ color8 }};
@define-color card_bg #12172b; @define-color card_bg {{ color0 }};
@define-color text_dark #060B1E; @define-color text_dark {{ background }};
@define-color accent_hover #c2c4f0; @define-color accent_hover {{ color12 }};
@define-color selected_tab #7d82d9; @define-color selected_tab {{ accent }};
@define-color text #ffcead; @define-color text {{ foreground }};
* { * {
all: unset; all: unset;

View File

@@ -1,4 +1,4 @@
$activeBorderColor = rgb(d3c6aa) $activeBorderColor = rgb({{ accent_strip }})
general { general {
col.active_border = $activeBorderColor col.active_border = $activeBorderColor

View File

@@ -0,0 +1,5 @@
$color = rgba({{ background_rgb }}, 1.0)
$inner_color = rgba({{ background_rgb }}, 0.8)
$outer_color = rgba({{ foreground_rgb }}, 1.0)
$font_color = rgba({{ foreground_rgb }}, 1.0)
$check_color = rgba({{ accent_rgb }}, 1.0)

View File

@@ -0,0 +1,27 @@
foreground {{ foreground }}
background {{ background }}
selection_foreground {{ selection_foreground }}
selection_background {{ selection_background }}
cursor {{ cursor }}
cursor_text_color {{ background }}
active_border_color {{ active_border_color }}
active_tab_background {{ active_tab_background }}
color0 {{ color0 }}
color1 {{ color1 }}
color2 {{ color2 }}
color3 {{ color3 }}
color4 {{ color4 }}
color5 {{ color5 }}
color6 {{ color6 }}
color7 {{ color7 }}
color8 {{ color8 }}
color9 {{ color9 }}
color10 {{ color10 }}
color11 {{ color11 }}
color12 {{ color12 }}
color13 {{ color13 }}
color14 {{ color14 }}
color15 {{ color15 }}

View File

@@ -0,0 +1,5 @@
include=~/.local/share/omarchy/default/mako/core.ini
text-color={{ foreground }}
border-color={{ foreground }}
background-color={{ background }}

View File

@@ -0,0 +1,5 @@
@define-color background-color {{ background }};
@define-color border-color {{ foreground }};
@define-color label {{ foreground }};
@define-color image {{ foreground }};
@define-color progress {{ foreground }};

View File

@@ -0,0 +1,6 @@
@define-color selected-text {{ accent }};
@define-color text {{ foreground }};
@define-color base {{ background }};
@define-color border {{ foreground }};
@define-color foreground {{ foreground }};
@define-color background {{ background }};

View File

@@ -0,0 +1,2 @@
@define-color foreground {{ foreground }};
@define-color background {{ background }};

View File

@@ -1,80 +1,40 @@
# ============================================================================== NVIDIA="$(lspci | grep -i 'nvidia')"
# Hyprland NVIDIA Setup Script for Arch Linux
# ==============================================================================
# This script automates the installation and configuration of NVIDIA drivers
# for use with Hyprland on Arch Linux, following the official Hyprland wiki.
#
# Author: https://github.com/Kn0ax
#
# ==============================================================================
# --- GPU Detection ---
if [ -n "$(lspci | grep -i 'nvidia')" ]; then
# --- Driver Selection ---
# Turing (16xx, 20xx), Ampere (30xx), Ada (40xx), and newer recommend the open-source kernel modules
if echo "$(lspci | grep -i 'nvidia')" | grep -q -E "RTX [2-9][0-9]|GTX 16"; then
NVIDIA_DRIVER_PACKAGE="nvidia-open-dkms"
else
NVIDIA_DRIVER_PACKAGE="nvidia-dkms"
fi
if [ -n "$NVIDIA" ]; then
# Check which kernel is installed and set appropriate headers package # Check which kernel is installed and set appropriate headers package
KERNEL_HEADERS="linux-headers" # Default KERNEL_HEADERS="$(pacman -Qqs '^linux(-zen|-lts|-hardened)?$' | head -1)-headers"
if pacman -Q linux-zen &>/dev/null; then
KERNEL_HEADERS="linux-zen-headers" if echo "$NVIDIA" | grep -qE "RTX [2-9][0-9]|GTX 16"; then
elif pacman -Q linux-lts &>/dev/null; then # Turing (16xx, 20xx), Ampere (30xx), Ada (40xx), and newer recommend the open-source kernel modules
KERNEL_HEADERS="linux-lts-headers" PACKAGES=(nvidia-open-dkms nvidia-utils lib32-nvidia-utils libva-nvidia-driver)
elif pacman -Q linux-hardened &>/dev/null; then elif echo "$NVIDIA" | grep -qE "GTX 9|GTX 10"; then
KERNEL_HEADERS="linux-hardened-headers" # Pascal (10xx) and Maxwell (9xx) use legacy branch that can only be installed from AUR
PACKAGES=(nvidia-580xx-dkms nvidia-580xx-utils lib32-nvidia-580xx-utils)
fi
# Bail if no supported GPU
if [ -z "${PACKAGES+x}" ]; then
echo "No compatible driver for your NVIDIA GPU. See: https://wiki.archlinux.org/title/NVIDIA"
exit 0
fi fi
# force package database refresh pacman -S --needed --noconfirm "$KERNEL_HEADERS" "${PACKAGES[@]}"
sudo pacman -Syu --noconfirm
# Install packages
PACKAGES_TO_INSTALL=(
"${KERNEL_HEADERS}"
"${NVIDIA_DRIVER_PACKAGE}"
"nvidia-utils"
"lib32-nvidia-utils"
"egl-wayland"
"libva-nvidia-driver" # For VA-API hardware acceleration
"qt5-wayland"
"qt6-wayland"
)
sudo pacman -S --needed --noconfirm "${PACKAGES_TO_INSTALL[@]}"
# Configure modprobe for early KMS # Configure modprobe for early KMS
echo "options nvidia_drm modeset=1" | sudo tee /etc/modprobe.d/nvidia.conf >/dev/null sudo tee /etc/modprobe.d/nvidia.conf <<EOF >/dev/null
options nvidia_drm modeset=1
EOF
# Configure mkinitcpio for early loading # Configure mkinitcpio for early loading
MKINITCPIO_CONF="/etc/mkinitcpio.conf" sudo tee /etc/mkinitcpio.conf.d/nvidia.conf <<EOF >/dev/null
MODULES+=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)
EOF
# Define modules # Add NVIDIA environment variables
NVIDIA_MODULES="nvidia nvidia_modeset nvidia_uvm nvidia_drm" cat >>$HOME/.config/hypr/envs.conf <<'EOF'
# Create backup # NVIDIA
sudo cp "$MKINITCPIO_CONF" "${MKINITCPIO_CONF}.backup"
# Remove any old nvidia modules to prevent duplicates
sudo sed -i -E 's/ nvidia_drm//g; s/ nvidia_uvm//g; s/ nvidia_modeset//g; s/ nvidia//g;' "$MKINITCPIO_CONF"
# Add the new modules at the start of the MODULES array
sudo sed -i -E "s/^(MODULES=\\()/\\1${NVIDIA_MODULES} /" "$MKINITCPIO_CONF"
# Clean up potential double spaces
sudo sed -i -E 's/ +/ /g' "$MKINITCPIO_CONF"
sudo mkinitcpio -P
# Add NVIDIA environment variables to hyprland.conf
HYPRLAND_CONF="$HOME/.config/hypr/hyprland.conf"
if [ -f "$HYPRLAND_CONF" ]; then
cat >>"$HYPRLAND_CONF" <<'EOF'
# NVIDIA environment variables
env = NVD_BACKEND,direct env = NVD_BACKEND,direct
env = LIBVA_DRIVER_NAME,nvidia env = LIBVA_DRIVER_NAME,nvidia
env = __GLX_VENDOR_LIBRARY_NAME,nvidia env = __GLX_VENDOR_LIBRARY_NAME,nvidia
EOF EOF
fi
fi fi

View File

@@ -1,3 +1,6 @@
# Give the user 10 instead of 3 tries to fat finger their password before lockout # Give the user 10 instead of 3 tries to fat finger their password before lockout
echo "Defaults passwd_tries=10" | sudo tee /etc/sudoers.d/passwd-tries echo "Defaults passwd_tries=10" | sudo tee /etc/sudoers.d/passwd-tries
sudo chmod 440 /etc/sudoers.d/passwd-tries sudo chmod 440 /etc/sudoers.d/passwd-tries
# Set for hyprlock too
sudo sed -i 's/^# *deny = .*/deny = 10/' /etc/security/faillock.conf

View File

@@ -3,25 +3,27 @@ if command -v limine &>/dev/null; then
sudo tee /etc/mkinitcpio.conf.d/omarchy_hooks.conf <<EOF >/dev/null sudo tee /etc/mkinitcpio.conf.d/omarchy_hooks.conf <<EOF >/dev/null
HOOKS=(base udev plymouth keyboard autodetect microcode modconf kms keymap consolefont block encrypt filesystems fsck btrfs-overlayfs) HOOKS=(base udev plymouth keyboard autodetect microcode modconf kms keymap consolefont block encrypt filesystems fsck btrfs-overlayfs)
EOF
sudo tee /etc/mkinitcpio.conf.d/thunderbolt_module.conf <<EOF >/dev/null
MODULES+=(thunderbolt)
EOF EOF
[[ -f /boot/EFI/limine/limine.conf ]] || [[ -f /boot/EFI/BOOT/limine.conf ]] && EFI=true # Detect boot mode
[[ -d /sys/firmware/efi ]] && EFI=true
# Conf location is different between EFI and BIOS # Find config location
if [[ -n "$EFI" ]]; then if [[ -f /boot/EFI/arch-limine/limine.conf ]]; then
# Check USB location first, then regular EFI location limine_config="/boot/EFI/arch-limine/limine.conf"
if [[ -f /boot/EFI/BOOT/limine.conf ]]; then elif [[ -f /boot/EFI/BOOT/limine.conf ]]; then
limine_config="/boot/EFI/BOOT/limine.conf" limine_config="/boot/EFI/BOOT/limine.conf"
else elif [[ -f /boot/EFI/limine/limine.conf ]]; then
limine_config="/boot/EFI/limine/limine.conf" limine_config="/boot/EFI/limine/limine.conf"
fi elif [[ -f /boot/limine/limine.conf ]]; then
else
limine_config="/boot/limine/limine.conf" limine_config="/boot/limine/limine.conf"
fi elif [[ -f /boot/limine.conf ]]; then
limine_config="/boot/limine.conf"
# Double-check and exit if we don't have a config file for some reason else
if [[ ! -f $limine_config ]]; then echo "Error: Limine config not found" >&2
echo "Error: Limine config not found at $limine_config" >&2
exit 1 exit 1
fi fi
@@ -95,10 +97,15 @@ EOF
fi fi
fi fi
# Enable quota to allow space-aware algorithms to work
sudo btrfs quota enable /
# Tweak default Snapper configs # Tweak default Snapper configs
sudo sed -i 's/^TIMELINE_CREATE="yes"/TIMELINE_CREATE="no"/' /etc/snapper/configs/{root,home} sudo sed -i 's/^TIMELINE_CREATE="yes"/TIMELINE_CREATE="no"/' /etc/snapper/configs/{root,home}
sudo sed -i 's/^NUMBER_LIMIT="50"/NUMBER_LIMIT="5"/' /etc/snapper/configs/{root,home} sudo sed -i 's/^NUMBER_LIMIT="50"/NUMBER_LIMIT="5"/' /etc/snapper/configs/{root,home}
sudo sed -i 's/^NUMBER_LIMIT_IMPORTANT="10"/NUMBER_LIMIT_IMPORTANT="5"/' /etc/snapper/configs/{root,home} sudo sed -i 's/^NUMBER_LIMIT_IMPORTANT="10"/NUMBER_LIMIT_IMPORTANT="5"/' /etc/snapper/configs/{root,home}
sudo sed -i 's/^SPACE_LIMIT="0.5"/SPACE_LIMIT="0.3"/' /etc/snapper/configs/{root,home}
sudo sed -i 's/^FREE_LIMIT="0.2"/FREE_LIMIT="0.3"/' /etc/snapper/configs/{root,home}
chrootable_systemctl_enable limine-snapper-sync.service chrootable_systemctl_enable limine-snapper-sync.service
fi fi

View File

@@ -10,6 +10,7 @@ avahi
bash-completion bash-completion
bat bat
bluetui bluetui
bolt
brightnessctl brightnessctl
btop btop
clang clang
@@ -20,6 +21,7 @@ cups-pdf
docker docker
docker-buildx docker-buildx
docker-compose docker-compose
dotnet-runtime-9.0
dust dust
evince evince
exfatprogs exfatprogs
@@ -47,7 +49,7 @@ gvfs-smb
hypridle hypridle
hyprland hyprland
hyprland-guiutils hyprland-guiutils
hyprland-preview-share-picker-git hyprland-preview-share-picker
hyprlock hyprlock
hyprpicker hyprpicker
hyprsunset hyprsunset
@@ -88,6 +90,7 @@ obsidian
omarchy-chromium omarchy-chromium
omarchy-nvim omarchy-nvim
omarchy-walker omarchy-walker
opencode
pamixer pamixer
pinta pinta
playerctl playerctl
@@ -141,4 +144,5 @@ xmlstarlet
xournalpp xournalpp
yaru-icon-theme yaru-icon-theme
yay yay
yq
zoxide zoxide

View File

@@ -27,9 +27,12 @@ linux
linux-firmware linux-firmware
linux-headers linux-headers
macbook12-spi-driver-dkms macbook12-spi-driver-dkms
nvidia-580xx-dkms
nvidia-dkms nvidia-dkms
nvidia-open-dkms nvidia-open-dkms
nvidia-580xx-utils
nvidia-utils nvidia-utils
lib32-nvidia-580xx-utils
lib32-nvidia-utils lib32-nvidia-utils
pipewire pipewire
pipewire-alsa pipewire-alsa

View File

@@ -4,6 +4,7 @@ omarchy-webapp-install "WhatsApp" https://web.whatsapp.com/ WhatsApp.png
omarchy-webapp-install "Google Photos" https://photos.google.com/ "Google Photos.png" omarchy-webapp-install "Google Photos" https://photos.google.com/ "Google Photos.png"
omarchy-webapp-install "Google Contacts" https://contacts.google.com/ "Google Contacts.png" omarchy-webapp-install "Google Contacts" https://contacts.google.com/ "Google Contacts.png"
omarchy-webapp-install "Google Messages" https://messages.google.com/web/conversations "Google Messages.png" omarchy-webapp-install "Google Messages" https://messages.google.com/web/conversations "Google Messages.png"
omarchy-webapp-install "Google Maps" https://maps.google.com "Google Maps.png"
omarchy-webapp-install "ChatGPT" https://chatgpt.com/ ChatGPT.png omarchy-webapp-install "ChatGPT" https://chatgpt.com/ ChatGPT.png
omarchy-webapp-install "YouTube" https://youtube.com/ YouTube.png omarchy-webapp-install "YouTube" https://youtube.com/ YouTube.png
omarchy-webapp-install "GitHub" https://github.com/ GitHub.png omarchy-webapp-install "GitHub" https://github.com/ GitHub.png

View File

@@ -1,3 +1,3 @@
echo "Install Copy URL extension for Chromium" echo "Install Copy URL extension for Chromium"
omarchy-refresh-config chromium-flags.conf omarchy-refresh-chromium

13
migrations/1758455816.sh Normal file
View File

@@ -0,0 +1,13 @@
echo "Add thunderbolt support to boot image"
omarchy-pkg-add bolt
if [[ ! -f /etc/mkinitcpio.conf.d/thunderbolt_module.conf ]]; then
sudo tee /etc/mkinitcpio.conf.d/thunderbolt_module.conf <<EOF >/dev/null
MODULES+=(thunderbolt)
EOF
fi
if omarchy-cmd-present limine-update; then
sudo limine-update
fi

View File

@@ -1,6 +1,17 @@
echo "Add custom share portal picker" echo "Add custom share portal picker"
omarchy-pkg-add hyprland-preview-share-picker-git omarchy-pkg-add hyprland-preview-share-picker
mkdir -p ~/.config/hyprland-preview-share-picker
omarchy-refresh-config hyprland-preview-share-picker/config.yaml
if ! grep -q "custom_picker_binary" ~/.config/hypr/xdph.conf; then if ! grep -q "custom_picker_binary" ~/.config/hypr/xdph.conf; then
sed -i '/screencopy {/a\ custom_picker_binary = hyprland-preview-share-picker' ~/.config/hypr/xdph.conf sed -i '/screencopy {/a\ custom_picker_binary = hyprland-preview-share-picker' ~/.config/hypr/xdph.conf
fi fi
sleep 1
killall -e xdg-desktop-portal-hyprland
killall -e xdg-desktop-portal-wlr
killall xdg-desktop-portal
/usr/lib/xdg-desktop-portal-hyprland &
sleep 2
/usr/lib/xdg-desktop-portal &

11
migrations/1765729055.sh Normal file
View File

@@ -0,0 +1,11 @@
echo "Add emergency entry for Walker"
CONFIG_FILE="$HOME/.config/walker/config.toml"
if [[ -f "$CONFIG_FILE" ]] && ! grep -q 'command = "omarchy-restart-walker"' "$CONFIG_FILE"; then
cat >> "$CONFIG_FILE" << 'EOF'
[[emergencies]]
text = "Restart Walker"
command = "omarchy-restart-walker"
EOF
fi

7
migrations/1765739892.sh Normal file
View File

@@ -0,0 +1,7 @@
if omarchy-cmd-present btrfs && omarchy-cmd-present snapper; then
echo "Adjust snapper space limits & enable btrfs quota"
sudo sed -i 's/^SPACE_LIMIT="0.5"/SPACE_LIMIT="0.3"/' /etc/snapper/configs/{root,home} 2>/dev/null
sudo sed -i 's/^FREE_LIMIT="0.2"/FREE_LIMIT="0.3"/' /etc/snapper/configs/{root,home} 2>/dev/null
sudo btrfs quota enable /
fi

2
migrations/1765744321.sh Normal file
View File

@@ -0,0 +1,2 @@
echo "Increase faillock attempts to 10"
sudo sed -i 's/^# *deny = .*/deny = 10/' /etc/security/faillock.conf

3
migrations/1765846739.sh Normal file
View File

@@ -0,0 +1,3 @@
echo "Add missing dotnet 9.0 for Pinta"
omarchy-pkg-add dotnet-runtime-9.0

6
migrations/1765884267.sh Normal file
View File

@@ -0,0 +1,6 @@
echo "Change to openai-codex instead of openai-codex-bin"
if omarchy-pkg-present openai-codex-bin; then
omarchy-pkg-drop openai-codex-bin
omarchy-pkg-add openai-codex
fi

8
migrations/1766942230.sh Normal file
View File

@@ -0,0 +1,8 @@
echo "Migrate legacy NVIDIA GPUs to nvidia-580xx driver (if needed)"
# Only migrate GTX 9xx or 10xx (Pascal/Maxwell)
NVIDIA="$(lspci | grep -i 'nvidia')"
if echo "$NVIDIA" | grep -qE "GTX 9|GTX 10"; then
# Piping yes to override existing packages
yes | sudo pacman -S nvidia-580xx-dkms nvidia-580xx-utils lib32-nvidia-580xx-utils
fi

9
migrations/1767138576.sh Normal file
View File

@@ -0,0 +1,9 @@
echo "Update terminal scrolltouchpad setting to Hyprland 0.53 style"
if grep -q "scrolltouchpad" ~/.config/hypr/input.conf; then
sed -Ei 's/^windowrule = scrolltouchpad ([^,]+), class:\(([^)]+)\)$/windowrule = match:class (\2), scroll_touchpad \1/;
s/^windowrule = scrolltouchpad ([^,]+), class:([^ ]+)$/windowrule = match:class \2, scroll_touchpad \1/' ~/.config/hypr/input.conf
fi
# Ensure we restart to pair new Hyprland settings with new version
omarchy-state set reboot-required

3
migrations/1767227973.sh Executable file
View File

@@ -0,0 +1,3 @@
echo "Replace Waybar omarchy-launch-or-focus-tui wiremix with omarchy-launch-audio"
sed -i 's/omarchy-launch-or-focus-tui wiremix/omarchy-launch-audio/g' ~/.config/waybar/config.jsonc

62
migrations/1767306902.sh Normal file
View File

@@ -0,0 +1,62 @@
echo "Migrate to new theme setup"
omarchy-pkg-add yq
# Move user-added backgrounds from Omarchy theme folders to user config
OMARCHY_DIR="$HOME/.local/share/omarchy"
USER_BACKGROUNDS_DIR="$HOME/.config/omarchy/backgrounds"
if [[ -d "$OMARCHY_DIR/themes" ]]; then
cd "$OMARCHY_DIR"
# Get list of git-tracked background files (relative to omarchy dir)
mapfile -t TRACKED_BACKGROUNDS < <(git ls-files --cached 'themes/*/backgrounds/*' 2>/dev/null)
# Find all background files and check if they're untracked (user-added)
for theme_dir in themes/*/; do
theme_name=$(basename "$theme_dir")
backgrounds_dir="themes/$theme_name/backgrounds"
[[ -d "$backgrounds_dir" ]] || continue
for bg_file in "$backgrounds_dir"/*; do
[[ -f "$bg_file" ]] || continue
# Check if this file is tracked by git
is_tracked=false
for tracked in "${TRACKED_BACKGROUNDS[@]}"; do
if [[ "$tracked" == "$bg_file" ]]; then
is_tracked=true
break
fi
done
if [[ "$is_tracked" == "false" ]]; then
# This is a user-added background, move it to user config
user_theme_bg_dir="$USER_BACKGROUNDS_DIR/$theme_name"
mkdir -p "$user_theme_bg_dir"
mv "$bg_file" "$user_theme_bg_dir/"
echo "Moved user background: $bg_file -> $user_theme_bg_dir/"
fi
done
done
fi
THEMES_DIR="$HOME/.config/omarchy/themes"
CURRENT_THEME_LINK="$HOME/.config/omarchy/current/theme"
# Get current theme name from symlink before removing anything
CURRENT_THEME_NAME=""
if [[ -L $CURRENT_THEME_LINK ]]; then
CURRENT_THEME_NAME=$(basename "$(readlink "$CURRENT_THEME_LINK")")
elif [[ -f "$HOME/.config/omarchy/current/theme.name" ]]; then
CURRENT_THEME_NAME=$(cat "$HOME/.config/omarchy/current/theme.name")
fi
# Remove all symlinks from ~/.config/omarchy/themes
find "$THEMES_DIR" -mindepth 1 -maxdepth 1 -type l -delete
# Re-apply the current theme with the new system
if [[ -n $CURRENT_THEME_NAME ]]; then
omarchy-theme-set "$CURRENT_THEME_NAME"
fi

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