One command from a fresh Omarchy install on Asahi Linux to the full macarchy experience:
curl -fsSL https://raw.githubusercontent.com/macarchy/macarchy-install/main/boot.sh | bash
Or, with the repo already cloned:
./install.sh
| Piece | From | What you get |
|---|---|---|
| macarchy-core | install.sh --udev |
Ambient-light auto-brightness, 80% battery charge limit + udev rule, macOS dock, 4-finger pinch gestures, CTRL+scroll screen zoom, Cmd-key grammar, app switcher, light/dark auto-appearance timer |
| macarchy-touchbar | install.sh |
The Touch Bar, drawn by us: a systemd user service that owns the panel over DRM and its touch surface over evdev, with tiny-dfr masked out of the way |
| macos-dynamic-wallpaper | install.sh |
The macOS dynamic desktop: four wallpapers a day, following the real sun at your coordinates, on a five-minute timer |
| omarchy-aquarium | make install |
Animated GLSL underwater background (SUPER+ALT+A), theme-set hook, notification startle watcher |
| apple-glass / -light | rsync into ~/.config/omarchy/themes |
The glass themes, tuned against the aquarium |
| Hyprland wiring | guarded appends | Aquarium bind, zoom binds, daemon autostarts in ~/.config/hypr/{bindings,autostart}.lua (no Touch Bar binds: macarchy-touchbar runs its own commands) |
Every step converges or skips with a note:
- packages go through
pacman --needed - repos are cloned into
$MACARCHY_DIR(default~/Work), fast-forwarded when clean, and left alone when you have local changes - config blocks are appended once, keyed on the command they wire — your edits around them survive
- themes are synced from the repos (the live dirs are copies, per the
macarchy convention), then re-applied with
omarchy theme setso the running session actually picks them up
Re-running after a partial failure — or just to pull updates — is the intended workflow.
omarchy-mac is now macarchy-core, macarchy-dfr is now
macarchy-touchbar, and the commands that used to live in Omarchy's own
omarchy-* namespace are macarchy-* — upstream Omarchy ships an
omarchy-battery-* family of its own, and /usr/share/omarchy/bin comes
first on PATH, so a future upstream addition would have silently shadowed
ours.
install.sh handles that for you, before it installs anything — but it is a
migration, not a cleanup pass, so it moves before it deletes. First the working
copies: ~/Work/omarchy-mac and ~/Work/macarchy-dfr are renamed to
macarchy-core and macarchy-touchbar and their origin is repointed, because
everything below is reinstalled from those checkouts. Nothing is removed at
all until both of them are on disk — otherwise a failed git clone would
leave you with the Touch Bar, the dock and the rest deleted and nothing to put
them back. If they are not there yet, the step says so and defers to the next
run.
Once they are: the old user units are stopped, disabled and removed (enablement
symlinks included), config and state move to their new directories, the stale
binaries leave ~/.local/bin along with the old-named theme-set and aquarium
hooks that called them, and the old command names in
~/.config/hypr/{bindings,autostart}.lua are renamed in place so nothing
gets wired twice. Every step says what it did; on a machine that never saw the
old names it prints one line and moves on. Root-owned leftovers under /etc
are reported with the sudo rm to run, never removed behind your back.
Only the macarchy names move. macos-dynamic-wallpaper keeps its own — it is
named for what it is, not for what it needs, like the themes — so the migration
leaves it strictly alone. It had no repo at all until 2026-09-04; now it has
one, and this installer
pulls it in like the rest.
./doctor.sh
Read-only health check: binaries, udev rules, the uinput module-load,
tiny-dfr masked and the macarchy-touchbar unit enabled, the auto-appearance timer,
Hyprland wiring, themes, and (inside a session) the running daemons.
install.sh runs it at the end.
Every pull request, and every push to main, runs tests/clean-machine.sh on
a clean ubuntu-24.04-arm runner — a real aarch64 machine, so the arch gate
passes without a bypass. It runs install.sh twice, then doctor.sh, then
a Lua syntax check on the appended blocks. That proves the ~/.local/bin
binaries land, the udev rules and the uinput module-load are installed, tiny-dfr
is masked, the systemd user units enable, the Hyprland wiring lands exactly
once, the themes sync, the theme hook installs, and the aquarium C code builds.
What a clean-machine run can never prove, and only this laptop can:
- that the Touch Bar draws anything (no DRM card, no evdev panel — only that the unit enables)
- that the charge limit caps at 80% (no
macsmc-battery— the one honestskipindoctor.sh) - that the aquarium renders (no compositor, no GPU, no layer-shell — only that it compiles and installs)
- that the
autostart.lualines ever fire (only that they parse and are present once) - that
pacmanresolves the named packages on Arch/ALARM (a stub answers yes and echoes every call) - that polkit's interactive path works (replaced by passwordless sudo)
- anything about
omarchy theme set(neitheromarchynoromarchy-theme-setexists on a runner, so that block self-skips) - anything about the
video-group and uinput permissions taking effect after a re-login
- Apple Silicon Mac on Asahi Linux (
linux-asahi, aarch64) - Omarchy installed
- sudo / polkit (udev rules, packages, masking tiny-dfr)
Machines that aren't Touch Bar Macs still get everything else: the Touch Bar pieces install but idle without the hardware.