Everything on top of a stock Omarchy 4.0.4-1 install, gathered so a second machine can be brought to the same state: the ~/.config files that actually differ from the shipped defaults, the three hand-built themes, the ten shell plugins pinned to commits, the two custom scripts, two user units, and the /etc drop-ins. install.sh applies it all idempotently, backing up anything it overwrites. capture.sh runs the other way so the repo stays the source of truth rather than a snapshot that rots. indie.herdr-hud's ten local-only commits ship as a git bundle plus a working-tree patch, since they stay off the upstream PR deliberately. Secrets, the dotfiles repo's territory (shell/git/mise), the remote-access stack and aether-managed themes are all scoped out; README says why for each. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
7.3 KiB
omarchy-setup
Every customization this laptop has on top of a stock Omarchy install, in one place, so a second machine can be brought to the same state.
Captured from Omarchy 4.0.4-1 on 2026-10-10.
git clone <this repo> ~/omarchy-setup
cd ~/omarchy-setup
./install.sh --dry-run # see what it would change
./install.sh # do it
install.sh is idempotent and backs up anything it overwrites as
<file>.bak.<epoch>. capture.sh runs the other way, pulling live changes back
into the repo so this stays the source of truth.
What is in here
| Path | What |
|---|---|
config/ |
Mirrors ~/.config. Only files that differ from Omarchy's shipped defaults. |
themes/ |
The three hand-built themes, wallpapers included. |
plugins.txt |
The 10 Omarchy shell plugins, each pinned to a commit. |
plugin-patches/ |
Local plugin work that exists on no remote (see below). |
bin/ |
omarchy-handoff and fix-stuck-displays. |
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. |
The customizations, and why
Displays (config/hypr/monitors.lua) are the fiddliest part. The file is the
single source of truth for monitor rules on purpose — overlapping rules spread
across several files is what previously made external displays unrecoverable.
Three outputs are named by EDID description rather than connector, so they match
whichever port they land on: the built-in Chimei panel at 1.25x, the LG IPS236 on
HDMI at 1x, and the LG TV through the Anker dock. The TV is deliberately left on
preferred (3840x2160@30) — the dock negotiates DP alt-mode with only two lanes,
so forcing 4K60 produced a "monitor has no mode" loop. GDK_SCALE=1 with a 1.25
monitor scale; the stock pairing is 2 and auto.
hyprland.lua sources hyprmoncfg-monitors.lua last so the hyprmoncfg daemon's
generated layout wins over anything above it.
bin/fix-stuck-displays recovers the related kernel-side failure: after
suspend/resume i915 can leave an unplugged connector "disconnected" but still
"enabled" on a pipe Hyprland has forgotten, which blocks every other output from
modesetting. It forces the connector on, disables it through Hyprland to release
the pipe, then returns it to auto-detect. It needs passwordless sudo for
tee /sys/class/drm/*/status.
Keyboard/mouse sharing (bin/omarchy-handoff, systemd/user/lan-mouse.service)
drives lan-mouse to share input with the other Omarchy laptop, bound to
SUPER+SHIFT+K (SUPER+K is already Keybindings). The script's header comment
is the real documentation — it records the non-obvious facts that cost hours:
capture_backend must be layer-shell (the portal backend is a silent no-op on
Hyprland 0.56.2), [authorized_fingerprints] is keyed by fingerprint and the
reversed form fails silently, and the log variable is LAN_MOUSE_LOG_LEVEL, not
RUST_LOG. It runs as a user unit rather than from autostart.lua because
o.launch_on_start sends both streams to /dev/null, hiding every pairing
failure.
system/sysctl.d/99-omarchy-handoff-arp.conf goes with it: Wi-Fi and the dock's
ethernet both sit on 192.168.1.0/24, and with the default ARP settings the
subnet's mapping collapses onto whichever NIC replied last.
Bar and shell (config/omarchy/shell.json) adds omarchy.active-window to
the left, five plugin widgets, and indie.herdr-hud as a non-bar plugin. Idle is
stretched a long way past stock — screensaver at 20 minutes, lock at 30, against
2.5 and 5.
Keybindings (config/hypr/bindings.lua) rebinds SUPER+SHIFT+A from the
stock ChatGPT webapp to Claude, and adds four Herdr HUD bindings plus Handoff.
Input (config/hypr/input.lua) enables the three-finger horizontal
workspace gesture that ships commented out, and flattens pointer acceleration for
unknown-device*. That second rule belongs to Handoff: lan-mouse forwards
relative deltas the sending compositor has already accelerated, and since
Omarchy leaves accel_profile adaptive the receiver amplifies them a second time,
so a forwarded pointer arrives hypersensitive while the local trackpad feels
normal. wlr-virtual-pointer gives Hyprland no device name — virtual keyboards
get named, pointers don't — hence matching on unknown-device; no real pointer on
this machine uses that name, so the rule cannot touch the trackpad.
Terminals are all dropped to a smaller font (9 -> 8) except ghostty, which
went the other way to 12. shell.toml sets the bar font base size to 10.
Branding (config/omarchy/branding/) replaces the about and screensaver
ASCII art.
hid_apple fnmode=2 makes the F-keys act as F-keys on an Apple keyboard.
It only takes effect after sudo mkinitcpio -P or a module reload.
Local plugin work
indie.herdr-hud is the one piece that exists on no remote. Ten commits live on
its local branch — touchpad scroll feel, agent ordering, context-size display —
and they stay off the upstream PR deliberately. plugin-patches/ carries them as
a git bundle plus a patch for the uncommitted working tree, and install.sh
replays both after cloning. io.github.tallsam.navbar-cat has a one-file working
tree change captured the same way.
capture.sh plugins re-bundles and re-diffs these, so local work keeps flowing
back into the repo.
Not in here, on purpose
- Secrets.
~/.config/lan-mouse/holds a private key and per-machine fingerprints;~/.config/novnc/auth.env, SSH keys and the git credential helpers are likewise machine-local. Pair a new machine withomarchy-handoff peer <host> <ip>andomarchy-handoff doctor. - Shell, git and dev tooling. That is already its own repo,
dotfiles(git.nic-oconnor.com/public/dotfiles), which handles zsh, mise, 1Password and the~/.local/bintool shims. The only overlap avoided here is~/.config/git/config, whose customizations are identity and credential helpers —dotfilesterritory. - The remote-access stack.
wayvnc,novnc,sunshine,freerdp,remminaandomarchy-remote-desktopare installed on this laptop but scoped out.kokd.remote-desktopis still inplugins.txtsince it is a bar plugin, but it is not placed inshell.json. - Work tooling. The keycloak helpers (
kcadm,kclogin,wren-keycloak) andpaperclipai.service. - aether-managed themes.
pink-gt3rs,porsche-caymanandporsche-raincarry a.aether-managedmarker and are reinstallable withaether, so their ~18MB of wallpapers and previews stay out. btop.conf. Its only diff against stock is v1.4.7 default drift, not a real customization.- Backup files. Fifteen
.bak.*and.prefix.*files are sitting in~/.config/hyprand~/.config/omarchyfrom earlier editing sessions. They are not tracked and are safe to delete.
Adding a file
capture.sh only refreshes what the repo already tracks, so start it by hand:
cp ~/.config/foo/bar.conf config/foo/bar.conf # path mirrors ~/.config
git add config/foo/bar.conf
install.sh config and capture.sh config both walk config/ recursively, so
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.