Change:
<ins> { config, lib, pkgs, ... }: with lib; let cfg = config.hardware.opentabletdriver; in { options = { hardware.opentabletdriver = { enable = mkOption { default = false; type = types.bool; description = '' Enable OpenTabletDriver udev rules, user service and blacklist kernel modules known to conflict with OpenTabletDriver. ''; }; blacklistedKernelModules = mkOption { type = types.listOf types.str; default = [ "hid-uclogic" "wacom" ]; description = '' Blacklist of kernel modules known to conflict with OpenTabletDriver. ''; }; daemon = { enable = mkOption { default = true; type = types.bool; description = '' Whether to start OpenTabletDriver daemon as a systemd user service. ''; }; }; }; }; config = mkIf cfg.enable { environment.systemPackages = with pkgs; [ opentabletdriver ]; services.udev.packages = with pkgs; [ opentabletdriver ]; boot.blacklistedKernelModules = cfg.blacklistedKernelModules; systemd.user.services.opentabletdriver = with pkgs; mkIf cfg.daemon.enable { description = "Open source, cross-platform, user-mode tablet driver"; wantedBy = [ "graphical-session.target" ]; partOf = [ "graphical-session.target" ]; serviceConfig = { Type = "simple"; ExecStart = "${opentabletdriver}/bin/otd-daemon -c ${opentabletdriver}/lib/OpenTabletDriver/Configurations"; Restart = "on-failure"; }; }; }; } </ins>

Discussion:
Project description OpenTabletDriver is an open source, cross platform, user mode tablet driver. The goal of OpenTabletDriver is to be cross platform as possible with the highest compatibility in an easily configurable graphical user interface. It supports multiple tablets that are badly supported in Linux. Even for tablets already supported by other means (i.e.: or ), OpenTabletDriver offers a graphical interface, plugins and more customization. List of supported tablets: Metadata homepage URL: source URL: license: LGPLv3 platforms: Linux, Darwin
I tried to create a package but I can't wrap my head on how to build a .NET 5 application. Trying to follow just made me more and more confused. If it helps, here it is the from Arch Linux:
I have a older OTD package in my nix overlay , I just currently don't have the time to mess with it, I have a WIP .NET 5 package on my local machine that I could upload to a gist if needed
This would be great, since I am stuck on trying to compile thanks to some .NET 5 issue.
I tested your recipe in overlay and seems to work well. Still need to figure how to fix some of the following issues, though: Generate the file automatically, so we can update this package without updating every dependency by hand Wrap the launcher script so the daemon is launched automatically (as it happens in the Debian package I think?). Or as an alternative, just start this as a systemd service (as the AUR package does) Generate the udev rules and copy it to the appropriate place. Alternatively we can just extract the udev file from the .deb package, but this involves some manual operation Except for the first issue, for the other ones I think maybe it would be better to have a module (for example, ) so we could automatically enable the systemd service, set the udev rules and add the GUI to the . This seems the cleanest way to fix those issues.
have an initial build of OpenTabletDriver 0.4.2. It almost works, but needs some manual setup: Start the manually before opening . Alternatively, you can start the daemon as an systemd user service, something like this: For now, you need to add manually to your .

This can be fixed if we add a module, that once enabled do this automatically (and it may also create a systemd user service, fixing the first issue too) Now, while it builds and kinda works, I can't seem to make it detect my tablet (Huion HS64). I thought something was wrong with the udev rules but looking at the udev logs it seems that the rules are being applied correctly. The connection between the GUI and daemon itself seems fine, since it does redirect the logs to the daemon. So now I am stuck. Do you have some idea on how to solve the issue above?
Got the package to work with the help of OpenTabletDriver's Discord. It was missing the .