diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 4573eead98b91c54fdec1e8b0b72ab2847a96f92..bfcddb7327fd53f8e44c6839fdcc7c4e62261836 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,105 +1,27 @@
 stages:
+- build
 - devour
-- generate
-- packages
-- cache
 
-x86_64-linux:devour:
+build:
+  stage: build
+  script:
+  - nix build .#packages.$SYSTEM.$PACKAGE -L
+  parallel:
+    matrix:
+      - SYSTEM:
+         - aarch64-darwin
+         - x86_64-linux
+        PACKAGE:
+         - fourmolu
+         - haskell-language-server
+         - hlint
+
+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"
+  - nix build github:srid/devour-flake#packages.$SYSTEM.default -L --no-link --print-out-paths --override-input flake . --keep-going
+  parallel:
+    matrix:
+      - SYSTEM:
+         - aarch64-darwin
+         - x86_64-linux