If the one-command install didn't work, you're in the right place. This article covers every failure we've seen when installing Matrix Desktop on a headless Mac over SSH — and the exact fix for each one.
If you haven't tried the install yet, start with the headless Mac setup guide first. Come back here if something goes wrong.
"Operation not permitted" When Copying
The app is already installed and running, so copying directly over the active bundle can fail.
Fix: Use the current installer. It stages and verifies the replacement before it stops the running app:
MATRIX_INSTALLER="$(mktemp -t matrix-desktop-install)" && curl --fail --location --proto '=https' --tlsv1.2 https://matrix.watch/install.sh -o "$MATRIX_INSTALLER" && /bin/bash "$MATRIX_INSTALLER" && rm -f "$MATRIX_INSTALLER"
Do not delete the working installation before the replacement has passed validation.
"Resource busy" When Mounting DMG
A previous DMG mount is still attached from a failed install attempt.
Fix: Detach the stale mount:
hdiutil detach "/Volumes/Matrix Desktop"
/dev/diskN from a guide; disk identifiers are different on every Mac. The current installer mounts at a unique temporary path and avoids this conflict.
Commands Break When Pasted Over SSH
Multi-line commands with backslash (\) continuations can split into separate commands in some terminal emulators (Warp, iTerm pasting into SSH sessions, Tailscale SSH). You'll see errors like zsh: no URL specified, command not found: -R, or only the first line executes.
Fix: Use a single-line version of the install command with no line breaks:
MATRIX_INSTALLER="$(mktemp -t matrix-desktop-install)" && curl --fail --location --proto '=https' --tlsv1.2 https://matrix.watch/install.sh -o "$MATRIX_INSTALLER" && /bin/bash "$MATRIX_INSTALLER" && rm -f "$MATRIX_INSTALLER"
Display Is Asleep
system_profiler SPDisplaysDataType shows Display Asleep: Yes. The open command may fail or the app may launch but not render because macOS has suspended the display pipeline.
Fix: Wake the display before launching:
caffeinate -u -t 5
Headless Macs put their virtual display to sleep after a few minutes of inactivity. The -u flag simulates a user wake event. Run this before open in your install command.
No GUI Session / WindowServer Not Running
The open command fails silently or errors because there's no active GUI session. This happens when:
- The Mac hasn't been logged in since boot (no auto-login configured)
- Screen Sharing is disabled
- You're connected via pure SSH with no desktop session
Fix: Enable either auto-login or Screen Sharing:
- Auto-login: System Settings > Users & Groups > Login Options > Automatic login
- Screen Sharing: System Settings > General > Sharing > Screen Sharing
Gatekeeper Blocks the App
You see "damaged and can't be opened" or "developer cannot be verified" when launching over SSH.
Fix: Do not bypass Gatekeeper or clear security attributes. Verify the installed app, then reinstall from the validated release if assessment fails:
codesign --verify --deep --strict --verbose=2 "/Applications/Matrix Desktop.app" && spctl --assess --type execute --verbose=2 "/Applications/Matrix Desktop.app"
"login item UNKNOWN" From osascript
When you run the osascript command to add a login item, it returns login item UNKNOWN. This looks like an error but it's not — the login item was created successfully. macOS returns this for apps that aren't currently running or for the first registration.
Verify it worked by checking System Settings > General > Login Items, or just reboot and confirm the app starts automatically.
Rain Not Visible After Launch
The process is running (ps aux | grep -i matrix shows it) but you don't see rain on the desktop through Screen Sharing.
Possible causes:
- Desktop mode not enabled: Matrix Desktop can run in screensaver mode or desktop mode. Desktop mode must be enabled in the app's menu bar dropdown.
- App is behind other windows: The rain renders at the desktop level, below all windows. Minimize or hide windows to check.
- Display resolution too low: The default headless resolution (1024x768) may cause rendering issues. Matrix Desktop auto-upgrades resolution on launch, but if that failed, set it manually.
Check if it's running:
ps aux | grep -i "[M]atrix"
Low Resolution / Blocky Rain
The app auto-upgrades resolution on headless displays, but if you want Retina quality: use a dummy HDMI plug ($8 on Amazon) or BetterDisplay ($21.50) for full control over virtual display resolution.
The Bulletproof Install Command
The validated installer downloads, verifies, stages, replaces, wakes the display, and launches the app without deleting a good installation first. This command also adds the successful installation as a login item:
MATRIX_INSTALLER="$(mktemp -t matrix-desktop-install)" && curl --fail --location --proto '=https' --tlsv1.2 https://matrix.watch/install.sh -o "$MATRIX_INSTALLER" && /bin/bash "$MATRIX_INSTALLER" && rm -f "$MATRIX_INSTALLER" && osascript -e 'tell application "System Events" to make login item at end with properties {path:"/Applications/Matrix Desktop.app", hidden:false}'
Claude Code Troubleshooting Prompt
A prompt you can paste into Claude Code that diagnoses and fixes everything automatically:
Troubleshoot Matrix Desktop on this Mac. Check whether the app is running and whether /Applications/Matrix Desktop.app passes codesign --verify --deep --strict and spctl --assess --type execute. Never clear quarantine or target a hard-coded /dev/diskN. If reinstalling is needed, use https://matrix.watch/install.sh so the DMG, signature, and Gatekeeper assessment are validated and the new app is staged before the existing copy is replaced. Wake the display, launch the app, verify it is running, and show me the final status.