diff --git a/modules/default.nix b/modules/default.nix
index a95870b50..93ce01ad8 100644
--- a/modules/default.nix
+++ b/modules/default.nix
@@ -25,6 +25,7 @@ let
./services/keepassx.nix
./services/network-manager-applet.nix
./services/random-background.nix
+ ./services/redshift.nix
./services/taffybar.nix
./services/tahoe-lafs.nix
./services/udiskie.nix
diff --git a/modules/services/redshift.nix b/modules/services/redshift.nix
new file mode 100644
index 000000000..f89786134
--- /dev/null
+++ b/modules/services/redshift.nix
@@ -0,0 +1,124 @@
+# Adapted from Nixpkgs.
+
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+ cfg = config.services.redshift;
+
+in {
+
+ options.services.redshift = {
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ example = true;
+ description = ''
+ Enable Redshift to change your screen's colour temperature depending on
+ the time of day.
+ '';
+ };
+
+ latitude = mkOption {
+ type = types.str;
+ description = ''
+ Your current latitude, between
+ -90.0 and 90.0.
+ '';
+ };
+
+ longitude = mkOption {
+ type = types.str;
+ description = ''
+ Your current longitude, between
+ between -180.0 and 180.0.
+ '';
+ };
+
+ temperature = {
+ day = mkOption {
+ type = types.int;
+ default = 5500;
+ description = ''
+ Colour temperature to use during the day, between
+ 1000 and 25000 K.
+ '';
+ };
+ night = mkOption {
+ type = types.int;
+ default = 3700;
+ description = ''
+ Colour temperature to use at night, between
+ 1000 and 25000 K.
+ '';
+ };
+ };
+
+ brightness = {
+ day = mkOption {
+ type = types.str;
+ default = "1";
+ description = ''
+ Screen brightness to apply during the day,
+ between 0.1 and 1.0.
+ '';
+ };
+ night = mkOption {
+ type = types.str;
+ default = "1";
+ description = ''
+ Screen brightness to apply during the night,
+ between 0.1 and 1.0.
+ '';
+ };
+ };
+
+ package = mkOption {
+ type = types.package;
+ default = pkgs.redshift;
+ defaultText = "pkgs.redshift";
+ description = ''
+ redshift derivation to use.
+ '';
+ };
+
+ extraOptions = mkOption {
+ type = types.listOf types.str;
+ default = [];
+ example = [ "-v" "-m randr" ];
+ description = ''
+ Additional command-line arguments to pass to
+ redshift.
+ '';
+ };
+ };
+
+ config = mkIf cfg.enable {
+ systemd.user.services.redshift = {
+ Unit = {
+ Description = "Redshift colour temperature adjuster";
+ };
+
+ Install = {
+ WantedBy = [ "graphical-session.target" ];
+ };
+
+ Service = {
+ ExecStart =
+ let
+ args = [
+ "-l ${cfg.latitude}:${cfg.longitude}"
+ "-t ${toString cfg.temperature.day}:${toString cfg.temperature.night}"
+ "-b ${toString cfg.brightness.day}:${toString cfg.brightness.night}"
+ ] ++ cfg.extraOptions;
+ in
+ "${cfg.package}/bin/redshift ${concatStringsSep " " args}";
+ RestartSec = 3;
+ Restart = "always";
+ };
+ };
+ };
+
+}