Add aarch64 support for Omarchy 3.x - #1897
Conversation
b9e8f0a to
09e6b4a
Compare
There was a problem hiding this comment.
This script is necessary because limine-update and limine-snapper-sync don't work on arm, so I had to re-create what they do in bash, directly. This will write out a new limine.conf and I have another changeset that will introduce full kernel backup and restore which could be used universally instead of the java tooling that limine currently has (which again, isn't ARM compatible). But I didn't want to overdo this PR. If we need to trim some of this file back and save it for the other full featured limine sync replacement, LMK. But it's guarded in here, so could be staged for now.
There was a problem hiding this comment.
The OMARCHY_ARM env var is currently only exported during install, so we fall back to uname -m here for a more raw ARM detection.
| if [ -n "$OMARCHY_ARM" ]; then | ||
| # ARM64: Use bash implementation with kernel versioning | ||
| echo -e "\e[32mRestoring snapshot with kernel versioning (ARM64)...\e[0m" | ||
| sudo "${OMARCHY_PATH}/bin/omarchy-limine-snapper-restore" |
There was a problem hiding this comment.
Another bash re-write that effectively does the same thing. Not yet included in this PR. Planning to follow up with a separate one, but could include here, too, LMK.
| listener { | ||
| timeout = 150 # 2.5min | ||
| on-timeout = pidof hyprlock || omarchy-launch-screensaver # start screensaver (if we haven't locked already) | ||
| on-timeout = pidof hyprlock || ([[ "$(systemd-detect-virt)" == "none" ]] && omarchy-launch-screensaver) # start screensaver (if we haven't locked already) |
There was a problem hiding this comment.
Don't turn on screen saver in VMs...the host has a screen saver
| ## Asahi Linux ARM repository mirrorlist | ||
| ## Generated for Omarchy on Apple Silicon Macs | ||
|
|
||
| Server = https://github.com/asahi-alarm/asahi-alarm/releases/download/$arch |
There was a problem hiding this comment.
We actually need this for parallels DRM audio to work, too, not just m1/m2 macs... kind of annoying 🤷
| # This must be in the main shell since run_logged() executes scripts in subshells | ||
| arch=$(uname -m) | ||
| if [[ "$arch" == "aarch64" || "$arch" == "arm64" ]]; then | ||
| export OMARCHY_ARM=true |
There was a problem hiding this comment.
Need to export here for subshells from install.sh (as noted in the comment inline as well)
There was a problem hiding this comment.
This is the new GUM based user prompt to bootstrap a non-root user from within a root user session. You can see it in action in the video. Open to thoughts/changes here, but I did try to make it pretty robust/fault tolerant, and with validations for non blank / only spaces input, as well as a lightweight regex based email validation.
There was a problem hiding this comment.
It was not worth trying to do this conditionally in-line with the limine-snapper.sh file. I tried! This is better.
| # Update icon cache for yaru-icon-theme (needed on ARM) | ||
| if [ -d "/usr/share/icons/Yaru" ]; then | ||
| echo "Updating Yaru icon cache for ARM..." | ||
| sudo gtk-update-icon-cache /usr/share/icons/Yaru |
There was a problem hiding this comment.
Not sure why this is necessary, but it didn't work without it previously.
|
Just saw this PR as I was working on getting my Asahi Alarm setup working with Omarchy (using your and @nilszeilon's older branches) but running into issues. Switched to this with a half broken setup and it seems to have sorted it out. Still early days as I just booted into Hyprland, but looking very favorable even for a system in a strange state. Great work! 🙌 (Oh yeah, M1 MacBook Air here) |
|
Brilliant work! @jondkinney Am I correct here by saying that the idea is that bare metal users install Asahi Alarm with minimal installation first and then wget the omarchy installation script like in the @nilszeilon 's discussion page? |
run_logged uses bash -c which creates a fresh shell that doesn't inherit the parent's set -eEo pipefail, so each script needs its own set -e to catch failures like transient 502 errors.
zram compressed swap is better for Pi (avoids SD/eMMC wear), faster than disk I/O, and eliminates btrfs NOCOW workarounds. Standardizes swap config across Asahi, ARM VMs, and Raspberry Pi using systemd-zram-generator. Migrates existing Pi swap files on upgrade. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix incorrect reboot and shutdown commands in System menu
Add direct substitutions for hyprland-preview-share-picker and wayfreeze. Add custom installer mappings for omarchy-walker, nvim, and dotnet-runtime-9.0. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The bundled walker-arm64 binary (v2.13.0) crashes on systems with newer GTK4/glib2 due to ABI incompatibility, and causes pacman file conflicts when later updated via AUR. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
No longer uses a pre-built binary, so the name was misleading. Updated all references in arch.sh, arm-aur.packages, and the check script. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix wrong variable name in base.sh x86 AUR install path - Remove duplicate pacman-key and redundant pacman -Syyuu in preflight - Remove early base-devel install (already installed later with with_yes) - Replace seq with pure-bash loop in with_yes helper - Use daemon-reload instead of daemon-reexec in vmware-tools - Fix missing space in docs example command Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Using export leaked MESA_LOADER_DRIVER_OVERRIDE, VK_ICD_FILENAMES, and __GLX_VENDOR_LIBRARY_NAME into every child process launched from the terminal. Apps like OBS and Kdenlive that need Vulkan would crash or fall back to software rendering. Using exec env scopes the vars to only the Ghostty process. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
On Wayland, fcitx5 uses the Wayland input method protocol directly. QT_IM_MODULE forces Qt apps to load libfcitx5platforminputcontextplugin.so which has a SIGBUS bug on aarch64. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The signal-desktop-beta PKGBUILD now depends on fpm (AUR) and libxcrypt-compat (removed from official repos, now AUR-only). Without pre-installing these, makepkg -s fails because pacman can't resolve AUR packages. Also explicitly install nodejs-lts-jod and pnpm from official repos before the build. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
libxcrypt-compat is in the core repo, not AUR. Installing it via omarchy-aur-install caused a build failure since it tried to compile from AUR source instead of using the official package. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
OBS upstream hasn't merged FFmpeg 8 support yet (obsproject/obs-studio#12534). FFmpeg 8.x recently landed in Arch repos, breaking the obs-studio-git build. Rather than blocking the entire installation, warn and continue so OBS can be installed later once upstream is fixed. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The obs-studio-git PKGBUILD has been restructured significantly: - Source arrays are now built in _source_main()/_source_cef() functions - libvpl (Intel VPL) added to depends (x86-only, breaks ARM) - ffnvcodec-headers added to makedepends (x86-only) - Old sed patterns for source/sha256sums no longer matched Updated approach: - Remove _source_cef function call entirely (not just source entries) - Remove x86-only deps (libvpl, ffnvcodec-headers) from PKGBUILD - Pre-install full ARM-compatible dependency set matching PKGBUILD - Verify FFmpeg is findable via pkg-config before building - Add aarch64 to supported architectures Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
pipewire-jack is already installed and provides 'jack'. Installing jack2 explicitly causes a package conflict. The PKGBUILD's 'jack' dependency is already satisfied by pipewire-jack. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Thanks to Vaxry and Ryan (hyooz) for helping fix this at the Omacon after party!
New bin/ script that installs a libinput quirk tagging the keyd virtual keyboard as AttrKeyboardIntegration=internal. Without this, libinput's disable-while-typing does not fire when keyd is running, because keyd grabs the physical keyboard via EVIOCGRAB and re-emits events through a userspace virtual device that libinput defaults to external. The quirk is scoped tightly to MatchName='keyd virtual keyboard' so real external USB keyboards are not affected. The script is idempotent (uses begin/end markers to detect prior installs), runs libinput quirks validate, and is a no-op when keyd isn't installed.
Previously bin/omarchy-install-libinput-keyd-quirk regenerated the quirks file from an inline heredoc and gated install on keyd being already present — but users usually install keyd AFTER cloning omarchy-arm, so the gate made the script a no-op at bootstrap time. Restructure so the quirks file is a tracked source file in the repo and gets copied to /etc/libinput/local-overrides.quirks during the normal arm install flow, whether or not keyd is present. The shipped quirk matches by device name (keyd virtual keyboard) so it's inert on systems without keyd — if keyd is installed later, the existing /etc file takes effect on the next session with no further setup. - default/libinput/local-overrides.quirks new, source of truth - install/arm_install_scripts/libinput-quirks.sh copies source → /etc - install/packaging/arch.sh sources the new install step - bin/omarchy-install-libinput-keyd-quirk now a thin wrapper around the install script (for re-applying on existing installs)
Parallels on Apple Silicon exposes the host device tree to the guest, so /sys/firmware/devicetree/base/compatible contains "apple" even inside VMs. This caused ASAHI_ALARM to be set on Parallels ARM VMs, which then prevented OMARCHY_VIRTUALIZATION from being set and triggered Asahi-only install steps like libinput quirks. Wrap the Asahi detection with systemd-detect-virt so it only fires on bare metal. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The quirks file is tracked in the repo and known-good. Validation required libinput-tools which isn't installed and isn't worth adding as a dependency just for a one-time check on a static file. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 88 out of 110 changed files in this pull request and generated 3 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| ## Asahi Linux ARM repository mirrorlist | ||
| ## Generated for Omarchy on Apple Silicon Macs | ||
|
|
||
| Server = https://github.com/asahi-alarm/asahi-alarm/releases/download/$arch |
There was a problem hiding this comment.
This mirror entry doesn’t look like a valid pacman repository URL: it’s missing $repo in the path, and GitHub release downloads generally require a tag name and full asset path. As written, pacman will 404 when trying to download databases/packages. Update this to the correct Asahi-ALARM repo base URL format (including $repo and $arch) and verify pacman -Sy works against it.
| # Use bash built-in read with timeout instead of external sleep command | ||
| # This prevents "command not found" errors when coreutils is being upgraded | ||
| read -t 0.1 -N 1 2>/dev/null || true | ||
| done |
There was a problem hiding this comment.
The background log monitor replaces sleep with read -t 0.1 -N 1, but that reads from the process’s stdin and can consume user keystrokes intended for later interactive prompts (gum), especially when running in a real TTY. Use sleep (preferred), or redirect read from /dev/null/another fd so it can’t drain interactive input.
| echo "Creating EFI boot entry..." | ||
| DISK=$(findmnt -n -o SOURCE /boot | sed 's/p\?[0-9]\+$//') | ||
| PART=$(findmnt -n -o SOURCE /boot | grep -o 'p\?[0-9]\+$' | sed 's/^p//') | ||
|
|
||
| # Check if Limine entry already exists | ||
| if ! efibootmgr | grep -q "Limine"; then | ||
| sudo efibootmgr --create --disk "$DISK" --part "$PART" --label "Limine" --loader '\EFI\BOOT\BOOTAA64.EFI' | ||
| echo "Created Limine boot entry" | ||
| else | ||
| echo "Limine boot entry already exists" | ||
| fi | ||
|
|
||
| echo "Setting Limine as default boot option..." | ||
| LIMINE_NUM=$(efibootmgr | grep "Limine" | cut -c5-8) | ||
| if [[ -n "$LIMINE_NUM" ]]; then | ||
| CURRENT_ORDER=$(efibootmgr | grep "^BootOrder:" | cut -d: -f2 | sed 's/ //g') | ||
| # Remove Limine from current order if it exists | ||
| NEW_ORDER=$(echo "$CURRENT_ORDER" | sed "s/$LIMINE_NUM,//g" | sed "s/,$LIMINE_NUM//g" | sed "s/$LIMINE_NUM//g") | ||
| # Put Limine first | ||
| sudo efibootmgr --bootorder "$LIMINE_NUM${NEW_ORDER:+,$NEW_ORDER}" |
There was a problem hiding this comment.
This script uses efibootmgr to create/update EFI boot entries, but it never ensures the efibootmgr package is installed. On minimal ARM installs this is likely missing, and with errexit enabled the install will abort with command not found. Install efibootmgr as part of the Limine setup (or guard these steps and skip boot entry creation when it’s unavailable).
|
Used your modifications, @jondkinney, to install Omarchy 3.8.2 yesterday in Parallels Desktop on Apple M2 Pro (MacBook Pro). Had archboot to bootstrap a minimal Arch Linux ARM installation and used the provided shell script from your repo. Installation worked fine after some back-and-forth with Claude. Three observations which might be relevant before merging becomes possible:
Hope this helps to move this topic forward! |
|
Closing since this targets the pre-Quattro architecture and can no longer be applied to the current codebase. If the underlying idea is still relevant after Quattro, it can be proposed again against the new implementation. Thanks for the contribution! |
|
Hi @jondkinney any chance if you can upload a new VM image? old links are expired :( |
|
At least parts of this work/roadmap now exist i |
Building upon what @nilszeilon did in #876 this reworks things quite a bit, especially around the initial user creation to help folks on a new
asahi-alarmm1/m2 install (or fresh parallels VM created through archboot) get their non-root user created so we can execute the omarchy install automatically as that new user.The changes include architecture detection, platform-specific package management, bootloader configuration, and custom binary handling for aarch64.
TL;DR;
It should work on any new aarch64 VM (tested with Parallels and VMware) as well as Asahi-Alarm for m1/m2 macs.
On a VM
Get the parallels or vmware images with
wget&sudoinstalled (or install Arch on your own VM w/ the necessary deps). Both of these downloads are good through May 9th 2026. If you need a new one after that, ping me and I can try to help.Once your VM is booted, if you're using Parallels, choose "Install Parallels Tools" from the "Action" menu. If you're using VMware you do not have to manually initiate any VMware Tools installation, it's fully automated.
Finally after logging into the VM as
rootexecute the wget command below 👇 Protip: thatwgeturl should be in the bash history of both VMs if you press theuparrow on the keyboard a few times.wget -qO- https://raw.githubusercontent.com/jondkinney/armarchy/amarchy-3-x/boot.sh | OMARCHY_REPO=jondkinney/armarchy OMARCHY_REF=amarchy-3-x bashIf you want to type in a shorter url, this shortlink will expand to the above:
curl -fsSL hdwy.link/armarchy-3-x | bashyou can inspect it by omitting the| bashfirst if you like which will just print the text it's going to pipe to bash.On Asahi Alarm (for M1/M2 Macs)
Do the install from within macOS (IMPORTANT: choose the
minimaloption when prompted) once complete, it'll have you reboot into Arch. Log in as therootuser (password: root).Next, setup wifi with:
nmcli device wifi connect <SSID> password <password>then installwgetwithpacman -S wgetand finally, manually type thewgetcommand above ☝️ noting the (accidental) difference between the fork name "aRmarchy" and branch name "amarchy" without the "r" (sorry about that!).Note: I've generally not had a problem with installing over wifi when testing Asahi-Alarm on my M1 Max MacBook Pro w/ 32gb RAM, but YMMV. Use ethernet for a more stable experience.
Key Features
Major Changes
1. Architecture Detection & Environment Setup
install.sh2. Package Management
Repository Configuration
Package Installation Strategy
3. Audio System Configuration
pipewire-jackinstallation in preflight to preventjack2conflictsasahi-audiopackagewidevinefromasahi-alarmrepositorywidevine4. Application Support
Custom ARM Installations
Vulkan Configuration
5. Bootloader Configuration
Limine Support
BOOTAA64.EFIinstallation for UEFI ARM systemsImageinstead ofvmlinuz)mkinitcpiohooks (nomicrocodeon ARM)Boot Configuration
microcode, UKI supportmicrocode6. Virtual Machine Detection
systemd-detect-virtintegration to detect VM environments7. Helper Scripts Updates
Updated Scripts
omarchy-refresh-pacman-mirrorlist: Architecture-awaremirrorlistselectionomarchy-snapshot: Architecture-specific restoration toolsomarchy-limine-update: ARM64 kernel detection support, updateslimine.confautomatically.New Scripts
8. Error Handling & Compatibility
Graceful Degradation
mkinitcpiowarnings: Continue on non-fatal warnings (missingfsckhelpers, for example)Platform-Specific Fixes
Testing Environments
Migration Notes
x86_64installations are unaffectedFuture Improvements
##Breaking Changes
None (hopefully) - all changes are intended to be additive and maintain backward compatibility with existing x86_64 installations. At least, that's the goal.
Dependencies
Install Video
Here's a video showing the full install process. If you slow it down to 0.25x you can scrub around to a point of interest and sort of see what's going on.
https://share.cleanshot.com/rmD5JKqY
Fin!
And with any luck, you'll be greeted with a lovely Tokyo Night!
VMware vs Parallels
When installing to VMware, we automatically add the Open VMware Tools. Note that currently the clipboard does not synchronize even with VMware Tools properly installed.
We also have to add some env vars on VMware to allow Hyprland to load properly. However, note that this likely performs worse than parallels because it's doing all of the rendering through software instead of using any discrete GPU capabilities. I think Parallels uses some discrete GPU because these settings are not necessary for it to work on Parallels. So I'd recommend Parallels, but VMware is free, so choose what you want.
You also need to enable 3d acceleration in VMware (this is already done in the provided download image)
Parallels Tools
We handle the VMware tools automatically, but we can't do the same for Parallels. It's pretty simple though, the installer will error out and tell you what to do if you don't have the Parallels Tools mounted. The easiest path is to just choose "Install Parallels Tools" from the "Action" menu before running the Omarchy
wgetinstall command. The installer will take it from there!With Parallels Tools installed, make sure you set two critical settings to have the best experience. The first one at the Parallels Desktop preferences level, the second one at the VM configuration level.
This ensures that command (super) + space will work inside of the VM and not trigger the macOS spotlight shortcut.
This allows for the mouse to flow in/out of the VM window (if you're not in full screen) without having to manually release the mouse cursor by pressing ctrl + option.