Compare commits

...
234 Commits
Author SHA1 Message Date
David Heinemeier Hansson b0ab9782d6 Completion should not include --help 2026-05-01 18:03:12 +02:00
David Heinemeier Hansson f02305ecd8 This was actually correct using an alias 2026-05-01 18:01:41 +02:00
David Heinemeier Hansson 4a12b41893 Hide individual omarchy-* binaries from initial-word command completion
The unified `omarchy` dispatcher is the user-facing entry point
2026-05-01 17:59:17 +02:00
David Heinemeier Hansson c9ff10b4fd Update to use the new single command cli 2026-05-01 17:47:10 +02:00
David Heinemeier Hansson 0f8eb3a6e6 Fix tests 2026-05-01 17:39:59 +02:00
David Heinemeier Hansson f2c1339641 Correct to what's now right 2026-05-01 17:38:20 +02:00
David Heinemeier Hansson a2e83a784e Add missing docs 2026-05-01 17:33:36 +02:00
David Heinemeier Hansson 0d4a076a10 Add omarchy command documentation 2026-05-01 17:31:25 +02:00
David Heinemeier Hansson ee6fbda428 Add bash completions for command 2026-05-01 17:25:23 +02:00
David Heinemeier Hansson d84d2fe11d Remove outdated or internal 2026-05-01 17:23:58 +02:00
David Heinemeier Hansson bc512b437f Merge remote-tracking branch 'origin/dev' into omarchy-cli
# Conflicts:
#	bin/omarchy-hyprland-monitor-watch
#	bin/omarchy-plymouth-reset
#	bin/omarchy-sudo-passwordless
2026-05-01 17:07:09 +02:00
cdb9694360 Add a toggle for touchscreen on supported devices (#5510)
* Add minimum brightness cap to prevent OLED displays turning off

* Revert "Add minimum brightness cap to prevent OLED displays turning off"

This reverts commit fe855ecf9aeacfa1b9ffcff3d43adb10908435e5.

* Add touchscreen toggle support

* Use finger glyph

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-05-01 16:47:11 +02:00
c078d7ad05 Implement non-uniform brightness step adjustments (#5525)
* Implement non-uniform brightness step adjustments

Add logic for non-uniform step size adjustments based on current brightness level.

* Ensure percentages are moved in a consistent manner so we don't get rounding errors

* Ensure we don't go below 1%

To prevent screen from turning off entirely on some models

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-05-01 16:43:32 +02:00
69ddcfdf2e Updated interface color configuration to RRGGBB format (#5471)
Migrated branding and help text color definitions to the new hexadecimal RRGGBB format in accordance with the latest Limine specifications. This update also introduces the interface_help_colour_bright parameter to ensure consistent visual aesthetics during the auto-boot sequence.

For the time being, a green palette has been implemented to maintain the traditional visual identity of Omarchy.

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-05-01 16:37:34 +02:00
Nicolas DorierandGitHub 61848c1910 Fix hibernation on new NVidia drivers (#5519)
New drivers don't seem to expose the necessary suspend interface to use `NVreg_PreserveVideoMemoryAllocations`.

I explained the issues I experienced on:
https://github.com/basecamp/omarchy/discussions/5500

While https://github.com/omacom-io/omarchy-pkgs/pull/84 fixed part of
the issue, the default value of `NVreg_PreserveVideoMemoryAllocations`
is `2`, which doesn't work.
2026-05-01 16:32:09 +02:00
Tushar ChauhanandGitHub 21f712c325 Fix: read files from symlink directory in background selector menu (#5524)
* Fix: read files from symlink directory in background selector menu

* safely parse the path to avoid option injection

* Simply use -L flag with find to resolve symlinks
2026-05-01 16:31:02 +02:00
Nicolas DorierandGitHub bb0adde652 Restore jetbrains no_follow_mouse (#5239)
This reverts partially commit e5783569489818724d221f4400cb952f300d29ad.
2026-05-01 16:12:40 +02:00
David Heinemeier Hansson 26741bf4e3 Correct spelling 2026-05-01 14:15:03 +02:00
David Heinemeier Hansson bf9be2ea1b Fix casing 2026-05-01 11:27:15 +02:00
David Heinemeier Hansson 18275dcaca Preinstall cliamp 2026-05-01 09:45:25 +02:00
David Heinemeier Hansson 3c780c19ce Ensure Brave Origin is supported for live themeing just like regular Brave 2026-05-01 09:26:19 +02:00
David Heinemeier Hansson 317eb44fb2 Add ghui is a lazy-installed TUI 2026-05-01 08:47:26 +02:00
David Heinemeier Hansson c06bbe40bb Allow for lazy-install of bun runtime 2026-05-01 08:46:12 +02:00
David Heinemeier Hansson 0555c34416 Allow for bun to be the executor and bring back the spinner 2026-05-01 08:31:38 +02:00
David Heinemeier Hansson ec69817e74 Fix spelling 2026-04-30 22:23:43 +02:00
cfultonandGitHub 6fac70d1a1 Replace deprecated sainnhe.everforest VSCode extension with reesew.everforest-theme (#5498) 2026-04-30 21:19:52 +02:00
guidovicinoandGitHub c6e55ca4ba Move Obsidian launch flags to user config (#5488)
* Move Obsidian flags to user config

* Preserve Obsidian flags during migration

* Keep existing Obsidian launch flags

* Copy default Obsidian flags in migration
2026-04-30 21:17:53 +02:00
David Heinemeier Hansson d5aa4b7b4b Only XPS now needs the custom ptl kernel 2026-04-30 21:09:22 +02:00
Andrii FurmanetsandGitHub 0b1607786d Restart Walker after removing web apps (#5513) 2026-04-30 20:14:29 +02:00
Danila DanilinandGitHub 710356e900 fix: to check encrypted drives amount (#5515) 2026-04-30 20:14:01 +02:00
David Heinemeier Hansson 6ab4196985 Quiet this during install 2026-04-30 20:09:01 +02:00
David Heinemeier Hansson 24b32da1a1 Ensure policy directories are available before we try writing to them 2026-04-30 20:07:43 +02:00
David Heinemeier Hansson a43df3963a Correct the order to prevent error message during install 2026-04-30 20:04:54 +02:00
David Heinemeier Hansson 91608ea3d3 Update interface_branding_color for limine 12 2026-04-30 19:38:04 +02:00
David Heinemeier Hansson 6fc7f90e43 Revert "Try debugging F13P issue by not turning on fred there"
This reverts commit f15094c9ef.
2026-04-30 19:30:06 +02:00
David Heinemeier Hansson f15094c9ef Try debugging F13P issue by not turning on fred there 2026-04-30 18:42:37 +02:00
David Heinemeier Hansson 25b114fa7a Also not used 2026-04-30 18:40:58 +02:00
David Heinemeier Hansson 6b8c2a0a04 Not installed any more either 2026-04-30 18:34:26 +02:00
David Heinemeier Hansson 340c8ceeef We already have this listed on base 2026-04-30 18:30:10 +02:00
David Heinemeier Hansson c86ebe0cc3 Nothing is actually using dart 2026-04-30 18:18:13 +02:00
AlexandreandGitHub 5683b1bdbd Fix internal monitor disable for non-eDP-1 systems (#5511)
Detect the internal monitor name dynamically at runtime instead of
hardcoding eDP-1 in a static toggle conf file. Uses the same pattern
as omarchy-hyprland-monitor-internal-mirror.

Fixes #5443
2026-04-30 17:51:29 +02:00
David Heinemeier Hansson cbefe54238 Refresh the configs 2026-04-30 17:31:32 +02:00
David Heinemeier Hansson 36026d78ed Reapply "Simplify the migration"
This reverts commit 0a57fae591.
2026-04-30 17:30:44 +02:00
David Heinemeier Hansson 6ef510cc54 Reapply "Ensure we don't lose walker and elephant when we swap around"
This reverts commit e5536f3c4d.
2026-04-30 17:30:42 +02:00
David Heinemeier Hansson eca926b5a4 Reapply "Replace coterie of individual Elephant packages with the single elephant-all package"
This reverts commit 8ff1208bdd.
2026-04-30 17:30:40 +02:00
David Heinemeier Hansson 175a22a048 Reapply "Just use the direct packages now that there's a single bundle for elephant-all"
This reverts commit 14f155eecb.
2026-04-30 17:30:38 +02:00
David Heinemeier Hansson 14f155eecb Revert "Just use the direct packages now that there's a single bundle for elephant-all"
This reverts commit b8a4d0b2ef.
2026-04-30 17:28:44 +02:00
David Heinemeier Hansson 8ff1208bdd Revert "Replace coterie of individual Elephant packages with the single elephant-all package"
This reverts commit c5784432e0.
2026-04-30 17:28:31 +02:00
David Heinemeier Hansson e5536f3c4d Revert "Ensure we don't lose walker and elephant when we swap around"
This reverts commit 6ce6f94647.
2026-04-30 17:28:20 +02:00
David Heinemeier Hansson 0a57fae591 Revert "Simplify the migration"
This reverts commit 37b60e5505.
2026-04-30 17:28:15 +02:00
David Heinemeier Hansson 91af40fd7c Enable fred=on on intel ptl machines 2026-04-30 17:26:14 +02:00
David Heinemeier Hansson 37b60e5505 Simplify the migration 2026-04-30 17:23:02 +02:00
David Heinemeier Hansson 6ce6f94647 Ensure we don't lose walker and elephant when we swap around 2026-04-30 17:20:45 +02:00
David Heinemeier Hansson c5784432e0 Replace coterie of individual Elephant packages with the single elephant-all package
Closes https://github.com/omacom-io/omarchy-pkgs/issues/12
2026-04-30 12:51:40 +02:00
David Heinemeier Hansson b8a4d0b2ef Just use the direct packages now that there's a single bundle for elephant-all 2026-04-30 11:47:18 +02:00
David Heinemeier Hansson 0aafd647e7 Better ordering 2026-04-30 10:25:45 +02:00
Michał BorejszoandGitHub d8a0deb400 Color man pages with bat (#5491) 2026-04-30 10:25:28 +02:00
Ben SmithandGitHub 768eabaaba Refactor ThinkPad mic mute to use omarchy-swayosd-client (#5493) 2026-04-30 10:24:05 +02:00
17ac8453b2 Fix refresh-config when target directory is missing (#5497)
* Don't use the names here since they break the all-themes setup in omarchy-nvim

* Fix refresh-config when target directory is missing

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-04-30 10:22:48 +02:00
David Heinemeier Hansson a677d6b7a3 We don't need to set PATH here any more
Closes #5472
2026-04-30 10:04:17 +02:00
David Heinemeier Hansson 7f9e1628d9 Ensure we cleanup stale snapshots 2026-04-30 09:40:08 +02:00
35789cc102 Add laptop display mirror toggle + hotkey (#5462)
* Add check for active external monitors before disabling internal display

Co-authored-by: Copilot <copilot@github.com>

* Revert "Add check for active external monitors before disabling internal display"

This reverts commit e20b3da87e3df0f084c0bca232a61ba58fab4cdc.

* feat(hyprland): add toggle for internal monitor mirroring

- Implement `omarchy-hyprland-monitor-internal-mirror` to dynamically mirror the internal eDP display to external monitor.
- Update `omarchy-hyprland-monitor-internal` to prevent disabling the laptop screen if mirroring is currently active.
- Add "Mirror Display" toggle to omarchy hardware Menu

* Ensure there is also a laptop monitor available to mirror before we do it

* Fix toggle use

* Recover from mirror mode gracefully

* Add hotkey to mirroring

---------

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-04-29 20:19:32 +02:00
2f257e167c alacritty.toml fallback for legacy themes without colors.toml (#5404)
* add generation of colors.toml via alacritty.toml

* Shorter command name

* Fix perms

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-04-29 15:46:18 +02:00
N1R4andGitHub 66da3644fc feat: add dosfstools for /boot recovery (#5448)
Adds dosfstools to default installs and migrates existing systems so fsck.fat and mkfs.fat are available for Omarchy’s FAT32 /boot partition. This also helps with recovery from dirty or corrupt FAT filesystems after unclean shutdowns or power loss.
2026-04-29 15:32:08 +02:00
David Heinemeier Hansson ac40c0dbad Audio has input and output, easier to understand this way 2026-04-29 15:17:53 +02:00
David Heinemeier Hansson ed62fa81ec Move omarchy-cmd-share to omarchy-menu-share 2026-04-29 15:15:39 +02:00
David Heinemeier Hansson 4cc4144074 Move omarchy-cmd-first-run out of the cmd namespace too 2026-04-29 15:14:18 +02:00
David Heinemeier Hansson 39a289412d Move omarchy-cmd-screensaver to just omarchy-screensaver
We should just have omarchy-cmd-* for cmd checks
2026-04-29 15:11:37 +02:00
David Heinemeier Hansson 74a3797cf0 Move omarchy-lock-screen to omarchy-system-lock to fit with the others 2026-04-29 15:08:20 +02:00
David Heinemeier Hansson a7593ade7a Move audio commands under the same namespace 2026-04-29 15:00:59 +02:00
David Heinemeier Hansson c647edbc04 Allow passwordless sudo to be toggled from the toggle menu 2026-04-29 14:58:34 +02:00
David Heinemeier Hansson 12d8e001ab Simpler command structure 2026-04-29 14:54:03 +02:00
David Heinemeier Hansson e76d7544d3 Move omarchy-cmd-screen* to omarchy-capture-screen*
Will match upcoming cli grouping too
2026-04-29 14:50:15 +02:00
David ZuckerandGitHub 858916783f Allow Docker DNS from 192.168 networks (#5465)
* Allow Docker DNS from 192.168 networks

* Only add Docker DNS rule when UFW is active
2026-04-29 14:10:02 +02:00
bontalorandGitHub 4cc6ea3d9f Fix: Use accel_profile=flat instead of force_no_accel for proper pointer behavior (#5479)
* Replace force_no_accel with accel_profile

* Correct comment
2026-04-29 13:55:52 +02:00
David Heinemeier Hansson 114633f0e8 Hide needless noisy on startup and shutdown 2026-04-29 10:41:00 +02:00
David Heinemeier Hansson 6e04ff776b Add additional Tokyo Night backgrounds 2026-04-29 10:21:09 +02:00
David Heinemeier Hansson 008bdf0ff7 Revert "Retain the splash"
This reverts commit 951d6dfc49.
2026-04-29 08:54:40 +02:00
David Heinemeier Hansson 951d6dfc49 Retain the splash 2026-04-29 08:51:14 +02:00
David Heinemeier Hansson ca9cefe718 Speedup login sequence by about 3s 2026-04-29 08:09:10 +02:00
David Heinemeier Hansson 4e341fea3e Add omarchy bg option to all themes 2026-04-28 19:17:46 +02:00
David Heinemeier Hansson 93141bd578 Set SDDM login screen to the same theme as boot unlock 2026-04-28 18:08:34 +02:00
Ryan Hughes 4375782b7a Add omarchy CLI 2026-04-28 12:03:46 -04:00
David Heinemeier Hansson eb3da87992 We are going for another minor 2026-04-28 17:56:22 +02:00
David Heinemeier HanssonandGitHub 2716a3207c Provide unlock themeing (#5476) 2026-04-28 17:55:59 +02:00
David Heinemeier Hansson 8e30b2442c Add subtle highlight for better readability
Closes #5402
Co-authored-by: @pipetogrep
2026-04-28 15:58:35 +02:00
David Heinemeier Hansson 069f0c35c7 Add oma.png alternative plymouth logo 2026-04-28 11:51:47 +02:00
David Heinemeier Hansson 72ac23610f Try with split out i aliases 2026-04-28 11:51:47 +02:00
11e549a8ba Isolate npx wrapper runtime from project PATH (#5341)
* Don't use the names here since they break the all-themes setup in omarchy-nvim

* Pin Omarchy npx wrappers to matching node+npx binaries

* Fix npx wrappers when mise node is missing

* Pin npx wrappers to matching mise node runtime

* Isolate npx wrapper runtime from project PATH

* Clarify npx wrapper bin resolution

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-04-27 16:06:55 +02:00
David Heinemeier Hansson 7b79360ea1 Bump version 2026-04-27 15:56:03 +02:00
Justin BiardandGitHub 985a8010e6 chore: update hyprland wiki links (#5466) 2026-04-27 14:59:16 +02:00
a6bb239919 omarchy-setup-fingerprint: pre-remove libfprint to avoid noninteractive abort (#5463)
libfprint-git provides+conflicts libfprint, so pacman -S --noconfirm
defaults the conflict prompt to N and the install aborts. Pre-remove
libfprint with -Rdd; libfprint-git's provides=libfprint re-satisfies
fprintd's dep immediately after install.

replaces=(libfprint) on the OPR PKGBUILD was considered and rejected:
it does not affect direct -S installs (only -Syu repo scans), and on a
published package it would silently swap libfprint for libfprint-git
on every -Syu including machines with no FocalTech sensor.

Verified on B9406CAA non-interactively; fprintd-list and fprintd-verify
continue to work against existing enrollments.

Follow-up to #5454.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 14:58:27 +02:00
542ae346a0 Add ASUS ExpertBook B9406 fingerprint reader (FocalTech FT9349) support (#5454)
The B9406CAA ships with a Focal Tech FT9349 ESS sensor on USB 2808:a97a.
Mainline libfprint at 1.94.x lacks the open-source focaltech_moc driver
entirely; the driver is in libfprint master under LGPL but no upstream
release has shipped with PID 0xa97a in id_table[]. OPR carries
libfprint-git with both the driver and the PID patch.

Inline detection in omarchy-setup-fingerprint via /sys/bus/usb so we
don't introduce a one-off hardware-match script just for this case.
The check is cheap and runs only when the user opts into fingerprint
setup (lazy install pattern). Once upstream libfprint catches up, the
extra branch becomes harmless because libfprint-git provides=libfprint.

Tested end-to-end on B9406CAA: fprintd-enroll completes, fprintd-verify
matches enrolled fingers and rejects others, survives suspend/resume.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 11:39:31 +02:00
David Heinemeier Hansson 09411c4581 Make the "your kernel has been updated" check more resilient 2026-04-27 11:00:06 +02:00
Mathias EekandGitHub 88da163768 Fix jumping cursor / disable-while-typing on ASUS ROG Flow Z13 detachable keyboard (#5452)
* Fix disable-while-typing on ASUS ROG Flow Z13 detachable keyboard

* Replace lsusb with DMI detection for Z13 keyboard

* Use omarchy-hw-match instead of custom z13_present function
2026-04-27 08:49:48 +02:00
David Heinemeier Hansson 44d8d9b00f Use helper for this test 2026-04-27 08:42:44 +02:00
David Heinemeier Hansson 99f4cfbb1e Configure user directories with just modern relevancy 2026-04-27 08:38:54 +02:00
b164549b51 Add ASUS ExpertBook B9406 display and touchpad fixes for Panther Lake (#5435)
* Add ASUS ExpertBook B9406 display and touchpad fixes for Panther Lake

* Drop B9406 migration

Per DHH's review: the migration's audience is essentially nobody.
Anyone running Omarchy on B9406 today is doing so via nomodeset
manually at every boot, not via a working unmodified install. Fresh
installs after this PR ships will pick up the fixes through the
hardware-match install hook; no migration needed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 18:31:43 +02:00
David Heinemeier Hansson 5f184e5099 Make it clearer 2026-04-26 08:45:52 +02:00
David Heinemeier Hansson 89162a4be1 Add way to customize the plymouth theme more easily 2026-04-26 08:45:02 +02:00
David Heinemeier Hansson 4b7fe16029 Offer direct boot as a toggle option 2026-04-25 21:33:46 +02:00
David Heinemeier Hansson e01741afab Hide useless lstopo.desktop 2026-04-25 21:17:18 +02:00
Ryan Hughes 2b4d89a9ea Keep hyprpicker alive until capture is complete to prevent mid-transition screenshots 2026-04-24 19:23:07 -04:00
David Heinemeier Hansson 0041950d46 Only reencode if we detect garbage frames 2026-04-24 10:47:04 +02:00
David Heinemeier Hansson 1d4c859c71 Proper fix for using device dark mode in Chrome 2026-04-24 10:39:40 +02:00
David Heinemeier Hansson 0be4648773 Better guard against scrambled frames in screenrecording on slower systems 2026-04-24 10:39:31 +02:00
David Heinemeier Hansson 1cf28a9fda Show detailed battery notification on right-click on Waybar battery icon 2026-04-24 10:00:41 +02:00
David Heinemeier Hansson 40f41a5299 Fix hw check for hybrid gpu 2026-04-24 09:56:08 +02:00
David Heinemeier Hansson 5f7a577283 Fix starting tailscale in installer
Closes #5400
2026-04-23 14:39:22 +02:00
David Heinemeier Hansson 274a72c77a Fix the offer to restart when the linux kernel changes 2026-04-23 13:03:26 +02:00
David Heinemeier Hansson 09f93b5a92 Make vantablack fully black for OLED glory 2026-04-23 12:47:16 +02:00
David Heinemeier Hansson 1782e76d20 Also refresh the monitor config 2026-04-23 12:26:12 +02:00
David Heinemeier Hansson f40a3fd1b7 Fix brightness icons 2026-04-23 12:22:45 +02:00
David Heinemeier Hansson a74afeb4e5 Switch to an earlier recovery for the internal monitor on reboot 2026-04-23 11:54:11 +02:00
David Heinemeier Hansson 3c8d7bb5ce Revert "There is no rc-mirror, only stable-mirror and mirror"
This reverts commit 2682cc2853.
2026-04-23 11:14:46 +02:00
David Heinemeier Hansson 96afc68461 Move to a hardware check for external monitors instead to deal with recover timing 2026-04-23 11:14:14 +02:00
David Heinemeier Hansson 6953ea9af8 The mirror needs to be edge here too 2026-04-23 10:59:04 +02:00
David Heinemeier Hansson 2682cc2853 There is no rc-mirror, only stable-mirror and mirror 2026-04-23 10:58:00 +02:00
David Heinemeier Hansson cac03a5b64 Add i alias for ide with opencode and claude 2026-04-23 10:54:34 +02:00
David Heinemeier Hansson 2982ac4725 Ensure headless monitors aren't counted 2026-04-23 10:49:24 +02:00
David Heinemeier Hansson 3618eebdaa Make recover always a silent operation 2026-04-23 10:18:38 +02:00
David Heinemeier Hansson 24ad7c7aba Drop home snapshots, limit root shots to just 5, no btrfs quotas
cc @ryanrhughes
2026-04-23 09:55:59 +02:00
David Heinemeier Hansson 86a9d3e04c Allow the timelimit to be extending by passing in an explicit set of minutes 2026-04-23 09:55:59 +02:00
de2824edde Quote OMARCHY_PATH in migration source command
Agent-Logs-Url: https://github.com/basecamp/omarchy/sessions/36fb96d5-70fd-4365-9550-e7ff5f8735d1

Co-authored-by: dhh <2741+dhh@users.noreply.github.com>
2026-04-23 09:16:12 +02:00
David Heinemeier Hansson bc53a0a7c5 Does not look like we needed that change after all 2026-04-22 22:18:34 +02:00
James MainaandGitHub f9f08580df Lowercase theme name in omarchy-theme-install to match omarchy-theme-set (#5392) 2026-04-22 22:06:54 +02:00
Pierre Olivier MartelandGitHub 826d9f4e2f Use the code instead so this mapping works with non US English keyboards too (#5391) 2026-04-22 22:04:27 +02:00
David Heinemeier Hansson 27779668f3 Just use the official package directly 2026-04-22 21:27:56 +02:00
David Heinemeier Hansson ced028f87a Don't fail if headers haven't been installed 2026-04-22 19:51:16 +02:00
MarcoandGitHub 590f2e25e6 Add ThinkPad mic mute LED sync following XPS hardware handler pattern (#4938)
Omarchy 3.5.1 shipped hardware-specific mic mute handling for Dell XPS
(bin/omarchy-cmd-mic-mute-xps) which made the original PR #4938 approach
obsolete — that PR added a global omarchy-cmd-mic-mute that handled the
toggle inline, but upstream now owns that dispatcher.

This follows the same pattern to add ThinkPad support by extending
omarchy-hw-match to also check product_family (ThinkPad systems report
"ThinkPad T14s Gen 2a" there, not in product_name) and adding
omarchy-cmd-mic-mute-thinkpad which uses brightnessctl to sync the
platform::micmute LED, simpler than the ALSA approach needed for XPS.

Note: as more vendors are added this per-vendor dispatcher will get
unwieldy. A future refactor could move hardware LED sync into
install/config/hardware/ scripts that drop a hook or config file,
keeping omarchy-cmd-mic-mute thin and vendor-agnostic.
2026-04-22 19:49:15 +02:00
David Heinemeier Hansson 01d1984093 Fix perms 2026-04-22 19:44:54 +02:00
David Heinemeier Hansson a1d5e0c40c Use new correct catppuccin-nvim colorscheme 2026-04-22 17:16:00 +02:00
David Heinemeier Hansson 35650a633d Fix broken hide button on screensharing overlay 2026-04-22 17:15:32 +02:00
David Heinemeier Hansson a31751ad95 Bump version 2026-04-22 16:33:44 +02:00
David Heinemeier Hansson 0e335a1791 Add 1.25 as a scaling option too and rewrite the matching 2026-04-22 16:20:26 +02:00
David Heinemeier Hansson 0d5b680c2a Make it possible to travel backwards on the resolution scaling 2026-04-22 16:15:30 +02:00
fc258fa8b2 Elephant menu fix when using customized default themes (#4953)
* Adds a check to see if the default theme has a preview if the user customized default theme lacks one.

* Update default/elephant/omarchy_themes.lua

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Reduce duplication

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-04-22 15:52:49 +02:00
Pierre Olivier MartelandGitHub 4223cd9922 Use OMARCHY_PATH in omarchy-migrate (#4937) 2026-04-22 15:40:30 +02:00
David Heinemeier Hansson 8953ee822a Only show hybrid gpu toggle if hardware is available 2026-04-22 15:05:26 +02:00
David Heinemeier Hansson 57b779e249 Extract hardware toggles into their own menu and hotkey 2026-04-22 15:00:09 +02:00
innerviewerandGitHub b275ec50be (Bash) Add lazy initialization of try command. (#5179)
* (Bash) Add lazy initialization of `try` and `mise` commands.

* (Bash) Removed lazy-loading for `mise`
2026-04-22 14:02:53 +02:00
bde1537f6e Use wpctl instead of pactl to switch default audio sink (#5236)
pactl set-default-sink only updates PipeWire's default.audio.sink
metadata, but WirePlumber immediately overrides it back because
default.configured.audio.sink remains unchanged. wpctl set-default
updates both, making the switch actually persist.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-22 13:56:15 +02:00
Stefan GründelandGitHub 1c65d1db0f Add migration script to enable GPU in voxtype if Vulkan is available (#5203) 2026-04-22 13:53:52 +02:00
Nicolas DorierandGitHub d4f4592dd2 Make Typora's print dialog float (#5208) 2026-04-22 13:52:39 +02:00
pontinoandGitHub 4e7c51b3bc Update cx alias to use new --permission-mode flag (#5233)
The `--allow-dangerously-skip-permissions` flag has been replaced
by `--permission-mode bypassPermissions` in Claude Code.
2026-04-22 13:50:47 +02:00
14a599ab9d Normalize screen recording audio levels (#5244)
* Normalize screen recording audio

Screen recordings capture audio at whatever the system level is set to,
which often results in very quiet audio. Add a post-processing step that
normalizes audio to -14 LUFS using ffmpeg loudnorm after the first-frame
trim. Video is copied without re-encoding. Silently skipped for
recordings with no audio track.

* Do both trimming and normalizing in a single step so we don't have to process the video twice

* Simplify conditional

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-04-22 13:50:05 +02:00
Waleed HassanandGitHub e757ae98ea Lumon color.toml updated for better visibility of selected text (#5269) 2026-04-22 13:40:10 +02:00
David Heinemeier Hansson 73641f721d Match order from elsewhere 2026-04-22 13:36:29 +02:00
David Heinemeier Hansson cd3e683fef Combine into one script with options 2026-04-22 13:35:20 +02:00
Pete JacksonandGitHub 1ca9c7ea0d Skip browser policy refresh when browser is not running (#5321)
chromium/brave --refresh-platform-policy blocks forever when the
browser is not already running, hanging omarchy-update entirely.
Guard both calls with pgrep so the policy file is still written
(picked up on next launch) but the blocking refresh is skipped.

Closes #4772
2026-04-22 13:26:26 +02:00
Pete JacksonandGitHub 0a4490a1f1 Restore keyboard layout after hyprland config refresh (#5319)
omarchy-refresh-hyprland overwrites input.conf with the default
template, which has kb_layout and kb_variant commented out. Non-US
users lose their keyboard layout with no obvious recovery path.

Re-run detect-keyboard-layout.sh after the refresh so the system
layout from /etc/vconsole.conf is re-applied, matching what the
initial install does.

Closes #2507
2026-04-22 13:24:59 +02:00
David Heinemeier Hansson edf7067797 Extract omarchy-swayosd-client
So we don't have to manually compose it every time
2026-04-22 13:04:30 +02:00
David Heinemeier Hansson ed9ecccb21 Better notification message 2026-04-22 13:04:01 +02:00
David Heinemeier Hansson 843ee8ff49 Extract omarchy-hw-touchpad and simplify conditionals 2026-04-22 12:59:57 +02:00
DrunkLeenandGitHub d00b3ea24b feat: Add Touchpad toggle/on/off support (#5353)
* feat: add touchpad toggle keybinding and script

Binds XF86TouchpadToggle/On/Off to a new leenium-toggle-touchpad script
that enables/disables the touchpad via hyprctl and shows OSD feedback.

* fix: make XF86TouchpadOn/Off enforce state instead of toggling

Add on/off/toggle argument support to omarchy-toggle-touchpad.
XF86TouchpadOn now always enables and XF86TouchpadOff always disables,
so firmware that emits separate On/Off keysyms behaves correctly regardless
of current state. XF86TouchpadToggle retains the invert behavior.

* feat: add touchpad toggle to menu and persist state as hyprland config

- Show touchpad option in toggle menu only when a touchpad/trackpad device is detected
- Replace /tmp state file with a persistent hyprland device config at
~/.local/state/omarchy/toggles/hypr/touchpad-disabled.conf

* fix: avoid unsafe && || toggle logic for Touchpad state

Replace `[[ -f $STATE_CONF ]] && enable || disable` with an explicit if/else.
The previous logic was not a true ternary: if `enable` failed (e.g. OSD command error),
`disable` would run unintentionally, causing unreliable toggle behavior.
2026-04-22 12:59:43 +02:00
37189368fb Clean up orphaned voxtype status processes on exit (#5345)
* Clean up orphaned voxtype status processes on exit

Waybar's custom/voxtype module runs omarchy-voxtype-status, which spawns
a long-lived `voxtype status --follow` child. When Waybar reloads (config
change, display hotplug, Hyprland reload), it kills the wrapper but the
child survives as an orphan. Over time dozens accumulate.

`trap 'kill 0' EXIT` signals the entire process group when the wrapper
exits, ensuring the voxtype child is cleaned up.

* Explain purpose of trap

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-04-22 12:56:37 +02:00
ac3c60228e Add keybindings to cycle through monitors (#5359)
* Add keybindings to cycle through monitors

* Unified language around focus

* Group focus keybindings

* More natural sounding

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-04-22 12:38:45 +02:00
David Heinemeier HanssonandGitHub bff5e843e0 Revert "Add battery identifier to Waybar config" (#5386)
* Revert "Add battery identifier to Waybar config"

* Remove the migration too
2026-04-22 07:52:40 +02:00
David Heinemeier Hansson a3b7c41b9b Make iA writer theme fully back to work better on OLEDs 2026-04-21 22:28:02 +02:00
David Heinemeier Hansson ac08aaf834 Resume boosting didn't actually solve the real underlying problem
But a bios update to the XPS should.
2026-04-21 17:19:34 +02:00
David Heinemeier Hansson 5d2cdb5317 Remove xe cmdline args from limine conf too 2026-04-21 17:01:03 +02:00
David Heinemeier Hansson 58443c82c0 Remove default vrr on 2026-04-21 16:43:53 +02:00
David Heinemeier Hansson a70b05e8f3 New kernel patches mean we don't need to turn off the display features 2026-04-21 16:41:07 +02:00
David Heinemeier Hansson 9306f5ef29 Install video encoding processors for modern Intel CPU/GPU combos by default
Allows the use of Quick Sync Intel H264/265 exports in Kdenlive without
crashing!
2026-04-21 11:43:36 +02:00
Pete JacksonandGitHub b317bd5358 Enable pause_media for voxtype by default (#5364)
Pauses MPRIS media players when recording starts so music
doesn't bleed into dictation. Adds the setting to the default
config for new installs and a migration for existing users.
2026-04-20 13:53:22 +02:00
Lewis BuckleyandGitHub a9baa8f45f Migrate existing waybar configs to pin battery to BAT0 (#5369)
* Migrate existing waybar configs to pin battery to BAT0

Follow-up to #4918: that PR updated the default template, but
existing users keep their copy at ~/.config/waybar/config.jsonc
and won't pick up the fix without running omarchy-refresh-waybar
(which wipes local customizations). Patch the existing file in
place and restart waybar.

* Make battery-pin migration tolerant of whitespace variants

Per Copilot review: grep/sed patterns now match "battery" : {,
"battery":{, and "bat" : "..." variants that hand-edited configs
may use. Also only restart waybar when a battery block actually
exists to edit.
2026-04-20 13:52:04 +02:00
David Heinemeier HanssonandGitHub 7c9442f8d0 Merge pull request #4918 from danflood94/dev
Add battery identifier to Waybar config
2026-04-20 10:31:12 +02:00
David Heinemeier Hansson a71916794c Speed up the special workspace a little too 2026-04-19 18:26:16 +02:00
David Heinemeier Hansson c74c0ccf97 Speed up the window movements ever so slightly 2026-04-19 18:24:10 +02:00
David Heinemeier Hansson 0344348ff0 Better naming 2026-04-19 17:45:50 +02:00
David Heinemeier Hansson 7f9f0c25ed Reveal which flag wasn't working 2026-04-19 17:44:32 +02:00
David Heinemeier Hansson aa35454dda Fix ordering 2026-04-19 17:44:24 +02:00
David Heinemeier Hansson 2b323459df Closing/opening lid will toggle internal monitor on/off 2026-04-19 17:34:34 +02:00
David Heinemeier Hansson fa48d2398b Better description 2026-04-19 17:13:28 +02:00
David Heinemeier Hansson 96a08f91a5 Start the monitor watch so the feature is active right away 2026-04-19 17:12:53 +02:00
David Heinemeier Hansson d6aaf30e43 Ensure internal display is turned back on if the external one is disconnected 2026-04-19 17:11:48 +02:00
David Heinemeier Hansson bdead4a3d1 Don't need any notifications for this when the consequences are visible 2026-04-18 20:13:27 +02:00
David Heinemeier Hansson e852895e5c Use preexisting toggles setup 2026-04-17 16:03:06 +02:00
David Heinemeier Hansson adb8d01d57 Hint for disabling the ghost monitor on the 6K XDR 2026-04-17 15:47:54 +02:00
David Heinemeier Hansson db52ba346c Extract omarchy-toggle-enabled and use this with the waybar to persist 2026-04-17 15:45:44 +02:00
David Heinemeier Hansson 71bbcc8adc Use new shared omarchy-toggle 2026-04-17 15:37:36 +02:00
David Heinemeier Hansson 7db0ee9314 Use shared toggle feaeture 2026-04-17 15:35:36 +02:00
David Heinemeier Hansson 1b898b862c Make the window no-gaps flag permanent 2026-04-17 14:22:59 +02:00
David Heinemeier Hansson 79d3b8cec6 Move flags to persistent setup so hyprctl reload doesn't reset them 2026-04-17 14:16:47 +02:00
David Heinemeier Hansson 8912bcb81c Add mako restart to Update > Process 2026-04-17 09:37:58 +02:00
David Heinemeier Hansson 8f441acbef Use more resilient restore 2026-04-16 15:35:52 +02:00
David Heinemeier Hansson a4c544b8f6 Bump version 2026-04-16 15:34:20 +02:00
90bf106a70 Disable PSR1 on XPS IPS and OLED. XPS IPS uses PSR2 (#5315)
* Disable PSR1 on XPS IPS and OLED. IPS uses PSR2

* Improve conditional flow

* Simplify the migration logic

* We don't actually need this

We are using += everywhere

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-04-16 12:10:52 +02:00
David Heinemeier Hansson a76757335a Ensure we set performance profile on boot when on AC 2026-04-15 18:14:07 +02:00
David Heinemeier Hansson ce29e45ccd Use /run/omarchy instead of just /tmp 2026-04-15 16:19:49 +02:00
David Heinemeier Hansson 7bfd848c93 Only apply enable_psr=0 to xps oled machines 2026-04-15 16:17:14 +02:00
David Heinemeier Hansson bf802df8bd Present copilot key->omarchy menu better 2026-04-15 15:55:47 +02:00
David Heinemeier Hansson 753885a659 Broaden the CPU boost after sleep fix to all Intel machines 2026-04-15 15:48:35 +02:00
David Heinemeier Hansson bebed70a7c Ensure cursor is on the new screen 2026-04-15 14:42:44 +02:00
David Heinemeier Hansson 521c94bfca Add display toggle but protect against disabling the only active display 2026-04-15 14:35:32 +02:00
David Heinemeier Hansson f094c3acc0 Move powerprofile setting to userland script 2026-04-15 13:50:36 +02:00
David Heinemeier Hansson 4a2511ad5d Fix perms 2026-04-15 13:31:16 +02:00
David Heinemeier Hansson 9f6df52d8d Restore previouse power profile after the boost 2026-04-15 12:34:17 +02:00
David Heinemeier Hansson 30ddfeda4a Just apply the GSK_RENDERER fix for walker 2026-04-15 12:10:26 +02:00
David Heinemeier Hansson c34adea2f0 No longer needed 2026-04-15 11:58:45 +02:00
David Heinemeier Hansson 3f28cd46d6 Use cairo renderer to workaround sluggish GTK4 renderer
Closes #5260
2026-04-15 11:55:18 +02:00
David Heinemeier Hansson 0017f2eab0 Make hibernation offset safer 2026-04-15 11:49:03 +02:00
David Heinemeier Hansson f7dc63ca72 Work around the return-from-sleep sluggishness on panther lake
This is due to slow ramp after s2idle
2026-04-15 02:26:37 -07:00
David Heinemeier Hansson 9389c1f57a Fix path 2026-04-15 10:39:21 +02:00
David Heinemeier Hansson 1f697ecc6d No longer need first-run to set these powerprofilectl rules 2026-04-15 10:36:45 +02:00
a49b8d255c Fix AC power udev rules failing silently at boot (#5275)
* Don't use the names here since they break the all-themes setup in omarchy-nvim

* Fix AC power udev rules to use systemd-run

* Migrate AC power udev rules to systemd-run

* Add --collect and stable unit names to systemd-run udev rules

* Add unit name, replace, and After ordering to power profile udev rules

* Remove invalid --replace flag from systemd-run power profile rules

* We don't need --replace becuase it's not needed

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-04-15 10:28:42 +02:00
Felipe GonzalezandGitHub 18ab342119 fix: suppress Chromium/Brave stderr noise during theme switch (#5285)
Redirect stderr to /dev/null alongside stdout when refreshing
browser platform policy, preventing shared_memory_switch errors
from cluttering the terminal.
2026-04-15 10:14:07 +02:00
Stefan GründelandGitHub a43915f91d update btop.conf for v1.4.6 (#5286) 2026-04-15 10:13:37 +02:00
Liam MitchellandGitHub 0204db0578 Fix intel video acceleration migration scripts (#5288) 2026-04-15 10:07:39 +02:00
092b16489d Add Logitech MX Keys key bindings (#5301)
* Add Logitech MX Keys key bindings

* Update config/hypr/bindings.conf

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update config/hypr/bindings.conf

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-15 10:03:15 +02:00
David Heinemeier Hansson a7893c8af4 Catch brave-origin too
Closes #5304
Co-authored-by: @Cleptomania
2026-04-15 10:00:49 +02:00
David Heinemeier Hansson bbe0d34968 Enable correct xe 2026-04-13 16:00:06 -07:00
David Heinemeier Hansson 3eee73c0de Ensure enable_psr=0 is set for all xps ptl systems 2026-04-13 15:59:16 -07:00
Ryan HughesandGitHub 1df2b16f2f Merge pull request #5293 from jondkinney/update-key-repeat-delay-to-lowest-possible
Update default repeat_delay to improve holding delete and vim motions
2026-04-13 12:54:50 -04:00
Jon Kinney 8a7c77291e Update default repeat_delay to improve holding delete and vim motions
In my testing, this is the lowest you can go without causing any issues
with double key presses.
2026-04-12 20:09:08 -05:00
David Heinemeier Hansson 1732551873 Switch from makima to a straight copilot to omarchy menu mapping 2026-04-11 20:41:42 -04:00
David Heinemeier Hansson 691b11901c Set device appearance as the default for chromium
So we will be switching correctly from light/dark mode depending on the
theme.
2026-04-11 20:09:51 -04:00
David Heinemeier Hansson 4fcc58de2a Expose omarchy-restart-trackpad
Until we have a permanent fix for the haptic trackpad in the XPS. Cc
@spencerbull
2026-04-11 18:08:31 -04:00
David Heinemeier Hansson 429b99dc50 PSR1 is introducing lag/stutters
CC @spencerbull
2026-04-11 18:01:45 -04:00
Robert StringerandGitHub b2b2903e22 Skip starship init for dumb bash sessions (#5255) 2026-04-10 06:57:22 -04:00
David Heinemeier Hansson c9cc4be4f9 Need to grab this before the loop 2026-04-10 06:37:49 -04:00
1746a86a7b Enable Dell XPS Mute Mic Key (#5252)
* If on XPS, enable XPS mute mic key with LED and fallback to original mic mute flow

* fix hardcode of alsa card 0 to resolved id

* Extract omarchy-hyprland-monitor-focused

* Extract dedicated xps mute script

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-04-10 06:35:41 -04:00
Pierre Olivier MartelandGitHub 5ca74821d4 Fix Fcitx5 icon showing up in the waybar (again!) (#5263)
* Update Fcitx5 autostart handling

* Restart xcompose to apply the changes
2026-04-10 06:24:30 -04:00
David Heinemeier Hansson 111307fba3 Address the new haptic touchpad in the shipping xps 2026-04-10 06:10:38 -04:00
David Heinemeier Hansson 5fb06d2d77 Better glyph 2026-04-09 09:53:54 +02:00
David Heinemeier Hansson 8ad61cadcb Add way to toggle on/off internal display on laptops 2026-04-09 09:53:12 +02:00
David Heinemeier Hansson 6171d0ee8f Setup power profile defaults on first run since that's when the daemon is available 2026-04-08 14:35:52 +02:00
Timo HuboisandGitHub 3bfed7da37 Merge pull request #5247 from timohubois/feat-mise-node-latest-npx-wrapper
Run Omarchy's npx wrappers through mise-managed Node
2026-04-07 12:21:39 +02:00
David Heinemeier Hansson cc3880b99e Enable lmpd if installed but not running 2026-04-07 09:15:08 +02:00
David Heinemeier Hansson 29a0663cc1 Ensure we enable the LPMD service after installing 2026-04-07 09:14:13 +02:00
David Heinemeier Hansson abace0cbd5 Prevent the need for double sudo 2026-04-06 09:36:35 +02:00
David Heinemeier Hansson 7bef44a4be Prevent spurious hyprland errors during git update 2026-04-06 09:05:02 +02:00
David Heinemeier Hansson eb3bd95fca We don't actually ever need this notification 2026-04-05 09:37:36 +02:00
danflood94andGitHub 2f36270369 Add battery identifier to Waybar config
fix(waybar): pin battery to BAT0 to prevent crash on HID disconnect
2026-03-06 21:10:47 +00:00
426 changed files with 4239 additions and 790 deletions
+1
View File
@@ -12,6 +12,7 @@
All commands start with `omarchy-`. Prefixes indicate purpose: All commands start with `omarchy-`. Prefixes indicate purpose:
- `cmd-` - check if commands exist, misc utility commands - `cmd-` - check if commands exist, misc utility commands
- `capture-` - screenshots, screen recordings, and other capture tools
- `pkg-` - package management helpers - `pkg-` - package management helpers
- `hw-` - hardware detection (return exit codes for use in conditionals) - `hw-` - hardware detection (return exit codes for use in conditionals)
- `refresh-` - copy default config to user's `~/.config/` - `refresh-` - copy default config to user's `~/.config/`
+2
View File
@@ -0,0 +1,2 @@
[Desktop Entry]
Hidden=true
Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Executable
+1032
View File
File diff suppressed because it is too large Load Diff
+9
View File
@@ -0,0 +1,9 @@
#!/bin/bash
# omarchy:summary=Returns true if AC power is connected.
for ac in /sys/class/power_supply/AC* /sys/class/power_supply/ADP*; do
[[ -r $ac/online && $(cat "$ac/online") == "1" ]] && exit 0
done
exit 1
+11
View File
@@ -0,0 +1,11 @@
#!/bin/bash
# omarchy:summary=Toggle microphone mute. Dell XPS and ThinkPad systems get special handling for the hardware LED.
if omarchy-hw-match "XPS"; then
omarchy-audio-input-mute-xps
elif omarchy-hw-match "ThinkPad"; then
omarchy-audio-input-mute-thinkpad
else
omarchy-swayosd-client --input-volume mute-toggle
fi
+21
View File
@@ -0,0 +1,21 @@
#!/bin/bash
# omarchy:summary=Toggle microphone mute on ThinkPad systems. Uses wpctl for reliable toggling
wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle >/dev/null
if pactl get-source-mute @DEFAULT_SOURCE@ | grep -q 'yes'; then
osd_message='Microphone muted'
osd_icon='microphone-sensitivity-muted-symbolic'
led_value=1
else
osd_message='Microphone on'
osd_icon='audio-input-microphone-symbolic'
led_value=0
fi
brightnessctl --device="platform::micmute" set "$led_value" >/dev/null 2>&1 || true
omarchy-swayosd-client \
--custom-message "$osd_message" \
--custom-icon "$osd_icon"
+42
View File
@@ -0,0 +1,42 @@
#!/bin/bash
# omarchy:summary=Toggle microphone mute on Dell XPS systems. Uses wpctl for reliable toggling
wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle >/dev/null
if pactl get-source-mute @DEFAULT_SOURCE@ | rg -q 'yes'; then
alsa_value='off,off'
osd_message='Microphone muted'
osd_icon='microphone-sensitivity-muted-symbolic'
else
alsa_value='on,on'
osd_message='Microphone on'
osd_icon='audio-input-microphone-symbolic'
fi
if [[ -e /sys/class/leds/platform::micmute/brightness ]]; then
default_source=$(pactl get-default-source)
alsa_card=$(pactl -f json list sources | jq -r --arg source "$default_source" '
.[] | select(.name == $source) |
.properties["alsa.card"] // .properties["api.alsa.card"] // .properties["api.alsa.pcm.card"] // empty
' | head -1)
if [[ -n $alsa_card ]]; then
cards=("$alsa_card")
else
mapfile -t cards < <(compgen -G '/proc/asound/card*' | rg -o 'card[0-9]+' | sed 's/card//' | sort -u)
fi
for card in "${cards[@]}"; do
while IFS= read -r control; do
if [[ $control != *"Jack Microphone"* ]]; then
amixer -c "$card" cset "$control" "$alsa_value" >/dev/null 2>&1 || true
break 2
fi
done < <(amixer -c "$card" controls 2>/dev/null | rg -o "name='[^']*Microphone Capture Switch'")
done
fi
omarchy-swayosd-client \
--custom-message "$osd_message" \
--custom-icon "$osd_icon"
@@ -1,16 +1,12 @@
#!/bin/bash #!/bin/bash
# Switch between audio outputs while preserving the mute status. By default mapped to Super + Mute. # omarchy:summary=Switch between audio outputs while preserving the mute status. By default mapped to Super + Mute.
focused_monitor="$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name')"
sinks=$(pactl -f json list sinks | jq '[.[] | select((.ports | length == 0) or ([.ports[]? | .availability != "not available"] | any))]') sinks=$(pactl -f json list sinks | jq '[.[] | select((.ports | length == 0) or ([.ports[]? | .availability != "not available"] | any))]')
sinks_count=$(echo "$sinks" | jq '. | length') sinks_count=$(echo "$sinks" | jq '. | length')
if (( sinks_count == 0 )); then if (( sinks_count == 0 )); then
swayosd-client \ omarchy-swayosd-client --custom-message "No audio devices found"
--monitor "$focused_monitor" \
--custom-message "No audio devices found"
exit 1 exit 1
fi fi
@@ -57,10 +53,10 @@ fi
next_sink_volume_icon="sink-volume-${icon_state}-symbolic" next_sink_volume_icon="sink-volume-${icon_state}-symbolic"
if [[ $next_sink_name != $current_sink_name ]]; then if [[ $next_sink_name != $current_sink_name ]]; then
pactl set-default-sink "$next_sink_name" next_sink_wpid=$(echo "$next_sink" | jq -r '.properties."object.id"')
wpctl set-default "$next_sink_wpid"
fi fi
swayosd-client \ omarchy-swayosd-client \
--monitor "$focused_monitor" \
--custom-message "$next_sink_description" \ --custom-message "$next_sink_description" \
--custom-icon "$next_sink_volume_icon" --custom-icon "$next_sink_volume_icon"
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash #!/bin/bash
# Returns the battery full capacity in Wh (rounded to whole number). # omarchy:summary=Returns the battery full capacity in Wh (rounded to whole number).
# Used by omarchy-battery-status for displaying battery capacity.
battery_info=$(upower -i $(upower -e | grep BAT)) battery_info=$(upower -i $(upower -e | grep BAT))
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Designed to be run by systemd timer every 30 seconds and alerts if battery is low # omarchy:summary=Designed to be run by systemd timer every 30 seconds and alerts if battery is low
BATTERY_THRESHOLD=10 BATTERY_THRESHOLD=10
NOTIFICATION_FLAG="/run/user/$UID/omarchy_battery_notified" NOTIFICATION_FLAG="/run/user/$UID/omarchy_battery_notified"
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash #!/bin/bash
# Returns true if a battery is present on the system. # omarchy:summary=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 for bat in /sys/class/power_supply/BAT*; do
[[ -r $bat/present ]] && [[ -r $bat/present ]] &&
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash #!/bin/bash
# Returns the battery percentage remaining as an integer. # omarchy:summary=Returns the battery percentage remaining as an integer.
# Used by the battery monitor and the Ctrl + Shift + Super + B hotkey.
upower -i $(upower -e | grep BAT) | awk '/percentage/ { upower -i $(upower -e | grep BAT) | awk '/percentage/ {
print int($2) print int($2)
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Returns the battery time remaining (to empty or full) in a compact format. # omarchy:summary=Returns the battery time remaining (to empty or full) in a compact format.
battery_info=$(upower -i $(upower -e | grep BAT)) battery_info=$(upower -i $(upower -e | grep BAT))
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash #!/bin/bash
# Returns a formatted battery status string with percentage and power draw/charge. # omarchy:summary=Returns a formatted battery status string with percentage and power draw/charge.
# Used by the battery notification hotkey (Ctrl + Shift + Super + B).
battery_info=$(upower -i $(upower -e | grep BAT)) battery_info=$(upower -i $(upower -e | grep BAT))
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# Set the branch for Omarchy's git repository. # omarchy:summary=Set the branch for Omarchy's git repository.
# omarchy:args=<master|rc|dev>
if (($# == 0)); then if (($# == 0)); then
echo "Usage: omarchy-branch-set [master|rc|dev]" echo "Usage: omarchy-branch-set [master|rc|dev]"
+27 -2
View File
@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Adjust brightness on the most likely display device. # omarchy:summary=Adjust brightness on the most likely display device.
# Usage: omarchy-brightness-display <step> # omarchy:args=<step>
step="${1:-+5%}" step="${1:-+5%}"
@@ -14,6 +14,31 @@ for candidate in amdgpu_bl* intel_backlight acpi_video*; do
fi fi
done done
# Current brightness percentage
current=$(brightnessctl -d "$device" -m | cut -d',' -f4 | tr -d '%')
# Apply non-uniform step size: 1% steps if at or below 5%, otherwise set an
# absolute target percentage to avoid raw backlight rounding causing uneven OSD steps.
if [[ $step == "+5%" ]]; then
if (( current < 5 )); then
(( target = current + 1 ))
else
(( target = current + 5 ))
fi
(( target > 100 )) && target=100
step="$target%"
elif [[ $step == "5%-" ]]; then
if (( current <= 5 )); then
(( target = current - 1 ))
else
(( target = current - 5 ))
fi
(( target < 1 )) && target=1
step="$target%"
fi
# Set the actual brightness of the display device. # Set the actual brightness of the display device.
brightnessctl -d "$device" set "$step" >/dev/null brightnessctl -d "$device" set "$step" >/dev/null
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# Adjust the brightness on Apple Studio Displays and Apple XDR Displays using asdcontrol. # omarchy:summary=Adjust the brightness on Apple Studio Displays and Apple XDR Displays using asdcontrol.
# omarchy:requires-sudo=true
if (( $# == 0 )); then if (( $# == 0 )); then
echo "Adjust Apple Display Brightness by passing +5000 or -5000 (or any range from 0-60000)" echo "Adjust Apple Display Brightness by passing +5000 or -5000 (or any range from 0-60000)"
+2 -2
View File
@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Adjust keyboard backlight brightness using available steps. # omarchy:summary=Adjust keyboard backlight brightness using available steps.
# Usage: omarchy-brightness-keyboard <up|down|cycle> # omarchy:args=<up|down|cycle>
direction="${1:-up}" direction="${1:-up}"
@@ -1,9 +1,10 @@
#!/bin/bash #!/bin/bash
# Start and stop a screenrecording, which will be saved to ~/Videos by default. # omarchy:summary=Start or stop screen recording
# Alternative location can be set via OMARCHY_SCREENRECORD_DIR or XDG_VIDEOS_DIR ENVs. # omarchy:group=capture
# Resolution is capped to 4K for monitors above 4K, native otherwise. # omarchy:args=[--with-desktop-audio] [--with-microphone-audio] [--with-webcam] [--webcam-device=<device>] [--resolution=<size>] [--stop-recording]
# Override via --resolution= (e.g. --resolution=1920x1080, --resolution=0x0 for native). # omarchy:examples=omarchy screenrecord | omarchy capture screenrecord --with-desktop-audio
# omarchy:aliases=omarchy screenrecord
[[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs [[ -f ~/.config/user-dirs.dirs ]] && source ~/.config/user-dirs.dirs
OUTPUT_DIR="${OMARCHY_SCREENRECORD_DIR:-${XDG_VIDEOS_DIR:-$HOME/Videos}}" OUTPUT_DIR="${OMARCHY_SCREENRECORD_DIR:-${XDG_VIDEOS_DIR:-$HOME/Videos}}"
@@ -134,7 +135,7 @@ stop_screenrecording() {
pkill -9 -f "^gpu-screen-recorder" pkill -9 -f "^gpu-screen-recorder"
notify-send "Screen recording error" "Recording process had to be force-killed. Video may be corrupted." -u critical -t 5000 notify-send "Screen recording error" "Recording process had to be force-killed. Video may be corrupted." -u critical -t 5000
else else
trim_first_frame finalize_recording
local filename=$(cat "$RECORDING_FILE" 2>/dev/null) local filename=$(cat "$RECORDING_FILE" 2>/dev/null)
local preview="${filename%.mp4}-preview.png" local preview="${filename%.mp4}-preview.png"
@@ -159,17 +160,29 @@ screenrecording_active() {
pgrep -f "^gpu-screen-recorder" >/dev/null pgrep -f "^gpu-screen-recorder" >/dev/null
} }
trim_first_frame() { finalize_recording() {
local latest local latest
latest=$(cat "$RECORDING_FILE" 2>/dev/null) latest=$(cat "$RECORDING_FILE" 2>/dev/null)
[[ -f $latest ]] || return
if [[ -n $latest && -f $latest ]]; then # Re-encode only when the first GOP contains discardable warmup packets — stream copy can't
local trimmed="${latest%.mp4}-trimmed.mp4" # trim those (it rewinds to the keyframe). Clean recordings stay on the fast stream-copy path.
if ffmpeg -y -ss 0.1 -i "$latest" -c copy "$trimmed" -loglevel quiet 2>/dev/null; then local video_codec=(-c:v copy)
mv "$trimmed" "$latest" if ffprobe -v error -select_streams v:0 -read_intervals %+0.2 -show_entries packet=flags -of csv=p=0 "$latest" 2>/dev/null | grep -q D; then
else video_codec=(-c:v libx264 -preset veryfast -crf 20)
rm -f "$trimmed" fi
fi
# Trim the first frame, and normalize audio to -14 LUFS if present, in a single pass
local args=(-y -ss 0.1 -i "$latest" "${video_codec[@]}")
if ffprobe -v error -select_streams a -show_entries stream=codec_type -of csv=p=0 "$latest" 2>/dev/null | grep -q audio; then
args+=(-af loudnorm=I=-14:TP=-1.5:LRA=11)
fi
local processed="${latest%.mp4}-processed.mp4"
if ffmpeg "${args[@]}" "$processed" -loglevel quiet 2>/dev/null; then
mv "$processed" "$latest"
else
rm -f "$processed"
fi fi
} }
@@ -1,8 +1,10 @@
#!/bin/bash #!/bin/bash
# Take a screenshot of the whole screen, a specific window, or a user-drawn region. # omarchy:summary=Take a screenshot
# Saves to ~/Pictures by default, but that can be changed via OMARCHY_SCREENSHOT_DIR or XDG_PICTURES_DIR ENVs. # omarchy:group=capture
# Editor defaults to Satty but can be changed via --editor=<name> or OMARCHY_SCREENSHOT_EDITOR env # omarchy:args=[smart|region|windows|fullscreen] [slurp|copy] [--editor=<name>]
# omarchy:examples=omarchy screenshot | omarchy capture screenshot region
# omarchy:aliases=omarchy screenshot
[[ -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}}"
@@ -63,6 +65,13 @@ get_rectangles() {
hyprctl clients -j | jq -r --arg ws "$active_workspace" '.[] | select(.workspace.id == ($ws | tonumber)) | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' hyprctl clients -j | jq -r --arg ws "$active_workspace" '.[] | select(.workspace.id == ($ws | tonumber)) | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"'
} }
# Keep hyprpicker alive until after grim captures so the screenshot sees the
# frozen overlay rather than live content shifting during teardown.
cleanup_freeze() {
[[ -n $PID ]] && kill $PID 2>/dev/null
}
trap cleanup_freeze EXIT
# Select based on mode # Select based on mode
case "$MODE" in case "$MODE" in
region) region)
@@ -70,14 +79,12 @@ region)
PID=$! PID=$!
sleep .1 sleep .1
SELECTION=$(slurp 2>/dev/null) SELECTION=$(slurp 2>/dev/null)
kill $PID 2>/dev/null
;; ;;
windows) windows)
hyprpicker -r -z >/dev/null 2>&1 & hyprpicker -r -z >/dev/null 2>&1 &
PID=$! PID=$!
sleep .1 sleep .1
SELECTION=$(get_rectangles | slurp -r 2>/dev/null) SELECTION=$(get_rectangles | slurp -r 2>/dev/null)
kill $PID 2>/dev/null
;; ;;
fullscreen) fullscreen)
SELECTION=$(hyprctl monitors -j | jq -r "${JQ_MONITOR_GEO} .[] | select(.focused == true) | format_geo") SELECTION=$(hyprctl monitors -j | jq -r "${JQ_MONITOR_GEO} .[] | select(.focused == true) | format_geo")
@@ -88,7 +95,6 @@ smart | *)
PID=$! PID=$!
sleep .1 sleep .1
SELECTION=$(echo "$RECTS" | slurp 2>/dev/null) SELECTION=$(echo "$RECTS" | slurp 2>/dev/null)
kill $PID 2>/dev/null
# If the selection area is L * W < 20, we'll assume you were trying to select whichever # 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
+3 -12
View File
@@ -1,17 +1,8 @@
#!/bin/bash #!/bin/bash
# Set the Omarchy channel, which dictates what git branch and package repository is used. # omarchy:summary=Set the Omarchy channel, which dictates what git branch and package repository is used.
# # omarchy:args=<stable|rc|edge|dev>
# Stable uses the master branch, which only sees updates on official releases, and # omarchy:requires-sudo=true
# the stable package repository, which typically lags the edge by a month to ensure
# better compatibility.
#
# Edge tracks the latest package repository, but still relies on the master branch,
# so new packages which require config changes may cause conflicts or errors.
#
# Dev tracks the active development dev branch, which may include partial or broken updates,
# as well as the latest package repository. This should only be used by Omarchy developers
# and people with a lot of experience managing Linux systems.
if (($# == 0)); then if (($# == 0)); then
echo "Usage: omarchy-channel-set [stable|rc|edge|dev]" echo "Usage: omarchy-channel-set [stable|rc|edge|dev]"
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Returns true if any of the commands passed in as arguments are missing on the system. # omarchy:summary=Check whether any required commands are missing
for cmd in "$@"; do for cmd in "$@"; do
if ! command -v "$cmd" &>/dev/null; then if ! command -v "$cmd" &>/dev/null; then
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Returns true if all the commands passed in as arguments exit on the system. # omarchy:summary=Check whether all required commands are available
for cmd in "$@"; do for cmd in "$@"; do
command -v "$cmd" &>/dev/null || exit 1 command -v "$cmd" &>/dev/null || exit 1
+1 -3
View File
@@ -1,9 +1,7 @@
#!/bin/bash #!/bin/bash
# Returns the current working directory of the active terminal window, # omarchy:summary=Print the current working directory of the active terminal window
# so a new terminal window can be started in the same directory.
# Go from current active terminal to its child shell process and run cwd there
terminal_pid=$(hyprctl activewindow | awk '/pid:/ {print $2}') terminal_pid=$(hyprctl activewindow | awk '/pid:/ {print $2}')
shell_pid=$(pgrep -P "$terminal_pid" | tail -n1) shell_pid=$(pgrep -P "$terminal_pid" | tail -n1)
+33 -20
View File
@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Add an EFI boot entry for the Omarchy UKI, allowing the system to boot directly # omarchy:summary=Add or remove an EFI boot entry for the Omarchy UKI, allowing the system to boot directly
# without a bootloader like Limine. Requires UEFI firmware and a built UKI. # omarchy:requires-sudo=true
if [[ ! -d /sys/firmware/efi ]]; then if [[ ! -d /sys/firmware/efi ]]; then
echo "Error: System is not booted in UEFI mode" >&2 echo "Error: System is not booted in UEFI mode" >&2
@@ -23,23 +23,36 @@ if cat /sys/class/dmi/id/bios_vendor 2>/dev/null | grep -qi "Apple"; then
exit 1 exit 1
fi fi
uki_file=$(find /boot/EFI/Linux/ -name "omarchy*.efi" -printf "%f\n" 2>/dev/null | head -1) existing_entry=$(efibootmgr | grep -E "^Boot[0-9A-Fa-f]+\*? Omarchy([[:space:]]|$)" | head -1)
if [[ -z $uki_file ]]; then if [[ -n $existing_entry ]]; then
echo "Error: No Omarchy UKI found in /boot/EFI/Linux/" >&2 boot_num=$(echo "$existing_entry" | sed -n 's/^Boot\([0-9A-Fa-f]\+\).*/\1/p')
exit 1
fi if gum confirm "Disable direct boot (remove Omarchy EFI entry)?"; then
echo "Removing EFI boot entry $boot_num"
boot_source=$(findmnt -n -o SOURCE /boot) sudo efibootmgr --bootnum "$boot_num" --delete-bootnum >/dev/null
disk=$(echo "$boot_source" | sed 's/p\?[0-9]*$//') fi
part=$(echo "$boot_source" | grep -o 'p\?[0-9]*$' | sed 's/^p//')
exit 0
if gum confirm "Setup direct boot (so snapshot booting must be done via bios)?"; then else
echo "Creating EFI boot entry for $uki_file" uki_file=$(find /boot/EFI/Linux/ -name "omarchy*.efi" -printf "%f\n" 2>/dev/null | head -1)
sudo efibootmgr --create \ if [[ -z $uki_file ]]; then
--disk "$disk" \ echo "Error: No Omarchy UKI found in /boot/EFI/Linux/" >&2
--part "$part" \ exit 1
--label "Omarchy" \ fi
--loader "\\EFI\\Linux\\$uki_file"
boot_source=$(findmnt -n -o SOURCE /boot)
disk=$(echo "$boot_source" | sed 's/p\?[0-9]*$//')
part=$(echo "$boot_source" | grep -o 'p\?[0-9]*$' | sed 's/^p//')
if gum confirm "Setup direct boot (so snapshot booting must be done via bios)?"; then
echo "Creating EFI boot entry for $uki_file"
sudo efibootmgr --create \
--disk "$disk" \
--part "$part" \
--label "Omarchy" \
--loader "\\EFI\\Linux\\$uki_file"
fi
fi fi
+4 -1
View File
@@ -1,6 +1,9 @@
#!/bin/bash #!/bin/bash
# Return exhaustive debugging information about the system to help diagnose problems. # omarchy:summary=Print debugging information
# omarchy:args=[--no-sudo] [--print]
# omarchy:examples=omarchy debug --print --no-sudo
# omarchy:requires-sudo=true
NO_SUDO=false NO_SUDO=false
PRINT_ONLY=false PRINT_ONLY=false
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash #!/bin/bash
# Creates a new Omarchy migration named after the unix timestamp of the last commit. # omarchy:summary=Creates a new Omarchy migration named after the unix timestamp of the last commit.
# Only intended for Omarchy developers.
cd ~/.local/share/omarchy cd ~/.local/share/omarchy
migration_file="$HOME/.local/share/omarchy/migrations/$(git log -1 --format=%cd --date=unix).sh" migration_file="$HOME/.local/share/omarchy/migrations/$(git log -1 --format=%cd --date=unix).sh"
+111
View File
@@ -0,0 +1,111 @@
#!/bin/bash
# omarchy:summary=Measure Omarchy CLI response times
# omarchy:args=[--repeat=<count>]
# omarchy:examples=omarchy dev benchmark | omarchy dev benchmark --repeat=10
set -euo pipefail
OMARCHY_BIN_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
CLI="$OMARCHY_BIN_DIR/omarchy"
REPEAT=5
show_help() {
cat <<'EOF'
Usage:
omarchy dev benchmark [--repeat=<count>]
Measure response times for common Omarchy CLI surfaces.
Options:
--repeat=<count> Number of times to run each case (default: 5)
EOF
}
now_us() {
local now="${EPOCHREALTIME/./}"
printf '%s' "$now"
}
format_ms() {
local us="$1"
printf '%d.%03d' "$(( us / 1000 ))" "$(( us % 1000 ))"
}
run_case() {
local label="$1"
shift
local total_us=0
local min_us=0
local max_us=0
local elapsed_us=0
local start_us=0
local end_us=0
local status=0
for (( i = 1; i <= REPEAT; i++ )); do
start_us=$(now_us)
if "$@" >/dev/null; then
status=0
else
status=$?
fi
end_us=$(now_us)
if (( status != 0 )); then
printf '%-34s failed (exit %d)\n' "$label" "$status"
return "$status"
fi
elapsed_us=$(( end_us - start_us ))
total_us=$(( total_us + elapsed_us ))
if (( i == 1 || elapsed_us < min_us )); then
min_us=$elapsed_us
fi
if (( elapsed_us > max_us )); then
max_us=$elapsed_us
fi
done
printf '%-34s avg %8s ms min %8s ms max %8s ms\n' \
"$label" \
"$(format_ms "$(( total_us / REPEAT ))")" \
"$(format_ms "$min_us")" \
"$(format_ms "$max_us")"
}
while (( $# > 0 )); do
case "$1" in
--repeat=*)
REPEAT="${1#*=}"
;;
--help | -h)
show_help
exit 0
;;
*)
echo "Unknown option: $1" >&2
show_help >&2
exit 2
;;
esac
shift
done
if [[ ! $REPEAT =~ ^[0-9]+$ ]] || (( REPEAT < 1 )); then
echo "--repeat must be a positive integer" >&2
exit 2
fi
printf 'Omarchy CLI benchmark (%d runs each)\n\n' "$REPEAT"
run_case "omarchy" "$CLI"
run_case "omarchy --help" "$CLI" --help
run_case "omarchy commands" "$CLI" commands
run_case "omarchy commands --json" "$CLI" commands --json
run_case "omarchy commands --all --json" "$CLI" commands --all --json
run_case "omarchy theme set --help" "$CLI" theme set --help
run_case "omarchy screenshot --help" "$CLI" screenshot --help
run_case "omarchy restart --help" "$CLI" restart --help
run_case "omarchy theme current" "$CLI" theme current
+86
View File
@@ -0,0 +1,86 @@
#!/bin/bash
# omarchy:summary=Show Omarchy bin metadata fields and defaults
# omarchy:args=[--json]
set -euo pipefail
show_json() {
jq -n '{
ok: true,
defaults: {
group: "first filename segment after omarchy-",
name: "remaining filename segments with dashes converted to spaces",
route: "omarchy <group> <name>",
binary: "filename",
requires_sudo: false
},
fields: [
{name: "summary", required: true, type: "string", note: "One-line human and agent-facing description."},
{name: "group", required: false, type: "string", note: "Only set when the route group should differ from the filename-derived group."},
{name: "name", required: false, type: "string", note: "Only set when the route name should differ from the filename-derived name. May be empty for root commands."},
{name: "args", required: false, type: "string", note: "Only set when the command accepts arguments."},
{name: "examples", required: false, type: "string", note: "Pipe-separated examples."},
{name: "aliases", required: false, type: "string", note: "Pipe-separated alternate routes, e.g. omarchy screenshot."},
{name: "requires-sudo", required: false, type: "true", default: false, note: "Only include when true."}
]
}'
}
show_help() {
cat <<'EOF'
Omarchy bin metadata
Metadata lives in the top comment block of each executable bin/omarchy-* file.
Keep it slim: define only fields that are required or override defaults.
Required:
# omarchy:summary=<one-line description>
Inferred defaults:
group first filename segment after omarchy-
name remaining filename segments, with dashes converted to spaces
route omarchy <group> <name>
binary filename
requires-sudo false
Optional fields:
# omarchy:group=<group> route override only
# omarchy:name=<name> route override only; may be empty
# omarchy:args=<args> only if the command accepts args
# omarchy:examples=<cmd> | <cmd> pipe-separated examples
# omarchy:aliases=<route> | <route> pipe-separated alternate routes
# omarchy:requires-sudo=true only when true
Do not define:
binary inferred from filename
usage derived from route + args
false flags or empty args
Examples:
# omarchy:summary=Restart Walker and related user services
# omarchy:summary=Take a screenshot
# omarchy:group=capture
# omarchy:args=[smart|region|windows|fullscreen] [slurp|copy] [--editor=<name>]
# omarchy:examples=omarchy screenshot | omarchy capture screenshot region
# omarchy:aliases=omarchy screenshot
EOF
}
case "${1:-}" in
--json)
show_json
;;
--help | -h)
show_help
;;
"")
show_help
;;
*)
echo "Unknown option: $1" >&2
show_help >&2
exit 2
;;
esac
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# Returns drive information about a given volumne, like /dev/nvme0, which is used by omarchy-drive-select. # omarchy:summary=Print drive information such as size, model, and mount details
# omarchy:args=<drive>
if (($# == 0)); then if (($# == 0)); then
echo "Usage: omarchy-drive-info [/dev/drive]" echo "Usage: omarchy-drive-info [/dev/drive]"
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Select a drive from a list with info that includes space and brand. Used by omarchy-drive-set-password. # omarchy:summary=Select a drive from a list with info that includes space and brand. Used by omarchy-drive-set-password.
if (($# == 0)); then if (($# == 0)); then
drives=$(lsblk -dpno NAME | grep -E '/dev/(sd|hd|vd|nvme|mmcblk|xv)') drives=$(lsblk -dpno NAME | grep -E '/dev/(sd|hd|vd|nvme|mmcblk|xv)')
+3 -2
View File
@@ -1,11 +1,12 @@
#!/bin/bash #!/bin/bash
# Set a new encryption password for a drive selected. # omarchy:summary=Set a new encryption password for a drive selected.
# omarchy:requires-sudo=true
encrypted_drives=$(blkid -t TYPE=crypto_LUKS -o device) encrypted_drives=$(blkid -t TYPE=crypto_LUKS -o device)
if [[ -n $encrypted_drives ]]; then if [[ -n $encrypted_drives ]]; then
if (( $(wc -l <<<encrypted_drives) == 1 )); then if (( $(wc -l <<<"$encrypted_drives") == 1 )); then
drive_to_change="$encrypted_drives" drive_to_change="$encrypted_drives"
else else
drive_to_change="$(omarchy-drive-select "$encrypted_drives")" drive_to_change="$(omarchy-drive-select "$encrypted_drives")"
@@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# Finish the installation of Omarchy with items that can only be done after logging in. # omarchy:summary=Finish the installation of Omarchy with items that can only be done after logging in.
# omarchy:requires-sudo=true
set -e set -e
@@ -10,6 +11,7 @@ if [[ -f $FIRST_RUN_MODE ]]; then
rm -f "$FIRST_RUN_MODE" rm -f "$FIRST_RUN_MODE"
bash "$OMARCHY_PATH/install/first-run/battery-monitor.sh" bash "$OMARCHY_PATH/install/first-run/battery-monitor.sh"
bash "$OMARCHY_PATH/install/first-run/recover-internal-monitor.sh"
bash "$OMARCHY_PATH/install/first-run/cleanup-reboot-sudoers.sh" bash "$OMARCHY_PATH/install/first-run/cleanup-reboot-sudoers.sh"
bash "$OMARCHY_PATH/install/first-run/firewall.sh" bash "$OMARCHY_PATH/install/first-run/firewall.sh"
bash "$OMARCHY_PATH/install/first-run/dns-resolver.sh" bash "$OMARCHY_PATH/install/first-run/dns-resolver.sh"
+2 -2
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Returns the name of the current monospace font being used by extracting it from the Waybar stylesheet. # omarchy:summary=Show current monospace font
# This can be changed using omarchy-font-set. # omarchy:examples=omarchy font current
grep -oP 'font-family:\s*["'\'']?\K[^;"'\'']+' ~/.config/waybar/style.css | head -n1 grep -oP 'font-family:\s*["'\'']?\K[^;"'\'']+' ~/.config/waybar/style.css | head -n1
+2 -1
View File
@@ -1,5 +1,6 @@
#!/bin/bash #!/bin/bash
# Returns a list of all the monospace fonts available on the system that can be set using omarchy-font-set. # omarchy:summary=List available monospace fonts
# omarchy:examples=omarchy font list | omarchy font set "CaskaydiaMono Nerd Font"
fc-list :spacing=100 -f "%{family[0]}\n" | grep -v -i -E 'emoji|signwriting|omarchy' | sort -u fc-list :spacing=100 -f "%{family[0]}\n" | grep -v -i -E 'emoji|signwriting|omarchy' | sort -u
+3 -2
View File
@@ -1,7 +1,8 @@
#!/bin/bash #!/bin/bash
# Set the system-wide monospace font that should be used by the terminal, hyprlock, waybar, swayosd, etc. # omarchy:summary=Set the system monospace font
# The font name must be one of the ones returned by omarchy-font-list. # omarchy:args=<font-name>
# omarchy:examples=omarchy font list | omarchy font set "CaskaydiaMono Nerd Font"
font_name="$1" font_name="$1"
+4 -3
View File
@@ -1,5 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# omarchy:summary=Run the Synaptics touchpad haptic feedback daemon
"""Haptic feedback daemon for Synaptics touchpads with Manual Trigger. """Haptic feedback daemon for Synaptics touchpads with Manual Trigger.
Monitors touchpad button press events and sends haptic pulses via HID Monitors touchpad button press events and sends haptic pulses via HID
@@ -11,7 +13,6 @@ Trigger protocol used by these Synaptics touchpads.
import fcntl, glob, os, struct, sys import fcntl, glob, os, struct, sys
VENDOR = "06CB" VENDOR = "06CB"
PRODUCT = "D01A"
REPORT_ID = 0x37 REPORT_ID = 0x37
INTENSITY = 40 # 0-100 INTENSITY = 40 # 0-100
@@ -34,7 +35,7 @@ def find_hidraw():
try: try:
with open(uevent) as f: with open(uevent) as f:
content = f.read().upper() content = f.read().upper()
if f"0000{VENDOR}" in content and f"0000{PRODUCT}" in content: if f"0000{VENDOR}" in content:
return os.path.join("/dev", os.path.basename(path)) return os.path.join("/dev", os.path.basename(path))
except OSError: except OSError:
continue continue
@@ -46,7 +47,7 @@ def find_touchpad_event():
try: try:
with open(path) as f: with open(path) as f:
name = f.read().strip().upper() name = f.read().strip().upper()
if VENDOR in name and PRODUCT in name and "TOUCHPAD" in name: if VENDOR in name and "TOUCHPAD" in name:
event = path.split("/")[-3] event = path.split("/")[-3]
return os.path.join("/dev/input", event) return os.path.join("/dev/input", event)
except OSError: except OSError:
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# Check if hibernation is supported # omarchy:summary=Check if hibernation is supported
if [[ ! -f /sys/power/image_size ]]; then if [[ ! -f /sys/power/image_size ]]; then
exit 1 exit 1
fi fi
+2 -2
View File
@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Removes hibernation setup: disables swap, removes swapfile, removes fstab entry, # omarchy:summary=Remove hibernation setup including swap and boot resume settings
# removes resume hook, and removes suspend-then-hibernate configuration. # omarchy:requires-sudo=true
MKINITCPIO_CONF="/etc/mkinitcpio.conf.d/omarchy_resume.conf" MKINITCPIO_CONF="/etc/mkinitcpio.conf.d/omarchy_resume.conf"
+22 -7
View File
@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Creates a swap file in the btrfs subvolume, adds the swap file to /etc/fstab, # omarchy:summary=Set up hibernation with swap and boot resume configuration
# adds a resume hook to mkinitcpio, and configures suspend-then-hibernate. # omarchy:requires-sudo=true
if [[ ! -f /sys/power/image_size ]]; then if [[ ! -f /sys/power/image_size ]]; then
echo -e "Hibernation is not supported on your system" >&2 echo -e "Hibernation is not supported on your system" >&2
@@ -14,9 +14,22 @@ if ! command -v limine-mkinitcpio &>/dev/null; then
fi fi
MKINITCPIO_CONF="/etc/mkinitcpio.conf.d/omarchy_resume.conf" MKINITCPIO_CONF="/etc/mkinitcpio.conf.d/omarchy_resume.conf"
SWAP_FILE="/swap/swapfile"
RESUME_DROP_IN="/etc/limine-entry-tool.d/resume.conf"
# Check if hibernation is already configured # Check if hibernation is already configured
if [[ -f $MKINITCPIO_CONF ]] && grep -q "^HOOKS+=(resume)$" "$MKINITCPIO_CONF"; then if [[ -f $MKINITCPIO_CONF ]] && grep -q "^HOOKS+=(resume)$" "$MKINITCPIO_CONF"; then
# Fix empty resume_offset if btrfs map-swapfile failed during initial setup
if [[ -f $RESUME_DROP_IN ]] && grep -q 'resume_offset="$' "$RESUME_DROP_IN" && [[ -f $SWAP_FILE ]]; then
RESUME_OFFSET=$(sudo btrfs inspect-internal map-swapfile -r "$SWAP_FILE" 2>/dev/null)
if [[ -n $RESUME_OFFSET ]]; then
echo "Fixing empty resume_offset ($RESUME_OFFSET)"
sudo sed -i "s/resume_offset=\"$/resume_offset=$RESUME_OFFSET\"/" "$RESUME_DROP_IN"
sudo sed -i "s/resume_offset=\"$/resume_offset=$RESUME_OFFSET\"/" /etc/default/limine
sudo limine-mkinitcpio
sudo limine-update
fi
fi
echo "Hibernation is already set up" echo "Hibernation is already set up"
exit 0 exit 0
fi fi
@@ -29,7 +42,6 @@ if [[ $1 != "--force" ]]; then
fi fi
SWAP_SUBVOLUME="/swap" SWAP_SUBVOLUME="/swap"
SWAP_FILE="$SWAP_SUBVOLUME/swapfile"
# Create btrfs subvolume for swap # Create btrfs subvolume for swap
if ! sudo btrfs subvolume show "$SWAP_SUBVOLUME" &>/dev/null; then if ! sudo btrfs subvolume show "$SWAP_SUBVOLUME" &>/dev/null; then
@@ -68,15 +80,18 @@ sudo cp -p "$OMARCHY_PATH/default/systemd/system-sleep/keyboard-backlight" /usr/
# Add resume= kernel parameters so the initramfs resume hook knows where to find the # Add resume= kernel parameters so the initramfs resume hook knows where to find the
# hibernation image. Without these, resume happens late (after GPU drivers load) and fails. # hibernation image. Without these, resume happens late (after GPU drivers load) and fails.
RESUME_DROP_IN="/etc/limine-entry-tool.d/resume.conf"
if [[ ! -f $RESUME_DROP_IN ]]; then if [[ ! -f $RESUME_DROP_IN ]]; then
echo "Adding resume kernel parameters" echo "Adding resume kernel parameters"
sudo swapon -p 0 "$SWAP_FILE" 2>/dev/null sudo swapon -p 0 "$SWAP_FILE" 2>/dev/null
RESUME_DEVICE=$(findmnt -no SOURCE -T "$SWAP_FILE" | sed 's/\[.*\]//') RESUME_DEVICE=$(findmnt -no SOURCE -T "$SWAP_FILE" | sed 's/\[.*\]//')
RESUME_OFFSET=$(sudo btrfs inspect-internal map-swapfile -r "$SWAP_FILE") RESUME_OFFSET=$(sudo btrfs inspect-internal map-swapfile -r "$SWAP_FILE")
sudo mkdir -p /etc/limine-entry-tool.d if [[ -n $RESUME_OFFSET ]]; then
echo "KERNEL_CMDLINE[default]+=\" resume=$RESUME_DEVICE resume_offset=$RESUME_OFFSET\"" | sudo tee "$RESUME_DROP_IN" >/dev/null sudo mkdir -p /etc/limine-entry-tool.d
sudo tee -a /etc/default/limine < "$RESUME_DROP_IN" >/dev/null echo "KERNEL_CMDLINE[default]+=\" resume=$RESUME_DEVICE resume_offset=$RESUME_OFFSET\"" | sudo tee "$RESUME_DROP_IN" >/dev/null
sudo tee -a /etc/default/limine < "$RESUME_DROP_IN" >/dev/null
else
echo "Warning: Could not determine resume offset for $SWAP_FILE" >&2
fi
fi fi
# Use ACPI alarm for RTC wakeup on s2idle systems (needed for suspend-then-hibernate) # Use ACPI alarm for RTC wakeup on s2idle systems (needed for suspend-then-hibernate)
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# Run a named hook, like post-update (available in ~/.config/omarchy/hooks/post-update). # omarchy:summary=Run a named hook, like post-update (available in ~/.config/omarchy/hooks/post-update).
# omarchy:args=[name] [args...]
set -e set -e
+5
View File
@@ -0,0 +1,5 @@
#!/bin/bash
# omarchy:summary=Detect ASUS ExpertBook B9406 series laptops on Intel Panther Lake.
omarchy-hw-match "B9406" && omarchy-hw-intel-ptl
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Detect whether the computer is an Asus ROG machine. # omarchy:summary=Detect whether the computer is an Asus ROG machine.
[[ $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null) == "ASUSTeK COMPUTER INC." ]] && [[ $(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 grep -q "ROG" /sys/class/dmi/id/product_family 2>/dev/null
+7
View File
@@ -0,0 +1,7 @@
#!/bin/bash
# omarchy:summary=Match Dell XPS systems with LG OLED panel on Intel Panther Lake (Xe3) GPU.
omarchy-hw-match "XPS" \
&& omarchy-hw-intel-ptl \
&& test "$(od -An -tx1 -j8 -N2 /sys/class/drm/card*-eDP-*/edid 2>/dev/null | tr -d ' \n')" = "30e4"
+9
View File
@@ -0,0 +1,9 @@
#!/bin/bash
# omarchy:summary=Returns true when an external monitor is physically connected.
for status in /sys/class/drm/card*-*/status; do
[[ "$status" == *-eDP-*/status ]] && continue
[[ "$(<"$status")" == "connected" ]] && exit 0
done
exit 1
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Detect whether the computer is a Framework Laptop 16. # omarchy:summary=Detect whether the computer is a Framework Laptop 16.
[[ $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null) == "Framework" ]] && [[ $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null) == "Framework" ]] &&
omarchy-hw-match "Laptop 16" omarchy-hw-match "Laptop 16"
+9
View File
@@ -0,0 +1,9 @@
#!/bin/bash
# omarchy:summary=Detect whether the system has an active hybrid GPU configuration
if command -v supergfxctl &>/dev/null; then
supergfxctl -s 2>/dev/null | grep -qw Hybrid
else
(($(lspci | grep -cE 'VGA|3D|Display') >= 2))
fi
+1 -1
View File
@@ -1,5 +1,5 @@
#!/bin/bash #!/bin/bash
# Detect whether the computer has an Intel CPU. # omarchy:summary=Detect whether the computer has an Intel CPU.
[[ $(grep -m1 "vendor_id" /proc/cpuinfo 2>/dev/null | cut -d: -f2 | tr -d ' ') == "GenuineIntel" ]] [[ $(grep -m1 "vendor_id" /proc/cpuinfo 2>/dev/null | cut -d: -f2 | tr -d ' ') == "GenuineIntel" ]]
+1 -1
View File
@@ -1,5 +1,5 @@
#!/bin/bash #!/bin/bash
# Detect whether the computer has an Intel Panther Lake GPU. # omarchy:summary=Detect whether the computer has an Intel Panther Lake GPU.
lspci | grep -iE 'vga|3d|display' | grep -qi 'panther lake' lspci | grep -iE 'vga|3d|display' | grep -qi 'panther lake'
+4 -3
View File
@@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# Match against the computer's DMI product name (case-insensitive). # omarchy:summary=Match against the computer's DMI product name or product family (case-insensitive).
# Usage: omarchy-hw-match "XPS" # omarchy:args=<pattern>
grep -qi "$1" /sys/class/dmi/id/product_name 2>/dev/null grep -qi "$1" /sys/class/dmi/id/product_name 2>/dev/null ||
grep -qi "$1" /sys/class/dmi/id/product_family 2>/dev/null
+9
View File
@@ -0,0 +1,9 @@
#!/bin/bash
# omarchy:summary=Clear the internal-monitor-disable toggle if no external display is connected.
TOGGLE="$HOME/.local/state/omarchy/toggles/hypr/internal-monitor-disable.conf"
if [[ -f $TOGGLE ]] && ! omarchy-hw-external-monitors; then
rm -f "$TOGGLE"
fi
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Detect whether the computer is a Microsoft Surface device. # omarchy:summary=Detect whether the computer is a Microsoft Surface device.
[[ $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null) == "Microsoft Corporation" ]] && [[ $(cat /sys/class/dmi/id/sys_vendor 2>/dev/null) == "Microsoft Corporation" ]] &&
omarchy-hw-match "Surface" omarchy-hw-match "Surface"
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
# omarchy:summary=Print the detected Hyprland touchpad or trackpad device name
device=$(hyprctl devices -j | jq -r '[.mice[] | .name | select(test("touchpad|trackpad"; "i"))] | first // empty')
[[ -n $device ]] && echo "$device"
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
# omarchy:summary=Print the detected Hyprland touchscreen or tablet device name
device=$(hyprctl devices -j | jq -r '[.touch[]?.name, .tablets[]?.name] | first // empty')
[[ -n $device ]] && echo "$device"
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Detect whether Vulkan is available. # omarchy:summary=Detect whether Vulkan is available.
[[ -d /usr/share/vulkan/icd.d ]] && [[ -d /usr/share/vulkan/icd.d ]] &&
find /usr/share/vulkan/icd.d -maxdepth 1 -name "*.json" -print -quit | grep -q . find /usr/share/vulkan/icd.d -maxdepth 1 -name "*.json" -print -quit | grep -q .
@@ -1,5 +1,5 @@
#!/bin/bash #!/bin/bash
# Toggles transparency for the currently focused window. # omarchy:summary=Toggles transparency for the currently focused window.
hyprctl dispatch setprop "address:$(hyprctl activewindow -j | jq -r '.address')" opaque toggle hyprctl dispatch setprop "address:$(hyprctl activewindow -j | jq -r '.address')" opaque toggle
+5
View File
@@ -0,0 +1,5 @@
#!/bin/bash
# omarchy:summary=Print the name of the currently focused Hyprland monitor.
hyprctl monitors -j | jq -r '.[] | select(.focused == true).name'
+46
View File
@@ -0,0 +1,46 @@
#!/bin/bash
# omarchy:summary=Enable, disable, toggle, or recover the internal laptop display
# omarchy:args=<on|off|toggle|recover>
TOGGLE="internal-monitor-disable"
TOGGLE_FLAG="$HOME/.local/state/omarchy/toggles/hypr/$TOGGLE.conf"
MIRROR_TOGGLE="internal-monitor-mirror"
# Get internal monitor name dynamically
INTERNAL=$(hyprctl monitors -j | jq -r '.[] | select(.name | contains("eDP")).name' | head -n 1)
enable() {
if omarchy-hyprland-toggle-enabled "$TOGGLE"; then
omarchy-hyprland-toggle --disabled-notification "󰍹 Laptop display enabled" "$TOGGLE"
fi
}
disable() {
if ! omarchy-hw-external-monitors; then
notify-send -u low "󰍹 Can't disable the only active display"
exit 1
fi
if omarchy-hyprland-toggle-disabled "$TOGGLE" && omarchy-hyprland-toggle-disabled "$MIRROR_TOGGLE"; then
echo "monitor=$INTERNAL,disable" >"$TOGGLE_FLAG"
notify-send -u low "󰍹 Laptop display disabled"
hyprctl reload
fi
}
recover() {
if ! omarchy-hw-external-monitors && omarchy-hyprland-toggle-enabled "$TOGGLE"; then
omarchy-hyprland-toggle "$TOGGLE"
fi
}
case "$1" in
on) enable ;;
off) disable ;;
toggle) if omarchy-hyprland-toggle-enabled "$TOGGLE"; then enable; else disable; fi ;;
recover) recover ;;
*)
echo "Usage: $(basename "$0") {on|off|toggle|recover}" >&2
exit 1
;;
esac
+58
View File
@@ -0,0 +1,58 @@
#!/bin/bash
# omarchy:summary=Enable, disable, toggle, or recover mirroring the internal display to an external monitor
# omarchy:args=<on|off|toggle|recover>
TOGGLE="internal-monitor-mirror"
TOGGLE_FLAG="$HOME/.local/state/omarchy/toggles/hypr/$TOGGLE.conf"
DISABLE_TOGGLE="internal-monitor-disable"
# Get names dynamically
INTERNAL=$(hyprctl monitors -j | jq -r '.[] | select(.name | contains("eDP")).name' | head -n 1)
# Get the first available external monitor
EXTERNAL=$(hyprctl monitors -j | jq -r '.[] | select(.name | contains("eDP") | not).name' | head -n 1)
enable() {
if [[ -z "$EXTERNAL" ]]; then
notify-send -u low "󰍹 No external monitors found for mirror"
exit 1
fi
if [[ -z "$INTERNAL" ]]; then
notify-send -u low "󰍹 No laptop monitor found to mirror"
exit 1
fi
if omarchy-hyprland-toggle-enabled "$DISABLE_TOGGLE"; then
omarchy-hyprland-toggle "$DISABLE_TOGGLE"
fi
if omarchy-hyprland-toggle-disabled "$TOGGLE"; then
echo "monitor=$EXTERNAL, preferred, auto, 1, mirror, $INTERNAL" > "$TOGGLE_FLAG"
notify-send -u low "󰍹 Mirroring enabled ($EXTERNAL)"
hyprctl reload
fi
}
disable() {
if omarchy-hyprland-toggle-enabled "$TOGGLE"; then
omarchy-hyprland-toggle --disabled-notification "󰍹 Extended mode restored" "$TOGGLE"
fi
}
recover() {
if ! omarchy-hw-external-monitors && omarchy-hyprland-toggle-enabled "$TOGGLE"; then
omarchy-hyprland-toggle "$TOGGLE"
fi
}
case "$1" in
on) enable ;;
off) disable ;;
toggle) if omarchy-hyprland-toggle-enabled "$TOGGLE"; then disable; else enable; fi ;;
recover) recover ;;
*)
echo "Usage: $(basename "$0") {on|off|toggle|recover}" >&2
exit 1
;;
esac
+23 -11
View File
@@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# Get the active monitor (the one with the cursor) # omarchy:summary=Cycle scaling for the focused Hyprland monitor
MONITOR_INFO=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true)') MONITOR_INFO=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true)')
ACTIVE_MONITOR=$(echo "$MONITOR_INFO" | jq -r '.name') ACTIVE_MONITOR=$(echo "$MONITOR_INFO" | jq -r '.name')
CURRENT_SCALE=$(echo "$MONITOR_INFO" | jq -r '.scale') CURRENT_SCALE=$(echo "$MONITOR_INFO" | jq -r '.scale')
@@ -8,17 +9,28 @@ WIDTH=$(echo "$MONITOR_INFO" | jq -r '.width')
HEIGHT=$(echo "$MONITOR_INFO" | jq -r '.height') HEIGHT=$(echo "$MONITOR_INFO" | jq -r '.height')
REFRESH_RATE=$(echo "$MONITOR_INFO" | jq -r '.refreshRate') REFRESH_RATE=$(echo "$MONITOR_INFO" | jq -r '.refreshRate')
# Cycle through scales: 1 → 1.6 → 2 → 3 → 1 # Cycle through scales: 1 → 1.25 → 1.6 → 2 → 3 → 1 (or reverse with --reverse)
CURRENT_INT=$(awk -v s="$CURRENT_SCALE" 'BEGIN { printf "%.0f", s * 10 }') SCALES=(1 1.25 1.6 2 3)
case "$CURRENT_INT" in # Find the index of the scale closest to the current one (Hyprland may
10) NEW_SCALE=1.6 ;; # snap fractional scales to nearby values, so we can't match exactly)
16) NEW_SCALE=2 ;; CURRENT_IDX=$(awk -v s="$CURRENT_SCALE" -v list="${SCALES[*]}" 'BEGIN {
20) NEW_SCALE=3 ;; n = split(list, arr, " ")
*) NEW_SCALE=1 ;; best = 0; best_diff = 1e9
esac for (i = 1; i <= n; i++) {
d = s - arr[i]; if (d < 0) d = -d
if (d < best_diff) { best_diff = d; best = i - 1 }
}
print best
}')
if [[ "$1" == "--reverse" ]]; then
NEW_IDX=$(( (CURRENT_IDX - 1 + ${#SCALES[@]}) % ${#SCALES[@]} ))
else
NEW_IDX=$(( (CURRENT_IDX + 1) % ${#SCALES[@]} ))
fi
NEW_SCALE=${SCALES[$NEW_IDX]}
hyprctl keyword misc:disable_scale_notification true
hyprctl keyword monitor "$ACTIVE_MONITOR,${WIDTH}x${HEIGHT}@${REFRESH_RATE},auto,$NEW_SCALE" hyprctl keyword monitor "$ACTIVE_MONITOR,${WIDTH}x${HEIGHT}@${REFRESH_RATE},auto,$NEW_SCALE"
hyprctl keyword misc:disable_scale_notification false
notify-send -u low "󰍹 Display scaling set to ${NEW_SCALE}x" notify-send -u low "󰍹 Display scaling set to ${NEW_SCALE}x"
+14
View File
@@ -0,0 +1,14 @@
#!/bin/bash
# omarchy:summary=Watch Hyprland monitor events and recover monitor toggles when a monitor is removed
SOCKET="$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock"
socat -U - "UNIX-CONNECT:$SOCKET" | while read -r event; do
case "$event" in
monitorremoved\>\>*|monitorremovedv2\>\>*)
omarchy-hyprland-monitor-internal recover
omarchy-hyprland-monitor-internal-mirror recover
;;
esac
done
+32
View File
@@ -0,0 +1,32 @@
#!/bin/bash
# omarchy:summary=Toggle permanent Hyprland flags by copying them into a directory that's sourced entirely.
# omarchy:args=[--enabled-notification <text>] [--disabled-notification <text>] <flag-name>
ENABLED_NOTIFICATION=""
DISABLED_NOTIFICATION=""
while [[ $# -gt 1 ]]; do
case $1 in
--enabled-notification) ENABLED_NOTIFICATION="$2"; shift 2 ;;
--disabled-notification) DISABLED_NOTIFICATION="$2"; shift 2 ;;
*) break ;;
esac
done
FLAG_NAME="$1"
FLAG="$HOME/.local/state/omarchy/toggles/hypr/$FLAG_NAME.conf"
FLAG_SOURCE="$OMARCHY_PATH/default/hypr/toggles/$FLAG_NAME.conf"
if [[ -f $FLAG ]]; then
rm $FLAG
[[ -n $DISABLED_NOTIFICATION ]] && notify-send -u low "$DISABLED_NOTIFICATION"
elif [[ -f $FLAG_SOURCE ]]; then
cp $FLAG_SOURCE $FLAG
[[ -n $ENABLED_NOTIFICATION ]] && notify-send -u low "$ENABLED_NOTIFICATION"
else
echo "Flag not found: $FLAG_NAME"
exit 1
fi
hyprctl reload
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
# omarchy:summary=Check if a Hyprland toggle is currently disabled (missing).
# omarchy:args=<flag-name>
[[ ! -f "$HOME/.local/state/omarchy/toggles/hypr/$1.conf" ]]
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
# omarchy:summary=Check if a Hyprland toggle is currently enabled.
# omarchy:args=<flag-name>
[[ -f "$HOME/.local/state/omarchy/toggles/hypr/$1.conf" ]]
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# Close all open windows # omarchy:summary=Close all open windows
hyprctl clients -j | \ hyprctl clients -j | \
jq -r ".[].address" | \ jq -r ".[].address" | \
xargs -I{} hyprctl dispatch closewindow address:{} xargs -I{} hyprctl dispatch closewindow address:{}
+2 -12
View File
@@ -1,15 +1,5 @@
#!/bin/bash #!/bin/bash
# Toggles the window gaps globally between no gaps and the default 10/5/2. # omarchy:summary=Toggles the window gaps globally between no gaps and the default.
gaps=$(hyprctl getoption general:gaps_out -j | jq -r '.custom' | awk '{print $1}') omarchy-hyprland-toggle window-no-gaps
if [[ $gaps == "0" ]]; then
hyprctl keyword general:gaps_out 10
hyprctl keyword general:gaps_in 5
hyprctl keyword general:border_size 2
else
hyprctl keyword general:gaps_out 0
hyprctl keyword general:gaps_in 0
hyprctl keyword general:border_size 0
fi
+2 -14
View File
@@ -1,19 +1,7 @@
#!/bin/bash #!/bin/bash
# Toggle to pop-out a tile to stay fixed on a display basis. # omarchy:summary=Toggle to pop-out a tile to stay fixed on a display basis.
# omarchy:args=[width height x y]
# Usage:
# omarchy-hyprland-window-pop [width height [x y]]
#
# Arguments:
# width Optional. Width of the floating window. Default: 1300
# height Optional. Height of the floating window. Default: 900
# x Optional. X position of the window. Must provide both X and Y to take effect.
# y Optional. Y position of the window. Must provide both X and Y to take effect.
#
# Behavior:
# - If the window is already pinned, it will be unpinned and removed from the pop layer.
# - If the window is not pinned, it will be floated, resized, moved/centered, pinned, brought to top, and popped.
width=${1:-1300} width=${1:-1300}
height=${2:-900} height=${2:-900}
@@ -1,13 +1,8 @@
#!/bin/bash #!/bin/bash
# Check current single_window_aspect_ratio setting # omarchy:summary=Toggle single-window square aspect ratio.
CURRENT_VALUE=$(hyprctl getoption "layout:single_window_aspect_ratio" 2>/dev/null | head -1)
# Parse vec2 output: "vec2: [1, 1]" or "vec2: [0, 0]" omarchy-hyprland-toggle \
if [[ $CURRENT_VALUE == *"[1, 1]"* ]]; then --enabled-notification " Enable single-window square aspect ratio" \
hyprctl keyword layout:single_window_aspect_ratio "0 0" --disabled-notification " Disable single-window square aspect ratio" \
notify-send -u low " Disable single-window square aspect ratio" single-window-aspect-ratio
else
hyprctl keyword layout:single_window_aspect_ratio "1 1"
notify-send -u low " Enable single-window square aspect"
fi
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Toggle the layout on the current active workspace between dwindle and scrolling # omarchy:summary=Toggle the layout on the current active workspace between dwindle and scrolling
ACTIVE_WORKSPACE=$(hyprctl activeworkspace -j | jq -r '.id') ACTIVE_WORKSPACE=$(hyprctl activeworkspace -j | jq -r '.id')
CURRENT_LAYOUT=$(hyprctl activeworkspace -j | jq -r '.tiledLayout') CURRENT_LAYOUT=$(hyprctl activeworkspace -j | jq -r '.tiledLayout')
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash #!/bin/bash
# Allow Chromium to sign in to Google accounts by adding the correct # omarchy:summary=Allow Chromium to sign in to Google accounts by adding the required OAuth credentials
# oauth client id and secret to ~/.config/chromium-flags.conf.
if [[ -f ~/.config/chromium-flags.conf ]]; then if [[ -f ~/.config/chromium-flags.conf ]]; then
CONF=~/.config/chromium-flags.conf CONF=~/.config/chromium-flags.conf
+5 -1
View File
@@ -1,6 +1,10 @@
#!/bin/bash #!/bin/bash
# Install one of the supported development environments. Usually called via Install > Development > * in the Omarchy Menu. # omarchy:summary=Install a supported development environment
# omarchy:name=dev-env
# omarchy:args=<ruby|node|bun|deno|go|laravel|symfony|php|python|elixir|phoenix|rust|java|zig|ocaml|dotnet|clojure|scala>
# omarchy:examples=omarchy install dev-env ruby | omarchy install dev-env node
# omarchy:requires-sudo=true
if [[ -z $1 ]]; then if [[ -z $1 ]]; then
echo "Usage: omarchy-install-dev-env <ruby|node|bun|deno|go|laravel|symfony|php|python|elixir|phoenix|rust|java|zig|ocaml|dotnet|clojure|scala>" >&2 echo "Usage: omarchy-install-dev-env <ruby|node|bun|deno|go|laravel|symfony|php|python|elixir|phoenix|rust|java|zig|ocaml|dotnet|clojure|scala>" >&2
+2 -2
View File
@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Install one of the supported databases in a Docker container with the suitable development options. # omarchy:summary=Install one of the supported databases in a Docker container with the suitable development options.
# Usually called via Install > Development > Docker DB from the Omarchy Menu. # omarchy:requires-sudo=true
options=("MySQL" "PostgreSQL" "Redis" "MongoDB" "MariaDB" "MSSQL") options=("MySQL" "PostgreSQL" "Redis" "MongoDB" "MariaDB" "MSSQL")
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Install and start the Dropbox service. Must then be authenticated via the web. # omarchy:summary=Install and start the Dropbox service. Must then be authenticated via the web.
echo "Installing all dependencies..." echo "Installing all dependencies..."
omarchy-pkg-add dropbox dropbox-cli libappindicator-gtk3 python-gpgme nautilus-dropbox omarchy-pkg-add dropbox dropbox-cli libappindicator-gtk3 python-gpgme nautilus-dropbox
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Install and launch Geforce Now. # omarchy:summary=Install and launch Geforce Now.
set -e set -e
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# Install the NordVPN service with optional GUI. # omarchy:summary=Install the NordVPN service with optional GUI.
# omarchy:requires-sudo=true
echo "Installing NordVPN..." echo "Installing NordVPN..."
omarchy-pkg-aur-add nordvpn-bin omarchy-pkg-aur-add nordvpn-bin
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# Install the ONCE service, enable its background service, and launch the TUI. # omarchy:summary=Install the ONCE service, enable its background service, and launch the TUI.
# omarchy:requires-sudo=true
echo "Installing ONCE..." echo "Installing ONCE..."
omarchy-pkg-add once-bin omarchy-pkg-add once-bin
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# Install and launch Steam after first letting the user pick the correct grahics card drivers. # omarchy:summary=Install Steam and graphics drivers selected for this system
# omarchy:requires-sudo=true
set -e set -e
+5 -2
View File
@@ -1,10 +1,13 @@
#!/bin/bash #!/bin/bash
# Install the Tailscale mesh VPN service and a web app for the Tailscale Admin Console. # omarchy:summary=Install the Tailscale mesh VPN service and a web app for the Tailscale Admin Console.
# omarchy:requires-sudo=true
curl -fsSL https://tailscale.com/install.sh | sh echo -e "\nInstalling Tailscale..."
omarchy-pkg-add tailscale
echo -e "\nStarting Tailscale..." echo -e "\nStarting Tailscale..."
sudo systemctl enable --now tailscaled.service
sudo tailscale up --accept-routes sudo tailscale up --accept-routes
omarchy-webapp-install "Tailscale" "https://login.tailscale.com/admin/machines" https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/tailscale-light.png omarchy-webapp-install "Tailscale" "https://login.tailscale.com/admin/machines" https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/tailscale-light.png
+3 -1
View File
@@ -1,6 +1,8 @@
#!/bin/bash #!/bin/bash
# Install one of the approved terminals and set it as the default for Omarchy (Super + Return etc). # omarchy:summary=Install one of the approved terminals and set it as the default for Omarchy (Super + Return etc).
# omarchy:args=<alacritty|ghostty|kitty>
# omarchy:requires-sudo=true
if (($# == 0)); then if (($# == 0)); then
echo "Usage: omarchy-install-terminal [alacritty|ghostty|kitty]" echo "Usage: omarchy-install-terminal [alacritty|ghostty|kitty]"
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Install VSCode and configure it to use the gnome-libsecret password store, not to update automatically, and to use the current Omarchy theme. # omarchy:summary=Install VS Code and configure Omarchy defaults for secrets, updates, and theme
echo "Installing VSCode..." echo "Installing VSCode..."
omarchy-pkg-add visual-studio-code-bin omarchy-pkg-add visual-studio-code-bin
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# Install support for using Xbox controllers with Steam/RetroArch/etc. # omarchy:summary=Install support for using Xbox controllers with Steam/RetroArch/etc.
# omarchy:requires-sudo=true
set -e set -e
+1 -1
View File
@@ -1,5 +1,5 @@
#!/bin/bash #!/bin/bash
# Launch the fastfetch TUI that gives information about the current system. # omarchy:summary=Launch the fastfetch TUI that gives information about the current system.
exec omarchy-launch-or-focus-tui "bash -c 'fastfetch; read -n 1 -s'" exec omarchy-launch-or-focus-tui "bash -c 'fastfetch; read -n 1 -s'"
+1 -1
View File
@@ -1,5 +1,5 @@
#!/bin/bash #!/bin/bash
# Launch the Omarchy audio controls TUI (provided by wiremix). # omarchy:summary=Launch the Omarchy audio controls TUI (provided by wiremix).
omarchy-launch-or-focus-tui wiremix omarchy-launch-or-focus-tui wiremix
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash #!/bin/bash
# Launch the Omarchy bluetooth controls TUI (provided by bluetui). # omarchy:summary=Launch the Omarchy bluetooth controls TUI (provided by bluetui).
# Also attempts to unblock bluetooth service if rfkill had blocked it.
rfkill unblock bluetooth rfkill unblock bluetooth
exec omarchy-launch-or-focus-tui bluetui exec omarchy-launch-or-focus-tui bluetui
+2 -2
View File
@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Launch the default browser as determined by xdg-settings. # omarchy:summary=Launch the default browser as determined by xdg-settings.
# Automatically converts --private into the correct flag for the given browser. # omarchy:args=[url]
default_browser=$(xdg-settings get default-web-browser) default_browser=$(xdg-settings get default-web-browser)
browser_exec=$(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,~/.nix-profile,/usr}/share/applications/$default_browser 2>/dev/null | head -1) browser_exec=$(sed -n 's/^Exec=\([^ ]*\).*/\1/p' {~/.local,~/.nix-profile,/usr}/share/applications/$default_browser 2>/dev/null | head -1)
+2 -2
View File
@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Launch the default editor as determined by $EDITOR (set via ~/.config/uwsm/default) (or nvim if missing). # omarchy:summary=Launch the default editor as determined by $EDITOR (set via ~/.config/uwsm/default) (or nvim if missing).
# Starts suitable editors in a terminal window and otherwise as a regular application. # omarchy:args=<path>
omarchy-cmd-present "$EDITOR" || EDITOR=nvim omarchy-cmd-present "$EDITOR" || EDITOR=nvim
@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Launch a floating terminal with the Omarchy logo presentation, then execute the command passed in, and finally end with the omarchy-show-done presentation. # omarchy:summary=Launch a floating terminal with the Omarchy presentation wrapper
# Used by actions such as Update System. # omarchy:args=<command>
cmd="$*" cmd="$*"
exec setsid uwsm-app -- xdg-terminal-exec --app-id=org.omarchy.terminal --title=Omarchy -e bash -c "omarchy-show-logo; $cmd; if (( \$? != 130 )); then omarchy-show-done; fi" exec setsid uwsm-app -- xdg-terminal-exec --app-id=org.omarchy.terminal --title=Omarchy -e bash -c "omarchy-show-logo; $cmd; if (( \$? != 130 )); then omarchy-show-done; fi"
+2 -2
View File
@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Launch or focus on a given command identified by the passed in window-pattern. # omarchy:summary=Launch an app or focus an existing window matching a pattern
# Use by some default bindings, like the one for Spotify, to ensure there is only one instance of the application open. # omarchy:args=<window-pattern> <launch-command>
if (($# == 0)); then if (($# == 0)); then
echo "Usage: omarchy-launch-or-focus [window-pattern] [launch-command]" echo "Usage: omarchy-launch-or-focus [window-pattern] [launch-command]"
+2 -2
View File
@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Launch or focus on a given TUI identified by the passed in as the command. # omarchy:summary=Launch a TUI or focus an existing terminal window for it
# Use by commands like omarchy-launch-wifi to ensure there is only one wifi configuration screen open. # omarchy:args=<command> [args...]
APP_ID="org.omarchy.$(basename "$1")" APP_ID="org.omarchy.$(basename "$1")"
LAUNCH_COMMAND="omarchy-launch-tui $@" LAUNCH_COMMAND="omarchy-launch-tui $@"
+2 -2
View File
@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Launch or focus on a given web app identified by the window-pattern. # omarchy:summary=Launch or focus on a given web app identified by the window-pattern.
# Use by some default bindings, like the one for WhatsApp, to ensure there is only one instance of the application open. # omarchy:args=<window-pattern> <url-and-flags...>
if (($# == 0)); then if (($# == 0)); then
echo "Usage: omarchy-launch-or-focus-webapp [window-pattern] [url-and-flags...]" echo "Usage: omarchy-launch-or-focus-webapp [window-pattern] [url-and-flags...]"
+6 -7
View File
@@ -1,8 +1,7 @@
#!/bin/bash #!/bin/bash
# Launch the Omarchy screensaver in the default terminal on the system with the correct font configuration. # omarchy:summary=Launch the Omarchy screensaver in the default terminal on the system with the correct font configuration.
# Exit early if we don't have the tte show
if ! command -v tte &>/dev/null; then if ! command -v tte &>/dev/null; then
exit 1 exit 1
fi fi
@@ -11,14 +10,14 @@ fi
pgrep -f org.omarchy.screensaver && exit 0 pgrep -f org.omarchy.screensaver && exit 0
# Allow screensaver to be turned off but also force started # Allow screensaver to be turned off but also force started
if [[ -f ~/.local/state/omarchy/toggles/screensaver-off ]] && [[ $1 != "force" ]]; then if omarchy-toggle-enabled screensaver-off && [[ $1 != "force" ]]; then
exit 1 exit 1
fi fi
# Silently quit Walker on overlay # Silently quit Walker on overlay
walker -q walker -q
focused=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true).name') focused=$(omarchy-hyprland-monitor-focused)
terminal=$(xdg-terminal-exec --print-id) terminal=$(xdg-terminal-exec --print-id)
for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do
@@ -29,21 +28,21 @@ for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do
hyprctl dispatch exec -- \ hyprctl dispatch exec -- \
alacritty --class=org.omarchy.screensaver \ alacritty --class=org.omarchy.screensaver \
--config-file ~/.local/share/omarchy/default/alacritty/screensaver.toml \ --config-file ~/.local/share/omarchy/default/alacritty/screensaver.toml \
-e omarchy-cmd-screensaver -e omarchy-screensaver
;; ;;
*ghostty*) *ghostty*)
hyprctl dispatch exec -- \ hyprctl dispatch exec -- \
ghostty --class=org.omarchy.screensaver \ ghostty --class=org.omarchy.screensaver \
--config-file=~/.local/share/omarchy/default/ghostty/screensaver \ --config-file=~/.local/share/omarchy/default/ghostty/screensaver \
--font-size=18 \ --font-size=18 \
-e omarchy-cmd-screensaver -e omarchy-screensaver
;; ;;
*kitty*) *kitty*)
hyprctl dispatch exec -- \ hyprctl dispatch exec -- \
kitty --class=org.omarchy.screensaver \ kitty --class=org.omarchy.screensaver \
--override font_size=18 \ --override font_size=18 \
--override window_padding_width=0 \ --override window_padding_width=0 \
-e omarchy-cmd-screensaver -e omarchy-screensaver
;; ;;
*) *)
notify-send -u low "✋ Screensaver only runs in Alacritty, Ghostty, or Kitty" notify-send -u low "✋ Screensaver only runs in Alacritty, Ghostty, or Kitty"
+2 -1
View File
@@ -1,5 +1,6 @@
#!/bin/bash #!/bin/bash
# Launch the TUI command passed in as an argument in the default terminal with an org.omarchy.COMMAND app id for styling. # omarchy:summary=Launch a TUI command in the default terminal with Omarchy styling
# omarchy:args=<command> [args...]
exec setsid uwsm-app -- xdg-terminal-exec --app-id=org.omarchy.$(basename $1) -e "$1" "${@:2}" exec setsid uwsm-app -- xdg-terminal-exec --app-id=org.omarchy.$(basename $1) -e "$1" "${@:2}"
+2 -3
View File
@@ -1,15 +1,14 @@
#!/bin/bash #!/bin/bash
# Launch the Walker application launcher while ensuring that it's data provider (called elephant) is running first. # omarchy:summary=Launch Walker and ensure its Elephant data provider is running
# Ensure elephant is running before launching walker
if ! pgrep -x elephant > /dev/null; then if ! pgrep -x elephant > /dev/null; then
setsid uwsm-app -- elephant & setsid uwsm-app -- elephant &
fi fi
# Ensure walker service is running # Ensure walker service is running
if ! pgrep -f "walker --gapplication-service" > /dev/null; then if ! pgrep -f "walker --gapplication-service" > /dev/null; then
setsid uwsm-app -- walker --gapplication-service & setsid uwsm-app -- env GSK_RENDERER=cairo walker --gapplication-service &
fi fi
exec walker --width 644 --maxheight 300 --minheight 300 "$@" exec walker --width 644 --maxheight 300 --minheight 300 "$@"
+3 -2
View File
@@ -1,11 +1,12 @@
#!/bin/bash #!/bin/bash
# Launch the passed in URL as a web app in the default browser (or chromium if the default doesn't support --app). # omarchy:summary=Launch a URL as a web app in the default supported browser
# omarchy:args=<url>
browser=$(xdg-settings get default-web-browser) browser=$(xdg-settings get default-web-browser)
case $browser in case $browser in
google-chrome* | brave-browser* | microsoft-edge* | opera* | vivaldi* | helium*) ;; google-chrome* | brave* | microsoft-edge* | opera* | vivaldi* | helium*) ;;
*) browser="chromium.desktop" ;; *) browser="chromium.desktop" ;;
esac esac
+1 -2
View File
@@ -1,7 +1,6 @@
#!/bin/bash #!/bin/bash
# Launch the Omarchy wifi controls (provided by the Impala TUI). # omarchy:summary=Launch the Omarchy wifi controls (provided by the Impala TUI).
# Attempts to unblock the wifi service first in case it should be been blocked.
rfkill unblock wifi rfkill unblock wifi
omarchy-launch-or-focus-tui impala omarchy-launch-or-focus-tui impala
+46 -25
View File
@@ -1,8 +1,6 @@
#!/bin/bash #!/bin/bash
# Launch the Omarchy Menu or takes a parameter to jump straight to a submenu. # omarchy:summary=Launch the Omarchy Menu or takes a parameter to jump straight to a submenu.
export PATH="$HOME/.local/share/omarchy/bin:$PATH"
# Set to true when going directly to a submenu, so we can exit directly # Set to true when going directly to a submenu, so we can exit directly
BACK_TO_EXIT=false BACK_TO_EXIT=false
@@ -106,7 +104,7 @@ show_trigger_menu() {
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*) omarchy-cmd-screenshot ;; *Screenshot*) omarchy-capture-screenshot ;;
*Screenrecord*) show_screenrecord_menu ;; *Screenrecord*) show_screenrecord_menu ;;
*Color*) pkill hyprpicker || hyprpicker -a ;; *Color*) pkill hyprpicker || hyprpicker -a ;;
*) back_to show_trigger_menu ;; *) back_to show_trigger_menu ;;
@@ -141,18 +139,18 @@ show_webcam_select_menu() {
} }
show_screenrecord_menu() { show_screenrecord_menu() {
omarchy-cmd-screenrecord --stop-recording && exit 0 omarchy-capture-screenrecording --stop-recording && exit 0
case $(menu "Screenrecord" " With no audio\n With desktop audio\n With desktop + microphone audio\n With desktop + microphone audio + webcam") in case $(menu "Screenrecord" " With no audio\n With desktop audio\n With desktop + microphone audio\n With desktop + microphone audio + webcam") in
*"With no audio") omarchy-cmd-screenrecord ;; *"With no audio") omarchy-capture-screenrecording ;;
*"With desktop audio") omarchy-cmd-screenrecord --with-desktop-audio ;; *"With desktop audio") omarchy-capture-screenrecording --with-desktop-audio ;;
*"With desktop + microphone audio") omarchy-cmd-screenrecord --with-desktop-audio --with-microphone-audio ;; *"With desktop + microphone audio") omarchy-capture-screenrecording --with-desktop-audio --with-microphone-audio ;;
*"With desktop + microphone audio + webcam") *"With desktop + microphone audio + webcam")
local device=$(show_webcam_select_menu) || { local device=$(show_webcam_select_menu) || {
back_to show_capture_menu back_to show_capture_menu
return return
} }
omarchy-cmd-screenrecord --with-desktop-audio --with-microphone-audio --with-webcam --webcam-device="$device" omarchy-capture-screenrecording --with-desktop-audio --with-microphone-audio --with-webcam --webcam-device="$device"
;; ;;
*) back_to show_capture_menu ;; *) back_to show_capture_menu ;;
esac esac
@@ -160,16 +158,17 @@ show_screenrecord_menu() {
show_share_menu() { show_share_menu() {
case $(menu "Share" " Clipboard\n File \n Folder") in case $(menu "Share" " Clipboard\n File \n Folder") in
*Clipboard*) omarchy-cmd-share clipboard ;; *Clipboard*) omarchy-menu-share clipboard ;;
*File*) terminal bash -c "omarchy-cmd-share file" ;; *File*) terminal bash -c "omarchy-menu-share file" ;;
*Folder*) terminal bash -c "omarchy-cmd-share folder" ;; *Folder*) terminal bash -c "omarchy-menu-share folder" ;;
*) back_to show_trigger_menu ;; *) back_to show_trigger_menu ;;
esac esac
} }
show_toggle_menu() { show_toggle_menu() {
case $(menu "Toggle" "󱄄 Screensaver\n󰔎 Nightlight\n󱫖 Idle Lock\n󰍜 Top Bar\n󱂬 Workspace Layout\n Window Gaps\n 1-Window Ratio\n󰍹 Display Scaling") in local options="󱄄 Screensaver\n󰔎 Nightlight\n󱫖 Idle Lock\n󰍜 Top Bar\n󱂬 Workspace Layout\n Window Gaps\n 1-Window Ratio\n󰍹 Monitor Scaling\n Direct Boot\n󰟵 Passwordless Sudo"
case $(menu "Toggle" "$options") in
*Screensaver*) omarchy-toggle-screensaver ;; *Screensaver*) omarchy-toggle-screensaver ;;
*Nightlight*) omarchy-toggle-nightlight ;; *Nightlight*) omarchy-toggle-nightlight ;;
*Idle*) omarchy-toggle-idle ;; *Idle*) omarchy-toggle-idle ;;
@@ -178,20 +177,41 @@ show_toggle_menu() {
*Ratio*) omarchy-hyprland-window-single-square-aspect-toggle ;; *Ratio*) omarchy-hyprland-window-single-square-aspect-toggle ;;
*Gaps*) omarchy-hyprland-window-gaps-toggle ;; *Gaps*) omarchy-hyprland-window-gaps-toggle ;;
*Scaling*) omarchy-hyprland-monitor-scaling-cycle ;; *Scaling*) omarchy-hyprland-monitor-scaling-cycle ;;
*"Direct Boot"*) present_terminal omarchy-config-direct-boot ;;
*"Passwordless Sudo"*) present_terminal omarchy-sudo-passwordless ;;
*) back_to show_trigger_menu ;; *) back_to show_trigger_menu ;;
esac esac
} }
show_hardware_menu() { show_hardware_menu() {
case $(menu "Toggle" " Hybrid GPU") in local options="󰛧 Laptop Display\n 󰍹 Mirror Display"
if omarchy-hw-hybrid-gpu; then
options="$options\n Hybrid GPU"
fi
if omarchy-hw-touchpad; then
options="$options\n󰟸 Touchpad"
fi
if omarchy-hw-touchscreen; then
options="$options\n󰆽 Touchscreen"
fi
case $(menu "Toggle" "$options") in
*Laptop*) omarchy-hyprland-monitor-internal toggle ;;
*Mirror*) omarchy-hyprland-monitor-internal-mirror toggle;;
*Touchpad*) omarchy-toggle-touchpad ;;
*Touchscreen*) omarchy-toggle-touchscreen ;;
*"Hybrid GPU"*) present_terminal omarchy-toggle-hybrid-gpu ;; *"Hybrid GPU"*) present_terminal omarchy-toggle-hybrid-gpu ;;
*) show_trigger_menu ;; *) back_to show_trigger_menu ;;
esac 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󰟵 Unlock\n Font\n Background\n Hyprland\n󱄄 Screensaver\n About") in
*Theme*) show_theme_menu ;; *Theme*) show_theme_menu ;;
*Unlock*) omarchy-launch-walker -m menus:omarchyunlocks --width 800 --minheight 400 ;;
*Font*) show_font_menu ;; *Font*) show_font_menu ;;
*Background*) show_background_menu ;; *Background*) show_background_menu ;;
*Hyprland*) open_in_editor ~/.config/hypr/looknfeel.conf ;; *Hyprland*) open_in_editor ~/.config/hypr/looknfeel.conf ;;
@@ -221,7 +241,6 @@ show_font_menu() {
show_setup_menu() { show_setup_menu() {
local options=" Audio\n Wifi\n󰂯 Bluetooth\n󱐋 Power Profile\n System Sleep\n󰍹 Monitors" local options=" Audio\n Wifi\n󰂯 Bluetooth\n󱐋 Power Profile\n System Sleep\n󰍹 Monitors"
[[ -f ~/.config/hypr/bindings.conf ]] && options="$options\n Keybindings" [[ -f ~/.config/hypr/bindings.conf ]] && options="$options\n Keybindings"
options="$options\n Key Remapping"
[[ -f ~/.config/hypr/input.conf ]] && options="$options\n Input" [[ -f ~/.config/hypr/input.conf ]] && options="$options\n Input"
options="$options\n󰱔 DNS\n Security\n Config" options="$options\n󰱔 DNS\n Security\n Config"
@@ -234,7 +253,6 @@ show_setup_menu() {
*Monitors*) open_in_editor ~/.config/hypr/monitors.conf ;; *Monitors*) open_in_editor ~/.config/hypr/monitors.conf ;;
*Keybindings*) open_in_editor ~/.config/hypr/bindings.conf ;; *Keybindings*) open_in_editor ~/.config/hypr/bindings.conf ;;
*Input*) open_in_editor ~/.config/hypr/input.conf ;; *Input*) open_in_editor ~/.config/hypr/input.conf ;;
*Key\ Remapping*) omarchy-setup-makima && open_in_editor "$HOME/.config/makima/AT Translated Set 2 keyboard.toml" && omarchy-restart-makima ;;
*DNS*) present_terminal omarchy-setup-dns ;; *DNS*) present_terminal omarchy-setup-dns ;;
*Security*) show_setup_security_menu ;; *Security*) show_setup_security_menu ;;
*Config*) show_setup_config_menu ;; *Config*) show_setup_config_menu ;;
@@ -278,7 +296,7 @@ show_setup_config_menu() {
show_setup_system_menu() { show_setup_system_menu() {
local options="" local options=""
if [[ -f ~/.local/state/omarchy/toggles/suspend-off ]]; then if omarchy-toggle-enabled suspend-off; then
options="$options󰒲 Enable Suspend" options="$options󰒲 Enable Suspend"
else else
options="$options󰒲 Disable Suspend" options="$options󰒲 Disable Suspend"
@@ -351,8 +369,8 @@ show_install_terminal_menu() {
show_install_ai_menu() { show_install_ai_menu() {
ollama_pkg=$( ollama_pkg=$(
(command -v nvidia-smi &>/dev/null && echo ollama-cuda) || (omarchy-cmd-present nvidia-smi && echo ollama-cuda) ||
(command -v rocminfo &>/dev/null && echo ollama-rocm) || (omarchy-cmd-present rocminfo && echo ollama-rocm) ||
echo ollama echo ollama
) )
@@ -530,9 +548,10 @@ show_update_channel_menu() {
esac esac
} }
show_update_process_menu() { show_update_process_menu() {
case $(menu "Restart" " Hypridle\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar") in case $(menu "Restart" " Hypridle\n Hyprsunset\n󰎟 Mako\n Swayosd\n󰌧 Walker\n󰍜 Waybar") in
*Hypridle*) omarchy-restart-hypridle ;; *Hypridle*) omarchy-restart-hypridle ;;
*Hyprsunset*) omarchy-restart-hyprsunset ;; *Hyprsunset*) omarchy-restart-hyprsunset ;;
*Mako*) omarchy-restart-mako ;;
*Swayosd*) omarchy-restart-swayosd ;; *Swayosd*) omarchy-restart-swayosd ;;
*Walker*) omarchy-restart-walker ;; *Walker*) omarchy-restart-walker ;;
*Waybar*) omarchy-restart-waybar ;; *Waybar*) omarchy-restart-waybar ;;
@@ -556,10 +575,11 @@ show_update_config_menu() {
} }
show_update_hardware_menu() { show_update_hardware_menu() {
case $(menu "Restart" " Audio\n󱚾 Wi-Fi\n󰂯 Bluetooth") in case $(menu "Restart" " Audio\n󱚾 Wi-Fi\n󰂯 Bluetooth\n󰟸 Trackpad") in
*Audio*) present_terminal omarchy-restart-pipewire ;; *Audio*) present_terminal omarchy-restart-pipewire ;;
*Wi-Fi*) present_terminal omarchy-restart-wifi ;; *Wi-Fi*) present_terminal omarchy-restart-wifi ;;
*Bluetooth*) present_terminal omarchy-restart-bluetooth ;; *Bluetooth*) present_terminal omarchy-restart-bluetooth ;;
*Trackpad*) present_terminal omarchy-restart-trackpad ;;
*) show_update_menu ;; *) show_update_menu ;;
esac esac
} }
@@ -578,13 +598,13 @@ show_about() {
show_system_menu() { show_system_menu() {
local options="󱄄 Screensaver\n Lock" local options="󱄄 Screensaver\n Lock"
[[ ! -f ~/.local/state/omarchy/toggles/suspend-off ]] && options="$options\n󰒲 Suspend" ! omarchy-toggle-enabled suspend-off && options="$options\n󰒲 Suspend"
omarchy-hibernation-available && options="$options\n󰤁 Hibernate" omarchy-hibernation-available && options="$options\n󰤁 Hibernate"
options="$options\n󰍃 Logout\n󰜉 Restart\n󰐥 Shutdown" options="$options\n󰍃 Logout\n󰜉 Restart\n󰐥 Shutdown"
case $(menu "System" "$options") in case $(menu "System" "$options") in
*Screensaver*) omarchy-launch-screensaver force ;; *Screensaver*) omarchy-launch-screensaver force ;;
*Lock*) omarchy-lock-screen ;; *Lock*) omarchy-system-lock ;;
*Suspend*) systemctl suspend ;; *Suspend*) systemctl suspend ;;
*Hibernate*) systemctl hibernate ;; *Hibernate*) systemctl hibernate ;;
*Logout*) omarchy-system-logout ;; *Logout*) omarchy-system-logout ;;
@@ -604,6 +624,7 @@ go_to_menu() {
*learn*) show_learn_menu ;; *learn*) show_learn_menu ;;
*trigger*) show_trigger_menu ;; *trigger*) show_trigger_menu ;;
*toggle*) show_toggle_menu ;; *toggle*) show_toggle_menu ;;
*hardware*) show_hardware_menu ;;
*share*) show_share_menu ;; *share*) show_share_menu ;;
*background*) show_background_menu ;; *background*) show_background_menu ;;
*capture*) show_capture_menu ;; *capture*) show_capture_menu ;;
+8 -4
View File
@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
# Display Hyprland keybindings defined in your configuration using walker for an interactive search menu. # omarchy:summary=Display Hyprland keybindings defined in your configuration using walker for an interactive search menu.
declare -A KEYCODE_SYM_MAP declare -A KEYCODE_SYM_MAP
@@ -46,8 +46,12 @@ parse_keycodes() {
while IFS= read -r line; do while IFS= read -r line; do
if [[ $line =~ code:([0-9]+) ]]; then if [[ $line =~ code:([0-9]+) ]]; then
code="${BASH_REMATCH[1]}" code="${BASH_REMATCH[1]}"
symbol=$(lookup_keycode_cached "$code" "$XKB_KEYMAP_CACHE") if [[ $code == "201" ]]; then
echo "${line/code:${code}/$symbol}" echo "${line/SUPER SHIFT,code:201/,COPILOT KEY}"
else
symbol=$(lookup_keycode_cached "$code" "$XKB_KEYMAP_CACHE")
echo "${line/code:${code}/$symbol}"
fi
elif [[ $line =~ mouse:([0-9]+) ]]; then elif [[ $line =~ mouse:([0-9]+) ]]; then
code="${BASH_REMATCH[1]}" code="${BASH_REMATCH[1]}"
@@ -198,7 +202,7 @@ prioritize_entries() {
if (match(line, /Move window to workspace/)) prio = 28 if (match(line, /Move window to workspace/)) prio = 28
if (match(line, /Move window silently to workspace/)) prio = 29 if (match(line, /Move window silently to workspace/)) prio = 29
if (match(line, /Swap window/)) prio = 30 if (match(line, /Swap window/)) prio = 30
if (match(line, /Move window focus/)) prio = 31 if (match(line, /Focus/)) prio = 31
if (match(line, /Move window$/)) prio = 32 if (match(line, /Move window$/)) prio = 32
if (match(line, /Resize window/)) prio = 33 if (match(line, /Resize window/)) prio = 33
if (match(line, /Expand window/)) prio = 34 if (match(line, /Expand window/)) prio = 34
@@ -1,9 +1,13 @@
#!/bin/bash #!/bin/bash
# Share clipboard, file, or folder using LocalSend. Bound to Super + Ctrl + S by default. # omarchy:summary=Share clipboard, files, or folders with LocalSend
# omarchy:group=share
# omarchy:name=
# omarchy:args=<clipboard|file|folder> [path...]
# omarchy:examples=omarchy share clipboard | omarchy share file ~/Downloads/example.txt
if (($# == 0)); then if (($# == 0)); then
echo "Usage: omarchy-cmd-share [clipboard|file|folder]" echo "Usage: omarchy-menu-share [clipboard|file|folder]"
exit 1 exit 1
fi fi
+2 -3
View File
@@ -1,8 +1,7 @@
#!/bin/bash #!/bin/bash
# Run all pending migrations to bring the system in line with the installed version. # omarchy:summary=Run all pending migrations to bring the system in line with the installed version.
# Where we store an empty file for each migration that has already been performed.
STATE_DIR="$HOME/.local/state/omarchy/migrations" STATE_DIR="$HOME/.local/state/omarchy/migrations"
mkdir -p "$STATE_DIR" mkdir -p "$STATE_DIR"
@@ -10,7 +9,7 @@ mkdir -p "$STATE_DIR"
mkdir -p "$STATE_DIR/skipped" mkdir -p "$STATE_DIR/skipped"
# Run any pending migrations # Run any pending migrations
for file in ~/.local/share/omarchy/migrations/*.sh; do for file in $OMARCHY_PATH/migrations/*.sh; do
filename=$(basename "$file") filename=$(basename "$file")
if [[ ! -f $STATE_DIR/$filename && ! -f $STATE_DIR/skipped/$filename ]]; then if [[ ! -f $STATE_DIR/$filename && ! -f $STATE_DIR/skipped/$filename ]]; then

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