GitHub's default branch on basecamp/omarchy is no longer master, so
a plain clone pulls the development branch. Pass --branch master so
reinstalls always land on stable regardless of repo default.
Pad the percent text to 3 chars with printf so " 5%", " 50%", and
"100%" render at identical width in the JetBrainsMono monospace label.
Previously the popup container resized between events because the
label string varied between 2 and 4 characters, which caused the
popup to visibly jump in width on consecutive brightness key presses.
Builds on #5525, which made the percent values themselves step
uniformly; this completes the loop by making the rendered popup match.
Co-authored-by: Mateus Pegorim <14262063+Pegorim@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Agents should use the notification helper
* Turn a single RetroArch game into its own application launcher
* Tweak installer
* Extract selection logic into cli
* Use consistent glyph
* One more
* Persist Bluetooth power state across reboots
BlueZ defaults to AutoEnable=true, which forces controllers on at boot
regardless of the last user-set state. Setting AutoEnable=false makes
bluetoothd respect the persisted Powered state, so toggling off in
bluetui (or any DBus client) survives a reboot.
Adds the change to the install path and a migration for existing setups.
* Set reboot-required in Bluetooth persistence migration
Per review feedback, the AutoEnable=false change only takes effect on
bluetoothd startup. Without setting reboot-required, omarchy-update-restart
won't prompt the user to reboot, so the fix would only kick in at their
next organic reboot — by which time the bug may appear unfixed.
Matches the convention in migrations/1776346552.sh and similar.
* No need to ask for a reboot when this is available on the next one
---------
Co-authored-by: David Heinemeier Hansson <david@hey.com>
Fires after the channel template is copied to /etc/pacman.conf and before
`pacman -Syyuu` runs, letting users layer custom Pacman repositories or
IgnorePkg directives onto the freshly-written config so they're respected
by the upgrade. Useful for users running on overlay distros (CachyOS,
Chaotic-AUR, internal company repos) where a wipe-and-reinstall would
otherwise pull vanilla Arch versions.
Ships with `pre-refresh-pacman.d/add-custom-repo.sample` showing the
pattern.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Change monospace match from mode="assign" binding="strong" to
mode="append" binding="same" so the system font acts as a fallback
instead of overriding explicit app font configs like Ghostty's font-family.
Add migration to fix existing user configs.
Fixes#5675
* Trash imv deletes; add Ctrl+E to edit in Satty
Ctrl+X / Ctrl+Shift+X now move the image to the freedesktop trash via
`gio trash` instead of unconditional `rm`, so accidental presses are
recoverable from the file manager's Trash.
Adds Ctrl+E to open the current image in Satty (already in
omarchy-base.packages) and quit imv, mirroring the typical
screenshot → annotate workflow.
* Add -- separator to gio trash invocations
Prevents filenames starting with - from being parsed as options.
* Scope branding image pickers to ~/Pictures, fix About transcode mode
The "Set From Image" path in both Style → About and Style → Screensaver
was scanning all of $HOME for *.svg / *.png and feeding the result into
Walker dmenu. On a populated home directory this can be tens of thousands
of entries, leaving the picker effectively unusable.
Scope the picker to ${XDG_PICTURES_DIR:-$HOME/Pictures}, matching the
pattern already used in omarchy-capture-screenshot.
While here, drop the hardcoded --mode block from omarchy-branding-about
so the About transcode falls back to the default braille mode, matching
what omarchy-branding-screensaver does and what stock about.txt ships
with. The reduced --width 54 stays so the result fits the fastfetch
logo column.
* Explain the scope of the picker
---------
Co-authored-by: Gavin Nugent <245706154+28allday@users.noreply.github.com>
Co-authored-by: David Heinemeier Hansson <david@hey.com>
* Waybar positioning and shape
* Reveal weather again on left/right
* Fix indicators moving bar left/right
* Clean it up
* Cleanup
* One step forward, one step backwards
* Fix styles
* More style massage
* More tweaks
* Just position for now
* Fix keys
* No longer needed
* No need to reset
* Simplify
* Reset but protect waybar configs
* Not needed
* Fix glyph
* Not needed
* Cleanup
* Better wording
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
It was comparing NextElapseUSecMonotonic against /proc/uptime, but those
values aren’t in the same monotonic timeline for user timers, so valid
upcoming reminders were being skipped.
* Configure Dell XPS haptics directly
* Use packaged Dell XPS touchpad haptics service
* fix: keep one Dell haptics migration
* We already have a dedicated Trigger > Hardware menu
* Name for action
* Moved
* Need to make the package available for offline
* Simplify
---------
Co-authored-by: David Heinemeier Hansson <david@hey.com>
* Split fido2 and fingerprint setups into setup and remove
Don't make one thing do two things
* Extract helpers and clean up
* No need to hide them
* Don't need these
* fix(weather): Use local units for temperature and wind
Remove the metric-to-imperial temperature conversion and display
temperature and wind values as returned for the current locale.
* Don't need this comment
---------
Co-authored-by: David Heinemeier Hansson <david@hey.com>
`DefaultLimitNOFILESoft` is not a valid systemd configuration key.
systemd silently ignores it and emits this warning on every boot,
for both the system manager (PID 1) and the user manager:
Unknown key 'DefaultLimitNOFILESoft' in section [Manager], ignoring.
The consequence is that the script's stated goal of raising the soft
fd limit from 1024 to 65536 has not actually been happening: dev
tools (VS Code, Docker, dev servers, databases) continue to run with
systemd's default 1024 soft limit.
The valid key is `DefaultLimitNOFILE`, which accepts either a single
value (sets both soft and hard) or `SOFT:HARD`. Using `65536:524288`
raises the soft limit while preserving systemd's typical 524288
hard-limit default — using the bare `=65536` form would lower the
hard limit, which would be a regression.
After this change and `systemctl daemon-reexec` on both managers,
`systemctl show | grep DefaultLimitNOFILE` reports:
DefaultLimitNOFILE=524288 (hard)
DefaultLimitNOFILESoft=65536 (soft, derived display attribute)
and the boot-time "Unknown key" warnings disappear.
(The typo likely originated from someone reading `systemctl show`
output, where `DefaultLimitNOFILESoft=` appears as a read-only
display attribute for the soft component of the parsed limit.
It looks like a config key but isn't.)
* Extract notification command for using the correct spacing
* Add easy to set reminders
* More human
* Clear and direct hotkeys
* Split
* Bake reminders into the skill
* Run SwayOSD as a session service
* Restart SwayOSD after clean exits
* We don't need the input backend (as we manage the hotkeys in Hyprland)
* Ensure we cleanup the old service starter
* Not needed
* Not needed either
* Clean up migration
---------
Co-authored-by: David Heinemeier Hansson <david@hey.com>
* Adjust condition to also match non-X series Panther Lake GPUs.
* Add migration to install GPU acceleration on non-X Panther Lake systems.
* Update comment with Non-Arc Panther Lake GPUs mentioned.
* Simplify conditions in the migration
* Set default terminal, browser, editor explicitly
* Consistent glyphs and setup
* Tweaks
* Always there
* Proper order
* Don't make a browser the default just because it's getting installed
* Extract ASUS Expertbook B9406 display backlight fix and apply it for Zenbook ux5406aa too
* Add migration for Panther Lake Asus display bakclight fix
* Check if limine-update exists before executing it in the migration
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Add bass speaker fix for Lenovo Yoga Pro 7 14IAH10
The ALC287 codec on Yoga Pro 7 14IAH10 requires the alc287-yoga9-bass-spk-pin
quirk to properly route audio to both amplifier speakers. Without this fix,
only one speaker works and bass output is missing.
This adds:
- Hardware detection script (omarchy-hw-lenovo-yoga-pro7-bass)
- Audio fix that creates /etc/modprobe.d/lenovo-yoga-pro7-bass.conf
Tested on Lenovo Yoga Pro 7 14IAH10 (Intel Core Ultra 9 285H).
Reference: https://wiki.archlinux.org/title/Lenovo_Yoga_9i_2022_(14AiPI7)
* Add Lenovo Yoga Pro 7 bass fix to install flow
Addresses review feedback: the hardware fix script was not invoked
during installation. Add it to install/config/all.sh so it runs
automatically on matching hardware.
* Fix implementation
---------
Co-authored-by: David Heinemeier Hansson <david@hey.com>
Hardcoded -l eng makes SUPER+CTRL+PRINT produce garbage on any
non-ASCII English text. Read the language list from
OMARCHY_OCR_LANGS instead, defaulting to eng for backward
compatibility.
* Add Transcode entry to Nautilus context menu
Right-click on image or video files in Nautilus to send them to
omarchy-transcode in a presentation terminal, mirroring the existing
LocalSend integration.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Use shlex.quote for shell-safe command construction in transcode.py
Quote both the resolved binary path and file paths via shlex.quote
instead of a custom escaper. Addresses Copilot review on #5635.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Style changes
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: David Heinemeier Hansson <david@hey.com>
* Add live weather
* Just use jq
* Add Weather app and make it click target
* Simplify
* Looks better
* Nicer flow
* Simplify
* Move to using the notification instead of tooltip
* No longer needed
* Fix helix theme's word selection colors
Without this fix, if users enabled `editor.cursorline`, the word
selection would not be visually distinct from the cursorline selection.
Closes: https://github.com/basecamp/omarchy/issues/5580
Signed-off-by: Luke Hsiao <luke@hsiao.dev>
* Make Retro-82 color0 visually distinct from background
Signed-off-by: Luke Hsiao <luke@hsiao.dev>
* Make matte-black selection background distinct from color0
Signed-off-by: Luke Hsiao <luke@hsiao.dev>
---------
Signed-off-by: Luke Hsiao <luke@hsiao.dev>
* Install sof-firmware on Intel Panther Lake for DSP audio
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Need to have the sof-firmware package available during original offline install
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: David Heinemeier Hansson <david@hey.com>
* Install Zed Editor with omazed for themes syncing
* Move Zed theme switching into Omarchy
* Launch zed after install
* revert
* forgot omazed!
* omazed is now on OPR
---------
Co-authored-by: David Heinemeier Hansson <david@hey.com>
* Enable middle-click primary paste for GTK/Chromium apps
gsettings-desktop-schemas 50.x ships gtk-enable-primary-paste=false as
the default. GTK4 apps (Ghostty 1.3.0+) and Chromium-family browsers
honor that setting and silently no-op middle-click paste, even though
the primary selection itself works (wl-paste --primary returns text,
Firefox/LibreOffice paste fine because they implement primary paste
themselves rather than going through GTK).
Flip the GSetting to true so middle-click paste behaves the way Linux
desktop users expect across Ghostty, Brave, and Chromium.
Closes#5371
* Address Copilot review on #5577
Move install-time GSetting from install/config/ to install/first-run/
so it runs after login when a session D-Bus is guaranteed (matching the
existing gnome-theme.sh convention). Make the migration's gsettings
call best-effort with `|| true` so a missing dconf service doesn't
trigger the omarchy-migrate skip prompt.
* Add dynamic theming for gum.
* Add migration.
* Fix migration script.
* Add omarchy-theme-reset utility.
* Move env variables into seperate file and update migration script.
* Migration adds the new hyprland config file to the users hyprland.conf.
* Add gum.env.conf to default env.conf instead.
* Reuse new omarchy-theme-refresh and update migration.
* Ensure no errors are thrown if the file can't be loaded
* Just apply this on the next theme selection
So it's not disruptive
---------
Co-authored-by: David Heinemeier Hansson <david@hey.com>
* Add script to capture screenshot, perform OCR, and copy text to clipboard
* Add binding for screenshot-ocr
* Update OCR binding description
* Add tesseract OCR and language data installation
* Update bindings to current dev
* Refactor screenshot capture method to use wayfreeze and slurp for region selection
* Refactor OCR text extraction to simplify error handling
* Bring up to date
---------
Co-authored-by: David Heinemeier Hansson <david@hey.com>
* Fix power profile auto-switching on USB-C only machines
* Small nits
* Stick with single unit name
---------
Co-authored-by: David Heinemeier Hansson <david@hey.com>
* Make color0 distinct from background/foreground
The majority of themes have color0 available as a subtle offset from
the background. For flexoki-light, because color0 matched foreground, it
wasn't subtle, and would cause invisible text when used as a background
color (e.g., in text editor rulers). For vantablack, ethereal,
hackerman, and white, color0 matched background and would cause
invisible text when a theme wanted text to be de-emphasized.
This patch makes it consistently a subtle offset from background.
* Make helix selection theme colors more subtle
Helix is more usable if the selection background is subtle. This is
primarily because of [[1]], which makes a bright selection like we had
before often make the foreground text unreadable in the picker preview.
[1]: https://github.com/helix-editor/helix/issues/12405
Helix had no theme integration. Installing it from the menu just ran
omarchy-pkg-add and left the editor on whatever default theme it shipped
with, regardless of the active Omarchy palette.
This adds `default/themed/helix.toml.tpl` so the template
renderer produces a helix.toml on every theme switch, and
`omarchy-install-helix` that wires Helix up:
- install the package
- symlink `~/.config/helix/themes/omarchy.toml` at the rendered theme
- seed a config.toml selecting that theme when the user has none
The install menu routes Helix through this script. omarchy-restart-helix
joins omarchy-theme-set and signals Helix with SIGUSR1 so theme changes
are live [[1]], the same way as other packages. Arch-based distros
package the binary as 'helix' rather than upstream 'hx', so the new
scripts target 'helix' and the installer ends with a hint about aliasing
'hx'.
[1]: https://docs.helix-editor.com/configuration.html
Ref: https://github.com/basecamp/omarchy/discussions/4986
* Add minimum brightness cap to prevent OLED displays turning off
* Revert "Add minimum brightness cap to prevent OLED displays turning off"
This reverts commit fe855ecf9aeacfa1b9ffcff3d43adb10908435e5.
* Add touchscreen toggle support
* Use finger glyph
---------
Co-authored-by: David Heinemeier Hansson <david@hey.com>
* Implement non-uniform brightness step adjustments
Add logic for non-uniform step size adjustments based on current brightness level.
* Ensure percentages are moved in a consistent manner so we don't get rounding errors
* Ensure we don't go below 1%
To prevent screen from turning off entirely on some models
---------
Co-authored-by: David Heinemeier Hansson <david@hey.com>
Migrated branding and help text color definitions to the new hexadecimal RRGGBB format in accordance with the latest Limine specifications. This update also introduces the interface_help_colour_bright parameter to ensure consistent visual aesthetics during the auto-boot sequence.
For the time being, a green palette has been implemented to maintain the traditional visual identity of Omarchy.
Co-authored-by: David Heinemeier Hansson <david@hey.com>
* Fix: read files from symlink directory in background selector menu
* safely parse the path to avoid option injection
* Simply use -L flag with find to resolve symlinks
Detect the internal monitor name dynamically at runtime instead of
hardcoding eDP-1 in a static toggle conf file. Uses the same pattern
as omarchy-hyprland-monitor-internal-mirror.
Fixes#5443
* Don't use the names here since they break the all-themes setup in omarchy-nvim
* Fix refresh-config when target directory is missing
---------
Co-authored-by: David Heinemeier Hansson <david@hey.com>
* Add check for active external monitors before disabling internal display
Co-authored-by: Copilot <copilot@github.com>
* Revert "Add check for active external monitors before disabling internal display"
This reverts commit e20b3da87e3df0f084c0bca232a61ba58fab4cdc.
* feat(hyprland): add toggle for internal monitor mirroring
- Implement `omarchy-hyprland-monitor-internal-mirror` to dynamically mirror the internal eDP display to external monitor.
- Update `omarchy-hyprland-monitor-internal` to prevent disabling the laptop screen if mirroring is currently active.
- Add "Mirror Display" toggle to omarchy hardware Menu
* Ensure there is also a laptop monitor available to mirror before we do it
* Fix toggle use
* Recover from mirror mode gracefully
* Add hotkey to mirroring
---------
Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: David Heinemeier Hansson <david@hey.com>
* add generation of colors.toml via alacritty.toml
* Shorter command name
* Fix perms
---------
Co-authored-by: David Heinemeier Hansson <david@hey.com>
Adds dosfstools to default installs and migrates existing systems so fsck.fat and mkfs.fat are available for Omarchy’s FAT32 /boot partition. This also helps with recovery from dirty or corrupt FAT filesystems after unclean shutdowns or power loss.
- 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:
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:
-`cmd-` - check if commands exist, misc utility commands
-`capture-` - screenshots, screen recordings, and other capture tools
-`pkg-` - package management helpers
-`hw-` - hardware detection (return exit codes for use in conditionals)
-`refresh-` - copy default config to user's `~/.config/`
@@ -23,6 +29,52 @@ All commands start with `omarchy-`. Prefixes indicate purpose:
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: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:
@@ -30,14 +82,25 @@ Use these instead of raw shell commands:
-`omarchy-cmd-missing` / `omarchy-cmd-present` - check for commands
-`omarchy-pkg-missing` / `omarchy-pkg-present` - check for packages
-`omarchy-pkg-add` - install packages (handles both pacman and AUR)
-`omarchy-notification-send` - send desktop notifications; do not call `notify-send` directly
-`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/`
-`default/themed/*.tpl` - templates with `{{ variable }}` placeholders for theme colors
-`themes/*/colors.toml` - theme color definitions (accent, background, foreground, color0-15)
# Visual Changes
When making visual changes, such as Waybar styles or desktop appearance, always take and analyze a screenshot after applying the change to verify the result. Use `omarchy capture screenshot fullscreen save` for fullscreen screenshots.
For interactive UI work, use `wtype` to simulate keyboard input when available. Example: start the UI in the background, wait briefly for focus, then run `wtype -k Right -k Return` to exercise keyboard selection and confirm the resulting command output or state change. Prefer this over manual-only verification when a UI returns a selected value or changes a symlink/config.
When testing layer-shell UI, capture the reference and candidate states as separate screenshots, then compare them visually before further edits. If a launched UI would otherwise remain open, keep track of its PID and stop it after the screenshot; avoid broad process kills unless checking with `ps` first.
# Refresh Pattern
To copy a default config to user config with automatic backup:
@@ -52,10 +115,16 @@ 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.
Migration format:
New migration format:
- File permissions must be `0644` (`-rw-r--r--`); migrations are sourced, not executed directly
- 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.
# omarchy:summary=Show Omarchy bin metadata fields and defaults
# omarchy:args=[--json]
set -euo pipefail
show_json() {
jq -n '{
ok: true,
defaults: {
group: "first filename segment after omarchy-",
name: "remaining filename segments with dashes converted to spaces",
route: "omarchy <group> <name>",
binary: "filename",
requires_sudo: false
},
fields: [
{name: "summary", required: true, type: "string", note: "One-line human and agent-facing description."},
{name: "group", required: false, type: "string", note: "Only set when the route group should differ from the filename-derived group."},
{name: "name", required: false, type: "string", note: "Only set when the route name should differ from the filename-derived name. May be empty for root commands."},
{name: "args", required: false, type: "string", note: "Only set when the command accepts arguments."},
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.