diff --git a/.cachix.dhall b/.cachix.dhall
new file mode 100644
index 0000000000000000000000000000000000000000..29ecf47463ac93a093120e31547d5930ff02eaf2
--- /dev/null
+++ b/.cachix.dhall
@@ -0,0 +1,40 @@
+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 --accept-flake-config --json .#${x} | jq -r '.[].outputs | to_entries[].value' | cachix push horizon"
+
+let toEchoStep
+    : Text → Text
+    = λ(x : Text) → "echo \"${toStep x}\""
+
+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 toEchoStep (input : List Text)
+
+in      "("
+    ++  Prelude.List.fold
+          Text
+          packages
+          Text
+          (λ(x : Text) → λ(y : Text) → x ++ ";" ++ y)
+          ""
+    ++  ") | parallel -j 16"
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 926dac62bfb764ebbc04b5bb19dd078b5bd875c8..5cb6ab10bc310602eca4ca4a07dce5198a7f5be5 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,11 @@ flake-ci:
       - artifact: flake-ci.yml
         job: generate-flake-ci
     strategy: depend
+
+cachix:
+  stage: cache
+  only:
+    refs:
+    - master
+    - cachix
+  script: nix-shell -p jq cachix parallel --command 'dhall --file .cachix.dhall | dhall text | bash'
diff --git a/flake.nix b/flake.nix
index c971800100c8183a4ddda7a16ce5e149e73e6842..463cdc4b0b34d782cf11a949a0c36dbbaa7b3e3e 100644
--- a/flake.nix
+++ b/flake.nix
@@ -2,6 +2,11 @@
 
   description = "Horizon Haskell Platform";
 
+  nixConfig = {
+    extra-substituters = "https://horizon.cachix.org";
+    extra-trusted-public-keys = "horizon.cachix.org-1:MeEEDRhRZTgv/FFGCv3479/dmJDfJ82G6kfUDxMSAw0=";
+  };
+
   inputs = {
     get-flake.url = "github:ursi/get-flake";
     flake-parts.url = "github:hercules-ci/flake-parts";