Compare commits

...

197 Commits

Author SHA1 Message Date
David Heinemeier Hansson
2453ca6ea4 Revert "fix(aur): add -a flag to yay command to assume AUR packages (#4581)"
This reverts commit b3dd14a038.
2026-02-17 11:55:18 +01:00
Andrej Benz
b3dd14a038 fix(aur): add -a flag to yay command to assume AUR packages (#4581) 2026-02-17 11:53:39 +01:00
Stefan Gründel
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 Malviya
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
Horace Ko
463417a281 Use a thin space to increase spacing between Omarchy glyph and its label. (#4586) 2026-02-13 18:43:23 +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 Hansson
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 Hansson
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
Serpent
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 Hansson
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
bjarneo
7bd5bf25cd Remove the aether.nvim dependency (#4543)
* Remove the aether.nvim dependency

* Fix a blooper
2026-02-07 22:16:21 +01:00
bjarneo
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 Paudel
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
Mridul Agarwal
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
bjarneo
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 Hughes
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 Dorier
b0e8a4dcea Fix: High IO pressure caused by ghostty (#4507) 2026-02-06 16:51:18 +01:00
amrxtgh
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 Nutter
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
Lewis
1a14938382 Update style path in swayosd config (#4502) 2026-02-04 21:35:44 +01:00
Pierre Olivier Martel
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
Jamoladdin
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 Martel
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
James Robey
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
l1ghty
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
Bhavesh Sooka
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
schwepmo
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 Martel
8fc5b6e346 Add nautilus-python package for 'Open in Ghostty' shortcut in Nautilus (#4345) 2026-01-31 18:11:32 +01:00
nptr
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ündel
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 Martel
26afde34ff fix echo comment in powerprofile migration (#4388) 2026-01-30 12:25:39 +01:00
Nicolas Dorier
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 Martel
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 Hughes
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
mitanjan
d89614248b auto toggle scratchpad on switching workspace (#4250) 2026-01-27 11:47:27 +01:00
Manuel
77a57aa838 Add kb_variant to input.conf (#4330)
* add kb_variant to input.conf

* documentation + separation
2026-01-27 11:43:59 +01:00
Pierre Olivier Martel
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 Robey
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
Dominik
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
Marco
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 Hansson
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
David Heinemeier Hansson
4701726c83 Split out removing orphan packages as well
And make sure failed AUR update doesn't fail the update entirely
2026-01-19 12:21:06 -05:00
David Heinemeier Hansson
bfc3c69cf1 Update AUR packages after system pkgs + migrate
As AUR packages need local compiling and that might fail. Which
shouldn't prevent migrations from running.
2026-01-19 10:49:46 -05:00
David Heinemeier Hansson
21514dc577 Turn audio soft mixing into an opt-in toggle
It causes issues on some machines, but is required on the Asus G14
2026-01-17 14:43:59 -05:00
David Heinemeier Hansson
5ff76df5e4 Ensure default routes don't overwrite the ffix 2026-01-14 19:53:28 -05:00
David Heinemeier Hansson
bab0004d08 Fix volume controls on Asus G14 2026-01-14 17:40:53 -05:00
David Heinemeier Hansson
93079858f1 Extract shared swayosd helper 2026-01-14 17:21:10 -05:00
David Heinemeier Hansson
4287472e02 Simplify 2026-01-14 17:11:50 -05:00
David Heinemeier Hansson
291786d36a Set brightness in a more broadly compatible way
Fixes brightness setting on the Asus G14
2026-01-14 16:37:22 -05:00
Ryan Hughes
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
Pierre Olivier Martel
05b82cbee5 Add headset icon to pulseaudio module in waybar (#4244) 2026-01-13 11:28:04 +01: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
Yaroslav Yenkala
1ff31cfe41 Automatic fallback to Alacritty for legacy GPUs when install Omarchy (#3711)
* Use alacritty when legacy gpu when install omarchy

* Inline legacy GPU detection, install Alacritty only when needed
2026-01-12 12:24:16 +01:00
David Heinemeier Hansson
cd995319bf Add img2jpg-medium 2026-01-12 11:50:07 +01:00
David Heinemeier Hansson
281f0b86d2 Add new default wallpaper for Tokyo Night
Created by @Maxteabag
Closes #4221
2026-01-12 11:20:33 +01:00
David Heinemeier Hansson
55668f4c6d Use just a single capture menu instead 2026-01-12 10:59:55 +01:00
David Heinemeier Hansson
9c71962a16 Add Super + Ctrl + P (and friends) as alternative keybinds for captures on keyboards without a printscr key
Closes #4051
2026-01-12 10:57:04 +01:00
Ryan Hughes
7d77500c33 Eliminate rdp check causing black screen 2026-01-10 22:39:01 -05:00
Ryan Hughes
fb1d9ccfa3 Merge pull request #4217 from arcangelo7/fix/windows-vm-clipboard-sharing
Enable clipboard sharing for Windows VM
2026-01-10 22:38:54 -05:00
Ryan Hughes
2f75e9c7ec Merge pull request #3958 from felixzsh/fix-windows-vm-lauch-sleep
fix: dynamic Windows VM boot synchronization for RDP
2026-01-10 22:17:10 -05:00
felixzsh
b22ed8448a fix: dynamic windows-vm boot detection
The current 5-second sleep is not enough for all hardware. On my PC (and
likely many others), Windows takes longer to initialize. If the script
tries to connect via RDP before Windows is fully ready, the connection
fails or hangs.

I replaced the fixed sleep with a dynamic loop that checks the Docker
logs for the "Windows started successfully" message. This ensures the
RDP client only starts once Windows has confirmed it's ready, making the
launch process much more reliable across different hardware specs.

Fixes #2599
2026-01-10 22:14:19 -05:00
David Heinemeier Hansson
a0d2f007fd Specialize waybar to match the backgrounds better 2026-01-10 21:08:57 +01:00
Arcangelo Massari
955844cb5d feat(windows-vm): enable clipboard sharing in RDP session
Add /clipboard flag to xfreerdp3 command to enable bidirectional
clipboard sharing between Windows VM and Omarchy.
2026-01-10 19:49:54 +01:00
David Heinemeier Hansson
295c7c91fc Fix concatenation 2026-01-10 14:33:36 +01:00
Will Hampson
bc1a531534 fix: skill name must match case of skill directory exactly (#4162) 2026-01-09 15:40:56 +01:00
Dominik
4cec214a53 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-09 15:39:07 +01:00
David Heinemeier Hansson
0b5ba427b2 Merge branch 'master' into dev 2026-01-09 15:32:56 +01:00
David Heinemeier Hansson
53b8fc4257 Ensure we reset the DBs with the Omarchy versions 2026-01-09 14:34:38 +01:00
David Heinemeier Hansson
dcb9527770 Ensure we reset the DBs with the Omarchy versions 2026-01-09 14:34:29 +01:00
Ryan Hughes
6c35e840f5 Version bump 2026-01-08 22:27:03 -05:00
Ryan Hughes
da984ce243 Fix infinite waiting 2026-01-08 22:26:52 -05:00
Ryan Hughes
65bafa4f3b Bump 2026-01-08 19:33:06 -05:00
Ryan Hughes
f5a35a1afe Bump 2026-01-08 19:32:32 -05:00
Ryan Hughes
c9b3e13df8 Merge pull request #4174 from basecamp/dev
v3.3.3
2026-01-08 18:51:48 -05:00
Ryan Hughes
9775b01070 Don't update gcc14 2026-01-08 18:49:41 -05:00
Ryan Hughes
b42dcf098b Merge pull request #4170 from basecamp/dev
v3.3.2
2026-01-08 17:18:41 -05:00
Ryan Hughes
6ae31aedae Update message 2026-01-08 17:17:32 -05:00
Ryan Hughes
63b0cd64bd Add update logger w/ analysis 2026-01-08 16:52:49 -05:00
Ryan Hughes
bf779a6bbc Add additional hardening for missing headers 2026-01-08 15:28:56 -05:00
Ryan Hughes
774b4700ef Extra hardening the driver swap 2026-01-08 13:44:34 -05:00
Ryan Hughes
400a87955e Use omarchy-pkg-add 2026-01-08 13:41:20 -05:00
David Heinemeier Hansson
fe48a16a90 Correct the accent color 2026-01-08 15:02:05 +01:00
David Heinemeier Hansson
78ef351269 Merge pull request #4148 from basecamp/dev
Omarchy 3.3.1
2026-01-08 13:51:47 +01:00
David Heinemeier Hansson
558cd68810 Bump version 2026-01-08 13:44:54 +01:00
David Heinemeier Hansson
067ec2bd71 Fix migration for when current theme is a directory, not a symlink
Closes #4147
2026-01-08 13:41:26 +01:00
David Heinemeier Hansson
ec4cd81e63 Fix the singletonlock issue properly 2026-01-08 13:18:55 +01:00
David Heinemeier Hansson
7c0a05cc70 Remove the SingletonLock that's present for some reason on new ISO installs
Closes #4149
2026-01-08 13:15:16 +01:00
David Heinemeier Hansson
70bdbfe545 Fix kitty cursor shape to match alacritty + ghostty 2026-01-08 10:49:44 +01:00
David Heinemeier Hansson
72b3b930c7 Drop the needless active_border_color/active_tab_background settings in favor of just using accent
Closes #4121
2026-01-08 10:32:21 +01:00
David Heinemeier Hansson
e08301dee2 Remove opencode binding (prefer c alias in terminal)
Closes #4124
2026-01-08 10:26:07 +01:00
David Heinemeier Hansson
9fc65dd2de Simplify the VSCode/derivatives theme setting 2026-01-08 10:22:10 +01:00
David Heinemeier Hansson
5603fb50fd Dramatically simplify omarchy-theme-set-obsidian
The cost is that only themes with a colors.toml file will get Obsidian
themeing.
2026-01-08 10:16:14 +01:00
David Heinemeier Hansson
037f034ece Merge pull request #4141 from timohubois/fix-migration-1767138576
fix(migrations-1767138576): split sed commands in scrolltouchpad migration
2026-01-08 10:00:19 +01:00
David Heinemeier Hansson
e95f8f2847 Merge pull request #4138 from Nm1ss/patch-1
Fix NVIDIA Legacy Driver for Older Professional/Workstation GPUs
2026-01-08 09:58:43 +01:00
Timo Hubois
8826aa10ca fix(migrations-1767138576): split sed commands in scrolltouchpad migration
The sed expression for converting scrolltouchpad syntax to Hyprland 0.53
format was broken across two lines, causing the second substitution
pattern to fail silently. Split into separate sed commands to ensure
both class:(pattern) and class:pattern formats are migrated correctly.
2026-01-08 09:34:38 +01:00
David Heinemeier Hansson
2851687bbb Fix use of accent colors 2026-01-08 09:18:22 +01:00
George
e25a00a38c Update NVIDIA GPU detection for legacy support on professional/workstation cards 2026-01-08 07:53:11 +01:00
David Heinemeier Hansson
7d9858a013 Run the gcc14 removal as early as possible 2026-01-07 23:51:08 +01:00
David Heinemeier Hansson
95bfb16cd4 Hotfix to remove gcc14 AUR package that would take eons to update 2026-01-07 22:05:54 +01:00
192 changed files with 1763 additions and 988 deletions

62
AGENTS.md Normal file
View File

@@ -0,0 +1,62 @@
# Style
- Two spaces for indentation, no tabs
- Use Bash syntax for conditionals: `[[ -f $file ]]`, not `[ -f "$file" ]`
# 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
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
```

13
bin/omarchy-battery-present Executable file
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

View File

@@ -3,14 +3,15 @@
# Set the branch for Omarchy's git repository. # Set the branch for Omarchy's git repository.
if (($# == 0)); then if (($# == 0)); then
echo "Usage: omarchy-branch-set [master|dev]" echo "Usage: omarchy-branch-set [master|rc|dev]"
exit 1 exit 1
else else
branch="$1" branch="$1"
fi fi
case "$branch" in if [[ "$branch" != "master" && "$branch" != "rc" && "$branch" != "dev" ]]; then
"master") git -C $OMARCHY_PATH switch master ;; echo "Error: Invalid branch '$branch'. Must be one of: master, rc, dev"
"dev") git -C $OMARCHY_PATH switch dev ;; exit 1
*) echo "Unknown branch: $branch"; exit 1; ;; fi
esac
git -C $OMARCHY_PATH switch $branch

21
bin/omarchy-brightness-display Executable file
View File

@@ -0,0 +1,21 @@
#!/bin/bash
# Adjust brightness on the most likely display device.
# 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
device="$candidate"
break
fi
done
# Set the actual brightness of the display device.
brightnessctl -d "$device" set "$step" >/dev/null
# Use SwayOSD to display the new brightness setting.
omarchy-swayosd-brightness "$(brightnessctl -d "$device" -m | cut -d',' -f4 | tr -d '%')"

View File

@@ -0,0 +1,12 @@
#!/bin/bash
# Adjust the brightness on Apple Studio Displays and Apple XDR Displays using asdcontrol.
if [[ $# -eq 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)"
sudo asdcontrol "$device" -- "$1" >/dev/null
value="$(sudo asdcontrol "$device" | awk -F= '/BRIGHTNESS=/{print $2+0}')"
omarchy-swayosd-brightness "$(( value * 100 / 60000 ))"
fi

40
bin/omarchy-brightness-keyboard Executable file
View File

@@ -0,0 +1,40 @@
#!/bin/bash
# Adjust keyboard backlight brightness using available steps.
# Usage: omarchy-brightness-keyboard <up|down>
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" == "up" ]]; then
new_brightness=$((current_brightness + 1))
[[ $new_brightness -gt $max_brightness ]] && new_brightness=$max_brightness
else
new_brightness=$((current_brightness - 1))
[[ $new_brightness -lt 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-brightness "$percent"

View File

@@ -14,7 +14,7 @@
# and people with a lot of experience managing Linux systems. # and people with a lot of experience managing Linux systems.
if (($# == 0)); then if (($# == 0)); then
echo "Usage: omarchy-channel-set [stable|edge|dev]" echo "Usage: omarchy-channel-set [stable|rc|edge|dev]"
exit 1 exit 1
else else
channel="$1" channel="$1"
@@ -22,6 +22,7 @@ fi
case "$channel" in 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" && sudo pacman -Suu --noconfirm ;;
"rc") omarchy-branch-set "rc" && omarchy-refresh-pacman "rc" && sudo pacman -Suu --noconfirm ;;
"edge") omarchy-branch-set "master" && omarchy-refresh-pacman "edge" ;; "edge") omarchy-branch-set "master" && omarchy-refresh-pacman "edge" ;;
"dev") omarchy-branch-set "dev" && omarchy-refresh-pacman "edge" ;; "dev") omarchy-branch-set "dev" && omarchy-refresh-pacman "edge" ;;
*) echo "Unknown channel: $channel"; exit 1; ;; *) echo "Unknown channel: $channel"; exit 1; ;;

View File

@@ -1,16 +0,0 @@
#!/bin/bash
# Adjust the brightness on Apple Studio Displays and Apple XDR Displays using asdcontrol.
if [[ $# -eq 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)"
sudo asdcontrol "$DEVICE" -- "$1" >/dev/null
VALUE="$(sudo asdcontrol "$DEVICE" | awk -F= '/BRIGHTNESS=/{print $2+0}')"
swayosd-client \
--monitor "$(hyprctl monitors -j | jq -r '.[]|select(.focused==true).name')" \
--custom-icon display-brightness \
--custom-progress "$(awk -v v="$VALUE" 'BEGIN{printf "%.2f", v/60000}')" \
--custom-progress-text "$(( VALUE * 100 / 60000 ))%"
fi

View File

@@ -14,6 +14,7 @@ fi
DESKTOP_AUDIO="false" DESKTOP_AUDIO="false"
MICROPHONE_AUDIO="false" MICROPHONE_AUDIO="false"
WEBCAM="false" WEBCAM="false"
WEBCAM_DEVICE=""
STOP_RECORDING="false" STOP_RECORDING="false"
for arg in "$@"; do for arg in "$@"; do
@@ -21,6 +22,7 @@ for arg in "$@"; do
--with-desktop-audio) DESKTOP_AUDIO="true" ;; --with-desktop-audio) DESKTOP_AUDIO="true" ;;
--with-microphone-audio) MICROPHONE_AUDIO="true" ;; --with-microphone-audio) MICROPHONE_AUDIO="true" ;;
--with-webcam) WEBCAM="true" ;; --with-webcam) WEBCAM="true" ;;
--webcam-device=*) WEBCAM_DEVICE="${arg#*=}" ;;
--stop-recording) STOP_RECORDING="true" --stop-recording) STOP_RECORDING="true"
esac esac
done done
@@ -32,6 +34,15 @@ cleanup_webcam() {
start_webcam_overlay() { start_webcam_overlay() {
cleanup_webcam 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 # Get monitor scale
local scale=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .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 # Try preferred 16:9 resolutions in order, use first available
local preferred_resolutions=("640x360" "1280x720" "1920x1080") local preferred_resolutions=("640x360" "1280x720" "1920x1080")
local video_size_arg="" 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 for resolution in "${preferred_resolutions[@]}"; do
if echo "$available_formats" | grep -q "$resolution"; then if echo "$available_formats" | grep -q "$resolution"; then
@@ -50,7 +61,7 @@ start_webcam_overlay() {
fi fi
done 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" \ -vf "scale=${target_width}:-1" \
-window_title "WebcamOverlay" \ -window_title "WebcamOverlay" \
-noborder \ -noborder \

View File

@@ -2,6 +2,7 @@
# Take a screenshot of the whole screen, a specific window, or a user-drawn region. # 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. # 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 [[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs
OUTPUT_DIR="${OMARCHY_SCREENSHOT_DIR:-${XDG_PICTURES_DIR:-$HOME/Pictures}}" OUTPUT_DIR="${OMARCHY_SCREENSHOT_DIR:-${XDG_PICTURES_DIR:-$HOME/Pictures}}"
@@ -13,6 +14,33 @@ fi
pkill slurp && exit 0 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" \
--early-exit \
--actions-on-enter save-to-clipboard \
--save-after-copy \
--copy-command 'wl-copy'
else
$SCREENSHOT_EDITOR "$filepath"
fi
}
MODE="${1:-smart}" MODE="${1:-smart}"
PROCESSING="${2:-slurp}" PROCESSING="${2:-slurp}"
@@ -46,7 +74,7 @@ case "$MODE" in
SELECTION=$(echo "$RECTS" | slurp 2>/dev/null) SELECTION=$(echo "$RECTS" | slurp 2>/dev/null)
kill $PID 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 # 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 # 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 [[ "$SELECTION" =~ ^([0-9]+),([0-9]+)[[:space:]]([0-9]+)x([0-9]+)$ ]]; then
if (( ${BASH_REMATCH[3]} * ${BASH_REMATCH[4]} < 20 )); then if (( ${BASH_REMATCH[3]} * ${BASH_REMATCH[4]} < 20 )); then
@@ -71,16 +99,19 @@ case "$MODE" in
;; ;;
esac 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 if [[ $PROCESSING == "slurp" ]]; then
grim -g "$SELECTION" - | grim -g "$SELECTION" "$FILEPATH" || exit 1
satty --filename - \ wl-copy < "$FILEPATH"
--output-filename "$OUTPUT_DIR/screenshot-$(date +'%Y-%m-%d_%H-%M-%S').png" \
--early-exit \ (
--actions-on-enter save-to-clipboard \ ACTION=$(notify-send "Screenshot copied & saved" "Click to edit" -t 10000 -i "$FILEPATH" -A "default=edit")
--save-after-copy \ [[ "$ACTION" == "default" ]] && open_editor "$FILEPATH"
--copy-command 'wl-copy' ) &
else else
grim -g "$SELECTION" - | wl-copy grim -g "$SELECTION" - | wl-copy
fi fi

View File

@@ -17,9 +17,11 @@ if [ -f "$MKINITCPIO_CONF" ] && grep -q "^HOOKS+=(resume)$" "$MKINITCPIO_CONF";
exit 0 exit 0
fi fi
MEM_TOTAL_HUMAN=$(free --human | awk '/Mem/ {print $2}') if [[ $1 != "--force" ]]; then
if ! gum confirm "Use $MEM_TOTAL_HUMAN on boot drive to make hibernation available?"; then MEM_TOTAL_HUMAN=$(free --human | awk '/Mem/ {print $2}')
exit 0 if ! gum confirm "Use $MEM_TOTAL_HUMAN on boot drive to make hibernation available?"; then
exit 0
fi
fi fi
SWAP_SUBVOLUME="/swap" SWAP_SUBVOLUME="/swap"
@@ -57,14 +59,26 @@ sudo mkdir -p /etc/mkinitcpio.conf.d
echo "Adding resume hook to $MKINITCPIO_CONF" echo "Adding resume hook to $MKINITCPIO_CONF"
echo "HOOKS+=(resume)" | sudo tee "$MKINITCPIO_CONF" >/dev/null echo "HOOKS+=(resume)" | sudo tee "$MKINITCPIO_CONF" >/dev/null
# Configure suspend-then-hibernate # Ensure keyboard backlight doesn't prevent sleep
echo "Configuring suspend-then-hibernate" sudo cp -p "$OMARCHY_PATH/default/systemd/system-sleep/keyboard-backlight" /usr/lib/systemd/system-sleep/
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/
# Regenerate initramfs # 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..." echo "Regenerating initramfs..."
sudo limine-mkinitcpio sudo limine-mkinitcpio
sudo limine-update
echo "Hibernation enabled" echo
if [[ $1 != "--force" ]] && gum confirm "Reboot to enable hibernation?"; then
omarchy-cmd-reboot
fi

6
bin/omarchy-hw-asus-rog Executable file
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

17
bin/omarchy-install-geforce-now Executable file
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

View File

@@ -1,15 +1,10 @@
#!/bin/bash #!/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://tailscale.com/install.sh | sh
curl -fsSL https://neuralink.com/tsui/install.sh | bash
echo -e "\nStarting Tailscale..." echo -e "\nStarting Tailscale..."
sudo tailscale up --accept-routes sudo tailscale up --accept-routes
echo -e "\nAdd tsui to sudoers..." omarchy-webapp-install "Tailscale" "https://login.tailscale.com/admin/machines" https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/tailscale-light.png
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

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/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 # Ensure elephant is running before launching walker
if ! pgrep -x elephant > /dev/null; then if ! pgrep -x elephant > /dev/null; then

View File

@@ -88,29 +88,49 @@ show_learn_menu() {
} }
show_trigger_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 ;; *Capture*) show_capture_menu ;;
*Share*) show_share_menu ;; *Share*) show_share_menu ;;
*Toggle*) show_toggle_menu ;; *Toggle*) show_toggle_menu ;;
*Hardware*) show_hardware_menu ;;
*) show_main_menu ;; *) show_main_menu ;;
esac esac
} }
show_capture_menu() { show_capture_menu() {
case $(menu "Capture" " Screenshot\n Screenrecord\n󰃉 Color") in case $(menu "Capture" " Screenshot\n Screenrecord\n󰃉 Color") in
*Screenshot*) show_screenshot_menu ;; *Screenshot*) omarchy-cmd-screenshot ;;
*Screenrecord*) show_screenrecord_menu ;; *Screenrecord*) show_screenrecord_menu ;;
*Color*) pkill hyprpicker || hyprpicker -a ;; *Color*) pkill hyprpicker || hyprpicker -a ;;
*) show_trigger_menu ;; *) show_trigger_menu ;;
esac esac
} }
show_screenshot_menu() { get_webcam_list() {
case $(menu "Screenshot" " Snap with Editing\n Straight to Clipboard") in v4l2-ctl --list-devices 2>/dev/null | while IFS= read -r line; do
*Editing*) omarchy-cmd-screenshot smart ;; if [[ "$line" != $'\t'* && -n "$line" ]]; then
*Clipboard*) omarchy-cmd-screenshot smart clipboard ;; local name="$line"
*) show_capture_menu ;; IFS= read -r device || break
esac 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" -eq 0 ]]; then
notify-send "No webcam devices found" -u critical -t 3000
return 1
fi
if [[ "$count" -eq 1 ]]; then
echo "$devices" | awk '{print $1}'
else
menu "Select Webcam" "$devices" | awk '{print $1}'
fi
} }
show_screenrecord_menu() { show_screenrecord_menu() {
@@ -119,7 +139,13 @@ show_screenrecord_menu() {
case $(menu "Screenrecord" " With desktop audio\n With desktop + microphone audio\n With desktop + microphone audio + webcam") in case $(menu "Screenrecord" " With desktop audio\n With desktop + microphone audio\n With desktop + microphone audio + webcam") in
*"With desktop audio") omarchy-cmd-screenrecord --with-desktop-audio ;; *"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") 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 ;; *) back_to show_capture_menu ;;
esac esac
} }
@@ -143,6 +169,13 @@ show_toggle_menu() {
esac 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() { show_style_menu() {
case $(menu "Style" "󰸌 Theme\n Font\n Background\n Hyprland\n󱄄 Screensaver\n About") in case $(menu "Style" "󰸌 Theme\n Font\n Background\n Hyprland\n󱄄 Screensaver\n About") in
*Theme*) show_theme_menu ;; *Theme*) show_theme_menu ;;
@@ -317,8 +350,9 @@ show_install_ai_menu() {
} }
show_install_gaming_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 ;; *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" ;; *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" ;; *Minecraft*) install_and_launch "Minecraft" "minecraft-launcher" "minecraft-launcher" ;;
*Xbox*) present_terminal omarchy-install-xbox-controllers ;; *Xbox*) present_terminal omarchy-install-xbox-controllers ;;
@@ -392,11 +426,12 @@ show_install_elixir_menu() {
} }
show_remove_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 ;; *Package*) terminal omarchy-pkg-remove ;;
*Web*) present_terminal omarchy-webapp-remove ;; *Web*) present_terminal omarchy-webapp-remove ;;
*TUI*) present_terminal omarchy-tui-remove ;; *TUI*) present_terminal omarchy-tui-remove ;;
*Development*) show_remove_development_menu ;; *Development*) show_remove_development_menu ;;
*Preinstalls*) present_terminal omarchy-remove-all ;;
*Dictation*) present_terminal omarchy-voxtype-remove ;; *Dictation*) present_terminal omarchy-voxtype-remove ;;
*Theme*) present_terminal omarchy-theme-remove ;; *Theme*) present_terminal omarchy-theme-remove ;;
*Windows*) present_terminal "omarchy-windows-vm remove" ;; *Windows*) present_terminal "omarchy-windows-vm remove" ;;
@@ -407,7 +442,7 @@ show_remove_menu() {
} }
show_remove_development_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") in
*Rails*) present_terminal "omarchy-remove-dev-env ruby" ;; *Rails*) present_terminal "omarchy-remove-dev-env ruby" ;;
*JavaScript*) show_remove_javascript_menu ;; *JavaScript*) show_remove_javascript_menu ;;
*Go*) present_terminal "omarchy-remove-dev-env go" ;; *Go*) present_terminal "omarchy-remove-dev-env go" ;;
@@ -425,7 +460,7 @@ show_remove_development_menu() {
} }
show_remove_javascript_menu() { 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" ;; *Node*) present_terminal "omarchy-remove-dev-env node" ;;
*Bun*) present_terminal "omarchy-remove-dev-env bun" ;; *Bun*) present_terminal "omarchy-remove-dev-env bun" ;;
*Deno*) present_terminal "omarchy-remove-dev-env deno" ;; *Deno*) present_terminal "omarchy-remove-dev-env deno" ;;
@@ -434,7 +469,7 @@ show_remove_javascript_menu() {
} }
show_remove_php_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" ;; *PHP*) present_terminal "omarchy-remove-dev-env php" ;;
*Laravel*) present_terminal "omarchy-remove-dev-env laravel" ;; *Laravel*) present_terminal "omarchy-remove-dev-env laravel" ;;
*Symfony*) present_terminal "omarchy-remove-dev-env symfony" ;; *Symfony*) present_terminal "omarchy-remove-dev-env symfony" ;;
@@ -443,7 +478,7 @@ show_remove_php_menu() {
} }
show_remove_elixir_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" ;; *Elixir*) present_terminal "omarchy-remove-dev-env elixir" ;;
*Phoenix*) present_terminal "omarchy-remove-dev-env phoenix" ;; *Phoenix*) present_terminal "omarchy-remove-dev-env phoenix" ;;
*) show_remove_development_menu ;; *) show_remove_development_menu ;;
@@ -451,7 +486,7 @@ show_remove_elixir_menu() {
} }
show_update_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 ;; *Omarchy*) present_terminal omarchy-update ;;
*Channel*) show_update_channel_menu ;; *Channel*) show_update_channel_menu ;;
*Config*) show_update_config_menu ;; *Config*) show_update_config_menu ;;
@@ -467,8 +502,9 @@ show_update_menu() {
} }
show_update_channel_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" ;; *Stable*) present_terminal "omarchy-channel-set stable" ;;
*RC*) present_terminal "omarchy-channel-set rc" ;;
*Edge*) present_terminal "omarchy-channel-set edge" ;; *Edge*) present_terminal "omarchy-channel-set edge" ;;
*Dev*) present_terminal "omarchy-channel-set dev" ;; *Dev*) present_terminal "omarchy-channel-set dev" ;;
*) show_update_menu ;; *) show_update_menu ;;
@@ -516,6 +552,10 @@ show_update_password_menu() {
esac esac
} }
show_about() {
omarchy-launch-about
}
show_system_menu() { show_system_menu() {
local options=" Lock\n󱄄 Screensaver" local options=" Lock\n󱄄 Screensaver"
[ -f ~/.local/state/omarchy/toggles/suspend-on ] && options="$options\n󰒲 Suspend" [ -f ~/.local/state/omarchy/toggles/suspend-on ] && options="$options\n󰒲 Suspend"
@@ -543,6 +583,7 @@ go_to_menu() {
*learn*) show_learn_menu ;; *learn*) show_learn_menu ;;
*trigger*) show_trigger_menu ;; *trigger*) show_trigger_menu ;;
*share*) show_share_menu ;; *share*) show_share_menu ;;
*capture*) show_capture_menu ;;
*style*) show_style_menu ;; *style*) show_style_menu ;;
*theme*) show_theme_menu ;; *theme*) show_theme_menu ;;
*screenshot*) show_screenshot_menu ;; *screenshot*) show_screenshot_menu ;;
@@ -552,7 +593,7 @@ go_to_menu() {
*install*) show_install_menu ;; *install*) show_install_menu ;;
*remove*) show_remove_menu ;; *remove*) show_remove_menu ;;
*update*) show_update_menu ;; *update*) show_update_menu ;;
*about*) omarchy-launch-about ;; *about*) show_about ;;
*system*) show_system_menu ;; *system*) show_system_menu ;;
esac esac
} }

View File

@@ -7,17 +7,18 @@
sudo cp -f /etc/pacman.conf /etc/pacman.conf.bak sudo cp -f /etc/pacman.conf /etc/pacman.conf.bak
sudo cp -f /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak sudo cp -f /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak
if [[ $1 == "edge" ]]; then channel="${1:-stable}"
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 if [[ "$channel" != "stable" && "$channel" != "rc" && "$channel" != "edge" ]]; then
echo "Setting channel to edge" echo "Error: Invalid channel '$channel'. Must be one of: stable, rc, edge"
else exit 1
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"
fi fi
echo "Setting channel to $channel"
echo 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 # Reset all package DBs and then update
sudo pacman -Syyu --noconfirm sudo pacman -Syyu --noconfirm

6
bin/omarchy-refresh-tmux Executable file
View File

@@ -0,0 +1,6 @@
#!/bin/bash
# Overwrite the user tmux config with the Omarchy default and reload tmux.
omarchy-refresh-config tmux/tmux.conf
tmux source-file ~/.config/tmux/tmux.conf

View File

@@ -5,9 +5,17 @@
# Ensure walker is set to autostart # Ensure walker is set to autostart
mkdir -p ~/.config/autostart/ mkdir -p ~/.config/autostart/
cp $OMARCHY_PATH/default/walker/walker.desktop ~/.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 systemctl --user daemon-reload
# Refresh configs
omarchy-refresh-config walker/config.toml omarchy-refresh-config walker/config.toml
omarchy-refresh-config elephant/calc.toml omarchy-refresh-config elephant/calc.toml
omarchy-refresh-config elephant/desktopapplications.toml omarchy-refresh-config elephant/desktopapplications.toml
# Restart service
omarchy-restart-walker omarchy-restart-walker

25
bin/omarchy-remove-all Executable file
View File

@@ -0,0 +1,25 @@
#!/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
omarchy-pkg-drop \
aether \
typora \
spotify \
libreoffice-fresh \
1password-beta \
1password-cli \
xournalpp \
signal-desktop \
pinta \
obsidian \
obs-studio \
kdenlive
fi

View File

@@ -1,5 +1,8 @@
#!/bin/bash #!/bin/bash
# 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>
if [[ -z "$1" ]]; then 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 echo "Usage: omarchy-remove-dev-env <ruby|node|bun|deno|go|php|laravel|symfony|python|elixir|phoenix|zig|rust|java|dotnet|ocaml|clojure>" >&2
exit 1 exit 1

View File

@@ -1,4 +1,7 @@
#!/bin/bash #!/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 # Resetting sudo lockout for user
su -c "faillock --reset --user $USER" su -c "faillock --reset --user $USER"

View File

@@ -1,4 +1,7 @@
#!/bin/bash #!/bin/bash
# Restart an application by killing it and relaunching via uwsm.
# Usage: omarchy-restart-app <application-name>
pkill -x $1 pkill -x $1
setsid uwsm-app -- $1 >/dev/null 2>&1 & setsid uwsm-app -- $1 >/dev/null 2>&1 &

View File

@@ -1,5 +1,7 @@
#!/bin/bash #!/bin/bash
# Unblock and restart the bluetooth service.
echo -e "Unblocking bluetooth...\n" echo -e "Unblocking bluetooth...\n"
rfkill unblock bluetooth rfkill unblock bluetooth
rfkill list bluetooth rfkill list bluetooth

View File

@@ -1,3 +1,5 @@
#!/bin/bash #!/bin/bash
# Restart the hypridle service (used for idle detection and auto-lock).
omarchy-restart-app hypridle omarchy-restart-app hypridle

View File

@@ -1,3 +1,5 @@
#!/bin/bash #!/bin/bash
# Restart the hyprsunset service (used for blue light filtering/night light).
omarchy-restart-app hyprsunset omarchy-restart-app hyprsunset

View File

@@ -2,4 +2,6 @@
# Reload opencode configuration (used by the Omarchy theme switching). # Reload opencode configuration (used by the Omarchy theme switching).
killall -SIGUSR2 opencode if pgrep -x opencode >/dev/null; then
killall -SIGUSR2 opencode
fi

View File

@@ -1,4 +1,6 @@
#!/bin/bash #!/bin/bash
# Restart the PipeWire audio service to fix audio issues or apply new configuration.
echo -e "Restarting pipewire audio service...\n" echo -e "Restarting pipewire audio service...\n"
systemctl --user restart pipewire.service systemctl --user restart pipewire.service

View File

@@ -1,5 +1,7 @@
#!/bin/bash #!/bin/bash
# Unblock and restart the Wi-Fi service.
echo -e "Unblocking wifi...\n" echo -e "Unblocking wifi...\n"
rfkill unblock wifi rfkill unblock wifi
rfkill list wifi rfkill list wifi

View File

@@ -1,3 +1,5 @@
#!/bin/bash #!/bin/bash
# Restart the XCompose input method service (fcitx5) to apply new compose key settings.
omarchy-restart-app fcitx5 omarchy-restart-app fcitx5

View File

@@ -58,11 +58,13 @@ EOF
add_hyprlock_fingerprint_icon() { add_hyprlock_fingerprint_icon() {
print_info "Adding fingerprint icon to hyprlock placeholder text..." 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/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() { remove_hyprlock_fingerprint_icon() {
print_info "Removing fingerprint icon from hyprlock placeholder text..." 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/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() { remove_pam_config() {

View File

@@ -1,4 +1,7 @@
#!/bin/bash #!/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 echo
gum spin --spinner "globe" --title "Done! Press any key to close..." -- bash -c 'read -n 1 -s' gum spin --spinner "globe" --title "Done! Press any key to close..." -- bash -c 'read -n 1 -s'

View File

@@ -1,5 +1,8 @@
#!/bin/bash #!/bin/bash
# Display the Omarchy logo in the terminal using green color.
# Used by various presentation scripts to show branding.
clear clear
echo -e "\033[32m" echo -e "\033[32m"
cat <~/.local/share/omarchy/logo.txt cat <~/.local/share/omarchy/logo.txt

View File

@@ -31,4 +31,6 @@ create)
restore) restore)
sudo limine-snapper-restore sudo limine-snapper-restore
;; ;;
delete)
sudo snapper -c "$config" delete 0
esac esac

View File

@@ -1,5 +1,9 @@
#!/bin/bash #!/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" STATE_DIR="$HOME/.local/state/omarchy"
mkdir -p "$STATE_DIR" mkdir -p "$STATE_DIR"

15
bin/omarchy-swayosd-brightness Executable file
View File

@@ -0,0 +1,15 @@
#!/bin/bash
# Display brightness level using SwayOSD on the current monitor.
# Usage: omarchy-swayosd-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 display-brightness \
--custom-progress "$progress" \
--custom-progress-text "${percent}%"

9
bin/omarchy-theme-refresh Executable file
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

View File

@@ -56,9 +56,8 @@ omarchy-restart-mako
omarchy-theme-set-gnome omarchy-theme-set-gnome
omarchy-theme-set-browser omarchy-theme-set-browser
omarchy-theme-set-vscode omarchy-theme-set-vscode
omarchy-theme-set-vscodium
omarchy-theme-set-cursor
omarchy-theme-set-obsidian omarchy-theme-set-obsidian
omarchy-theme-set-asusctl
# Call hook on theme set # Call hook on theme set
omarchy-hook theme-set "$THEME_NAME" omarchy-hook theme-set "$THEME_NAME"

7
bin/omarchy-theme-set-asusctl Executable file
View File

@@ -0,0 +1,7 @@
#!/bin/bash
ASUSCTL_THEME=~/.config/omarchy/current/theme/asusctl.rgb
if omarchy-cmd-present asusctl; then
asusctl aura effect static -c $(sed 's/^#//' $ASUSCTL_THEME)
fi

View File

@@ -2,7 +2,7 @@
CHROMIUM_THEME=~/.config/omarchy/current/theme/chromium.theme 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 if [[ -f $CHROMIUM_THEME ]]; then
THEME_RGB_COLOR=$(<$CHROMIUM_THEME) THEME_RGB_COLOR=$(<$CHROMIUM_THEME)
THEME_HEX_COLOR=$(printf '#%02x%02x%02x' ${THEME_RGB_COLOR//,/ }) 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 fi
if omarchy-cmd-present chromium; then if omarchy-cmd-present chromium; then
rm -f /etc/chromium/policies/managed/color.json echo "{\"BrowserThemeColor\": \"$THEME_HEX_COLOR\"}" | tee "/etc/chromium/policies/managed/color.json" >/dev/null
chromium --no-startup-window --set-theme-color="$THEME_RGB_COLOR" >/dev/null chromium --refresh-platform-policy --no-startup-window >/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
fi fi
if omarchy-cmd-present brave; then if omarchy-cmd-present brave; then

View File

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

View File

@@ -1,52 +1,18 @@
#!/bin/bash #!/bin/bash
# omarchy-theme-set-obsidian: Bootstrap and update Omarchy theme for Obsidian # Sync Omarchy theme to all Obsidian vaults
#
# - Ensures registry at ~/.local/state/omarchy/obsidian-vaults
# - Populates by extracting vault paths from ~/.config/obsidian/obsidian.json
# - For each valid vault:
# - Ensures .obsidian/themes/Omarchy/{manifest.json, theme.css}
# - Updates theme.css (uses current themes obsidian.css if present; otherwise generates -- see below)
# Theme automagic generation logic:
#
# - Background/foreground: read from ~/.config/omarchy/current/theme/alacritty.toml [colors.primary]
# (background/foreground). Fallbacks: bg=#1a1b26, fg=#a9b1d6. Compute bg brightness for light/dark handling.
# - Palette extraction: collect colors from Alacritty (primary/normal/bright/dim/selection), Waybar (@define-color),
# and Hyprland (col.*_border; rgba->hex). Normalize, dedupe, and count frequencies.
# - Slot ordering: remove bg/fg, sort remaining colors by frequency, then fill 13 slots by cycling. Map slots to:
# h1h6, links, inline code, marks, interactive accent, blockquote border; muted/faint use border color.
# - Code colors: code background = closest color to bg (Euclidean RGB); if none, make a subtle bg variant (+/ RGB).
# code foreground = closest color to fg; fallback #e0e0e0.
# - Border color: from btop.theme theme[div_line]; else blended mix biased toward bg (≈ (bg+fg)/3).
# - Selection: from Alacritty [colors.selection] (background/text), honoring CellForeground/Background.
# If missing, background = 75% bg + 25% fg; text chosen for contrast vs selection background.
# - Fonts: monospace from Alacritty [font] or fontconfig monospace; UI font from fontconfig sans-serif.
VAULTS_FILE="$HOME/.local/state/omarchy/obsidian-vaults"
CURRENT_THEME_DIR="$HOME/.config/omarchy/current/theme" CURRENT_THEME_DIR="$HOME/.config/omarchy/current/theme"
ensure_vaults_file() { [ -f "$CURRENT_THEME_DIR/obsidian.css" ] || exit 0
mkdir -p "$(dirname "$VAULTS_FILE")"
local tmpfile
tmpfile="$(mktemp)"
# Extract the Obsidian vault location from config file <base>/<vault>/.obsidian
jq -r '.vaults | values[].path' ~/.config/obsidian/obsidian.json 2>/dev/null >>"$tmpfile"
if [ -s "$tmpfile" ]; then
sort -u "$tmpfile" >"$VAULTS_FILE"
else
: >"$VAULTS_FILE"
fi
rm "$tmpfile"
}
# Ensure theme directory and minimal manifest exist in a vault jq -r '.vaults | values[].path' ~/.config/obsidian/obsidian.json 2>/dev/null | while read -r vault_path; do
ensure_theme_scaffold() { [ -d "$vault_path/.obsidian" ] || continue
local vault_path="$1"
local theme_dir="$vault_path/.obsidian/themes/Omarchy" theme_dir="$vault_path/.obsidian/themes/Omarchy"
mkdir -p "$theme_dir" mkdir -p "$theme_dir"
if [ ! -f "$theme_dir/manifest.json" ]; then
cat >"$theme_dir/manifest.json" <<'EOF' [ -f "$theme_dir/manifest.json" ] || cat >"$theme_dir/manifest.json" <<'EOF'
{ {
"name": "Omarchy", "name": "Omarchy",
"version": "1.0.0", "version": "1.0.0",
@@ -56,624 +22,6 @@ ensure_theme_scaffold() {
"authorUrl": "https://omarchy.org" "authorUrl": "https://omarchy.org"
} }
EOF EOF
fi
[ -f "$theme_dir/theme.css" ] || : >"$theme_dir/theme.css"
}
# Function to extract hex color from string cp "$CURRENT_THEME_DIR/obsidian.css" "$theme_dir/theme.css"
extract_hex_color() { done
echo "$1" | grep -oE '#[0-9a-fA-F]{6}' | head -1
}
# Function to convert RGB/RGBA to hex
rgb_to_hex() {
local rgb_string="$1"
if [[ $rgb_string =~ rgba?\(([0-9]+),\s*([0-9]+),\s*([0-9]+) ]]; then
printf "#%02x%02x%02x\n" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
fi
}
# Convert hex to RGB components
hex_to_rgb() {
local hex="${1#\#}"
printf "%d %d %d\n" "0x${hex:0:2}" "0x${hex:2:2}" "0x${hex:4:2}"
}
# Calculate perceived brightness (0-255)
calculate_brightness() {
local hex="$1"
read -r r g b <<<"$(hex_to_rgb "$hex")"
# Use perceived brightness formula
echo $(((r * 299 + g * 587 + b * 114) / 1000))
}
# Calculate approximate contrast ratio between two colors
# Returns ratio scaled by 100 (e.g., 450 = 4.5:1 ratio)
# (this is due to bash not supporting decimal math)
calculate_contrast_ratio() {
local hex1="$1" hex2="$2"
local br1=$(calculate_brightness "$hex1") # 0-255 range
local br2=$(calculate_brightness "$hex2") # 0-255 range
# Ensure br1 is the lighter color (higher brightness)
if [ $br1 -lt $br2 ]; then
local temp=$br1
br1=$br2
br2=$temp
fi
# Approximate contrast ratio scaled by 100
# Add offset to avoid division by zero and approximate WCAG +0.05 behavior
echo $(((br1 + 13) * 100 / (br2 + 13)))
}
# Check if two colors meet minimum contrast threshold
# Usage: meets_contrast_threshold <ratio> <threshold>
# Both ratio and threshold should be scaled by 100 (e.g., 300 = 3:1)
meets_contrast_threshold() {
local ratio="$1" # Ratio scaled by 100 (from calculate_contrast_ratio)
local threshold="$2" # Threshold scaled by 100 (300=3:1, 450=4.5:1, 700=7:1)
[ $ratio -ge $threshold ]
}
# Calculate color distance (euclidean in RGB space)
color_distance() {
local hex1="$1"
local hex2="$2"
read -r r1 g1 b1 <<<"$(hex_to_rgb "$hex1")"
read -r r2 g2 b2 <<<"$(hex_to_rgb "$hex2")"
echo $(((r1 - r2) * (r1 - r2) + (g1 - g2) * (g1 - g2) + (b1 - b2) * (b1 - b2)))
}
# Extract all colors with frequency count
extract_all_colors_with_count() {
local -A color_counts
local color
# Extract from Alacritty config
if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then
# Primary colors
while IFS= read -r color; do
color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
[ -n "$color" ] && ((color_counts["$color"]++))
done < <(grep -E "(background|foreground|cursor|text)" "$CURRENT_THEME_DIR/alacritty.toml" | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | grep "^#")
# Normal colors
while IFS= read -r color; do
color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
[ -n "$color" ] && ((color_counts["$color"]++))
done < <(grep -A 20 "\[colors.normal\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep -E "(black|red|green|yellow|blue|magenta|cyan|white)" | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | grep "^#")
# Bright colors
while IFS= read -r color; do
# Add # if missing
[[ "$color" =~ ^[0-9a-fA-F]{6}$ ]] && color="#$color"
color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
[[ "$color" =~ ^#[0-9a-f]{6}$ ]] && ((color_counts["$color"]++))
done < <(grep -A 20 "\[colors.bright\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep -E "(black|red|green|yellow|blue|magenta|cyan|white)" | sed "s/.*[\"']//;s/[\"'].*//")
# Dim colors if present
while IFS= read -r color; do
# Add # if missing
[[ "$color" =~ ^[0-9a-fA-F]{6}$ ]] && color="#$color"
color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
[[ "$color" =~ ^#[0-9a-f]{6}$ ]] && ((color_counts["$color"]++))
done < <(grep -A 20 "\[colors.dim\]" "$CURRENT_THEME_DIR/alacritty.toml" 2>/dev/null | grep -E "(black|red|green|yellow|blue|magenta|cyan|white)" | sed "s/.*[\"']//;s/[\"'].*//")
# Selection colors
while IFS= read -r color; do
color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
[ -n "$color" ] && ((color_counts["$color"]++))
done < <(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" 2>/dev/null | grep -E "(background|text)" | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | grep "^#")
fi
# Extract from Waybar CSS
if [ -f "$CURRENT_THEME_DIR/waybar.css" ]; then
while IFS= read -r color; do
color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
[ -n "$color" ] && ((color_counts["$color"]++))
done < <(grep -oE '@define-color [a-z_-]+ #[0-9a-fA-F]{6}' "$CURRENT_THEME_DIR/waybar.css" | grep -oE '#[0-9a-fA-F]{6}')
fi
# Extract from Hyprland config
if [ -f "$CURRENT_THEME_DIR/hyprland.conf" ]; then
while IFS= read -r color; do
if [[ $color == rgba* ]] || [[ $color == rgb* ]]; then
color=$(rgb_to_hex "$color")
fi
color=$(echo "$color" | tr '[:upper:]' '[:lower:]') # Lowercase for consistency
[ -n "$color" ] && ((color_counts["$color"]++))
done < <(grep -E "col\.(active|inactive)_border" "$CURRENT_THEME_DIR/hyprland.conf" | grep -oE 'rgba?\([^)]+\)|#[0-9a-fA-F]{6,8}' | sed 's/ff$//')
fi
# Output colors with their counts
for color in "${!color_counts[@]}"; do
echo "${color_counts[$color]} $color"
done
}
# Sort colors by frequency
sort_colors_by_frequency() {
# Input is already "count color" format
sort -rn | cut -d' ' -f2
}
# Fill color slots with cycling if needed
fill_color_slots() {
local -a colors=("$@")
local -a slots
local num_colors=${#colors[@]}
# Need 13 slots total (code colors are handled separately)
local slots_needed=13
if [ $num_colors -eq 0 ]; then
# No colors available, use defaults
colors=("#3d3d3d" "#5d5d5d" "#7d7d7d" "#9d9d9d" "#bd93f9" "#50fa7b")
num_colors=6
fi
# Fill slots, cycling if necessary
for ((i = 0; i < slots_needed; i++)); do
slots[$i]="${colors[$((i % num_colors))]}"
done
echo "${slots[@]}"
}
# Main color extraction and theme generation
extract_theme_data() {
# Get primary colors from Alacritty
local bg_color="#1a1b26"
local fg_color="#a9b1d6"
if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then
local extracted_bg=$(grep -A 5 "\[colors.primary\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^background = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]')
local extracted_fg=$(grep -A 5 "\[colors.primary\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^foreground = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]')
[ -n "$extracted_bg" ] && bg_color="$extracted_bg"
[ -n "$extracted_fg" ] && fg_color="$extracted_fg"
fi
# Determine if light or dark theme
local bg_brightness=$(calculate_brightness "$bg_color")
local is_light_theme=false
[ $bg_brightness -gt 127 ] && is_light_theme=true
# Extract all colors with counts
local color_data=$(extract_all_colors_with_count)
# Filter out background and foreground colors for the main array
local filtered_data=$(echo "$color_data" | grep -v "$bg_color" | grep -v "$fg_color")
# Get all unique colors (including bg/fg) for distance calculations
local -a all_unique_colors
readarray -t all_unique_colors < <(echo "$color_data" | cut -d' ' -f2 | sort -u)
# Find the 3 closest colors to background for background variations
local -a bg_distances
for color in "${all_unique_colors[@]}"; do
if [ "$color" != "$bg_color" ]; then
distance=$(color_distance "$color" "$bg_color")
bg_distances+=("$distance:$color")
fi
done
# All background variations use the same as primary background
local bg_primary_alt="$bg_color"
local bg_secondary="$bg_color"
local bg_secondary_alt="$bg_color"
# Generate code background color that will contrast with foreground text
read -r r g b <<<"$(hex_to_rgb "$bg_color")"
if [ $bg_brightness -gt 127 ]; then
r=$((r - 10))
g=$((g - 10))
b=$((b - 10))
else
r=$((r + 15))
g=$((g + 15))
b=$((b + 15))
fi
[ $r -lt 0 ] && r=0
[ $r -gt 255 ] && r=255
[ $g -lt 0 ] && g=0
[ $g -gt 255 ] && g=255
[ $b -lt 0 ] && b=0
[ $b -gt 255 ] && b=255
code_bg=$(printf "#%02x%02x%02x" "$r" "$g" "$b")
# Find closest color to foreground for code block text
local code_fg=""
min_distance=999999999
for color in "${all_unique_colors[@]}"; do
if [ "$color" != "$fg_color" ]; then
distance=$(color_distance "$color" "$fg_color")
if [ $distance -lt $min_distance ]; then
min_distance=$distance
code_fg="$color"
fi
fi
done
[ -z "$code_fg" ] && code_fg="#e0e0e0" # Fallback
# Extract text selection colors from Alacritty
local selection_bg=""
local selection_fg=""
if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then
selection_bg=$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^background = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]')
local selection_text=$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^text = " | sed "s/.*[\"']0x/#/;s/.*[\"']#/#/;s/[\"'].*//;s/.*#\([0-9a-fA-F]\{6\}\).*/\#\1/" | head -1 | tr '[:upper:]' '[:lower:]')
# If text is set to CellForeground/CellBackground, use the appropriate color
if [ -z "$selection_text" ] || [[ "$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^text = ")" == *"CellForeground"* ]]; then
selection_fg="$fg_color"
elif [[ "$(grep -A 5 "\[colors.selection\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep "^text = ")" == *"CellBackground"* ]]; then
selection_fg="$bg_color"
else
selection_fg="$selection_text"
fi
fi
# Fallback if no selection colors found
if [ -z "$selection_bg" ]; then
read -r r1 g1 b1 <<<"$(hex_to_rgb "$bg_color")"
read -r r2 g2 b2 <<<"$(hex_to_rgb "$fg_color")"
local r=$(((r1 * 3 + r2) / 4)) # 75% background, 25% foreground
local g=$(((g1 * 3 + g2) / 4))
local b=$(((b1 * 3 + b2) / 4))
selection_bg=$(printf "#%02x%02x%02x" "$r" "$g" "$b")
fi
# Use contrasting color for selection text if not defined
if [ -z "$selection_fg" ]; then
# Calculate brightness of selection background
local sel_brightness=$(calculate_brightness "$selection_bg")
if [ $sel_brightness -gt 127 ]; then
selection_fg="$bg_color" # Dark text on light selection
else
selection_fg="$fg_color" # Light text on dark selection
fi
fi
# Extract border color from btop theme
local border_color=""
if [ -f "$CURRENT_THEME_DIR/btop.theme" ]; then
# Look for theme[div_line] in btop theme
local btop_divline=$(grep 'theme\[div_line\]' "$CURRENT_THEME_DIR/btop.theme" | head -1)
if [ -n "$btop_divline" ]; then
# Extract the color value after the = sign
local extracted=$(echo "$btop_divline" | sed 's/.*=//' | xargs)
# Check if it's a hex color and lowercase it
if [[ $extracted =~ ^#[0-9a-fA-F]{6}$ ]]; then
border_color=$(echo "$extracted" | tr '[:upper:]' '[:lower:]')
elif [[ $extracted =~ ^[0-9a-fA-F]{6}$ ]]; then
# Add # if missing and lowercase
border_color=$(echo "#$extracted" | tr '[:upper:]' '[:lower:]')
fi
fi
fi
# Fallback if no border color found
if [ -z "$border_color" ]; then
# Use a color between bg and fg
read -r r1 g1 b1 <<<"$(hex_to_rgb "$bg_color")"
read -r r2 g2 b2 <<<"$(hex_to_rgb "$fg_color")"
local r=$(((r1 + r2) / 3)) # Closer to background
local g=$(((g1 + g2) / 3))
local b=$(((b1 + b2) / 3))
border_color=$(printf "#%02x%02x%02x" "$r" "$g" "$b")
fi
# Set text colors for muted/faint based on contrast
local text_muted_color="$border_color"
local text_faint_color="$border_color"
# Validate border color contrast against background
# Represents a 3:1 WCAG contrast ratio
local ideal_contrast_ratio=300
local border_contrast=$(calculate_contrast_ratio "$border_color" "$bg_color")
if ! meets_contrast_threshold "$border_contrast" "$ideal_contrast_ratio"; then
# Override text colors for readability, keep border color for visibility
text_muted_color="$fg_color"
text_faint_color="$fg_color"
fi
# Get unique colors array (without bg/fg) sorted by frequency
local -a unique_colors
readarray -t unique_colors < <(echo "$filtered_data" | sort_colors_by_frequency)
# Fill the 13 color slots (code colors handled separately)
local -a color_slots
readarray -t color_slots < <(fill_color_slots "${unique_colors[@]}" | tr ' ' '\n')
# Extract fonts
local monospace_font="JetBrainsMono Nerd Font"
local ui_font="Liberation Sans"
if [ -f "$CURRENT_THEME_DIR/alacritty.toml" ]; then
local alacritty_font=$(grep -A 5 "\[font\]" "$CURRENT_THEME_DIR/alacritty.toml" | grep 'family = ' | head -1 | cut -d'"' -f2)
[ -n "$alacritty_font" ] && monospace_font="$alacritty_font"
fi
if [ -f "$HOME/.config/fontconfig/fonts.conf" ]; then
local fontconfig_mono=$(xmlstarlet sel -t -v '//match[@target="pattern"][test/string="monospace"]/edit[@name="family"]/string' "$HOME/.config/fontconfig/fonts.conf" 2>/dev/null || true)
[ -n "$fontconfig_mono" ] && monospace_font="$fontconfig_mono"
local fontconfig_sans=$(xmlstarlet sel -t -v '//match[@target="pattern"][test/string="sans-serif"]/edit[@name="family"]/string' "$HOME/.config/fontconfig/fonts.conf" 2>/dev/null || true)
[ -n "$fontconfig_sans" ] && ui_font="$fontconfig_sans"
fi
# Generate CSS with 14-slot system
cat <<EOF
/* Omarchy Theme for Obsidian */
/* Generated on $(date) from theme: $(basename "$(readlink "$CURRENT_THEME_DIR" 2>/dev/null || echo "unknown")") */
/* Colors sorted by frequency, backgrounds by distance */
.theme-dark, .theme-light {
/* Core colors */
--background-primary: $bg_color;
--text-normal: $fg_color;
/* Background variations (always distance-based) */
--background-primary-alt: $bg_primary_alt;
--background-secondary: $bg_secondary;
--background-secondary-alt: $bg_secondary_alt;
/* Code block colors (always distance-based) */
--code-background: $code_bg;
--code-foreground: $code_fg;
/* Border color from btop theme */
--border-color: $border_color;
/* Selection colors from Alacritty */
--text-selection: $selection_bg;
--text-selection-fg: $selection_fg;
/* 13-slot color system for remaining elements */
--text-title-h1: ${color_slots[0]};
--text-title-h2: ${color_slots[1]};
--text-title-h3: ${color_slots[2]};
--text-title-h4: ${color_slots[3]};
--text-title-h5: ${color_slots[4]};
--text-title-h6: ${color_slots[4]}; /* Same as h5 */
--text-link: ${color_slots[5]};
--markup-code: ${color_slots[6]};
--text-mark: ${color_slots[7]};
--interactive-accent: ${color_slots[8]};
--blockquote-border: ${color_slots[9]};
--text-muted: $text_muted_color; /* Use text-specific color for muted text */
--text-faint: $text_faint_color; /* Use text-specific color for faint text */
/* Additional mappings */
--text-accent: var(--interactive-accent);
--text-accent-hover: var(--interactive-accent);
--text-error: var(--text-title-h1);
--text-error-hover: var(--text-title-h1);
--text-highlight-bg: $fg_color; /* Use text color as highlight background */
--text-on-accent: $bg_color;
--interactive-normal: var(--code-background);
--interactive-hover: var(--interactive-accent);
--interactive-accent-hover: var(--interactive-accent);
--interactive-success: var(--text-title-h2);
--scrollbar-bg: var(--background-primary);
--scrollbar-thumb-bg: var(--code-background);
--scrollbar-active-thumb-bg: var(--interactive-accent);
--background-modifier-border: var(--border-color);
--background-modifier-form-field: var(--code-background);
--background-modifier-form-field-highlighted: var(--code-background);
--background-modifier-box-shadow: rgba(0, 0, 0, 0.3);
--background-modifier-success: var(--interactive-success);
--background-modifier-error: var(--text-error);
--background-modifier-error-hover: var(--text-error);
--background-modifier-cover: rgba(0, 0, 0, 0.8);
--link-color: var(--text-link);
--link-color-hover: var(--text-link);
--link-unresolved-color: var(--text-muted);
--link-unresolved-opacity: 0.7;
--tag-color: var(--text-title-h3);
--tag-background: var(--code-background);
--graph-line: var(--text-muted);
--graph-node: var(--interactive-accent);
--graph-node-unresolved: var(--text-muted);
--graph-node-focused: var(--text-link);
--graph-node-tag: var(--text-title-h3);
--graph-node-attachment: var(--text-title-h2);
/* Fonts */
--font-interface-theme: "$ui_font";
--font-text-theme: "$ui_font";
--font-monospace-theme: "$monospace_font";
}
/* Headers */
.cm-header-1, .markdown-rendered h1 { color: var(--text-title-h1); }
.cm-header-2, .markdown-rendered h2 { color: var(--text-title-h2); }
.cm-header-3, .markdown-rendered h3 { color: var(--text-title-h3); }
.cm-header-4, .markdown-rendered h4 { color: var(--text-title-h4); }
.cm-header-5, .markdown-rendered h5 { color: var(--text-title-h5); }
.cm-header-6, .markdown-rendered h6 { color: var(--text-title-h6); }
/* Code blocks */
.markdown-rendered code {
font-family: var(--font-monospace-theme);
background-color: var(--code-background);
color: var(--markup-code);
padding: 2px 4px;
border-radius: 3px;
}
.markdown-rendered pre {
background-color: var(--code-background);
border: 1px solid var(--background-modifier-border);
border-radius: 5px;
}
.markdown-rendered pre code {
background-color: transparent;
color: var(--code-foreground);
}
/* Syntax highlighting */
.cm-s-obsidian span.cm-keyword { color: var(--text-title-h1); }
.cm-s-obsidian span.cm-string { color: var(--text-title-h2); }
.cm-s-obsidian span.cm-number { color: var(--text-title-h3); }
.cm-s-obsidian span.cm-comment { color: var(--text-muted); }
.cm-s-obsidian span.cm-operator { color: var(--text-link); }
.cm-s-obsidian span.cm-variable { color: var(--text-normal); }
.cm-s-obsidian span.cm-def { color: var(--text-link); }
/* Highlighted text */
.markdown-rendered mark,
.cm-s-obsidian span.cm-highlight,
mark {
background-color: var(--text-highlight-bg) !important;
color: var(--code-background) !important;
}
/* Links */
.markdown-rendered a {
color: var(--text-link);
}
/* Blockquotes */
.markdown-rendered blockquote {
border-left: 4px solid var(--blockquote-border);
padding-left: 1em;
}
/* Status bar */
.status-bar {
background-color: var(--code-background);
border-top: 1px solid var(--background-modifier-border);
}
/* Active file */
.workspace-leaf.mod-active .workspace-leaf-header-title {
color: var(--interactive-accent);
}
.nav-file-title.is-active {
background-color: var(--code-background);
color: var(--interactive-accent);
}
/* Text selection */
::selection {
background-color: var(--text-selection);
color: var(--text-selection-fg);
}
/* Search results */
.search-result-file-title {
color: var(--interactive-accent);
}
.search-result-file-match {
background-color: var(--code-background);
color: var(--text-normal);
border-left: 3px solid var(--interactive-accent);
}
.search-result-file-matched-text {
color: var(--code-background);
}
/* Tables */
.markdown-rendered table {
border: 1px solid var(--background-modifier-border);
}
.markdown-rendered th {
background-color: var(--code-background);
color: var(--text-accent);
}
.markdown-rendered td {
border: 1px solid var(--background-modifier-border);
}
/* Callouts */
.callout {
border-left: 4px solid var(--interactive-accent);
background-color: var(--code-background);
}
.callout * {
color: var(--text-normal);
}
/* Modal dialogs */
.modal {
background-color: var(--background-primary);
border: 2px solid var(--background-modifier-border);
}
/* Settings */
.vertical-tab-header-group-title {
color: var(--interactive-accent);
}
.vertical-tab-nav-item.is-active {
background-color: var(--code-background);
color: var(--interactive-accent);
}
EOF
}
# Option handling
if [ "${1:-}" = "--reset" ]; then
echo "♻️ Resetting Omarchy themes and registry..."
if [ -f "$VAULTS_FILE" ] && [ -s "$VAULTS_FILE" ]; then
while IFS= read -r vault_path || [ -n "$vault_path" ]; do
case "$vault_path" in ""|\#*) continue ;; esac
vault_path="${vault_path%/}"
vault_name=$(basename "$vault_path")
theme_dir="$vault_path/.obsidian/themes/Omarchy"
if [ -d "$theme_dir" ]; then
rm -rf "$theme_dir"
echo " ✅ $vault_name (theme removed)"
else
echo " $vault_name (no theme present)"
fi
done <"$VAULTS_FILE"
fi
rm -f "$VAULTS_FILE"
echo "✅ Registry removed"
exit 0
fi
# Step 1: ensure registry exists (bootstrap if needed)
ensure_vaults_file
while IFS= read -r vault_path || [ -n "$vault_path" ]; do
case "$vault_path" in "" | \#*) continue ;; esac
vault_path="${vault_path%/}"
vault_name=$(basename "$vault_path")
# Step 2: verify path exists; log/skip gracefully if invalid
if [ ! -d "$vault_path" ] || [ ! -d "$vault_path/.obsidian" ]; then
echo " ❌ $vault_name (invalid entry: missing directory or .obsidian)"
continue
fi
# Ensure theme files exist for this vault
ensure_theme_scaffold "$vault_path"
THEME_DIR="$vault_path/.obsidian/themes/Omarchy"
# Step 3: update theme.css
if [ -f "$CURRENT_THEME_DIR/obsidian.css" ]; then
cp "$CURRENT_THEME_DIR/obsidian.css" "$THEME_DIR/theme.css"
else
extract_theme_data >"$THEME_DIR/theme.css"
fi
done <"$VAULTS_FILE"

View File

@@ -13,22 +13,21 @@ hex_to_rgb() {
# Only generate dynamic templates for themes with a colors.toml definition # Only generate dynamic templates for themes with a colors.toml definition
if [[ -f $COLORS_FILE ]]; then if [[ -f $COLORS_FILE ]]; then
# Parse TOML using yq (treating it as YAML since the flat key=value structure is compatible)
# We convert 'key = value' to 'key: value' to make it valid YAML, then use yq/jq to generate the replacement commands.
sed_script=$(mktemp) sed_script=$(mktemp)
# Generate standard and _strip substitutions
sed 's/=/:/' "$COLORS_FILE" | yq -r 'to_entries[] | "s|{{ \(.key) }}|\(.value)|g", "s|{{ \(.key)_strip }}|\(.value | sub("^#";""))|g"' > "$sed_script"
# Generate _rgb substitutions for hex colors
while IFS='=' read -r key value; do while IFS='=' read -r key value; do
key=$(echo "$key" | xargs) key="${key//[\"\' ]/}" # strip quotes and spaces from key
value=$(echo "$value" | xargs | tr -d '"') [[ $key && $key != \#* ]] || continue # skip empty lines and comments
value="${value#*[\"\']}"
value="${value%%[\"\']*}" # extract value between quotes (ignores inline comments)
printf 's|{{ %s }}|%s|g\n' "$key" "$value" # {{ key }} -> value
printf 's|{{ %s_strip }}|%s|g\n' "$key" "${value#\#}" # {{ key_strip }} -> value without leading #
if [[ $value =~ ^# ]]; then if [[ $value =~ ^# ]]; then
rgb=$(hex_to_rgb "$value") rgb=$(hex_to_rgb "$value")
echo "s|{{ ${key}_rgb }}|${rgb}|g" >> "$sed_script" echo "s|{{ ${key}_rgb }}|${rgb}|g"
fi fi
done < "$COLORS_FILE" done <"$COLORS_FILE" >"$sed_script"
shopt -s nullglob shopt -s nullglob
@@ -39,7 +38,7 @@ if [[ -f $COLORS_FILE ]]; then
# Don't overwrite configs already exists in the output directory (copied from theme specific folder) # Don't overwrite configs already exists in the output directory (copied from theme specific folder)
if [[ ! -f $output_path ]]; then if [[ ! -f $output_path ]]; then
sed -f "$sed_script" "$tpl" > "$output_path" sed -f "$sed_script" "$tpl" >"$output_path"
fi fi
done done

View File

@@ -1,45 +1,39 @@
#!/bin/bash #!/bin/bash
# Note: We cannot use `jq` to update settings.json because its JSONC (allows comments), # Sync Omarchy theme to VS Code, VSCodium, and Cursor
# which jq doesnt support.
# Parameters: EDITOR_CMD SETTINGS_PATH SKIP_FLAG EDITOR_NAME
EDITOR_CMD="${1:-code}"
SETTINGS_PATH="${2:-$HOME/.config/Code/User/settings.json}"
SKIP_FLAG="${3:-$HOME/.local/state/omarchy/toggles/skip-vscode-theme-changes}"
VS_CODE_THEME="$HOME/.config/omarchy/current/theme/vscode.json" VS_CODE_THEME="$HOME/.config/omarchy/current/theme/vscode.json"
if omarchy-cmd-present "$EDITOR_CMD" && [[ ! -f "$SKIP_FLAG" ]]; then set_theme() {
local editor_cmd="$1"
local settings_path="$2"
local skip_flag="$3"
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") theme_name=$(jq -r '.name' "$VS_CODE_THEME")
extension=$(jq -r '.extension' "$VS_CODE_THEME") extension=$(jq -r '.extension' "$VS_CODE_THEME")
# Install theme extension if [[ -n "$extension" ]] && ! "$editor_cmd" --list-extensions | grep -Fxq "$extension"; then
if [[ -n "$extension" ]] && ! "$EDITOR_CMD" --list-extensions | grep -Fxq "$extension"; then "$editor_cmd" --install-extension "$extension" >/dev/null
"$EDITOR_CMD" --install-extension "$extension" >/dev/null
fi fi
# Create config file if there isn't already one mkdir -p "$(dirname "$settings_path")"
mkdir -p "$(dirname "$SETTINGS_PATH")" [[ -f "$settings_path" ]] || printf '{\n}\n' >"$settings_path"
if [[ ! -f "$SETTINGS_PATH" ]]; then
printf '{\n}\n' >"$SETTINGS_PATH" if ! grep -q '"workbench.colorTheme"' "$settings_path"; then
sed -i --follow-symlinks -E '0,/\{/{s/\{/{\ "workbench.colorTheme": "",/}' "$settings_path"
fi fi
# Create a `workbench.colorTheme` entry in settings.
if ! grep -q '"workbench.colorTheme"' "$SETTINGS_PATH"; then
# Insert `"workbench.colorTheme": "",` immediately after the first `{`
# Use sed's first-match range (0,/{/) to only replace the first `{`
sed -i --follow-symlinks -E '0,/\{/{s/\{/{\ "workbench.colorTheme": "",/}' "$SETTINGS_PATH"
fi
# Update theme
sed -i --follow-symlinks -E \ sed -i --follow-symlinks -E \
"s/(\"workbench.colorTheme\"[[:space:]]*:[[:space:]]*\")[^\"]*(\")/\1$theme_name\2/" \ "s/(\"workbench.colorTheme\"[[:space:]]*:[[:space:]]*\")[^\"]*(\")/\1$theme_name\2/" \
"$SETTINGS_PATH" "$settings_path"
else elif [[ -f "$settings_path" ]]; then
# Remove theme from settings.json when the theme doesn't have editor support sed -i --follow-symlinks -E 's/\"workbench\.colorTheme\"[[:space:]]*:[^,}]*,?//' "$settings_path"
if [[ -f "$SETTINGS_PATH" ]]; then
sed -i --follow-symlinks -E 's/\"workbench\.colorTheme\"[[:space:]]*:[^,}]*,?//' "$SETTINGS_PATH"
fi
fi fi
fi }
set_theme "code" "$HOME/.config/Code/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-vscode-theme-changes"
set_theme "codium" "$HOME/.config/VSCodium/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-codium-theme-changes"
set_theme "cursor" "$HOME/.config/Cursor/User/settings.json" "$HOME/.local/state/omarchy/toggles/skip-cursor-theme-changes"

View File

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

53
bin/omarchy-toggle-hybrid-gpu Executable file
View File

@@ -0,0 +1,53 @@
#!/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
sudo systemctl enable supergfxd
# Needed to deal with restoring to sleep where going through VFIO first means we don't need to reboot.
sudo sed -i "s/\"vfio_enable\": \".*\"/\"vfio_enable\": true/" /etc/supergfxd.conf
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-cmd-reboot
fi
;;
"Hybrid")
if gum confirm "Use only integrated GPU and reboot?"; then
# Switch to integrated mode
sudo sed -i "s/\"mode\": \".*\"/\"mode\": \"Integrated\"/" /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-cmd-reboot
fi
;;
*)
echo "Hybrid GPU not found or in unknown mode."
exit 1
;;
esac

36
bin/omarchy-tui-remove-all Executable file
View File

@@ -0,0 +1,36 @@
#!/bin/bash
# Remove all TUIs installed via omarchy-tui-install.
# Identifies TUIs by their Exec pattern (xdg-terminal-exec --app-id=TUI.).
set -e
APP_DIR="${1:-$HOME/.local/share/applications}"
ICON_DIR="$HOME/.local/share/applications/icons"
echo "Scanning for TUIs in $APP_DIR..."
tui_desktop_files=()
while IFS= read -r -d '' file; do
if grep -q "Exec=xdg-terminal-exec --app-id=TUI\." "$file" 2>/dev/null; then
tui_desktop_files+=("$file")
fi
done < <(find "$APP_DIR" -maxdepth 1 -name "*.desktop" -print0 2>/dev/null)
if [[ ${#tui_desktop_files[@]} -eq 0 ]]; then
echo "No TUIs found."
exit 0
fi
for file in "${tui_desktop_files[@]}"; do
app_name=$(basename "$file" .desktop)
echo "Removing TUI: $app_name"
rm -f "$file"
rm -f "$ICON_DIR/$app_name.png"
done
if command -v update-desktop-database &>/dev/null; then
update-desktop-database "$APP_DIR" &>/dev/null || true
fi
echo "TUIs removed successfully."

View File

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

18
bin/omarchy-update-analyze-logs Executable file
View File

@@ -0,0 +1,18 @@
#!/bin/bash
update_log="/tmp/omarchy-update.log"
# Check for errors
if grep -qi "error" "$update_log"; then
echo -e "\e[31mNon-stopping errors detected during update:\e[0m"
grep -i "error" "$update_log"
echo
fi
# Check for initramfs generation failure
if grep -q "Updating linux initcpios" "$update_log"; then
if ! grep -q "Initcpio image generation successful" "$update_log"; then
echo -e '\e[31mError: Initramfs generation may have failed. Review logs before restart.\e[0m'
echo
fi
fi

13
bin/omarchy-update-aur-pkgs Executable file
View File

@@ -0,0 +1,13 @@
#!/bin/bash
# Update AUR packages if any are installed
if pacman -Qem >/dev/null; then
if omarchy-pkg-aur-accessible; then
echo -e "\e[32m\nUpdate AUR packages\e[0m"
yay -Sua --noconfirm --cleanafter --ignore gcc14,gcc14-libs
echo
else
echo -e "\e[31m\nAUR is unavailable (so skipping updates)\e[0m"
echo
fi
fi

View File

@@ -7,5 +7,5 @@ if omarchy-cmd-missing fwupdmgr; then
omarchy-pkg-add fwupd omarchy-pkg-add fwupd
fi fi
fwupdmgr refresh fwupdmgr refresh --force
sudo fwupdmgr update sudo fwupdmgr update

10
bin/omarchy-update-orphan-pkgs Executable file
View File

@@ -0,0 +1,10 @@
#!/bin/bash
orphans=$(pacman -Qtdq || true)
if [[ -n $orphans ]]; then
echo -e "\e[32m\nRemove orphan system packages\e[0m"
for pkg in $orphans; do
sudo pacman -Rs --noconfirm "$pkg" || true
done
echo
fi

View File

@@ -5,13 +5,21 @@ set -e
# Ensure screensaver/sleep doesn't set in during updates # Ensure screensaver/sleep doesn't set in during updates
hyprctl dispatch tagwindow +noidle &> /dev/null || true hyprctl dispatch tagwindow +noidle &> /dev/null || true
# Capture update logs
exec > >(tee "/tmp/omarchy-update.log") 2>&1
# Perform all update steps # Perform all update steps
omarchy-update-time omarchy-update-time
omarchy-update-keyring omarchy-update-keyring
omarchy-update-available-reset omarchy-update-available-reset
omarchy-update-system-pkgs omarchy-update-system-pkgs
omarchy-migrate omarchy-migrate
omarchy-update-aur-pkgs
omarchy-update-orphan-pkgs
omarchy-hook post-update omarchy-hook post-update
omarchy-update-analyze-logs
omarchy-update-restart omarchy-update-restart
# Re-enable screensaver/sleep after updates # Re-enable screensaver/sleep after updates

View File

@@ -4,24 +4,3 @@ set -e
echo -e "\e[32m\nUpdate system packages\e[0m" echo -e "\e[32m\nUpdate system packages\e[0m"
sudo pacman -Syyu --noconfirm sudo pacman -Syyu --noconfirm
# Update AUR packages if any are installed
if pacman -Qem >/dev/null; then
if omarchy-pkg-aur-accessible; then
echo -e "\e[32m\nUpdate AUR packages\e[0m"
yay -Sua --noconfirm
echo
else
echo -e "\e[31m\nAUR is unavailable (so skipping updates)\e[0m"
echo
fi
fi
orphans=$(pacman -Qtdq || true)
if [[ -n $orphans ]]; then
echo -e "\e[32m\nRemove orphan system packages\e[0m"
for pkg in $orphans; do
sudo pacman -Rs --noconfirm "$pkg" || true
done
echo
fi

View File

@@ -2,6 +2,8 @@
if grep -q "https://stable-mirror.omarchy.org/" /etc/pacman.d/mirrorlist; then if grep -q "https://stable-mirror.omarchy.org/" /etc/pacman.d/mirrorlist; then
mirror="stable" mirror="stable"
elif grep -q "https://rc-mirror.omarchy.org/" /etc/pacman.d/mirrorlist; then
mirror="rc"
elif grep -q "https://mirror.omarchy.org/" /etc/pacman.d/mirrorlist; then elif grep -q "https://mirror.omarchy.org/" /etc/pacman.d/mirrorlist; then
mirror="edge" mirror="edge"
else else
@@ -12,6 +14,8 @@ if grep -q "https://pkgs.omarchy.org/stable/" /etc/pacman.conf; then
pkgs="stable" pkgs="stable"
elif grep -q "https://pkgs.omarchy.org/edge/" /etc/pacman.conf; then elif grep -q "https://pkgs.omarchy.org/edge/" /etc/pacman.conf; then
pkgs="edge" pkgs="edge"
elif grep -q "https://pkgs.omarchy.org/rc/" /etc/pacman.conf; then
pkgs="rc"
else else
pkgs="unknown" pkgs="unknown"
fi fi

36
bin/omarchy-webapp-remove-all Executable file
View File

@@ -0,0 +1,36 @@
#!/bin/bash
# Remove all web apps installed via omarchy-webapp-install.
# Identifies web apps by their Exec pattern (omarchy-launch-webapp or omarchy-webapp-handler).
set -e
APP_DIR="${1:-$HOME/.local/share/applications}"
ICON_DIR="$HOME/.local/share/applications/icons"
echo "Scanning for web apps in $APP_DIR..."
webapp_desktop_files=()
while IFS= read -r -d '' file; do
if grep -q "Exec=omarchy-launch-webapp\|Exec=omarchy-webapp-handler" "$file" 2>/dev/null; then
webapp_desktop_files+=("$file")
fi
done < <(find "$APP_DIR" -maxdepth 1 -name "*.desktop" -print0 2>/dev/null)
if [[ ${#webapp_desktop_files[@]} -eq 0 ]]; then
echo "No web apps found."
exit 0
fi
for file in "${webapp_desktop_files[@]}"; do
app_name=$(basename "$file" .desktop)
echo "Removing web app: $app_name"
rm -f "$file"
rm -f "$ICON_DIR/$app_name.png"
done
if command -v update-desktop-database &>/dev/null; then
update-desktop-database "$APP_DIR" &>/dev/null || true
fi
echo "Web apps removed successfully."

5
bin/omarchy-wifi-powersave Executable file
View File

@@ -0,0 +1,5 @@
#!/bin/bash
for iface in /sys/class/net/*/wireless; do
iface="$(basename "$(dirname "$iface")")"
iw dev "$iface" set power_save "$1" 2>/dev/null
done

View File

@@ -185,6 +185,8 @@ services:
DISK_SIZE: "$SELECTED_DISK" DISK_SIZE: "$SELECTED_DISK"
USERNAME: "$USERNAME" USERNAME: "$USERNAME"
PASSWORD: "$PASSWORD" PASSWORD: "$PASSWORD"
TZ: "$(timedatectl show -p Timezone --value 2>/dev/null || echo UTC)"
ARGUMENTS: "-rtc base=localtime,clock=host,driftfix=slew"
devices: devices:
- /dev/kvm - /dev/kvm
- /dev/net/tun - /dev/net/tun
@@ -240,6 +242,11 @@ EOF
} }
remove_windows() { remove_windows() {
if ! gum confirm --default=false "Remove Windows VM and delete all associated data?"; then
echo "Removal cancelled by user"
exit 1
fi
echo "Removing Windows VM..." echo "Removing Windows VM..."
docker-compose -f "$COMPOSE_FILE" down 2>/dev/null || true docker-compose -f "$COMPOSE_FILE" down 2>/dev/null || true
@@ -254,25 +261,6 @@ remove_windows() {
echo "Windows VM removal completed!" echo "Windows VM removal completed!"
} }
wait_for_rdp_ready() {
local WIN_USER="$1"
local WIN_PASS="$2"
local TIMEOUT=240
local SECONDS=0
echo "Waiting for Windows VM to be ready..."
while ! timeout 5s xfreerdp3 /auth-only /cert:ignore /u:"$WIN_USER" /p:"$WIN_PASS" /v:127.0.0.1:3389 &>/dev/null; do
sleep 2
if [ $SECONDS -gt $TIMEOUT ]; then
echo "❌ Timeout waiting for RDP!"
echo " The VM might still be installing Windows."
echo " Check progress at: http://127.0.0.1:8006"
return 1
fi
done
}
launch_windows() { launch_windows() {
KEEP_ALIVE=false KEEP_ALIVE=false
if [ "$1" = "--keep-alive" ] || [ "$1" = "-k" ]; then if [ "$1" = "--keep-alive" ] || [ "$1" = "-k" ]; then
@@ -309,11 +297,19 @@ launch_windows() {
notify-send -u critical "Windows VM" "Failed to start Windows VM" notify-send -u critical "Windows VM" "Failed to start Windows VM"
exit 1 exit 1
fi fi
fi
if ! wait_for_rdp_ready "$WIN_USER" "$WIN_PASS"; then echo "Waiting for Windows VM to start..."
notify-send -u critical "Windows VM" "Did not come alive in time." WAIT_COUNT=0
exit 1 until docker logs omarchy-windows 2>&1 | grep -qi "windows started successfully"; do
sleep 2
WAIT_COUNT=$((WAIT_COUNT + 1))
if [ $WAIT_COUNT -gt 60 ]; then # 2 minutes timeout
echo ""
echo "❌ Timeout: Windows VM failed to start within 2 minutes"
echo " Check logs: docker logs omarchy-windows"
exit 1
fi
done
fi fi
# Build the connection info # Build the connection info
@@ -346,7 +342,7 @@ To stop: omarchy-windows-vm stop"
# If scale is less than 130%, don't set any scale (use default 100) # If scale is less than 130%, don't set any scale (use default 100)
# Connect with RDP in fullscreen (auto-detects resolution) # Connect with RDP in fullscreen (auto-detects resolution)
xfreerdp3 /u:"$WIN_USER" /p:"$WIN_PASS" /v:127.0.0.1:3389 -grab-keyboard /sound /microphone /cert:ignore /title:"Windows VM - Omarchy" /dynamic-resolution /gfx:AVC444 /floatbar:sticky:off,default:visible,show:fullscreen $RDP_SCALE xfreerdp3 /u:"$WIN_USER" /p:"$WIN_PASS" /v:127.0.0.1:3389 -grab-keyboard /sound /microphone /clipboard /cert:ignore /title:"Windows VM - Omarchy" /dynamic-resolution /gfx:AVC444 /floatbar:sticky:off,default:visible,show:fullscreen $RDP_SCALE
# After RDP closes, stop the container unless --keep-alive was specified # After RDP closes, stop the container unless --keep-alive was specified
if [ "$KEEP_ALIVE" = false ]; then if [ "$KEEP_ALIVE" = false ]; then

10
boot.sh
View File

@@ -28,12 +28,10 @@ git clone "https://github.com/${OMARCHY_REPO}.git" ~/.local/share/omarchy >/dev/
# Use custom branch if instructed, otherwise default to master # Use custom branch if instructed, otherwise default to master
OMARCHY_REF="${OMARCHY_REF:-master}" OMARCHY_REF="${OMARCHY_REF:-master}"
if [[ $OMARCHY_REF != "master" ]]; then echo -e "\e[32mUsing branch: $OMARCHY_REF\e[0m"
echo -e "\e[32mUsing branch: $OMARCHY_REF\e[0m" cd ~/.local/share/omarchy
cd ~/.local/share/omarchy git fetch origin "${OMARCHY_REF}" && git checkout "${OMARCHY_REF}"
git fetch origin "${OMARCHY_REF}" && git checkout "${OMARCHY_REF}" cd -
cd -
fi
# Set edge mirror for dev installs # Set edge mirror for dev installs
if [[ $OMARCHY_REF == "dev" ]]; then if [[ $OMARCHY_REF == "dev" ]]; then

View File

@@ -2,5 +2,3 @@
--ozone-platform-hint=wayland --ozone-platform-hint=wayland
--enable-features=TouchpadOverscrollHistoryNavigation --enable-features=TouchpadOverscrollHistoryNavigation
--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url --load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url
# Chromium crash workaround for Wayland color management on Hyprland - see https://github.com/hyprwm/Hyprland/issues/11957
--disable-features=WaylandWpColorManagerV1

View File

@@ -2,5 +2,3 @@
--ozone-platform-hint=wayland --ozone-platform-hint=wayland
--enable-features=TouchpadOverscrollHistoryNavigation --enable-features=TouchpadOverscrollHistoryNavigation
--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url --load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url
# Chromium crash workaround for Wayland color management on Hyprland - see https://github.com/hyprwm/Hyprland/issues/11957
--disable-features=WaylandWpColorManagerV1

View File

@@ -0,0 +1 @@
command = 'wl-copy && hyprctl dispatch sendshortcut "SHIFT, Insert,"'

View File

@@ -32,3 +32,6 @@ keybind = super+control+shift+alt+arrow_right=resize_split:right,100
# Slowdown mouse scrolling # Slowdown mouse scrolling
mouse-scroll-multiplier = 0.95 mouse-scroll-multiplier = 0.95
# Fix general slowness on hyprland (https://github.com/ghostty-org/ghostty/discussions/3224)
async-backend = epoll

View File

@@ -1,6 +1,8 @@
# Application bindings # Application bindings
bindd = SUPER, RETURN, Terminal, exec, uwsm-app -- xdg-terminal-exec --dir="$(omarchy-cmd-terminal-cwd)" bindd = SUPER, RETURN, Terminal, exec, uwsm-app -- xdg-terminal-exec --dir="$(omarchy-cmd-terminal-cwd)"
bindd = SUPER SHIFT, RETURN, Browser, exec, omarchy-launch-browser
bindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window bindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window
bindd = SUPER ALT SHIFT, F, File manager (cwd), exec, uwsm-app -- nautilus --new-window "$(omarchy-cmd-terminal-cwd)"
bindd = SUPER SHIFT, B, Browser, exec, omarchy-launch-browser bindd = SUPER SHIFT, B, Browser, exec, omarchy-launch-browser
bindd = SUPER SHIFT ALT, B, Browser (private), exec, omarchy-launch-browser --private bindd = SUPER SHIFT ALT, B, Browser (private), exec, omarchy-launch-browser --private
bindd = SUPER SHIFT, M, Music, exec, omarchy-launch-or-focus spotify bindd = SUPER SHIFT, M, Music, exec, omarchy-launch-or-focus spotify
@@ -14,7 +16,6 @@ bindd = SUPER SHIFT, SLASH, Passwords, exec, uwsm-app -- 1password
# If your web app url contains #, type it as ## to prevent hyprland treating it as a comment # If your web app url contains #, type it as ## to prevent hyprland treating it as a comment
bindd = SUPER SHIFT, A, ChatGPT, exec, omarchy-launch-webapp "https://chatgpt.com" bindd = SUPER SHIFT, A, ChatGPT, exec, omarchy-launch-webapp "https://chatgpt.com"
bindd = SUPER SHIFT ALT, A, Grok, exec, omarchy-launch-webapp "https://grok.com" bindd = SUPER SHIFT ALT, A, Grok, exec, omarchy-launch-webapp "https://grok.com"
bindd = SUPER SHIFT CTRL, A, opencode, exec, omarchy-launch-opencode
bindd = SUPER SHIFT, C, Calendar, exec, omarchy-launch-webapp "https://app.hey.com/calendar/weeks/" bindd = SUPER SHIFT, C, Calendar, exec, omarchy-launch-webapp "https://app.hey.com/calendar/weeks/"
bindd = SUPER SHIFT, E, Email, exec, omarchy-launch-webapp "https://app.hey.com" bindd = SUPER SHIFT, E, Email, exec, omarchy-launch-webapp "https://app.hey.com"
bindd = SUPER SHIFT, Y, YouTube, exec, omarchy-launch-webapp "https://youtube.com/" bindd = SUPER SHIFT, Y, YouTube, exec, omarchy-launch-webapp "https://youtube.com/"
@@ -24,6 +25,9 @@ bindd = SUPER SHIFT, P, Google Photos, exec, omarchy-launch-or-focus-webapp "Goo
bindd = SUPER SHIFT, X, X, exec, omarchy-launch-webapp "https://x.com/" bindd = SUPER SHIFT, X, X, exec, omarchy-launch-webapp "https://x.com/"
bindd = SUPER SHIFT ALT, X, X Post, exec, omarchy-launch-webapp "https://x.com/compose/post" bindd = SUPER SHIFT ALT, X, X Post, exec, omarchy-launch-webapp "https://x.com/compose/post"
# Add extra bindings
# bind = SUPER SHIFT, R, exec, alacritty -e ssh your-server
# Overwrite existing bindings, like putting Omarchy Menu on Super + Space # Overwrite existing bindings, like putting Omarchy Menu on Super + Space
# unbind = SUPER, SPACE # unbind = SUPER, SPACE
# bindd = SUPER, SPACE, Omarchy menu, exec, omarchy-menu # bindd = SUPER, SPACE, Omarchy menu, exec, omarchy-menu

View File

@@ -39,5 +39,5 @@ input-field {
} }
auth { auth {
fingerprint:enabled = true fingerprint:enabled = false
} }

View File

@@ -3,6 +3,10 @@
input { input {
# Use multiple keyboard layouts and switch between them with Left Alt + Right Alt # Use multiple keyboard layouts and switch between them with Left Alt + Right Alt
# kb_layout = us,dk,eu # kb_layout = us,dk,eu
# Use a specific keyboard variant if needed (e.g. intl for international keyboards)
# kb_variant = intl
kb_options = compose:caps # ,grp:alts_toggle kb_options = compose:caps # ,grp:alts_toggle
# Change speed of keyboard repeat # Change speed of keyboard repeat

View File

@@ -19,6 +19,8 @@ allow_remote_control yes
# Aesthetics # Aesthetics
cursor_shape block cursor_shape block
cursor_blink_interval 0
shell_integration no-cursor
enable_audio_bell no enable_audio_bell no
# Minimal Tab bar styling # Minimal Tab bar styling

View File

@@ -12,3 +12,9 @@
# *) back_to show_main_menu ;; # *) back_to show_main_menu ;;
# esac # esac
# } # }
#
# Example of overriding just the about menu action: (Using zsh instead of bash (default))
#
# show_about() {
# exec omarchy-launch-or-focus-tui "zsh -c 'fastfetch; read -k 1'"
# }

View File

@@ -21,8 +21,6 @@
# {{ accent }} - Theme accent color # {{ accent }} - Theme accent color
# {{ selection_background }} - Selection highlight background # {{ selection_background }} - Selection highlight background
# {{ selection_foreground }} - Selection highlight foreground # {{ selection_foreground }} - Selection highlight foreground
# {{ active_border_color }} - Active window/element border
# {{ active_tab_background }} - Active tab background
# #
# {{ color0 }} through {{ color15 }} - Standard 16-color terminal palette # {{ color0 }} through {{ color15 }} - Standard 16-color terminal palette
# color0-7: Normal colors (black, red, green, yellow, blue, magenta, cyan, white) # color0-7: Normal colors (black, red, green, yellow, blue, magenta, cyan, white)

View File

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

View File

@@ -1,4 +1,4 @@
[server] [server]
show_percentage = true show_percentage = true
max_volume = 100 max_volume = 100
style = "./style.css" style = "~/.config/swayosd/style.css"

95
config/tmux/tmux.conf Normal file
View File

@@ -0,0 +1,95 @@
# Prefix
set -g prefix C-Space
set -g prefix2 C-b
bind C-Space send-prefix
# Reload config
bind q source-file ~/.config/tmux/tmux.conf
# Vi mode for copy
setw -g mode-keys vi
bind -T copy-mode-vi v send -X begin-selection
bind -T copy-mode-vi y send -X copy-selection-and-cancel
# Pane Controls
bind h split-window -h -c "#{pane_current_path}"
bind v split-window -v -c "#{pane_current_path}"
bind -n C-M-PageUp split-window -h -c "#{pane_current_path}"
bind -n C-M-PageDown split-window -v -c "#{pane_current_path}"
bind -n C-M-Home split-window -h -c "#{pane_current_path}"
bind -n C-M-End kill-pane
bind -n C-M-Left select-pane -L
bind -n C-M-Right select-pane -R
bind -n C-M-Up select-pane -U
bind -n C-M-Down select-pane -D
bind -n C-M-S-Left resize-pane -L 5
bind -n C-M-S-Down resize-pane -D 5
bind -n C-M-S-Up resize-pane -U 5
bind -n C-M-S-Right resize-pane -R 5
# Window navigation
bind r command-prompt -I "#W" "rename-window -- '%%'"
bind c new-window -c "#{pane_current_path}"
bind x kill-window
bind -n C-S-Home new-window -c "#{pane_current_path}"
bind -n C-S-End kill-window
bind -n C-S-PageUp next-window
bind -n C-S-PageDown previous-window
bind -n M-1 select-window -t 1
bind -n M-2 select-window -t 2
bind -n M-3 select-window -t 3
bind -n M-4 select-window -t 4
bind -n M-5 select-window -t 5
bind -n M-6 select-window -t 6
bind -n M-7 select-window -t 7
bind -n M-8 select-window -t 8
bind -n M-9 select-window -t 9
# Session controls
bind R command-prompt -I "#S" "rename-session -- '%%'"
bind C new-session
bind X kill-session
bind -n C-M-S-Home new-session -c "#{pane_current_path}"
bind -n C-M-S-End kill-session
bind -n C-M-S-PageUp switch-client -p
bind -n C-M-S-PageDown switch-client -n
# General
set -g default-terminal "tmux-256color"
set -ag terminal-overrides ",*:RGB"
set -g mouse on
set -g base-index 1
setw -g pane-base-index 1
set -g renumber-windows on
set -g history-limit 50000
set -g escape-time 0
set -g focus-events on
set -g set-clipboard on
set -g allow-passthrough on
setw -g aggressive-resize on
set -g detach-on-destroy off
# Status bar
set -g status-position top
set -g status-interval 5
set -g status-left-length 30
set -g status-right-length 50
set -g window-status-separator ""
# Theme
set -g status-style "bg=default,fg=default"
set -g status-left "#[fg=black,bg=blue,bold] #S #[bg=default] "
set -g status-right "#[fg=blue]#{?client_prefix,PREFIX ,}#[fg=brightblack]#h "
set -g window-status-format "#[fg=brightblack] #I:#W "
set -g window-status-current-format "#[fg=blue,bold] #I:#W "
set -g pane-border-style "fg=brightblack"
set -g pane-active-border-style "fg=blue"
set -g message-style "bg=default,fg=blue"
set -g message-command-style "bg=default,fg=blue"
set -g mode-style "bg=blue,fg=black"
setw -g clock-mode-colour blue

View File

@@ -116,6 +116,7 @@
"format-muted": "", "format-muted": "",
"format-icons": { "format-icons": {
"headphone": "", "headphone": "",
"headset": "",
"default": ["", "", ""] "default": ["", "", ""]
} }
}, },

View File

@@ -0,0 +1,5 @@
# overwrites default wiremix configuration
# defaults: https://github.com/tsowell/wiremix/blob/main/wiremix.toml
[char_sets.default]
default_device = "⮞"

View File

@@ -7,6 +7,7 @@ if command -v eza &> /dev/null; then
fi fi
alias ff="fzf --preview 'bat --style=numbers --color=always {}'" alias ff="fzf --preview 'bat --style=numbers --color=always {}'"
alias eff='$EDITOR $(ff)'
if command -v zoxide &> /dev/null; then if command -v zoxide &> /dev/null; then
alias cd="zd" alias cd="zd"
@@ -21,9 +22,9 @@ if command -v zoxide &> /dev/null; then
} }
fi fi
open() { open() (
xdg-open "$@" >/dev/null 2>&1 & xdg-open "$@" >/dev/null 2>&1 &
} )
# Directories # Directories
alias ..='cd ..' alias ..='cd ..'
@@ -34,6 +35,7 @@ alias ....='cd ../../..'
alias c='opencode' alias c='opencode'
alias d='docker' alias d='docker'
alias r='rails' alias r='rails'
alias t='tmux attach || tmux new -s Work'
n() { if [ "$#" -eq 0 ]; then nvim .; else nvim "$@"; fi; } n() { if [ "$#" -eq 0 ]; then nvim .; else nvim "$@"; fi; }
# Git # Git

View File

@@ -4,15 +4,33 @@ alias decompress="tar -xzf"
# Write iso file to sd card # Write iso file to sd card
iso2sd() { iso2sd() {
if [ $# -ne 2 ]; then if [[ $# -lt 1 ]]; then
echo "Usage: iso2sd <input_file> <output_device>" echo "Usage: iso2sd <input_file> [output_device]"
echo "Example: iso2sd ~/Downloads/ubuntu-25.04-desktop-amd64.iso /dev/sda" echo "Example: iso2sd ~/Downloads/ubuntu-25.04-desktop-amd64.iso /dev/sda"
echo -e "\nAvailable SD cards:" return 1
lsblk -d -o NAME | grep -E '^sd[a-z]' | awk '{print "/dev/"$1}'
else
sudo dd bs=4M status=progress oflag=sync if="$1" of="$2"
sudo eject $2
fi fi
local iso="$1"
local drive="$2"
if [[ -z $drive ]]; then
local available_sds=$(lsblk -dpno NAME | grep -E '/dev/sd')
if [[ -z $available_sds ]]; then
echo "No SD drives found and no drive specified"
return 1
fi
drive=$(omarchy-drive-select "$available_sds")
if [[ -z $drive ]]; then
echo "No drive selected"
return 1
fi
fi
sudo dd bs=4M status=progress oflag=sync if="$iso" of="$drive"
sudo eject "$drive"
} }
# Format an entire drive for a single partition using exFAT # Format an entire drive for a single partition using exFAT
@@ -58,7 +76,7 @@ img2jpg() {
img="$1" img="$1"
shift shift
magick "$img" $@ -quality 95 -strip ${img%.*}-optimized.jpg magick "$img" $@ -quality 95 -strip ${img%.*}-converted.jpg
} }
# Transcode any image to JPG image that's great for sharing online without being too big # Transcode any image to JPG image that's great for sharing online without being too big
@@ -66,7 +84,14 @@ img2jpg-small() {
img="$1" img="$1"
shift shift
magick "$img" $@ -resize 1080x\> -quality 95 -strip ${img%.*}-optimized.jpg magick "$img" $@ -resize 1080x\> -quality 95 -strip ${img%.*}-small.jpg
}
# Transcode any image to JPG image that's great for sharing online without being too big
img2jpg-medium() {
img="$1"
shift
magick "$img" $@ -resize 1800x\> -quality 95 -strip ${img%.*}-medium.jpg
} }
# Transcode any image to compressed-but-lossless PNG # Transcode any image to compressed-but-lossless PNG
@@ -80,3 +105,62 @@ img2png() {
-define png:exclude-chunk=all \ -define png:exclude-chunk=all \
"${img%.*}-optimized.png" "${img%.*}-optimized.png"
} }
# SSH Port Forwarding Functions
fip() {
[[ $# -lt 2 ]] && echo "Usage: fip <host> <port1> [port2] ..." && return 1
local host="$1"
shift
for port in "$@"; do
ssh -f -N -L "$port:localhost:$port" "$host" && echo "Forwarding localhost:$port -> $host:$port"
done
}
dip() {
[[ $# -eq 0 ]] && echo "Usage: dip <port1> [port2] ..." && return 1
for port in "$@"; do
pkill -f "ssh.*-L $port:localhost:$port" && echo "Stopped forwarding port $port" || echo "No forwarding on port $port"
done
}
lip() {
pgrep -af "ssh.*-L [0-9]+:localhost:[0-9]+" || echo "No active forwards"
}
# Create a tmux layout for dev with editor, ai, and terminal
tml() {
local current_dir="${PWD}"
local editor_pane ai_pane
local ai="$1"
# Get current pane ID (will become editor pane after splits)
editor_pane=$(tmux display-message -p '#{pane_id}')
# Split window vertically - top 85%, bottom 15%
tmux split-window -v -p 15 -c "$current_dir"
# Go back to top pane (editor_pane) and split it horizontally
tmux select-pane -t "$editor_pane"
tmux split-window -h -p 30 -c "$current_dir"
# After horizontal split, cursor is in the right pane (new pane)
# Get its ID and run ai there
ai_pane=$(tmux display-message -p '#{pane_id}')
tmux send-keys -t "$ai_pane" "$ai" C-m
# Run nvim in the left pane
tmux send-keys -t "$editor_pane" "$EDITOR ." C-m
# Select the nvim pane for focus
tmux select-pane -t "$editor_pane"
}
# Create a dev layout using tmux with editor, opencode, and terminal
nic() {
tml c
}
# Create a dev layout using tmux with editor, claude, and terminal
nicx() {
tml cx
}

View File

@@ -3,6 +3,9 @@ if command -v mise &> /dev/null; then
fi fi
if command -v starship &> /dev/null; then if command -v starship &> /dev/null; then
# clear stale readline state before rendering prompt (prevents artifacts in prompt after abnormal exits like SIGQUIT)
__sanitize_prompt() { printf '\r\033[K'; }
PROMPT_COMMAND="__sanitize_prompt${PROMPT_COMMAND:+;$PROMPT_COMMAND}"
eval "$(starship init bash)" eval "$(starship init bash)"
fi fi

View File

@@ -9,3 +9,4 @@ source ~/.local/share/omarchy/default/bash/rc
# #
# Make an alias for invoking commands you use constantly # Make an alias for invoking commands you use constantly
# alias p='python' # alias p='python'
# alias cx="claude --permission-mode=plan --allow-dangerously-skip-permissions"

View File

@@ -9,7 +9,9 @@ source = ~/.local/share/omarchy/default/hypr/apps/pip.conf
source = ~/.local/share/omarchy/default/hypr/apps/qemu.conf source = ~/.local/share/omarchy/default/hypr/apps/qemu.conf
source = ~/.local/share/omarchy/default/hypr/apps/retroarch.conf source = ~/.local/share/omarchy/default/hypr/apps/retroarch.conf
source = ~/.local/share/omarchy/default/hypr/apps/steam.conf source = ~/.local/share/omarchy/default/hypr/apps/steam.conf
source = ~/.local/share/omarchy/default/hypr/apps/geforce.conf
source = ~/.local/share/omarchy/default/hypr/apps/system.conf source = ~/.local/share/omarchy/default/hypr/apps/system.conf
source = ~/.local/share/omarchy/default/hypr/apps/telegram.conf
source = ~/.local/share/omarchy/default/hypr/apps/terminals.conf source = ~/.local/share/omarchy/default/hypr/apps/terminals.conf
source = ~/.local/share/omarchy/default/hypr/apps/walker.conf source = ~/.local/share/omarchy/default/hypr/apps/walker.conf
source = ~/.local/share/omarchy/default/hypr/apps/webcam-overlay.conf source = ~/.local/share/omarchy/default/hypr/apps/webcam-overlay.conf

View File

@@ -1,2 +1,6 @@
windowrule = no_screen_share on, match:class ^(Bitwarden)$ windowrule = no_screen_share on, match:class ^(Bitwarden)$
windowrule = tag +floating-window, match:class ^(Bitwarden)$ windowrule = tag +floating-window, match:class ^(Bitwarden)$
# Bitwarden Chrome Extension
windowrule = no_screen_share on, match:class chrome-nngceckbapebfimnlniiiahkandclblb-Default
windowrule = tag +floating-window, match:class chrome-nngceckbapebfimnlniiiahkandclblb-Default

View File

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

View File

@@ -0,0 +1,5 @@
windowrule {
name = geforce
match:class = GeForceNOW
idle_inhibit = fullscreen
}

View File

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

View File

@@ -1,5 +1,6 @@
# Picture-in-picture overlays # Picture-in-picture overlays
windowrule = tag +pip, match:title (Picture.?in.?[Pp]icture) windowrule = tag +pip, match:title (Picture.?in.?[Pp]icture)
windowrule = tag -default-opacity, match:tag pip
windowrule = float on, match:tag pip windowrule = float on, match:tag pip
windowrule = pin on, match:tag pip windowrule = pin on, match:tag pip
windowrule = size 600 338, match:tag pip windowrule = size 600 338, match:tag pip

View File

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

View File

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

View File

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

View File

@@ -12,6 +12,7 @@ windowrule = fullscreen on, match:class org.omarchy.screensaver
windowrule = float on, match:class org.omarchy.screensaver windowrule = float on, match:class org.omarchy.screensaver
# No transparency on media windows # No transparency on media windows
windowrule = tag -default-opacity, match:class ^(zoom|vlc|mpv|org.kde.kdenlive|com.obsproject.Studio|com.github.PintaProject.Pinta|imv|org.gnome.NautilusPreviewer)$
windowrule = opacity 1 1, match:class ^(zoom|vlc|mpv|org.kde.kdenlive|com.obsproject.Studio|com.github.PintaProject.Pinta|imv|org.gnome.NautilusPreviewer)$ windowrule = opacity 1 1, match:class ^(zoom|vlc|mpv|org.kde.kdenlive|com.obsproject.Studio|com.github.PintaProject.Pinta|imv|org.gnome.NautilusPreviewer)$
# Popped window rounding # Popped window rounding

View File

@@ -0,0 +1,2 @@
# Prevent Telegram from stealing focus on new messages
windowrule = focus_on_activate off, match:class org.telegram.desktop

View File

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

View File

@@ -6,14 +6,16 @@ bindeld = ,XF86AudioRaiseVolume, Volume up, exec, $osdclient --output-volume rai
bindeld = ,XF86AudioLowerVolume, Volume down, exec, $osdclient --output-volume lower bindeld = ,XF86AudioLowerVolume, Volume down, exec, $osdclient --output-volume lower
bindeld = ,XF86AudioMute, Mute, exec, $osdclient --output-volume mute-toggle bindeld = ,XF86AudioMute, Mute, exec, $osdclient --output-volume mute-toggle
bindeld = ,XF86AudioMicMute, Mute microphone, exec, $osdclient --input-volume mute-toggle bindeld = ,XF86AudioMicMute, Mute microphone, exec, $osdclient --input-volume mute-toggle
bindeld = ,XF86MonBrightnessUp, Brightness up, exec, $osdclient --brightness raise bindeld = ,XF86MonBrightnessUp, Brightness up, exec, omarchy-brightness-display +5%
bindeld = ,XF86MonBrightnessDown, Brightness down, exec, $osdclient --brightness lower bindeld = ,XF86MonBrightnessDown, Brightness down, exec, omarchy-brightness-display 5%-
bindeld = ,XF86KbdBrightnessUp, Keyboard brightness up, exec, omarchy-brightness-keyboard up
bindeld = ,XF86KbdBrightnessDown, Keyboard brightness down, exec, omarchy-brightness-keyboard down
# Precise 1% multimedia adjustments with Alt modifier # Precise 1% multimedia adjustments with Alt modifier
bindeld = ALT, XF86AudioRaiseVolume, Volume up precise, exec, $osdclient --output-volume +1 bindeld = ALT, XF86AudioRaiseVolume, Volume up precise, exec, $osdclient --output-volume +1
bindeld = ALT, XF86AudioLowerVolume, Volume down precise, exec, $osdclient --output-volume -1 bindeld = ALT, XF86AudioLowerVolume, Volume down precise, exec, $osdclient --output-volume -1
bindeld = ALT, XF86MonBrightnessUp, Brightness up precise, exec, $osdclient --brightness +1 bindeld = ALT, XF86MonBrightnessUp, Brightness up precise, exec, omarchy-brightness-display +1%
bindeld = ALT, XF86MonBrightnessDown, Brightness down precise, exec, $osdclient --brightness -1 bindeld = ALT, XF86MonBrightnessDown, Brightness down precise, exec, omarchy-brightness-display 1%-
# Requires playerctl # Requires playerctl
bindld = , XF86AudioNext, Next track, exec, $osdclient --playerctl next bindld = , XF86AudioNext, Next track, exec, $osdclient --playerctl next

View File

@@ -1,6 +1,7 @@
# Menus # Menus
bindd = SUPER, SPACE, Launch apps, exec, omarchy-launch-walker bindd = SUPER, SPACE, Launch apps, exec, omarchy-launch-walker
bindd = SUPER CTRL, E, Emoji picker, exec, omarchy-launch-walker -m symbols bindd = SUPER CTRL, E, Emoji picker, exec, omarchy-launch-walker -m symbols
bindd = SUPER CTRL, C, Capture menu, exec, omarchy-menu capture
bindd = SUPER ALT, SPACE, Omarchy menu, exec, omarchy-menu bindd = SUPER ALT, SPACE, Omarchy menu, exec, omarchy-menu
bindd = SUPER, ESCAPE, System menu, exec, omarchy-menu system bindd = SUPER, ESCAPE, System menu, exec, omarchy-menu system
bindld = , XF86PowerOff, Power menu, exec, omarchy-menu system bindld = , XF86PowerOff, Power menu, exec, omarchy-menu system
@@ -28,13 +29,12 @@ bindd = SUPER CTRL, I, Toggle locking on idle, exec, omarchy-toggle-idle
bindd = SUPER CTRL, N, Toggle nightlight, exec, omarchy-toggle-nightlight bindd = SUPER CTRL, N, Toggle nightlight, exec, omarchy-toggle-nightlight
# Control Apple Display brightness # Control Apple Display brightness
bindd = CTRL, F1, Apple Display brightness down, exec, omarchy-cmd-apple-display-brightness -5000 bindd = CTRL, F1, Apple Display brightness down, exec, omarchy-brightness-display-apple -5000
bindd = CTRL, F2, Apple Display brightness up, exec, omarchy-cmd-apple-display-brightness +5000 bindd = CTRL, F2, Apple Display brightness up, exec, omarchy-brightness-display-apple +5000
bindd = SHIFT CTRL, F2, Apple Display full brightness, exec, omarchy-cmd-apple-display-brightness +60000 bindd = SHIFT CTRL, F2, Apple Display full brightness, exec, omarchy-brightness-display-apple +60000
# Captures # Captures
bindd = , PRINT, Screenshot with editing, exec, omarchy-cmd-screenshot bindd = , PRINT, Screenshot, exec, omarchy-cmd-screenshot
bindd = SHIFT, PRINT, Screenshot to clipboard, exec, omarchy-cmd-screenshot smart clipboard
bindd = ALT, PRINT, Screenrecording, exec, omarchy-menu screenrecord bindd = ALT, PRINT, Screenrecording, exec, omarchy-menu screenrecord
bindd = SUPER, PRINT, Color picker, exec, pkill hyprpicker || hyprpicker -a bindd = SUPER, PRINT, Color picker, exec, pkill hyprpicker || hyprpicker -a

View File

@@ -6,7 +6,7 @@ env = HYPRCURSOR_SIZE,24
env = GDK_BACKEND,wayland,x11,* env = GDK_BACKEND,wayland,x11,*
env = QT_QPA_PLATFORM,wayland;xcb env = QT_QPA_PLATFORM,wayland;xcb
env = QT_STYLE_OVERRIDE,kvantum env = QT_STYLE_OVERRIDE,kvantum
env = SDL_VIDEODRIVER,wayland env = SDL_VIDEODRIVER,wayland,x11
env = MOZ_ENABLE_WAYLAND,1 env = MOZ_ENABLE_WAYLAND,1
env = ELECTRON_OZONE_PLATFORM_HINT,wayland env = ELECTRON_OZONE_PLATFORM_HINT,wayland
env = OZONE_PLATFORM,wayland env = OZONE_PLATFORM,wayland

View File

@@ -131,9 +131,14 @@ cursor {
hide_on_key_press = true hide_on_key_press = true
} }
# Auto toggle scratchpad on switching workspace from scratchpad
binds {
hide_special_on_workspace_change = true
}
# Style Gum confirm to match terminal theme # Style Gum confirm to match terminal theme
env = GUM_CONFIRM_PROMPT_FOREGROUND,6 # Cyan env = GUM_CONFIRM_PROMPT_FOREGROUND,6 # Cyan
env = GUM_CONFIRM_SELECTED_FOREGROUND,0 # Black env = GUM_CONFIRM_SELECTED_FOREGROUND,0 # Black
env = GUM_CONFIRM_SELECTED_BACKGROUND,2 # Green env = GUM_CONFIRM_SELECTED_BACKGROUND,2 # Green
env = GUM_CONFIRM_UNSELECTED_FOREGROUND,0 # Black env = GUM_CONFIRM_UNSELECTED_FOREGROUND,7 # White
env = GUM_CONFIRM_UNSELECTED_BACKGROUND,8 # Dark grey env = GUM_CONFIRM_UNSELECTED_BACKGROUND,8 # Dark grey

View File

@@ -2,11 +2,14 @@
# Hyprland 0.53+ syntax # Hyprland 0.53+ syntax
windowrule = suppress_event maximize, match:class .* windowrule = suppress_event maximize, match:class .*
# Just dash of opacity by default # Tag all windows for default opacity (apps can override with -default-opacity tag)
windowrule = opacity 0.97 0.9, match:class .* windowrule = tag +default-opacity, match:class .*
# Fix some dragging issues with XWayland # Fix some dragging issues with XWayland
windowrule = no_focus on, match:class ^$, match:title ^$, match:xwayland 1, match:float 1, match:fullscreen 0, match:pin 0 windowrule = no_focus on, match:class ^$, match:title ^$, match:xwayland 1, match:float 1, match:fullscreen 0, match:pin 0
# App-specific tweaks # App-specific tweaks (may remove default-opacity tag)
source = ~/.local/share/omarchy/default/hypr/apps.conf source = ~/.local/share/omarchy/default/hypr/apps.conf
# Apply default opacity after apps have had a chance to opt out
windowrule = opacity 0.97 0.9, match:tag default-opacity

View File

@@ -3,7 +3,7 @@ TARGET_OS_NAME="Omarchy"
ESP_PATH="/boot" ESP_PATH="/boot"
KERNEL_CMDLINE[default]="@@CMDLINE@@" KERNEL_CMDLINE[default]="@@CMDLINE@@"
KERNEL_CMDLINE[default]+="quiet splash" KERNEL_CMDLINE[default]+=" quiet splash"
ENABLE_UKI=yes ENABLE_UKI=yes
CUSTOM_UKI_NAME="omarchy" CUSTOM_UKI_NAME="omarchy"

View File

@@ -28,3 +28,7 @@ on-button-left=exec sh -c 'omarchy-notification-dismiss "Update System"; omarchy
[summary~="Learn Keybindings"] [summary~="Learn Keybindings"]
on-button-left=exec sh -c 'omarchy-notification-dismiss "Learn Keybindings"; omarchy-menu-keybindings' on-button-left=exec sh -c 'omarchy-notification-dismiss "Learn Keybindings"; omarchy-menu-keybindings'
[summary~="Screenshot copied & saved"]
max-icon-size=80
format=<b>%s</b>\n%b

View File

@@ -1,5 +1,5 @@
--- ---
name: Omarchy name: omarchy
description: > description: >
REQUIRED for ANY changes to Linux desktop, window manager, or system config. REQUIRED for ANY changes to Linux desktop, window manager, or system config.
Use when editing ~/.config/hypr/, ~/.config/waybar/, ~/.config/walker/, Use when editing ~/.config/hypr/, ~/.config/waybar/, ~/.config/walker/,

View File

@@ -0,0 +1 @@
Server = https://rc-mirror.omarchy.org/$repo/os/$arch

View File

@@ -0,0 +1,30 @@
# See the pacman.conf(5) manpage for option and repository directives
[options]
Color
ILoveCandy
VerbosePkgLists
HoldPkg = pacman glibc
Architecture = auto
CheckSpace
ParallelDownloads = 5
DownloadUser = alpm
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
# pacman searches repositories in the order defined here
[core]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
[multilib]
Include = /etc/pacman.d/mirrorlist
[omarchy]
SigLevel = Optional TrustAll
Server = https://pkgs.omarchy.org/edge/$arch

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