I had an M1 MacBook Air and an itch to try Omarchy, DHH's opinionated Arch Linux setup with Hyprland. Omarchy runs on Apple Silicon through Asahi Linux and a community build for Macs. Installing it was the easy part. Making it my daily driver took two days.
I did most of the setup in a terminal with Claude Code, and I kept notes of everything that broke. In this article, I want to go over the problems I hit and how I solved them, so you don't have to:
- an update that left me with a blank desktop
- external monitors through a DisplayLink dock
- apps that don't ship for ARM Linux
- Netflix and DRM
- making a Mac keyboard behave
- a custom theme to finish it off
The setup
The hardware is a MacBook Air M1. Asahi Linux gives you the kernel and drivers, and the community Mac build of Omarchy puts the whole Omarchy desktop on top. The GPU works and sleep works.
One thing to know before you start copying configs from the internet: the Hyprland version Omarchy ships (0.56) uses Lua for configuration. Most tutorials you will find are for the old format. Even hyprctl dispatch takes Lua now:
# old syntax, fails
hyprctl dispatch workspace 8
# new syntax
hyprctl dispatch "hl.dsp.focus({ workspace = '8' })"
Always look at the output. The old syntax just prints an error, and if you pipe it to /dev/null you will wonder why nothing happens.
The first hour was the easy stuff. Zen as the default browser on Super + B, the browser always opening on workspace 1, the terminal on workspace 2, smaller gaps between windows:
-- ~/.config/hypr/hyprland.lua
o.window("^(zen)$", { workspace = "1" })
o.window("^(foot|Alacritty|kitty|com.mitchellh.ghostty)$", { workspace = "2" })
The update that broke my desktop
This one cost me the most time, and it was my own fault.
I installed KDE Connect after refreshing the package database, but without a full system upgrade. On Arch that is a partial upgrade, and you should never do it. KDE Connect pulled in a newer Qt. I fixed it with a full omarchy update, rebooted, pressed Super + Space and got an empty screen. The menu, the launcher and parts of the top bar were all blank.
The first guess was a mismatch between Qt and the shell binary, so we rebuilt the shell from the AUR. It did not help. The real cause was more interesting: Qt 6.12 added a built-in type called Color, and Omarchy's shell has its own Color object. The new built-in one won, and every colour in the shell came back empty. Upstream Omarchy had already fixed it by importing the shell's version under a name (Commons.Color). The Mac build had not shipped that fix yet.
The fix: a patched copy of the shell, and pointing Omarchy at it. Omarchy reads its install path from /etc/omarchy.conf, so the copy can live in your home folder:
# /etc/omarchy.conf
OMARCHY_PATH=/home/pavel/.local/share/omarchy-patched
The copy symlinks everything from /usr/share/omarchy except the shell/ folder, which has the upstream fix applied. Once the Mac build catches up, I delete the file and reboot. I also added a small post-update hook that warns me when Qt is newer than the shell, so I see it before the desktop does.
Lessons:
- Never
pacman -Sywithout-u. - When everything breaks after an update, look at which libraries changed before rebuilding things.
- Community plugins can have the same bug. I had to patch two of them the same way.
External monitors
My desk has a Dell monitor in portrait and a Samsung 4K. On this MacBook I could not get video out through the USB-C ports, so I used a DisplayLink dock. On Arch that needs the evdi-dkms and displaylink packages from the AUR. After a reboot, both monitors came up.
Getting them arranged had three small traps:
-
The Dell needs a rotation.
transform = 1in the monitor config. - The screens must touch. If there is even a small gap between them in the layout, the mouse cannot move from one screen to the other.
-
nwg-displays is handy, but its Save overwrites your whole
monitors.lua. Use it to drag screens around, then copy the positions into your own file.
This is what I ended up with. Matching monitors by description instead of connector name keeps it stable, because DisplayLink connector names can change:
-- ~/.config/hypr/monitors.lua
local dell = "desc:Dell Inc. DELL P2419HC 9N7BL03"
local samsung = "desc:Samsung Electric Company SAMSUNG"
hl.monitor({ output = dell, mode = "1920x1080@60", position = "424x2448", scale = 1, transform = 1 })
hl.monitor({ output = samsung, mode = "3840x2160@60", position = "1504x2448", scale = 1.6 })
hl.monitor({ output = "eDP-1", mode = "2560x1600@60", position = "3904x3209", scale = 2 })
-- Workspaces 1-7 on the Samsung, 8 on the Dell, 9-10 on the laptop
for ws = 1, 7 do
hl.workspace_rule({ workspace = tostring(ws), monitor = samsung, default = ws == 1 })
end
hl.workspace_rule({ workspace = "8", monitor = dell, default = true })
Without the dock, all workspaces simply fall back to the laptop screen.
ARM apps: the long tail
Most things are in the Arch Linux ARM repos. The ones that are not were the most work.
| App | Problem | What worked |
|---|---|---|
| Bitwarden | The bar plugin ships helper binaries only for Intel | Built the three helpers with Rust (cargo build --locked) and allowed ARM in the plugin's architecture check |
| The web app works, but I wanted the native OmaWhatsApp plugin | Built its privacy-patched wacli from source with Go |
|
| Zed | Not in the ARM repos | The official installer has ARM builds. Added a zeditor alias so Omarchy's menu sees it |
| Blender | No ARM Linux build from Blender, Flathub or Arch | Fedora builds it for ARM, so it runs in a Fedora container with distrobox, GPU included |
| Obsidian | In the repos | Turned on its command line tool, so Claude Code can read and write my notes |
A few notes from this:
-
Zed is my IntelliJ replacement. It has a JetBrains keymap, and one setting turns off all AI features:
"disable_ai": true. I also hid the sign-in button, because I don't want an account. -
Blender from Fedora had one bug: its colour config is newer than its colour library, so it silently fell back to basic colours. Changing the version line in
config.ociofrom 2.5 to 2.4 fixed it. -
Check what an installer does before you run it. Some, like Zed's, just unpack into
~/.local. Some want root. Reading 170 lines of shell script takes two minutes.
Netflix
Netflix needs Google's Widevine DRM. Google makes ARM Linux Widevine only for Chromebooks, so Netflix only accepts it from a browser that says it is a Chromebook. I went through three error codes before it worked:
| Error | Cause |
|---|---|
| F7701-1003 in Zen | Widevine installed but not enabled in the browser |
| E100 | Widevine works, but the browser doesn't say it is ChromeOS |
| C7701-1003 in Chromium | Fresh profile, Widevine downloaded but not loaded until restart |
What works is a separate Netflix web app in Chromium with:
- its own profile (
--user-data-dir), so the flags apply even when another Chromium window is already running - a ChromeOS user agent
- the ChromeOS-based Widevine from Asahi's
widevinepackage -
--disable-component-update, so Chromium doesn't replace that Widevine with its own download
Quality is capped at 720p, like on any Linux browser. Good enough for the couch.
Making the Mac keyboard behave
After years on macOS, my fingers expect Cmd shortcuts. Omarchy already maps Super + C/V/X to copy and paste. I added Super + A for select all. It sends Ctrl + A, except in terminals, where Ctrl + A means "go to the start of the line".
The F-row needed the most changes:
-
Media keys by default. The Apple keyboard driver has a setting for this:
options hid_apple fnmode=1in/etc/modprobe.d/hid_apple.conf. Brightness, media and volume work without Fn; F1–F12 need Fn. - F5 is dictation. On the Mac it is the dictation key; here it sends "mic mute". Omarchy ships Voxtype, a local speech-to-text tool, so F5 now does push-to-talk dictation.
- F4 opens the app launcher, like Spotlight.
- F3 opens the screenshot menu. Omarchy has no Mission Control, and Super + Space already opens the menu.
-
F6 toggles Do Not Disturb. By default it put the laptop to sleep, because systemd handles that key before Hyprland sees it. One line fixes that:
HandleSuspendKey=ignorein a drop-in under/etc/systemd/logind.conf.d/.
Smaller things: I added the Czech QWERTY layout (Left Alt + Right Alt switches, and Omarchy's bar shows a layout indicator as soon as there are two), and I set the calendar to start weeks on Monday.
What doesn't work
To be fair, not everything is solved:
- Touch ID. The fingerprint sensor is tied to Apple's Secure Enclave, and Asahi doesn't support it.
- Automatic keyboard backlight. There is no ambient light sensor support, so the backlight only turns off when the screen locks.
- Netflix in my normal browser. Only the Chromebook-pretending web app plays it.
- Some defaults assume a bigger screen. The screenshot editor opened larger than the laptop display, with its toolbar off-screen. A window rule capping it at 85% of the screen fixed that.
A theme to finish it off
Once everything worked, I made it look the way I wanted. Golden Record is my own Omarchy theme: deep-space blue-black, warm text, gold accents, and NASA and Webb images as backgrounds. The background follows the time of day: Earthrise in the morning, the Sun during the day, the golden Cosmic Cliffs in the evening, a deep field full of galaxies at night.
You can install it with:
omarchy theme install https://github.com/PavlikPolivka/golden-record
Omarchy themes the terminal, bar, editor and Chromium from one colors.toml, but not Firefox-based browsers like Zen. So I wrote that part too, and sent it upstream as a pull request to Omarchy.
Working with Claude Code
I want to be honest about how this went, because I didn't type most of these commands myself.
Claude Code did the research, read the source when something broke and wrote the configs. It was fast and it was thorough. It also made mistakes: it blamed the blank desktop on the wrong thing at first, it once killed its own shell with a too-wide pkill -f, and it claimed a tool wouldn't touch my config when it did. Each time, the fix was the same: check the actual output instead of assuming.
Some things it was not allowed to do: build AUR packages, install services that keep running, publish anything under my account. I ran those myself, and I think that is the right split.
The best habit we built was writing everything down. Every fix went into my Obsidian notes as it happened. That is also why this article exists.
Was it worth it?
Yes. Two days in, the M1 Air runs Omarchy as my daily machine: three monitors, a keyboard that feels like a Mac, the apps I need and a desktop I like looking at. Expect to fix things yourself, especially anything that doesn't ship for ARM. If you're fine with that, it's a great second life for an M1.
If you run Omarchy or Asahi on a Mac, I'd love to hear what you had to fix. Drop a comment.
You can follow me here on dev.to for more.
Top comments (0)