diff --git a/nixos/modules/services/computing/boinc/client.nix b/nixos/modules/services/computing/boinc/client.nix
new file mode 100644
index 000000000000..5e73638913de
--- /dev/null
+++ b/nixos/modules/services/computing/boinc/client.nix
@@ -0,0 +1,88 @@
+{config, lib, pkgs, ...}:
+
+with lib;
+
+let
+ cfg = config.services.boinc;
+ allowRemoteGuiRpcFlag = optionalString cfg.allowRemoteGuiRpc "--allow_remote_gui_rpc";
+
+in
+ {
+ options.services.boinc = {
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ example = true;
+ description = ''
+ Whether to enable the BOINC distributed computing client. If this
+ option is set to true, the boinc_client daemon will be run as a
+ background service. The boinccmd command can be used to control the
+ daemon.
+ '';
+ };
+
+ package = mkOption {
+ type = types.package;
+ default = pkgs.boinc;
+ defaultText = "pkgs.boinc";
+ description = ''
+ Which BOINC package to use.
+ '';
+ };
+
+ dataDir = mkOption {
+ type = types.path;
+ default = "/var/lib/boinc";
+ description = ''
+ The directory in which to store BOINC's configuration and data files.
+ '';
+ };
+
+ allowRemoteGuiRpc = mkOption {
+ type = types.bool;
+ default = false;
+ example = true;
+ description = ''
+ If set to true, any remote host can connect to and control this BOINC
+ client (subject to password authentication). If instead set to false,
+ only the hosts listed in dataDir/remote_hosts.cfg will be allowed to
+ connect.
+
+ See also:
+ '';
+ };
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = [cfg.package];
+
+ users.users.boinc = {
+ createHome = false;
+ description = "BOINC Client";
+ home = cfg.dataDir;
+ isSystemUser = true;
+ };
+
+ systemd.services.boinc = {
+ description = "BOINC Client";
+ after = ["network.target" "local-fs.target"];
+ wantedBy = ["multi-user.target"];
+ preStart = ''
+ mkdir -p ${cfg.dataDir}
+ chown boinc ${cfg.dataDir}
+ '';
+ script = ''
+ ${cfg.package}/bin/boinc_client --dir ${cfg.dataDir} --redirectio ${allowRemoteGuiRpcFlag}
+ '';
+ serviceConfig = {
+ PermissionsStartOnly = true; # preStart must be run as root
+ User = "boinc";
+ Nice = 10;
+ };
+ };
+ };
+
+ meta = {
+ maintainers = with lib.maintainers; [kierdavis];
+ };
+ }