Compare commits

..
90 Commits
Author SHA1 Message Date
Ryan Hughes a3aedb0c4d Version bump 2026-05-04 19:46:42 -04:00
Ryan Hughes 0a5cd43aac Add migration to handle lingering panel_replay addition 2026-05-04 19:46:00 -04:00
David Heinemeier HanssonandGitHub 9aa3858794 Merge pull request #5467 from basecamp/rc
Omarchy 3.7.0
2026-05-04 15:44:57 +02:00
David Heinemeier Hansson 648d8339d2 Merge branch 'dev' into rc 2026-05-04 15:42:37 +02:00
David Heinemeier Hansson 7138044bd2 Merge branch 'dev' into rc 2026-05-04 15:33:23 +02:00
David Heinemeier Hansson 86a38c4a98 Merge branch 'dev' into rc 2026-05-04 14:43:07 +02:00
David Heinemeier Hansson 516882a43c Merge branch 'dev' into rc 2026-05-04 13:57:18 +02:00
David Heinemeier Hansson e3d3ee4044 Merge branch 'dev' into rc 2026-05-04 13:23:37 +02:00
David Heinemeier Hansson 48a771bdac Merge branch 'dev' into rc 2026-05-04 12:38:16 +02:00
David Heinemeier Hansson 03750b31c1 Merge branch 'dev' into rc 2026-05-04 12:23:41 +02:00
David Heinemeier Hansson a6280eed26 Merge branch 'dev' into rc 2026-05-04 11:36:24 +02:00
David Heinemeier Hansson f4a0249ff3 Merge branch 'dev' into rc 2026-05-04 11:18:30 +02:00
David Heinemeier Hansson 011243f4fa Merge branch 'dev' into rc 2026-05-04 10:52:16 +02:00
David Heinemeier Hansson e7f45386d4 Merge branch 'dev' into rc 2026-05-04 10:38:50 +02:00
David Heinemeier Hansson cb3fcf4f60 Merge branch 'dev' into rc 2026-05-04 07:55:06 +02:00
David Heinemeier Hansson d7e3c0dcde Merge branch 'dev' into rc 2026-05-03 22:53:51 +02:00
David Heinemeier Hansson 0edff316da Merge branch 'dev' into rc 2026-05-03 22:02:43 +02:00
David Heinemeier Hansson 774acbf5af Merge branch 'dev' into rc 2026-05-03 19:38:02 +02:00
David Heinemeier Hansson fddaa5e869 Merge branch 'dev' into rc 2026-05-03 13:42:26 +02:00
David Heinemeier Hansson f1a4e9f6e8 Merge branch 'dev' into rc 2026-05-03 13:38:42 +02:00
David Heinemeier Hansson 5cf34963d7 Merge branch 'dev' into rc 2026-05-03 12:47:41 +02:00
David Heinemeier Hansson d40e314d4f Merge branch 'dev' into rc 2026-05-03 12:05:52 +02:00
David Heinemeier Hansson dc249dba95 Merge branch 'dev' into rc 2026-05-03 11:57:19 +02:00
David Heinemeier Hansson 4a7ade9c52 Merge branch 'dev' into rc 2026-05-02 16:43:10 +02:00
David Heinemeier Hansson 06fd369318 Merge branch 'dev' into rc 2026-05-02 14:47:48 +02:00
David Heinemeier Hansson ea7979a057 No quoting needed for bash 5 2026-05-02 13:47:55 +02:00
David Heinemeier Hansson 60966d4553 Merge branch 'dev' into rc 2026-05-02 13:34:38 +02:00
David Heinemeier Hansson 211acd6f9f Merge branch 'dev' into rc 2026-05-02 12:13:33 +02:00
David Heinemeier Hansson 1351cc6442 Merge branch 'dev' into rc 2026-05-02 11:47:54 +02:00
Ryan HughesandGitHub 59b16e7f0f Merge pull request #5541 from dotsilva/dev
fix: "Bistream" typo to "Bitstream"
2026-05-01 23:30:20 -04:00
Bruno da Silva ff23d01fce FIX: Bistream typo to Bitstream in three places 2026-05-01 21:24:41 -03:00
David Heinemeier Hansson a4ab555516 Merge branch 'dev' into rc 2026-05-01 18:33:06 +02:00
David Heinemeier Hansson 1eaddf97ea Quiet down so we don't get useless output spam 2026-05-01 18:27:20 +02:00
David Heinemeier Hansson 8537f41a9d Merge branch 'dev' into rc 2026-05-01 18:22:57 +02:00
David Heinemeier Hansson cf16a6a1a6 Merge branch 'dev' into rc 2026-05-01 14:15:08 +02:00
David Heinemeier Hansson 3d9a875104 Merge branch 'dev' into rc 2026-05-01 11:27:23 +02:00
David Heinemeier Hansson 0b35365f6b Merge branch 'dev' into rc 2026-05-01 11:24:23 +02:00
David Heinemeier Hansson 58c350c171 Merge branch 'dev' into rc 2026-04-30 22:23:48 +02:00
David Heinemeier Hansson efd34a2eea Merge branch 'dev' into rc 2026-04-30 21:45:16 +02:00
David Heinemeier Hansson 0c972657c2 Merge branch 'dev' into rc 2026-04-30 18:32:37 +02:00
David Heinemeier Hansson fa5d054173 Merge branch 'dev' into rc 2026-04-30 18:07:02 +02:00
David Heinemeier Hansson cd7c38c8aa Merge branch 'dev' into rc 2026-04-30 09:40:17 +02:00
David Heinemeier Hansson 9eb0f0e805 Merge branch 'dev' into rc 2026-04-29 20:19:48 +02:00
David Heinemeier Hansson b77f900420 Merge branch 'dev' into rc 2026-04-29 15:49:48 +02:00
David Heinemeier Hansson 1770494fa2 Merge branch 'dev' into rc 2026-04-29 11:23:41 +02:00
David Heinemeier Hansson 53d073da7c Merge branch 'dev' into rc 2026-04-28 09:37:27 +02:00
David Heinemeier Hansson 2fab15c0a7 Merge branch 'dev' into rc 2026-04-27 15:00:25 +02:00
David Heinemeier Hansson 4127c749fb Proper fix for using device dark mode in Chrome 2026-04-24 10:16:31 +02:00
David Heinemeier HanssonandGitHub bc9777c0b8 Merge pull request #5388 from basecamp/rc
Omarchy 3.6.0
2026-04-23 15:12:57 +02:00
David Heinemeier Hansson add6a3c506 Merge branch 'dev' into rc 2026-04-23 14:39:27 +02:00
David Heinemeier Hansson 7dc086bb47 Merge branch 'dev' into rc 2026-04-23 13:03:33 +02:00
David Heinemeier Hansson 8346eea614 Merge branch 'dev' into rc 2026-04-23 12:48:31 +02:00
David Heinemeier Hansson 1abc92aadd Merge branch 'dev' into rc 2026-04-23 11:57:26 +02:00
141edc262f 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-22 20:31:31 +00:00
David Heinemeier Hansson 12494bcd8f Merge branch 'dev' into rc 2026-04-22 22:18:40 +02:00
David Heinemeier Hansson 577cd1e8ab Merge branch 'dev' into rc 2026-04-22 21:28:28 +02:00
David Heinemeier Hansson 2f5be43407 Merge branch 'dev' into rc 2026-04-22 20:11:29 +02:00
David Heinemeier Hansson 77c9bca045 Merge branch 'dev' into rc 2026-04-22 16:33:50 +02:00
David Heinemeier Hansson 2537edb1e6 Merge branch 'dev' into rc 2026-04-22 16:31:09 +02:00
David Heinemeier HanssonandGitHub 236a34b23c Merge pull request #5280 from basecamp/rc
Omarchy 3.5.1
2026-04-16 16:12:03 +02:00
David Heinemeier Hansson 2c4b4488c0 Merge branch 'dev' into rc 2026-04-16 16:03:49 +02:00
David Heinemeier Hansson 8f7d64ba78 Merge branch 'dev' into rc 2026-04-16 15:34:24 +02:00
David Heinemeier Hansson 9ece3318ec Merge branch 'dev' into rc 2026-04-16 15:24:11 +02:00
David Heinemeier Hansson d51a3f6b37 Merge branch 'dev' into rc 2026-04-15 18:16:27 +02:00
David Heinemeier Hansson cdb8628502 Merge branch 'dev' into rc 2026-04-15 16:21:03 +02:00
David Heinemeier Hansson b919a5541a Merge branch 'dev' into rc 2026-04-15 16:17:19 +02:00
David Heinemeier Hansson 4ee44c36a6 Merge branch 'dev' into rc 2026-04-15 15:55:55 +02:00
David Heinemeier Hansson d71ddf022a Merge branch 'dev' into rc 2026-04-15 15:02:11 +02:00
David Heinemeier Hansson cd511f77b9 Merge branch 'dev' into rc 2026-04-15 14:36:44 +02:00
David Heinemeier Hansson e6b105d0b2 Merge branch 'dev' into rc 2026-04-15 13:52:05 +02:00
David Heinemeier Hansson 2554fe8555 Merge branch 'dev' into rc 2026-04-15 12:34:23 +02:00
David Heinemeier Hansson feda8b7231 Merge branch 'dev' into rc 2026-04-15 12:11:18 +02:00
David Heinemeier Hansson 46eb5568d9 Merge branch 'dev' into rc 2026-04-15 11:56:00 +02:00
David Heinemeier Hansson 33c92f554b Merge branch 'dev' into rc 2026-04-15 11:49:29 +02:00
David Heinemeier Hansson 997011e985 Merge branch 'dev' into rc 2026-04-13 16:00:11 -07:00
David Heinemeier Hansson 0e126b7916 Merge branch 'dev' into rc 2026-04-13 15:59:23 -07:00
David Heinemeier Hansson f81b3c842d Merge branch 'dev' into rc 2026-04-11 20:48:42 -04:00
David Heinemeier Hansson ecbd912b09 Merge branch 'dev' into rc 2026-04-11 18:02:01 -04:00
David Heinemeier HanssonandGitHub 76d09b29b7 Merge pull request #5192 from basecamp/rc
Omarchy 3.5.0
2026-04-03 19:16:29 +02:00
David Heinemeier Hansson f18dfdd101 Merge branch 'dev' into rc 2026-04-03 11:36:14 +02:00
David Heinemeier Hansson e4757abb80 Merge branch 'dev' into rc 2026-04-03 10:57:18 +02:00
David Heinemeier Hansson fc1cb1a751 Merge branch 'dev' into rc 2026-04-02 18:06:32 +02:00
David Heinemeier Hansson 50d3579d66 Don't use the names here since they break the all-themes setup in omarchy-nvim 2026-04-02 18:04:55 +02:00
David Heinemeier Hansson b72a831bf5 Merge branch 'dev' into rc 2026-04-02 17:39:10 +02:00
David Heinemeier Hansson e2b6b5ed5a Merge branch 'dev' into rc 2026-04-02 17:23:41 +02:00
David Heinemeier Hansson e5bcec53d1 Merge branch 'dev' into rc 2026-04-02 16:07:23 +02:00
David Heinemeier Hansson 1b07638732 Merge branch 'dev' into rc 2026-04-02 16:06:29 +02:00
David Heinemeier Hansson 4a3355e767 Merge branch 'dev' into rc 2026-04-01 18:16:31 +02:00
David Heinemeier Hansson 3b8ab81781 Merge branch 'dev' into rc 2026-03-08 18:29:04 +01:00
David Heinemeier Hansson da0bb37a19 Merge branch 'dev' into rc 2026-03-08 17:54:04 +01:00
182 changed files with 595 additions and 2991 deletions
+2 -61
View File
@@ -6,15 +6,10 @@
- Prefer `(( ))` over numeric operators inside `[[ ]]` (e.g., `(( count < 50 ))`, not `[[ $count -lt 50 ]]`)
- For strings/paths with spaces, quote them instead of escaping spaces with `\ ` (e.g., `"$APP_DIR/Disk Usage.desktop"`, not `$APP_DIR/Disk\ Usage.desktop`)
- Shebangs must use `#!/bin/bash` consistently (never `#!/usr/bin/env bash`)
- Scripts under `install/` and `migrations/` may be sourced and intentionally omit shebangs
# Command Naming
All commands start with `omarchy-`. Prefixes indicate purpose.
The authoritative command group list lives in `bin/omarchy` in `GROUP_DESCRIPTIONS`. Keep `GROUP_DESCRIPTIONS` updated when adding a new command prefix.
Common prefixes include:
All commands start with `omarchy-`. Prefixes indicate purpose:
- `cmd-` - check if commands exist, misc utility commands
- `capture-` - screenshots, screen recordings, and other capture tools
@@ -29,52 +24,6 @@ Common prefixes include:
- `theme-` - theme management
- `update-` - update components
Other current prefixes include:
- `ac-`, `audio-`, `battery-`, `branch-`, `brightness-`, `channel-`, `config-`, `debug-`, `dev-`, `drive-`, `first-`, `font-`, `haptic-`, `hibernation-`, `hook-`, `hyprland-`, `menu-`, `migrate-`, `notification-`, `npx-`, `plymouth-`, `powerprofiles-`, `reinstall-`, `remove-`, `screensaver-`, `show-`, `snapshot-`, `state-`, `sudo-`, `swayosd-`, `system-`, `transcode-`, `tui-`, `tz-`, `upload-`, `version-`, `voxtype-`, `webapp-`, `wifi-`, `windows-`
# Command Metadata
Commands in `bin/` can declare CLI metadata in comments near the top of the file. `bin/omarchy` scans the first 80 lines, and tests expect command metadata to remain valid.
Supported metadata keys:
- `# omarchy:summary=...` - short help text
- `# omarchy:group=...` - command group when it differs from the filename-derived prefix
- `# omarchy:name=...` - command name within the group
- `# omarchy:args=...` - usage arguments
- `# omarchy:examples=...` - examples separated with ` | `
- `# omarchy:alias=...` / `# omarchy:aliases=...` - alternate routes
- `# omarchy:hidden=true` - hide from default command listings
- `# omarchy:requires-sudo=true` - mark commands that require sudo
Prefer explicit metadata for user-facing commands. Keep routes consistent with the filename unless there is a deliberate alias or compatibility route.
Example:
```bash
# omarchy:summary=Take a screenshot
# omarchy:group=capture
# omarchy:args=[smart|region|windows|fullscreen] [slurp|copy]
# omarchy:examples=omarchy screenshot | omarchy capture screenshot region
# omarchy:aliases=omarchy screenshot
```
# Install Scripts
Install entry points (`install.sh`, `boot.sh`) use `#!/bin/bash`. Many scripts under `install/` are sourced via `run_logged` and intentionally do not have shebangs.
Install stage files follow this pattern:
- `install/*/all.sh` lists scripts in execution order
- leaf scripts are sourced by `run_logged $OMARCHY_INSTALL/path/to/script.sh`
- avoid `exit` in sourced install scripts unless intentionally aborting the install
- use `$OMARCHY_INSTALL` and `$OMARCHY_PATH` instead of hard-coded Omarchy paths
- keep hardware-specific logic under `install/config/hardware/`
- prefer helper commands for package and command checks where available
Raw `command -v`, `pacman`, and `pacman-key` are acceptable in bootstrap/preflight/package-helper contexts where the helper commands may not be available yet or where direct package-manager behavior is the point of the script.
# Helper Commands
Use these instead of raw shell commands:
@@ -84,8 +33,6 @@ Use these instead of raw shell commands:
- `omarchy-pkg-add` - install packages (handles both pacman and AUR)
- `omarchy-hw-asus-rog` - detect ASUS ROG hardware (and similar `hw-*` commands)
Exceptions are allowed for bootstrap, preflight, migration, and package-helper scripts where the helper may not be available yet, where the helper itself is being implemented, or where direct package-manager behavior is required.
# Config Structure
- `config/` - default configs copied to `~/.config/`
@@ -106,16 +53,10 @@ This copies `~/.local/share/omarchy/config/hypr/hyprlock.conf` to `~/.config/hyp
To create a new migration, run `omarchy-dev-add-migration --no-edit`. This creates a migration file named after the unix timestamp of the last commit.
New migration format:
- File permissions must be `0644` (`-rw-r--r--`); migrations are sourced, not executed directly
Migration format:
- No shebang line
- Start with an `echo` describing what the migration does
- Use `$OMARCHY_PATH` to reference the omarchy directory
- Prefer helper commands such as `omarchy-cmd-present`, `omarchy-cmd-missing`, `omarchy-pkg-present`, and `omarchy-pkg-missing`
Some older migrations predate these rules. Do not copy older migrations that start with shebangs, omit the leading `echo`, or hard-code `~/.local/share/omarchy`.
Migrations may use raw `pacman`, `command -v`, or direct config edits when needed for historical compatibility or one-off repair work.
Example:
```bash
-2
View File
@@ -1,2 +0,0 @@
[Desktop Entry]
Hidden=true
-2
View File
@@ -1,2 +0,0 @@
[Desktop Entry]
Hidden=true
+23 -59
View File
@@ -17,7 +17,6 @@ declare -A COMMAND_USAGE
declare -A COMMAND_ARGS
declare -A COMMAND_EXAMPLES
declare -A COMMAND_REQUIRES_SUDO
declare -A COMMAND_HIDDEN
declare -A COMMAND_ALIASES
declare -A COMMAND_HAS_SUMMARY
declare -A COMMAND_METADATA_ERRORS
@@ -29,14 +28,12 @@ declare -A GROUP_DESCRIPTIONS
GROUP_DESCRIPTIONS[ac]="AC power detection"
GROUP_DESCRIPTIONS[battery]="Battery status helpers"
GROUP_DESCRIPTIONS[branch]="Omarchy git branch management"
GROUP_DESCRIPTIONS[branding]="About and screensaver branding"
GROUP_DESCRIPTIONS[brightness]="Display and keyboard brightness"
GROUP_DESCRIPTIONS[capture]="Screenshots and screen recording"
GROUP_DESCRIPTIONS[channel]="Omarchy release channel management"
GROUP_DESCRIPTIONS[cmd]="Command and shortcut helpers"
GROUP_DESCRIPTIONS[config]="System configuration helpers"
GROUP_DESCRIPTIONS[debug]="Diagnostics and support logs"
GROUP_DESCRIPTIONS[default]="Default application selection"
GROUP_DESCRIPTIONS[dev]="Omarchy development tools"
GROUP_DESCRIPTIONS[drive]="Drive selection and encryption"
GROUP_DESCRIPTIONS[font]="Font management"
@@ -53,27 +50,24 @@ GROUP_DESCRIPTIONS[npx]="NPX package wrappers"
GROUP_DESCRIPTIONS[pkg]="Package management helpers"
GROUP_DESCRIPTIONS[plymouth]="Plymouth boot theme management"
GROUP_DESCRIPTIONS[powerprofiles]="Power profile management"
GROUP_DESCRIPTIONS[echo]="Colored terminal output helpers"
GROUP_DESCRIPTIONS[refresh]="Reset config to defaults"
GROUP_DESCRIPTIONS[reinstall]="Reinstall and reset workflows"
GROUP_DESCRIPTIONS[reminder]="Desktop notification reminders"
GROUP_DESCRIPTIONS[remove]="Removal workflows"
GROUP_DESCRIPTIONS[restart]="Restart Omarchy components"
GROUP_DESCRIPTIONS[setup]="Interactive setup wizards"
GROUP_DESCRIPTIONS[screensaver]="Screensaver branding and animation"
GROUP_DESCRIPTIONS[snapshot]="System snapshots"
GROUP_DESCRIPTIONS[state]="Persistent Omarchy state"
GROUP_DESCRIPTIONS[sudo]="Sudo configuration helpers"
GROUP_DESCRIPTIONS[swayosd]="SwayOSD status display helpers"
GROUP_DESCRIPTIONS[system]="Reboot, shutdown, logout, and lock"
GROUP_DESCRIPTIONS[theme]="Theme management"
GROUP_DESCRIPTIONS[toggle]="Toggle Omarchy features"
GROUP_DESCRIPTIONS[transcode]="Image and video transcoding"
GROUP_DESCRIPTIONS[tui]="Terminal UI launchers"
GROUP_DESCRIPTIONS[tz]="Timezone selection"
GROUP_DESCRIPTIONS[update]="Omarchy and system updates"
GROUP_DESCRIPTIONS[upload]="Upload helpers"
GROUP_DESCRIPTIONS[version]="Version and channel information"
GROUP_DESCRIPTIONS[voxtype]="Voxtype dictation"
GROUP_DESCRIPTIONS[weather]="Weather status"
GROUP_DESCRIPTIONS[webapp]="Web app launchers"
GROUP_DESCRIPTIONS[wifi]="Wi-Fi helpers"
GROUP_DESCRIPTIONS[windows]="Windows VM management"
@@ -135,7 +129,6 @@ register_command() {
local examples=""
local aliases=""
local requires_sudo=""
local hidden=""
local line=""
local metadata_key=""
local metadata_value=""
@@ -191,10 +184,6 @@ register_command() {
requires_sudo="$metadata_value"
[[ $metadata_value == "true" ]] || metadata_errors=$(append_pipe_value "$metadata_errors" "requires-sudo must be omitted or true")
;;
hidden)
hidden="$metadata_value"
[[ $metadata_value == "true" ]] || metadata_errors=$(append_pipe_value "$metadata_errors" "hidden must be omitted or true")
;;
*)
;;
esac
@@ -238,7 +227,6 @@ register_command() {
fi
[[ $requires_sudo == "true" ]] || requires_sudo="false"
[[ $hidden == "true" ]] || hidden="false"
local key="$file_binary"
COMMAND_KEYS+=("$key")
@@ -252,7 +240,6 @@ register_command() {
COMMAND_ARGS["$key"]="$args"
COMMAND_EXAMPLES["$key"]="$examples"
COMMAND_REQUIRES_SUDO["$key"]="$requires_sudo"
COMMAND_HIDDEN["$key"]="$hidden"
COMMAND_HAS_SUMMARY["$key"]="$has_summary"
COMMAND_METADATA_ERRORS["$key"]="$metadata_errors"
@@ -332,6 +319,16 @@ command_requires_args() {
[[ -n $required ]]
}
load_group_extra_commands() {
local group="$1"
case "$group" in
install)
load_command_by_binary omarchy-pkg-add
;;
esac
}
load_group_commands() {
local group="$1"
local file=""
@@ -345,6 +342,7 @@ load_group_commands() {
register_command "$file"
done
load_group_extra_commands "$group"
}
resolve_direct_route() {
@@ -377,9 +375,6 @@ sorted_keys() {
local key=""
for key in "${COMMAND_KEYS[@]}"; do
if [[ $include_all != "true" && ${COMMAND_HIDDEN[$key]} == "true" ]]; then
continue
fi
printf '%s\t%s\n' "${COMMAND_ROUTE[$key]}" "$key"
done | sort -u | cut -f2-
}
@@ -423,10 +418,6 @@ sorted_group_keys() {
local route=""
for key in "${COMMAND_KEYS[@]}"; do
if [[ $include_all != "true" && ${COMMAND_HIDDEN[$key]} == "true" ]]; then
continue
fi
fallback_group=$(fallback_group_for_key "$key")
if [[ ${COMMAND_GROUP[$key]} != "$group" && $fallback_group != "$group" ]]; then
continue
@@ -504,6 +495,8 @@ Discovery:
omarchy commands --all Include commands explicitly marked hidden
omarchy commands --json Machine-readable command list
omarchy commands --check Validate command metadata and routes
omarchy dev benchmark Measure CLI response times
omarchy dev bin metadata Show bin metadata fields and defaults
EOF
}
@@ -515,7 +508,7 @@ Usage:
List commands known to the Omarchy command center.
Options:
--all Include commands explicitly marked hidden
--all Accepted for compatibility
--json Emit machine-readable JSON
--markdown Emit a Markdown command table
--check Validate command metadata and route collisions
@@ -567,9 +560,6 @@ show_commands() {
for route in "${!ROUTE_IS_ALIAS[@]}"; do
key="${ROUTE_TO_KEY[$route]}"
if [[ $include_all != "true" && ${COMMAND_HIDDEN[$key]} == "true" ]]; then
continue
fi
alias_rows+="$route"$'\t'"${COMMAND_ROUTE[$key]}"$'\n'
done
@@ -608,14 +598,13 @@ emit_command_records() {
while IFS= read -r key; do
[[ -n $key ]] || continue
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
"${COMMAND_ROUTE[$key]}" \
"${COMMAND_BINARY[$key]}" \
"${COMMAND_GROUP[$key]}" \
"${COMMAND_NAME[$key]}" \
"${COMMAND_SUMMARY[$key]}" \
"${COMMAND_REQUIRES_SUDO[$key]}" \
"${COMMAND_HIDDEN[$key]}" \
"${COMMAND_ARGS[$key]}" \
"${COMMAND_EXAMPLES[$key]}" \
"${COMMAND_ALIASES[$key]}" \
@@ -633,12 +622,11 @@ commands_json_filter() {
name: .[3],
summary: .[4],
requires_sudo: (.[5] == "true"),
hidden: (.[6] == "true"),
args: .[7],
examples: (.[8] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))),
aliases: (.[9] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))),
filename_route: .[10],
routes: ([.[0], .[10]] + (.[9] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))) | unique)
args: .[6],
examples: (.[7] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))),
aliases: (.[8] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))),
filename_route: .[9],
routes: ([.[0], .[9]] + (.[8] | split("|") | map(gsub("^ +| +$"; "")) | map(select(length > 0))) | unique)
}] | {ok: true, commands: .}
EOF
}
@@ -692,14 +680,13 @@ show_command_json() {
local key="$1"
printf '%s\n' "$key" | while IFS= read -r key; do
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
"${COMMAND_ROUTE[$key]}" \
"${COMMAND_BINARY[$key]}" \
"${COMMAND_GROUP[$key]}" \
"${COMMAND_NAME[$key]}" \
"${COMMAND_SUMMARY[$key]}" \
"${COMMAND_REQUIRES_SUDO[$key]}" \
"${COMMAND_HIDDEN[$key]}" \
"${COMMAND_ARGS[$key]}" \
"${COMMAND_EXAMPLES[$key]}" \
"${COMMAND_ALIASES[$key]}" \
@@ -792,25 +779,6 @@ show_group_help() {
fi
}
show_prefix_help() {
local prefix="$1"
local prefix_with_space="$prefix "
local key=""
local rows=""
while IFS= read -r key; do
[[ -n $key ]] || continue
if [[ ${COMMAND_USAGE[$key]} == $prefix_with_space* ]]; then
rows+="${COMMAND_USAGE[$key]}"$'\t'$'\t'"${COMMAND_SUMMARY[$key]}"$'\n'
fi
done < <(sorted_keys false)
[[ -n $rows ]] || return 1
echo "${prefix#omarchy } commands:"
print_command_table "$rows"
}
show_related_commands() {
local key="$1"
local group="${COMMAND_GROUP[$key]}"
@@ -1028,10 +996,6 @@ dispatch_or_help() {
return 0
fi
if show_prefix_help "omarchy ${args[*]}"; then
return 0
fi
echo "Unknown Omarchy command: omarchy ${args[*]}" >&2
suggestion=$(suggest_command "${args[0]}")
if [[ -n $suggestion ]]; then
-1
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Designed to be run by systemd timer every 30 seconds and alerts if battery is low
# omarchy:hidden=true
BATTERY_THRESHOLD=10
NOTIFICATION_FLAG="/run/user/$UID/omarchy_battery_notified"
-28
View File
@@ -1,28 +0,0 @@
#!/bin/bash
# omarchy:summary=Edit, set, or reset About branding
# omarchy:group=branding
# omarchy:name=about
# omarchy:args=<image|text|reset>
# omarchy:examples=omarchy branding about image | omarchy branding about text | omarchy branding about reset
set -euo pipefail
case "${1:-}" in
image)
image=$(omarchy-menu-file "Logo image" "$HOME" "svg png")
if [[ -n $image ]] && omarchy-transcode-ascii "$image" ~/.config/omarchy/branding/about.txt --width 54 --height 26 --mode block; then
omarchy-launch-about >/dev/null 2>&1
fi
;;
text)
omarchy-launch-editor ~/.config/omarchy/branding/about.txt >/dev/null 2>&1 && omarchy-launch-about >/dev/null 2>&1
;;
reset)
cp "$OMARCHY_PATH/icon.txt" ~/.config/omarchy/branding/about.txt && omarchy-launch-about >/dev/null 2>&1
;;
*)
echo "Usage: omarchy-branding-about <image|text|reset>" >&2
exit 1
;;
esac
-28
View File
@@ -1,28 +0,0 @@
#!/bin/bash
# omarchy:summary=Edit, set, or reset screensaver branding
# omarchy:group=branding
# omarchy:name=screensaver
# omarchy:args=<image|text|reset>
# omarchy:examples=omarchy branding screensaver image | omarchy branding screensaver text | omarchy branding screensaver reset
set -euo pipefail
case "${1:-}" in
image)
image=$(omarchy-menu-file "Logo image" "$HOME" "svg png")
if [[ -n $image ]] && omarchy-transcode-ascii "$image" ~/.config/omarchy/branding/screensaver.txt; then
omarchy-launch-screensaver force >/dev/null 2>&1
fi
;;
text)
omarchy-launch-editor ~/.config/omarchy/branding/screensaver.txt >/dev/null 2>&1 && omarchy-launch-screensaver force >/dev/null 2>&1
;;
reset)
cp "$OMARCHY_PATH/logo.txt" ~/.config/omarchy/branding/screensaver.txt && omarchy-launch-screensaver force >/dev/null 2>&1
;;
*)
echo "Usage: omarchy-branding-screensaver <image|text|reset>" >&2
exit 1
;;
esac
+6 -15
View File
@@ -1,11 +1,15 @@
#!/bin/bash
# omarchy:summary=Adjust brightness on the most likely display device.
# omarchy:args=<+N%|N%-|N%|off|on>
# omarchy:examples=omarchy brightness display +5% | omarchy brightness display 5%- | omarchy brightness display 50% | omarchy brightness display off | omarchy brightness display on
# omarchy:args=<step>
step="${1:-+5%}"
if omarchy-hyprland-monitor-focused-apple; then
omarchy-brightness-display-apple "$step"
exit
fi
# Start with the first possible output, then refine to the most likely given an order heuristic.
device="$(ls -1 /sys/class/backlight 2>/dev/null | head -n1)"
for candidate in amdgpu_bl* intel_backlight acpi_video*; do
@@ -15,19 +19,6 @@ for candidate in amdgpu_bl* intel_backlight acpi_video*; do
fi
done
if [[ $step == "off" ]]; then
hyprctl dispatch dpms off >/dev/null 2>&1
exit 0
elif [[ $step == "on" ]]; then
hyprctl dispatch dpms on >/dev/null 2>&1
exit 0
fi
if omarchy-hyprland-monitor-focused-apple; then
omarchy-brightness-display-apple "$step"
exit
fi
# Current brightness percentage
current=$(brightnessctl -d "$device" -m | cut -d',' -f4 | tr -d '%')
-2
View File
@@ -1,8 +1,6 @@
#!/bin/bash
# omarchy:summary=Adjust the brightness on Apple Studio Displays and Apple XDR Displays using asdcontrol.
# omarchy:args=<+N%|N%-|N%>
# omarchy:examples=omarchy brightness display apple +5% | omarchy brightness display apple 5%- | omarchy brightness display apple 50%
if (( $# == 0 )); then
echo "Adjust Apple Display brightness by passing +5%, 5%-, or 100%"
+1 -9
View File
@@ -1,7 +1,7 @@
#!/bin/bash
# omarchy:summary=Adjust keyboard backlight brightness using available steps.
# omarchy:args=<up|down|cycle|off|restore>
# omarchy:args=<up|down|cycle>
direction="${1:-up}"
@@ -19,14 +19,6 @@ if [[ -z $device ]]; then
exit 1
fi
if [[ $direction == "off" ]]; then
brightnessctl -sd "$device" set 0 >/dev/null
exit 0
elif [[ $direction == "restore" ]]; then
brightnessctl -rd "$device" >/dev/null
exit 0
fi
# Get current and max brightness to determine step size.
max_brightness="$(brightnessctl -d "$device" max)"
current_brightness="$(brightnessctl -d "$device" get)"
+1 -1
View File
@@ -18,7 +18,7 @@ SELECTION=$(slurp 2>/dev/null)
[[ -z $SELECTION ]] && exit 0
TEXT=$(grim -g "$SELECTION" - | tesseract stdin stdout --oem 1 --psm 6 -l "${OMARCHY_OCR_LANGS:-eng}" --dpi 300 -c preserve_interword_spaces=1 2>/dev/null) || exit 1
TEXT=$(grim -g "$SELECTION" - | tesseract stdin stdout --oem 1 --psm 6 -l eng --dpi 300 -c preserve_interword_spaces=1 2>/dev/null) || exit 1
[[ -z $TEXT ]] && exit 1
-1
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Print the current working directory of the active terminal window
# omarchy:hidden=true
terminal_pid=$(hyprctl activewindow | awk '/pid:/ {print $2}')
shell_pid=$(pgrep -P "$terminal_pid" | tail -n1)
-40
View File
@@ -1,40 +0,0 @@
#!/bin/bash
# omarchy:summary=Set the default browser for Omarchy and XDG handlers
# omarchy:args=[chromium|chrome|brave|brave-origin|edge|firefox|zen]
# omarchy:examples=omarchy default browser firefox | omarchy default browser brave
if (($# == 0)); then
case "$(xdg-settings get default-web-browser)" in
chromium.desktop) echo "chromium" ;;
google-chrome.desktop) echo "chrome" ;;
brave-browser.desktop) echo "brave" ;;
brave-origin-beta.desktop) echo "brave-origin" ;;
microsoft-edge.desktop) echo "edge" ;;
firefox.desktop) echo "firefox" ;;
zen.desktop) echo "zen" ;;
*) xdg-settings get default-web-browser ;;
esac
exit 0
fi
case "$1" in
chromium) desktop_id="chromium.desktop"; name="Chromium"; glyph="" ;;
chrome) desktop_id="google-chrome.desktop"; name="Chrome"; glyph="󰊯" ;;
brave) desktop_id="brave-browser.desktop"; name="Brave"; glyph="󰖟" ;;
brave-origin) desktop_id="brave-origin-beta.desktop"; name="Brave Origin"; glyph="󰖟" ;;
edge) desktop_id="microsoft-edge.desktop"; name="Edge"; glyph="󰇩" ;;
firefox) desktop_id="firefox.desktop"; name="Firefox"; glyph="󰈹" ;;
zen) desktop_id="zen.desktop"; name="Zen"; glyph="󰰷" ;;
*)
echo "Usage: omarchy-default-browser <chromium|chrome|brave|brave-origin|edge|firefox|zen>"
exit 1
;;
esac
xdg-settings set default-web-browser "$desktop_id"
xdg-mime default "$desktop_id" x-scheme-handler/http
xdg-mime default "$desktop_id" x-scheme-handler/https
xdg-mime default "$desktop_id" text/html
notify-send -u low "$glyph $name is now the default browser"
-30
View File
@@ -1,30 +0,0 @@
#!/bin/bash
# omarchy:summary=Set the default editor for $EDITOR
# omarchy:args=[code|cursor|zed|sublime_text|helix|vim|emacs|nvim]
# omarchy:examples=omarchy default editor | omarchy default editor code | omarchy default editor helix
if (($# == 0)); then
sed -n 's/^export EDITOR=//p' ~/.config/uwsm/default | head -n 1
exit 0
fi
case "$1" in
code) editor="code"; name="VSCode"; glyph="" ;;
cursor) editor="cursor"; name="Cursor"; glyph="" ;;
zed | zeditor) editor="zeditor"; name="Zed"; glyph="" ;;
sublime_text) editor="sublime_text"; name="Sublime Text"; glyph="" ;;
helix) editor="helix"; name="Helix"; glyph="" ;;
vim) editor="vim"; name="Vim"; glyph="" ;;
emacs) editor="emacs"; name="Emacs"; glyph="" ;;
nvim) editor="nvim"; name="Neovim"; glyph="" ;;
*)
echo "Usage: omarchy-default-editor <code|cursor|zed|sublime_text|helix|vim|emacs|nvim>"
exit 1
;;
esac
sed -i "s/^export EDITOR=.*/export EDITOR=$editor/" ~/.config/uwsm/default
export EDITOR="$editor"
notify-send -u low "$glyph $name is now the default editor" " Effective after logging out"
-36
View File
@@ -1,36 +0,0 @@
#!/bin/bash
# omarchy:summary=Set the default terminal used by xdg-terminal-exec
# omarchy:args=[alacritty|foot|ghostty|kitty]
# omarchy:examples=omarchy default terminal ghostty | omarchy default terminal kitty
if (($# == 0)); then
desktop_id=$(grep -vE '^($|#)' ~/.config/xdg-terminals.list 2>/dev/null | head -n 1)
case "$desktop_id" in
Alacritty.desktop) echo "alacritty" ;;
foot.desktop) echo "foot" ;;
com.mitchellh.ghostty.desktop) echo "ghostty" ;;
kitty.desktop) echo "kitty" ;;
*) echo "$desktop_id" ;;
esac
exit 0
fi
case "$1" in
alacritty) desktop_id="Alacritty.desktop"; name="Alacritty"; glyph="" ;;
foot) desktop_id="foot.desktop"; name="Foot"; glyph="" ;;
ghostty) desktop_id="com.mitchellh.ghostty.desktop"; name="Ghostty"; glyph="" ;;
kitty) desktop_id="kitty.desktop"; name="Kitty"; glyph="" ;;
*)
echo "Usage: omarchy-default-terminal <alacritty|foot|ghostty|kitty>"
exit 1
;;
esac
cat >~/.config/xdg-terminals.list <<EOF
# Terminal emulator preference order for xdg-terminal-exec
# The first found and valid terminal will be used
$desktop_id
EOF
notify-send -u low "$glyph $name is now the default terminal"
+1 -4
View File
@@ -22,8 +22,7 @@ show_json() {
{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."},
{name: "hidden", required: false, type: "true", default: false, note: "Hide from default command listings; visible with --all."}
{name: "requires-sudo", required: false, type: "true", default: false, note: "Only include when true."}
]
}'
}
@@ -44,7 +43,6 @@ Inferred defaults:
route omarchy <group> <name>
binary filename
requires-sudo false
hidden false
Optional fields:
# omarchy:group=<group> route override only
@@ -53,7 +51,6 @@ Optional fields:
# omarchy:examples=<cmd> | <cmd> pipe-separated examples
# omarchy:aliases=<route> | <route> pipe-separated alternate routes
# omarchy:requires-sudo=true only when true
# omarchy:hidden=true hide from default command listings
Do not define:
binary inferred from filename
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Select a drive from a list with info that includes space and brand. Used by omarchy-drive-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
drives=$(lsblk -dpno NAME | grep -E '/dev/(sd|hd|vd|nvme|mmcblk|xv)')
-9
View File
@@ -1,9 +0,0 @@
#!/bin/bash
# omarchy:summary=Print a failure message in red
# omarchy:args=<message>
RED='\033[0;31m'
NC='\033[0m'
echo -e "${RED}$*${NC}"
-9
View File
@@ -1,9 +0,0 @@
#!/bin/bash
# omarchy:summary=Print an informational message in yellow
# omarchy:args=<message>
YELLOW='\033[1;33m'
NC='\033[0m'
echo -e "${YELLOW}$*${NC}"
-9
View File
@@ -1,9 +0,0 @@
#!/bin/bash
# omarchy:summary=Print a success message in green
# omarchy:args=<message>
GREEN='\033[0;32m'
NC='\033[0m'
echo -e "${GREEN}$*${NC}"
-3
View File
@@ -16,10 +16,7 @@ if [[ -f $FIRST_RUN_MODE ]]; then
bash "$OMARCHY_PATH/install/first-run/firewall.sh"
bash "$OMARCHY_PATH/install/first-run/dns-resolver.sh"
bash "$OMARCHY_PATH/install/first-run/gnome-theme.sh"
bash "$OMARCHY_PATH/install/first-run/swayosd.sh"
bash "$OMARCHY_PATH/install/first-run/gtk-primary-paste.sh"
bash "$OMARCHY_PATH/install/first-run/elephant.sh"
omarchy-hook-install post-update "$OMARCHY_PATH/install/first-run/install-voxtype.hook"
sudo rm -f /etc/sudoers.d/first-run
bash "$OMARCHY_PATH/install/first-run/welcome.sh"
-8
View File
@@ -22,10 +22,6 @@ if [[ -n $font_name ]]; then
pkill -SIGUSR2 ghostty
fi
if [[ -f ~/.config/foot/foot.ini ]]; then
sed -i "s/^font=.*/font=$font_name:size=9/g" ~/.config/foot/foot.ini
fi
sed -i "s/font_family = .*/font_family = $font_name/g" ~/.config/hypr/hyprlock.conf
sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/waybar/style.css
sed -i "s/font-family: .*/font-family: '$font_name';/g" ~/.config/swayosd/style.css
@@ -41,10 +37,6 @@ if [[ -n $font_name ]]; then
notify-send -u low " You must restart Ghostty to see font change"
fi
if pgrep -x foot; then
notify-send -u low " You must restart Foot to see font change"
fi
omarchy-hook font-set "$font_name"
else
echo "Font '$font_name' not found."
+2 -11
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Run a named hook from ~/.config/omarchy/hooks/<name> and ~/.config/omarchy/hooks/<name>.d/.
# omarchy:summary=Run a named hook, like post-update (available in ~/.config/omarchy/hooks/post-update).
# omarchy:args=[name] [args...]
set -e
@@ -12,17 +12,8 @@ fi
HOOK=$1
HOOK_PATH="$HOME/.config/omarchy/hooks/$1"
HOOK_DIR="$HOOK_PATH.d"
shift
if [[ -f $HOOK_PATH ]]; then
bash "$HOOK_PATH" "$@" || echo "Hook failed: $HOOK_PATH"
fi
if [[ -d $HOOK_DIR ]]; then
for hook in "$HOOK_DIR"/*; do
[[ -f $hook ]] || continue
[[ $hook == *.sample ]] && continue
bash "$hook" "$@" || echo "Hook failed: $hook"
done
bash "$HOOK_PATH" "$@"
fi
-31
View File
@@ -1,31 +0,0 @@
#!/bin/bash
# omarchy:summary=Install a hook into ~/.config/omarchy/hooks/<type>.d/
# omarchy:group=hook
# omarchy:name=install
# omarchy:args=<type> <file>
# omarchy:examples=omarchy hook install post-update ~/my-hook
set -e
if (( $# != 2 )); then
echo "Usage: omarchy-hook-install <type> <file>"
exit 1
fi
HOOK_TYPE=$1
HOOK_FILE=$2
HOOK_DIR="$HOME/.config/omarchy/hooks/$HOOK_TYPE.d"
HOOK_NAME=$(basename "$HOOK_FILE")
HOOK_PATH="$HOOK_DIR/$HOOK_NAME"
if [[ ! -f $HOOK_FILE ]]; then
echo "Hook file not found: $HOOK_FILE"
exit 1
fi
mkdir -p "$HOOK_DIR"
cp "$HOOK_FILE" "$HOOK_PATH"
chmod 755 "$HOOK_PATH"
echo "Installed $HOOK_TYPE hook: $HOOK_PATH"
-5
View File
@@ -1,5 +0,0 @@
#!/bin/bash
# omarchy:summary=Detect ASUS Zenbook UX5406AA series laptops on Intel Panther Lake.
omarchy-hw-match "ux5406aa" && omarchy-hw-intel-ptl
+1 -1
View File
@@ -2,4 +2,4 @@
# omarchy:summary=Return success if the focused Hyprland monitor is an Apple display.
hyprctl monitors -j | jq -e '.[] | select(.focused == true) | select(.make == "Apple Computer Inc" and (.model | test("StudioDisplay|ProDisplayXDR|Studio XDR")))' >/dev/null
hyprctl monitors -j | jq -e '.[] | select(.focused == true) | select(.make == "Apple Computer Inc" and (.model | test("StudioDisplay|ProDisplayXDR")))' >/dev/null
+3 -3
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Cycle focused Hyprland monitor scaling through 1x, 1.25x, 1.6x, 2x, 3x, and 4x
# omarchy:summary=Cycle scaling for the focused Hyprland monitor
MONITOR_INFO=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true)')
ACTIVE_MONITOR=$(echo "$MONITOR_INFO" | jq -r '.name')
@@ -9,8 +9,8 @@ WIDTH=$(echo "$MONITOR_INFO" | jq -r '.width')
HEIGHT=$(echo "$MONITOR_INFO" | jq -r '.height')
REFRESH_RATE=$(echo "$MONITOR_INFO" | jq -r '.refreshRate')
# Cycle through scales: 1 → 1.25 → 1.6 → 2 → 3 → 4 → 1 (or reverse with --reverse)
SCALES=(1 1.25 1.6 2 3 4)
# Cycle through scales: 1 → 1.25 → 1.6 → 2 → 3 → 1 (or reverse with --reverse)
SCALES=(1 1.25 1.6 2 3)
# Find the index of the scale closest to the current one (Hyprland may
# snap fractional scales to nearby values, so we can't match exactly)
-93
View File
@@ -1,93 +0,0 @@
#!/bin/bash
# omarchy:summary=Install a supported browser
# omarchy:args=<chrome|brave|brave-origin|edge|firefox|zen>
# omarchy:examples=omarchy install browser firefox | omarchy install browser brave
setup_policy_directory() {
sudo mkdir -p "$1"
sudo chmod a+rw "$1"
}
announce_browser_installed() {
echo ""
echo "$1 browser installed. Make it the default via Setup > Defaults > Browser."
}
copy_chromium_flags() {
mkdir -p ~/.config
cp -f "${OMARCHY_PATH:-$HOME/.local/share/omarchy}/config/chromium-flags.conf" "$1"
}
setup_firefox_preferences() {
local distribution_dir="$1"
setup_policy_directory "$distribution_dir"
sudo cp -f "$OMARCHY_PATH/default/firefox/policies.json" "$distribution_dir/policies.json"
}
setup_firefox_wayland() {
mkdir -p ~/.config/environment.d
echo "MOZ_ENABLE_WAYLAND=1" > ~/.config/environment.d/omarchy-firefox-wayland.conf
}
case $1 in
chrome)
echo "Installing Chrome..."
omarchy-pkg-aur-add google-chrome || exit 1
setup_policy_directory /etc/opt/chrome/policies/managed
copy_chromium_flags ~/.config/chrome-flags.conf
omarchy-theme-set-browser
announce_browser_installed "Chrome"
;;
edge)
echo "Installing Edge..."
omarchy-pkg-aur-add microsoft-edge-stable-bin || exit 1
setup_policy_directory /etc/opt/edge/policies/managed
copy_chromium_flags ~/.config/microsoft-edge-stable-flags.conf
omarchy-theme-set-browser
announce_browser_installed "Edge"
;;
brave)
echo "Installing Brave..."
omarchy-pkg-aur-add brave-bin || exit 1
setup_policy_directory /etc/brave/policies/managed
copy_chromium_flags ~/.config/brave-flags.conf
omarchy-theme-set-browser
announce_browser_installed "Brave"
;;
brave-origin)
echo "Installing Brave Origin..."
omarchy-pkg-aur-add brave-origin-beta-bin || exit 1
setup_policy_directory /etc/brave/policies/managed
mkdir -p ~/.config
# FIXME: Use normal chromium flags when Brave Origin wrapper has been fixed
echo "--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url" > ~/.config/brave-origin-beta-flags.conf
omarchy-theme-set-browser
announce_browser_installed "Brave Origin"
;;
firefox)
echo "Installing Firefox..."
omarchy-pkg-add firefox || exit 1
setup_firefox_preferences /usr/lib/firefox/distribution
setup_firefox_wayland
announce_browser_installed "Firefox"
;;
zen)
echo "Installing Zen..."
omarchy-pkg-aur-add zen-browser-bin || exit 1
setup_firefox_preferences /opt/zen-browser/distribution
setup_firefox_wayland
announce_browser_installed "Zen"
;;
*)
echo "Usage: omarchy-install-browser <chrome|brave|brave-origin|edge|firefox|zen>"
exit 1
;;
esac
+2 -4
View File
@@ -21,9 +21,8 @@ omarchy-pkg-add \
libretro-parallel-n64 libretro-picodrive libretro-play libretro-ppsspp \
libretro-sameboy libretro-scummvm libretro-shaders-slang libretro-snes9x \
libretro-yabause \
libretro-cap32-git libretro-fbneo-git libretro-uae-git libretro-vice-git \
libretro-database-git \
retroarch-joypad-autoconfig-git
libretro-fbneo-git \
libretro-database-git
# Set up ~/Games for BIOS files and ROMs
mkdir -p "$HOME/Games/bios" "$HOME/Games/roms"
@@ -50,7 +49,6 @@ set_cfg libretro_info_path "/usr/share/libretro/info"
set_cfg overlay_directory "/usr/share/libretro/overlays"
set_cfg osk_overlay_directory "/usr/share/libretro/overlays/keyboards"
set_cfg video_shader_dir "/usr/share/libretro/shaders/shaders_slang"
set_cfg joypad_autoconfig_dir "/usr/share/libretro/autoconfig"
# Point at the database, cheats, and cursors from libretro-database-git
set_cfg content_database_path "/usr/share/libretro/database/rdb"
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Install Helix and configure it to use the current Omarchy theme
# Install Helix and configure it to use the current Omarchy theme.
echo "Installing Helix..."
omarchy-pkg-add helix
+4 -13
View File
@@ -1,11 +1,11 @@
#!/bin/bash
# omarchy:summary=Install one of the approved terminals and set it as the default for Omarchy (Super + Return etc).
# omarchy:args=<alacritty|foot|ghostty|kitty>
# omarchy:args=<alacritty|ghostty|kitty>
# omarchy:requires-sudo=true
if (($# == 0)); then
echo "Usage: omarchy-install-terminal [alacritty|foot|ghostty|kitty]"
echo "Usage: omarchy-install-terminal [alacritty|ghostty|kitty]"
exit 1
fi
@@ -14,7 +14,6 @@ package="$1"
# Map package name to desktop entry ID
case "$package" in
alacritty) desktop_id="Alacritty.desktop" ;;
foot) desktop_id="foot.desktop" ;;
ghostty) desktop_id="com.mitchellh.ghostty.desktop" ;;
kitty) desktop_id="kitty.desktop" ;;
*)
@@ -27,18 +26,10 @@ echo "Installing $package..."
# Install package
if omarchy-pkg-add $package; then
# Copy custom desktop entries with X-TerminalArg* keys
# Copy custom desktop entry for alacritty with X-TerminalArg* keys
if [[ $package == "alacritty" ]]; then
mkdir -p ~/.local/share/applications
cp "$OMARCHY_PATH/applications/$desktop_id" ~/.local/share/applications/
elif [[ $package == "foot" ]]; then
mkdir -p ~/.local/share/applications
cp "$OMARCHY_PATH/default/foot/$desktop_id" ~/.local/share/applications/
fi
# Copy default config for optional terminals when missing
if [[ ! -e ~/.config/$package ]]; then
cp -Rpf "$OMARCHY_PATH/config/$package" ~/.config/
cp $OMARCHY_PATH/applications/Alacritty.desktop ~/.local/share/applications/
fi
# Update xdg-terminals.list to prioritize the proper terminal
-11
View File
@@ -1,11 +0,0 @@
#!/bin/bash
# omarchy:summary=Install Zed Editor and configure it with the current Omarchy theme
echo "Installing Zed Editor..."
omarchy-pkg-add zed omazed
# Apply Omarchy theme to Zed
omazed setup
setsid gtk-launch dev.zed.Zed
+1 -7
View File
@@ -37,12 +37,6 @@ for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do
--font-size=18 \
-e omarchy-screensaver
;;
*foot*)
hyprctl dispatch exec -- \
foot --app-id=org.omarchy.screensaver \
--config="$OMARCHY_PATH/default/foot/screensaver.ini" \
-e omarchy-screensaver
;;
*kitty*)
hyprctl dispatch exec -- \
kitty --class=org.omarchy.screensaver \
@@ -51,7 +45,7 @@ for m in $(hyprctl monitors -j | jq -r '.[] | .name'); do
-e omarchy-screensaver
;;
*)
notify-send -u low "✋ Screensaver only runs in Alacritty, Foot, Ghostty, or Kitty"
notify-send -u low "✋ Screensaver only runs in Alacritty, Ghostty, or Kitty"
;;
esac
done
+21 -219
View File
@@ -93,10 +93,8 @@ show_learn_menu() {
}
show_trigger_menu() {
case $(menu "Trigger" "󰔛 Reminder\n Capture\n󰧸 Transcode\n Share\n󰔎 Toggle\n Hardware") in
*Reminder*) show_reminder_menu ;;
case $(menu "Trigger" " Capture\n Share\n󰔎 Toggle\n Hardware") in
*Capture*) show_capture_menu ;;
*Transcode*) omarchy-transcode || back_to show_trigger_menu ;;
*Share*) show_share_menu ;;
*Toggle*) show_toggle_menu ;;
*Hardware*) show_hardware_menu ;;
@@ -104,41 +102,6 @@ show_trigger_menu() {
esac
}
show_reminder_menu() {
case $(menu "Reminder" "󰔛 Set one\n󰔛 Show all\n󰔛 Clear all") in
*Set*) show_custom_reminder_input ;;
*"Show all"*) omarchy-reminder show ;;
*"Clear all"*) omarchy-reminder clear ;;
*) back_to show_trigger_menu ;;
esac
}
show_custom_reminder_input() {
local minutes
minutes=$(omarchy-menu-input "Remind in minutes")
if [[ $minutes =~ ^[0-9]+$ ]] && ((minutes > 0)); then
show_reminder_message_input "$minutes"
elif [[ -n $minutes ]]; then
omarchy-notification-send "󰔛" "Invalid reminder" "Enter the number of minutes" -u critical
show_custom_reminder_input
else
back_to show_reminder_menu
fi
}
show_reminder_message_input() {
local minutes="$1"
local message
message=$(omarchy-menu-input "Reminder message")
if [[ -n $message ]]; then
omarchy-reminder "$minutes" "$message"
else
omarchy-reminder "$minutes"
fi
}
show_capture_menu() {
case $(menu "Capture" " Screenshot\n Screenrecord\n󰴑 Text Extraction\n󰃉 Color") in
*Screenshot*) omarchy-capture-screenshot ;;
@@ -254,30 +217,12 @@ show_style_menu() {
*Font*) show_font_menu ;;
*Background*) show_background_menu ;;
*Hyprland*) open_in_editor ~/.config/hypr/looknfeel.conf ;;
*Screensaver*) show_screensaver_menu ;;
*About*) show_about_menu ;;
*Screensaver*) open_in_editor ~/.config/omarchy/branding/screensaver.txt ;;
*About*) open_in_editor ~/.config/omarchy/branding/about.txt ;;
*) show_main_menu ;;
esac
}
show_about_menu() {
case $(menu "About" " Edit Text\n Set From Image\n Restore Default") in
*Text*) omarchy-branding-about text ;;
*Image*) omarchy-branding-about image ;;
*Default*) omarchy-branding-about reset ;;
*) show_style_menu ;;
esac
}
show_screensaver_menu() {
case $(menu "Screensaver" " Edit Text\n Set From Image\n Restore Default") in
*Text*) omarchy-branding-screensaver text ;;
*Image*) omarchy-branding-screensaver image ;;
*Default*) omarchy-branding-screensaver reset ;;
*) show_style_menu ;;
esac
}
show_theme_menu() {
omarchy-launch-walker -m menus:omarchythemes --width 800 --minheight 400
}
@@ -299,7 +244,7 @@ show_setup_menu() {
local options=" Audio\n Wifi\n󰂯 Bluetooth\n󱐋 Power Profile\n System Sleep\n󰍹 Monitors"
[[ -f ~/.config/hypr/bindings.conf ]] && options="$options\n Keybindings"
[[ -f ~/.config/hypr/input.conf ]] && options="$options\n Input"
options="$options\n Defaults\n󰱔 DNS\n Security\n Config"
options="$options\n󰱔 DNS\n Security\n Config"
case $(menu "Setup" "$options") in
*Audio*) omarchy-launch-audio ;;
@@ -310,7 +255,6 @@ show_setup_menu() {
*Monitors*) open_in_editor ~/.config/hypr/monitors.conf ;;
*Keybindings*) open_in_editor ~/.config/hypr/bindings.conf ;;
*Input*) open_in_editor ~/.config/hypr/input.conf ;;
*Defaults*) show_setup_default_menu ;;
*DNS*) present_terminal omarchy-setup-dns ;;
*Security*) show_setup_security_menu ;;
*Config*) show_setup_config_menu ;;
@@ -330,120 +274,15 @@ show_setup_power_menu() {
show_setup_security_menu() {
case $(menu "Setup" "󰈷 Fingerprint\n Fido2") in
*Fingerprint*) present_terminal omarchy-setup-security-fingerprint ;;
*Fido2*) present_terminal omarchy-setup-security-fido2 ;;
*Fingerprint*) present_terminal omarchy-setup-fingerprint ;;
*Fido2*) present_terminal omarchy-setup-fido2 ;;
*) show_setup_menu ;;
esac
}
show_setup_default_menu() {
case $(menu "Default" " Browser\n Terminal\n Editor") in
*Browser*) show_setup_default_browser_menu ;;
*Terminal*) show_setup_default_terminal_menu ;;
*Editor*) show_setup_default_editor_menu ;;
*) show_setup_menu ;;
esac
}
browser_desktop_exists() {
[[ -f ~/.local/share/applications/$1 || -f ~/.nix-profile/share/applications/$1 || -f /usr/share/applications/$1 ]]
}
show_setup_default_browser_menu() {
local options=""
browser_desktop_exists chromium.desktop && options="$options Chromium"
browser_desktop_exists google-chrome.desktop && options="${options:+$options\n}󰊯 Chrome"
browser_desktop_exists brave-browser.desktop && options="${options:+$options\n}󰖟 Brave"
browser_desktop_exists brave-origin-beta.desktop && options="${options:+$options\n}󰖟 Brave Origin"
browser_desktop_exists microsoft-edge.desktop && options="${options:+$options\n}󰇩 Edge"
browser_desktop_exists firefox.desktop && options="${options:+$options\n}󰈹 Firefox"
browser_desktop_exists zen.desktop && options="${options:+$options\n}󰖟 Zen"
local current=""
case "$(omarchy-default-browser)" in
chromium) current=" Chromium" ;;
chrome) current="󰊯 Chrome" ;;
brave) current="󰖟 Brave" ;;
brave-origin) current="󰖟 Brave Origin" ;;
edge) current="󰇩 Edge" ;;
firefox) current="󰈹 Firefox" ;;
zen) current="󰖟 Zen" ;;
esac
case $(menu "Default Browser" "$options" "" "$current") in
*Chromium*) omarchy-default-browser chromium ;;
*Chrome*) omarchy-default-browser chrome ;;
*"Brave Origin"*) omarchy-default-browser brave-origin ;;
*Brave*) omarchy-default-browser brave ;;
*Edge*) omarchy-default-browser edge ;;
*Firefox*) omarchy-default-browser firefox ;;
*Zen*) omarchy-default-browser zen ;;
*) show_setup_default_menu ;;
esac
}
show_setup_default_terminal_menu() {
local options=""
omarchy-cmd-present alacritty && options="$options Alacritty"
omarchy-cmd-present foot && options="${options:+$options\n} Foot"
omarchy-cmd-present ghostty && options="${options:+$options\n} Ghostty"
omarchy-cmd-present kitty && options="${options:+$options\n} Kitty"
local current=""
case "$(omarchy-default-terminal)" in
alacritty) current=" Alacritty" ;;
foot) current=" Foot" ;;
ghostty) current=" Ghostty" ;;
kitty) current=" Kitty" ;;
esac
case $(menu "Default Terminal" "$options" "" "$current") in
*Alacritty*) omarchy-default-terminal alacritty ;;
*Foot*) omarchy-default-terminal foot ;;
*Ghostty*) omarchy-default-terminal ghostty ;;
*Kitty*) omarchy-default-terminal kitty ;;
*) show_setup_default_menu ;;
esac
}
show_setup_default_editor_menu() {
local options=""
omarchy-cmd-present nvim && options="$options Neovim"
omarchy-cmd-present code && options="${options:+$options\n} VSCode"
omarchy-cmd-present cursor && options="${options:+$options\n} Cursor"
omarchy-cmd-present zeditor && options="${options:+$options\n} Zed"
omarchy-cmd-present sublime_text && options="${options:+$options\n} Sublime Text"
omarchy-cmd-present helix && options="${options:+$options\n} Helix"
omarchy-cmd-present vim && options="${options:+$options\n} Vim"
omarchy-cmd-present emacs && options="${options:+$options\n} Emacs"
local current=""
case "$(omarchy-default-editor)" in
nvim) current=" Neovim" ;;
code) current=" VSCode" ;;
cursor) current=" Cursor" ;;
zed | zeditor) current=" Zed" ;;
sublime_text) current=" Sublime Text" ;;
helix) current=" Helix" ;;
vim) current=" Vim" ;;
emacs) current=" Emacs" ;;
esac
case $(menu "Default Editor" "$options" "" "$current") in
*Neovim*) omarchy-default-editor nvim ;;
*VSCode*) omarchy-default-editor code ;;
*Cursor*) omarchy-default-editor cursor ;;
*Zed*) omarchy-default-editor zed ;;
*Sublime*) omarchy-default-editor sublime_text ;;
*Helix*) omarchy-default-editor helix ;;
*Vim*) omarchy-default-editor vim ;;
*Emacs*) omarchy-default-editor emacs ;;
*) show_setup_default_menu ;;
esac
}
show_setup_config_menu() {
case $(menu "Setup" " Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar\n󰞅 XCompose") in
case $(menu "Setup" " Defaults\n Hyprland\n Hypridle\n Hyprlock\n Hyprsunset\n Swayosd\n󰌧 Walker\n󰍜 Waybar\n󰞅 XCompose") in
*Defaults*) open_in_editor ~/.config/uwsm/default ;;
*Hyprland*) open_in_editor ~/.config/hypr/hyprland.conf ;;
*Hypridle*) open_in_editor ~/.config/hypr/hypridle.conf && omarchy-restart-hypridle ;;
*Hyprlock*) open_in_editor ~/.config/hypr/hyprlock.conf ;;
@@ -480,7 +319,7 @@ show_setup_system_menu() {
}
show_install_menu() {
case $(menu "Install" "󰣇 Package\n󰣇 AUR\n Web App\n TUI\n Service\n Style\n󰵮 Development\n Editor\n Terminal\n Browser\n󱚤 AI\n Gaming\n󰍲 Windows") in
case $(menu "Install" "󰣇 Package\n󰣇 AUR\n Web App\n TUI\n Service\n Style\n󰵮 Development\n Editor\n Terminal\n󱚤 AI\n󰍲 Windows\n Gaming") in
*Package*) terminal omarchy-pkg-install ;;
*AUR*) terminal omarchy-pkg-aur-install ;;
*Web*) present_terminal omarchy-webapp-install ;;
@@ -490,26 +329,13 @@ show_install_menu() {
*Development*) show_install_development_menu ;;
*Editor*) show_install_editor_menu ;;
*Terminal*) show_install_terminal_menu ;;
*Browser*) show_install_browser_menu ;;
*Gaming*) show_install_gaming_menu ;;
*AI*) show_install_ai_menu ;;
*Windows*) present_terminal "omarchy-windows-vm install" ;;
*Gaming*) show_install_gaming_menu ;;
*) show_main_menu ;;
esac
}
show_install_browser_menu() {
case $(menu "Install" " Chrome\n Edge\n Brave\n Brave Origin\n Firefox\n󰖟 Zen") in
*Chrome*) present_terminal "omarchy-install-browser chrome" ;;
*Edge*) present_terminal "omarchy-install-browser edge" ;;
*"Brave Origin"*) present_terminal "omarchy-install-browser brave-origin" ;;
*Brave*) present_terminal "omarchy-install-browser brave" ;;
*Firefox*) present_terminal "omarchy-install-browser firefox" ;;
*Zen*) present_terminal "omarchy-install-browser zen" ;;
*) show_install_menu ;;
esac
}
show_install_service_menu() {
case $(menu "Install" " Dropbox\n Tailscale\n󱇱 NordVPN [AUR]\n󰏖 ONCE\n󰟵 Bitwarden\n Chromium Account") in
*Dropbox*) present_terminal omarchy-install-dropbox ;;
@@ -523,22 +349,20 @@ show_install_service_menu() {
}
show_install_editor_menu() {
case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Vim\n Emacs") in
case $(menu "Install" " VSCode\n Cursor\n Zed\n Sublime Text\n Helix\n Emacs") in
*VSCode*) present_terminal omarchy-install-vscode ;;
*Cursor*) install_and_launch "Cursor" "cursor-bin" "cursor" ;;
*Zed*) present_terminal omarchy-install-zed ;;
*Zed*) install_and_launch "Zed" "zed" "dev.zed.Zed" ;;
*Sublime*) install_and_launch "Sublime Text" "sublime-text-4" "sublime_text" ;;
*Helix*) present_terminal omarchy-install-helix ;;
*Vim*) install "Vim" "vim" ;;
*Emacs*) install "Emacs" "emacs-wayland" && systemctl --user enable --now emacs.service ;;
*) show_install_menu ;;
esac
}
show_install_terminal_menu() {
case $(menu "Install" " Alacritty\n Foot\n Ghostty\n Kitty") in
case $(menu "Install" " Alacritty\n Ghostty\n Kitty") in
*Alacritty*) install_terminal "alacritty" ;;
*Foot*) install_terminal "foot" ;;
*Ghostty*) install_terminal "ghostty" ;;
*Kitty*) install_terminal "kitty" ;;
*) show_install_menu ;;
@@ -562,7 +386,7 @@ show_install_ai_menu() {
}
show_install_gaming_menu() {
case $(menu "Install" " Steam\n RetroArch\n󰍳 Minecraft\n󰢹 NVIDIA GeForce NOW\n Xbox Cloud Gaming\n󰂯 Xbox Controller\n󰍹 Moonlight (GameStream)\n Lutris (Battle.net)\n󱓟 Heroic (Epic Games)") in
case $(menu "Install" " Steam\n RetroArch\n󰍳 Minecraft\n󰢹 NVIDIA GeForce NOW\n Xbox Cloud Gaming\n󰖺 Xbox Controller (󰂯)\n󰍹 Moonlight (GameStream)\n Lutris (Battle.net)\n󱓟 Heroic (Epic Games)") in
*Steam*) present_terminal omarchy-install-gaming-steam ;;
*RetroArch*) present_terminal omarchy-install-gaming-retroarch ;;
*Minecraft*) install_and_launch "Minecraft" "minecraft-launcher" "minecraft-launcher" ;;
@@ -644,42 +468,22 @@ show_install_elixir_menu() {
}
show_remove_menu() {
case $(menu "Remove" "󰣇 Package\n Web App\n TUI\n󰵮 Development\n󰸌 Theme\n Browser\n Dictation\n Gaming\n󰍲 Windows\n󰏓 Preinstalls\n Security") in
case $(menu "Remove" "󰣇 Package\n Web App\n TUI\n󰵮 Development\n Gaming\n󰏓 Preinstalls\n Dictation\n󰸌 Theme\n󰍲 Windows\n󰈷 Fingerprint\n Fido2") in
*Package*) terminal omarchy-pkg-remove ;;
*Web*) present_terminal omarchy-webapp-remove ;;
*TUI*) present_terminal omarchy-tui-remove ;;
*Development*) show_remove_development_menu ;;
*Theme*) present_terminal omarchy-theme-remove ;;
*Browser*) show_remove_browser_menu ;;
*Dictation*) present_terminal omarchy-voxtype-remove ;;
*Gaming*) show_remove_gaming_menu ;;
*Windows*) present_terminal "omarchy-windows-vm remove" ;;
*Preinstalls*) present_terminal omarchy-remove-preinstalls ;;
*Security*) show_remove_security_menu ;;
*Dictation*) present_terminal omarchy-voxtype-remove ;;
*Theme*) present_terminal omarchy-theme-remove ;;
*Windows*) present_terminal "omarchy-windows-vm remove" ;;
*Fingerprint*) present_terminal "omarchy-setup-fingerprint --remove" ;;
*Fido2*) present_terminal "omarchy-setup-fido2 --remove" ;;
*) show_main_menu ;;
esac
}
show_remove_security_menu() {
case $(menu "Remove" "󰈷 Fingerprint\n Fido2") in
*Fingerprint*) present_terminal omarchy-remove-security-fingerprint ;;
*Fido2*) present_terminal omarchy-remove-security-fido2 ;;
*) show_remove_menu ;;
esac
}
show_remove_browser_menu() {
case $(menu "Remove" " Chrome\n Edge\n Brave\n Brave Origin\n Firefox\n Zen") in
*Chrome*) present_terminal "omarchy-remove-browser chrome" ;;
*Edge*) present_terminal "omarchy-remove-browser edge" ;;
*"Brave Origin"*) present_terminal "omarchy-remove-browser brave-origin" ;;
*Brave*) present_terminal "omarchy-remove-browser brave" ;;
*Firefox*) present_terminal "omarchy-remove-browser firefox" ;;
*Zen*) present_terminal "omarchy-remove-browser zen" ;;
*) show_remove_menu ;;
esac
}
show_remove_gaming_menu() {
case $(menu "Remove" " Steam\n RetroArch\n󰍳 Minecraft\n󰢹 NVIDIA GeForce NOW\n Xbox Cloud Gaming\n󰖺 Xbox Controller (󰂯)\n󰍹 Moonlight (GameStream)\n Lutris (Battle.net)\n󱓟 Heroic (Epic Games)") in
*Steam*) present_terminal omarchy-remove-gaming-steam ;;
@@ -804,7 +608,7 @@ show_update_hardware_menu() {
show_update_password_menu() {
case $(menu "Update Password" " Drive Encryption\n User") in
*Drive*) present_terminal omarchy-drive-password ;;
*Drive*) present_terminal omarchy-drive-set-password ;;
*User*) present_terminal passwd ;;
*) show_update_menu ;;
esac
@@ -844,8 +648,6 @@ go_to_menu() {
*toggle*) show_toggle_menu ;;
*hardware*) show_hardware_menu ;;
*share*) show_share_menu ;;
*reminder-set*) show_custom_reminder_input ;;
*reminder*) show_reminder_menu ;;
*background*) show_background_menu ;;
*capture*) show_capture_menu ;;
*style*) show_style_menu ;;
-48
View File
@@ -1,48 +0,0 @@
#!/bin/bash
# omarchy:summary=Pick a file with Walker
# omarchy:group=menu
# omarchy:name=file
# omarchy:args=label paths formats [walker args...]
# omarchy:examples=omarchy menu file "Select image" "$HOME/Pictures" "jpg png webp"|omarchy-menu-file "Select media" "$HOME/Pictures:$HOME/Videos" "jpg png mp4 mov" --width 800
set -euo pipefail
if (( $# < 3 )); then
echo "Usage: omarchy-menu-file <label> <paths> <formats> [walker args...]" >&2
exit 1
fi
label="$1"
paths_arg="$2"
formats_arg="$3"
shift 3
IFS=: read -r -a paths <<<"$paths_arg"
read -r -a formats <<<"$formats_arg"
if (( ${#paths[@]} == 0 || ${#formats[@]} == 0 )); then
echo "Usage: omarchy-menu-file <label> <paths> <formats> [walker args...]" >&2
exit 1
fi
for path in "${paths[@]}"; do
[[ -e $path ]] || { echo "Path not found: $path" >&2; exit 1; }
done
find_args=("${paths[@]}" "(" -type d -name ".*" ! -name "." -prune ")" -o -type f ! -name ".*" "(")
first_format=true
for format in "${formats[@]}"; do
if [[ $first_format == "true" ]]; then
first_format=false
else
find_args+=(-o)
fi
format="${format#.}"
find_args+=(-iname "*.$format")
done
find_args+=(")" -printf '%T@\t%p\n')
find "${find_args[@]}" 2>/dev/null | sort -rn | cut -f2- |
omarchy-launch-walker --dmenu --width 800 --minheight 1 --maxheight 500 -p "$label…" "$@" 2>/dev/null
-16
View File
@@ -1,16 +0,0 @@
#!/bin/bash
# omarchy:summary=Prompt for text input with Walker
# omarchy:group=menu
# omarchy:name=input
# omarchy:args=prompt [walker args...]
# omarchy:examples=omarchy menu input Reminder|omarchy-menu-input "Reminder in minutes" --width 400
set -euo pipefail
prompt="${1:-Input}"
if (( $# > 0 )); then
shift
fi
omarchy-launch-walker --dmenu --inputonly --width 295 --minheight 1 --maxheight 1 -p "$prompt…" "$@" 2>/dev/null
-38
View File
@@ -1,38 +0,0 @@
#!/bin/bash
# omarchy:summary=Pick one option with Walker
# omarchy:group=menu
# omarchy:name=select
# omarchy:args=prompt option... [-- walker args...]
# omarchy:examples=omarchy menu select Format jpg png|omarchy-menu-select Resolution 4k 1080p 720p -- --width 400
set -euo pipefail
if (( $# < 2 )); then
echo "Usage: omarchy-menu-select <prompt> <option>... [-- walker args...]" >&2
exit 1
fi
prompt="$1"
shift
options=()
walker_args=()
while (( $# > 0 )); do
if [[ $1 == "--" ]]; then
shift
walker_args=("$@")
break
fi
options+=("$1")
shift
done
if (( ${#options[@]} == 0 )); then
echo "Usage: omarchy-menu-select <prompt> <option>... [-- walker args...]" >&2
exit 1
fi
printf '%s\n' "${options[@]}" | omarchy-launch-walker --dmenu --width 295 --minheight 1 --maxheight 300 -p "$prompt…" "${walker_args[@]}" 2>/dev/null
-32
View File
@@ -1,32 +0,0 @@
#!/bin/bash
# omarchy:summary=Send a desktop notification with Omarchy glyph and body spacing
# omarchy:args=<glyph> <headline> [description] [notify-send options]
# omarchy:examples=omarchy notification send "󰔛" "Reminder" "5 minutes are up" -u critical
set -euo pipefail
if (($# < 2)); then
echo "Usage: omarchy-notification-send <glyph> <headline> [description] [notify-send options]"
exit 1
fi
glyph=$1
headline=$2
description=${3:-}
shift 2
if (($# > 0)) && [[ $1 != -* ]]; then
shift
else
description=""
fi
summary="$glyph $headline"
if [[ -n $description ]]; then
description=$(sed 's/^/ /' <<<"$description")
notify-send "$@" "$summary" "$description"
else
notify-send "$@" "$summary"
fi
+3 -1
View File
@@ -1,8 +1,10 @@
#!/bin/bash
# omarchy:summary=Install Arch packages if they are missing
# omarchy:group=install
# omarchy:name=package
# omarchy:args=<packages...>
# omarchy:examples=omarchy pkg add jq ripgrep
# omarchy:examples=omarchy install package jq ripgrep
# omarchy:requires-sudo=true
if omarchy-pkg-missing "$@"; then
-1
View File
@@ -2,7 +2,6 @@
# omarchy:summary=Preview a Plymouth boot screen with custom colors and logo
# omarchy:args=<background-hex> <text-hex> <path-to-logo.png> <output-path>
# omarchy:examples=omarchy plymouth preview '#1d2021' '#ebdbb2' ~/.config/omarchy/current/theme/plymouth/logo.png /tmp/plymouth-preview.png
# Render a Plymouth login-screen preview PNG by compositing the staged omarchy
# theme assets (recolored with the given text color) onto the background.
+2 -9
View File
@@ -2,7 +2,6 @@
# omarchy:summary=Set the Plymouth boot theme colors and logo
# omarchy:args=<background-hex> <text-hex> <path-to-logo.png>
# omarchy:examples=omarchy plymouth set '#1d2021' '#ebdbb2' ~/.config/omarchy/current/theme/plymouth/logo.png
# omarchy:requires-sudo=true
# Configure the Plymouth boot theme with a custom background color, text color, and logo.
@@ -68,16 +67,10 @@ sddm_dir="/usr/share/sddm/themes/omarchy"
sddm_template="$HOME/.local/share/omarchy/default/sddm/omarchy/Main.qml"
sed \
-e "s/#1a1b26/#$bg_hex/g" \
-e "s/#000000/#$bg_hex/g" \
-e "s/#ffffff/#$text_hex/g" \
-e 's|source: "logo.svg"|source: "logo.png"|' \
"$sddm_template" | sudo tee "$sddm_dir/Main.qml" >/dev/null
sudo cp "$logo_path" "$sddm_dir/logo.png"
for asset in bullet.png entry.png lock.png; do
sudo cp "$staging_dir/$asset" "$sddm_dir/$asset"
done
for asset in entry lock; do
magick "$staging_dir/$asset.png" -channel RGB +level-colors "#f7768e","#f7768e" "$staging_dir/$asset-failed.png"
sudo cp "$staging_dir/$asset-failed.png" "$sddm_dir/$asset-failed.png"
done
sudo rm -f "$sddm_dir/logo.svg"
+2 -7
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Ensure all default .desktop, web apps, TUIs, and npx wrappers are installed.
# omarchy:summary=Ensure all default .desktop, web apps, and TUIs are installed.
mkdir -p ~/.local/share/icons/hicolor/48x48/apps/
cp ~/.local/share/omarchy/applications/icons/*.png ~/.local/share/icons/hicolor/48x48/apps/
@@ -11,14 +11,9 @@ mkdir -p ~/.local/share/applications
cp ~/.local/share/omarchy/applications/*.desktop ~/.local/share/applications/
cp ~/.local/share/omarchy/applications/hidden/*.desktop ~/.local/share/applications/
if omarchy-cmd-present foot; then
cp ~/.local/share/omarchy/default/foot/foot.desktop ~/.local/share/applications/
fi
# Refresh the webapps, TUIs, and npx wrappers
# Refresh the webapps and TUIs
bash $OMARCHY_PATH/install/packaging/icons.sh
bash $OMARCHY_PATH/install/packaging/webapps.sh
bash $OMARCHY_PATH/install/packaging/tuis.sh
bash $OMARCHY_PATH/install/packaging/npx.sh
update-desktop-database ~/.local/share/applications
-139
View File
@@ -1,139 +0,0 @@
#!/bin/bash
# omarchy:summary=Set and show lightweight desktop notification reminders
# omarchy:args=<minutes> [message] | show | clear
# omarchy:examples=omarchy reminder 5 | omarchy reminder 30 "Check the oven" | omarchy reminder show | omarchy reminder clear
set -euo pipefail
format_remaining() {
local seconds=$1
local minutes=$((seconds / 60))
local remainder=$((seconds % 60))
if ((minutes > 0 && remainder > 0)); then
echo "${minutes}m ${remainder}s"
elif ((minutes > 0)); then
echo "${minutes}m"
else
echo "${remainder}s"
fi
}
parse_systemd_timespan() {
local timespan="$1"
local total=0
local value unit whole
while read -r value unit; do
whole=${value%.*}
case $unit in
d) total=$((total + whole * 86400)) ;;
h) total=$((total + whole * 3600)) ;;
min) total=$((total + whole * 60)) ;;
s) total=$((total + whole)) ;;
ms | us) ;;
esac
done < <(grep -oE '[0-9]+([.][0-9]+)?(d|h|min|s|ms|us)' <<<"$timespan" | sed -E 's/^([0-9.]+)([a-z]+)$/\1 \2/')
echo "$total"
}
show_reminders() {
local timers timer next next_seconds uptime remaining body=""
local reminder_dir="${XDG_RUNTIME_DIR:-/tmp}/omarchy-reminders"
local reminder_message=""
timers=$(systemctl --user list-timers --all --no-legend --no-pager "omarchy-reminder-*.timer" 2>/dev/null | awk '{ print $(NF - 1) }')
uptime=${SECONDS_SINCE_BOOT:-$(awk '{ print int($1) }' /proc/uptime)}
for timer in $timers; do
next=$(systemctl --user show -P NextElapseUSecMonotonic "$timer" 2>/dev/null || true)
[[ -z $next ]] && continue
next_seconds=$(parse_systemd_timespan "$next")
((next_seconds <= uptime)) && continue
remaining=$((next_seconds - uptime))
reminder=${timer%.timer}
reminder=${reminder#omarchy-reminder-}
set_at=${reminder##*-}
reminder_minutes=${reminder%%m-*}
reminder_message=""
[[ -f $reminder_dir/${timer%.timer}.message ]] && reminder_message=$(<"$reminder_dir/${timer%.timer}.message")
if [[ -n $reminder_message ]]; then
body+="$reminder_message in $(format_remaining $remaining) ($(date -d "@$((set_at + reminder_minutes * 60))" +%-H:%M))"$'\n'
else
body+="${reminder_minutes}-min reminder in $(format_remaining $remaining) ($(date -d "@$((set_at + reminder_minutes * 60))" +%-H:%M))"$'\n'
fi
done
if [[ -z $body ]]; then
omarchy-notification-send "󰔛" "Upcoming reminders" "No outstanding reminders" -u low
else
omarchy-notification-send "󰔛" "Upcoming reminders" "${body%$'\n'}" -u low
fi
}
clear_reminders() {
local units
local reminder_dir="${XDG_RUNTIME_DIR:-/tmp}/omarchy-reminders"
units=$(systemctl --user list-timers --all --no-legend --no-pager "omarchy-reminder-*.timer" 2>/dev/null | awk '{ print $(NF - 1), $NF }')
if [[ -n $units ]]; then
xargs -r systemctl --user stop <<<"$units" || true
fi
rm -f "$reminder_dir"/omarchy-reminder-*.message 2>/dev/null || true
omarchy-notification-send "󰔛" "All reminders have been cleared" -u low
}
case ${1:-} in
show | list)
show_reminders
exit 0
;;
clear)
clear_reminders
exit 0
;;
esac
minutes=${1:-}
shift || true
message="$*"
custom_message="$message"
if [[ -z $minutes ]] || [[ ! $minutes =~ ^[0-9]+$ ]] || ((minutes == 0)); then
echo "Usage: omarchy-reminder <minutes> [message]"
echo " omarchy-reminder show"
echo " omarchy-reminder clear"
exit 1
fi
if [[ -z $message ]]; then
message="Your ${minutes} minutes are up"
fi
set_at=$(date +%s)
remind_at=$(date -d "+${minutes} minutes" +%H:%M)
unit="omarchy-reminder-${minutes}m-$set_at"
reminder_dir="${XDG_RUNTIME_DIR:-/tmp}/omarchy-reminders"
message_file="$reminder_dir/$unit.message"
confirmation="You'll be reminded at $remind_at"
confirmation_title="Reminder set for ${minutes} minutes"
mkdir -p "$reminder_dir"
if [[ -n $custom_message ]]; then
printf "%s" "$custom_message" >"$message_file"
confirmation_title="$custom_message in ${minutes} minutes"
fi
systemd-run --user --quiet --collect --on-active="${minutes}m" --unit="$unit" \
bash -c 'omarchy-notification-send "󰔛" "Reminder" "$1" -u critical; rm -f "$2"' bash "$message" "$message_file"
omarchy-notification-send "󰔛" "$confirmation_title" "$confirmation" -u low
-73
View File
@@ -1,73 +0,0 @@
#!/bin/bash
# omarchy:summary=Remove a supported browser and clean up Omarchy browser defaults
# omarchy:args=<chrome|brave|brave-origin|edge|firefox|zen>
# omarchy:examples=omarchy remove browser firefox | omarchy remove browser brave
# omarchy:requires-sudo=true
set_fallback_default_browser() {
local current_browser
current_browser=$(xdg-settings get default-web-browser)
if [[ $current_browser != "$1" ]]; then
return
fi
if omarchy-cmd-present chromium; then
xdg-settings set default-web-browser chromium.desktop
xdg-mime default chromium.desktop x-scheme-handler/http
xdg-mime default chromium.desktop x-scheme-handler/https
xdg-mime default chromium.desktop text/html
fi
}
case $1 in
chrome)
echo "Removing Chrome..."
set_fallback_default_browser google-chrome.desktop
omarchy-pkg-drop google-chrome
rm -f ~/.config/chrome-flags.conf
sudo rm -f /etc/opt/chrome/policies/managed/color.json
;;
edge)
echo "Removing Edge..."
set_fallback_default_browser microsoft-edge.desktop
omarchy-pkg-drop microsoft-edge-stable-bin
rm -f ~/.config/microsoft-edge-stable-flags.conf
sudo rm -f /etc/opt/edge/policies/managed/color.json
;;
brave)
echo "Removing Brave..."
set_fallback_default_browser brave-browser.desktop
omarchy-pkg-drop brave-bin
rm -f ~/.config/brave-flags.conf
if omarchy-pkg-missing brave-origin-beta-bin; then
sudo rm -rf /etc/brave
fi
;;
brave-origin)
echo "Removing Brave Origin..."
set_fallback_default_browser brave-origin-beta.desktop
omarchy-pkg-drop brave-origin-beta-bin
rm -f ~/.config/brave-origin-beta-flags.conf
if omarchy-pkg-missing brave-bin; then
sudo rm -rf /etc/brave
fi
;;
firefox)
echo "Removing Firefox..."
set_fallback_default_browser firefox.desktop
omarchy-pkg-drop firefox
;;
zen)
echo "Removing Zen..."
set_fallback_default_browser zen.desktop
omarchy-pkg-drop zen-browser-bin
;;
*)
echo "Usage: omarchy-remove-browser <chrome|brave|brave-origin|edge|firefox|zen>"
exit 1
;;
esac
+1 -2
View File
@@ -21,8 +21,7 @@ omarchy-pkg-drop \
libretro-parallel-n64 libretro-picodrive libretro-play libretro-ppsspp \
libretro-sameboy libretro-scummvm libretro-shaders-slang libretro-snes9x \
libretro-yabause \
libretro-cap32-git libretro-fbneo-git libretro-uae-git libretro-vice-git \
retroarch-joypad-autoconfig-git
libretro-fbneo-git
rm -rf \
"$HOME/.config/retroarch" \
-35
View File
@@ -1,35 +0,0 @@
#!/bin/bash
# omarchy:summary=Remove FIDO2 authentication from sudo and polkit
# omarchy:requires-sudo=true
set -e
remove_pam_config() {
# Remove from sudo
if grep -q pam_u2f.so /etc/pam.d/sudo; then
omarchy-echo-info "Removing FIDO2 authentication from sudo..."
sudo sed -i '/pam_u2f\.so/d' /etc/pam.d/sudo
fi
# Remove from polkit
if [[ -f /etc/pam.d/polkit-1 ]] && grep -Fq 'pam_u2f.so' /etc/pam.d/polkit-1; then
omarchy-echo-info "Removing FIDO2 authentication from polkit..."
sudo sed -i '/pam_u2f\.so/d' /etc/pam.d/polkit-1
fi
}
omarchy-echo-success "Removing FIDO2 device from authentication.\n"
remove_pam_config
if [[ -d /etc/fido2 ]]; then
omarchy-echo-info "Removing FIDO2 configuration..."
sudo rm -rf /etc/fido2
fi
omarchy-echo-info "Removing FIDO2 packages..."
omarchy-pkg-drop libfido2 pam-u2f
omarchy-echo-success "FIDO2 authentication has been completely removed."
-37
View File
@@ -1,37 +0,0 @@
#!/bin/bash
# omarchy:summary=Remove fingerprint authentication from sudo, polkit, and lock screen
# omarchy:requires-sudo=true
set -e
remove_pam_config() {
# Remove from sudo
if grep -q pam_fprintd.so /etc/pam.d/sudo; then
omarchy-echo-info "Removing fingerprint authentication from sudo..."
sudo sed -i '/pam_fprintd\.so/d' /etc/pam.d/sudo
fi
# Remove from polkit
if [[ -f /etc/pam.d/polkit-1 ]] && grep -Fq 'pam_fprintd.so' /etc/pam.d/polkit-1; then
omarchy-echo-info "Removing fingerprint authentication from polkit..."
sudo sed -i '/pam_fprintd\.so/d' /etc/pam.d/polkit-1
fi
}
remove_hyprlock_fingerprint_icon() {
omarchy-echo-info "Removing fingerprint icon from hyprlock placeholder text..."
sed -i 's/placeholder_text = .*/placeholder_text = Enter Password/' ~/.config/hypr/hyprlock.conf
sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = false/' ~/.config/hypr/hyprlock.conf
}
omarchy-echo-success "Removing fingerprint scanner from authentication.\n"
remove_pam_config
remove_hyprlock_fingerprint_icon
omarchy-echo-info "Removing fingerprint packages..."
omarchy-pkg-drop fprintd libfprint-git
omarchy-echo-success "Fingerprint authentication has been completely removed."
+1 -1
View File
@@ -1,6 +1,6 @@
#!/bin/bash
# omarchy:summary=Reload Helix configuration
# Reload Helix configuration (used by the Omarchy theme switching).
if pgrep -x helix >/dev/null; then
pkill -USR1 helix
+2 -6
View File
@@ -2,9 +2,5 @@
# omarchy:summary=Restart the PipeWire audio service to fix audio issues or apply new configuration.
echo -e "Restarting PipeWire audio services...\n"
systemctl --user restart wireplumber.service pipewire.service
if systemctl --user --quiet is-active pipewire-pulse.service; then
systemctl --user restart pipewire-pulse.service
fi
echo -e "Restarting pipewire audio service...\n"
systemctl --user restart pipewire.service
+1 -5
View File
@@ -2,8 +2,4 @@
# omarchy:summary=Restart the SwayOSD server
if systemctl --user is-enabled --quiet swayosd-server.service; then
systemctl --user restart swayosd-server.service
else
omarchy-restart-app swayosd-server
fi
omarchy-restart-app swayosd-server
+1 -1
View File
@@ -4,7 +4,7 @@
# omarchy:requires-sudo=true
for dev in /sys/bus/i2c/drivers/i2c_hid_acpi/i2c-*; do
[[ -e $dev ]] || continue
[ -e "$dev" ] || continue
I2C_DEVICE=$(basename "$dev")
echo "Resetting $I2C_DEVICE via i2c_hid_acpi unbind/rebind..."
echo "$I2C_DEVICE" | sudo tee /sys/bus/i2c/drivers/i2c_hid_acpi/unbind > /dev/null
+131
View File
@@ -0,0 +1,131 @@
#!/bin/bash
# omarchy:summary=Set up or remove FIDO2 authentication for sudo and polkit
# omarchy:args=[--remove]
# omarchy:requires-sudo=true
set -e
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
print_success() {
echo -e "${GREEN}$1${NC}"
}
print_error() {
echo -e "${RED}$1${NC}"
}
print_info() {
echo -e "${YELLOW}$1${NC}"
}
check_fido2_hardware() {
tokens=$(fido2-token -L 2>/dev/null)
if [[ -z $tokens ]]; then
print_error "\nNo FIDO2 device detected. Please plug it in (you may need to unlock it as well)."
return 1
fi
return 0
}
setup_pam_config() {
# Configure sudo
if ! grep -q pam_u2f.so /etc/pam.d/sudo; then
print_info "Configuring sudo for FIDO2 authentication..."
sudo sed -i '1i auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2' /etc/pam.d/sudo
fi
# Configure polkit
if [[ -f /etc/pam.d/polkit-1 ]] && ! grep -q 'pam_u2f.so' /etc/pam.d/polkit-1; then
print_info "Configuring polkit for FIDO2 authentication..."
sudo sed -i '1i auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2' /etc/pam.d/polkit-1
elif [[ ! -f /etc/pam.d/polkit-1 ]]; then
print_info "Creating polkit configuration with FIDO2 authentication..."
sudo tee /etc/pam.d/polkit-1 >/dev/null <<'EOF'
auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2
auth required pam_unix.so
account required pam_unix.so
password required pam_unix.so
session required pam_unix.so
EOF
fi
}
remove_pam_config() {
# Remove from sudo
if grep -q pam_u2f.so /etc/pam.d/sudo; then
print_info "Removing FIDO2 authentication from sudo..."
sudo sed -i '/pam_u2f\.so/d' /etc/pam.d/sudo
fi
# Remove from polkit
if [[ -f /etc/pam.d/polkit-1 ]] && grep -Fq 'pam_u2f.so' /etc/pam.d/polkit-1; then
print_info "Removing FIDO2 authentication from polkit..."
sudo sed -i '/pam_u2f\.so/d' /etc/pam.d/polkit-1
fi
}
if [[ "--remove" == $1 ]]; then
print_success "Removing FIDO2 device from authentication.\n"
# Remove PAM configuration
remove_pam_config
# Remove FIDO2 configuration
if [[ -d /etc/fido2 ]]; then
print_info "Removing FIDO2 configuration..."
sudo rm -rf /etc/fido2
fi
# Uninstall packages
print_info "Removing FIDO2 packages..."
sudo pacman -Rns --noconfirm libfido2 pam-u2f
print_success "FIDO2 authentication has been completely removed."
else
print_success "Setting up FIDO2 device for authentication.\n"
# Install required packages
print_info "Installing required packages..."
omarchy-pkg-add libfido2 pam-u2f
if ! check_fido2_hardware; then
exit 1
fi
# Create the pamu2fcfg file
if [[ ! -f /etc/fido2/fido2 ]]; then
sudo mkdir -p /etc/fido2
print_success "\nLet's setup your device by confirming on the device now."
print_info "Touch your FIDO2 key when it lights up...\n"
if pamu2fcfg >/tmp/fido2; then
sudo mv /tmp/fido2 /etc/fido2/fido2
print_success "FIDO2 device registered successfully!"
else
print_error "\nFIDO2 registration failed. Please try again."
exit 1
fi
else
print_info "FIDO2 device already registered."
fi
# Configure PAM
setup_pam_config
# Test with sudo
print_info "\nTesting FIDO2 authentication with sudo..."
print_info "Touch your FIDO2 key when prompted.\n"
if sudo echo "FIDO2 authentication test successful"; then
print_success "\nPerfect! FIDO2 authentication is now configured."
print_info "You can use your FIDO2 key for sudo and polkit authentication."
else
print_error "\nVerification failed. You may want to check your configuration."
fi
fi
+161
View File
@@ -0,0 +1,161 @@
#!/bin/bash
# omarchy:summary=Set up or remove fingerprint authentication for sudo, polkit, and lock screen
# omarchy:args=[--remove]
# omarchy:requires-sudo=true
set -e
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
print_success() {
echo -e "${GREEN}$1${NC}"
}
print_error() {
echo -e "${RED}$1${NC}"
}
print_info() {
echo -e "${YELLOW}$1${NC}"
}
check_fingerprint_hardware() {
# Get fingerprint devices for the user
devices=$(fprintd-list "$USER" 2>/dev/null)
# Exit if no devices found
if [[ -z $devices ]]; then
print_error "\nNo fingerprint sensor detected."
return 1
fi
return 0
}
setup_pam_config() {
# Configure sudo
if ! grep -q pam_fprintd.so /etc/pam.d/sudo; then
print_info "Configuring sudo for fingerprint authentication..."
sudo sed -i '1i auth sufficient pam_fprintd.so' /etc/pam.d/sudo
fi
# Configure polkit
if [[ -f /etc/pam.d/polkit-1 ]] && ! grep -q 'pam_fprintd.so' /etc/pam.d/polkit-1; then
print_info "Configuring polkit for fingerprint authentication..."
sudo sed -i '1i auth sufficient pam_fprintd.so' /etc/pam.d/polkit-1
elif [[ ! -f /etc/pam.d/polkit-1 ]]; then
print_info "Creating polkit configuration with fingerprint authentication..."
sudo tee /etc/pam.d/polkit-1 >/dev/null <<'EOF'
auth sufficient pam_fprintd.so
auth required pam_unix.so
account required pam_unix.so
password required pam_unix.so
session required pam_unix.so
EOF
fi
}
add_hyprlock_fingerprint_icon() {
print_info "Adding fingerprint icon to hyprlock placeholder text..."
sed -i 's/placeholder_text = .*/placeholder_text = <span> Enter Password 󰈷 <\/span>/' ~/.config/hypr/hyprlock.conf
sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = true/' ~/.config/hypr/hyprlock.conf
}
remove_hyprlock_fingerprint_icon() {
print_info "Removing fingerprint icon from hyprlock placeholder text..."
sed -i 's/placeholder_text = .*/placeholder_text = Enter Password/' ~/.config/hypr/hyprlock.conf
sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = false/' ~/.config/hypr/hyprlock.conf
}
remove_pam_config() {
# Remove from sudo
if grep -q pam_fprintd.so /etc/pam.d/sudo; then
print_info "Removing fingerprint authentication from sudo..."
sudo sed -i '/pam_fprintd\.so/d' /etc/pam.d/sudo
fi
# Remove from polkit
if [[ -f /etc/pam.d/polkit-1 ]] && grep -Fq 'pam_fprintd.so' /etc/pam.d/polkit-1; then
print_info "Removing fingerprint authentication from polkit..."
sudo sed -i '/pam_fprintd\.so/d' /etc/pam.d/polkit-1
fi
}
if [[ "--remove" == $1 ]]; then
print_success "Removing fingerprint scanner from authentication.\n"
# Remove PAM configuration
remove_pam_config
# Remove fingerprint icon from hyprlock placeholder text
remove_hyprlock_fingerprint_icon
# Uninstall packages
print_info "Removing fingerprint packages..."
sudo pacman -Rns --noconfirm fprintd
print_success "Fingerprint authentication has been completely removed."
else
print_success "Setting up fingerprint scanner for authentication.\n"
# Install required packages
print_info "Installing required packages..."
# ASUS ExpertBook B9406CAA ships a FocalTech FT9349 ESS reader (USB
# 2808:a97a). Mainline libfprint at 1.94.x lacks the focaltech_moc
# driver (and its 0xa97a id_table entry); OPR ships libfprint-git
# which carries both. Once upstream catches up, this branch is a
# no-op and `libfprint-git` provides=libfprint anyway. Detect via
# /sys to avoid depending on usbutils being installed first.
for v in /sys/bus/usb/devices/*/idVendor; do
[[ "$(cat "$v" 2>/dev/null)" == "2808" ]] || continue
[[ "$(cat "${v%idVendor}idProduct" 2>/dev/null)" == "a97a" ]] || continue
print_info "FocalTech FT9349 detected (B9406CAA) — using libfprint-git from OPR..."
# libfprint-git provides+conflicts libfprint; pacman -S --noconfirm
# defaults the conflict prompt to N and aborts. Pre-remove libfprint
# with -Rdd so the install goes silent. -Rdd (not omarchy-pkg-drop's
# -Rns) is required because fprintd requires libfprint; the dep is
# re-satisfied immediately by libfprint-git's provides=libfprint.
if omarchy-pkg-present libfprint; then
sudo pacman -Rdd --noconfirm libfprint
fi
omarchy-pkg-add libfprint-git
break
done
omarchy-pkg-add fprintd usbutils
if ! check_fingerprint_hardware; then
exit 1
fi
# Configure PAM
setup_pam_config
# Add fingerprint icon to hyprlock placeholder text
add_hyprlock_fingerprint_icon
# Enroll first fingerprint
print_success "\nLet's setup your right index finger as the first fingerprint."
print_info "Keep moving the finger around on sensor until the process completes.\n"
if sudo fprintd-enroll "$USER"; then
print_success "\nFingerprint enrolled successfully!"
# Verify
print_info "\nNow let's verify that it's working correctly.\n"
if fprintd-verify; then
print_success "\nPerfect! Fingerprint authentication is now configured."
print_info "You can use your fingerprint for sudo, polkit, and lock screen (Super + Escape)."
else
print_error "\nVerification failed. You may want to try enrolling again."
fi
else
print_error "\nEnrollment failed. Please try again."
exit 1
fi
fi
-81
View File
@@ -1,81 +0,0 @@
#!/bin/bash
# omarchy:summary=Set up FIDO2 authentication for sudo and polkit
# omarchy:requires-sudo=true
set -e
check_fido2_hardware() {
tokens=$(fido2-token -L 2>/dev/null)
if [[ -z $tokens ]]; then
omarchy-echo-failure "\nNo FIDO2 device detected. Please plug it in (you may need to unlock it as well)."
return 1
fi
return 0
}
setup_pam_config() {
# Configure sudo
if ! grep -q pam_u2f.so /etc/pam.d/sudo; then
omarchy-echo-info "Configuring sudo for FIDO2 authentication..."
sudo sed -i '1i auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2' /etc/pam.d/sudo
fi
# Configure polkit
if [[ -f /etc/pam.d/polkit-1 ]] && ! grep -q 'pam_u2f.so' /etc/pam.d/polkit-1; then
omarchy-echo-info "Configuring polkit for FIDO2 authentication..."
sudo sed -i '1i auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2' /etc/pam.d/polkit-1
elif [[ ! -f /etc/pam.d/polkit-1 ]]; then
omarchy-echo-info "Creating polkit configuration with FIDO2 authentication..."
sudo tee /etc/pam.d/polkit-1 >/dev/null <<'EOF'
auth sufficient pam_u2f.so cue authfile=/etc/fido2/fido2
auth required pam_unix.so
account required pam_unix.so
password required pam_unix.so
session required pam_unix.so
EOF
fi
}
omarchy-echo-success "Setting up FIDO2 device for authentication.\n"
# Install required packages
omarchy-echo-info "Installing required packages..."
omarchy-pkg-add libfido2 pam-u2f
if ! check_fido2_hardware; then
exit 1
fi
# Create the pamu2fcfg file
if [[ ! -f /etc/fido2/fido2 ]]; then
sudo mkdir -p /etc/fido2
omarchy-echo-success "\nLet's setup your device by confirming on the device now."
omarchy-echo-info "Touch your FIDO2 key when it lights up...\n"
if pamu2fcfg >/tmp/fido2; then
sudo mv /tmp/fido2 /etc/fido2/fido2
omarchy-echo-success "FIDO2 device registered successfully!"
else
omarchy-echo-failure "\nFIDO2 registration failed. Please try again."
exit 1
fi
else
omarchy-echo-info "FIDO2 device already registered."
fi
# Configure PAM
setup_pam_config
# Test with sudo
omarchy-echo-info "\nTesting FIDO2 authentication with sudo..."
omarchy-echo-info "Touch your FIDO2 key when prompted.\n"
if sudo echo "FIDO2 authentication test successful"; then
omarchy-echo-success "\nPerfect! FIDO2 authentication is now configured."
omarchy-echo-info "You can use your FIDO2 key for sudo and polkit authentication."
else
omarchy-echo-failure "\nVerification failed. You may want to check your configuration."
fi
-95
View File
@@ -1,95 +0,0 @@
#!/bin/bash
# omarchy:summary=Set up fingerprint authentication for sudo, polkit, and lock screen
# omarchy:requires-sudo=true
set -e
check_fingerprint_hardware() {
# Get fingerprint devices for the user
devices=$(fprintd-list "$USER" 2>/dev/null)
# Exit if no devices found
if [[ -z $devices ]]; then
omarchy-echo-failure "\nNo fingerprint sensor detected."
return 1
fi
return 0
}
setup_pam_config() {
# Configure sudo
if ! grep -q pam_fprintd.so /etc/pam.d/sudo; then
omarchy-echo-info "Configuring sudo for fingerprint authentication..."
sudo sed -i '1i auth sufficient pam_fprintd.so' /etc/pam.d/sudo
fi
# Configure polkit
if [[ -f /etc/pam.d/polkit-1 ]] && ! grep -q 'pam_fprintd.so' /etc/pam.d/polkit-1; then
omarchy-echo-info "Configuring polkit for fingerprint authentication..."
sudo sed -i '1i auth sufficient pam_fprintd.so' /etc/pam.d/polkit-1
elif [[ ! -f /etc/pam.d/polkit-1 ]]; then
omarchy-echo-info "Creating polkit configuration with fingerprint authentication..."
sudo tee /etc/pam.d/polkit-1 >/dev/null <<'EOF'
auth sufficient pam_fprintd.so
auth required pam_unix.so
account required pam_unix.so
password required pam_unix.so
session required pam_unix.so
EOF
fi
}
add_hyprlock_fingerprint_icon() {
omarchy-echo-info "Adding fingerprint icon to hyprlock placeholder text..."
sed -i 's/placeholder_text = .*/placeholder_text = <span> Enter Password 󰈷 <\/span>/' ~/.config/hypr/hyprlock.conf
sed -i 's/fingerprint:enabled = .*/fingerprint:enabled = true/' ~/.config/hypr/hyprlock.conf
}
omarchy-echo-success "Setting up fingerprint scanner for authentication.\n"
# Install required packages
omarchy-echo-info "Installing required packages..."
# libfprint-git provides+conflicts libfprint; pacman -S --noconfirm
# defaults the conflict prompt to N and aborts. Pre-remove libfprint
# with -Rdd so the install goes silent. -Rdd (not omarchy-pkg-drop's
# -Rns) is required because fprintd requires libfprint; the dep is
# re-satisfied immediately by libfprint-git's provides=libfprint.
if omarchy-pkg-present libfprint; then
sudo pacman -Rdd --noconfirm libfprint
fi
omarchy-pkg-add libfprint-git fprintd usbutils
if ! check_fingerprint_hardware; then
exit 1
fi
# Configure PAM
setup_pam_config
# Add fingerprint icon to hyprlock placeholder text
add_hyprlock_fingerprint_icon
# Enroll first fingerprint
omarchy-echo-success "\nLet's setup your right index finger as the first fingerprint."
omarchy-echo-info "Keep moving the finger around on sensor until the process completes.\n"
if sudo fprintd-enroll "$USER"; then
omarchy-echo-success "\nFingerprint enrolled successfully!"
# Verify
omarchy-echo-info "\nNow let's verify that it's working correctly.\n"
if fprintd-verify; then
omarchy-echo-success "\nPerfect! Fingerprint authentication is now configured."
omarchy-echo-info "You can use your fingerprint for sudo, polkit, and lock screen (Super + Escape)."
else
omarchy-echo-failure "\nVerification failed. You may want to try enrolling again."
fi
else
omarchy-echo-failure "\nEnrollment failed. Please try again."
exit 1
fi
-1
View File
@@ -2,7 +2,6 @@
# omarchy:summary=Manage persistent state files for Omarchy toggles and settings.
# omarchy:args=<set|clear> <state-name-or-pattern>
# omarchy:hidden=true
STATE_DIR="$HOME/.local/state/omarchy"
mkdir -p "$STATE_DIR"
+1 -2
View File
@@ -1,8 +1,7 @@
#!/bin/bash
# omarchy:summary=Display brightness level using SwayOSD on the current monitor.
# omarchy:args=<0-100>
# omarchy:examples=omarchy swayosd brightness 0 | omarchy swayosd brightness 50 | omarchy swayosd brightness 100
# omarchy:args=<percent>
percent="$1"
+1 -2
View File
@@ -1,8 +1,7 @@
#!/bin/bash
# omarchy:summary=Display keyboard brightness level using SwayOSD on the current monitor.
# omarchy:args=<0-100>
# omarchy:examples=omarchy swayosd kbd brightness 0 | omarchy swayosd kbd brightness 50 | omarchy swayosd kbd brightness 100
# omarchy:args=<percent>
percent="$1"
+2 -16
View File
@@ -1,16 +1,11 @@
#!/bin/bash
# omarchy:summary=Lock the computer and turn off the display
# omarchy:summary=Lock the screen
# omarchy:group=system
# omarchy:name=lock
# omarchy:examples=omarchy system lock
if ! pidof hyprlock >/dev/null; then
(
hyprlock
omarchy-system-wake
) &
fi
pidof hyprlock || hyprlock &
# Set keyboard layout to default (first layout)
hyprctl switchxkblayout all 0 > /dev/null 2>&1
@@ -22,12 +17,3 @@ fi
# Avoid running screensaver when locked
pkill -f org.omarchy.screensaver
if [[ ${OMARCHY_LOCK_ONLY:-false} != "true" ]]; then
(
sleep 3
pidof hyprlock >/dev/null || exit 0
omarchy-brightness-keyboard off
omarchy-brightness-display off
) &
fi
-9
View File
@@ -1,9 +0,0 @@
#!/bin/bash
# omarchy:summary=Wake displays and restore brightness after idle
# omarchy:group=system
# omarchy:name=wake
# omarchy:examples=omarchy system wake
omarchy-brightness-display on
omarchy-brightness-keyboard restore
+1 -6
View File
@@ -9,14 +9,9 @@ if [[ -z $1 ]]; then
exit 1
fi
BACKGROUND="$(realpath "$1")"
BACKGROUND="$1"
CURRENT_BACKGROUND_LINK="$HOME/.config/omarchy/current/background"
if [[ ! -f "$BACKGROUND" ]]; then
echo "File does not exist: $BACKGROUND" >&2
exit 1
fi
# Create symlink to the new background
ln -nsf "$BACKGROUND" "$CURRENT_BACKGROUND_LINK"
-1
View File
@@ -2,7 +2,6 @@
# omarchy:summary=Generate a theme's colors.toml from its alacritty.toml palette
# omarchy:args=<theme-dir>
# omarchy:hidden=true
set -e
+1 -1
View File
@@ -5,5 +5,5 @@
THEME_NAME_PATH="$HOME/.config/omarchy/current/theme.name"
if [[ -f $THEME_NAME_PATH ]]; then
OMARCHY_THEME_SKIP_BACKGROUND=1 omarchy-theme-set "$(cat $THEME_NAME_PATH)"
omarchy-theme-set "$(cat $THEME_NAME_PATH)"
fi
+2 -5
View File
@@ -45,9 +45,7 @@ mv "$NEXT_THEME_PATH" "$CURRENT_THEME_PATH"
echo "$THEME_NAME" >"$HOME/.config/omarchy/current/theme.name"
# Change background with theme
if [[ $OMARCHY_THEME_SKIP_BACKGROUND != "1" ]]; then
omarchy-theme-bg-next
fi
omarchy-theme-bg-next
# Restart components to apply new theme
if pgrep -x waybar >/dev/null; then
@@ -62,7 +60,6 @@ omarchy-restart-mako
omarchy-restart-helix
# Change app-specific themes
omarchy-theme-set-foot
omarchy-theme-set-gnome
omarchy-theme-set-browser
omarchy-theme-set-vscode
@@ -70,4 +67,4 @@ omarchy-theme-set-obsidian
omarchy-theme-set-keyboard
# Call hook on theme set
omarchy-hook theme-set "$THEME_NAME" >/dev/null
omarchy-hook theme-set "$THEME_NAME"
+22 -36
View File
@@ -1,44 +1,30 @@
#!/bin/bash
# omarchy:summary=Apply the current theme color to Chromium, Chrome, Edge, and Brave
# omarchy:hidden=true
# omarchy:summary=Apply the current theme color to Chromium and Brave
CHROMIUM_THEME=~/.config/omarchy/current/theme/chromium.theme
if [[ -f $CHROMIUM_THEME ]]; then
THEME_RGB_COLOR=$(<$CHROMIUM_THEME)
THEME_HEX_COLOR=$(printf '#%02x%02x%02x' ${THEME_RGB_COLOR//,/ })
else
# Use a default, neutral grey if theme doesn't have a color
THEME_HEX_COLOR="#1c2027"
fi
set_browser_policy() {
local policy_dir="$1"
[[ -d $policy_dir ]] || return
echo "{\"BrowserThemeColor\": \"$THEME_HEX_COLOR\", \"BrowserColorScheme\": \"device\"}" | tee "$policy_dir/color.json" >/dev/null
}
refresh_running_browser() {
local process="$1"
local command="$2"
local pgrep_args="${3:--x}"
if omarchy-cmd-present "$command" && pgrep $pgrep_args "$process" >/dev/null; then
"$command" --refresh-platform-policy --no-startup-window &>/dev/null
if omarchy-cmd-present chromium || omarchy-cmd-present brave || omarchy-cmd-present brave-origin-beta; then
if [[ -f $CHROMIUM_THEME ]]; then
THEME_RGB_COLOR=$(<$CHROMIUM_THEME)
THEME_HEX_COLOR=$(printf '#%02x%02x%02x' ${THEME_RGB_COLOR//,/ })
else
# Use a default, neutral grey if theme doesn't have a color
THEME_RGB_COLOR="28,32,39"
THEME_HEX_COLOR="#1c2027"
fi
}
set_browser_policy /etc/chromium/policies/managed
refresh_running_browser chromium chromium
if omarchy-cmd-present chromium; then
echo "{\"BrowserThemeColor\": \"$THEME_HEX_COLOR\", \"BrowserColorScheme\": \"device\"}" | tee "/etc/chromium/policies/managed/color.json" >/dev/null
pgrep -x chromium >/dev/null && chromium --refresh-platform-policy --no-startup-window &>/dev/null
fi
set_browser_policy /etc/opt/chrome/policies/managed
refresh_running_browser chrome google-chrome-stable || refresh_running_browser chrome google-chrome
set_browser_policy /etc/opt/edge/policies/managed
refresh_running_browser msedge microsoft-edge-stable
set_browser_policy /etc/brave/policies/managed
refresh_running_browser brave brave
refresh_running_browser brave-origin-beta brave-origin-beta -f
# Brave and Brave Origin Beta share /etc/brave/policies, so a single write covers both
if omarchy-cmd-present brave || omarchy-cmd-present brave-origin-beta; then
echo "{\"BrowserThemeColor\": \"$THEME_HEX_COLOR\", \"BrowserColorScheme\": \"device\"}" | tee "/etc/brave/policies/managed/color.json" >/dev/null
if pgrep -x brave >/dev/null; then
omarchy-cmd-present brave && brave --refresh-platform-policy --no-startup-window &>/dev/null
omarchy-cmd-present brave-origin-beta && brave-origin-beta --refresh-platform-policy --no-startup-window &>/dev/null
fi
fi
fi
-28
View File
@@ -1,28 +0,0 @@
#!/bin/bash
# omarchy:summary=Apply current Omarchy theme colors to running Foot terminals
# omarchy:hidden=true
foot_theme=~/.config/omarchy/current/theme/foot.ini
if [[ ! -f $foot_theme ]] || ! pgrep -x foot >/dev/null; then
exit 0
fi
foot_osc=$(awk -F= '
function color(value) { return "#" value }
/^foreground=/ { printf "\033]10;%s\007", color($2) }
/^background=/ { printf "\033]11;%s\007", color($2) }
/^cursor=/ { split($2, parts, " "); printf "\033]12;%s\007", color(parts[2]) }
/^selection-background=/ { printf "\033]17;%s\007", color($2) }
/^selection-foreground=/ { printf "\033]19;%s\007", color($2) }
/^regular[0-7]=/ { split($1, parts, "regular"); printf "\033]4;%d;%s\007", parts[2], color($2) }
/^bright[0-7]=/ { split($1, parts, "bright"); printf "\033]4;%d;%s\007", parts[2] + 8, color($2) }
' "$foot_theme")
for foot_pid in $(pgrep -x foot); do
for child_pid in $(pgrep -P "$foot_pid"); do
tty=$(readlink "/proc/$child_pid/fd/1" 2>/dev/null)
[[ $tty == /dev/pts/* ]] && printf '%b' "$foot_osc" >"$tty"
done
done
-1
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Apply the current theme to GNOME color mode and icon settings
# omarchy:hidden=true
if [[ -f ~/.config/omarchy/current/theme/light.mode ]]; then
gsettings set org.gnome.desktop.interface color-scheme "prefer-light"
-1
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Apply the current theme keyboard color to supported keyboards
# omarchy:hidden=true
omarchy-theme-set-keyboard-asus-rog
omarchy-theme-set-keyboard-f16
-1
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Apply the current theme keyboard color to ASUS ROG keyboards
# omarchy:hidden=true
ASUSCTL_THEME=~/.config/omarchy/current/theme/keyboard.rgb
-1
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Apply the current theme keyboard color to Framework Laptop 16 keyboards
# omarchy:hidden=true
FRAMEWORK16_THEME=~/.config/omarchy/current/theme/keyboard.rgb
-1
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Sync Omarchy theme to all Obsidian vaults
# omarchy:hidden=true
CURRENT_THEME_DIR="$HOME/.config/omarchy/current/theme"
-1
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Generate themed config files from Omarchy templates
# omarchy:hidden=true
TEMPLATES_DIR="$OMARCHY_PATH/default/themed"
USER_TEMPLATES_DIR="$HOME/.config/omarchy/themed"
-1
View File
@@ -1,7 +1,6 @@
#!/bin/bash
# omarchy:summary=Sync Omarchy theme to VS Code, VSCodium, and Cursor
# omarchy:hidden=true
VS_CODE_THEME="$HOME/.config/omarchy/current/theme/vscode.json"
-207
View File
@@ -1,207 +0,0 @@
#!/bin/bash
# omarchy:group=transcode
# omarchy:name=
# omarchy:summary=Transcode pictures and videos for sharing
# omarchy:args=[--path path] [input] [format] [resolution]
# omarchy:examples=omarchy transcode|omarchy transcode --path ~/Downloads|omarchy transcode ~/Videos/demo.mov mp4 1080p|omarchy transcode ~/Pictures/wallpaper.heic jpg medium
set -euo pipefail
usage() {
cat <<'EOF'
Usage:
omarchy transcode [--path path] [input] [format] [resolution]
With no input, pick a picture or video with Walker from ~/Pictures and ~/Videos,
or only from --path when provided. Then pick the output format and resolution.
Options:
--path path Limit interactive fuzzy file selection to this path
Formats:
Pictures: jpg, png
Videos: mp4, gif
Resolutions:
Pictures: high, medium, low
Videos: 4k, 1080p, 720p
EOF
}
media_type() {
local mime
mime=$(file -b --mime-type "$1")
case "$mime" in
image/*) echo picture ;;
video/*) echo video ;;
*)
echo "Unsupported file type: $mime" >&2
return 1
;;
esac
}
output_path() {
local input="$1"
local format="$2"
local resolution="$3"
local dir base stem
dir=$(dirname -- "$input")
base=$(basename -- "$input")
stem="${base%.*}"
printf '%s/%s-%s.%s' "$dir" "$stem" "$resolution" "$format"
}
transcode_picture() {
local input="$1" format="$2" resolution="$3" output="$4"
local resize
case "$resolution" in
high) resize='3160x>' ;;
medium) resize='2160x>' ;;
low) resize='1080x>' ;;
*)
echo "Invalid picture resolution: $resolution" >&2
return 1
;;
esac
case "$format" in
jpg)
magick "$input" -resize "$resize" -quality 85 -strip "$output"
;;
png)
magick "$input" -resize "$resize" -strip -define png:compression-filter=5 \
-define png:compression-level=9 \
-define png:compression-strategy=1 \
-define png:exclude-chunk=all \
"$output"
;;
*)
echo "Invalid picture format: $format" >&2
return 1
;;
esac
}
transcode_video() {
local input="$1" format="$2" resolution="$3" output="$4"
local scale
case "$resolution" in
4k) scale='scale=-2:2160' ;;
1080p) scale='scale=-2:1080' ;;
720p) scale='scale=-2:720' ;;
*)
echo "Invalid video resolution: $resolution" >&2
return 1
;;
esac
case "$format" in
mp4)
if [[ $resolution == "4k" ]]; then
ffmpeg -i "$input" -vf "$scale" -c:v libx265 -preset slow -crf 24 -c:a aac -b:a 192k "$output"
else
ffmpeg -i "$input" -vf "$scale" -c:v libx264 -preset fast -crf 23 -c:a copy "$output"
fi
;;
gif)
ffmpeg -i "$input" -vf "fps=10,$scale:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" "$output"
;;
*)
echo "Invalid video format: $format" >&2
return 1
;;
esac
}
copy_to_clipboard() {
local output="$1"
local uri
uri="file://$(realpath -- "$output")"
printf '%s\n' "$uri" | wl-copy --type text/uri-list
}
main() {
local input="" format="" resolution="" search_path=""
local type output positional=()
while (( $# > 0 )); do
case "$1" in
--path)
shift
[[ $# -gt 0 ]] || { echo "Missing value for --path" >&2; return 2; }
search_path="$1"
;;
--help | -h)
usage
return 0
;;
--)
shift
positional+=("$@")
break
;;
--*)
echo "Unknown option: $1" >&2
usage >&2
return 2
;;
*)
positional+=("$1")
;;
esac
shift
done
input="${positional[0]:-}"
format="${positional[1]:-}"
resolution="${positional[2]:-}"
search_path="${search_path:-$HOME/Pictures:$HOME/Videos}"
if [[ -z $input ]]; then
input=$(omarchy-menu-file "Transcode picture or video" "$search_path" "jpg jpeg png webp gif heic avif mp4 mov m4v mkv webm avi")
fi
[[ -n $input ]] || return 1
[[ -f $input ]] || { echo "File not found: $input" >&2; return 1; }
type=$(media_type "$input")
if [[ -z $format ]]; then
if [[ $type == "picture" ]]; then
format=$(omarchy-menu-select "Select format" jpg png)
else
format=$(omarchy-menu-select "Select format" mp4 gif)
fi
fi
if [[ -z $resolution ]]; then
if [[ $type == "picture" ]]; then
resolution=$(omarchy-menu-select "Select resolution" high medium low)
else
resolution=$(omarchy-menu-select "Select resolution" 4k 1080p 720p)
fi
fi
output=$(output_path "$input" "$format" "$resolution")
if [[ $type == "video" ]]; then
omarchy-notification-send "" "Transcoding video…" "$(basename -- "$input") to $format ($resolution)"
transcode_video "$input" "$format" "$resolution" "$output"
copy_to_clipboard "$output"
omarchy-notification-send "" "Transcoded to $resolution $format" "Saved and copied to clipboard."
else
transcode_picture "$input" "$format" "$resolution" "$output"
copy_to_clipboard "$output"
omarchy-notification-send "" "Transcoded to $resolution $format" "Saved and copied to clipboard."
fi
}
main "$@"
-353
View File
@@ -1,353 +0,0 @@
#!/bin/bash
# omarchy:summary=Transcode an image into ASCII/Unicode art text
# omarchy:group=transcode
# omarchy:name=ascii
# omarchy:args=<input-image.svg|png> <output-path> [--width <columns>] [--height <rows>] [--mode <braille|block>] [--threshold <percent>] [--invert]
# omarchy:examples=omarchy transcode ascii ~/logo.svg /tmp/logo.txt | omarchy transcode ascii ~/logo.png ~/.config/omarchy/branding/screensaver.txt --width 80
set -o pipefail
usage() {
cat <<'EOF'
Usage: omarchy-transcode-ascii <input-image.svg|png> <output-path> [options]
Transcodes an image into ASCII/Unicode art text.
Options:
-w, --width <columns> Maximum output width in terminal columns (default: 80)
-H, --height <rows> Maximum output height in terminal rows (default: 26)
-m, --mode <braille|block> Output style (default: braille)
-t, --threshold <percent> Pixel threshold from 0-100 (default: 50)
--invert Treat light pixels as the logo instead of dark pixels
--no-trim Preserve surrounding whitespace/background
--help Show this help
EOF
}
width=80
height=26
mode=braille
threshold=50
invert=false
trim=true
image_path=""
output_path=""
while (($# > 0)); do
case "$1" in
--help)
usage
exit 0
;;
-w | --width)
shift
if [[ -z $1 ]]; then
echo "Missing value for --width" >&2
exit 1
fi
width="$1"
;;
--width=*)
width="${1#*=}"
;;
-H | --height)
shift
if [[ -z $1 ]]; then
echo "Missing value for --height" >&2
exit 1
fi
height="$1"
;;
--height=*)
height="${1#*=}"
;;
-m | --mode)
shift
if [[ -z $1 ]]; then
echo "Missing value for --mode" >&2
exit 1
fi
mode="$1"
;;
--mode=*)
mode="${1#*=}"
;;
--block | --blocks)
mode=block
;;
--braille)
mode=braille
;;
-t | --threshold)
shift
if [[ -z $1 ]]; then
echo "Missing value for --threshold" >&2
exit 1
fi
threshold="$1"
;;
--threshold=*)
threshold="${1#*=}"
;;
--invert)
invert=true
;;
--no-trim)
trim=false
;;
--)
shift
break
;;
-*)
echo "Unknown option: $1" >&2
usage >&2
exit 1
;;
*)
if [[ -z $image_path ]]; then
image_path="$1"
elif [[ -z $output_path ]]; then
output_path="$1"
else
echo "Unexpected argument: $1" >&2
usage >&2
exit 1
fi
;;
esac
shift
done
if (($# > 0)); then
while (($# > 0)); do
if [[ -z $image_path ]]; then
image_path="$1"
elif [[ -z $output_path ]]; then
output_path="$1"
else
echo "Unexpected argument: $1" >&2
usage >&2
exit 1
fi
shift
done
fi
if [[ -z $image_path || -z $output_path ]]; then
usage >&2
exit 1
fi
if ! [[ $width =~ ^[0-9]+$ ]] || (( width < 1 )); then
echo "Invalid width: $width" >&2
exit 1
fi
if ! [[ $height =~ ^[0-9]+$ ]] || (( height < 1 )); then
echo "Invalid height: $height" >&2
exit 1
fi
if [[ $mode != "braille" && $mode != "block" ]]; then
echo "Invalid mode: $mode (expected braille or block)" >&2
exit 1
fi
if ! [[ $threshold =~ ^[0-9]+$ ]] || (( threshold < 0 || threshold > 100 )); then
echo "Invalid threshold: $threshold (expected 0-100)" >&2
exit 1
fi
if [[ ! -f $image_path ]]; then
echo "Logo file not found: $image_path" >&2
exit 1
fi
if omarchy-cmd-missing magick; then
echo "ImageMagick is required to convert logo images" >&2
exit 1
fi
case "$mode" in
braille)
pixel_width=$((width * 2))
pixel_height=$((height * 4))
;;
block)
pixel_width=$width
pixel_height=$((height * 2))
;;
esac
alpha_min=$(magick -background none "$image_path" -alpha extract -format '%[fx:minima]' info: 2>/dev/null) || {
echo "Unable to read logo image: $image_path" >&2
exit 1
}
alpha_max=$(magick -background none "$image_path" -alpha extract -format '%[fx:maxima]' info: 2>/dev/null) || {
echo "Unable to read logo image: $image_path" >&2
exit 1
}
use_alpha=false
if awk -v min="$alpha_min" -v max="$alpha_max" 'BEGIN { exit !(min < 0.999 && max > min) }'; then
use_alpha=true
fi
magick_args=(-background none "$image_path" -auto-orient)
if [[ $use_alpha == "true" ]]; then
magick_args+=(-alpha extract -alpha off)
if [[ $invert == "true" ]]; then
magick_args+=(-negate)
fi
else
magick_args+=(-alpha remove -alpha off -colorspace Gray)
if [[ $invert == "false" ]]; then
magick_args+=(-negate)
fi
fi
if [[ $trim == "true" ]]; then
magick_args+=(-bordercolor black -border 1 -trim +repage)
fi
magick_args+=(-resize "${pixel_width}x${pixel_height}" -threshold "${threshold}%" -negate -compress none pbm:-)
tmp_output=$(mktemp)
trap 'rm -f "$tmp_output"' EXIT
if [[ $mode == "braille" ]]; then
if ! magick "${magick_args[@]}" | awk '
BEGIN {
braille_base = 10240
dot[0,0] = 1
dot[0,1] = 2
dot[0,2] = 4
dot[1,0] = 8
dot[1,1] = 16
dot[1,2] = 32
dot[0,3] = 64
dot[1,3] = 128
}
{
sub(/#.*/, "")
for (i = 1; i <= NF; i++) {
token[++token_count] = $i
}
}
END {
if (token[1] != "P1") {
exit 1
}
width = token[2]
height = token[3]
pixel_offset = 4
for (y = 0; y < height; y += 4) {
line = ""
for (x = 0; x < width; x += 2) {
code = 0
for (dy = 0; dy < 4; dy++) {
for (dx = 0; dx < 2; dx++) {
if (y + dy < height && x + dx < width) {
pixel = token[pixel_offset + ((y + dy) * width) + x + dx]
if (pixel == 1) {
code += dot[dx,dy]
}
}
}
}
if (code == 0) {
line = line " "
} else {
line = line sprintf("%c", braille_base + code)
}
}
sub(/[ ]+$/, "", line)
lines[++line_count] = line
}
first = 1
while (first <= line_count && lines[first] ~ /^[ ]*$/) {
first++
}
last = line_count
while (last >= first && lines[last] ~ /^[ ]*$/) {
last--
}
for (i = first; i <= last; i++) {
print lines[i]
}
}
' >"$tmp_output"; then
echo "Unable to convert logo image: $image_path" >&2
exit 1
fi
else
if ! magick "${magick_args[@]}" | awk '
BEGIN {
block["11"] = "█"
block["10"] = "▀"
block["01"] = "▄"
block["00"] = " "
}
{
sub(/#.*/, "")
for (i = 1; i <= NF; i++) {
token[++token_count] = $i
}
}
END {
if (token[1] != "P1") {
exit 1
}
width = token[2]
height = token[3]
pixel_offset = 4
for (y = 0; y < height; y += 2) {
line = ""
for (x = 0; x < width; x++) {
top = token[pixel_offset + (y * width) + x]
bottom = (y + 1 < height) ? token[pixel_offset + ((y + 1) * width) + x] : 0
line = line block[top bottom]
}
sub(/[ ]+$/, "", line)
lines[++line_count] = line
}
first = 1
while (first <= line_count && lines[first] ~ /^[ ]*$/) {
first++
}
last = line_count
while (last >= first && lines[last] ~ /^[ ]*$/) {
last--
}
for (i = first; i <= last; i++) {
print lines[i]
}
}
' >"$tmp_output"; then
echo "Unable to convert logo image: $image_path" >&2
exit 1
fi
fi
if [[ ! -s $tmp_output ]]; then
echo "No logo pixels found in: $image_path" >&2
exit 1
fi
mkdir -p "$(dirname "$output_path")"
cp "$tmp_output" "$output_path"
echo "Wrote ASCII art to $output_path"
-1
View File
@@ -1,4 +1,3 @@
#!/bin/bash
# omarchy:summary=No-op now that omarchy-update-perform is responsible for idle management.
# omarchy:hidden=true
-1
View File
@@ -2,7 +2,6 @@
# omarchy:summary=Upload logs to 0x0.st
# omarchy:args=<log-file>
# omarchy:hidden=true
LOG_TYPE="${1:-install}"
TEMP_LOG="/tmp/upload-log.txt"
+1 -1
View File
@@ -21,5 +21,5 @@ if gum confirm "Install Voxtype + AI model (~150MB) to enable dictation?"; then
voxtype setup systemd
omarchy-restart-waybar
notify-send " Voxtype Dictation Ready" "Hold F9 to dictate (or toggle with Super + Ctrl + X)." -t 10000
notify-send " Voxtype Dictation Ready" "Press Super + Ctrl + X to toggle dictation.\nEdit ~/.config/voxtype/config.toml for options." -t 10000
fi
-36
View File
@@ -1,36 +0,0 @@
#!/bin/bash
# omarchy:summary=Returns a weather condition icon, adjusted for live sunrise and sunset.
weather_data=$(curl -fsS --max-time 3 "https://wttr.in?format=j1" 2>/dev/null | jq -er '[.current_condition[0].weatherCode, .weather[0].astronomy[0].sunrise, .weather[0].astronomy[0].sunset] | select(all(. != null and . != "")) | @tsv' 2>/dev/null) || exit 1
IFS=$'\t' read -r weather_code sunrise sunset <<< "$weather_data"
if [[ ! $weather_code =~ ^[0-9]+$ || ! $sunrise =~ ^[0-9]{1,2}:[0-9]{2}\ [AP]M$ || ! $sunset =~ ^[0-9]{1,2}:[0-9]{2}\ [AP]M$ ]]; then
exit 1
fi
now_epoch=$(date +%s)
sunrise_epoch=$(date -d "today $sunrise" +%s 2>/dev/null || echo 0)
sunset_epoch=$(date -d "today $sunset" +%s 2>/dev/null || echo 0)
if (( sunrise_epoch > 0 && sunset_epoch > 0 && (now_epoch < sunrise_epoch || now_epoch >= sunset_epoch) )); then
night=true
else
night=false
fi
case $weather_code in
113) [[ $night == "true" ]] && icon="" || icon="" ;;
116) [[ $night == "true" ]] && icon="" || icon="" ;;
119|122) icon="" ;;
143|248|260) icon="" ;;
176|263|266|293|296|353) [[ $night == "true" ]] && icon="" || icon="" ;;
179|227|230|323|326|368) [[ $night == "true" ]] && icon="" || icon="" ;;
182|185|281|284|311|314|317|320|350|362|365|374|377) icon="" ;;
200|386|389|392|395) icon="" ;;
299|302|305|308|356|359) icon="" ;;
329|332|335|338|371) icon="" ;;
*) icon="" ;;
esac
printf '%s\n' "$icon"
-17
View File
@@ -1,17 +0,0 @@
#!/bin/bash
# omarchy:summary=Returns a formatted weather status string with temperature and wind speed.
weather=$(curl -fsS --max-time 4 "https://wttr.in?format=%l|%t|%w" 2>/dev/null | tr -d '\n')
if [[ -z $weather ]]; then
echo "Weather unavailable"
exit 1
fi
IFS='|' read -r place temperature wind <<< "$weather"
place=${place%%,*}
place=${place^}
temperature=${temperature#+}
echo "$(omarchy-weather-icon) $place · Temp $temperature · Wind $wind"
+1
View File
@@ -0,0 +1 @@
--load-extension=~/.local/share/omarchy/default/chromium/extensions/copy-url
+1
View File
@@ -0,0 +1 @@
brave-flags.conf
-19
View File
@@ -1,19 +0,0 @@
[main]
include=~/.config/omarchy/current/theme/foot.ini
term=xterm-256color
font=JetBrainsMono Nerd Font:size=9
pad=14x14
initial-window-mode=windowed
workers=0
[scrollback]
lines=10000
[cursor]
style=block
blink=no
[key-bindings]
clipboard-copy=Control+Insert
primary-paste=none
clipboard-paste=Shift+Insert
+18 -9
View File
@@ -1,19 +1,28 @@
general {
lock_cmd = omarchy-system-lock # lock screen and 1password
before_sleep_cmd = OMARCHY_LOCK_ONLY=true omarchy-system-lock # lock before suspend without scheduling display off.
after_sleep_cmd = sleep 1 && omarchy-system-wake # delay for PAM readiness, then turn on display.
before_sleep_cmd = loginctl lock-session # lock before suspend.
after_sleep_cmd = sleep 1 && hyprctl dispatch dpms on # delay for PAM readiness, then turn on display.
inhibit_sleep = 3 # wait until screen is locked
}
# Start screensaver after 2.5 minutes
listener {
timeout = 150
on-timeout = pidof hyprlock || omarchy-launch-screensaver
timeout = 150 # 2.5min
on-timeout = pidof hyprlock || omarchy-launch-screensaver # start screensaver (if we haven't locked already)
}
# Lock system after 5 minutes (screensaver resets idle timer, so have to just do half + 2s margin)
listener {
timeout = 152
on-timeout = omarchy-system-lock
on-resume = omarchy-system-wake
timeout = 151 # 5min
on-timeout = loginctl lock-session # lock screen when timeout has passed
}
listener {
timeout = 330 # 5.5min
on-timeout = brightnessctl -sd '*::kbd_backlight' set 0 # save state and turn off keyboard backlight
on-resume = brightnessctl -rd '*::kbd_backlight' # restore keyboard backlight
}
listener {
timeout = 330 # 5.5min
on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed
on-resume = hyprctl dispatch dpms on && brightnessctl -r # screen on when activity is detected
}
+1 -1
View File
@@ -41,7 +41,7 @@ input {
}
# Scroll nicely in the terminal
windowrule = match:class (Alacritty|kitty|foot), scroll_touchpad 1.5
windowrule = match:class (Alacritty|kitty), scroll_touchpad 1.5
windowrule = match:class com.mitchellh.ghostty, scroll_touchpad 0.2
# Enable touchpad gestures for changing workspaces
-6
View File
@@ -32,9 +32,3 @@ layout {
# Avoid overly wide single-window layouts on wide screens
# single_window_aspect_ratio = 1 1
}
# https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/
scrolling {
# See only one column per screen instead of two
# column_width = 0.97
}
@@ -1,7 +1,7 @@
#!/bin/bash
# This hook is called with the current battery percentage when the low battery
# notification is sent. To put it into use, remove .sample from this file name.
# notification is sent. To put it into use, remove .sample from the name.
SOUND_FILE="/usr/share/sounds/freedesktop/stereo/dialog-warning.oga"
@@ -1,7 +1,7 @@
#!/bin/bash
# This hook is called with the snake-cased name of the font that has just been set.
# To put it into use, remove .sample from this file name.
# To put it into use, remove .sample from the name.
# Example: Show the name of the font that was just set.
# Example: Show the name of the theme that was just set.
# notify-send -u low "New font" "Your new font is $1"
@@ -1,10 +0,0 @@
#!/bin/bash
# Show the weather status notification after Omarchy has started.
# To put it into use, remove .sample from this file name.
weather=$(omarchy-weather-status 2>/dev/null) || true
if [[ -n $weather && $weather != "Weather unavailable" ]]; then
notify-send -u low "$weather"
fi
@@ -1,7 +1,7 @@
#!/bin/bash
# This hook is called after an Omarchy system update has been performed.
# To put it into use, remove .sample from this file name.
# To put it into use, remove .sample from the name.
# Example: Show notification after the system has been updated.
# notify-send -u low "Update Performed" "Your system is now up to date"
@@ -1,7 +1,7 @@
#!/bin/bash
# This hook is called with the snake-cased name of the theme that has just been set.
# To put it into use, remove .sample from this file name.
# To put it into use, remove .sample from the name.
# Example: Show the name of the theme that was just set.
# notify-send -u low "New theme" "Your new theme is $1"
@@ -1,13 +0,0 @@
[Unit]
Description=SwayOSD server
PartOf=graphical-session.target
After=graphical-session.target
[Service]
Type=simple
ExecStart=/usr/bin/swayosd-server
Restart=always
RestartSec=2
[Install]
WantedBy=graphical-session.target
-3
View File
@@ -70,9 +70,6 @@ set -g set-clipboard on
set -g allow-passthrough on
setw -g aggressive-resize on
set -g detach-on-destroy off
set -g extended-keys on
set -g extended-keys-format csi-u
set -sg escape-time 10
# Status bar
set -g status-position top
+1 -8
View File
@@ -5,7 +5,7 @@
"spacing": 0,
"height": 26,
"modules-left": ["custom/omarchy", "hyprland/workspaces"],
"modules-center": ["clock", "custom/weather", "custom/update", "custom/voxtype", "custom/screenrecording-indicator", "custom/idle-indicator", "custom/notification-silencing-indicator"],
"modules-center": ["clock", "custom/update", "custom/voxtype", "custom/screenrecording-indicator", "custom/idle-indicator", "custom/notification-silencing-indicator"],
"modules-right": [
"group/tray-expander",
"bluetooth",
@@ -66,13 +66,6 @@
"tooltip": false,
"on-click-right": "omarchy-launch-floating-terminal-with-presentation omarchy-tz-select"
},
"custom/weather": {
"exec": "$OMARCHY_PATH/default/waybar/weather.sh",
"return-type": "json",
"interval": 600,
"tooltip": false,
"on-click": "notify-send -u low \"$(omarchy-weather-status)\""
},
"network": {
"format-icons": ["󰤯", "󰤟", "󰤢", "󰤥", "󰤨"],
"format": "{icon}",
-11
View File
@@ -67,17 +67,6 @@ tooltip {
margin-left: 8.75px;
}
#custom-weather {
margin-left: 7.5px;
margin-right: 7.5px;
}
#custom-weather.unavailable {
min-width: 0;
margin: 0;
padding: 0;
}
.hidden {
opacity: 0;
}
+1 -12
View File
@@ -40,24 +40,13 @@ _omarchy_complete() {
candidates+=("--all" "--json" "--markdown" "--check")
fi
if (( ${#candidates[@]} == 0 )) && [[ -x $bin_dir/$prefix ]]; then
local args enum
args=$(grep -m 1 '^# omarchy:args=<' "$bin_dir/$prefix" 2>/dev/null)
enum="${args#*<}"
enum="${enum%%>*}"
if [[ $enum == *"|"* && $enum != *" "* ]]; then
read -r -a candidates <<<"${enum//|/ }"
fi
fi
if (( ${#candidates[@]} > 0 )); then
local IFS=$'\n'
COMPREPLY=($(compgen -W "${candidates[*]}" -- "$cur"))
fi
}
complete -o default -F _omarchy_complete omarchy
complete -F _omarchy_complete omarchy
# Hide individual omarchy-* binaries from initial-word command completion;
# the unified `omarchy` dispatcher is the user-facing entry point.
+35 -10
View File
@@ -1,33 +1,58 @@
# Transcoding helpers have moved to omarchy-transcode.
# Transcode a video to a good-balance 1080p that's great for sharing online
transcode-video-1080p() {
omarchy-transcode "$1" mp4 1080p
ffmpeg -i "$1" -vf scale=1920:1080 -c:v libx264 -preset fast -crf 23 -c:a copy "${1%.*}-1080p.mp4"
}
# Transcode a video to a good-balance 4K that's great for sharing online
transcode-video-4K() {
omarchy-transcode "$1" mp4 4k
ffmpeg -i "$1" -c:v libx265 -preset slow -crf 24 -c:a aac -b:a 192k "${1%.*}-optimized.mp4"
}
# Transcode a video to an animated GIF using a palette for accurate colors
transcode-video-gif() {
omarchy-transcode "$1" gif 1080p
ffmpeg -i "$1" -vf "fps=10,scale=800:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" "${1%.*}.gif"
}
# Transcode any image to JPG image that's great for shrinking wallpapers
img2jpg() {
omarchy-transcode "$1" jpg high
img="$1"
shift
magick "$img" "$@" -quality 85 -strip "${img%.*}-converted.jpg"
}
# Transcode any image to a small JPG (max 1080px wide)
img2jpg-small() {
omarchy-transcode "$1" jpg low
img="$1"
shift
magick "$img" "$@" -resize 1080x\> -quality 85 -strip "${img%.*}-small.jpg"
}
# Transcode any image to a 4K JPG (max 2160px wide)
img2jpg-medium() {
omarchy-transcode "$1" jpg medium
img="$1"
shift
magick "$img" "$@" -resize 2160x\> -quality 85 -strip "${img%.*}-medium.jpg"
}
# Transcode any image to a 6K JPG (max 3160px wide)
img2jpg-large() {
omarchy-transcode "$1" jpg high
img="$1"
shift
magick "$img" "$@" -resize 3160x\> -quality 85 -strip "${img%.*}-large.jpg"
}
# Transcode any image to compressed-but-lossless PNG
img2png() {
omarchy-transcode "$1" png high
img="$1"
shift
magick "$img" "$@" -strip -define png:compression-filter=5 \
-define png:compression-level=9 \
-define png:compression-strategy=1 \
-define png:exclude-chunk=all \
"${img%.*}-optimized.png"
}
-26
View File
@@ -1,26 +0,0 @@
{
"policies": {
"Preferences": {
"apz.overscroll.enabled": {
"Value": true,
"Status": "default"
},
"media.ffmpeg.vaapi.enabled": {
"Value": true,
"Status": "default"
},
"media.hardware-video-decoding.force-enabled": {
"Value": true,
"Status": "default"
},
"widget.disable-swipe-tracker": {
"Value": false,
"Status": "default"
},
"widget.wayland.fractional-scale.enabled": {
"Value": true,
"Status": "default"
}
}
}
}

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