Linux Setup and Troubleshooting
June 2, 2026 ยท View on GitHub
CrossMacro supports Linux on Wayland and X11, but input automation depends on the install channel, desktop session, and available permissions. Start with the doctor command before changing groups, ACLs, or service permissions:
crossmacro doctor --json --verbose
Doctor reports daemon-backed readiness separately from direct device readiness.
Direct device checks can pass while daemon IPC still warns or fails, for example
when /run/crossmacro/crossmacro.sock exists but the current login session has
not picked up crossmacro group membership.
Install mode quick map
.deb,.rpm, AUR: daemon-backed packages. Package scripts set upcrossmacro.serviceand thecrossmacrogroup.- Flatpak on Wayland: daemon-backed or direct device fallback. CrossMacro uses the host daemon socket when exposed; Quick Setup can grant temporary direct-device ACLs.
- AppImage on X11: native X11 backend using XInput2/XTest when available.
- AppImage on Wayland: direct device fallback. Quick Setup may prompt for temporary input permissions.
- NixOS module from nixpkgs: daemon-backed setup. The module installs the UI
package, configures the daemon package, enables uinput, installs udev and
polkit files, creates the
crossmacrogroup and service user, adds configured users to the group, and startssystemd.services.crossmacro.
Linux runtime modes
CrossMacro supports two Linux input modes:
- Daemon-backed mode: the preferred packaged mode. The app talks to
crossmacro.serviceover/run/crossmacro/crossmacro.sock, while the daemon service user owns Linux device access. - Direct device mode: a fallback for channels such as AppImage on Wayland
and some sandbox scenarios. The app process needs access to
/dev/uinputand, for recording or hotkeys, readable/dev/input/event*devices.
On X11, CrossMacro tries native X11 capture and playback first. A supported
native X11 session uses XInput2/XTest and does not require daemon-backed mode,
/dev/uinput, or /dev/input/event* permissions. Linux input permissions only
matter on X11 if native X11 backends are unavailable and CrossMacro falls back
to daemon/direct Linux input paths.
Daemon-backed packages
After installing .deb, .rpm, AUR, or the NixOS module, make sure your desktop
user belongs to the crossmacro group. That group grants access to the daemon
socket, not to raw input devices:
sudo usermod -aG crossmacro "$USER"
# Log out and back in, or reboot, before starting CrossMacro again.
Package scripts try to add the installing user to crossmacro when they can
identify that user. If package output says auto-add could not be confirmed, run
the command above manually.
Daemon packages also install the daemon user, udev rules, polkit files, and uinput setup where supported by the package scripts.
If your environment skips service setup, for example on non-systemd or chroot installs, start the service manually:
sudo systemctl enable --now crossmacro.service
Do not weaken daemon socket permissions as a workaround. Use doctor output to identify whether the failing path is daemon-backed mode, direct device mode, or both.
If doctor reports daemon socket, daemon group, service, or handshake problems:
systemctl status crossmacro.service
groups | grep crossmacro
sudo systemctl enable --now crossmacro.service
If doctor reports daemon device access problems, verify the packaged service and uinput setup before changing service-user groups:
lsmod | grep uinput
sudo modprobe uinput
id crossmacro
stat -c '%A %a %U:%G %n' /dev/uinput
sudo -u crossmacro test -w /dev/uinput && echo writable || echo not-writable
The packaged daemon service is expected to keep device access through
package-provided service, udev, module, and group configuration. Treat manual
input or uinput group changes for the service user as repair steps, not
normal setup.
Flatpak on Wayland
For Flatpak on Wayland, CrossMacro uses a hybrid startup path:
- Daemon-backed mode when the host daemon socket is exposed at
/run/crossmacro/crossmacro.sock - Direct device mode when the daemon path is unavailable and temporary device access is granted to the user session
If required permissions are missing, app startup shows Wayland Setup Required
and can run Quick Setup automatically. Quick Setup uses
flatpak-spawn --host pkexec to apply session ACLs on the host:
rwaccess to/dev/uinputor/dev/input/uinputraccess to/dev/input/event*
If Quick Setup is denied or fails, use doctor first. Manual ACL fallback, run on the Linux host rather than inside the Flatpak sandbox:
sudo modprobe uinput
for p in /dev/uinput /dev/input/uinput; do \
[ -e "$p" ] && sudo setfacl -m "u:$USER:rw" "$p"; \
done
for p in /dev/input/event*; do \
[ -e "$p" ] && sudo setfacl -m "u:$USER:r" "$p"; \
done
If setfacl is missing, install your distro's acl package first.
AppImage
AppImage does not install the packaged daemon-backed service. On X11, CrossMacro
uses native X11 backends when available. On Wayland, AppImage relies on direct
device fallback and may show Linux Input Setup Required with Quick Setup.
Quick Setup uses pkexec to grant temporary direct device access for the current
user session:
rwaccess to/dev/uinputor/dev/input/uinputraccess to/dev/input/event*
These temporary ACLs may need to be applied again after reboot or device re-enumeration.
Run the AppImage:
chmod +x CrossMacro-*.AppImage
./CrossMacro-*.AppImage
Permanent setup is optional and should be treated as advanced manual
configuration because adding a user to input grants broad access to input
devices:
sudo tee /etc/udev/rules.d/99-crossmacro.rules >/dev/null <<'EOF'
KERNEL=="uinput", GROUP="input", MODE="0660", OPTIONS+="static_node=uinput"
EOF
sudo udevadm control --reload-rules && sudo udevadm trigger
sudo usermod -aG input "$USER"
# Log out and back in, or reboot, before starting CrossMacro again.
NixOS
For NixOS, use the official nixpkgs module instead of installing only the UI
package. The module provides the full daemon-backed setup: UI package, daemon
package, uinput, udev rules, polkit files, crossmacro group and service user,
configured desktop users, and systemd.services.crossmacro.
Minimal NixOS configuration:
{
services.crossmacro = {
enable = true;
users = [ "yourusername" ];
};
}
Available module options include:
services.crossmacro.enableservices.crossmacro.packageservices.crossmacro.daemonPackageservices.crossmacro.users
After switching, log out and back in, or reboot, so your desktop session picks up
the crossmacro group membership.
Wayland cursor positioning
CrossMacro supports Wayland with compositor-specific cursor-position capabilities:
- Absolute cursor position is available on:
- Hyprland through IPC
- Wayfire through IPC with
ipcandipc-rulesplugins, v0.10+ - KDE Plasma through D-Bus
- GNOME through a Shell Extension
- Niri and COSMIC are detected for screen resolution only; they do not currently expose a safe absolute cursor-position API for recording.
- If an absolute cursor provider is unavailable, CrossMacro falls back to relative-position mode for recording.
- Macros that contain absolute-coordinate events require an absolute-capable backend for playback.
- You can force relative mode with Force Relative Coordinates.
- You can disable the origin move at recording start with Skip Initial 0,0 Position.
Absolute and relative coordinate events can be mixed in one macro. Current-position clicks do not carry coordinates and execute at the live cursor position.
For the smoothest relative-position playback, disable pointer acceleration and use a flat pointer profile in your desktop or compositor settings; accelerated profiles can distort replayed movement deltas.
GNOME Wayland needs a Shell Extension for absolute mouse position. The bundled extension supports GNOME Shell 45 through 50. CrossMacro reports extension status through its setup flow and diagnostics. Log out and back in after first-time setup if prompted.
Minimal systems and conflicts
Daemon authorization and Quick Setup flows may require polkit, pkcheck, and
pkexec on minimal systems:
which pkcheck pkexec
pkcheck --version
Install your distro's polkit package if these tools are missing.
Some applications can lock input devices exclusively. If capture or playback behaves inconsistently, pause conflicting tools, for example GPU Screen Recorder, test CrossMacro again, then resume them.
Debug logging
For daemon-backed Linux installs, toggle daemon debug logging with USR1:
sudo systemctl kill -s USR1 crossmacro.service
journalctl -u crossmacro.service -f
Send USR1 again to restore normal log level.