diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ef672cef928e516bfebf4b8d14ed493448ef1f7f..49e71fe885bf0d51bcdd156ffa4774e04792357c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,6 +3,8 @@
 
 stages:
   - tests
+  - distrib
+  - compatibility
   - prepare-release
   - release
 
@@ -20,14 +22,26 @@ variables:
   OCAML: "4.14"
 
 ################################################################################
-### TESTS
+### ONLY/EXCEPT TEMPLATES
 
-check-headers:
-  stage: prepare-release
-  variables:
-    CI_MODE: "check-headers"
-  script:
-    - ./nix/ci.sh
+.build_template: &manual_template
+  except:
+    refs:
+      - schedules
+  when: manual
+
+.build_template: &when_schedules
+  only:
+    refs:
+      - schedules
+
+.build_template: &when_release
+  only:
+    variables:
+      - $RELEASE == "yes"
+
+################################################################################
+### TESTS
 
 .build_template: &tests_template
   stage: tests
@@ -42,26 +56,51 @@ tests-auto:
 
 tests-manual:
   <<: *tests_template
+  <<: *manual_template
   parallel:
     matrix:
       - LLVM_VERSION: [ "13", "14", "15", "16", "17" ]
-  when: manual
+
+################################################################################
+### DISTRIB
+
+check-headers:
+  stage: distrib
+  variables:
+    CI_MODE: "check-headers"
+  script:
+    - ./nix/ci.sh
 
 ################################################################################
 ### CHECK OPAM PACKAGE STATUS
 
-check-opam:
+.build_template: &opam_template
   tags: [docker]
   image: "ocaml/opam:ubuntu-lts-ocaml-$OCAML"
-  stage: prepare-release
+  stage: compatibility
   variables:
     CI_MODE: "check-opam"
     EXTRA_PACKAGES: "clang libclang-dev libclang-cpp-dev llvm-dev"
   script:
     - ./nix/ci.sh
-  when: manual
+
+check-opam:
+  <<: *opam_template
+  <<: *manual_template
+
+check-opam-nightly:
+  <<: *opam_template
+  <<: *when_schedules
+
+check-opam-release:
+  <<: *opam_template
+  <<: *when_release
+
+################################################################################
+### PRE-RELEASE
 
 make-manual:
+  <<: *when_release
   stage: prepare-release
   variables:
     OUT: "manual"
@@ -73,6 +112,7 @@ make-manual:
     - ./nix/ci.sh
 
 check-versions:
+  <<: *when_release
   stage: prepare-release
   variables:
     CI_MODE: "check-versions"
@@ -83,12 +123,8 @@ check-versions:
 ### RELEASE
 
 release:
+  <<: *when_release
   stage: release
-  needs:
-    - check-opam
-    - make-manual
-  dependencies:
-    - make-manual
   variables:
     CI_MODE: "release"
     PLUGIN_FULL_NAME: "Frama-Clang"
@@ -99,4 +135,3 @@ release:
     - ls -la
     - ls manual
     - ./nix/ci.sh
-  when: manual