diff --git a/morph/grid/production/storage001-hardware.nix b/morph/grid/production/storage001-hardware.nix
index 64f945ed0ea8f0220ce591d7d880189f9a18c59b..c6482f3e8e1c4ac6a006935fc6b8cee74ed80dfa 100644
--- a/morph/grid/production/storage001-hardware.nix
+++ b/morph/grid/production/storage001-hardware.nix
@@ -38,6 +38,6 @@
   } ];
 
 
-  nix.maxJobs = lib.mkDefault 24;
+  nix.settings.max-jobs = lib.mkDefault 24;
   powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
 }
diff --git a/morph/grid/production/storage002-hardware.nix b/morph/grid/production/storage002-hardware.nix
index 69b6946098728f2f3e30d7b7570ae88167efbee4..009fb0d769603e50096adb7fdec81ff19dff80b0 100644
--- a/morph/grid/production/storage002-hardware.nix
+++ b/morph/grid/production/storage002-hardware.nix
@@ -37,6 +37,6 @@
     randomEncryption = true;
   } ];
 
-  nix.maxJobs = lib.mkDefault 24;
+  nix.settings.max-jobs = lib.mkDefault 24;
   powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
 }
diff --git a/morph/grid/production/storage003-hardware.nix b/morph/grid/production/storage003-hardware.nix
index f4d68cac14e74d4d41c1af9c50d6e1df41b37aef..e70522d3b7c2934ca741325dd57c322d0af118e1 100644
--- a/morph/grid/production/storage003-hardware.nix
+++ b/morph/grid/production/storage003-hardware.nix
@@ -38,6 +38,6 @@
     randomEncryption = true;
   } ];
 
-  nix.maxJobs = lib.mkDefault 24;
+  nix.settings.max-jobs = lib.mkDefault 24;
   powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
 }
diff --git a/morph/grid/production/storage004-hardware.nix b/morph/grid/production/storage004-hardware.nix
index 6cc5ddc34a470cadd7dd5ddf9cb511f7988428c7..582dd73762af5530bcf2f44b8ae06c797ee135e1 100644
--- a/morph/grid/production/storage004-hardware.nix
+++ b/morph/grid/production/storage004-hardware.nix
@@ -32,6 +32,6 @@
     randomEncryption = true;
   } ];
 
-  nix.maxJobs = lib.mkDefault 32;
+  nix.settings.max-jobs = lib.mkDefault 32;
   powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
 }
diff --git a/morph/grid/production/storage005-hardware.nix b/morph/grid/production/storage005-hardware.nix
index 45f4da4bd0160feb3dd27100dfff9306c49edf05..0a9a8a2ada689fb79a680051abad6dedf54bdf09 100644
--- a/morph/grid/production/storage005-hardware.nix
+++ b/morph/grid/production/storage005-hardware.nix
@@ -37,6 +37,6 @@
     randomEncryption = true;
   } ];
 
-  nix.maxJobs = lib.mkDefault 32;
+  nix.settings.max-jobs = lib.mkDefault 32;
   powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
 }
diff --git a/morph/lib/bootstrap-configuration.nix b/morph/lib/bootstrap-configuration.nix
index f59385d1fd0ec21997d21c16be5ed5e937611acc..650c4d9c6e8567dfac75a4dfefc6df032f6a43a1 100644
--- a/morph/lib/bootstrap-configuration.nix
+++ b/morph/lib/bootstrap-configuration.nix
@@ -87,7 +87,6 @@ in
   # Configure the bootloader how we like.
   boot.loader.timeout = 10;
   boot.loader.grub.enable = true;
-  boot.loader.grub.version = 2;
   boot.loader.grub.device = "/dev/disk/by-id/${grubDeviceID}";
 
   # Let me in to do subsequent configuration.  This makes the machine wide
