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>
147 lines
7.3 KiB
Markdown
147 lines
7.3 KiB
Markdown
# 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**.
|
|
|
|
```bash
|
|
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 with
|
|
`omarchy-handoff peer <host> <ip>` and `omarchy-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/bin` tool shims. The only overlap avoided here is
|
|
`~/.config/git/config`, whose customizations are identity and credential
|
|
helpers — `dotfiles` territory.
|
|
- **The remote-access stack.** `wayvnc`, `novnc`, `sunshine`, `freerdp`, `remmina`
|
|
and `omarchy-remote-desktop` are installed on this laptop but scoped out.
|
|
`kokd.remote-desktop` is still in `plugins.txt` since it is a bar plugin, but
|
|
it is not placed in `shell.json`.
|
|
- **Work tooling.** The keycloak helpers (`kcadm`, `kclogin`, `wren-keycloak`) and
|
|
`paperclipai.service`.
|
|
- **aether-managed themes.** `pink-gt3rs`, `porsche-cayman` and `porsche-rain`
|
|
carry a `.aether-managed` marker and are reinstallable with `aether`, 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/hypr` and `~/.config/omarchy` from 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:
|
|
|
|
```bash
|
|
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.
|