diff --git a/.cachix.dhall b/.cachix.dhall
new file mode 100644
index 0000000000000000000000000000000000000000..be21b7ae3b912cd83ea146557b55aaec644ec4c7
--- /dev/null
+++ b/.cachix.dhall
@@ -0,0 +1,34 @@
+let Prelude =
+        env:DHALL_PRELUDE
+      ? https://raw.githubusercontent.com/dhall-lang/dhall-lang/v20.1.0/Prelude/package.dhall
+          sha256:26b0ef498663d269e4dc6a82b0ee289ec565d683ef4c00d0ebdd25333a5a3c98
+
+let H =
+      https://gitlab.horizon-haskell.net/dhall/horizon-spec/-/raw/0.6/dhall/package.dhall
+        sha256:9a80164572526dc5350f105c8db0790fdf36634629b4cf03402ba14fd173d121
+
+let toStep
+    : Text → Text
+    = λ(x : Text) →
+        "nix build --json .#${x} | jq -r '.[].outputs | to_entries[].value' | cachix push horizon"
+
+let input =
+      Prelude.Map.keys
+        Text
+        H.HaskellPackage.Type
+        ( merge
+            { MakePackageSet =
+                λ(x : H.PackageSetExportSettings) → x.packageSet.packages
+            , MakeOverlay = λ(x : H.OverlayExportSettings) → x.overlay.packages
+            }
+            ./horizon.dhall
+        )
+
+let packages = Prelude.List.map Text Text toStep (input : List Text)
+
+in  Prelude.List.fold
+      Text
+      packages
+      Text
+      (λ(x : Text) → λ(y : Text) → x ++ "\n" ++ y)
+      ""
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 926dac62bfb764ebbc04b5bb19dd078b5bd875c8..4f8c637c465b8fa248bd0e1e25e629ab55977e3e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,7 @@
 stages:
 - generate
 - check
+- cache
 
 generate-flake-ci:
   stage: generate
@@ -16,3 +17,10 @@ flake-ci:
       - artifact: flake-ci.yml
         job: generate-flake-ci
     strategy: depend
+
+cachix:
+  stage: cache
+  only:
+    refs:
+    - master
+  script: dhall --file .cachix.dhall | dhall text | bash