Commit Graph
92 Commits
Author SHA1 Message Date
6ddc39520d Clean up the terminal and reconnect when SSH connections drop (#6661)
* Clean up the terminal and reconnect when SSH connections drop

A remote tmux, herdr, or editor arms terminal modes over the SSH pipe
(mouse tracking, focus reporting, the alternate screen) that only it can
disarm. When the connection dies instead of exiting cleanly, those modes
stay armed on the local terminal, and every mouse move floods the prompt
with escape-sequence junk.

Wrap ssh in a shell function that disarms those modes after every exit,
and automatically reconnects when an established interactive session
drops. Remote commands, configured RemoteCommands, and redirected stdin
never reconnect, so their side effects cannot replay, and the retry loop
runs in a subshell so Ctrl-C cancels both the in-flight attempt and the
loop.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Detect dead SSH connections within a minute

Without keepalives, ssh does not notice a dead peer until TCP gives up,
which can take hours of sitting on a hung terminal with remote-armed
terminal modes stuck on. Ship a client keepalive default so drops are
detected in about 45 seconds, letting the shell's ssh wrapper clean up
and reconnect. ~/.ssh/config is read first and wins, so per-host
overrides still apply.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Fail closed when ssh -G cannot resolve the effective config

An unresolvable configuration could hide a RemoteCommand, so treat it
as non-interactive rather than reconnectable. Also strengthen the
tests from Copilot review: assert the complete disarm sequence, and
verify on a real interactive pty that Ctrl-C during a retry attempt
kills the reconnect loop itself, not just the in-flight attempt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Tolerate the explicit RemoteCommand none when probing ssh -G

The literal "none" is how ssh_config cancels a configured
RemoteCommand, and some OpenSSH versions emit it even when unset, which
would have silently disabled reconnecting entirely. Treat it as no
remote command while still failing closed on real ones and unresolvable
configs, and make the fake ssh -G emit the "none" form so the behavior
tests cover it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 19:15:21 +02:00
b925431025 Give SSH commands the user-level tool paths (#6632)
* Give SSH commands the user-level tool paths

ssh host cmd runs neither a login nor an interactive shell, so on Arch it
gets the bare sshd PATH and can't find mise-managed tools like the agent
CLIs herdr scans for. Set PATH in the PAM environment (per-user via
@{HOME}), append the user-level dirs in env-bootstrap so login shells and
the uwsm session get them too, and source env-bootstrap before bashrc's
interactive guard for bash variants that read it non-interactively.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Don't let an empty PATH turn into a cwd entry

Appending with a bare "$PATH:" prefix leaves a leading colon when PATH
is unset, which shells treat as the current directory.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 14:58:29 +02:00
Martin Bastien 8ef4eb24a2 Keep Btrfs snapshots out of the locate index and put /home in it
The stock Arch updatedb.conf interacts badly with Omarchy's Btrfs
layout in both directions:

- Snapper snapshots under /.snapshots are nested subvolumes reached by
  plain directory traversal, so updatedb indexes the entire system once
  per snapshot. On machines that accumulated snapshots this means
  multi-hour updatedb runs at full CPU, gigabytes of RAM, and a
  multi-gigabyte plocate.db (observed: 18 GB db, 7.5 h runs at 96% CPU
  with 592 snapshots; 43 MB and ~1 min after the fix).
- PRUNE_BIND_MOUNTS="yes" treats Btrfs subvolume mounts like /home as
  bind mounts, so locate finds nothing in home directories at all.

Configure updatedb.conf at install time and migrate existing installs,
then rebuild the index in the background. Both settings are matched
tolerantly and appended when absent, so a hand-edited updatedb.conf is
fixed rather than silently skipped.
2026-07-23 09:10:16 -04:00
Ryan Hughes c048b2c745 Normalize Snapper snapshot setup 2026-06-21 02:25:42 -04:00
Ryan Hughes 75cb4f7195 Make setup ISO-only
Remove legacy online installer entrypoints, collapse migrations for 4.0, and move setup responsibilities into target-side system, hardware, and user commands.
2026-06-04 18:37:32 -04:00
Ryan Hughes 0cfa1b66c4 installer: route install through system and user phases 2026-06-04 18:35:01 -04:00
Ryan Hughes f852edfbd6 Split user-level setup into bin/omarchy-setup-user
User-level files (~/.config, ~/.local/share, ~/.agents, etc.) shouldn't
be written by install.sh — it runs as root or with system-level sudo,
and in offline (ISO chroot) mode the user doesn't exist yet. Moved into
a per-user idempotent command, called from omarchy-first-run.

Moved into bin/omarchy-setup-user (deleted from install/config/):
- omarchy-ai-skill.sh    AI skill symlinks
- omarchy-toggles.sh     hypr toggle flags
- nautilus-python.sh     nautilus extensions
- branding.sh            ~/.config/omarchy/branding/{about,screensaver}.txt
- user-dirs.sh           xdg-user-dirs-update + gtk bookmarks
- detect-keyboard-layout.sh  layout/variant sed into ~/.config/hypr/input.lua
- toggles.sh             ~/.local/state/omarchy/toggles mkdir
- mimetypes.sh           omarchy-refresh-applications + xdg-mime/xdg-settings

Kept in install/config/ (rely on OMARCHY_USER_NAME / OMARCHY_USER_EMAIL
that only exist during install):
- git.sh        git config --global user.{name,email}
- xcompose.sh   ~/.XCompose with name/email substituted

omarchy-setup-user:
- Refuses to run as root
- Idempotent via ~/.local/state/omarchy/setup-user.done marker
- --force escape hatch for re-running after dev-link or upstream changes
- Defaults OMARCHY_PATH to /usr/share/omarchy so it works outside install

bin/omarchy-first-run now invokes omarchy-setup-user unconditionally
(it self-gates), so first user login picks up the user setup.

install/config/all.sh: dropped the eight deleted entries.

All three packages (omarchy, omarchy-settings, omarchy-installer) still
build clean.
2026-06-04 18:34:35 -04:00
Ryan Hughes 12826d4076 Centralize service enables into install/config/enable-services.sh
The previous setup scattered systemctl enables across docker.sh,
printer.sh, bluetooth.sh, network.sh, powerprofilesctl-rules.sh, and
kernel-modules-hook.sh. Some used chrootable_systemctl_enable; others
used bare 'sudo systemctl enable'. Centralizing makes the install-time
service surface auditable in one place and consistent in chroot/non-chroot
behavior.

install/config/enable-services.sh enables:
- bluetooth.service
- cups.service, cups-browsed.service, avahi-daemon.service
- docker.socket
- iwd.service
- linux-modules-cleanup.service
- power-profiles-daemon.service

Each via chrootable_systemctl_enable, which uses 'enable --now' on a live
system and bare 'enable' in chroot (set OMARCHY_CHROOT_INSTALL=1).

Stays in original script (deliberately):
- sddm.sh: bare 'systemctl enable sddm.service' (no --now during install
  would log the user out; lives in install/login/)
- limine-snapper.sh: limine-snapper-sync (bootloader-specific path)
- first-run/firewall.sh: ufw (deferred to first-run for UX)
- hardware/{t2,intel/lpmd,intel/thermald,apple/fix-suspend-nvme}: gated
  on hardware detection

Side cleanups:
- install/config/kernel-modules-hook.sh: DELETED (sole line was the enable
  for linux-modules-cleanup, now in enable-services.sh).
- install/config/hardware/printer.sh: DELETED (sole purpose was the
  three cups/avahi enables; nothing else to do).
- install/config/hardware/network.sh: keep the systemd-networkd-wait-online
  disable+mask; drop the iwd enable.
- install/config/hardware/bluetooth.sh: keep the AutoEnable=false sed and
  the wireplumber/bt-agent user-session setup; drop the system enable.
- install/config/docker.sh: drop the docker.socket enable.
- install/config/powerprofilesctl-rules.sh: drop the
  power-profiles-daemon enable.
- install/config/all.sh: register enable-services.sh; remove the two
  deleted entries.
2026-06-04 18:34:04 -04:00
Ryan Hughes dcac0ed953 Convert plocate-ac-only, power-profile, wifi-powersave, unmount-fuse to package files
Four scripts that wrote static /etc or /usr files become package-shipped
files. The other config-script audit candidates (omarchy-ai-skill,
nautilus-python, omarchy-toggles, input-group) correctly stay scripts —
they're user-level operations, not /etc writes.

New package-owned files (omarchy-installer/etc/, shipped by
omarchy-settings):
- etc/systemd/system/plocate-updatedb.service.d/ac-only.conf
- etc/udev/rules.d/99-omarchy-power-profile.rules
- etc/udev/rules.d/99-omarchy-wifi-powersave.rules

The two udev rule files are renamed for namespacing (99-power-profile
-> 99-omarchy-power-profile; 99-wifi-powersave -> 99-omarchy-wifi-powersave)
and rewritten to invoke /usr/bin/omarchy-powerprofiles-set and
/usr/bin/omarchy-wifi-powersave instead of $HOME/.local/share/omarchy/bin/...
(both binaries ship in the omarchy package at /usr/bin/).

The battery-present gate from the original scripts is dropped — the rules
trigger on power_supply udev events, which are benign on desktops without
batteries. (The runtime commands no-op on AC-only systems.)

Script changes:
- install/config/plocate-ac-only.sh: DELETED (file ships, daemon-reload
  happens via pacman hook).
- install/config/unmount-fuse.sh: DELETED (file ships at
  /usr/lib/systemd/system-sleep/unmount-fuse via omarchy-settings).
- install/config/powerprofilesctl-rules.sh: SHRINK to runtime ops
  (enable power-profiles-daemon, udevadm reload+trigger).
- install/config/wifi-powersave-rules.sh: SHRINK to udevadm reload+trigger.
- install/config/all.sh: drop the two deleted entries.

bin/omarchy-update-system-pkgs: add --overwrite for plocate-updatedb
drop-in and unmount-fuse paths (the udev rule renames need no overwrite
since the new paths are virgin).

migrations/1779307845.sh: remove the legacy 99-power-profile.rules and
99-wifi-powersave.rules paths on existing installs, then reload udev.
2026-06-04 18:34:04 -04:00
Ryan Hughes 2b749124ef Delete install scripts whose job is now done by package files
Each of these scripts only wrote a single /etc file (or copied
config/bashrc into the user home). The corresponding files now ship
from the omarchy-settings package — either directly into /etc (drop-ins
the package fully owns) or via the /usr/share/omarchy/etc-overrides
post_install dance (for upstream-owned paths).

Deleted:
- install/config/timezones.sh          -> etc/sudoers.d/omarchy-tzupdate
- install/config/sudoless-asdcontrol.sh -> etc/sudoers.d/omarchy-asdcontrol
                                          ($USER rewritten to %wheel)
- install/config/increase-sudo-tries.sh -> etc/sudoers.d/omarchy-passwd-tries
                                          (faillock.conf side now in etc-overrides)
- install/config/hardware/ignore-power-button.sh
                                        -> etc/systemd/logind.conf.d/10-ignore-power-button.conf
                                          (replaces sed-edit of logind.conf)
- install/config/hardware/usb-autosuspend.sh
                                        -> etc/modprobe.d/omarchy-usb-autosuspend.conf
- install/config/ssh-flakiness.sh       -> etc/sysctl.d/99-omarchy-sysctl.conf
- install/config/config.sh              -> /etc/skel seeds ~/.config from config/**;
                                          ~/.bashrc seeded from etc-overrides
- install/login/plymouth.sh             -> theme files already shipped by
                                          omarchy-settings; etc/plymouth/plymouthd.conf
                                          handled via etc-overrides

A separate migration tidies up the old paths on existing installs.
all.sh entries updated to drop these scripts.
2026-06-04 18:34:04 -04:00
David Heinemeier Hansson d1b452cc5f Lock before suspend with sleep inhibitor service 2026-05-21 07:57:08 +02:00
David Heinemeier Hansson abf0a68b54 Drop walker + elephant 2026-05-19 20:54:20 +02:00
David Heinemeier Hansson 7ea4e1ab04 Switch hyprlock to QS 2026-05-19 17:08:14 +02:00
David Heinemeier Hansson 2e29714eee Add integrated Style > Corner controls across hyprland, mako, walker 2026-05-10 14:29:51 +02:00
1537547f91 Use packaged Dell XPS touchpad haptics (#5534)
* 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>
2026-05-08 21:07:51 +02:00
David Heinemeier Hansson cd2c41f618 Add dark/light mode theme syncing to pi agent 2026-05-07 15:02:18 +02:00
bc62c23351 Asus Zenbook UX5406AA Display Backlight Fix (#5620)
* 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>
2026-05-07 12:10:45 +02:00
b3a62245f5 Add bass speaker fix for Lenovo Yoga Pro 7 14IAH10 (#5597)
* 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>
2026-05-07 11:51:27 +02:00
d1056a271b Install sof-firmware on Intel Panther Lake for DSP audio (#5606)
* 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>
2026-05-06 16:39:37 +02:00
David Heinemeier Hansson fcf742a3a1 Raise ulimit headroom
Closes #1758
2026-05-03 15:08:01 +02:00
David Heinemeier Hansson 91af40fd7c Enable fred=on on intel ptl machines 2026-04-30 17:26:14 +02:00
Mathias EekandGitHub 88da163768 Fix jumping cursor / disable-while-typing on ASUS ROG Flow Z13 detachable keyboard (#5452)
* Fix disable-while-typing on ASUS ROG Flow Z13 detachable keyboard

* Replace lsusb with DMI detection for Z13 keyboard

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

* Drop B9406 migration

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

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

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 18:31:43 +02:00
David Heinemeier Hansson ac08aaf834 Resume boosting didn't actually solve the real underlying problem
But a bios update to the XPS should.
2026-04-21 17:19:34 +02:00
David Heinemeier Hansson a70b05e8f3 New kernel patches mean we don't need to turn off the display features 2026-04-21 16:41:07 +02:00
David Heinemeier Hansson e852895e5c Use preexisting toggles setup 2026-04-17 16:03:06 +02:00
David Heinemeier Hansson 79d3b8cec6 Move flags to persistent setup so hyprctl reload doesn't reset them 2026-04-17 14:16:47 +02:00
David Heinemeier Hansson f7dc63ca72 Work around the return-from-sleep sluggishness on panther lake
This is due to slow ramp after s2idle
2026-04-15 02:26:37 -07:00
David Heinemeier Hansson 1f697ecc6d No longer need first-run to set these powerprofilectl rules 2026-04-15 10:36:45 +02:00
Pierre Olivier MartelandGitHub 5ca74821d4 Fix Fcitx5 icon showing up in the waybar (again!) (#5263)
* Update Fcitx5 autostart handling

* Restart xcompose to apply the changes
2026-04-10 06:24:30 -04:00
David Heinemeier Hansson 6171d0ee8f Setup power profile defaults on first run since that's when the daemon is available 2026-04-08 14:35:52 +02:00
MárcioandGitHub 05344eb660 Add LocalSend send action in Nautilus (#4946)
* Add LocalSend send action in Nautilus

* Reuse Nautilus install script in migration

* Detect LocalSend via PATH

* Verify Flatpak LocalSend is installed

* Check Flatpak LocalSend with flatpak info
2026-04-03 11:00:09 +02:00
David Heinemeier Hansson 93fc7fb053 Group related configs together 2026-03-26 09:26:10 +01:00
David Heinemeier Hansson 2b63748c9b Correct references 2026-03-26 09:24:54 +01:00
David Heinemeier Hansson 6c5f417521 Move into intel bundle of fixes 2026-03-26 08:37:31 +01:00
f55c7e9ab5 Add hardware fix for Intel WiFi 7 EHT on Panther Lake (#5106)
Detect Intel BE200/BE211 WiFi cards and disable WiFi 7 (EHT) via
modprobe config. The iwlwifi driver has broken EHT RX adaptation
causing APs to drop to MCS 0, making WiFi unusable.
Falling back to WiFi 6 (HE) restores full performance.

Temporary fix: remove when Intel fixes the firmware/driver.

Signed-off-by: Spencer Bull <Spencer.Bull@Dell.com>
Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-03-26 08:36:41 +01:00
David Heinemeier Hansson 5d4e1032ca Fix runner reference 2026-03-26 08:33:51 +01:00
David Heinemeier Hansson 6c1d9cc92e Fix file path 2026-03-25 20:27:18 +01:00
David Heinemeier Hansson 43de5df392 Framework too 2026-03-24 20:43:56 +01:00
David Heinemeier Hansson a6ea7f50e4 Give asus it's own subdirectory too 2026-03-24 20:42:04 +01:00
David Heinemeier Hansson e8623fbbf6 Move apple fixes into their own subdirectory too 2026-03-24 20:40:43 +01:00
David Heinemeier Hansson c4c55b5c33 Group all intel specifics in subdirectory 2026-03-24 20:39:01 +01:00
David Heinemeier Hansson e2c8bb67cc Group intel hardware tweaks together 2026-03-24 20:35:16 +01:00
David Heinemeier Hansson 4d6221c890 Make custom ptl kernel the default on intel ptl systems
Then we don't need to turn off audio any longer
2026-03-24 20:31:58 +01:00
David Heinemeier Hansson fce6df52aa Ensure intel-lmp is installed on Intel machines for better core prioritization 2026-03-24 16:37:01 +01:00
David Heinemeier Hansson 3154290769 Install MIPI support for IPU7 Intel camera 2026-03-15 18:43:31 +01:00
David Heinemeier HanssonandGitHub 2d35b98bbb Thermald helps manage thermal load on Intel laptops with Sandy Bridge or newer (#5022)
Thanks to the team at Intel for pointing this out 👌
2026-03-15 12:13:26 +01:00
David Heinemeier Hansson 26f2106b29 Add keyboard backlighting drivers for tuxedo/slimbook machines 2026-03-11 21:55:14 +01:00
David Heinemeier Hansson daf738725e Fix Dell XPS audio until we have an upstream fix 2026-03-11 14:20:49 +01:00