diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b91f7d5f175a32a49a5ed0788a87146d9b86c3f3..43e52dadabad4a646f51d6daae88a8c949a7fd36 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -20,6 +20,23 @@ unit-tests:
   script:
     - "nix-shell --run 'nix-build nixos/unit-tests.nix' && cat result"
 
+morph-builds:
+  stage: "test"
+  environment:
+    # CACHIX_AUTH_TOKEN, which lets us push to cachix, is supplied by GitLab
+    # thanks to project-level configuration.
+    CACHIX_NAME: "privatestorage-opensource"
+
+  script:
+    - |
+      nix-env -iA nixpkgs.cachix nixpkgs.bash
+      cachix use privatestorage-opensource
+      nix path-info --all > /tmp/store-path-pre-build
+      for grid in morph/grid/*/grid.nix; do
+          morph build "${grid}"
+      done
+      bash -c "comm -13 <(sort /tmp/store-path-pre-build | grep -v '\.drv$') <(nix path-info --all | grep -v '\.drv$' | sort) | cachix push $CACHIX_NAME"
+
 vulnerability-scan:
   stage: "test"
   script: