Author SHA1 Message Date
noconnorandClaude Opus 5.5 e1e5f05876 Capture omarchy-air's customizations as a per-host overlay
hosts/<hostname>/{config,system}/ now overlays the shared trees. install.sh
installs a host file in place of the shared copy at the same path, and
capture.sh pulls back into whichever copy the host installs from. That keeps
hardware-specific files off the wrong machine: the HP's EDID-named monitors.lua
and its fnmode=2 would otherwise land on the Air.

capture.sh refreshes the shared trees only on omarchy-laptop, where they were
captured, or when CAPTURE_SHARED=1 is set. On the Air, a plain run copied its
stock terminal, hypr and shell files over every one of the HP's customizations.

air's overlay holds monitors.lua (1.33333 scale and GDK_SCALE=1 for the
2560x1664 panel), input.lua (stock settings plus the inert-accel measurements),
herdr onboarding=false, git identity and credential helpers (no secrets),
mimeapps.list, and the Asahi installer's hid_apple fnmode=1 and show_notch=1.
bindings.lua is not overlaid because the shared one is a strict superset.
hosts/omarchy-air/README.md records what was left out on purpose and why, and
warns that the shared packages.txt is x86-specific.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KKPyqMc7MGKyBLKVdeDejp
2026-10-16 15:49:19 -04:00
11 changed files with 404 additions and 16 deletions
+10
View File
@@ -29,6 +29,7 @@ into the repo so this stays the source of truth.
| `systemd/user/` | `lan-mouse.service`, `voxtype.service`. |
| `system/` | `/etc` drop-ins: the ARP sysctl and `hid_apple` fnmode. |
| `packages.txt` | Packages beyond the Omarchy baseline, each with a reason. |
| `hosts/<hostname>/` | Per-host overlay of `config/` and `system/`: a file there replaces the shared copy on that host only. See `hosts/omarchy-air/README.md`. |
## The customizations, and why
@@ -187,3 +188,12 @@ git add config/foo/bar.conf
nothing else needs changing. Check first that the file actually differs from
stock — `diff /usr/share/omarchy/config/foo/bar.conf ~/.config/foo/bar.conf` —
or you will be tracking a file Omarchy already ships.
### Per-host files
Hardware-specific files (monitor scale, fnmode) go under `hosts/<hostname>/`,
mirroring `config/` or `system/`, rather than into the shared tree. The shared
tree comes from `omarchy-laptop`, and `capture.sh` refreshes it only there (or
with `CAPTURE_SHARED=1`). On any other host it refreshes just that host's overlay,
so a machine running stock files cannot overwrite the shared customizations.
`OMARCHY_SETUP_HOST` overrides the detected hostname for both scripts.
+33 -8
View File
@@ -15,6 +15,15 @@ set -uo pipefail
REPO="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
STEPS=(config themes plugins bin services system packages)
HOST="${OMARCHY_SETUP_HOST:-$(hostname)}"
HOST_DIR="$REPO/hosts/$HOST"
# The shared config/ and system/ trees were captured from this host. Capturing
# them anywhere else would overwrite its customizations with the other machine's
# (often stock) files, so elsewhere only the host overlay is refreshed unless
# CAPTURE_SHARED=1 says the change really is meant for every machine.
SHARED_HOST="${OMARCHY_SETUP_SHARED_HOST:-omarchy-laptop}"
CAPTURE_SHARED="${CAPTURE_SHARED:-0}"
[[ $HOST == "$SHARED_HOST" ]] && CAPTURE_SHARED=1
c_ch=$'\033[33m'; c_skip=$'\033[2m'; c_warn=$'\033[33m'; c_hd=$'\033[1m'; c_off=$'\033[0m'
[[ -t 1 ]] || { c_ch=; c_skip=; c_warn=; c_hd=; c_off=; }
@@ -32,13 +41,29 @@ pull_back() {
if cmp -s "$live" "$dest"; then skip "$label"; else cp "$live" "$dest"; chg "$label"; fi
}
# layered <tree> -- NUL-separated "<repo-copy>\t<rel>" across the shared tree and
# this host's overlay, the overlay copy winning, so a live file is pulled back into
# whichever copy this host actually installs from (see install.sh).
layered() {
local tree=$1 f rel
declare -A pick=()
for base in "$REPO/$tree" "$HOST_DIR/$tree"; do
[[ -d $base ]] || continue
while IFS= read -r -d '' f; do
rel=${f#"$base/"}; pick[$rel]=$f
done < <(find "$base" -type f -print0)
done
for rel in "${!pick[@]}"; do printf '%s\t%s\0' "${pick[$rel]}" "$rel"; done | sort -z -t$'\t' -k2
}
step_config() {
head_ "~/.config -> config/"
head_ "~/.config -> config/ (+ hosts/$HOST/config)"
local dest rel
while IFS= read -r -d '' dest; do
rel=${dest#"$REPO/config/"}
pull_back "$HOME/.config/$rel" "$dest" "$rel"
done < <(find "$REPO/config" -type f -print0 | sort -z)
while IFS=$'\t' read -r -d '' dest rel; do
local tag=$rel; [[ $dest == "$HOST_DIR"/* ]] && tag="$rel (hosts/$HOST)"
if [[ $dest != "$HOST_DIR"/* ]] && (( ! CAPTURE_SHARED )); then skip "$rel (shared; not on $SHARED_HOST)"; continue; fi
pull_back "$HOME/.config/$rel" "$dest" "$tag"
done < <(layered config)
}
step_themes() {
@@ -135,10 +160,10 @@ step_services() {
step_system() {
head_ "/etc drop-ins"
local dest rel
while IFS= read -r -d '' dest; do
rel=${dest#"$REPO/system/"}
while IFS=$'\t' read -r -d '' dest rel; do
if [[ $dest != "$HOST_DIR"/* ]] && (( ! CAPTURE_SHARED )); then skip "/etc/$rel (shared; not on $SHARED_HOST)"; continue; fi
pull_back "/etc/$rel" "$dest" "/etc/$rel"
done < <(find "$REPO/system" -type f -print0 | sort -z)
done < <(layered system)
}
# Report drift in the package delta without rewriting the hand-annotated file:
+65
View File
@@ -0,0 +1,65 @@
# omarchy-air
MacBook Air M2 (`Mac14,2`) running Omarchy **4.0.3rc4-1** on Asahi (aarch64).
Captured **2026-10-16**.
Every file here overlays the shared tree on this host only: `install.sh` installs
`hosts/omarchy-air/config/X` instead of `config/X`, and `capture.sh` pulls back
into it. Paths the overlay leaves out fall through to the shared files, which come
from `omarchy-laptop` (the HP).
## What is in the overlay, and why
| File | Why it is per-host |
|---|---|
| `config/hypr/monitors.lua` | Stock file with `scale = 1.33333` and `GDK_SCALE = 1` for the 2560x1664 Retina panel. The shared one names the HP's Chimei panel and its LG outputs by EDID, which mean nothing here. |
| `config/hypr/input.lua` | Stock settings plus the measurement notes showing why per-device `sensitivity`/`accel_profile` rules are inert for lan-mouse's virtual pointer. Air keeps stock input. It does not take the shared file's 3-finger workspace gesture, its `natural_scroll` comment change, or its `unknown-device` flat-accel rules. Drop this file if you want the HP's behaviour here. |
| `config/herdr/config.toml` | Stock plus `onboarding = false`. |
| `config/git/config` | Stock Omarchy git config plus identity, `fetch.prune`, libsecret, and a `git.nic-oconnor.com` helper that reads `$GITEA_KEY` from the environment. The file holds no secret. |
| `config/mimeapps.list` | nvim for text and source files, chromium for web, HEY for `mailto:`, and the `claude-cli` URL handler. |
| `system/modprobe.d/hid_apple.conf` | `fnmode=1`, which is what Omarchy's own `fix-fkeys.sh` writes. Without this the shared copy would push the HP's `fnmode=2` onto this keyboard. |
| `system/modprobe.d/asahi-notch.conf` | `show_notch=1`, written by Omarchy's `apple/enable-notch.sh`. Tracked so it stays explicit. |
`hypr/bindings.lua` is deliberately **not** overlaid. The shared file is a strict
superset of what air had: the same `SUPER+SHIFT+K` handoff chord plus Claude and
herdr-hud bindings.
## Already shared, identical here
`bin/omarchy-handoff`, `systemd/user/lan-mouse.service` and
`systemd/user/voxtype.service` match the shared copies byte for byte.
`handoff/config/config.toml.example-air` covers this machine's lan-mouse config;
the live file differs only because the daemon strips comments.
## Not captured, on purpose
- **Themes and plugins.** None are installed here. `~/.config/omarchy/plugins/`
is empty, so the shared `themes/` and `plugins.txt` would be new on this machine
rather than a conflict.
- **Packages.** Nothing here was added to `packages.txt`. Beyond the shared list,
air's explicit packages are almost all the Asahi baseline that Omarchy's
installer provides (`linux-asahi`, `m1n1`, `uboot-asahi`, `asahi-*`,
`vulkan-asahi`, `speakersafetyd`, ...). The ones added by hand are
`obsidian-appimage`, `wf-recorder`, `omarchy-steam-fex` and `dotnet-runtime-2.1`.
Many shared entries are Intel/x86-only (`intel-ucode`, `vulkan-intel`,
`lib32-*`, `linux-omarchy`, `sof-firmware`, `thermald`) and some are x86-only
AUR binaries (`visual-studio-code-bin`, `hyprmoncfg-bin`, `netbird-bin`,
`1password`), so **do not run `install.sh packages` here as-is.**
- **`~/.local/bin` tooling** (kubectl, helm, tofu, opencode, op, the agent CLIs,
...) and `~/.config/dotfiles/*.env` come from the separate `~/.dotfiles`
bootstrap, not Omarchy, and the env files hold secrets.
- **Omarchy's own** post-update invitation hooks, `omarchy-asahi-mic.service`
and the other `omarchy-*` user units are all installer-provided.
- **Chromium `Preferences`** is runtime state, not configuration.
## Running the scripts here
`./install.sh --dry-run config system` is safe. It would bring in the shared
terminal fonts, `hyprland.lua`, `autostart.lua`, `bindings.lua`, `shell.json`,
`shell.toml` and the ARP sysctl, which are all the HP's customizations rather than
hardware settings. The `hyprmoncfg` include in `hyprland.lua` is guarded, so it
does nothing without the plugin.
On this host `./capture.sh` refreshes only the overlay. Shared files are skipped
unless `CAPTURE_SHARED=1`, because otherwise air's stock copies would overwrite
the HP's customizations.
+39
View File
@@ -0,0 +1,39 @@
# See https://git-scm.com/docs/git-config
[alias]
co = checkout
br = branch
ci = commit
st = status
[init]
defaultBranch = main
[pull]
rebase = true
[push]
autoSetupRemote = true # Automatically set upstream branch on push
[diff]
algorithm = histogram # Clearer diffs on moved/edited lines
colorMoved = plain # Highlight moved blocks in diffs
mnemonicPrefix = true # More intuitive refs in diff output
[commit]
verbose = true # Include diff comment in commit message template
[column]
ui = auto # Output in columns when possible
[branch]
sort = -committerdate # Sort branches by most recent commit first
[tag]
sort = -version:refname # Sort version numbers as you would expect
[rerere]
enabled = true # Record and reuse conflict resolutions
autoupdate = true # Apply stored conflict resolutions automatically
[user]
name = Nic O'Connor
email = nic.oconnor@gmail.com
[fetch]
prune = true
[credential]
helper = /usr/lib/git-core/git-credential-libsecret
[credential "https://git.nic-oconnor.com"]
helper =
helper = "!f() { test \"$1\" = get && test -n \"${GITEA_KEY:-}\" && printf \"username=%s\\npassword=%s\\n\" \"${GITEA_USER:-$(id -un)}\" \"$GITEA_KEY\"; }; f"
helper = /usr/lib/git-core/git-credential-libsecret
@@ -0,0 +1,96 @@
onboarding = false
# Mirrors the Omarchy tmux config in config/tmux/tmux.conf
# tmux session -> herdr workspace, tmux window -> herdr tab, tmux pane -> herdr pane
[theme]
# tmux ran on the terminal's own palette (bg=default, fg=default, ANSI blue accents)
name = "terminal"
[theme.custom]
# The active tab is drawn as panel_bg text on an accent background, so panel_bg
# has to be dark for it to read - same colors as status-left's "#[fg=black,bg=blue]"
panel_bg = "black"
[terminal]
# Matches -c "#{pane_current_path}" on every split, window, and session
new_cwd = "follow"
[keys]
prefix = "ctrl+space"
# Config and help
reload_config = "prefix+q"
help = "prefix+?"
detach = "prefix+d"
# Copy mode
copy_mode = "prefix+["
# Panes
split_horizontal = ["prefix+h", "alt+enter"]
split_vertical = ["prefix+v", "alt+shift+enter"]
close_pane = ["prefix+x", "alt+esc"]
zoom = "prefix+z"
last_pane = "prefix+;"
focus_pane_left = "ctrl+alt+left"
focus_pane_down = "ctrl+alt+down"
focus_pane_up = "ctrl+alt+up"
focus_pane_right = "ctrl+alt+right"
resize_mode = ["prefix+ctrl+left", "prefix+ctrl+down", "prefix+ctrl+up", "prefix+ctrl+right"]
# Like resize-pane on C-M-S-arrows
resize_pane_left = "ctrl+alt+shift+left"
resize_pane_down = "ctrl+alt+shift+down"
resize_pane_up = "ctrl+alt+shift+up"
resize_pane_right = "ctrl+alt+shift+right"
# No tmux equivalent; herdr's default prefix+shift+p is taken by previous session
rename_pane = "prefix+shift+o"
# Windows -> tabs
new_tab = "prefix+c"
rename_tab = "prefix+r"
close_tab = "prefix+k"
switch_tab = ["prefix+1..9", "alt+1..9"]
previous_tab = ["prefix+p", "alt+left"]
next_tab = ["prefix+n", "alt+right"]
# Like swap-window -t -1/+1 on M-S-Left/Right
move_tab_previous = "alt+shift+left"
move_tab_next = "alt+shift+right"
# Sessions -> workspaces
new_workspace = "prefix+shift+c"
rename_workspace = "prefix+shift+r"
close_workspace = "prefix+shift+k"
previous_workspace = ["prefix+shift+p", "alt+up"]
next_workspace = ["prefix+shift+n", "alt+down"]
[ui]
accent = "blue"
# tmux drew single-line dividers between adjacent panes and no outer frame
pane_gaps = false
pane_outer_borders = false
# tmux had no scrollbar column beside its panes
pane_scrollbars = false
# kill-window and kill-session never asked
confirm_close = false
# automatic-rename gave windows a name without prompting
prompt_new_tab_name = false
# set -g mouse on
mouse_capture = true
# status-right had the zoom flag followed by #h
tab_bar_right = [{ type = "zoom" }, { type = "hostname" }]
# set -g set-titles on / set -g set-titles-string '#h:#W', where tmux's #W was
# the basename of the pane cwd. This is what Hyprland shows in the group bar,
# and it resolves on the server so remote sessions name the remote host.
window_title = "{hostname}: {workspace}"
+83
View File
@@ -0,0 +1,83 @@
-- Keep only your personal input overrides here. Uncommented settings below
-- replace Omarchy's defaults.
-- Keyboard layout and options.
-- See https://wiki.hypr.land/Configuring/Basics/Variables/#input
-- hl.config({
-- input = {
-- -- Use multiple keyboard layouts and switch between them with Left Alt + Right Alt.
-- kb_layout = "us,dk,eu",
-- kb_options = "compose:caps,shift:both_capslock_cancel,grp:alts_toggle",
--
-- -- Use a specific keyboard variant if needed (e.g. intl for international keyboards).
-- kb_variant = "intl",
--
-- -- Change speed of keyboard repeat.
-- repeat_rate = 40,
-- repeat_delay = 250,
--
-- -- Start with numlock on by default.
-- numlock_by_default = true,
--
-- -- Increase sensitivity for mouse/trackpad (default: 0).
-- sensitivity = 0.35,
--
-- -- Turn off mouse acceleration (default: adaptive).
-- accel_profile = "flat",
--
-- touchpad = {
-- -- Use traditional (non-inverse) scrolling.
-- natural_scroll = false,
--
-- -- Re-enable tap-to-click (one-finger tap = left, two-finger = right).
-- tap_to_click = true,
--
-- -- Use two-finger clicks for right-click instead of lower-right corner.
-- clickfinger_behavior = true,
--
-- -- Control the speed of your scrolling.
-- scroll_factor = 0.4,
--
-- -- Enable the touchpad while typing.
-- disable_while_typing = false,
--
-- -- Left-click-and-drag with three fingers.
-- drag_3fg = 1,
-- },
-- },
-- })
-- App-specific touchpad scroll speeds.
-- o.window("(Alacritty|kitty|foot)", { scroll_touchpad = 1.5 })
-- o.window("com.mitchellh.ghostty", { scroll_touchpad = 0.2 })
-- Enable touchpad gestures for changing workspaces.
-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Gestures/
-- hl.gesture({ fingers = 3, direction = "horizontal", action = "workspace" })
-- Enable touchpad gestures for moving focus (helpful on scrolling layout).
-- hl.gesture({ fingers = 3, direction = "left", action = function() hl.dispatch(hl.dsp.focus({ direction = "l" })) end })
-- hl.gesture({ fingers = 3, direction = "right", action = function() hl.dispatch(hl.dsp.focus({ direction = "r" })) end })
-- lan-mouse (handoff) virtual pointer: DO NOT add sensitivity/accel_profile rules here.
--
-- Tried and measured as INERT on 2026-10-10. `hl.device({name="unknown-device", ...})` does
-- match the device (proven by toggling scroll_factor and watching hyprctl report it), but
-- `sensitivity` and `accel_profile` are libinput pointer-acceleration settings and a
-- wlr-virtual-pointer is not a libinput device, so they have nothing to act on. Measured
-- travel with `lan-mouse test-emulation` + hyprctl cursorpos was 398x198px at sensitivity 0
-- AND at -0.9 -- identical, and exactly 1:1 with the raw deltas. Both machines measure the
-- same 398x198, so neither end scales.
--
-- Corollary: global `accel_profile = "flat"` would also be a no-op for the virtual pointer
-- while permanently changing how the real trackpad feels. Pure loss -- do not do it.
-- The magnitude of forwarded motion originates on the SENDING machine's trackpad.
--
-- ROOT CAUSE FOUND 2026-10-10: lan-mouse 0.11.0 forwards UNACCELERATED deltas.
-- input-capture/src/layer_shell.rs:887 destructures the relative-pointer event as
-- `dx_unaccel: dx, dy_unaccel: dy, ..` -- the `..` throws away the accelerated dx/dy that the
-- same event carries. So the accel curve is stripped at the SENDER and nothing replaces it at
-- the receiver. Consequence: sensitivity/accel_profile are inert for forwarded motion on BOTH
-- ends, so "sync the sensitivity between the laptops" is impossible by configuration.
-- The only fix is a source patch to use the accelerated dx/dy.
-- See memory: lan-mouse-forwards-unaccelerated-deltas.md
@@ -0,0 +1,22 @@
-- See https://wiki.hypr.land/Configuring/Basics/Monitors/
-- List current monitors and supported resolutions with: hyprctl monitors all
-- Monitor scale is Hyprland's scale for the output. It sizes everything
-- Wayland-native, accepts fractions (1.6, 1.75), and applies immediately.
-- "auto" lets Hyprland pick per display.
local omarchy_monitor_scale = 1.33333
hl.monitor({ output = "", mode = "preferred", position = "auto", scale = omarchy_monitor_scale })
-- Configure a specific monitor.
-- hl.monitor({ output = "DP-2", mode = "2560x1440@144", position = "0x0", scale = 1 })
-- Portrait/rotated secondary monitor (transform: 1 = 90°, 3 = 270°).
-- hl.monitor({ output = "DP-2", mode = "preferred", position = "auto", scale = 1, transform = 1 })
-- GDK scale is GDK_SCALE, the factor GTK draws its own UI at. It's what
-- sizes X11/XWayland windows, which Omarchy leaves unscaled so they stay
-- crisp instead of being stretched by the compositor. GTK only honors whole
-- numbers, so use the nearest integer to the monitor scale, and restart an
-- app for a change to reach it.
local omarchy_gdk_scale = 1
hl.env("GDK_SCALE", tostring(omarchy_gdk_scale))
+26
View File
@@ -0,0 +1,26 @@
[Default Applications]
text/plain=nvim.desktop
text/english=nvim.desktop
text/x-makefile=nvim.desktop
text/x-c++hdr=nvim.desktop
text/x-c++src=nvim.desktop
text/x-chdr=nvim.desktop
text/x-csrc=nvim.desktop
text/x-java=nvim.desktop
text/x-moc=nvim.desktop
text/x-pascal=nvim.desktop
text/x-tcl=nvim.desktop
text/x-tex=nvim.desktop
application/x-shellscript=nvim.desktop
text/x-c=nvim.desktop
text/x-c++=nvim.desktop
application/xml=nvim.desktop
text/xml=nvim.desktop
text/html=chromium.desktop
x-scheme-handler/http=chromium.desktop
x-scheme-handler/https=chromium.desktop
x-scheme-handler/about=chromium.desktop
x-scheme-handler/unknown=chromium.desktop
x-scheme-handler/mailto=HEY.desktop
x-scheme-handler/claude-cli=claude-code-url-handler.desktop
@@ -0,0 +1 @@
options appledrm show_notch=1
@@ -0,0 +1 @@
options hid_apple fnmode=1
+28 -8
View File
@@ -18,6 +18,12 @@ STAMP="$(date +%s)"
DRY=0
STEPS=(packages config themes plugins bin handoff services system)
# Per-host overlay: hosts/<hostname>/{config,system}/ mirror the shared trees, and
# a file there replaces the shared copy of the same path on that host only. It is
# how hardware-specific files (monitor scale, fnmode) stay off the wrong machine.
HOST="${OMARCHY_SETUP_HOST:-$(hostname)}"
HOST_DIR="$REPO/hosts/$HOST"
# omarchy-handoff peer addresses to open the firewall for. The peer is dual-homed
# (Wi-Fi + dock NIC) and the dock address disappears on undock, so list both.
if [[ -z ${HANDOFF_PEER_IPS+x} ]]; then
@@ -61,6 +67,20 @@ install_file() {
fi
}
# layered <tree> -- NUL-separated "<src>\t<rel>" for every file in the shared tree
# and the host overlay, the host copy winning where both have the same path.
layered() {
local tree=$1 f rel
declare -A pick=()
for base in "$REPO/$tree" "$HOST_DIR/$tree"; do
[[ -d $base ]] || continue
while IFS= read -r -d '' f; do
rel=${f#"$base/"}; pick[$rel]=$f
done < <(find "$base" -type f -print0)
done
for rel in "${!pick[@]}"; do printf '%s\t%s\0' "${pick[$rel]}" "$rel"; done | sort -z -t$'\t' -k2
}
# ---------------------------------------------------------------- packages
step_packages() {
head_ "Packages"
@@ -108,11 +128,11 @@ step_packages() {
# ---------------------------------------------------------------- config
step_config() {
head_ "Config files -> ~/.config"
[[ -d $HOST_DIR/config ]] && say " host overlay: hosts/$HOST/config"
local src rel
while IFS= read -r -d '' src; do
rel=${src#"$REPO/config/"}
while IFS=$'\t' read -r -d '' src rel; do
install_file "$src" "$HOME/.config/$rel"
done < <(find "$REPO/config" -type f -print0 | sort -z)
done < <(layered config)
if (( ! DRY )) && command -v hyprctl >/dev/null && [[ -n ${HYPRLAND_INSTANCE_SIGNATURE:-} ]]; then
hyprctl reload >/dev/null 2>&1
@@ -370,9 +390,9 @@ step_handoff() {
# ---------------------------------------------------------------- system
step_system() {
head_ "System drop-ins (needs sudo)"
[[ -d $HOST_DIR/system ]] && say " host overlay: hosts/$HOST/system"
local src rel dest
while IFS= read -r -d '' src; do
rel=${src#"$REPO/system/"}
while IFS=$'\t' read -r -d '' src rel; do
dest="/etc/$rel"
if [[ -e $dest ]] && cmp -s "$src" "$dest"; then
skip "$dest"
@@ -383,12 +403,12 @@ step_system() {
continue
fi
sudo install -D -m 0644 "$src" "$dest" && ok "$dest"
done < <(find "$REPO/system" -type f -print0 | sort -z)
done < <(layered system)
if (( ! DRY )); then
sudo sysctl --system >/dev/null 2>&1 && ok "sysctl reloaded"
say ""
say " hid_apple.conf (fnmode=2: F-keys act as F-keys) only takes effect once the"
say " hid_apple.conf (fnmode) only takes effect once the"
say " initramfs is rebuilt or the module reloads:"
say " sudo mkinitcpio -P # or: sudo modprobe -r hid_apple && sudo modprobe hid_apple"
fi
@@ -410,7 +430,7 @@ main() {
done
(( ${#want[@]} )) || want=("${STEPS[@]}")
say "${c_hd}omarchy-setup${c_off} repo=$REPO"
say "${c_hd}omarchy-setup${c_off} repo=$REPO host=$HOST"
(( DRY )) && warn "dry run - nothing will be changed"
command -v omarchy >/dev/null || warn "omarchy not found; this looks like a non-Omarchy host"