Code change:
<ins> { config , lib , pkgs , ... }: let inherit (lib) mkDefault mkEnableOption mkIf mkOption mkPackageOption types; cfg = config.services.monado; in { options.services.monado = { enable = mkEnableOption "Monado user service"; package = mkPackageOption pkgs "monado" { }; defaultRuntime = mkOption { type = types.bool; description = '' Whether to enable Monado as the default OpenXR runtime on the system. Note that applications can bypass this option by setting an active runtime in a writable XDG_CONFIG_DIRS location like `~/.config`. ''; default = false; example = true; }; highPriority = mkEnableOption "high priority capability for monado-service" // mkOption { default = true; }; }; config = mkIf cfg.enable { security.wrappers."monado-service" = mkIf cfg.highPriority { setuid = false; owner = "root"; group = "root"; # cap_sys_nice needed for asynchronous reprojection capabilities = "cap_sys_nice+eip"; source = lib.getExe' cfg.package "monado-service"; }; services.udev.packages = with pkgs; [ xr-hardware ]; systemd.user = { services.monado = { description = "Monado XR runtime service module"; requires = [ "monado.socket" ]; conflicts = [ "monado-dev.service" ]; unitConfig.ConditionUser = "!root"; environment = { # Default options # https://gitlab.freedesktop.org/monado/monado/-/blob/4548e1738591d0904f8db4df8ede652ece889a76/src/xrt/targets/service/monado.in.service#L12 XRT_COMPOSITOR_LOG = mkDefault "debug"; XRT_PRINT_OPTIONS = mkDefault "on"; IPC_EXIT_ON_DISCONNECT = mkDefault "off"; }; serviceConfig = { ExecStart = if cfg.highPriority then "${config.security.wrapperDir}/monado-service" else lib.getExe' cfg.package "monado-service"; Restart = "no"; }; restartTriggers = [ cfg.package ]; }; sockets.monado = { description = "Monado XR service module connection socket"; conflicts = [ "monado-dev.service" ]; unitConfig.ConditionUser = "!root"; socketConfig = { ListenStream = "%t/monado_comp_ipc"; RemoveOnStop = true; # If Monado crashes while starting up, we want to close incoming OpenXR connections FlushPending = true; }; restartTriggers = [ cfg.package ]; wantedBy = [ "sockets.target" ]; }; }; environment.systemPackages = [ cfg.package ]; environment.pathsToLink = [ "/share/openxr" ]; environment.etc."xdg/openxr/1/active_runtime.json" = mkIf cfg.defaultRuntime { source = "${cfg.package}/share/openxr/1/openxr_monado.json"; }; }; meta.maintainers = with lib.maintainers; [ Scrumplex ]; } </ins>

Related discussion:
text: The [monado] package doesn't install the udev rules generated by the [xr-hardware util] from the Monado project. Install the package and check the lack of udev rules in It was expected for the udev rules to be installted with the package. The udev rules are needed as some hmd's have some strange and specific permissions. Maybe instead of adding this to the package, monado could turn into an option like . <!-- Please @ people who are in the list of the offending package or module. If in doubt, check for whoever last touched something. --Please run and paste the result. Add a :+1: [reaction] to [issues you find important]. [reaction]: [issues you find important]: [monado]: [xr-hardware util]:
Trying packaging the udev rules similar to how . [brscan4]:
I was working on a Monado NixOS module. Perhaps I can deal with udev rules there. See