diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5bdd53ef7d073aba6d317616bd76e6aafbb66bd1..4573eead98b91c54fdec1e8b0b72ab2847a96f92 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,2 +1,105 @@
-include:
-- remote: 'https://gitlab.horizon-haskell.net/gitlab/ci-templates/raw/master/default.yml'
+stages:
+- devour
+- generate
+- packages
+- cache
+
+x86_64-linux:devour:
+  stage: devour
+  script:
+  - nix build github:srid/devour-flake#packages.x86_64-linux.default -L --no-link --print-out-paths --override-input flake . --keep-going
+
+aarch64-darwin:devour:
+  stage: devour
+  script:
+  - nix build github:srid/devour-flake#packages.aarch64-darwin.default -L --no-link --print-out-paths --override-input flake . --keep-going
+
+aarch64-linux:devour:
+  stage: devour
+  script:
+  - nix build github:srid/devour-flake#packages.aarch64-linux.default -L --no-link --print-out-paths --override-input flake . --keep-going
+
+
+x86_64-linux:generate:
+  stage: generate
+  needs: ["x86_64-linux:devour"]
+  script:
+  - nix run "git+https://gitlab.horizon-haskell.net/haskell/flake-to-gitlab-ci?ref=refs/tags/0.2.5.0" > flake-ci.yml
+  when: on_failure
+  artifacts:
+    paths:
+      - flake-ci.yml
+
+x86_64-linux:packages:
+  stage: packages
+  needs: ["x86_64-linux:devour", "x86_64-linux:generate"]
+  when: on_failure
+  trigger:
+    include:
+      - artifact: flake-ci.yml
+        job: x86_64-linux:generate
+    strategy: depend
+
+
+aarch64-darwin:generate:
+  stage: generate
+  needs: ["aarch64-darwin:devour"]
+  script:
+  - nix run "git+https://gitlab.horizon-haskell.net/haskell/flake-to-gitlab-ci?ref=refs/tags/0.2.5.0" -- aarch64-darwin > flake-ci.yml
+  when: on_failure
+  artifacts:
+    paths:
+      - flake-ci.yml
+
+aarch64-darwin:packages:
+  stage: packages
+  needs: ["aarch64-darwin:devour", "aarch64-darwin:generate"]
+  when: on_failure
+  trigger:
+    include:
+      - artifact: flake-ci.yml
+        job: aarch64-darwin:generate
+    strategy: depend
+
+
+aarch64-linux:generate:
+  stage: generate
+  needs: ["aarch64-linux:devour"]
+  script:
+  - nix run "git+https://gitlab.horizon-haskell.net/haskell/flake-to-gitlab-ci?ref=refs/tags/0.2.5.0" -- aarch64-linux > flake-ci.yml
+  when: on_failure
+  artifacts:
+    paths:
+      - flake-ci.yml
+
+aarch64-linux:packages:
+  stage: packages
+  needs: ["aarch64-linux:devour", "aarch64-linux:generate"]
+  when: on_failure
+  trigger:
+    include:
+      - artifact: flake-ci.yml
+        job: aarch64-linux:generate
+    strategy: depend
+
+
+x86_64-linux:cachix:
+  stage: cache
+  rules:
+    - if: $CI_COMMIT_REF_PROTECTED == "true"
+  script:
+  - nix-shell -p cachix --command "nix build github:srid/devour-flake -L --no-link --print-out-paths --override-input flake . | xargs cat | cachix push horizon"
+
+aarch64-darwin:cachix:
+  stage: cache
+  rules:
+    - if: $CI_COMMIT_REF_PROTECTED == "true"
+  script:
+  - nix-shell -p cachix --command "nix build github:srid/devour-flake#packages.aarch64-darwin.default -L --no-link --print-out-paths --override-input flake . | xargs cat | cachix push horizon"
+
+aarch64-linux:cachix:
+  stage: cache
+  rules:
+    - if: $CI_COMMIT_REF_PROTECTED == "true"
+  script:
+  - nix-shell -p cachix --command "nix build github:srid/devour-flake#packages.aarch64-linux.default -L --no-link --print-out-paths --override-input flake . | xargs cat | cachix push horizon"