Compare commits

...
437 Commits
Author SHA1 Message Date
David Heinemeier HanssonandGitHub 31247484dc Merge pull request #4525 from basecamp/dev
Omarchy 3.4.0
2026-02-26 13:21:40 -05:00
David Heinemeier Hansson c3f7575474 Allow for a second AI 2026-02-26 14:48:42 +01:00
David Heinemeier Hansson 91855a56b4 Just go straight to build 2026-02-26 13:15:46 +01:00
David Heinemeier Hansson b1960fe870 Fix for many panes 2026-02-26 13:15:36 +01:00
David Heinemeier Hansson 74c9703ea3 Add usage docs 2026-02-26 13:12:17 +01:00
David Heinemeier Hansson 3408445880 Use consistent style 2026-02-26 12:13:05 +01:00
David Heinemeier Hansson ab615092ab Fix comment 2026-02-26 12:10:53 +01:00
David Heinemeier Hansson 57f07cc9c8 Follow style guide 2026-02-26 12:08:20 +01:00
David Heinemeier Hansson b1fabda701 Make sure toe escape directory and names 2026-02-26 12:03:17 +01:00
David Heinemeier Hansson cc3d8e4abe Fix quoting for file inputs in transcoding functions 2026-02-26 12:00:08 +01:00
David Heinemeier HanssonandGitHub 35862eb907 Merge pull request #4708 from sgruendel/remove_legacy_gpu_terminal
Remove legacy GPU terminal script and its invocation
2026-02-26 05:57:33 -05:00
David Heinemeier Hansson 3ab91b663a Fix bad font reference 2026-02-26 11:51:18 +01:00
David Heinemeier Hansson 7593511600 Remove debug info that wasn't useful 2026-02-26 11:49:23 +01:00
David Heinemeier Hansson 47829841f3 Fix quoting 2026-02-26 11:47:19 +01:00
David Heinemeier Hansson f6c7b96e01 Use const path 2026-02-26 11:45:07 +01:00
David Heinemeier Hansson 05f1ba9fd8 Excess CR 2026-02-26 11:44:12 +01:00
David Heinemeier Hansson 81522701f2 Can't have any migrations before the update that doesn't do this 2026-02-26 11:17:49 +01:00
David Heinemeier Hansson b3867f1294 Even earlier 2026-02-26 10:44:07 +01:00
David Heinemeier Hansson 244bb03877 Need this even earlier too 2026-02-26 10:41:50 +01:00
David Heinemeier Hansson 9ae56e30a2 Needed for older updates 2026-02-26 10:39:51 +01:00
David Heinemeier Hansson 7642cb9cc9 No longer using wayfreeze 2026-02-26 10:36:07 +01:00
David Heinemeier Hansson a491a414d5 Use correct package 2026-02-26 10:24:40 +01:00
David Heinemeier Hansson 119534038a Nothing recursive needed 2026-02-26 10:22:30 +01:00
David Heinemeier Hansson 24e7afefc5 Backup login.keyring instead of just deleting it 2026-02-26 10:20:32 +01:00
David Heinemeier Hansson 8d3d4e797e Make it clear that we're starting a new session 2026-02-26 10:18:38 +01:00
David Heinemeier Hansson b0aa10abb3 Fix conditional 2026-02-26 10:13:36 +01:00
David Heinemeier HanssonandGitHub f3f1468914 Merge pull request #4742 from pomartel/hide-fcitx5-icon
Hide fcitx5 icon from waybar
2026-02-26 04:01:48 -05:00
Pierre Olivier Martel 8bc2a7cf22 Revert "Hide fcitx5 tray icon from waybar"
This reverts commit b5dbb23c9f.
2026-02-25 21:52:12 -05:00
Pierre Olivier Martel 7ae27d4253 hide fcitx5 tray icon 2026-02-25 21:44:08 -05:00
David Heinemeier Hansson 8e88b780d3 Rearrange and proper branding 2026-02-25 21:47:17 +01:00
David Heinemeier Hansson 3775d93099 Disable Ruby compilation in mise (if mise and ruby are installed) 2026-02-25 21:41:46 +01:00
David Heinemeier Hansson 95e5a5a754 Better naming 2026-02-25 21:40:39 +01:00
David Heinemeier Hansson a7f83a576a Usage 2026-02-25 21:37:44 +01:00
David Heinemeier Hansson 0bb3973a8c Reduce this to generic functions 2026-02-25 21:32:51 +01:00
David Heinemeier Hansson 1785fb6185 Add tpl for creating multi-pane layouts for the same command
All the agents, all at once!
2026-02-25 21:21:45 +01:00
David Heinemeier Hansson 53f026292d Do global toggles and include border_size 2026-02-25 20:33:43 +01:00
David Heinemeier Hansson 1609fd74ed Add Tmux keybinding on Super + Alt + Return 2026-02-24 07:46:15 -05:00
David Heinemeier Hansson fe21bb1fad Split out functions and add multi mode for tml 2026-02-23 06:59:21 -05:00
David Heinemeier Hansson 8e9bd2484e Add claude code by default
Now that we have aliases depending on it. But also include it and
opencode in the removal of preinstalls.
2026-02-23 06:27:28 -05:00
David Heinemeier Hansson 74ce6c9943 Try a way to start multiple tmls 2026-02-23 12:06:17 +01:00
David Heinemeier Hansson a612d71bc7 Ensure we're inside tmux 2026-02-23 12:01:58 +01:00
David Heinemeier Hansson 0d50a01a41 Name the current window after the base directory name 2026-02-23 12:00:53 +01:00
David Heinemeier HanssonandGitHub 3e952ca745 Merge pull request #4718 from RyanLatimer/fix-voxtype-notification
fix: update voxtype dictation notification phrasing
2026-02-23 02:15:42 +01:00
Ryan Latimer 6ec3fa3acc fix: update voxtype dictation notification phrasing 2026-02-21 17:08:19 -05:00
David Heinemeier HanssonandGitHub 6cb036d769 Merge pull request #4711 from bjarneo/add-theme-white
Add theme white
2026-02-21 22:18:28 +01:00
David Heinemeier Hansson 71b553a9aa Only source the file if tmux is running 2026-02-21 21:57:33 +01:00
Bjarne Øverli 1ea2abb602 Make the accent brighter 2026-02-21 19:16:37 +01:00
Bjarne Øverli 5067cf5430 Load from repo 2026-02-21 18:57:50 +01:00
Bjarne Øverli ed228e7042 Rename file extenstion 2026-02-21 18:55:31 +01:00
Bjarne Øverli 94d668bcc3 Add theme white 2026-02-21 18:53:58 +01:00
David Heinemeier Hansson 72d575c679 Add linux-firmware-marvell for Surface laptops 2026-02-21 18:18:45 +01:00
David Heinemeier Hansson 3936378ca5 Try harder to ensure that even online installs have the intended packages for their channel 2026-02-21 18:11:04 +01:00
David Heinemeier Hansson ac3a5ca32e Exit mildly so we can continue even if we can't do a setup 2026-02-21 18:01:39 +01:00
David Heinemeier Hansson 5c70555308 Setup hibernation as part of post-install
So limine will be ready
2026-02-21 17:52:15 +01:00
David Heinemeier Hansson 3223e33de3 Ensure this wasn't the problem 2026-02-21 17:42:25 +01:00
Ryan Hughes c45b46cfbb Fix upload command 2026-02-21 11:37:01 -05:00
David Heinemeier Hansson d0a39976b2 Merge branch 'rc' into dev 2026-02-21 17:31:40 +01:00
David Heinemeier Hansson 23604fbaec Fail loudly if we haven't added any boot entries 2026-02-21 17:31:35 +01:00
David Heinemeier Hansson add6ca6292 Merge branch 'dev' into rc 2026-02-21 17:13:55 +01:00
David Heinemeier Hansson f1cd65ca7a Ensure that Alacritty is set to take xterm variables out of the box 2026-02-21 17:13:51 +01:00
Stefan Gründel e6f7c94fcf Remove legacy GPU terminal script and its invocation 2026-02-21 16:51:25 +01:00
David Heinemeier Hansson 105c5e20ea Merge branch 'dev' into rc 2026-02-21 16:37:01 +01:00
David Heinemeier Hansson 311fbe8576 Group system menu bins together 2026-02-21 16:36:56 +01:00
David Heinemeier Hansson d889fd52e4 Merge branch 'dev' into rc 2026-02-21 16:31:38 +01:00
David Heinemeier Hansson 1c527e0cd7 Fix perms 2026-02-21 16:31:29 +01:00
David Heinemeier Hansson 5a2ec94a93 Trim the first 100ms of the video to avoid the noise problem 2026-02-21 16:22:37 +01:00
David Heinemeier Hansson adca719e33 Use h264 for better compatibility when sharing videos with mac 2026-02-21 16:22:18 +01:00
David Heinemeier Hansson 07988bff05 Merge branch 'dev' into rc 2026-02-21 16:11:33 +01:00
David Heinemeier Hansson 6298fdf788 Style 2026-02-21 16:10:07 +01:00
David Heinemeier Hansson 3cab707016 Fix font match 2026-02-21 16:09:57 +01:00
David Heinemeier Hansson aa3b60e0a7 Move Caskaydia Mono to install fonts
Now that we've doubled down on JetBrains as the default
2026-02-21 16:04:51 +01:00
David Heinemeier Hansson 1418e33a0d We don't need this 300MB package by default 2026-02-21 16:01:43 +01:00
David Heinemeier Hansson 11316e7d22 Let ghostty install when it's selected via Install > Terminal like Kitty 2026-02-21 15:56:34 +01:00
David Heinemeier Hansson ba381e28bf Merge branch 'dev' into rc 2026-02-21 15:47:45 +01:00
David Heinemeier Hansson 262fadd531 Revert "Ensure /home is indexed on Btrfs"
This reverts commit 9f561e0123.
2026-02-21 15:32:15 +01:00
David Heinemeier Hansson cc2e7edca4 Merge branch 'dev' into rc 2026-02-21 15:29:42 +01:00
David Heinemeier Hansson 1a564500ac Switch back to Alacritty for the default terminal
It's more broadly compatible with older hardware which is otherwise left
in a bad/confusing situation where nothing works. And it's easy to
switch to Ghostty for those where it works.
2026-02-21 15:29:35 +01:00
David Heinemeier Hansson 0a77df56a5 Merge branch 'dev' into rc 2026-02-21 15:20:11 +01:00
David Heinemeier Hansson 43cebbeb00 More natural order 2026-02-21 15:19:52 +01:00
David Heinemeier Hansson e140badbb2 Make suspend opt-out rather than opt-in 2026-02-21 15:16:15 +01:00
David Heinemeier Hansson 8a36536bf2 Merge branch 'dev' into rc 2026-02-21 15:13:42 +01:00
David Heinemeier Hansson d52ae29e66 Fix User Manager hanging on shutdown 2026-02-21 15:13:32 +01:00
David Heinemeier Hansson 09c421021d Login to the right session 2026-02-21 15:03:26 +01:00
David Heinemeier Hansson 1a743d3467 Prevent password-based SDDM logins from creating an encrypted login keyring 2026-02-21 15:03:16 +01:00
David Heinemeier Hansson 3b2db4b98b Use omarchy-refresh-sddm 2026-02-21 14:18:35 +01:00
David Heinemeier Hansson 21e33b5cd7 Fix sizing 2026-02-21 14:16:27 +01:00
David Heinemeier Hansson 20be495889 Allow updating the script 2026-02-21 14:14:30 +01:00
David Heinemeier Hansson 2a38dc7d2e Add Logout to system menu and style the SDDM login screen 2026-02-21 14:09:14 +01:00
David Heinemeier HanssonandGitHub c24c184d8f Merge pull request #4676 from CryptoCain/dev
Comment out mouse acceleration setting
2026-02-21 11:30:39 +01:00
David Heinemeier Hansson 78742792b8 It just drifts, GH releases are the truth 2026-02-21 11:20:30 +01:00
David Heinemeier Hansson 29cf5e3ee4 Cleanup 2026-02-21 11:14:08 +01:00
David Heinemeier Hansson de76ea3448 Separate the note about restart from the include 2026-02-21 11:10:06 +01:00
David Heinemeier Hansson 24a5de2f99 Add option to configure direct boot 2026-02-21 11:08:52 +01:00
David Heinemeier Hansson c8b1431c8f Update skill to focus on end-user customizations
We have AGENTS.md inside for developers of Omarchy
2026-02-21 11:01:08 +01:00
David Heinemeier HanssonandGitHub 7a5b55c3df Merge pull request #4705 from foucist/patch-1
Keep the mouse cursor in sync with the last focused window when switching workspaces.
2026-02-21 10:53:50 +01:00
David Heinemeier Hansson f7cd7a94b4 Merge branch 'dev' into rc 2026-02-21 10:51:55 +01:00
David Heinemeier Hansson a69f332869 Fix colored gutter in nvim by making line numbers transparent 2026-02-21 10:51:50 +01:00
David Heinemeier Hansson 8dfd36fb2a Excess space 2026-02-21 10:44:25 +01:00
David Heinemeier Hansson a2f99b771e A few more examples 2026-02-21 10:44:02 +01:00
David Heinemeier Hansson 825a12c0b6 Suggest a few more possible tweaks 2026-02-21 10:41:09 +01:00
David Heinemeier Hansson 84359dbd0d Merge branch 'dev' into rc 2026-02-21 10:34:56 +01:00
David Heinemeier Hansson b5dbb23c9f Hide fcitx5 tray icon from waybar 2026-02-21 10:34:52 +01:00
David Heinemeier Hansson 497a755927 Clearer to use the same name 2026-02-21 10:27:19 +01:00
David Heinemeier Hansson 29c3355e3f Group hyprland toggles correctly 2026-02-21 10:24:49 +01:00
David Heinemeier Hansson 49890ec068 Merge branch 'dev' into rc 2026-02-21 10:19:00 +01:00
David Heinemeier Hansson 7514ae7dcf Use consistent bash5 style for conditionals and quoting 2026-02-21 10:18:47 +01:00
David Heinemeier Hansson d2acf3b6ba Use our pkg helpers consistently 2026-02-21 09:52:17 +01:00
David Heinemeier Hansson c6ac6de366 Correct checks 2026-02-21 09:48:11 +01:00
David Heinemeier Hansson d557c016f2 No longer used 2026-02-21 09:46:43 +01:00
James RobeyandGitHub 047e48885c Add cursor warp_on_change_workspace setting
enables "Move the cursor to the last focused window after changing the workspace." setting
2026-02-21 15:36:29 +07:00
David Heinemeier Hansson bac5ceef57 Assume https if no protocol is entered 2026-02-21 09:24:43 +01:00
David Heinemeier Hansson 1f074308b7 Merge branch 'dev' into rc 2026-02-21 09:22:23 +01:00
David Heinemeier Hansson ffd8509da6 Fix Hibernation resume on nvidia computers 2026-02-21 09:22:17 +01:00
David Heinemeier Hansson 76ab172334 Scala needs java to be installed 2026-02-21 09:17:26 +01:00
David Heinemeier Hansson 47c12a6888 Only ask for icon URL if we can't get a favicon 2026-02-21 09:14:50 +01:00
David Heinemeier Hansson 778c203209 Ensure we are using compiled binaries for Ruby 2026-02-21 09:14:50 +01:00
Ryan HughesandGitHub 2a4e4080a7 Merge pull request #2953 from riozee/fix/screenshot-portrait-transform
Fix: omarchy-cmd-screenshot geometry for transformed monitors
2026-02-21 03:02:52 -05:00
David Heinemeier Hansson ac075d1b00 Add Google as a DNS provider option 2026-02-21 09:02:09 +01:00
David Heinemeier Hansson 8e38f70832 Cleanup duplication 2026-02-21 08:52:02 +01:00
David Heinemeier Hansson d1757b25f3 No lazydocker either 2026-02-21 08:43:53 +01:00
David Heinemeier Hansson d32b94f369 Merge branch 'dev' into rc 2026-02-21 08:32:32 +01:00
David Heinemeier Hansson 4c1594572b Need to reload for the keybindings to disappear from Super + K 2026-02-21 08:32:27 +01:00
David Heinemeier Hansson 3bfe42ffad Merge branch 'dev' into rc 2026-02-21 08:29:42 +01:00
David Heinemeier Hansson 49c7b63677 Group these 2026-02-21 08:29:37 +01:00
David Heinemeier Hansson 5e63cf9d1d Ensure we only have plain bindings after doing Remove > Preinstalls 2026-02-21 08:26:46 +01:00
David Heinemeier Hansson aaeafa441e Merge branch 'dev' into rc 2026-02-21 07:55:26 +01:00
David Heinemeier Hansson 06494e99a8 Merge branch 'master' into dev 2026-02-21 07:44:22 +01:00
David Heinemeier HanssonandClaude Opus 4.6 6a2b0f1963 Fix Bluetooth device showing bluez ID instead of friendly name (#4260)
Look up device.id first for Bluetooth friendly names, falling back to
object.id for non-Bluetooth devices. Also fix conditionals to use [[ ]].

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 07:43:46 +01:00
David Heinemeier Hansson 7c0adf7d40 Revert "Merge pull request #4260 from shawnyeager/fix-bluetooth-device-name-display"
This reverts commit 517bc8920f, reversing
changes made to cd01b3cedf.
2026-02-21 07:43:14 +01:00
David Heinemeier HanssonandGitHub 517bc8920f Merge pull request #4260 from shawnyeager/fix-bluetooth-device-name-display
Fix Bluetooth device showing bluez ID instead of friendly name
2026-02-21 07:42:12 +01:00
David Heinemeier HanssonandGitHub 9c7f260f3b Merge pull request #3755 from zachfleeman/nvidia_rtx_pro_support
Nvidia RTX Pro Support
2026-02-21 07:39:31 +01:00
David Heinemeier Hansson 031ea32614 Merge branch 'dev' into rc 2026-02-21 07:34:59 +01:00
David Heinemeier Hansson 6927e77f51 Fix permissions 2026-02-21 07:34:55 +01:00
David Heinemeier Hansson 618b957e23 Fix missing extension 2026-02-21 07:34:24 +01:00
David Heinemeier Hansson f25584949c Remove duplicate or no longer relevant migrations 2026-02-21 07:06:30 +01:00
David Heinemeier Hansson 3df37f999c Hide wiremix and limine-snapper-restore from app launcher
Never meant to be exposed
2026-02-21 06:54:29 +01:00
David Heinemeier Hansson d1b00daf53 Decided not to use this after all
Stuck with more prefix-based keys
2026-02-21 06:32:11 +01:00
David Heinemeier Hansson ea6c92d569 Merge branch 'dev' into rc 2026-02-21 06:29:00 +01:00
CryptoCainandGitHub fcf8d96e10 Comment out mouse acceleration setting
Comment out mouse acceleration setting in input.conf
2026-02-20 23:39:41 -03:30
Zach Fleeman 2e3500cbd5 Nvidia RTX Pro Support
Support detection of Nvidia RTX Pro GPU during install
2026-02-20 18:05:00 -05:00
Ryan Hughes 929b09c4fb Remove. Doesn't work right. 2026-02-20 17:57:26 -05:00
Ryan Hughes 5711f42ac3 Don't delete snapshot on error 2026-02-20 17:48:24 -05:00
David Heinemeier Hansson 9b02df37c2 Merge branch 'dev' into rc 2026-02-20 22:42:50 +01:00
David Heinemeier HanssonandGitHub d6e8983a8c Merge pull request #4646 from dipeshbabu/fix/upload-log-system-info-alias
Fix upload-log usage and support system-info alias
2026-02-20 22:42:35 +01:00
Dipesh BabuandGitHub 413ddd2ea7 docs: correct omarchy-debug journalctl section label (#4654) 2026-02-20 22:41:00 +01:00
Luca PattocchioandGitHub e5b58a3e68 Add remove scala option (#4675) 2026-02-20 22:39:51 +01:00
David Heinemeier HanssonandGitHub 1b2f08e8d9 Merge pull request #4665 from dipeshbabu/fix/migration-hyprland-flag-newline
Fix Hyprland Chromium flags migration newline handling
2026-02-20 22:38:34 +01:00
Ryan HughesandGitHub 747a0f2698 Merge pull request #3107 from jtaw5649/fix/omarchy-cmd-screenshot
Fix HDR omarchy-cmd-screenshot
2026-02-20 16:34:03 -05:00
David Heinemeier Hansson 381c8a9664 Merge branch 'dev' into rc 2026-02-20 22:31:55 +01:00
David Heinemeier Hansson 7d4cc63d20 Clean up and offer reboot 2026-02-20 22:28:14 +01:00
David Heinemeier Hansson 79fb802e34 The nordvpn gui is just too heavy with too many dependencies 2026-02-20 22:25:58 +01:00
David Heinemeier HanssonandGitHub c644408b51 Merge pull request #4468 from jamerrq/feat/nordvpn-service
feat: add NordVPN to installable services with optional GUI
2026-02-20 22:22:23 +01:00
David Heinemeier Hansson 9a7bf34fcc Order 2026-02-20 22:22:02 +01:00
David Heinemeier Hansson c3f3628185 Slim down and use existing services 2026-02-20 22:21:05 +01:00
David Heinemeier Hansson 9f561e0123 Ensure /home is indexed on Btrfs
Closes #4292
Co-authored-by: @jorge-campo
2026-02-20 22:19:22 +01:00
David Heinemeier HanssonandGitHub b7544ecf3c Merge pull request #4290 from prepin/fix-format-drive-compatibility
Fix format-drive compatibility with macOS
2026-02-20 22:15:14 +01:00
David Heinemeier Hansson 91470cb31f Switch from push-to-talk to toggle
Works around the fact that push to talk is just inconsistent regarding
the precise timing of letting go of buttons.

Closes #4178
2026-02-20 22:08:49 +01:00
jtaw5649andRyan Hughes f93c9307ba Fix HDR omarchy-cmd-screenshot 2026-02-20 16:00:51 -05:00
David Heinemeier Hansson 864df215bb Improve description 2026-02-20 21:58:00 +01:00
David Heinemeier HanssonandGitHub 8fed694305 Merge pull request #3596 from defer/defer/kernel-modules-hook
kernel: Keep modules functional after a kernel upgrade
2026-02-20 21:56:55 +01:00
David Heinemeier HanssonandGitHub 949a892052 Merge branch 'dev' into defer/kernel-modules-hook 2026-02-20 21:56:41 +01:00
David Heinemeier Hansson 1c0f735e96 Merge branch 'dev' into rc 2026-02-20 21:49:01 +01:00
David Heinemeier Hansson cea45c4e8b Include vendor for drives where it's not part of the model string
Closes #3681
Co-authored-by: @KR9SIS
2026-02-20 21:48:51 +01:00
David Heinemeier Hansson 640ca725bb More clues for agents 2026-02-20 21:47:43 +01:00
David Heinemeier Hansson fc36b5ef7a Merge branch 'dev' into rc 2026-02-20 21:45:00 +01:00
David Heinemeier Hansson 5f1eca3b79 Show partitions to help decide on drive via omarchy-drive-select
Closes #3731
Co-authored-by: @johnbarney
2026-02-20 21:30:11 +01:00
David Heinemeier HanssonandGitHub c8a3796d36 Merge pull request #3730 from hattapauzi/master
Added a reminder to run omarchy-restart-xcompose for applying changes
2026-02-20 21:25:42 +01:00
David Heinemeier HanssonandGitHub c6df7ee199 More direct
Updated comment to clarify the command for applying changes.
2026-02-20 21:25:29 +01:00
David Heinemeier Hansson 0cc91ce71c Simplify the kernel change check and make it work with any kernel
Closes #3785
2026-02-20 21:22:59 +01:00
David Heinemeier Hansson 9b4140abc9 Turn off keyboard backlighting when idle
Closes #3319
Co-authored-by: @pukljak
2026-02-20 21:13:02 +01:00
David Heinemeier HanssonandGitHub bc05c1c849 Merge pull request #4673 from guidovicino/fix-obsidian-muted-contrast
Fix low contrast for muted/faint text in Obsidian theme template
2026-02-20 20:52:51 +01:00
David Heinemeier HanssonandGitHub 84c57d97bd Merge pull request #2868 from timohubois/feat-config-docker-with-on-demand-startup
Feat config docker with on demand startup
2026-02-20 20:51:42 +01:00
David Heinemeier Hansson fae8f6e2ce Fix emoji rendering in Alacritty
Closes #2698
Co-authored-by: @glauberdmo
2026-02-20 20:35:12 +01:00
David Heinemeier Hansson 44d9d17d21 Merge branch 'dev' into rc 2026-02-20 20:23:48 +01:00
David Heinemeier Hansson d3ab84bb05 Merge branch 'master' into dev 2026-02-20 20:23:43 +01:00
David Heinemeier Hansson cd01b3cedf Fix list 2026-02-20 20:23:31 +01:00
David Heinemeier Hansson 4db9620cb5 Merge branch 'master' into dev 2026-02-20 20:21:43 +01:00
David Heinemeier HanssonandGitHub 316bffa73d Merge pull request #2602 from saftacatalinmihai/scala-dev-env
Added Scala to the Deveopment Omarchy Menu and implementation
2026-02-20 20:20:45 +01:00
David Heinemeier Hansson 1babb32c05 Merge branch 'dev' into rc 2026-02-20 20:20:22 +01:00
Guido Vicino b50a388726 Fix low contrast for muted/faint text in Obsidian theme 2026-02-20 19:59:39 +01:00
guidovicinoandGitHub 5ef4426577 Add Tmux to the config refresh menu (#4671) 2026-02-20 19:39:34 +01:00
db3ba3501a Support single-key keyboard backlight cycling (#4672)
* Support single-key keyboard backlight cycling (like Asus F4) and add keyboard specific OSD icon

* We don't need an alias

---------

Co-authored-by: Ryan Latimer <ryan@example.com>
Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-02-20 19:37:55 +01:00
David Heinemeier Hansson f3f36e2525 Fix perms 2026-02-20 18:37:26 +01:00
Michael D LambertandGitHub e99afc98f8 Simplified battery percentage retrieval command (#2922)
* Simplified battery percentage retrieval command

Simplified the battery percentage extraction command.

* Used int instead of adding 0, put exit back in

Changed to use int.
Put exit back in to only return first battery in case of systems with multiple batteries.
2026-02-20 18:29:45 +01:00
David Heinemeier Hansson b14b9fb1e7 Merge branch 'dev' into rc 2026-02-20 18:13:24 +01:00
David Heinemeier Hansson 694eb8c698 Install vulkan drivers by default
Closes #2926
Co-authored-by: @ElBrodino
2026-02-20 18:12:54 +01:00
David Heinemeier Hansson 4cf3a6191b Add Super + Ctrl + Z to zoom in (repeat for more) and Super + Ctrl + Alt + Z to zoom out
Closes #2940
Co-authored-by: @pelephant2
2026-02-20 18:02:25 +01:00
David Heinemeier Hansson 667820fdd3 Merge branch 'dev' into rc 2026-02-20 17:53:16 +01:00
David Heinemeier Hansson 518349e490 Use new hyprland rules for changing the scrolltouchpad
Closes #4670
2026-02-20 17:53:02 +01:00
David Heinemeier Hansson e231697430 Raise inotify file watchers 2026-02-20 17:52:19 +01:00
David Heinemeier Hansson 645118830e Restart follows in second migration 2026-02-20 17:33:40 +01:00
88c8695ee5 Add full OSC 52 support to Alacritty configuration (#4603)
* Add full OSC 52 support to Alacritty configuration

* Simplify OSC 52 support addition in Alacritty config

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-02-20 17:32:37 +01:00
David Heinemeier Hansson f8aff270db Merge branch 'dev' into rc 2026-02-20 17:06:25 +01:00
David Heinemeier Hansson a493fc8b96 Humans would think vertical = vertical split, horizontal = horizontal split
Gotta love Linux nerds
2026-02-20 17:06:20 +01:00
David Heinemeier Hansson 5788da54af Use proper notification icons 2026-02-20 16:54:08 +01:00
David Heinemeier Hansson fcf883e827 Add notification silencing indicator to waybar 2026-02-20 16:52:09 +01:00
David Heinemeier Hansson bf962f0042 Add idle lock indicator 2026-02-20 16:48:36 +01:00
David Heinemeier Hansson 1303fa92fa Merge branch 'dev' into rc 2026-02-20 15:58:20 +01:00
David Heinemeier Hansson 87600497da Delay after sleep for PAM readiness before turning on display 2026-02-20 15:58:15 +01:00
David Heinemeier Hansson b98ff9a044 Merge branch 'dev' into rc 2026-02-20 15:55:53 +01:00
David Heinemeier Hansson 718ac2236c Attempt to fix PAM timing issue 2026-02-20 15:55:43 +01:00
David Heinemeier Hansson 0672cc4647 Merge branch 'dev' into rc 2026-02-20 15:53:22 +01:00
David Heinemeier Hansson ccc88a0111 Ensure config is available so starting the service immediately will work 2026-02-20 15:53:15 +01:00
David Heinemeier Hansson 0f4c64665e Merge branch 'dev' into rc 2026-02-20 15:06:49 +01:00
Dipesh BabuandGitHub 1fa33ce670 Fix typo (#4664)
* fix typo

* fix typo
2026-02-20 14:58:13 +01:00
Dipesh Babu 093a53b2a0 fix: add system-info alias for upload-log 2026-02-20 08:37:04 -05:00
David Heinemeier Hansson d7423c646d Merge branch 'dev' into rc 2026-02-20 08:28:24 +01:00
David Heinemeier Hansson a449e4f108 Fix wake 2026-02-20 07:52:49 +01:00
Dipesh Babu d04599a769 fix: append hyprland chromium flag as separate line 2026-02-19 23:15:38 -05:00
Dipesh BabuandGitHub f8df232902 docs: list deno and zig in install-dev-env usage (#4657) 2026-02-19 21:57:44 +01:00
Dipesh BabuandGitHub 5914d12c21 fix typo (#4658) 2026-02-19 21:44:12 +01:00
David Heinemeier Hansson 3b6174763c Merge branch 'dev' into rc 2026-02-19 21:33:16 +01:00
David Heinemeier Hansson 6d2e99f1c0 Restore opening present folder 2026-02-19 21:33:08 +01:00
David Heinemeier Hansson 5068e32044 Merge branch 'dev' into rc 2026-02-19 21:04:07 +01:00
David Heinemeier Hansson ae8b9b748b Have to start it right away 2026-02-19 21:03:55 +01:00
David Heinemeier Hansson c266a4d7f4 Correct offset to icon 2026-02-19 20:50:48 +01:00
David Heinemeier Hansson d27bc60be7 Correct offset to icon 2026-02-19 20:50:39 +01:00
David Heinemeier Hansson 88e86fa697 Match the new name 2026-02-19 20:44:00 +01:00
David Heinemeier Hansson 2a207f9e72 We don't need to restart walker 2026-02-19 20:42:07 +01:00
David Heinemeier Hansson 1f19ede7e3 Match art naming 2026-02-19 20:27:01 +01:00
David Heinemeier Hansson 0729f25905 Typo 2026-02-19 19:15:39 +01:00
David Heinemeier Hansson ea6311b80a Merge 2026-02-19 19:14:33 +01:00
Pierre Olivier MartelandGitHub 51cab758d0 Provide default icon URL if none given in omarchy-webapp-install (#4650) 2026-02-19 19:10:17 +01:00
David Heinemeier Hansson b17a22d47e Protect against nvim alias override
Closes #4558, #4559
Co-authored-by: @grumpydumpty
2026-02-19 19:03:44 +01:00
David Heinemeier Hansson 8a2e65e5d4 Silence the scaling notifications 2026-02-19 16:07:12 +01:00
David Heinemeier Hansson 83aa9aeb86 Ask before we close chromium and swap to mainline 2026-02-19 15:48:01 +01:00
David Heinemeier Hansson da0122c85a Allow proper downgrades of packages 2026-02-19 15:35:15 +01:00
David Heinemeier Hansson 2548395f8a Here too 2026-02-19 14:53:14 +01:00
David Heinemeier Hansson 9843f0a07e Allow for rc here too 2026-02-19 14:52:11 +01:00
5002279e3c Improve windows vm (#4512)
Co-authored-by: developer <developer@localhost>
2026-02-19 12:38:21 +01:00
Nate StottandGitHub ea14de4c37 Fix try init in bash when launched from fish shell (#4640)
The try command detects shell type from $SHELL variable. When bash is
launched from fish, $SHELL is still set to /usr/bin/fish, causing try
to output fish syntax which fails in bash with syntax errors.

Explicitly set SHELL=/bin/bash for the try init call to ensure correct
shell detection.
2026-02-19 12:36:04 +01:00
David Heinemeier Hansson 88f18727ae Too cumbersome to use on a laptop keyboard 2026-02-19 09:31:25 +01:00
zachfleemanandGitHub 4aeb4ab79e Fix firefox detection command in omarchy-launch-browser (#4641) 2026-02-19 07:58:07 +01:00
Pierre Olivier MartelandGitHub 055d9285b1 Unbind ctrl+shift+page_up/down in Ghostty config so it doesn't interfere with tmux keybindings (#4645)
* Unbind ctrl+shift+page_up/down in Ghostty config

* Add guard clause
2026-02-19 07:53:03 +01:00
David Heinemeier Hansson 0feb35a436 Use consistent width like theme selector 2026-02-18 22:45:41 +01:00
David Heinemeier Hansson c254f890aa Named for direct selection 2026-02-18 22:42:43 +01:00
6b4109faba Background selector (#4519)
* UPDATE: select background method

* ADD: migration file for background selector

* Add symlink for background selector in walker-elephant.sh

Forgot about this file. Should be added to make sure the background selector feature available in the fresh install

* clean up the code a bit

Updated omarchy background selector to hide from provider list and removed subtext from entries.

* Make the background selector the default

* Fix migration

* FIX: typo on background symlink target

* UPDATE: add ~/.config/omarchy/backgrounds/theme.name

* UPDATE: Cache = false

* Fix escaping for all extensions

* Extract omarchy-theme-bg-set

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-02-18 22:24:43 +01:00
Tommy MartinandGitHub eec15803fc Allow user themes to override individual files from official themes (#4547)
Instead of choosing exclusively between the official or user theme
directory, copy the official theme first, then overlay any user
customizations on top. This allows users to override specific files
(e.g. colors, backgrounds, keyboard backlight) without having to
duplicate the entire theme.
2026-02-18 22:07:49 +01:00
73dc11286b make omarchy-launch-browser check for firefox exclusive flag to detect base (#4572)
Co-authored-by: Mrid22 <mridulaga@outlook.com>
2026-02-18 21:59:05 +01:00
David Heinemeier Hansson 3657b1bc84 Quiet the output and give it a header 2026-02-18 21:40:38 +01:00
David Heinemeier Hansson c47bb34c25 Don't halt, just update 2026-02-18 21:34:12 +01:00
David Heinemeier Hansson b2d09849bd Actually was missing! 2026-02-18 21:33:58 +01:00
Diogo FerreiraandGitHub a3cdd187c9 update: Update archlinux-keyring before updating packages (#4639)
Maintainer keys might have been added/revoked, let's ensure that we have
the latest before updating the packages, otherwise users might have to
do this manually.

Fixes https://github.com/basecamp/omarchy/issues/4608
2026-02-18 21:33:32 +01:00
James BarsonandGitHub 15a847474b Adds completion cycle to inputrc (#4634) 2026-02-18 21:26:41 +01:00
Steve GodlewskiandGitHub 43ae186a80 Add Framework 16 RGB keyboard theme syncing (#4524)
* Add framwork 16 RGB syncing

* fixed install script, fixed color changing when style changes

* added framework scripts to the main install scripts

* renamed theme-set scripts, added migration

* use omarchy-pkg-add, shared keyboard template, tracked udev rule

* call the install file from the migration file
2026-02-18 21:19:30 +01:00
David Heinemeier Hansson 5f978a9ea9 Excess CR 2026-02-18 21:10:27 +01:00
David Heinemeier Hansson 7d011c0249 Match 2026-02-18 21:10:07 +01:00
David Heinemeier Hansson ab52d79ef2 Excess 2026-02-18 21:09:54 +01:00
David Heinemeier Hansson 082e870f06 Need a way to kill the pane 2026-02-18 21:09:28 +01:00
David Heinemeier Hansson 940914cffc Similar groupings 2026-02-18 20:50:33 +01:00
David Heinemeier Hansson 3757955b4b Yank this until we can find a compatible way to bring it back
I ain't giving up ctrl+l to clear the scrollback!
2026-02-18 18:39:25 +01:00
David Heinemeier Hansson 7a19cee727 Take out for now
Was starting tmux inside tmux for some reason
2026-02-18 18:04:13 +01:00
David Heinemeier Hansson b68afc10b5 Fix perms 2026-02-18 17:58:46 +01:00
David Heinemeier Hansson 3484b85439 Version 3.4.0 2026-02-18 17:56:29 +01:00
David Heinemeier Hansson d96ff4e556 Just rely on Hyprland finding the right nearest valid scale 2026-02-18 15:51:14 +01:00
David Heinemeier Hansson 965778b8ea Work with any resolution monitor 2026-02-18 15:32:46 +01:00
David Heinemeier Hansson aebc554efe Tweak language 2026-02-18 15:29:24 +01:00
David Heinemeier Hansson 43fffc4474 Excess CR 2026-02-18 12:52:51 +01:00
David Heinemeier Hansson e1d2b996b0 Too loud/scary for no actionable benefit right at the end 2026-02-18 12:51:48 +01:00
David Heinemeier Hansson 4079c57fc7 Make this the nord default 2026-02-18 10:40:29 +01:00
David Heinemeier Hansson d36c9d0a77 Merge branch 'master' into dev 2026-02-18 09:33:24 +01:00
David Heinemeier Hansson ff217012fc Cure Chromium crash bug caused by mixing 145 and 144 sync logs 2026-02-18 09:30:04 +01:00
David Heinemeier Hansson 0c5cb0480f Cure Chromium crash bug caused by mixing 145 and 144 sync logs 2026-02-18 09:28:58 +01:00
David Heinemeier Hansson 4119824b31 Merge branch 'master' into dev 2026-02-18 09:25:19 +01:00
David Heinemeier Hansson 0c50bd893f So the migration doesn't appear anonymous even when lmstudio isn't installed 2026-02-18 09:25:14 +01:00
David Heinemeier Hansson 7305152414 Add third background to Nord 2026-02-18 08:27:20 +01:00
Ryan Hughes 35f527f643 Add vim-tmux-navigator for seamless pane navigation 2026-02-17 23:27:16 -05:00
Ryan HughesandGitHub f0c5b97546 Merge pull request #4286 from robzolkos/add-no-audio-screenrecord
Add "Without audio" option to screenrecord menu
2026-02-17 16:28:53 -05:00
Ryan Hughes 5df1cd6523 Add cx alias 2026-02-17 16:12:22 -05:00
Ryan Hughes 55cb2498b3 Hotfix: Swap lmstudio -> lmstudio-bin 2026-02-17 16:07:39 -05:00
Ryan Hughes 69617397f5 Allow tmux layout to work outside of tmux 2026-02-17 16:02:09 -05:00
dhimasandGitHub 7bb35f82ae UPDATE: omarchy-aur-install add sudo -v (#4631) 2026-02-17 21:24:44 +01:00
David Heinemeier Hansson 34f0a4215d Four-way 2026-02-17 17:59:16 +01:00
David Heinemeier Hansson 47863b2408 Add 1.6x as option too 2026-02-17 17:59:03 +01:00
David Heinemeier Hansson de4d866754 Two new ones 2026-02-17 17:57:02 +01:00
David Heinemeier Hansson ec76c2acdb Add Super + Ctrl + Alt + Backspace to toggle single-window square aspect ratio 2026-02-17 17:55:43 +01:00
David Heinemeier Hansson f6719b1784 Add Super + Ctrl + Backspace to toggle resolution between 1-2-3x 2026-02-17 17:55:19 +01:00
David Heinemeier Hansson 6ef727ab0b Merge branch 'master' into dev 2026-02-17 17:32:48 +01:00
David Heinemeier Hansson 106d664573 Just the changes 2026-02-17 17:31:10 +01:00
David Heinemeier Hansson 70a188a5cd Start tracking changes in md files inside 2026-02-17 17:30:58 +01:00
Rob ZolkosandGitHub dce2f62071 Merge branch 'basecamp:dev' into add-no-audio-screenrecord 2026-02-17 10:40:00 -05:00
David Heinemeier Hansson d346f5d522 Style 2026-02-17 12:12:30 +01:00
David Heinemeier Hansson f152ff68ea Tweak screenshot notification 2026-02-17 12:11:48 +01:00
David Heinemeier Hansson 01d7296616 We no longer need early exit since default is not to edit
Closes #4569
2026-02-17 12:07:47 +01:00
David Heinemeier Hansson b573a37e33 Ensure packages available on both AUR and other repos are installed from AUR
Closes #4578, #4577, #4581
2026-02-17 12:03:04 +01:00
David Heinemeier HanssonandGitHub 68b4939993 Revert "fix(aur): add -a flag to yay command to assume AUR packages (#4581)" (#4627)
This reverts commit b3dd14a038.
2026-02-17 11:55:28 +01:00
Andrej BenzandGitHub b3dd14a038 fix(aur): add -a flag to yay command to assume AUR packages (#4581) 2026-02-17 11:53:39 +01:00
7dc638358b disable opencode auto-update feature as we rely on pacman (#4582)
* disable opencode auto-update feature as we rely on pacman

* Refreshing already produces a .bak, so that's enough

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-02-17 11:42:54 +01:00
David Heinemeier Hansson 3e07255fbc Better split 2026-02-17 11:26:41 +01:00
David Heinemeier Hansson 02fd1961b9 Interactive drive picker if a drive is not selected
Co-authored-by: @Mrid22
Closes #4596
2026-02-17 11:25:09 +01:00
Shreyansh MalviyaandGitHub 40bff09c84 Remove Wayland color manager disabling flag from Chromium configs (#4610) (#4615)
Signed-off-by: Shreyansh Malviya <shreyanshmalviya0012@gmail.com>
2026-02-17 10:51:24 +01:00
David Heinemeier Hansson 6ff13fc071 These are window keys, not pane keys 2026-02-16 21:52:19 +01:00
David Heinemeier Hansson a33cf4f287 Reload the config live when we refresh 2026-02-16 21:48:21 +01:00
David Heinemeier Hansson 2e2d78088a Direct access to windows 2026-02-16 21:47:08 +01:00
David Heinemeier Hansson b1af966819 Go straight to the new unified screenshot flow 2026-02-16 14:27:29 +01:00
David Heinemeier Hansson e055358721 Add eff to open the result of the fuzzy find directly in your editor 2026-02-16 14:08:14 +01:00
David Heinemeier Hansson 8b6e2466a3 Add the tmux dev layout 2026-02-16 10:33:56 +01:00
David Heinemeier Hansson 560500d8ec Allow passthrough 2026-02-16 10:26:31 +01:00
[1;13DDavid Heinemeier Hansson 9aff0d4b3b Note about consequences 2026-02-15 23:06:07 +01:00
Horace KoandGitHub 463417a281 Use a thin space to increase spacing between Omarchy glyph and its label. (#4586) 2026-02-13 18:43:23 +01:00
David Heinemeier Hansson bcd52fa289 Switch back to mainline chromium
We no longer need the fork, as the themeing is now fully natively
supported
2026-02-13 18:08:42 +01:00
Ryan Hughes bbb57e98c1 Update screenshot behavior
- Unifies screenshot to a single shortcut
- Provides easy override for screenshot editor of choice via env var or
flag
- Edit screenshots via clicking the notification
- Screenshots are copied to clipboard + saved by default
2026-02-12 17:04:48 -05:00
David Heinemeier Hansson e38dd063a6 Latest version 2026-02-12 11:20:47 +01:00
David Heinemeier Hansson a4d6e3ab03 More natural this way 2026-02-11 22:53:12 +01:00
David Heinemeier Hansson fc529b368d Match direction from the sessino list 2026-02-11 16:46:05 +01:00
David Heinemeier Hansson ce01b6e0d6 Improve navigation ease 2026-02-11 14:17:32 +01:00
David Heinemeier Hansson 450d4dd82b No wifi power saving when connected to power 2026-02-11 14:06:52 +01:00
David Heinemeier Hansson 8895384b0e This is producing double pastes everywhere else 2026-02-11 12:22:58 +01:00
David Heinemeier Hansson e4b7372666 Cannot get suspend to hibernate to work consistently across different laptops
Too many failures where it's stuck in a suspend-wake-up loop
2026-02-10 14:07:40 +01:00
David Heinemeier Hansson a30448ceec Allow the ssh forwarding functions to take multiple ports 2026-02-10 13:39:48 +01:00
David Heinemeier Hanssonand@naxels 4fadf666e6 Add nautilus compatibility with the unified clipboard commands
Co-authored-by: @naxels
2026-02-10 12:32:56 +01:00
David Heinemeier Hansson 07ede07193 Add port forwarding functions for web dev
So we can forward a port on localhost to an Omaterm
2026-02-10 12:00:04 +01:00
David Heinemeier Hansson 527819b750 Rely on alt-arrow doing 5s, then shift-arrow does 1s 2026-02-10 11:30:03 +01:00
David Heinemeier Hansson 98bfe20839 Add example of using alacritty with ssh
Since ghostty requires the TERM setting thing which is a bit odd
2026-02-10 10:20:21 +01:00
David Heinemeier Hansson 4d48409926 Just rely on terminal for coloring
We don't need a full theme
2026-02-10 08:31:15 +01:00
David Heinemeier HanssonandGitHub ffafe1727e Add Tmux (#4562)
* Add Tmux

Being able to use a unified terminal setup between local and remote
hosts has some real advantages.

* Renaming is more important than reloading

* Self-explanatory, really

* Add alias for it

* Attach to last used session or start a new if we have none

* Just stick to n/p

* Make it a clean 10x

* We don't need this

* Keep similar fixes together

* Keep bindings together

* Hate looking at that 0

* Add way to refresh theme from its templates (when they've changed)

* Fix
2026-02-09 23:01:46 +01:00
SerpentandGitHub f2f306269a Avoid error if opencode isn't running. (#4566) 2026-02-09 22:58:34 +01:00
David Heinemeier Hansson e4913ca2db Update boot entry 2026-02-09 22:34:43 +01:00
David Heinemeier HanssonandGitHub ff234bba1f Ensure Walker can't just die and stay dead (#4555) 2026-02-09 13:08:13 +01:00
David Heinemeier Hansson ecf48a3b4c Use ACPI alarm for RTC wakeup on s2idle systems for hibernation 2026-02-08 11:27:49 +01:00
David Heinemeier Hansson 74eea9e716 The AC Power detection is buggy on several laptops
Just commit to always going from suspend to hibernate on the specified
delay
2026-02-08 10:22:39 +01:00
David Heinemeier Hansson 66cb888a2e Don't try to hibernate based on battery level checks
We just rely on the fixed hibernate delay
2026-02-08 09:09:16 +01:00
David Heinemeier Hansson 0a5755e51f Pick something that doesn't conflict with existing command 2026-02-08 08:42:14 +01:00
bjarneoandGitHub 7bd5bf25cd Remove the aether.nvim dependency (#4543)
* Remove the aether.nvim dependency

* Fix a blooper
2026-02-07 22:16:21 +01:00
bjarneoandGitHub 0c9b38e507 Set the aether dependency using v2 directly (#4537)
* Set the aether dependency using v2 directly

* Format the object properly
2026-02-07 15:53:05 +01:00
David Heinemeier Hansson 0e2ed5439e Suggestion for claude 2026-02-07 15:32:12 +01:00
David Heinemeier Hansson 75a0ee6149 Follow existing naming convention 2026-02-07 14:09:16 +01:00
Sameer PaudelandGitHub 2c9c0f883a Enable Synaptics InterTouch for confirmed touchpads if not already loaded (#4499)
* Enable Synaptics InterTouch for confirmed touchpads if not already loaded

* fix echo message

* remove shebang and echo messages

* check for synaptics intertouch and enable it only if available
2026-02-07 14:07:01 +01:00
8a58b8153c delete snapshot if update fails since it takes up space, esspecially when redoing the update as it makes another snapshot (#4531)
Co-authored-by: Mrid22 <mridulaga@outlook.com>
2026-02-07 12:37:58 +01:00
David Heinemeier Hansson badd1f8495 Reorder backgrounds for default 2026-02-07 12:35:27 +01:00
David Heinemeier Hansson 67ee1450f0 Add aether to the preinstalls removal list 2026-02-07 12:33:18 +01:00
bjarneoandGitHub c289cd0730 Add vantablack theme (#4533) 2026-02-07 11:23:27 +01:00
David Heinemeier Hansson cbcd0e49be Not used/needed 2026-02-07 11:22:28 +01:00
David Heinemeier Hansson ae45f06847 Fix gum confirm color for no 2026-02-07 11:06:35 +01:00
David Heinemeier Hansson 1070a87a47 Add option to remove all preinstalls
To get a bare-bones Omarchy
2026-02-07 11:05:56 +01:00
David Heinemeier Hansson 9741b29a7c Describe the rest of the bins 2026-02-07 10:50:48 +01:00
David Heinemeier Hansson ea24b0dc68 Setup hibernation by default on new installs 2026-02-07 10:45:24 +01:00
David Heinemeier Hansson 3bbb57b54d Use real config files as much as possible 2026-02-07 10:37:39 +01:00
David Heinemeier Hansson ebfb7f16e8 Raise sleep-to-hibernate to survive a long lunch 2026-02-07 10:18:01 +01:00
Ryan HughesandGitHub 347afae8c0 Merge pull request #4491 from johnzfitch/fix/pascal-maxwell-nvidia-backend
Expanded Legacy NVIDIA GPU support with correct backend selection
2026-02-07 01:24:30 -05:00
Ryan Hughes ebfcefa553 Consolidate migration sed cleanup and quote heredoc paths 2026-02-07 00:34:13 -05:00
David Heinemeier Hansson 2087d96ad8 Fix perms 2026-02-06 22:08:23 +01:00
David Heinemeier Hansson b638cbc57a Revert "Fix Realtek RTL8111/8168 ethernet adapter support for ASUS TUF Gaming laptops (#4497)"
This reverts commit cf72c02ea5.
2026-02-06 18:22:14 +01:00
David Heinemeier Hansson 636a7cefda Actually run the yt6801 fix 2026-02-06 17:41:44 +01:00
David Heinemeier Hansson f7e22fcfd8 Fix IO pressure on some machines with Ghostty 2026-02-06 17:19:47 +01:00
Nicolas DorierandGitHub b0e8a4dcea Fix: High IO pressure caused by ghostty (#4507) 2026-02-06 16:51:18 +01:00
amrxtghandGitHub f57234b991 fix: simple typo in omarchy-launch-walker (#4514) 2026-02-06 16:48:21 +01:00
David Heinemeier Hansson be7f316371 Add Super + Shift + Return for browser binding to existing installs 2026-02-06 12:03:37 +01:00
David Heinemeier Hansson b1553d3b31 Add Super + Shift + Return as an alternative for launching the browser 2026-02-06 12:00:55 +01:00
David Heinemeier Hansson 055e969a56 Let's help our agent friends a little to understand the Omarchy code base 2026-02-06 11:32:03 +01:00
David Heinemeier Hansson 050899e5b3 Echo the migration description 2026-02-06 11:25:05 +01:00
David Heinemeier Hansson bd8b12b23b Ensure hyprlock only looks for a fingerprint auth when that's configured
This should eradicate the first failed auth attempt after
sleep/hibernation
2026-02-06 11:24:12 +01:00
David Heinemeier Hansson c268fb6c9b Turn off backlighting before sleep
So it cant keep the computer awake
2026-02-06 11:16:18 +01:00
David Heinemeier Hansson 248a7a611b Fix perms 2026-02-05 14:48:21 +01:00
David Heinemeier Hansson e487dace43 Install asusctl on ROG machines to get out-of-the-box keyboard light sync 2026-02-05 09:23:00 +01:00
David Heinemeier Hansson ba14cd36dd Sync keyboard colors with theme if asusctl is installed 2026-02-05 09:05:30 +01:00
David Heinemeier Hansson 34b22a23f6 Revert "Fix correct suspend-then-hibernate options"
This reverts commit f0d5c35271.
2026-02-04 21:56:34 +01:00
David Heinemeier Hansson f0d5c35271 Fix correct suspend-then-hibernate options
So we don't try to hibernate when sleeping while on power
2026-02-04 21:54:26 +01:00
David Heinemeier Hansson 63fc96a541 Timeout isn't actually nice in reality 2026-02-04 21:43:41 +01:00
Nathan NutterandGitHub 4ba39ba73c Prevent premature exit of omarchy-update-firmware (#4503)
This adds the `--force` option to `fwupdmgr refresh` so that this script will not exit, due to `set -e`, when `fwupdmgr refresh` exits non-zero due to the metadata being up-to-date, i.e.,

```
Metadata is up to date; use --force to refresh again.
```

Another option would be to use `|| true` but that might hide a legitimate error.

This was motivated when I cancelled a run of this script and then later invoked it again, via Update > Firmware, and it would not run `sudo fwupdmgr update` because `fwupdmgr refresh` was exiting non-zero with the above metadata up-to-date "error".
2026-02-04 21:41:14 +01:00
LewisandGitHub 1a14938382 Update style path in swayosd config (#4502) 2026-02-04 21:35:44 +01:00
Pierre Olivier MartelandGitHub 9581cce1af Fix Windows VM timezone and add a confirmation prompt before removing the VM (#4489)
* Add confirmation prompt before removing Windows VM

* Fix Windows VM timezone defaults to UTC
2026-02-04 10:46:15 +01:00
JamoladdinandGitHub cf72c02ea5 Fix Realtek RTL8111/8168 ethernet adapter support for ASUS TUF Gaming laptops (#4497) 2026-02-04 10:18:56 +01:00
johnzfitch a8ce084460 Fix NVIDIA environment variables for Maxwell/Pascal/Volta GPUs
Maxwell, Pascal, and Volta GPUs lack GSP (GPU System Processor) firmware
required by NVD_BACKEND=direct. Applying direct backend unconditionally
causes Aquamarine v3.3.0+ to fail with "Unknown-1" displays and blank screens.

Changes:
- Add GPU generation detection (Turing+ vs Maxwell/Pascal/Volta)
- Turing+ (RTX 20xx+, GTX 16xx): NVD_BACKEND=direct + LIBVA_DRIVER_NAME=nvidia
- Maxwell/Pascal/Volta: NVD_BACKEND=egl only (no GSP support)
- Both generations: __GLX_VENDOR_LIBRARY_NAME=nvidia (universal)

Regex improvements:
- Fix Turing+ detection (was using Maxwell/Pascal pattern)
- GT series: GT 1030 now properly detected (was missed)
- Quadro: P/M series only (exclude Kepler K-series)
- Volta: Titan V, Tesla V100, Quadro GV100
- Modern datacenter: A100, H100, T4, L-series
- MX series: Fixed to match MX150/250/450 (was only MX1-9)

Migration script (1770159912.sh) fixes existing broken installations by:
- Detecting legacy NVIDIA GPUs on existing systems
- Rewriting incompatible NVD_BACKEND=direct entries to egl
- Creating automatic backups before modification

Testing:
Validated against GT 1030, GTX 960/1080, Quadro P620 (legacy egl backend)
and GTX 1650, RTX 3080 (modern direct backend).

Preserves existing Turing+ behavior exactly. No impact on non-NVIDIA systems.

Fixes hyprwm/Hyprland#7001
Fixes hyprwm/Hyprland#8519
Fixes hyprwm/Hyprland#6343
Fixes hyprwm/Hyprland#7812
2026-02-03 17:33:48 -08:00
Pierre Olivier MartelandGitHub 4b3e21445b Don't apply power profile source switching if only one profile is available (#4485) 2026-02-03 16:18:24 +01:00
David Heinemeier Hansson 8878478103 Prevent broken AUR updates from interrupted git sessions
Co-authored-by: @scale03
Closes #3995, #3917
2026-02-02 21:16:23 +01:00
David Heinemeier Hansson 74ff475693 Didn't end up being all that useful 2026-02-02 20:45:01 +01:00
David Heinemeier Hansson 22f64160f5 Fix branch setter 2026-02-02 17:04:36 +01:00
David Heinemeier Hansson ea76f8196c Add Motorcomm YT6801 ethernet adapter driver for Slimbook + Tuxedo ethernet adapters 2026-02-02 17:03:53 +01:00
Jamer Rebolledo d8660fd2c8 feat: add NordVPN to installable services with optional GUI
- Add omarchy-install-nordvpn script that:
  - Installs nordvpn-bin from AUR
  - Enables nordvpnd daemon
  - Adds user to nordvpn group
  - Optionally installs NordVPN GUI with TUI entry
  - Detects existing GUI installation to avoid conflicts

- Add NordVPN option to Install > Service menu with 󱇱 icon
2026-02-01 23:59:00 -05:00
James RobeyandGitHub 49a2941e2b Sanitize prompt before starship init (#4269)
Add prompt sanitization to clear stale terminal line state after abnormal exits, preventing prompt artifacts.
2026-02-01 17:49:59 +01:00
David Heinemeier Hansson 6a5b64b4bc Add the new wiremix icon if there isn't already a wiremix config 2026-02-01 17:47:57 +01:00
l1ghtyandGitHub c484b66bcb wiremix: less confusing audio default device character (#4404) 2026-02-01 17:46:07 +01:00
David Heinemeier Hansson 87da28a965 Fix the video PWAs 2026-02-01 17:39:26 +01:00
David Heinemeier Hansson 23b74c6212 Fix opacity issues by using a tag to apply the default opacity that can be removed
Fixes #4168
2026-02-01 16:30:27 +01:00
David Heinemeier Hansson 69dbee75cd Match existing term 2026-01-31 21:59:32 +01:00
David Heinemeier Hansson d9c5df29d1 DRY 2026-01-31 21:58:29 +01:00
David Heinemeier Hansson 7c9708d647 Respect rc too 2026-01-31 21:52:09 +01:00
David Heinemeier Hansson 5a9f0318e8 Respect rc 2026-01-31 21:51:18 +01:00
David Heinemeier Hansson ab4694e3f5 Introduce rc channel 2026-01-31 21:49:07 +01:00
David Heinemeier Hansson bebf14a18c In order of appearance 2026-01-31 18:14:47 +01:00
ff2a47c67e feat: allow overloading for the about menu action via the ~/.config/omarchy/extensions/menu.sh file. Example included (#4311)
Co-authored-by: Bhavesh Sooka <bhavesh@synthesis.co.za>
2026-01-31 18:14:25 +01:00
schwepmoandGitHub d9bd4a8db3 Open Nautilus in cwd of terminal (#4331)
* feat: Open Nautilus (files) in cwd of terminal using omarchy-cmd-termina-cwd

* feat: Add SUPER+ALT+SHIFT+F shortcut to open nautilus in cwd

* added migration script for nautilus keybind
2026-01-31 18:12:29 +01:00
Pierre Olivier MartelandGitHub 8fc5b6e346 Add nautilus-python package for 'Open in Ghostty' shortcut in Nautilus (#4345) 2026-01-31 18:11:32 +01:00
nptrandGitHub 7265c22728 Update opacity rule for Steam window class (#4386)
The steam class for opacity is missing the `.*` regular expression. Just `steam` does not match launched steam apps. Therefore, currently, steam apps have the default opacity of `0.97` of omarchy. This is usually not noticable, but very distracting on an OLED Screen and Games with dark/black scenes / menues and a brigher / any app opend 'behind' the game.
2026-01-31 18:06:11 +01:00
Stefan GründelandGitHub 32d187eab0 Add window rules for Bitwarden Chrome Extension (#4389) 2026-01-31 18:02:17 +01:00
David Heinemeier Hansson c19fc1593a Just make a separate browser ready for the authentication
Seems like the entire problem was just that GFN didn't want to
authenticate against a browser process it had started itself.
2026-01-31 15:36:27 +01:00
David Heinemeier Hansson 7ffdfdbda9 Only idleinhibit
Fullscreen does not work well with authentication
2026-01-31 15:35:46 +01:00
David Heinemeier Hansson 161fa3f313 Fix up the installer 2026-01-31 14:37:16 +01:00
David Heinemeier Hansson d6c28f317d Force fullscreen
Floating just makes it crash
2026-01-31 13:27:57 +01:00
David Heinemeier Hansson 4348ab6ef1 Let the done screen time out in 7 seconds 2026-01-31 12:43:34 +01:00
David Heinemeier Hansson 9d07cc884c Add installer and windowrule configuration for NVIDIA GeForce Now 2026-01-31 12:35:35 +01:00
David Heinemeier Hansson ba31e3073c Ensure master volume isn't muted either 2026-01-30 19:02:51 +01:00
Ryan Hughes 2df5f231cb Add x11 fallback to SDL_VIDEODRIVER for compatibility 2026-01-30 12:46:13 -05:00
Pierre Olivier MartelandGitHub 26afde34ff fix echo comment in powerprofile migration (#4388) 2026-01-30 12:25:39 +01:00
Nicolas DorierandGitHub 3b94207ba7 Fix: Jetbrains rules were not working properly anymore (#4150) 2026-01-30 11:51:33 +01:00
David Heinemeier Hansson e567020e1b Use the new helper 2026-01-29 17:38:50 +01:00
Pierre Olivier MartelandGitHub f78f5b2c2c Automatically switch power profile when plugged in (balanced) and unplugged (power saver) (#4375)
* Set Power Profiles Rules when plugged in (balanced) and unplugged (power-saver)"

* Check for battery presence before installing power profile rules

* Add battery presence check script and update powerprofilesctl rules

* fix indentation

* Simplify power profile rule creation logic
2026-01-29 17:37:18 +01:00
Ryan Hughes ec305459f8 Prevent Telegram from stealing focus on every message receipt 2026-01-29 10:24:25 -05:00
David Heinemeier Hansson 55231e9726 Add new Miasma theme
Original by OldJobobo
2026-01-29 11:42:07 +01:00
David Heinemeier Hansson a8e0762fbe Open directories in file manager 2026-01-29 10:29:56 +01:00
David Heinemeier Hansson bb91f90839 Merge branch 'master' into dev 2026-01-28 18:03:43 +01:00
David Heinemeier Hansson a7995efac2 Ensure master is used instead of dev as a default 2026-01-28 17:14:17 +01:00
David Heinemeier Hansson 5b534de6a0 Rebooting is needed for hibernation to be available 2026-01-28 13:59:11 +01:00
David Heinemeier Hansson 4fe357972e We didn't get this working 2026-01-28 13:42:55 +01:00
David Heinemeier Hansson 7015601d77 No need to start on the first install 2026-01-28 13:24:39 +01:00
David Heinemeier Hansson 532f4310d0 Fix audio mixing on ROG in migration as well 2026-01-28 12:20:20 +01:00
David Heinemeier Hansson 56b02f62b5 Switch back to mainline chromium
We no longer need the fork, as the themeing is now fully natively
supported
2026-01-28 09:49:42 +01:00
Ryan HughesandGitHub 83628ab3bd Merge pull request #4314 from jmargeta/fix-legacy-mobile-nvidia-cards
Fix driver for older NVIDIA MXxxx mobile GPUs
2026-01-27 09:41:05 -05:00
mitanjanandGitHub d89614248b auto toggle scratchpad on switching workspace (#4250) 2026-01-27 11:47:27 +01:00
ManuelandGitHub 77a57aa838 Add kb_variant to input.conf (#4330)
* add kb_variant to input.conf

* documentation + separation
2026-01-27 11:43:59 +01:00
e455d1bd68 Enable auto-pasting for the emoji picker (#4344)
* Enable auto-pasting for the emoji picker

* Excess CR

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-01-27 11:42:42 +01:00
James RobeyandGitHub adfe182984 Use subshell for open() to avoid job control output (#4366)
If it is not run as a sub-shell, using open and then subsequently closing the app will pollute the existing terminal with messages like:
  [1] 287915
  [1]+  Done  xdg-open "$@" > /dev/null 2>&1

Making it a subshell removes this noise and keeps it more like the open command in macOS.
2026-01-27 11:34:16 +01:00
DominikandDavid Heinemeier Hansson febd18ce84 Replace yq with pure bash for TOML parsing (#4171)
* Replace yq with pure bash for TOML parsing

The yq-based parsing only worked with jq/yq v3 and broke with go-yq v4.
This change removes the yq and uses bash for parsing. Some additional improvments:
- Handles single and double quoted values
- Strips inline comments (e.g. "#hex" #comment)

* Remove the no-longer-needed yq packages

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-01-27 11:32:37 +01:00
Rob Zolkos 4bbf3be8f0 Add without audio option to screenrecord menu 2026-01-23 13:51:45 -05:00
MarcoGitHubincpo <nixusnekit>Ryan Hughes
768c553c4c Add missing icons to Development remove menus (#4339)
* Add missing icons to Development remove menus

The Install > Development menu shows icons for each language, but the
Remove > Development menu was missing them (only Ruby on Rails had its
icon). This adds the matching icons to:

- show_remove_development_menu
- show_remove_javascript_menu
- show_remove_php_menu
- show_remove_elixir_menu

---------

Co-authored-by: incpo <nixusnekit>
Co-authored-by: Ryan Hughes <ryan@heyoodle.com>
2026-01-23 08:26:30 -05:00
David Heinemeier Hansson bf99a2ddc0 Merge branch 'master' into dev 2026-01-23 08:25:43 -05:00
David Heinemeier Hansson 0930583526 Fix sourcing 2026-01-20 16:12:51 -04:00
David Heinemeier Hansson 4a6baafd05 Move all fixes for Asus ROGs to install time 2026-01-20 12:11:49 -04:00
David Heinemeier Hansson c1bf6c4694 Fix the mic on Asus ROG laptops 2026-01-20 11:59:12 -04:00
David Heinemeier Hansson 66daacb30d Now available on OPR 2026-01-20 09:45:35 -04:00
Jan Margeta 5b2c0dafbf Fix drivers for older NVIDIA MXxxx mobile GPUs
Installs legacy drivers for older Pascal and Maxwell GPUs MXxx, MX2xx, MX3xx
2026-01-20 13:45:32 +01:00
David Heinemeier Hansson 988418aea1 Make purpose clearer 2026-01-20 08:16:03 -04:00
David Heinemeier Hansson 25451f4a03 Compensate for swayosd not liking a 0.00 progress meter 2026-01-19 17:55:38 -04:00
David Heinemeier Hansson d884265d46 Add keyboard brightness controls 2026-01-19 17:53:19 -04:00
David Heinemeier Hansson 5e1ce16358 Centralize all brightness commands 2026-01-19 17:49:53 -04:00
David Heinemeier Hansson 713b6e3a36 Expose audio soft mixer as a tweak 2026-01-19 17:20:18 -04:00
David Heinemeier HanssonandGitHub 2c7b283aef Toggle hybrid GPU mode via supergfxctl (#4277)
* Toggle hybrid GPU mode via supergfxctl

Very useful for Asus G14 and other laptops with NVIDIA + AMD iGPU
combos.

* Use correct exit

* Simplify

* Wording

* Revise switching process

* Spacing

* These are sudo actions

* Make it exe

* No need for extensions

Matches existing style

* Relying on the new config should be enough since we are restarting anyway

* Prevent race condition

* Reminder to add to OPR
2026-01-19 17:11:23 -04:00
Paul Repin 2915572bca Sets partition type to msftdata 2026-01-17 16:23:27 +03:00
Shawn YeagerandClaude Opus 4.5 ac3c161fb5 Fix Bluetooth device showing bluez ID instead of friendly name
For Bluetooth audio devices, the friendly name (e.g., "Shawn's AirPods Max")
is stored on the Device entry in wpctl, not the Sink entry. The previous fix
looked up object.id (the sink), which shows the raw bluez ID like
"bluez_output.90:9C:4A:EE:01:1C".

This fix looks up device.id first to get the friendly name from the Device
entry, falling back to object.id for non-Bluetooth devices.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-14 10:37:57 -06:00
Ryan HughesandGitHub ed9a4a45ba Merge pull request #4247 from incpo/feat/webcam-source-selection
Add webcam source selection for screen recording
2026-01-13 18:31:44 -05:00
incpo 697d09022a Add webcam source selection for screen recording
- Add --webcam-device argument to omarchy-cmd-screenrecord
- Auto-detect first available webcam if none specified
- Add webcam selection UI in omarchy-menu when multiple cameras available
- Skip selection UI when only one webcam is detected
2026-01-13 12:48:00 +03:00
Diogo Ferreira bee9c892fb kernel: Keep modules functional after a kernel upgrade
When a kernel upgrade is taken in, we replace current modules with new
ones and they are not available until we reboot. This can cause the
system to appear broken, especially when plugging new hardwaare like a
pen drive or odd input device.

This patch adds kernel-modules-hook which keeps the current modules even
if the package is replaced. A one-off clean-up service runs on startup
  to remove older modules.
2026-01-12 16:53:12 +00:00
Hatta Pauzi b5a5b54be5 Added a reminder to run omarchy-restart-xcompose to apply changes 2025-12-02 12:32:25 +08:00
riozee 95f1f312b4 Fix: omarchy-cmd-screenshot geometry for transformed monitors 2025-10-29 12:16:57 +09:00
Timo HuboisandGitHub 80c63f4167 feat(docker): use socket activation instead of autostart 2025-10-26 12:00:31 +01:00
Safta Catalin MihaiandGitHub 795873d3a3 Added Scala dev env 2025-10-20 12:21:40 +03:00
395 changed files with 3112 additions and 1080 deletions
+67
View File
@@ -0,0 +1,67 @@
# Style
- Two spaces for indentation, no tabs
- Use bash 5 conditionals: use `[[ ]]` for string/file tests and `(( ))` for numeric tests
- In `[[ ]]`, don't quote variables, but do quote string literals when comparing values (e.g., `[[ $branch == "dev" ]]`)
- Prefer `(( ))` over numeric operators inside `[[ ]]` (e.g., `(( count < 50 ))`, not `[[ $count -lt 50 ]]`)
- For strings/paths with spaces, quote them instead of escaping spaces with `\ ` (e.g., `"$APP_DIR/Disk Usage.desktop"`, not `$APP_DIR/Disk\ Usage.desktop`)
- Shebangs must use `#!/bin/bash` consistently (never `#!/usr/bin/env bash`)
# Command Naming
All commands start with `omarchy-`. Prefixes indicate purpose:
- `cmd-` - check if commands exist, misc utility commands
- `pkg-` - package management helpers
- `hw-` - hardware detection (return exit codes for use in conditionals)
- `refresh-` - copy default config to user's `~/.config/`
- `restart-` - restart a component
- `launch-` - open applications
- `install-` - install optional software
- `setup-` - interactive setup wizards
- `toggle-` - toggle features on/off
- `theme-` - theme management
- `update-` - update components
# Helper Commands
Use these instead of raw shell commands:
- `omarchy-cmd-missing` / `omarchy-cmd-present` - check for commands
- `omarchy-pkg-missing` / `omarchy-pkg-present` - check for packages
- `omarchy-pkg-add` - install packages (handles both pacman and AUR)
- `omarchy-hw-asus-rog` - detect ASUS ROG hardware (and similar `hw-*` commands)
# Config Structure
- `config/` - default configs copied to `~/.config/`
- `default/themed/*.tpl` - templates with `{{ variable }}` placeholders for theme colors
- `themes/*/colors.toml` - theme color definitions (accent, background, foreground, color0-15)
# Refresh Pattern
To copy a default config to user config with automatic backup:
```bash
omarchy-refresh-config hypr/hyprlock.conf
```
This copies `~/.local/share/omarchy/config/hypr/hyprlock.conf` to `~/.config/hypr/hyprlock.conf`.
# Migrations
To create a new migration, run `omarchy-dev-add-migration --no-edit`. This creates a migration file named after the unix timestamp of the last commit.
Migration format:
- No shebang line
- Start with an `echo` describing what the migration does
- Use `$OMARCHY_PATH` to reference the omarchy directory
Example:
```bash
echo "Disable fingerprint in hyprlock if fingerprint auth is not configured"
if omarchy-cmd-missing fprintd-list || ! fprintd-list "$USER" 2>/dev/null | grep -q "finger"; then
sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = false/' ~/.config/hypr/hyprlock.conf
fi
```
+21
View File
@@ -0,0 +1,21 @@
[Desktop Entry]
Type=Application
TryExec=alacritty
Exec=alacritty
Icon=Alacritty
Terminal=false
Categories=System;TerminalEmulator;
Name=Alacritty
GenericName=Terminal
Comment=A fast, cross-platform, OpenGL terminal emulator
StartupNotify=true
StartupWMClass=Alacritty
Actions=New;
X-TerminalArgExec=-e
X-TerminalArgAppId=--class=
X-TerminalArgTitle=--title=
X-TerminalArgDir=--working-directory=
[Desktop Action New]
Name=New Terminal
Exec=alacritty
@@ -0,0 +1,2 @@
[Desktop Entry]
Hidden=true
+2
View File
@@ -0,0 +1,2 @@
[Desktop Entry]
Hidden=true
+2 -2
View File
@@ -11,8 +11,8 @@ send_notification() {
notify-send -u critical "󱐋 Time to recharge!" "Battery is down to ${1}%" -i battery-caution -t 30000
}
if [[ -n "$BATTERY_LEVEL" && "$BATTERY_LEVEL" =~ ^[0-9]+$ ]]; then
if [[ $BATTERY_STATE == "discharging" && $BATTERY_LEVEL -le $BATTERY_THRESHOLD ]]; then
if [[ -n $BATTERY_LEVEL && $BATTERY_LEVEL =~ ^[0-9]+$ ]]; then
if [[ $BATTERY_STATE == "discharging" ]] && (( BATTERY_LEVEL <= BATTERY_THRESHOLD )); then
if [[ ! -f $NOTIFICATION_FLAG ]]; then
send_notification $BATTERY_LEVEL
touch $NOTIFICATION_FLAG
+13
View File
@@ -0,0 +1,13 @@
#!/bin/bash
# Returns true if a battery is present on the system.
# Used by the battery monitor and other battery-related checks.
for bat in /sys/class/power_supply/BAT*; do
[[ -r $bat/present ]] &&
[[ $(cat $bat/present) == "1" ]] &&
[[ $(cat $bat/type) == "Battery" ]] &&
exit 0
done
exit 1
+3 -6
View File
@@ -3,10 +3,7 @@
# Returns the battery percentage remaining as an integer.
# Used by the battery monitor and the Ctrl + Shift + Super + B hotkey.
upower -i $(upower -e | grep BAT) \
| awk -F: '/percentage/ {
gsub(/[%[:space:]]/, "", $2);
val=$2;
printf("%d\n", (val+0.5))
upower -i $(upower -e | grep BAT) | awk '/percentage/ {
print int($2)
exit
}'
}'
+7 -6
View File
@@ -3,14 +3,15 @@
# Set the branch for Omarchy's git repository.
if (($# == 0)); then
echo "Usage: omarchy-branch-set [master|dev]"
echo "Usage: omarchy-branch-set [master|rc|dev]"
exit 1
else
branch="$1"
fi
case "$branch" in
"master") git -C $OMARCHY_PATH switch master ;;
"dev") git -C $OMARCHY_PATH switch dev ;;
*) echo "Unknown branch: $branch"; exit 1; ;;
esac
if [[ $branch != "master" && $branch != "rc" && $branch != "dev" ]]; then
echo "Error: Invalid branch '$branch'. Must be one of: master, rc, dev"
exit 1
fi
git -C $OMARCHY_PATH switch $branch
@@ -1,14 +1,14 @@
#!/bin/bash
# Adjust brightness on the most likely display device.
# Usage: omarchy-cmd-brightness <step>
# Usage: omarchy-brightness-display <step>
step="${1:-+5%}"
# Start with the first possible output, then refine to the most likely given an order heuristic.
device="$(ls -1 /sys/class/backlight 2>/dev/null | head -n1)"
for candidate in amdgpu_bl* intel_backlight acpi_video*; do
if [[ -e "/sys/class/backlight/$candidate" ]]; then
if [[ -e /sys/class/backlight/$candidate ]]; then
device="$candidate"
break
fi
@@ -2,7 +2,7 @@
# Adjust the brightness on Apple Studio Displays and Apple XDR Displays using asdcontrol.
if [[ $# -eq 0 ]]; then
if (( $# == 0 )); then
echo "Adjust Apple Display Brightness by passing +5000 or -5000 (or any range from 0-60000)"
else
device="$(sudo asdcontrol --detect /dev/usb/hiddev* | grep ^/dev/usb/hiddev | cut -d: -f1)"
+42
View File
@@ -0,0 +1,42 @@
#!/bin/bash
# Adjust keyboard backlight brightness using available steps.
# Usage: omarchy-brightness-keyboard <up|down|cycle>
direction="${1:-up}"
# Find keyboard backlight device (look for *kbd_backlight* pattern in leds class).
device=""
for candidate in /sys/class/leds/*kbd_backlight*; do
if [[ -e $candidate ]]; then
device="$(basename "$candidate")"
break
fi
done
if [[ -z $device ]]; then
echo "No keyboard backlight device found" >&2
exit 1
fi
# Get current and max brightness to determine step size.
max_brightness="$(brightnessctl -d "$device" max)"
current_brightness="$(brightnessctl -d "$device" get)"
# Calculate step as one unit (keyboards typically have discrete levels like 0-3).
if [[ $direction == "cycle" ]]; then
new_brightness=$(( (current_brightness + 1) % (max_brightness + 1) ))
elif [[ $direction == "up" ]]; then
new_brightness=$((current_brightness + 1))
(( new_brightness > max_brightness )) && new_brightness=$max_brightness
else
new_brightness=$((current_brightness - 1))
(( new_brightness < 0 )) && new_brightness=0
fi
# Set the new brightness.
brightnessctl -d "$device" set "$new_brightness" >/dev/null
# Use SwayOSD to display the new brightness setting.
percent=$((new_brightness * 100 / max_brightness))
omarchy-swayosd-kbd-brightness "$percent"
+3 -2
View File
@@ -14,14 +14,15 @@
# and people with a lot of experience managing Linux systems.
if (($# == 0)); then
echo "Usage: omarchy-channel-set [stable|edge|dev]"
echo "Usage: omarchy-channel-set [stable|rc|edge|dev]"
exit 1
else
channel="$1"
fi
case "$channel" in
"stable") omarchy-branch-set "master" && omarchy-refresh-pacman "stable" && sudo pacman -Suu --noconfirm ;;
"stable") omarchy-branch-set "master" && omarchy-refresh-pacman "stable" ;;
"rc") omarchy-branch-set "rc" && omarchy-refresh-pacman "rc" ;;
"edge") omarchy-branch-set "master" && omarchy-refresh-pacman "edge" ;;
"dev") omarchy-branch-set "dev" && omarchy-refresh-pacman "edge" ;;
*) echo "Unknown channel: $channel"; exit 1; ;;
+17 -9
View File
@@ -7,7 +7,7 @@ focused_monitor="$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).n
sinks=$(pactl -f json list sinks | jq '[.[] | select((.ports | length == 0) or ([.ports[]? | .availability != "not available"] | any))]')
sinks_count=$(echo "$sinks" | jq '. | length')
if [ "$sinks_count" -eq 0 ]; then
if (( sinks_count == 0 )); then
swayosd-client \
--monitor "$focused_monitor" \
--custom-message "No audio devices found"
@@ -17,7 +17,7 @@ fi
current_sink_name=$(pactl get-default-sink)
current_sink_index=$(echo "$sinks" | jq -r --arg name "$current_sink_name" 'map(.name) | index($name)')
if [ "$current_sink_index" != "null" ]; then
if [[ $current_sink_index != "null" ]]; then
next_sink_index=$(((current_sink_index + 1) % sinks_count))
else
next_sink_index=0
@@ -27,20 +27,28 @@ next_sink=$(echo "$sinks" | jq -r ".[$next_sink_index]")
next_sink_name=$(echo "$next_sink" | jq -r '.name')
next_sink_description=$(echo "$next_sink" | jq -r '.description')
if [ "$next_sink_description" = "(null)" ] || [ "$next_sink_description" = "null" ] || [ -z "$next_sink_description" ]; then
sink_id=$(echo "$next_sink" | jq -r '.properties."object.id"')
next_sink_description=$(wpctl status | grep -E "\s+\*?\s+${sink_id}\." | sed -E 's/^.*[0-9]+\.\s+//' | sed -E 's/\s+\[.*$//')
if [[ $next_sink_description == "(null)" ]] || [[ $next_sink_description == "null" ]] || [[ -z $next_sink_description ]]; then
# For Bluetooth devices, the friendly name is on the Device entry (device.id), not the Sink entry (object.id)
device_id=$(echo "$next_sink" | jq -r '.properties."device.id"')
if [[ $device_id != "null" ]] && [[ -n $device_id ]]; then
next_sink_description=$(wpctl status | grep -E "^\s*│?\s+${device_id}\." | sed -E 's/^.*[0-9]+\.\s+//' | sed -E 's/\s+\[.*$//')
fi
# Fall back to object.id lookup if device.id didn't yield a result
if [[ -z $next_sink_description ]]; then
sink_id=$(echo "$next_sink" | jq -r '.properties."object.id"')
next_sink_description=$(wpctl status | grep -E "\s+\*?\s+${sink_id}\." | sed -E 's/^.*[0-9]+\.\s+//' | sed -E 's/\s+\[.*$//')
fi
fi
next_sink_volume=$(echo "$next_sink" | jq -r \
'.volume | to_entries[0].value.value_percent | sub("%"; "")')
next_sink_is_muted=$(echo "$next_sink" | jq -r '.mute')
if [ "$next_sink_is_muted" = "true" ] || [ "$next_sink_volume" -eq 0 ]; then
if [[ $next_sink_is_muted = "true" ]] || (( next_sink_volume == 0 )); then
icon_state="muted"
elif [ "$next_sink_volume" -le 33 ]; then
elif (( next_sink_volume <= 33 )); then
icon_state="low"
elif [ "$next_sink_volume" -le 66 ]; then
elif (( next_sink_volume <= 66 )); then
icon_state="medium"
else
icon_state="high"
@@ -48,7 +56,7 @@ fi
next_sink_volume_icon="sink-volume-${icon_state}-symbolic"
if [ "$next_sink_name" != "$current_sink_name" ]; then
if [[ $next_sink_name != $current_sink_name ]]; then
pactl set-default-sink "$next_sink_name"
fi
+1 -1
View File
@@ -6,7 +6,7 @@ set -e
FIRST_RUN_MODE=~/.local/state/omarchy/first-run.mode
if [[ -f "$FIRST_RUN_MODE" ]]; then
if [[ -f $FIRST_RUN_MODE ]]; then
rm -f "$FIRST_RUN_MODE"
bash "$OMARCHY_PATH/install/first-run/battery-monitor.sh"
+35 -11
View File
@@ -6,7 +6,7 @@
[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs
OUTPUT_DIR="${OMARCHY_SCREENRECORD_DIR:-${XDG_VIDEOS_DIR:-$HOME/Videos}}"
if [[ ! -d "$OUTPUT_DIR" ]]; then
if [[ ! -d $OUTPUT_DIR ]]; then
notify-send "Screen recording directory does not exist: $OUTPUT_DIR" -u critical -t 3000
exit 1
fi
@@ -14,6 +14,7 @@ fi
DESKTOP_AUDIO="false"
MICROPHONE_AUDIO="false"
WEBCAM="false"
WEBCAM_DEVICE=""
STOP_RECORDING="false"
for arg in "$@"; do
@@ -21,6 +22,7 @@ for arg in "$@"; do
--with-desktop-audio) DESKTOP_AUDIO="true" ;;
--with-microphone-audio) MICROPHONE_AUDIO="true" ;;
--with-webcam) WEBCAM="true" ;;
--webcam-device=*) WEBCAM_DEVICE="${arg#*=}" ;;
--stop-recording) STOP_RECORDING="true"
esac
done
@@ -32,6 +34,15 @@ cleanup_webcam() {
start_webcam_overlay() {
cleanup_webcam
# Auto-detect first available webcam if none specified
if [[ -z $WEBCAM_DEVICE ]]; then
WEBCAM_DEVICE=$(v4l2-ctl --list-devices 2>/dev/null | grep -m1 "^\s*/dev/video" | tr -d '\t')
if [[ -z $WEBCAM_DEVICE ]]; then
notify-send "No webcam devices found" -u critical -t 3000
return 1
fi
fi
# Get monitor scale
local scale=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .scale')
@@ -41,7 +52,7 @@ start_webcam_overlay() {
# Try preferred 16:9 resolutions in order, use first available
local preferred_resolutions=("640x360" "1280x720" "1920x1080")
local video_size_arg=""
local available_formats=$(v4l2-ctl --list-formats-ext -d /dev/video0 2>/dev/null)
local available_formats=$(v4l2-ctl --list-formats-ext -d "$WEBCAM_DEVICE" 2>/dev/null)
for resolution in "${preferred_resolutions[@]}"; do
if echo "$available_formats" | grep -q "$resolution"; then
@@ -50,7 +61,7 @@ start_webcam_overlay() {
fi
done
ffplay -f v4l2 $video_size_arg -framerate 30 /dev/video0 \
ffplay -f v4l2 $video_size_arg -framerate 30 "$WEBCAM_DEVICE" \
-vf "scale=${target_width}:-1" \
-window_title "WebcamOverlay" \
-noborder \
@@ -65,26 +76,38 @@ start_screenrecording() {
local audio_devices=""
local audio_args=""
[[ "$DESKTOP_AUDIO" == "true" ]] && audio_devices+="default_output"
[[ $DESKTOP_AUDIO == "true" ]] && audio_devices+="default_output"
if [[ "$MICROPHONE_AUDIO" == "true" ]]; then
if [[ $MICROPHONE_AUDIO == "true" ]]; then
# Merge audio tracks into one - separate tracks only play one at a time in most players
[[ -n "$audio_devices" ]] && audio_devices+="|"
[[ -n $audio_devices ]] && audio_devices+="|"
audio_devices+="default_input"
fi
[[ -n "$audio_devices" ]] && audio_args+="-a $audio_devices"
[[ -n $audio_devices ]] && audio_args+="-a $audio_devices"
gpu-screen-recorder -w portal -f 60 -fallback-cpu-encoding yes -o "$filename" $audio_args -ac aac &
gpu-screen-recorder -w portal -k h264 -f 60 -fallback-cpu-encoding yes -o "$filename" $audio_args -ac aac &
toggle_screenrecording_indicator
}
trim_first_frame() {
local latest=$(ls -t "$OUTPUT_DIR"/screenrecording-*.mp4 2>/dev/null | head -1)
if [[ -n $latest ]]; then
local trimmed="${latest%.mp4}-trimmed.mp4"
if ffmpeg -y -ss 0.1 -i "$latest" -c copy "$trimmed" -loglevel quiet 2>/dev/null; then
mv "$trimmed" "$latest"
else
rm -f "$trimmed"
fi
fi
}
stop_screenrecording() {
pkill -SIGINT -f "^gpu-screen-recorder" # SIGINT required to save video properly
# Wait a maximum of 5 seconds to finish before hard killing
local count=0
while pgrep -f "^gpu-screen-recorder" >/dev/null && [ $count -lt 50 ]; do
while pgrep -f "^gpu-screen-recorder" >/dev/null && (( count < 50 )); do
sleep 0.1
count=$((count + 1))
done
@@ -95,6 +118,7 @@ stop_screenrecording() {
notify-send "Screen recording error" "Recording process had to be force-killed. Video may be corrupted." -u critical -t 5000
else
cleanup_webcam
trim_first_frame
notify-send "Screen recording saved to $OUTPUT_DIR" -t 2000
fi
toggle_screenrecording_indicator
@@ -114,8 +138,8 @@ if screenrecording_active; then
else
stop_screenrecording
fi
elif [[ "$STOP_RECORDING" == "false" ]]; then
[[ "$WEBCAM" == "true" ]] && start_webcam_overlay
elif [[ $STOP_RECORDING == "false" ]]; then
[[ $WEBCAM == "true" ]] && start_webcam_overlay
start_screenrecording || cleanup_webcam
else
+77 -33
View File
@@ -2,85 +2,129 @@
# Take a screenshot of the whole screen, a specific window, or a user-drawn region.
# Saves to ~/Pictures by default, but that can be changed via OMARCHY_SCREENSHOT_DIR or XDG_PICTURES_DIR ENVs.
# Editor defaults to Satty but can be changed via --editor=<name> or OMARCHY_SCREENSHOT_EDITOR env
[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs
OUTPUT_DIR="${OMARCHY_SCREENSHOT_DIR:-${XDG_PICTURES_DIR:-$HOME/Pictures}}"
if [[ ! -d "$OUTPUT_DIR" ]]; then
if [[ ! -d $OUTPUT_DIR ]]; then
notify-send "Screenshot directory does not exist: $OUTPUT_DIR" -u critical -t 3000
exit 1
fi
pkill slurp && exit 0
SCREENSHOT_EDITOR="${OMARCHY_SCREENSHOT_EDITOR:-satty}"
# Parse --editor flag from any position
ARGS=()
for arg in "$@"; do
if [[ $arg == --editor=* ]]; then
SCREENSHOT_EDITOR="${arg#--editor=}"
else
ARGS+=("$arg")
fi
done
set -- "${ARGS[@]}"
open_editor() {
local filepath="$1"
if [[ $SCREENSHOT_EDITOR == "satty" ]]; then
satty --filename "$filepath" \
--output-filename "$filepath" \
--actions-on-enter save-to-clipboard \
--save-after-copy \
--copy-command 'wl-copy'
else
$SCREENSHOT_EDITOR "$filepath"
fi
}
MODE="${1:-smart}"
PROCESSING="${2:-slurp}"
# accounting for portrait/transformed displays
JQ_MONITOR_GEO='
def format_geo:
.x as $x | .y as $y |
(.width / .scale | floor) as $w |
(.height / .scale | floor) as $h |
.transform as $t |
if $t == 1 or $t == 3 then
"\($x),\($y) \($h)x\($w)"
else
"\($x),\($y) \($w)x\($h)"
end;
'
get_rectangles() {
local active_workspace=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .activeWorkspace.id')
hyprctl monitors -j | jq -r --arg ws "$active_workspace" '.[] | select(.activeWorkspace.id == ($ws | tonumber)) | "\(.x),\(.y) \((.width / .scale) | floor)x\((.height / .scale) | floor)"'
hyprctl monitors -j | jq -r --arg ws "$active_workspace" "${JQ_MONITOR_GEO} .[] | select(.activeWorkspace.id == (\$ws | tonumber)) | format_geo"
hyprctl clients -j | jq -r --arg ws "$active_workspace" '.[] | select(.workspace.id == ($ws | tonumber)) | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"'
}
# Select based on mode
case "$MODE" in
region)
wayfreeze & PID=$!
hyprpicker -r -z >/dev/null 2>&1 & PID=$!
sleep .1
SELECTION=$(slurp 2>/dev/null)
kill $PID 2>/dev/null
;;
windows)
wayfreeze & PID=$!
hyprpicker -r -z >/dev/null 2>&1 & PID=$!
sleep .1
SELECTION=$(get_rectangles | slurp -r 2>/dev/null)
kill $PID 2>/dev/null
;;
fullscreen)
SELECTION=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | "\(.x),\(.y) \((.width / .scale) | floor)x\((.height / .scale) | floor)"')
SELECTION=$(hyprctl monitors -j | jq -r "${JQ_MONITOR_GEO} .[] | select(.focused == true) | format_geo")
;;
smart|*)
RECTS=$(get_rectangles)
wayfreeze & PID=$!
hyprpicker -r -z >/dev/null 2>&1 & PID=$!
sleep .1
SELECTION=$(echo "$RECTS" | slurp 2>/dev/null)
kill $PID 2>/dev/null
# If the selction area is L * W < 20, we'll assume you were trying to select whichever
# window or output it was inside of to prevent accidental 2px snapshots
if [[ "$SELECTION" =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+)$ ]]; then
if (( ${BASH_REMATCH[3]} * ${BASH_REMATCH[4]} < 20 )); then
click_x="${BASH_REMATCH[1]}"
click_y="${BASH_REMATCH[2]}"
# If the selection area is L * W < 20, we'll assume you were trying to select whichever
# window or output it was inside of to prevent accidental 2px snapshots
if [[ $SELECTION =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+)$ ]]; then
if ((${BASH_REMATCH[3]} * ${BASH_REMATCH[4]} < 20)); then
click_x="${BASH_REMATCH[1]}"
click_y="${BASH_REMATCH[2]}"
while IFS= read -r rect; do
if [[ "$rect" =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+) ]]; then
rect_x="${BASH_REMATCH[1]}"
rect_y="${BASH_REMATCH[2]}"
rect_width="${BASH_REMATCH[3]}"
rect_height="${BASH_REMATCH[4]}"
while IFS= read -r rect; do
if [[ $rect =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+) ]]; then
rect_x="${BASH_REMATCH[1]}"
rect_y="${BASH_REMATCH[2]}"
rect_width="${BASH_REMATCH[3]}"
rect_height="${BASH_REMATCH[4]}"
if (( click_x >= rect_x && click_x < rect_x+rect_width && click_y >= rect_y && click_y < rect_y+rect_height )); then
SELECTION="${rect_x},${rect_y} ${rect_width}x${rect_height}"
break
fi
if ((click_x >= rect_x && click_x < rect_x + rect_width && click_y >= rect_y && click_y < rect_y + rect_height)); then
SELECTION="${rect_x},${rect_y} ${rect_width}x${rect_height}"
break
fi
done <<< "$RECTS"
fi
fi
done <<<"$RECTS"
fi
;;
fi
;;
esac
[ -z "$SELECTION" ] && exit 0
[[ -z $SELECTION ]] && exit 0
FILENAME="screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png"
FILEPATH="$OUTPUT_DIR/$FILENAME"
if [[ $PROCESSING == "slurp" ]]; then
grim -g "$SELECTION" - |
satty --filename - \
--output-filename "$OUTPUT_DIR/screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png" \
--early-exit \
--actions-on-enter save-to-clipboard \
--save-after-copy \
--copy-command 'wl-copy'
grim -g "$SELECTION" "$FILEPATH" || exit 1
wl-copy <"$FILEPATH"
(
ACTION=$(notify-send "Screenshot saved to clipboard and file" "Edit with Super + Alt + , (or click this)" -t 10000 -i "$FILEPATH" -A "default=edit")
[[ $ACTION == "default" ]] && open_editor "$FILEPATH"
) &
else
grim -g "$SELECTION" - | wl-copy
fi
+1 -1
View File
@@ -25,7 +25,7 @@ else
# Pick one or more files from home directory
FILES=$(find "$HOME" -type f 2>/dev/null | fzf --multi)
fi
[ -z "$FILES" ] && exit 0
[[ -z $FILES ]] && exit 0
fi
fi
+45
View File
@@ -0,0 +1,45 @@
#!/bin/bash
# Add an EFI boot entry for the Omarchy UKI, allowing the system to boot directly
# without a bootloader like Limine. Requires UEFI firmware and a built UKI.
if [[ ! -d /sys/firmware/efi ]]; then
echo "Error: System is not booted in UEFI mode" >&2
exit 1
fi
if ! efibootmgr &>/dev/null; then
echo "Error: efibootmgr is not available or not functional" >&2
exit 1
fi
if cat /sys/class/dmi/id/bios_vendor 2>/dev/null | grep -qi "American Megatrends"; then
echo "Error: American Megatrends firmware may not safely support custom EFI entries" >&2
exit 1
fi
if cat /sys/class/dmi/id/bios_vendor 2>/dev/null | grep -qi "Apple"; then
echo "Error: Apple firmware uses its own boot manager" >&2
exit 1
fi
uki_file=$(find /boot/EFI/Linux/ -name "omarchy*.efi" -printf "%f\n" 2>/dev/null | head -1)
if [[ -z $uki_file ]]; then
echo "Error: No Omarchy UKI found in /boot/EFI/Linux/" >&2
exit 1
fi
boot_source=$(findmnt -n -o SOURCE /boot)
disk=$(echo "$boot_source" | sed 's/p\?[0-9]*$//')
part=$(echo "$boot_source" | grep -o 'p\?[0-9]*$' | sed 's/^p//')
if gum confirm "Setup direct boot (so snapshot booting must be done via bios)?"; then
echo "Creating EFI boot entry for $uki_file"
sudo efibootmgr --create \
--disk "$disk" \
--part "$part" \
--label "Omarchy" \
--loader "\\EFI\\Linux\\$uki_file"
fi
+5 -5
View File
@@ -5,7 +5,7 @@
NO_SUDO=false
PRINT_ONLY=false
while [[ $# -gt 0 ]]; do
while (( $# > 0 )); do
case "$1" in
--no-sudo)
NO_SUDO=true
@@ -25,7 +25,7 @@ done
LOG_FILE="/tmp/omarchy-debug.log"
if [ "$NO_SUDO" = true ]; then
if [[ $NO_SUDO = "true" ]]; then
DMESG_OUTPUT="(skipped - --no-sudo flag used)"
else
DMESG_OUTPUT="$(sudo dmesg)"
@@ -47,7 +47,7 @@ DMESG
$DMESG_OUTPUT
=========================================
JOURNALCTL (CURRENT BOOT, ERRORS ONLY)
JOURNALCTL (CURRENT BOOT, WARNINGS+ERRORS)
=========================================
$(journalctl -b -p 4..1)
@@ -57,7 +57,7 @@ INSTALLED PACKAGES
$({ expac -S '%n %v (%r)' $(pacman -Qqe) 2>/dev/null; comm -13 <(pacman -Sql | sort) <(pacman -Qqe | sort) | xargs -r expac -Q '%n %v (AUR)'; } | sort)
EOF
if [ "$PRINT_ONLY" = true ]; then
if [[ $PRINT_ONLY = "true" ]]; then
cat "$LOG_FILE"
exit 0
fi
@@ -73,7 +73,7 @@ case "$ACTION" in
"Upload log")
echo "Uploading debug log to 0x0.st..."
URL=$(curl -sF "file=@$LOG_FILE" -Fexpires=24 https://0x0.st)
if [ $? -eq 0 ] && [ -n "$URL" ]; then
if (( $? == 0 )) && [[ -n $URL ]]; then
echo "✓ Log uploaded successfully!"
echo "Share this URL:"
echo ""
+1 -1
View File
@@ -7,7 +7,7 @@ cd ~/.local/share/omarchy
migration_file="$HOME/.local/share/omarchy/migrations/$(git log -1 --format=%cd --date=unix).sh"
touch $migration_file
if [[ "$1" != "--no-edit" ]]; then
if [[ $1 != "--no-edit" ]]; then
nvim $migration_file
fi
+24 -4
View File
@@ -11,7 +11,7 @@ fi
# Find the root drive in case we are looking at partitions
root_drive=$(lsblk -no PKNAME "$drive" 2>/dev/null | tail -n1)
if [[ -n "$root_drive" ]]; then
if [[ -n $root_drive ]]; then
root_drive="/dev/$root_drive"
else
root_drive="$drive"
@@ -19,11 +19,31 @@ fi
# Get basic disk information
size=$(lsblk -dno SIZE "$drive" 2>/dev/null)
model=$(lsblk -dno MODEL "$root_drive" 2>/dev/null)
vendor=$(lsblk -dno VENDOR "$root_drive" 2>/dev/null | sed 's/ *$//')
model=$(lsblk -dno MODEL "$root_drive" 2>/dev/null | sed 's/ *$//')
# Combine vendor and model, avoiding duplication
label=""
if [[ -n $vendor && -n $model ]]; then
if [[ $model == *$vendor* ]]; then
label="$model"
else
label="$vendor $model"
fi
elif [[ -n $model ]]; then
label="$model"
elif [[ -n $vendor ]]; then
label="$vendor"
fi
# Format display string
display="$drive"
[[ -n "$size" ]] && display="$display ($size)"
[[ -n "$model" ]] && display="$display - $model"
[[ -n $size ]] && display="$display ($size)"
[[ -n $label ]] && display="$display - $label"
# Append compact partition summary
part_summary=$(lsblk -nro TYPE,NAME,FSTYPE,MOUNTPOINT "$root_drive" 2>/dev/null | \
awk '$1=="part" { printf "%s%s%s", s, ($3==""?"unknown":$3), ($4==""?"":"("$4")"); s=", " }')
[[ -n $part_summary ]] && display+=" [$part_summary]"
echo "$display"
+1 -1
View File
@@ -10,7 +10,7 @@ fi
drives_with_info=""
while IFS= read -r drive; do
[[ -n "$drive" ]] || continue
[[ -n $drive ]] || continue
drives_with_info+="$(omarchy-drive-info "$drive")"$'\n'
done <<<"$drives"
+1 -1
View File
@@ -5,7 +5,7 @@
encrypted_drives=$(blkid -t TYPE=crypto_LUKS -o device)
if [[ -n $encrypted_drives ]]; then
if [[ $(wc -l <<<"$encrypted_drives") -eq 1 ]]; then
if (( $(wc -l <<<encrypted_drives) == 1 )); then
drive_to_change="$encrypted_drives"
else
drive_to_change="$(omarchy-drive-select "$encrypted_drives")"
+1 -1
View File
@@ -5,7 +5,7 @@
font_name="$1"
if [[ -n "$font_name" ]]; then
if [[ -n $font_name ]]; then
if fc-list | grep -iq "$font_name"; then
if [[ -f ~/.config/alacritty/alacritty.toml ]]; then
sed -i "s/family = \".*\"/family = \"$font_name\"/g" ~/.config/alacritty/alacritty.toml
+1 -1
View File
@@ -11,7 +11,7 @@ SWAPSIZE=$(( 1024 * ${SWAPSIZE_KB:-0} ))
HIBERNATION_IMAGE_SIZE=$(cat /sys/power/image_size)
if [[ "$SWAPSIZE" -gt "$HIBERNATION_IMAGE_SIZE" ]] && [[ -f /etc/mkinitcpio.conf.d/omarchy_resume.conf ]]; then
if (( SWAPSIZE > HIBERNATION_IMAGE_SIZE )) && [[ -f /etc/mkinitcpio.conf.d/omarchy_resume.conf ]]; then
exit 0
else
exit 1
+2 -2
View File
@@ -6,7 +6,7 @@
MKINITCPIO_CONF="/etc/mkinitcpio.conf.d/omarchy_resume.conf"
# Check if hibernation is configured
if [ ! -f "$MKINITCPIO_CONF" ] || ! grep -q "^HOOKS+=(resume)$" "$MKINITCPIO_CONF"; then
if [[ ! -f $MKINITCPIO_CONF ]] || ! grep -q "^HOOKS+=(resume)$" "$MKINITCPIO_CONF"; then
echo "Hibernation is not set up"
exit 0
fi
@@ -25,7 +25,7 @@ if swapon --show | grep -q "$SWAP_FILE"; then
fi
# Remove swapfile
if [ -f "$SWAP_FILE" ]; then
if [[ -f $SWAP_FILE ]]; then
echo "Removing swapfile"
sudo rm "$SWAP_FILE"
fi
+43 -13
View File
@@ -4,22 +4,28 @@
# adds a resume hook to mkinitcpio, and configures suspend-then-hibernate.
if [[ ! -f /sys/power/image_size ]]; then
echo -e "\033[31mError: Hibernation is not supported on your system\033[0m" >&2
exit 1
echo -e "Hibernation is not supported on your system" >&2
exit 0
fi
if ! command -v limine-mkinitcpio &>/dev/null; then
echo "Skipping hibernation setup (requires Limine bootloader)"
exit 0
fi
MKINITCPIO_CONF="/etc/mkinitcpio.conf.d/omarchy_resume.conf"
# Check if hibernation is already configured
if [ -f "$MKINITCPIO_CONF" ] && grep -q "^HOOKS+=(resume)$" "$MKINITCPIO_CONF"; then
if [[ -f $MKINITCPIO_CONF ]] && grep -q "^HOOKS+=(resume)$" "$MKINITCPIO_CONF"; then
echo "Hibernation is already set up"
exit 0
fi
MEM_TOTAL_HUMAN=$(free --human | awk '/Mem/ {print $2}')
if ! gum confirm "Use $MEM_TOTAL_HUMAN on boot drive to make hibernation available?"; then
exit 0
if [[ $1 != "--force" ]]; then
MEM_TOTAL_HUMAN=$(free --human | awk '/Mem/ {print $2}')
if ! gum confirm "Use $MEM_TOTAL_HUMAN on boot drive to make hibernation available?"; then
exit 0
fi
fi
SWAP_SUBVOLUME="/swap"
@@ -57,14 +63,38 @@ sudo mkdir -p /etc/mkinitcpio.conf.d
echo "Adding resume hook to $MKINITCPIO_CONF"
echo "HOOKS+=(resume)" | sudo tee "$MKINITCPIO_CONF" >/dev/null
# Configure suspend-then-hibernate
echo "Configuring suspend-then-hibernate"
sudo mkdir -p /etc/systemd/logind.conf.d /etc/systemd/sleep.conf.d
sudo cp "$OMARCHY_PATH/default/systemd/lid.conf" /etc/systemd/logind.conf.d/
sudo cp "$OMARCHY_PATH/default/systemd/hibernate.conf" /etc/systemd/sleep.conf.d/
# Ensure keyboard backlight doesn't prevent sleep
sudo cp -p "$OMARCHY_PATH/default/systemd/system-sleep/keyboard-backlight" /usr/lib/systemd/system-sleep/
# Regenerate initramfs
# Add resume= kernel parameters so the initramfs resume hook knows where to find the
# hibernation image. Without these, resume happens late (after GPU drivers load) and fails.
RESUME_DROP_IN="/etc/limine-entry-tool.d/resume.conf"
if [[ ! -f $RESUME_DROP_IN ]]; then
echo "Adding resume kernel parameters"
sudo swapon -p 0 "$SWAP_FILE" 2>/dev/null
RESUME_DEVICE=$(findmnt -no SOURCE -T "$SWAP_FILE" | sed 's/\[.*\]//')
RESUME_OFFSET=$(btrfs inspect-internal map-swapfile -r "$SWAP_FILE")
sudo mkdir -p /etc/limine-entry-tool.d
echo "KERNEL_CMDLINE[default]+=\"resume=$RESUME_DEVICE resume_offset=$RESUME_OFFSET\"" | sudo tee "$RESUME_DROP_IN" >/dev/null
fi
# Use ACPI alarm for RTC wakeup on s2idle systems (needed for suspend-then-hibernate)
if grep -q "\[s2idle\]" /sys/power/mem_sleep 2>/dev/null; then
LIMINE_DROP_IN="/etc/limine-entry-tool.d/rtc-alarm.conf"
if [[ ! -f $LIMINE_DROP_IN ]]; then
echo "Enabling ACPI RTC alarm for s2idle suspend"
sudo mkdir -p /etc/limine-entry-tool.d
echo 'KERNEL_CMDLINE[default]+="rtc_cmos.use_acpi_alarm=1"' | sudo tee "$LIMINE_DROP_IN" >/dev/null
fi
fi
# Regenerate initramfs and boot entry
echo "Regenerating initramfs..."
sudo limine-mkinitcpio
sudo limine-update
echo "Hibernation enabled"
echo
if [[ $1 != "--force" ]] && gum confirm "Reboot to enable hibernation?"; then
omarchy-system-reboot
fi
+1 -1
View File
@@ -4,7 +4,7 @@
set -e
if [[ $# -lt 1 ]]; then
if (( $# < 1 )); then
echo "Usage: omarchy-hook [name] [args...]"
exit 1
fi
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
# Detect whether the computer is an Asus ROG machine.
[[ $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null) == "ASUSTeK COMPUTER INC." ]] &&
grep -q "ROG" /sys/class/dmi/id/product_family 2>/dev/null
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
# Detect whether the computer is a Framework Laptop 16.
[[ $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null) == "Framework" ]] &&
grep -q "Laptop 16" /sys/class/dmi/id/product_name 2>/dev/null
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
# Detect whether the computer is a Microsoft Surface device.
[[ $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null) == "Microsoft Corporation" ]] &&
grep -q "Surface" /sys/class/dmi/id/product_name 2>/dev/null
+21
View File
@@ -0,0 +1,21 @@
#!/bin/bash
# Get the active monitor (the one with the cursor)
MONITOR_INFO=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true)')
ACTIVE_MONITOR=$(echo "$MONITOR_INFO" | jq -r '.name')
CURRENT_SCALE=$(echo "$MONITOR_INFO" | jq -r '.scale')
# Cycle through scales: 1 → 1.6 → 2 → 3 → 1
CURRENT_INT=$(awk -v s="$CURRENT_SCALE" 'BEGIN { printf "%.0f", s * 10 }')
case "$CURRENT_INT" in
10) NEW_SCALE=1.6 ;;
16) NEW_SCALE=2 ;;
20) NEW_SCALE=3 ;;
*) NEW_SCALE=1 ;;
esac
hyprctl keyword misc:disable_scale_notification true
hyprctl keyword monitor "$ACTIVE_MONITOR,preferred,auto,$NEW_SCALE"
hyprctl keyword misc:disable_scale_notification false
notify-send "󰍹 Display scaling set to ${NEW_SCALE}x"
+13
View File
@@ -0,0 +1,13 @@
#!/bin/bash
# Check current single_window_aspect_ratio setting
CURRENT_VALUE=$(hyprctl getoption "dwindle:single_window_aspect_ratio" 2>/dev/null | head -1)
# Parse vec2 output: "vec2: [1, 1]" or "vec2: [0, 0]"
if [[ $CURRENT_VALUE == *"[1, 1]"* ]]; then
hyprctl keyword dwindle:single_window_aspect_ratio "0 0"
notify-send " Disable single-window square aspect ratio"
else
hyprctl keyword dwindle:single_window_aspect_ratio "1 1"
notify-send " Enable single-window square aspect"
fi
+9 -6
View File
@@ -1,12 +1,15 @@
#!/bin/bash
# Toggles the window gaps on the active workspace between no gaps and the default 10/5/2.
# Toggles the window gaps globally between no gaps and the default 10/5/2.
workspace_id=$(hyprctl activeworkspace -j | jq -r .id)
gaps=$(hyprctl workspacerules -j | jq -r ".[] | select(.workspaceString==\"$workspace_id\") | .gapsOut[0] // 0")
gaps=$(hyprctl getoption general:gaps_out -j | jq -r '.custom' | awk '{print $1}')
if [[ $gaps == "0" ]]; then
hyprctl keyword "workspace $workspace_id, gapsout:10, gapsin:5, bordersize:2"
else \
hyprctl keyword "workspace $workspace_id, gapsout:0, gapsin:0, bordersize:0"
hyprctl keyword general:gaps_out 10
hyprctl keyword general:gaps_in 5
hyprctl keyword general:border_size 2
else
hyprctl keyword general:gaps_out 0
hyprctl keyword general:gaps_in 0
hyprctl keyword general:border_size 0
fi
+12 -5
View File
@@ -2,16 +2,16 @@
# Install one of the supported development environments. Usually called via Install > Development > * in the Omarchy Menu.
if [[ -z "$1" ]]; then
echo "Usage: omarchy-install-dev-env <ruby|node|bun|go|laravel|symfony|php|python|elixir|phoenix|rust|java|ocaml|dotnet|clojure>" >&2
if [[ -z $1 ]]; then
echo "Usage: omarchy-install-dev-env <ruby|node|bun|deno|go|laravel|symfony|php|python|elixir|phoenix|rust|java|zig|ocaml|dotnet|clojure|scala>" >&2
exit 1
fi
install_php() {
sudo pacman -S php composer php-sqlite xdebug --noconfirm
omarchy-pkg-add php composer php-sqlite xdebug
# Install Path for Composer
if [[ ":$PATH:" != *":$HOME/.config/composer/vendor/bin:"* ]]; then
if [[ :$PATH: != *:$HOME/.config/composer/vendor/bin:* ]]; then
echo 'export PATH="$HOME/.config/composer/vendor/bin:$PATH"' >>"$HOME/.bashrc"
source "$HOME/.bashrc"
echo "Added Composer global bin directory to PATH."
@@ -52,7 +52,8 @@ ruby)
omarchy-pkg-add libyaml
mise use --global ruby@latest
mise settings add idiomatic_version_file_enable_tools ruby
echo "gem: --no-document" > ~/.gemrc
mise settings add ruby.compile false
echo "gem: --no-document" >~/.gemrc
mise x ruby -- gem install rails --no-document
echo -e "\nYou can now run: rails new myproject"
;;
@@ -141,4 +142,10 @@ clojure)
omarchy-pkg-add rlwrap
mise use --global clojure@latest
;;
scala)
echo -e "Installing Scala...\n"
mise use --global java@latest
mise use --global scala@latest
mise use --global scala-cli@latest
;;
esac
+2 -2
View File
@@ -5,13 +5,13 @@
options=("MySQL" "PostgreSQL" "Redis" "MongoDB" "MariaDB" "MSSQL")
if [[ "$#" -eq 0 ]]; then
if (( $# == 0 )); then
choices=$(printf "%s\n" "${options[@]}" | gum choose --header "Select database (return to install, esc to cancel)") || main_menu
else
choices="$@"
fi
if [[ -n "$choices" ]]; then
if [[ -n $choices ]]; then
for db in $choices; do
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 ;;
+17
View File
@@ -0,0 +1,17 @@
#!/bin/bash
# Install and launch Geforce Now.
set -e
omarchy-pkg-add flatpak
cd /tmp
# Download and run GeForce NOW
curl -LO https://international.download.nvidia.com/GFNLinux/GeForceNOWSetup.bin
chmod +x GeForceNOWSetup.bin
./GeForceNOWSetup.bin
# Ensure a separate browser process not started by GFN is available.
# If not, it seems like GFN has a tendency to hang on login.
setsid omarchy-launch-browser
+17
View File
@@ -0,0 +1,17 @@
#!/bin/bash
# Install the NordVPN service with optional GUI.
echo "Installing NordVPN..."
omarchy-pkg-aur-add nordvpn-bin
echo "Enabling NordVPN daemon..."
sudo systemctl enable --now nordvpnd
echo "Adding user to nordvpn group..."
sudo usermod -aG nordvpn "$USER"
echo -e "\nNordVPN installed! After reboot, run 'nordvpn login' to authenticate."
echo
gum confirm "Reboot now to make NordVPN usable?" && sudo reboot now
+2 -7
View File
@@ -1,15 +1,10 @@
#!/bin/bash
# Install the Tailscale mesh VPN service, the tsui TUI management app, and a web app for the Tailscale Admin Console.
# Install the Tailscale mesh VPN service and a web app for the Tailscale Admin Console.
curl -fsSL https://tailscale.com/install.sh | sh
curl -fsSL https://neuralink.com/tsui/install.sh | bash
echo -e "\nStarting Tailscale..."
sudo tailscale up --accept-routes
echo -e "\nAdd tsui to sudoers..."
echo "$USER ALL=(ALL) NOPASSWD: $(which tsui)" | sudo tee /etc/sudoers.d/tsui
omarchy-tui-install "Tailscale" "sudo tsui" float https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/tailscale-light.png
omarchy-webapp-install "Tailscale Admin Console" "https://login.tailscale.com/admin/machines" https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/tailscale-light.png
omarchy-webapp-install "Tailscale" "https://login.tailscale.com/admin/machines" https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/tailscale-light.png
+2 -24
View File
@@ -25,33 +25,11 @@ if omarchy-pkg-add $package; then
# Copy custom desktop entry for alacritty with X-TerminalArg* keys
if [[ $package == "alacritty" ]]; then
mkdir -p ~/.local/share/applications
cat > ~/.local/share/applications/Alacritty.desktop << EOF
[Desktop Entry]
Type=Application
TryExec=alacritty
Exec=alacritty
Icon=Alacritty
Terminal=false
Categories=System;TerminalEmulator;
Name=Alacritty
GenericName=Terminal
Comment=A fast, cross-platform, OpenGL terminal emulator
StartupNotify=true
StartupWMClass=Alacritty
Actions=New;
X-TerminalArgExec=-e
X-TerminalArgAppId=--class=
X-TerminalArgTitle=--title=
X-TerminalArgDir=--working-directory=
[Desktop Action New]
Name=New Terminal
Exec=alacritty
EOF
cp $OMARCHY_PATH/applications/Alacritty.desktop ~/.local/share/applications/
fi
# Update xdg-terminals.list to prioritize the proper terminal
cat > ~/.config/xdg-terminals.list << EOF
cat >~/.config/xdg-terminals.list <<EOF
# Terminal emulator preference order for xdg-terminal-exec
# The first found and valid terminal will be used
$desktop_id
+2 -2
View File
@@ -5,8 +5,8 @@
set -e
# Install xpadneo to ensure controllers work out of the box
sudo pacman -S --noconfirm --needed linux-headers
yay -S --noconfirm xpadneo-dkms
omarchy-pkg-add linux-headers
omarchy-pkg-aur-add xpadneo-dkms
# Prevent xpad/xpadneo driver conflict
echo blacklist xpad | sudo tee /etc/modprobe.d/blacklist-xpad.conf >/dev/null
+1 -1
View File
@@ -6,7 +6,7 @@
default_browser=$(xdg-settings get default-web-browser)
browser_exec=$(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,~/.nix-profile,/usr}/share/applications/$default_browser 2>/dev/null | head -1)
if [[ $browser_exec =~ (firefox|zen|librewolf|mullvad) ]]; then
if $browser_exec --help | grep -q MOZ_LOG; then
private_flag="--private-window"
elif [[ $browser_exec =~ edge ]]; then
private_flag="--inprivate"
@@ -4,4 +4,4 @@
# Used by actions such as Update System.
cmd="$*"
exec setsid uwsm-app -- xdg-terminal-exec --app-id=org.omarchy.terminal --title=Omarchy -e bash -c "omarchy-show-logo; $cmd; if [ \$? -ne 130 ]; then omarchy-show-done; fi"
exec setsid uwsm-app -- xdg-terminal-exec --app-id=org.omarchy.terminal --title=Omarchy -e bash -c "omarchy-show-logo; $cmd; if (( \$? != 130 )); then omarchy-show-done; fi"
+1 -1
View File
@@ -10,7 +10,7 @@ fi
WINDOW_PATTERN="$1"
LAUNCH_COMMAND="${2:-"uwsm-app -- $WINDOW_PATTERN"}"
WINDOW_ADDRESS=$(hyprctl clients -j | jq -r --arg p "$WINDOW_PATTERN" '.[]|select((.class|test("\\b" + $p + "\\b";"i")) or (.title|test("\\b" + $p + "\\b";"i")))|.address' | head -n1)
WINDOW_ADDRESS=$(hyprctl clients -j | jq -r --arg p "$WINDOW_PATTERN" '.[]|select((.class|test("\\b" + p + "\\b";"i")) or (.title|test("\\b" + $p + "\\b";"i")))|.address' | head -n1)
if [[ -n $WINDOW_ADDRESS ]]; then
hyprctl dispatch focuswindow "address:$WINDOW_ADDRESS"
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# Launch the Walker application launcher while ensuring that it's data provider (called elephant) is runnig first.
# Launch the Walker application launcher while ensuring that it's data provider (called elephant) is running first.
# Ensure elephant is running before launching walker
if ! pgrep -x elephant > /dev/null; then
+103 -52
View File
@@ -10,9 +10,9 @@ BACK_TO_EXIT=false
back_to() {
local parent_menu="$1"
if [[ "$BACK_TO_EXIT" == "true" ]]; then
if [[ $BACK_TO_EXIT == "true" ]]; then
exit 0
elif [[ -n "$parent_menu" ]]; then
elif [[ -n $parent_menu ]]; then
"$parent_menu"
else
show_main_menu
@@ -27,10 +27,10 @@ menu() {
read -r -a args <<<"$extra"
if [[ -n "$preselect" ]]; then
if [[ -n $preselect ]]; then
local index
index=$(echo -e "$options" | grep -nxF "$preselect" | cut -d: -f1)
if [[ -n "$index" ]]; then
if [[ -n $index ]]; then
args+=("-c" "$index")
fi
fi
@@ -52,15 +52,15 @@ open_in_editor() {
}
install() {
present_terminal "echo 'Installing $1...'; sudo pacman -S --noconfirm $2"
present_terminal "echo 'Installing $1...'; omarchy-pkg-add $2"
}
install_and_launch() {
present_terminal "echo 'Installing $1...'; sudo pacman -S --noconfirm $2 && setsid gtk-launch $3"
present_terminal "echo 'Installing $1...'; omarchy-pkg-add $2 && setsid gtk-launch $3"
}
install_font() {
present_terminal "echo 'Installing $1...'; sudo pacman -S --noconfirm --needed $2 && sleep 2 && omarchy-font-set '$3'"
present_terminal "echo 'Installing $1...'; omarchy-pkg-add $2 && sleep 2 && omarchy-font-set '$3'"
}
install_terminal() {
@@ -68,11 +68,11 @@ install_terminal() {
}
aur_install() {
present_terminal "echo 'Installing $1 from AUR...'; yay -S --noconfirm $2"
present_terminal "echo 'Installing $1 from AUR...'; omarchy-pkg-aur-add $2"
}
aur_install_and_launch() {
present_terminal "echo 'Installing $1 from AUR...'; yay -S --noconfirm $2 && setsid gtk-launch $3"
present_terminal "echo 'Installing $1 from AUR...'; omarchy-pkg-aur-add $2 && setsid gtk-launch $3"
}
show_learn_menu() {
@@ -88,38 +88,65 @@ show_learn_menu() {
}
show_trigger_menu() {
case $(menu "Trigger" " Capture\n Share\n󰔎 Toggle") in
case $(menu "Trigger" " Capture\n Share\n󰔎 Toggle\n Hardware") in
*Capture*) show_capture_menu ;;
*Share*) show_share_menu ;;
*Toggle*) show_toggle_menu ;;
*Hardware*) show_hardware_menu ;;
*) show_main_menu ;;
esac
}
show_capture_menu() {
case $(menu "Capture" " Screenshot\n Screenrecord\n󰃉 Color") in
*Screenshot*) show_screenshot_menu ;;
*Screenshot*) omarchy-cmd-screenshot ;;
*Screenrecord*) show_screenrecord_menu ;;
*Color*) pkill hyprpicker || hyprpicker -a ;;
*) show_trigger_menu ;;
esac
}
show_screenshot_menu() {
case $(menu "Screenshot" " Snap with Editing\n Straight to Clipboard") in
*Editing*) omarchy-cmd-screenshot smart ;;
*Clipboard*) omarchy-cmd-screenshot smart clipboard ;;
*) show_capture_menu ;;
esac
get_webcam_list() {
v4l2-ctl --list-devices 2>/dev/null | while IFS= read -r line; do
if [[ $line != $'\t'* && -n $line ]]; then
local name="$line"
IFS= read -r device || break
device=$(echo "$device" | tr -d '\t' | head -1)
[[ -n $device ]] && echo "$device $name"
fi
done
}
show_webcam_select_menu() {
local devices=$(get_webcam_list)
local count=$(echo "$devices" | grep -c . 2>/dev/null || echo 0)
if [[ -z $devices ]] || ((count == 0)); then
notify-send "No webcam devices found" -u critical -t 3000
return 1
fi
if ((count == 1)); then
echo "$devices" | awk '{print $1}'
else
menu "Select Webcam" "$devices" | awk '{print $1}'
fi
}
show_screenrecord_menu() {
omarchy-cmd-screenrecord --stop-recording && exit 0
case $(menu "Screenrecord" " With desktop audio\n With desktop + microphone audio\n With desktop + microphone audio + webcam") in
case $(menu "Screenrecord" " With no audio\n With desktop audio\n With desktop + microphone audio\n With desktop + microphone audio + webcam") in
*"With no audio") omarchy-cmd-screenrecord ;;
*"With desktop audio") omarchy-cmd-screenrecord --with-desktop-audio ;;
*"With desktop + microphone audio") omarchy-cmd-screenrecord --with-desktop-audio --with-microphone-audio ;;
*"With desktop + microphone audio + webcam") omarchy-cmd-screenrecord --with-desktop-audio --with-microphone-audio --with-webcam ;;
*"With desktop + microphone audio + webcam")
local device=$(show_webcam_select_menu) || {
back_to show_capture_menu
return
}
omarchy-cmd-screenrecord --with-desktop-audio --with-microphone-audio --with-webcam --webcam-device="$device"
;;
*) back_to show_capture_menu ;;
esac
}
@@ -143,11 +170,18 @@ show_toggle_menu() {
esac
}
show_hardware_menu() {
case $(menu "Toggle" " Hybrid GPU") in
*"Hybrid GPU"*) present_terminal omarchy-toggle-hybrid-gpu ;;
*) show_trigger_menu ;;
esac
}
show_style_menu() {
case $(menu "Style" "󰸌 Theme\n Font\n Background\n Hyprland\n󱄄 Screensaver\n About") in
*Theme*) show_theme_menu ;;
*Font*) show_font_menu ;;
*Background*) omarchy-theme-bg-next ;;
*Background*) show_background_menu ;;
*Hyprland*) open_in_editor ~/.config/hypr/looknfeel.conf ;;
*Screensaver*) open_in_editor ~/.config/omarchy/branding/screensaver.txt ;;
*About*) open_in_editor ~/.config/omarchy/branding/about.txt ;;
@@ -159,9 +193,13 @@ show_theme_menu() {
omarchy-launch-walker -m menus:omarchythemes --width 800 --minheight 400
}
show_background_menu() {
omarchy-launch-walker -m menus:omarchyBackgroundSelector --width 800 --minheight 400
}
show_font_menu() {
theme=$(menu "Font" "$(omarchy-font-list)" "--width 350" "$(omarchy-font-current)")
if [[ "$theme" == "CNCLD" || -z "$theme" ]]; then
if [[ $theme == "CNCLD" || -z $theme ]]; then
back_to show_style_menu
else
omarchy-font-set "$theme"
@@ -170,8 +208,8 @@ show_font_menu() {
show_setup_menu() {
local options=" Audio\n Wifi\n󰂯 Bluetooth\n󱐋 Power Profile\n System Sleep\n󰍹 Monitors"
[ -f ~/.config/hypr/bindings.conf ] && options="$options\n Keybindings"
[ -f ~/.config/hypr/input.conf ] && options="$options\n Input"
[[ -f ~/.config/hypr/bindings.conf ]] && options="$options\n Keybindings"
[[ -f ~/.config/hypr/input.conf ]] && options="$options\n Input"
options="$options\n󰱔 DNS\n Security\n Config"
case $(menu "Setup" "$options") in
@@ -193,7 +231,7 @@ show_setup_menu() {
show_setup_power_menu() {
profile=$(menu "Power Profile" "$(omarchy-powerprofiles-list)" "" "$(powerprofilesctl get)")
if [[ "$profile" == "CNCLD" || -z "$profile" ]]; then
if [[ $profile == "CNCLD" || -z $profile ]]; then
back_to show_setup_menu
else
powerprofilesctl set "$profile"
@@ -226,10 +264,10 @@ show_setup_config_menu() {
show_setup_system_menu() {
local options=""
if [ -f ~/.local/state/omarchy/toggles/suspend-on ]; then
options="$options󰒲 Disable Suspend"
else
if [[ -f ~/.local/state/omarchy/toggles/suspend-off ]]; then
options="$options󰒲 Enable Suspend"
else
options="$options󰒲 Disable Suspend"
fi
if omarchy-hibernation-available; then
@@ -265,9 +303,10 @@ show_install_menu() {
}
show_install_service_menu() {
case $(menu "Install" " Dropbox\n Tailscale\n󰟵 Bitwarden\n Chromium Account") in
case $(menu "Install" " Dropbox\n Tailscale\n󱇱 NordVPN\n󰟵 Bitwarden\n Chromium Account") in
*Dropbox*) present_terminal omarchy-install-dropbox ;;
*Tailscale*) present_terminal omarchy-install-tailscale ;;
*NordVPN*) present_terminal omarchy-install-nordvpn ;;
*Bitwarden*) install_and_launch "Bitwarden" "bitwarden bitwarden-cli" "bitwarden" ;;
*Chromium*) present_terminal omarchy-install-chromium-google-account ;;
*) show_install_menu ;;
@@ -278,7 +317,7 @@ show_install_editor_menu() {
case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Emacs") in
*VSCode*) present_terminal omarchy-install-vscode ;;
*Cursor*) install_and_launch "Cursor" "cursor-bin" "cursor" ;;
*Zed*) present_terminal "echo 'Installing Zed...'; sudo pacman -S zed && setsid gtk-launch dev.zed.Zed" ;;
*Zed*) install_and_launch "Zed" "zed" "dev.zed.Zed" ;;
*Sublime*) install_and_launch "Sublime Text" "sublime-text-4" "sublime_text" ;;
*Helix*) install "Helix" "helix" ;;
*Emacs*) install "Emacs" "emacs-wayland" && systemctl --user enable --now emacs.service ;;
@@ -302,13 +341,13 @@ show_install_ai_menu() {
echo ollama
)
case $(menu "Install" " Dictation\n󱚤 Claude Code\n󱚤 Copilot CLI\n󱚤 Cursor CLI\n󱚤 Gemini\n󱚤 OpenAI Codex\n󱚤 LM Studio\n󱚤 Ollama\n󱚤 Crush") in
case $(menu "Install" " Dictation\n󱚤 Claude Code\n󱚤 Codex\n󱚤 Gemini CLI\n󱚤 Copilot CLI\n󱚤 Cursor CLI\n󱚤 LM Studio\n󱚤 Ollama\n󱚤 Crush") in
*Dictation*) present_terminal omarchy-voxtype-install ;;
*Claude*) install "Claude Code" "claude-code" ;;
*Codex*) install "Codex" "openai-codex" ;;
*Gemini*) install "Gemini CLI" "gemini-cli" ;;
*Copilot*) install "Copilot CLI" "github-copilot-cli" ;;
*Cursor*) install "Cursor CLI" "cursor-cli" ;;
*Gemini*) install "Gemini" "gemini-cli" ;;
*OpenAI*) install "OpenAI Codex" "openai-codex" ;;
*Studio*) install "LM Studio" "lmstudio" ;;
*Ollama*) install "Ollama" $ollama_pkg ;;
*Crush*) install "Crush" "crush-bin" ;;
@@ -317,8 +356,9 @@ show_install_ai_menu() {
}
show_install_gaming_menu() {
case $(menu "Install" " Steam\n RetroArch [AUR]\n󰍳 Minecraft\n󰖺 Xbox Controller [AUR]") in
case $(menu "Install" " Steam\n󰢹 NVIDIA GeForce NOW\n RetroArch [AUR]\n󰍳 Minecraft\n󰖺 Xbox Controller [AUR]") in
*Steam*) present_terminal omarchy-install-steam ;;
*GeForce*) present_terminal omarchy-install-geforce-now ;;
*RetroArch*) aur_install_and_launch "RetroArch" "retroarch retroarch-assets libretro libretro-fbneo" "com.libretro.RetroArch.desktop" ;;
*Minecraft*) install_and_launch "Minecraft" "minecraft-launcher" "minecraft-launcher" ;;
*Xbox*) present_terminal omarchy-install-xbox-controllers ;;
@@ -336,7 +376,8 @@ show_install_style_menu() {
}
show_install_font_menu() {
case $(menu "Install" " Meslo LG Mono\n Fira Code\n Victor Code\n Bistream Vera Mono\n Iosevka" "--width 350") in
case $(menu "Install" " Cascadia Mono\n Meslo LG Mono\n Fira Code\n Victor Code\n Bistream Vera Mono\n Iosevka" "--width 350") in
*Cascadia*) install_font "Cascadia Mono" "ttf-cascadia-mono-nerd" "CaskaydiaMono Nerd Font" ;;
*Meslo*) install_font "Meslo LG Mono" "ttf-meslo-nerd" "MesloLGL Nerd Font" ;;
*Fira*) install_font "Fira Code" "ttf-firacode-nerd" "FiraCode Nerd Font" ;;
*Victor*) install_font "Victor Code" "ttf-victor-mono-nerd" "VictorMono Nerd Font" ;;
@@ -347,7 +388,7 @@ show_install_font_menu() {
}
show_install_development_menu() {
case $(menu "Install" "󰫏 Ruby on Rails\n Docker DB\n JavaScript\n Go\n PHP\n Python\n Elixir\n Zig\n Rust\n Java\n .NET\n OCaml\n Clojure") in
case $(menu "Install" "󰫏 Ruby on Rails\n Docker DB\n JavaScript\n Go\n PHP\n Python\n Elixir\n Zig\n Rust\n Java\n .NET\n OCaml\n Clojure\n Scala") in
*Rails*) present_terminal "omarchy-install-dev-env ruby" ;;
*Docker*) present_terminal omarchy-install-docker-dbs ;;
*JavaScript*) show_install_javascript_menu ;;
@@ -361,6 +402,7 @@ show_install_development_menu() {
*NET*) present_terminal "omarchy-install-dev-env dotnet" ;;
*OCaml*) present_terminal "omarchy-install-dev-env ocaml" ;;
*Clojure*) present_terminal "omarchy-install-dev-env clojure" ;;
*Scala*) present_terminal "omarchy-install-dev-env scala" ;;
*) show_install_menu ;;
esac
}
@@ -392,11 +434,12 @@ show_install_elixir_menu() {
}
show_remove_menu() {
case $(menu "Remove" "󰣇 Package\n Web App\n TUI\n󰵮 Development\n Dictation\n󰸌 Theme\n󰍲 Windows\n󰈷 Fingerprint\n Fido2") in
case $(menu "Remove" "󰣇 Package\n Web App\n TUI\n󰵮 Development\n󰏓 Preinstalls\n Dictation\n󰸌 Theme\n󰍲 Windows\n󰈷 Fingerprint\n Fido2") in
*Package*) terminal omarchy-pkg-remove ;;
*Web*) present_terminal omarchy-webapp-remove ;;
*TUI*) present_terminal omarchy-tui-remove ;;
*Development*) show_remove_development_menu ;;
*Preinstalls*) present_terminal omarchy-remove-preinstalls ;;
*Dictation*) present_terminal omarchy-voxtype-remove ;;
*Theme*) present_terminal omarchy-theme-remove ;;
*Windows*) present_terminal "omarchy-windows-vm remove" ;;
@@ -407,7 +450,7 @@ show_remove_menu() {
}
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
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\n Scala") in
*Rails*) present_terminal "omarchy-remove-dev-env ruby" ;;
*JavaScript*) show_remove_javascript_menu ;;
*Go*) present_terminal "omarchy-remove-dev-env go" ;;
@@ -420,12 +463,13 @@ show_remove_development_menu() {
*NET*) present_terminal "omarchy-remove-dev-env dotnet" ;;
*OCaml*) present_terminal "omarchy-remove-dev-env ocaml" ;;
*Clojure*) present_terminal "omarchy-remove-dev-env clojure" ;;
*Scala*) present_terminal "omarchy-remove-dev-env scala" ;;
*) show_remove_menu ;;
esac
}
show_remove_javascript_menu() {
case $(menu "Remove" " Node.js\n Bun\n Deno") in
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" ;;
@@ -434,7 +478,7 @@ show_remove_javascript_menu() {
}
show_remove_php_menu() {
case $(menu "Remove" " PHP\n Laravel\n Symfony") in
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" ;;
@@ -443,7 +487,7 @@ show_remove_php_menu() {
}
show_remove_elixir_menu() {
case $(menu "Remove" " Elixir\n Phoenix") in
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 ;;
@@ -451,7 +495,7 @@ show_remove_elixir_menu() {
}
show_update_menu() {
case $(menu "Update" " Omarchy\n󰔫 Channel\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 ;;
*Channel*) show_update_channel_menu ;;
*Config*) show_update_config_menu ;;
@@ -467,8 +511,9 @@ show_update_menu() {
}
show_update_channel_menu() {
case $(menu "Update channel" "🟢 Stable\n🟡 Edge\n🔴 Dev") in
case $(menu "Update channel" "🟢 Stable\n🟡 RC\n🟠 Edge\n🔴 Dev") in
*Stable*) present_terminal "omarchy-channel-set stable" ;;
*RC*) present_terminal "omarchy-channel-set rc" ;;
*Edge*) present_terminal "omarchy-channel-set edge" ;;
*Dev*) present_terminal "omarchy-channel-set dev" ;;
*) show_update_menu ;;
@@ -486,13 +531,14 @@ show_update_process_menu() {
}
show_update_config_menu() {
case $(menu "Use default config" " Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n󱣴 Plymouth\n Swayosd\n󰌧 Walker\n󰍜 Waybar") in
case $(menu "Use default config" " Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n󱣴 Plymouth\n Swayosd\n Tmux\n󰌧 Walker\n󰍜 Waybar") in
*Hyprland*) present_terminal omarchy-refresh-hyprland ;;
*Hypridle*) present_terminal omarchy-refresh-hypridle ;;
*Hyprlock*) present_terminal omarchy-refresh-hyprlock ;;
*Hyprsunset*) present_terminal omarchy-refresh-hyprsunset ;;
*Plymouth*) present_terminal omarchy-refresh-plymouth ;;
*Swayosd*) present_terminal omarchy-refresh-swayosd ;;
*Tmux*) present_terminal omarchy-refresh-tmux ;;
*Walker*) present_terminal omarchy-refresh-walker ;;
*Waybar*) present_terminal omarchy-refresh-waybar ;;
*) show_update_menu ;;
@@ -516,19 +562,24 @@ show_update_password_menu() {
esac
}
show_about() {
omarchy-launch-about
}
show_system_menu() {
local options=" Lock\n󱄄 Screensaver"
[ -f ~/.local/state/omarchy/toggles/suspend-on ] && options="$options\n󰒲 Suspend"
local options="󱄄 Screensaver\n Lock"
[[ ! -f ~/.local/state/omarchy/toggles/suspend-off ]] && options="$options\n󰒲 Suspend"
omarchy-hibernation-available && options="$options\n󰤁 Hibernate"
options="$options\n󰜉 Restart\n󰐥 Shutdown"
options="$options\n󰍃 Logout\n󰜉 Restart\n󰐥 Shutdown"
case $(menu "System" "$options") in
*Lock*) omarchy-lock-screen ;;
*Screensaver*) omarchy-launch-screensaver force ;;
*Lock*) omarchy-lock-screen ;;
*Suspend*) systemctl suspend ;;
*Hibernate*) systemctl hibernate ;;
*Restart*) omarchy-cmd-reboot ;;
*Shutdown*) omarchy-cmd-shutdown ;;
*Logout*) omarchy-system-logout ;;
*Restart*) omarchy-system-reboot ;;
*Shutdown*) omarchy-system-shutdown ;;
*) back_to show_main_menu ;;
esac
}
@@ -543,17 +594,17 @@ go_to_menu() {
*learn*) show_learn_menu ;;
*trigger*) show_trigger_menu ;;
*share*) show_share_menu ;;
*background*) show_background_menu ;;
*capture*) show_capture_menu ;;
*style*) show_style_menu ;;
*theme*) show_theme_menu ;;
*screenshot*) show_screenshot_menu ;;
*screenrecord*) show_screenrecord_menu ;;
*setup*) show_setup_menu ;;
*power*) show_setup_power_menu ;;
*install*) show_install_menu ;;
*remove*) show_remove_menu ;;
*update*) show_update_menu ;;
*about*) omarchy-launch-about ;;
*about*) show_about ;;
*system*) show_system_menu ;;
esac
}
@@ -562,7 +613,7 @@ go_to_menu() {
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
go_to_menu "$1"
else
+47 -45
View File
@@ -12,7 +12,7 @@ build_keymap_cache() {
}
while IFS=, read -r code sym; do
[[ -z "$code" || -z "$sym" ]] && continue
[[ -z $code || -z $sym ]] && continue
KEYCODE_SYM_MAP["$code"]="$sym"
done < <(
awk '
@@ -42,13 +42,13 @@ lookup_keycode_cached() {
parse_keycodes() {
local start end elapsed
[[ "${DEBUG:-0}" == "1" ]] && start=$(date +%s.%N)
[[ ${DEBUG:-0} == "1" ]] && start=$(date +%s.%N)
while IFS= read -r line; do
if [[ "$line" =~ code:([0-9]+) ]]; then
if [[ $line =~ code:([0-9]+) ]]; then
code="${BASH_REMATCH[1]}"
symbol=$(lookup_keycode_cached "$code" "$XKB_KEYMAP_CACHE")
echo "${line/code:${code}/$symbol}"
elif [[ "$line" =~ mouse:([0-9]+) ]]; then
elif [[ $line =~ mouse:([0-9]+) ]]; then
code="${BASH_REMATCH[1]}"
case "$code" in
@@ -64,7 +64,7 @@ parse_keycodes() {
fi
done
if [[ "$DEBUG" == "1" ]]; then
if [[ $DEBUG == "1" ]]; then
end=$(date +%s.%N)
# fall back to awk if bc is missing
if command -v bc >/dev/null 2>&1; then
@@ -168,44 +168,47 @@ prioritize_entries() {
line = $0
prio = 50
if (match(line, /Terminal/)) prio = 0
if (match(line, /Browser/) && !match(line, /Browser[[:space:]]*\(/)) prio = 1
if (match(line, /File manager/)) prio = 2
if (match(line, /Launch apps/)) prio = 3
if (match(line, /Omarchy menu/)) prio = 4
if (match(line, /System menu/)) prio = 5
if (match(line, /Theme menu/)) prio = 6
if (match(line, /Full screen/)) prio = 7
if (match(line, /Full width/)) prio = 8
if (match(line, /Close window/)) prio = 9
if (match(line, /Close all windows/)) prio = 10
if (match(line, /Lock system/)) prio = 11
if (match(line, /Toggle window floating/)) prio = 12
if (match(line, /Toggle window split/)) prio = 13
if (match(line, /Pop window/)) prio = 14
if (match(line, /Universal/)) prio = 15
if (match(line, /Clipboard/)) prio = 16
if (match(line, /Audio controls/)) prio = 17
if (match(line, /Bluetooth controls/)) prio = 18
if (match(line, /Wifi controls/)) prio = 19
if (match(line, /Emoji picker/)) prio = 20
if (match(line, /Color picker/)) prio = 21
if (match(line, /Screenshot/)) prio = 22
if (match(line, /Screenrecording/)) prio = 23
if (match(line, /(Switch|Next|Former|Previous).*workspace/)) prio = 24
if (match(line, /Move window to workspace/)) prio = 25
if (match(line, /Move window silently to workspace/)) prio = 26
if (match(line, /Swap window/)) prio = 27
if (match(line, /Move window focus/)) prio = 28
if (match(line, /Move window$/)) prio = 29
if (match(line, /Resize window/)) prio = 30
if (match(line, /Expand window/)) prio = 31
if (match(line, /Shrink window/)) prio = 32
if (match(line, /scratchpad/)) prio = 33
if (match(line, /notification/)) prio = 34
if (match(line, /Toggle window transparency/)) prio = 35
if (match(line, /Toggle workspace gaps/)) prio = 36
if (match(line, /Toggle nightlight/)) prio = 37
if (match(line, /Toggle locking/)) prio = 38
if (match(line, /Tmux/)) prio = 1
if (match(line, /Browser/) && !match(line, /Browser[[:space:]]*\(/) && !match(line, /SUPER SHIFT.*\+.*B.*→.*Browser/)) prio = 2
if (match(line, /File manager/) && !match(line, /File manager \(cwd\)/)) prio = 3
if (match(line, /Launch apps/)) prio = 4
if (match(line, /Omarchy menu/)) prio = 5
if (match(line, /System menu/)) prio = 6
if (match(line, /Theme menu/)) prio = 7
if (match(line, /Full screen/)) prio = 8
if (match(line, /Full width/)) prio = 9
if (match(line, /Close window/)) prio = 10
if (match(line, /Close all windows/)) prio = 11
if (match(line, /Lock system/)) prio = 12
if (match(line, /Toggle window floating/)) prio = 13
if (match(line, /Toggle window split/)) prio = 14
if (match(line, /Pop window/)) prio = 15
if (match(line, /Universal/)) prio = 16
if (match(line, /Clipboard/)) prio = 17
if (match(line, /Audio controls/)) prio = 18
if (match(line, /Bluetooth controls/)) prio = 19
if (match(line, /Wifi controls/)) prio = 20
if (match(line, /Emoji picker/)) prio = 21
if (match(line, /Color picker/)) prio = 22
if (match(line, /Screenshot/)) prio = 23
if (match(line, /Screenrecording/)) prio = 24
if (match(line, /SUPER SHIFT.*\+.*B.*→.*Browser/)) prio = 25
if (match(line, /File manager \(cwd\)/)) prio = 26
if (match(line, /(Switch|Next|Former|Previous).*workspace/)) prio = 27
if (match(line, /Move window to workspace/)) prio = 28
if (match(line, /Move window silently to workspace/)) prio = 29
if (match(line, /Swap window/)) prio = 30
if (match(line, /Move window focus/)) prio = 31
if (match(line, /Move window$/)) prio = 32
if (match(line, /Resize window/)) prio = 33
if (match(line, /Expand window/)) prio = 34
if (match(line, /Shrink window/)) prio = 35
if (match(line, /scratchpad/)) prio = 36
if (match(line, /notification/)) prio = 37
if (match(line, /Toggle window transparency/)) prio = 38
if (match(line, /Toggle workspace gaps/)) prio = 39
if (match(line, /Toggle nightlight/)) prio = 40
if (match(line, /Toggle locking/)) prio = 41
if (match(line, /group/)) prio = 94
if (match(line, /Scroll active workspace/)) prio = 95
if (match(line, /Cycle to/)) prio = 96
@@ -233,7 +236,7 @@ output_keybindings() {
prioritize_entries
}
if [[ "$1" == "--print" || "$1" == "-p" ]]; then
if [[ $1 == "--print" || $1 == "-p" ]]; then
output_keybindings
else
monitor_height=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .height')
@@ -242,4 +245,3 @@ else
output_keybindings |
walker --dmenu -p 'Keybindings' --width 800 --height "$menu_height"
fi
+1 -1
View File
@@ -13,7 +13,7 @@ mkdir -p "$STATE_DIR/skipped"
for file in ~/.local/share/omarchy/migrations/*.sh; do
filename=$(basename "$file")
if [[ ! -f "$STATE_DIR/$filename" && ! -f "$STATE_DIR/skipped/$filename" ]]; then
if [[ ! -f $STATE_DIR/$filename && ! -f $STATE_DIR/skipped/$filename ]]; then
echo -e "\e[32m\nRunning migration (${filename%.sh})\e[0m"
if bash $file; then
+4 -3
View File
@@ -18,9 +18,10 @@ fzf_args=(
pkg_names=$(yay -Slqa | fzf "${fzf_args[@]}")
if [[ -n "$pkg_names" ]]; then
# Convert newline-separated selections to space-separated for yay
echo "$pkg_names" | tr '\n' ' ' | xargs yay -S --noconfirm
if [[ -n $pkg_names ]]; then
# Add aur/ prefix to each package name and convert to space-separated for yay
sudo -v
echo "$pkg_names" | sed 's/^/aur\//' | tr '\n' ' ' | xargs yay -S --noconfirm
sudo updatedb
omarchy-show-done
fi
+1 -1
View File
@@ -16,7 +16,7 @@ fzf_args=(
pkg_names=$(pacman -Slq | fzf "${fzf_args[@]}")
if [[ -n "$pkg_names" ]]; then
if [[ -n $pkg_names ]]; then
# Convert newline-separated selections to space-separated for yay
echo "$pkg_names" | tr '\n' ' ' | xargs sudo pacman -S --noconfirm
omarchy-show-done
+1 -1
View File
@@ -16,7 +16,7 @@ fzf_args=(
pkg_names=$(yay -Qqe | fzf "${fzf_args[@]}")
if [[ -n "$pkg_names" ]]; then
if [[ -n $pkg_names ]]; then
# Convert newline-separated selections to space-separated for yay
echo "$pkg_names" | tr '\n' ' ' | xargs sudo pacman -Rns --noconfirm
omarchy-show-done
+2 -2
View File
@@ -6,7 +6,7 @@ CONFIG_FILE="$HOME/.config/chromium-flags.conf"
INSTALL_GOOGLE_ACCOUNTS=false
# Check if google accounts were installed
if [[ -f "$CONFIG_FILE" ]] && \
if [[ -f $CONFIG_FILE ]] && \
grep -q -- "--oauth2-client-id" "$CONFIG_FILE" && \
grep -q -- "--oauth2-client-secret" "$CONFIG_FILE"; then
INSTALL_GOOGLE_ACCOUNTS=true
@@ -16,6 +16,6 @@ fi
omarchy-refresh-config chromium-flags.conf
# Re-install Google accounts if previously configured
if [[ "$INSTALL_GOOGLE_ACCOUNTS" == true ]]; then
if [[ $INSTALL_GOOGLE_ACCOUNTS == "true" ]]; then
omarchy-install-chromium-google-account
fi
+2 -2
View File
@@ -5,7 +5,7 @@
config_file=$1
if [[ -z "$config_file" ]]; then
if [[ -z $config_file ]]; then
cat <<USAGE
Usage: $0 [config_file]
@@ -22,7 +22,7 @@ user_config_file="${HOME}/.config/$config_file"
default_config_file="${HOME}/.local/share/omarchy/config/$config_file"
backup_config_file="$user_config_file.bak.$(date +%s)"
if [[ -f "$user_config_file" ]]; then
if [[ -f $user_config_file ]]; then
# Create preliminary backup
cp -f "$user_config_file" "$backup_config_file" 2>/dev/null
+10 -9
View File
@@ -7,17 +7,18 @@
sudo cp -f /etc/pacman.conf /etc/pacman.conf.bak
sudo cp -f /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak
if [[ $1 == "edge" ]]; then
sudo cp -f ~/.local/share/omarchy/default/pacman/pacman-edge.conf /etc/pacman.conf
sudo cp -f ~/.local/share/omarchy/default/pacman/mirrorlist-edge /etc/pacman.d/mirrorlist
echo "Setting channel to edge"
else
sudo cp -f ~/.local/share/omarchy/default/pacman/pacman-stable.conf /etc/pacman.conf
sudo cp -f ~/.local/share/omarchy/default/pacman/mirrorlist-stable /etc/pacman.d/mirrorlist
echo "Setting channel to stable"
channel="${1:-stable}"
if [[ $channel != "stable" && $channel != "rc" && $channel != "edge" ]]; then
echo "Error: Invalid channel '$channel'. Must be one of: stable, rc, edge"
exit 1
fi
echo "Setting channel to $channel"
echo
sudo cp -f "$OMARCHY_PATH/default/pacman/pacman-$channel.conf" /etc/pacman.conf
sudo cp -f "$OMARCHY_PATH/default/pacman/mirrorlist-$channel" /etc/pacman.d/mirrorlist
# Reset all package DBs and then update
sudo pacman -Syyu --noconfirm
sudo pacman -Syyuu --noconfirm
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
# Refresh the SDDM theme from default
sudo rm -rf /usr/share/sddm/themes/omarchy
sudo cp -r $OMARCHY_PATH/default/sddm/omarchy /usr/share/sddm/themes/omarchy
+9
View File
@@ -0,0 +1,9 @@
#!/bin/bash
# Overwrite the user tmux config with the Omarchy default and reload tmux.
omarchy-refresh-config tmux/tmux.conf
if pgrep -x tmux; then
tmux source-file ~/.config/tmux/tmux.conf
fi
+8
View File
@@ -5,9 +5,17 @@
# Ensure walker is set to autostart
mkdir -p ~/.config/autostart/
cp $OMARCHY_PATH/default/walker/walker.desktop ~/.config/autostart/
# And restarts if it crashes or is killed
mkdir -p ~/.config/systemd/user/app-walker@autostart.service.d/
cp $OMARCHY_PATH/default/walker/restart.conf ~/.config/systemd/user/app-walker@autostart.service.d/restart.conf
systemctl --user daemon-reload
# Refresh configs
omarchy-refresh-config walker/config.toml
omarchy-refresh-config elephant/calc.toml
omarchy-refresh-config elephant/desktopapplications.toml
# Restart service
omarchy-restart-walker
+1 -1
View File
@@ -10,5 +10,5 @@ if gum confirm "Are you sure you want to reinstall and lose all config changes?"
omarchy-reinstall-pkgs
omarchy-reinstall-configs
gum confirm "System has been reinstalled. Reboot?" && omarchy-cmd-reboot
gum confirm "System has been reinstalled. Reboot?" && omarchy-system-reboot
fi
+1 -1
View File
@@ -3,7 +3,7 @@ set -e
# Overwrite all user configs with the Omarchy defaults.
if [ "$EUID" -eq 0 ]; then
if (( EUID == 0 )); then
echo "Error: This script should not be run as root"
exit 1
fi
+12 -2
View File
@@ -1,7 +1,10 @@
#!/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
# Remove a development environment that was previously installed via omarchy-install-dev-env.
# Usage: omarchy-remove-dev-env <ruby|node|bun|deno|go|php|laravel|symfony|python|elixir|phoenix|zig|rust|java|dotnet|ocaml|clojure|scala>
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|scala>" >&2
exit 1
fi
@@ -93,6 +96,13 @@ clojure)
mise uninstall clojure --all
mise rm -g clojure
;;
scala)
echo -e "Removing Scala...\n"
mise uninstall scala --all
mise uninstall scala-cli --all
mise rm -g scala
mise rm -g scala-cli
;;
*)
echo "Unknown environment: $1"
exit 1
+32
View File
@@ -0,0 +1,32 @@
#!/bin/bash
# Remove preinstalled Omarchy applications (web apps, TUIs, and selected packages).
# This removes all web apps, TUIs, plus specific desktop applications.
if gum confirm "Are you sure you want to remove all preinstalled web apps, TUI wrappers, and desktop applications?"; then
echo -e "Removing preinstalled Omarchy applications...\n"
omarchy-webapp-remove-all
omarchy-tui-remove-all
cp ~/.config/hypr/bindings.conf ~/.config/hypr/bindings.conf.bak
cp "$OMARCHY_PATH/default/hypr/plain-bindings.conf" ~/.config/hypr/bindings.conf
hyprctl reload
omarchy-pkg-drop \
aether \
typora \
spotify \
libreoffice-fresh \
1password-beta \
1password-cli \
xournalpp \
signal-desktop \
pinta \
obsidian \
obs-studio \
kdenlive \
lazydocker \
opencode \
claude-code
fi
+3
View File
@@ -1,4 +1,7 @@
#!/bin/bash
# Reset the sudo lockout/faillock for the current user.
# This clears any failed authentication attempts that may have locked the user out.
# Resetting sudo lockout for user
su -c "faillock --reset --user $USER"
+4 -1
View File
@@ -1,4 +1,7 @@
#!/bin/bash
# Restart an application by killing it and relaunching via uwsm.
# Usage: omarchy-restart-app <application-name> [application-args...]
pkill -x $1
setsid uwsm-app -- $1 >/dev/null 2>&1 &
setsid uwsm-app -- "$@" >/dev/null 2>&1 &
+2
View File
@@ -1,5 +1,7 @@
#!/bin/bash
# Unblock and restart the bluetooth service.
echo -e "Unblocking bluetooth...\n"
rfkill unblock bluetooth
rfkill list bluetooth
+2
View File
@@ -1,3 +1,5 @@
#!/bin/bash
# Restart the hypridle service (used for idle detection and auto-lock).
omarchy-restart-app hypridle
+2
View File
@@ -1,3 +1,5 @@
#!/bin/bash
# Restart the hyprsunset service (used for blue light filtering/night light).
omarchy-restart-app hyprsunset
+3 -1
View File
@@ -2,4 +2,6 @@
# Reload opencode configuration (used by the Omarchy theme switching).
killall -SIGUSR2 opencode
if pgrep -x opencode >/dev/null; then
killall -SIGUSR2 opencode
fi
+2
View File
@@ -1,4 +1,6 @@
#!/bin/bash
# Restart the PipeWire audio service to fix audio issues or apply new configuration.
echo -e "Restarting pipewire audio service...\n"
systemctl --user restart pipewire.service
+1 -1
View File
@@ -12,7 +12,7 @@ restart_services() {
fi
}
if [[ $EUID -eq 0 ]]; then
if (( EUID == 0 )); then
SCRIPT_OWNER=$(stat -c '%U' "$0")
USER_UID=$(id -u "$SCRIPT_OWNER")
systemd-run --uid="$SCRIPT_OWNER" --setenv=XDG_RUNTIME_DIR="/run/user/$USER_UID" \
+2
View File
@@ -1,5 +1,7 @@
#!/bin/bash
# Unblock and restart the Wi-Fi service.
echo -e "Unblocking wifi...\n"
rfkill unblock wifi
rfkill list wifi
+3 -1
View File
@@ -1,3 +1,5 @@
#!/bin/bash
omarchy-restart-app fcitx5
# Restart the XCompose input method service (fcitx5) to apply new compose key settings.
omarchy-restart-app fcitx5 --disable notificationitem
+39 -47
View File
@@ -1,7 +1,30 @@
#!/bin/bash
lock_dns_to_resolved() {
for file in /etc/systemd/network/*.network; do
[[ -f $file ]] || continue
if ! grep -q "^\[DHCPv4\]" "$file"; then continue; fi
if ! sed -n '/^\[DHCPv4\]/,/^\[/p' "$file" | grep -q "^UseDNS="; then
sudo sed -i '/^\[DHCPv4\]/a UseDNS=no' "$file"
fi
if grep -q "^\[IPv6AcceptRA\]" "$file" && ! sed -n '/^\[IPv6AcceptRA\]/,/^\[/p' "$file" | grep -q "^UseDNS="; then
sudo sed -i '/^\[IPv6AcceptRA\]/a UseDNS=no' "$file"
fi
done
}
unlock_dns_to_dhcp() {
for file in /etc/systemd/network/*.network; do
[[ -f $file ]] || continue
sudo sed -i '/^\[DHCPv4\]/{n;/^UseDNS=no$/d}' "$file"
sudo sed -i '/^\[IPv6AcceptRA\]/{n;/^UseDNS=no$/d}' "$file"
done
}
if [[ -z $1 ]]; then
dns=$(gum choose --height 5 --header "Select DNS provider" Cloudflare DHCP Custom)
dns=$(gum choose --height 6 --header "Select DNS provider" Cloudflare Google DHCP Custom)
else
dns=$1
fi
@@ -14,24 +37,17 @@ DNS=1.1.1.1#cloudflare-dns.com 1.0.0.1#cloudflare-dns.com
FallbackDNS=9.9.9.9 149.112.112.112
DNSOverTLS=opportunistic
EOF
# Ensure network interfaces don't override our DNS settings
for file in /etc/systemd/network/*.network; do
[[ -f "$file" ]] || continue
if ! grep -q "^\[DHCPv4\]" "$file"; then continue; fi
# Add UseDNS=no to DHCPv4 section if not present
if ! sed -n '/^\[DHCPv4\]/,/^\[/p' "$file" | grep -q "^UseDNS="; then
sudo sed -i '/^\[DHCPv4\]/a UseDNS=no' "$file"
fi
# Add UseDNS=no to IPv6AcceptRA section if present
if grep -q "^\[IPv6AcceptRA\]" "$file" && ! sed -n '/^\[IPv6AcceptRA\]/,/^\[/p' "$file" | grep -q "^UseDNS="; then
sudo sed -i '/^\[IPv6AcceptRA\]/a UseDNS=no' "$file"
fi
done
sudo systemctl restart systemd-networkd systemd-resolved
lock_dns_to_resolved
;;
Google)
sudo tee /etc/systemd/resolved.conf >/dev/null <<'EOF'
[Resolve]
DNS=8.8.8.8#dns.google 8.8.4.4#dns.google
FallbackDNS=9.9.9.9 149.112.112.112
DNSOverTLS=opportunistic
EOF
lock_dns_to_resolved
;;
DHCP)
@@ -39,21 +55,14 @@ DHCP)
[Resolve]
DNSOverTLS=no
EOF
# Allow network interfaces to use DHCP DNS
for file in /etc/systemd/network/*.network; do
[[ -f "$file" ]] || continue
sudo sed -i '/^UseDNS=no/d' "$file"
done
sudo systemctl restart systemd-networkd systemd-resolved
unlock_dns_to_dhcp
;;
Custom)
echo "Enter your DNS servers (space-separated, e.g. '192.168.1.1 1.1.1.1'):"
read -r dns_servers
if [[ -z "$dns_servers" ]]; then
if [[ -z $dns_servers ]]; then
echo "Error: No DNS servers provided."
exit 1
fi
@@ -63,25 +72,8 @@ Custom)
DNS=$dns_servers
FallbackDNS=9.9.9.9 149.112.112.112
EOF
# Ensure network interfaces don't override our DNS settings
for file in /etc/systemd/network/*.network; do
[[ -f "$file" ]] || continue
if ! grep -q "^\[DHCPv4\]" "$file"; then continue; fi
# Add UseDNS=no to DHCPv4 section if not present
if ! sed -n '/^\[DHCPv4\]/,/^\[/p' "$file" | grep -q "^UseDNS="; then
sudo sed -i '/^\[DHCPv4\]/a UseDNS=no' "$file"
fi
# Add UseDNS=no to IPv6AcceptRA section if present
if grep -q "^\[IPv6AcceptRA\]" "$file" && ! sed -n '/^\[IPv6AcceptRA\]/,/^\[/p' "$file" | grep -q "^UseDNS="; then
sudo sed -i '/^\[IPv6AcceptRA\]/a UseDNS=no' "$file"
fi
done
sudo systemctl restart systemd-networkd systemd-resolved
lock_dns_to_resolved
;;
esac
sudo systemctl restart systemd-networkd systemd-resolved
+8 -8
View File
@@ -21,7 +21,7 @@ print_info() {
check_fido2_hardware() {
tokens=$(fido2-token -L 2>/dev/null)
if [ -z "$tokens" ]; then
if [[ -z $tokens ]]; then
print_error "\nNo FIDO2 device detected. Please plug it in (you may need to unlock it as well)."
return 1
fi
@@ -36,10 +36,10 @@ setup_pam_config() {
fi
# Configure polkit
if [ -f /etc/pam.d/polkit-1 ] && ! grep -q 'pam_u2f.so' /etc/pam.d/polkit-1; then
if [[ -f /etc/pam.d/polkit-1 ]] && ! grep -q 'pam_u2f.so' /etc/pam.d/polkit-1; then
print_info "Configuring polkit for FIDO2 authentication..."
sudo sed -i '1i auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2' /etc/pam.d/polkit-1
elif [ ! -f /etc/pam.d/polkit-1 ]; then
elif [[ ! -f /etc/pam.d/polkit-1 ]]; then
print_info "Creating polkit configuration with FIDO2 authentication..."
sudo tee /etc/pam.d/polkit-1 >/dev/null <<'EOF'
auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2
@@ -60,20 +60,20 @@ remove_pam_config() {
fi
# Remove from polkit
if [ -f /etc/pam.d/polkit-1 ] && grep -Fq 'pam_u2f.so' /etc/pam.d/polkit-1; then
if [[ -f /etc/pam.d/polkit-1 ]] && grep -Fq 'pam_u2f.so' /etc/pam.d/polkit-1; then
print_info "Removing FIDO2 authentication from polkit..."
sudo sed -i '/pam_u2f\.so/d' /etc/pam.d/polkit-1
fi
}
if [[ "--remove" == "$1" ]]; then
if [[ "--remove" == $1 ]]; then
print_success "Removing FIDO2 device from authentication.\n"
# Remove PAM configuration
remove_pam_config
# Remove FIDO2 configuration
if [ -d /etc/fido2 ]; then
if [[ -d /etc/fido2 ]]; then
print_info "Removing FIDO2 configuration..."
sudo rm -rf /etc/fido2
fi
@@ -88,14 +88,14 @@ else
# Install required packages
print_info "Installing required packages..."
sudo pacman -S --noconfirm --needed libfido2 pam-u2f
omarchy-pkg-add libfido2 pam-u2f
if ! check_fido2_hardware; then
exit 1
fi
# Create the pamu2fcfg file
if [ ! -f /etc/fido2/fido2 ]; then
if [[ ! -f /etc/fido2/fido2 ]]; then
sudo mkdir -p /etc/fido2
print_success "\nLet's setup your device by confirming on the device now."
print_info "Touch your FIDO2 key when it lights up...\n"
+8 -6
View File
@@ -24,7 +24,7 @@ check_fingerprint_hardware() {
devices=$(fprintd-list "$USER" 2>/dev/null)
# Exit if no devices found
if [[ -z "$devices" ]]; then
if [[ -z $devices ]]; then
print_error "\nNo fingerprint sensor detected."
return 1
fi
@@ -39,10 +39,10 @@ setup_pam_config() {
fi
# Configure polkit
if [ -f /etc/pam.d/polkit-1 ] && ! grep -q 'pam_fprintd.so' /etc/pam.d/polkit-1; then
if [[ -f /etc/pam.d/polkit-1 ]] && ! grep -q 'pam_fprintd.so' /etc/pam.d/polkit-1; then
print_info "Configuring polkit for fingerprint authentication..."
sudo sed -i '1i auth sufficient pam_fprintd.so' /etc/pam.d/polkit-1
elif [ ! -f /etc/pam.d/polkit-1 ]; then
elif [[ ! -f /etc/pam.d/polkit-1 ]]; then
print_info "Creating polkit configuration with fingerprint authentication..."
sudo tee /etc/pam.d/polkit-1 >/dev/null <<'EOF'
auth sufficient pam_fprintd.so
@@ -58,11 +58,13 @@ EOF
add_hyprlock_fingerprint_icon() {
print_info "Adding fingerprint icon to hyprlock placeholder text..."
sed -i 's/placeholder_text = .*/placeholder_text = <span> Enter Password 󰈷 <\/span>/' ~/.config/hypr/hyprlock.conf
sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = true/' ~/.config/hypr/hyprlock.conf
}
remove_hyprlock_fingerprint_icon() {
print_info "Removing fingerprint icon from hyprlock placeholder text..."
sed -i 's/placeholder_text = .*/placeholder_text = Enter Password/' ~/.config/hypr/hyprlock.conf
sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = false/' ~/.config/hypr/hyprlock.conf
}
remove_pam_config() {
@@ -73,13 +75,13 @@ remove_pam_config() {
fi
# Remove from polkit
if [ -f /etc/pam.d/polkit-1 ] && grep -Fq 'pam_fprintd.so' /etc/pam.d/polkit-1; then
if [[ -f /etc/pam.d/polkit-1 ]] && grep -Fq 'pam_fprintd.so' /etc/pam.d/polkit-1; then
print_info "Removing fingerprint authentication from polkit..."
sudo sed -i '/pam_fprintd\.so/d' /etc/pam.d/polkit-1
fi
}
if [[ "--remove" == "$1" ]]; then
if [[ "--remove" == $1 ]]; then
print_success "Removing fingerprint scanner from authentication.\n"
# Remove PAM configuration
@@ -98,7 +100,7 @@ else
# Install required packages
print_info "Installing required packages..."
sudo pacman -S --noconfirm --needed fprintd usbutils
omarchy-pkg-add fprintd usbutils
if ! check_fingerprint_hardware; then
exit 1
+3
View File
@@ -1,4 +1,7 @@
#!/bin/bash
# Display a "Done!" message with a spinner and wait for user to press any key.
# Used by various install scripts to indicate completion.
echo
gum spin --spinner "globe" --title "Done! Press any key to close..." -- bash -c 'read -n 1 -s'
+3
View File
@@ -1,5 +1,8 @@
#!/bin/bash
# Display the Omarchy logo in the terminal using green color.
# Used by various presentation scripts to show branding.
clear
echo -e "\033[32m"
cat <~/.local/share/omarchy/logo.txt
+6 -2
View File
@@ -1,17 +1,21 @@
#!/bin/bash
# Manage persistent state files for Omarchy toggles and settings.
# Usage: omarchy-state <set|clear> <state-name-or-pattern>
# Used to track whether features like suspend, idle lock, etc are enabled or disabled.
STATE_DIR="$HOME/.local/state/omarchy"
mkdir -p "$STATE_DIR"
COMMAND="$1"
STATE_NAME="$2"
if [[ -z "$COMMAND" ]]; then
if [[ -z $COMMAND ]]; then
echo "Usage: omarchy-state <set|clear> <state-name-or-pattern>"
exit 1
fi
if [[ -z "$STATE_NAME" ]]; then
if [[ -z $STATE_NAME ]]; then
echo "Usage: omarchy-state $COMMAND <state-name>"
exit 1
fi
+4 -1
View File
@@ -5,8 +5,11 @@
percent="$1"
progress="$(awk -v p="$percent" 'BEGIN{printf "%.2f", p/100}')"
[[ $progress == "0.00" ]] && progress="0.01"
swayosd-client \
--monitor "$(hyprctl monitors -j | jq -r '.[]|select(.focused==true).name')" \
--custom-icon display-brightness \
--custom-progress "$(awk -v p="$percent" 'BEGIN{printf "%.2f", p/100}')" \
--custom-progress "$progress" \
--custom-progress-text "${percent}%"
+15
View File
@@ -0,0 +1,15 @@
#!/bin/bash
# Display keyboard brightness level using SwayOSD on the current monitor.
# Usage: omarchy-swayosd-kbd-brightness <percent>
percent="$1"
progress="$(awk -v p="$percent" 'BEGIN{printf "%.2f", p/100}')"
[[ $progress == "0.00" ]] && progress="0.01"
swayosd-client \
--monitor "$(hyprctl monitors -j | jq -r '.[]|select(.focused==true).name')" \
--custom-icon keyboard-brightness \
--custom-progress "$progress" \
--custom-progress-text "${percent}%"
+11
View File
@@ -0,0 +1,11 @@
#!/bin/bash
# Logout command that first closes all application windows (thus giving them a chance to save state),
# then stops the session, returning to the SDDM login screen.
# Schedule the session stop after closing windows (detached from terminal)
nohup bash -c "sleep 2 && uwsm stop" >/dev/null 2>&1 &
# Now close all windows
omarchy-hyprland-window-close-all
sleep 1 # Allow apps like Chrome to shutdown correctly
+4 -4
View File
@@ -10,13 +10,13 @@ CURRENT_BACKGROUND_LINK="$HOME/.config/omarchy/current/background"
mapfile -d '' -t BACKGROUNDS < <(find -L "$USER_BACKGROUNDS_PATH" "$THEME_BACKGROUNDS_PATH" -maxdepth 1 -type f -print0 2>/dev/null | sort -z)
TOTAL=${#BACKGROUNDS[@]}
if [[ $TOTAL -eq 0 ]]; then
if (( TOTAL == 0 )); then
notify-send "No background was found for theme" -t 2000
pkill -x swaybg
setsid uwsm-app -- swaybg --color '#000000' >/dev/null 2>&1 &
else
# Get current background from symlink
if [[ -L "$CURRENT_BACKGROUND_LINK" ]]; then
if [[ -L $CURRENT_BACKGROUND_LINK ]]; then
CURRENT_BACKGROUND=$(readlink "$CURRENT_BACKGROUND_LINK")
else
# Default to first background if no symlink exists
@@ -26,14 +26,14 @@ else
# Find current background index
INDEX=-1
for i in "${!BACKGROUNDS[@]}"; do
if [[ "${BACKGROUNDS[$i]}" == "$CURRENT_BACKGROUND" ]]; then
if [[ ${BACKGROUNDS[$i]} == $CURRENT_BACKGROUND ]]; then
INDEX=$i
break
fi
done
# Get next background (wrap around)
if [[ $INDEX -eq -1 ]]; then
if (( INDEX == -1 )); then
# Use the first background when no match was found
NEW_BACKGROUND="${BACKGROUNDS[0]}"
else
+18
View File
@@ -0,0 +1,18 @@
#!/bin/bash
# Sets the specified image as the current background
if [[ -z $1 ]]; then
echo "Usage: omarchy-theme-bg-set <path-to-image>" >&2
exit 1
fi
BACKGROUND="$1"
CURRENT_BACKGROUND_LINK="$HOME/.config/omarchy/current/background"
# Create symlink to the new background
ln -nsf "$BACKGROUND" "$CURRENT_BACKGROUND_LINK"
# Kill existing swaybg and start new one
pkill -x swaybg
setsid uwsm-app -- swaybg -i "$CURRENT_BACKGROUND_LINK" -m fill >/dev/null 2>&1 &
+3 -3
View File
@@ -3,14 +3,14 @@
# omarchy-theme-install: Install a new theme from a git repo for Omarchy
# Usage: omarchy-theme-install <git-repo-url>
if [ -z "$1" ]; then
if [[ -z $1 ]]; then
echo -e "\e[32mSee https://manuals.omamix.org/2/the-omarchy-manual/90/extra-themes\n\e[0m"
REPO_URL=$(gum input --placeholder="Git repo URL for theme" --header="")
else
REPO_URL="$1"
fi
if [ -z "$REPO_URL" ]; then
if [[ -z $REPO_URL ]]; then
exit 1
fi
@@ -19,7 +19,7 @@ THEME_NAME=$(basename "$REPO_URL" .git | sed -E 's/^omarchy-//; s/-theme$//')
THEME_PATH="$THEMES_DIR/$THEME_NAME"
# Remove existing theme if present
if [ -d "$THEME_PATH" ]; then
if [[ -d $THEME_PATH ]]; then
rm -rf "$THEME_PATH"
fi
+9
View File
@@ -0,0 +1,9 @@
#!/bin/bash
# Refresh the current theme from its templates.
THEME_NAME_PATH="$HOME/.config/omarchy/current/theme.name"
if [[ -f $THEME_NAME_PATH ]]; then
omarchy-theme-set "$(cat $THEME_NAME_PATH)"
fi
+4 -4
View File
@@ -3,10 +3,10 @@
# omarchy-theme-remove: Remove a theme from Omarchy by name
# Usage: omarchy-theme-remove <theme-name>
if [ -z "$1" ]; then
if [[ -z $1 ]]; then
mapfile -t extra_themes < <(find ~/.config/omarchy/themes -mindepth 1 -maxdepth 1 -type d ! -xtype l -printf '%f\n')
if [[ ${#extra_themes[@]} -gt 0 ]]; then
if (( ${#extra_themes[@]} > 0 )); then
THEME_NAME=$(printf '%s\n' "${extra_themes[@]}" | sort | gum choose --header="Remove extra theme")
else
echo "No extra themes installed."
@@ -21,12 +21,12 @@ CURRENT_DIR="$HOME/.config/omarchy/current"
THEME_PATH="$THEMES_DIR/$THEME_NAME"
# Ensure a theme was set
if [ -z "$THEME_NAME" ]; then
if [[ -z $THEME_NAME ]]; then
exit 1
fi
# Check if theme exists before attempting removal
if [ ! -d "$THEME_PATH" ]; then
if [[ ! -d $THEME_PATH ]]; then
echo "Error: Theme '$THEME_NAME' not found."
exit 1
fi
+6 -8
View File
@@ -12,11 +12,7 @@ OMARCHY_THEMES_PATH="$OMARCHY_PATH/themes"
THEME_NAME=$(echo "$1" | sed -E 's/<[^>]+>//g' | tr '[:upper:]' '[:lower:]' | tr ' ' '-')
if [[ -d "$USER_THEMES_PATH/$THEME_NAME" ]]; then
THEME_PATH="$USER_THEMES_PATH/$THEME_NAME"
elif [[ -d "$OMARCHY_THEMES_PATH/$THEME_NAME" ]]; then
THEME_PATH="$OMARCHY_THEMES_PATH/$THEME_NAME"
else
if [[ ! -d $OMARCHY_THEMES_PATH/$THEME_NAME ]] && [[ ! -d $USER_THEMES_PATH/$THEME_NAME ]]; then
echo "Theme '$THEME_NAME' does not exist"
exit 1
fi
@@ -25,8 +21,9 @@ fi
rm -rf "$NEXT_THEME_PATH"
mkdir -p "$NEXT_THEME_PATH"
# Copy static configs
cp -r "$THEME_PATH/"* "$NEXT_THEME_PATH/" 2>/dev/null
# Copy official theme first, then overlay user customizations on top
cp -r "$OMARCHY_THEMES_PATH/$THEME_NAME/"* "$NEXT_THEME_PATH/" 2>/dev/null
cp -r "$USER_THEMES_PATH/$THEME_NAME/"* "$NEXT_THEME_PATH/" 2>/dev/null
# Generate dynamic configs
omarchy-theme-set-templates
@@ -36,7 +33,7 @@ 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"
echo "$THEME_NAME" >"$HOME/.config/omarchy/current/theme.name"
# Change background with theme
omarchy-theme-bg-next
@@ -57,6 +54,7 @@ omarchy-theme-set-gnome
omarchy-theme-set-browser
omarchy-theme-set-vscode
omarchy-theme-set-obsidian
omarchy-theme-set-keyboard
# Call hook on theme set
omarchy-hook theme-set "$THEME_NAME"
+3 -9
View File
@@ -2,7 +2,7 @@
CHROMIUM_THEME=~/.config/omarchy/current/theme/chromium.theme
if omarchy-cmd-present chromium || omarchy-cmd-present helium-browser || omarchy-cmd-present brave; then
if omarchy-cmd-present chromium || omarchy-cmd-present brave; then
if [[ -f $CHROMIUM_THEME ]]; then
THEME_RGB_COLOR=$(<$CHROMIUM_THEME)
THEME_HEX_COLOR=$(printf '#%02x%02x%02x' ${THEME_RGB_COLOR//,/ })
@@ -13,14 +13,8 @@ if omarchy-cmd-present chromium || omarchy-cmd-present helium-browser || omarchy
fi
if omarchy-cmd-present chromium; then
rm -f /etc/chromium/policies/managed/color.json
chromium --no-startup-window --set-theme-color="$THEME_RGB_COLOR" >/dev/null
if [[ -f ~/.config/omarchy/current/theme/light.mode ]]; then
chromium --no-startup-window --set-color-scheme="light" >/dev/null
else
chromium --no-startup-window --set-color-scheme="dark" >/dev/null
fi
echo "{\"BrowserThemeColor\": \"$THEME_HEX_COLOR\"}" | tee "/etc/chromium/policies/managed/color.json" >/dev/null
chromium --refresh-platform-policy --no-startup-window >/dev/null
fi
if omarchy-cmd-present brave; then
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
omarchy-theme-set-keyboard-asus-rog
omarchy-theme-set-keyboard-f16
+7
View File
@@ -0,0 +1,7 @@
#!/bin/bash
ASUSCTL_THEME=~/.config/omarchy/current/theme/keyboard.rgb
if omarchy-cmd-present asusctl; then
asusctl aura effect static -c $(sed 's/^#//' $ASUSCTL_THEME)
fi
+22
View File
@@ -0,0 +1,22 @@
#!/bin/bash
FRAMEWORK16_THEME=~/.config/omarchy/current/theme/keyboard.rgb
if omarchy-cmd-present qmk_hid && [[ -f $FRAMEWORK16_THEME ]]; then
hex=$(cat "$FRAMEWORK16_THEME")
hex="${hex#\#}"
# Convert hex to QMK HSV (0-255 scale) using Python's colorsys
read -r h s <<< $(python3 -c "
import colorsys
r, g, b = int('$hex'[:2],16)/255, int('$hex'[2:4],16)/255, int('$hex'[4:6],16)/255
h, s, v = colorsys.rgb_to_hsv(r, g, b)
print(int(h * 255), int(s * 255))
")
qmk_hid via --rgb-effect 1 2>/dev/null
qmk_hid via --rgb-hue "$h" 2>/dev/null
qmk_hid via --rgb-saturation "$s" 2>/dev/null
qmk_hid via --rgb-brightness 100 2>/dev/null
qmk_hid via --save 2>/dev/null
fi
+3 -3
View File
@@ -4,15 +4,15 @@
CURRENT_THEME_DIR="$HOME/.config/omarchy/current/theme"
[ -f "$CURRENT_THEME_DIR/obsidian.css" ] || exit 0
[[ -f $CURRENT_THEME_DIR/obsidian.css ]] || exit 0
jq -r '.vaults | values[].path' ~/.config/obsidian/obsidian.json 2>/dev/null | while read -r vault_path; do
[ -d "$vault_path/.obsidian" ] || continue
[[ -d $vault_path/.obsidian ]] || continue
theme_dir="$vault_path/.obsidian/themes/Omarchy"
mkdir -p "$theme_dir"
[ -f "$theme_dir/manifest.json" ] || cat >"$theme_dir/manifest.json" <<'EOF'
[[ -f $theme_dir/manifest.json ]] || cat >"$theme_dir/manifest.json" <<'EOF'
{
"name": "Omarchy",
"version": "1.0.0",
+5 -5
View File
@@ -9,18 +9,18 @@ set_theme() {
local settings_path="$2"
local skip_flag="$3"
omarchy-cmd-present "$editor_cmd" && [[ ! -f "$skip_flag" ]] || return 0
omarchy-cmd-present "$editor_cmd" && [[ ! -f $skip_flag ]] || return 0
if [[ -f "$VS_CODE_THEME" ]]; then
if [[ -f $VS_CODE_THEME ]]; then
theme_name=$(jq -r '.name' "$VS_CODE_THEME")
extension=$(jq -r '.extension' "$VS_CODE_THEME")
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
fi
mkdir -p "$(dirname "$settings_path")"
[[ -f "$settings_path" ]] || printf '{\n}\n' >"$settings_path"
[[ -f $settings_path ]] || printf '{\n}\n' >"$settings_path"
if ! grep -q '"workbench.colorTheme"' "$settings_path"; then
sed -i --follow-symlinks -E '0,/\{/{s/\{/{\ "workbench.colorTheme": "",/}' "$settings_path"
@@ -29,7 +29,7 @@ set_theme() {
sed -i --follow-symlinks -E \
"s/(\"workbench.colorTheme\"[[:space:]]*:[[:space:]]*\")[^\"]*(\")/\1$theme_name\2/" \
"$settings_path"
elif [[ -f "$settings_path" ]]; then
elif [[ -f $settings_path ]]; then
sed -i --follow-symlinks -E 's/\"workbench\.colorTheme\"[[:space:]]*:[^,}]*,?//' "$settings_path"
fi
}
+1 -1
View File
@@ -1,7 +1,7 @@
#!/bin/bash
for dir in ~/.config/omarchy/themes/*/; do
if [[ -d $dir ]] && [[ ! -L "${dir%/}" ]] && [[ -d "$dir/.git" ]]; then
if [[ -d $dir ]] && [[ ! -L ${dir%/} ]] && [[ -d $dir/.git ]]; then
echo "Updating: $(basename "$dir")"
git -C "$dir" pull
fi
-18
View File
@@ -1,18 +0,0 @@
#!/bin/bash
# Fix volume controls for laptops with problematic Realtek codecs (like Asus G14)
if [[ ! -f ~/.config/wireplumber/wireplumber.conf.d/alsa-soft-mixer.conf ]]; then
mkdir -p ~/.config/wireplumber/wireplumber.conf.d/
cp $OMARCHY_PATH/default/wireplumber/wireplumber.conf.d/alsa-soft-mixer.conf ~/.config/wireplumber/wireplumber.conf.d/
rm -rf ~/.local/state/wireplumber/default-routes
notify-send "Enabled audio soft mixing"
else
rm -rf ~/.config/wireplumber/wireplumber.conf.d/alsa-soft-mixer.conf
rm -rf ~/.local/state/wireplumber/default-routes
notify-send "Disabled audio soft mixing"
fi
systemctl --user restart wireplumber
+65
View File
@@ -0,0 +1,65 @@
#!/bin/bash
# Toggle dedicated vs integrated GPU mode via supergfxd (for hybrid gpu laptops, like Asus G14).
# Requires reboot to take effect.
# Ensure supergfxctl has been installed
if omarchy-cmd-missing supergfxctl; then
omarchy-pkg-add supergfxctl
# Create config before starting service to prevent hang on first boot
sudo tee /etc/supergfxd.conf >/dev/null <<'CONF'
{
"mode": "Hybrid",
"vfio_enable": true,
"vfio_save": false,
"always_reboot": false,
"no_logind": false,
"logout_timeout_s": 180,
"hotplug_type": "None"
}
CONF
sudo systemctl enable --now supergfxd
fi
gpu_mode=$(supergfxctl -g)
case "$gpu_mode" in
"Integrated")
if gum confirm "Enable dedicated GPU and reboot?"; then
# Switch to hybrid mode
sudo sed -i "s/\"mode\": \".*\"/\"mode\": \"Hybrid\"/" /etc/supergfxd.conf
# Let hybrid mode be the default after system sleep
sudo rm -rf /usr/lib/systemd/system-sleep/force-igpu
# Remove the startup delay override (not needed for Hybrid mode)
sudo rm -rf /etc/systemd/system/supergfxd.service.d/delay-start.conf
omarchy-system-reboot
fi
;;
"Hybrid")
if gum confirm "Use only integrated GPU and reboot?"; then
# Switch to integrated mode and ensure vfio is enabled (needed for sleep/wake trick)
sudo sed -i "s/\"mode\": \".*\"/\"mode\": \"Integrated\"/" /etc/supergfxd.conf
sudo sed -i 's/"vfio_enable": false/"vfio_enable": true/' /etc/supergfxd.conf
# Force igpu mode after system sleep (or dgpu could get activated)
sudo mkdir -p /usr/lib/systemd/system-sleep
sudo cp -p $OMARCHY_PATH/default/systemd/system-sleep/force-igpu /usr/lib/systemd/system-sleep/
# Delay supergfxd startup to avoid race condition with display manager
# that can cause system freeze when booting in Integrated mode
sudo mkdir -p /etc/systemd/system/supergfxd.service.d
sudo cp -p $OMARCHY_PATH/default/systemd/system/supergfxd.service.d/delay-start.conf /etc/systemd/system/supergfxd.service.d/
omarchy-system-reboot
fi
;;
*)
echo "Hybrid GPU not found or in unknown mode."
exit 1
;;
esac
+4 -2
View File
@@ -2,8 +2,10 @@
if pgrep -x hypridle >/dev/null; then
pkill -x hypridle
notify-send "Stop locking computer when idle"
notify-send "󱫖 Stop locking computer when idle"
else
uwsm-app -- hypridle >/dev/null 2>&1 &
notify-send "Now locking computer when idle"
notify-send "󱫖 Now locking computer when idle"
fi
pkill -RTMIN+9 waybar
+1 -1
View File
@@ -19,7 +19,7 @@ restart_nightlighted_waybar() {
fi
}
if [[ "$CURRENT_TEMP" == "$OFF_TEMP" ]]; then
if [[ $CURRENT_TEMP == $OFF_TEMP ]]; then
hyprctl hyprsunset temperature $ON_TEMP
notify-send " Nightlight screen temperature"
restart_nightlighted_waybar
+11
View File
@@ -0,0 +1,11 @@
#!/bin/bash
makoctl mode -t do-not-disturb
if makoctl mode | grep -q 'do-not-disturb'; then
notify-send "󰂛 Silenced notifications"
else
notify-send "󰂚 Enabled notifications"
fi
pkill -RTMIN+10 waybar

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