diff --git a/nixos/modules/100tb.nix b/nixos/modules/100tb.nix
index 12bb4b35b4c24acd28bfb9a5909809e0f9a8fdd0..997e82e18404a663bb7900e67b60859a27f653ef 100644
--- a/nixos/modules/100tb.nix
+++ b/nixos/modules/100tb.nix
@@ -103,7 +103,6 @@ in {
   # harder to deploy in the bootstrap environment.
   config =
   { boot.loader.grub.enable = true;
-    boot.loader.grub.version = 2;
     boot.loader.grub.device = if cfg.grubDeviceID == "nodev"  then "nodev" else "/dev/disk/by-id/${cfg.grubDeviceID}";
     boot.loader.timeout = 10;
     networking.firewall.enable = false;
diff --git a/nixos/modules/monitoring/exporters/node.nix b/nixos/modules/monitoring/exporters/node.nix
index 4a9e41b5c840852323aaf952859e79b4c878a870..f48c70a1aca88cdfd43f37201b7c42b1807ed3b2 100644
--- a/nixos/modules/monitoring/exporters/node.nix
+++ b/nixos/modules/monitoring/exporters/node.nix
@@ -69,7 +69,7 @@ in {
     ] ++ (
       optionals (config.services.nfs.server.enable) [ "nfsd" ]
     ) ++ (
-      optionals ("" != config.boot.initrd.services.swraid.mdadmConf) [ "mdadm" ]
+      optionals ("" != config.boot.swraid.mdadmConf) [ "mdadm" ]
     ) ++ (
       optionals ({} != config.networking.bonds) [ "bonding" ]
     ) ++ (
diff --git a/nixos/modules/monitoring/server/grafana.nix b/nixos/modules/monitoring/server/grafana.nix
index 4da836c10975d56438fee3961912da20b4788c7b..5299829ccc7fec081e9ccb4f0e41c66daa8a0251 100644
--- a/nixos/modules/monitoring/server/grafana.nix
+++ b/nixos/modules/monitoring/server/grafana.nix
@@ -167,8 +167,9 @@ in {
           name = "provisioned";
           options.path = ./grafana-dashboards;
         }];
-        # See https://grafana.com/docs/grafana/latest/administration/provisioning/#example-alert-notification-channels-config-file
-        notifiers = [ ] ++ (lib.optionals (cfg.enableSlackAlert) [{
+        # See https://grafana.com/docs/grafana/latest/alerting/set-up/provision-alerting-resources/file-provisioning/#provision-contact-points
+        alerting.contactPoints.settings.contactPoints =
+        [ ] ++ (lib.optionals (cfg.enableSlackAlert) [{
           uid = "slack-notifier-1";
           name = "Slack";
           type = "slack";
diff --git a/nixos/modules/monitoring/server/loki.nix b/nixos/modules/monitoring/server/loki.nix
index f73720a5761ebdcbf3c47db9291ac76eb22ca1de..e4c009113f8cd6de6c8ada68f9242673e0132ef7 100644
--- a/nixos/modules/monitoring/server/loki.nix
+++ b/nixos/modules/monitoring/server/loki.nix
@@ -21,6 +21,17 @@ in {
       {
         auth_enabled = false;
 
+        common = {
+          ring = {
+            kvstore = {
+              store = "inmemory";
+            };
+          };
+          instance_addr = "127.0.0.1";
+          replication_factor = 1;
+          path_prefix = "/var/lib/loki";
+        };
+
         server = {
           http_listen_port = 3100;
           grpc_listen_port = 9095; # unused, but no option to turn it off.
@@ -29,12 +40,6 @@ in {
 
         ingester = {
           lifecycler = {
-            ring = {
-              kvstore = {
-                store = "inmemory";
-              };
-              replication_factor = 1;
-            };
             final_sleep = "0s";
           };
           chunk_target_size = 1536000; # As per https://grafana.com/docs/loki/v2.2.1/best-practices/
@@ -44,25 +49,16 @@ in {
         schema_config = {
           configs = [{
             from = "2020-12-26";
-            store = "boltdb";
+            store = "boltdb-shipper";
             object_store = "filesystem";
             schema = "v11";
             index = {
               prefix = "index_";
+              period = "24h";
             };
           }];
         };
 
-        storage_config = {
-          boltdb = {
-            directory = "/var/lib/loki/index";
-          };
-
-          filesystem = {
-            directory = "/var/lib/loki/chunks";
-          };
-        };
-
         table_manager = {
           retention_deletes_enabled = true;
           retention_period = logRetention;
diff --git a/nixos/modules/ssh.nix b/nixos/modules/ssh.nix
index 90fd34b002c607965038a574334fb0fc370d146c..8e0424506f1cb2bf3367fb895a74ebde36e99897 100644
--- a/nixos/modules/ssh.nix
+++ b/nixos/modules/ssh.nix
@@ -26,8 +26,8 @@
       enable = true;
 
       # We only allow key-based authentication.
-      kbdInteractiveAuthentication = false;
-      passwordAuthentication = false;
+      settings.KbdInteractiveAuthentication = false;
+      settings.PasswordAuthentication = false;
 
       extraConfig = ''
         # Possibly this is superfluous considering we don't allow
diff --git a/nixos/pkgs/leasereport/repo.json b/nixos/pkgs/leasereport/repo.json
index fc2f8947264a08f3234e8a9372fb1b3da4c79feb..bd15396428d43a44077002354cddc12b808b720d 100644
--- a/nixos/pkgs/leasereport/repo.json
+++ b/nixos/pkgs/leasereport/repo.json
@@ -1,9 +1,9 @@
-{
-  "owner": "privatestorage",
-  "repo": "LeaseReport",
-  "branch": "main",
-  "domain": "whetstone.private.storage",
-  "rev": "3739ffde14e698f56118a444e6946edb736b6983",
-  "outputHashAlgo": "sha512",
-  "outputHash": "37b4hrhjghvza0bqvmngcdapqfjjjiv0gx90y0i4wvj72nf1xsh7g2kwpvjm4prpb5s7fxb50x971xfw4sqpwwsk2zdll4nbl5764ij"
-}
+{
+  "owner": "privatestorage",
+  "repo": "LeaseReport",
+  "branch": "main",
+  "domain": "whetstone.private.storage",
+  "rev": "d5e37376f5547862287b31252fa83486ac999231",
+  "outputHashAlgo": "sha512",
+  "outputHash": "3x5plpiagcra2zn9brpsj452bwmpvf1skdff9cxprw807ijyfkav3qa3zq041w00ppc7vk5jcyng20rwyrncrbdgd2d5gjjvr53y3q6"
+}
\ No newline at end of file
diff --git a/nixpkgs.json b/nixpkgs.json
index e6f18dacda7288ab93aaf785cb0e59cdf8ac9973..ba0ac988eff8de6113851f8cff29f88e4fa60354 100644
--- a/nixpkgs.json
+++ b/nixpkgs.json
@@ -1,5 +1,5 @@
 {
   "name": "source",
-  "url": "https://releases.nixos.org/nixos/22.11/nixos-22.11.4773.ea4c80b39be4/nixexprs.tar.xz",
-  "sha256": "1j7h75a9hwkkm97jicky5rhvzkdwxsv5v46473rl6agvq2sj97y1"
+  "url": "https://releases.nixos.org/nixos/23.11/nixos-23.11.2962.b8dd8be3c790/nixexprs.tar.xz",
+  "sha256": "053dwx7smszz3a0khbm6zvf9pvy5xz1ifdk9jx6gz5cmwjab0gmp"
 }
\ No newline at end of file
diff --git a/tools/update-nixpkgs b/tools/update-nixpkgs
index 58dedd9c0894b074f41bfa7b2a1b7c3ec1812616..f20acdb1fefbd63ee8a9255d9eae633f2b998b1f 100755
--- a/tools/update-nixpkgs
+++ b/tools/update-nixpkgs
@@ -10,7 +10,7 @@ from ps_tools import get_url_hash
 # We pass this to builtins.fetchTarball which only supports sha256
 HASH_TYPE = "sha256"
 
-DEFAULT_CHANNEL = "nixos-22.11"
+DEFAULT_CHANNEL = "nixos-23.11"
 CHANNEL_URL_TEMPLATE = "https://channels.nixos.org/{channel}/nixexprs.tar.xz"