diff --git a/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml b/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml
index a6c3fdd1ed23..645b4ac55741 100644
--- a/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml
+++ b/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml
@@ -145,6 +145,15 @@
services.maddy.
+
+
+ K40-Whisperer,
+ a program to control cheap Chinese laser cutters. Available as
+ programs.k40-whisperer.enable.
+ Users must add themselves to the k40 group
+ to be able to access the device.
+
+
mtr-exporter,
diff --git a/nixos/doc/manual/release-notes/rl-2205.section.md b/nixos/doc/manual/release-notes/rl-2205.section.md
index d55a45f8b2b1..542fb24abbdc 100644
--- a/nixos/doc/manual/release-notes/rl-2205.section.md
+++ b/nixos/doc/manual/release-notes/rl-2205.section.md
@@ -45,6 +45,8 @@ In addition to numerous new and upgraded packages, this release has the followin
- [maddy](https://maddy.email), a composable all-in-one mail server. Available as [services.maddy](options.html#opt-services.maddy.enable).
+- [K40-Whisperer](https://www.scorchworks.com/K40whisperer/k40whisperer.html), a program to control cheap Chinese laser cutters. Available as [programs.k40-whisperer.enable](options.html#opt-programs.k4-whisperer.enable). Users must add themselves to the `k40` group to be able to access the device.
+
- [mtr-exporter](https://github.com/mgumz/mtr-exporter), a Prometheus exporter for mtr metrics. Available as [services.mtr-exporter](options.html#opt-services.mtr-exporter.enable).
- [tetrd](https://tetrd.app), share your internet connection from your device to your PC and vice versa through a USB cable. Available at [services.tetrd](#opt-services.tetrd.enable).
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index 351fcf7cdbb7..28974c17ec71 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -167,6 +167,7 @@
./programs/iftop.nix
./programs/iotop.nix
./programs/java.nix
+ ./programs/k40-whisperer.nix
./programs/kdeconnect.nix
./programs/kbdlight.nix
./programs/less.nix
diff --git a/nixos/modules/programs/k40-whisperer.nix b/nixos/modules/programs/k40-whisperer.nix
new file mode 100644
index 000000000000..3163e45f57e4
--- /dev/null
+++ b/nixos/modules/programs/k40-whisperer.nix
@@ -0,0 +1,40 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.programs.k40-whisperer;
+ pkg = cfg.package.override {
+ udevGroup = cfg.group;
+ };
+in
+{
+ options.programs.k40-whisperer = {
+ enable = mkEnableOption "K40-Whisperer";
+
+ group = mkOption {
+ type = types.str;
+ description = ''
+ Group assigned to the device when connected.
+ '';
+ default = "k40";
+ };
+
+ package = mkOption {
+ type = types.package;
+ default = pkgs.k40-whisperer;
+ defaultText = literalExpression "pkgs.k40-whisperer";
+ example = literalExpression "pkgs.k40-whisperer";
+ description = ''
+ K40 Whisperer package to use.
+ '';
+ };
+ };
+
+ config = mkIf cfg.enable {
+ users.groups.${cfg.group} = {};
+
+ environment.systemPackages = [ pkg ];
+ services.udev.packages = [ pkg ];
+ };
+}