diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 86720ed9644ffcc8f9dab66d25620cfd5ecd82a6..4c5bc87370c3d80ca493fd151351f784533de44a 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -231,6 +231,18 @@ ivette:
   tags:
     - docker
 
+# make_public stage is used to push the current master branch of Frama-C and
+# associated plugins from the internal frama-c group to the public pub group.
+# For that, it uses the 'frama-c to frama-c-public' deploy key. Thus, to publish
+# a new plugin (while keeping its main repository internal), you can add a new
+# target to this stage, adapting the script for MetAcsl or Frama-Clang to your
+# own plugin.
+# You must also activate the deploy key on both frama-c/my_plugin
+# and pub/my_plugin repositories (the former should be read-only, the latter
+# must provide write access to the deploy key).
+# Do not forget to trigger the target only on schedules, so that all public
+# repositories stay synchronized.
+
 make_public:
   stage: make_public
   script:
@@ -254,3 +266,15 @@ make_public_meta:
   - nix
   only:
   - schedules
+
+make_public_fclang:
+  stage: make_public
+  script:
+   - echo "$FRAMA_C_PUBLIC_SSH_PRIVATE_KEY" | nix run -f channel:nixos-19.03 coreutils --command base64 -d > nix/frama-c-public/id_ed25519
+   - nix run -f channel:nixos-19.03 coreutils --command chmod 400 nix/frama-c-public/id_ed25519
+   - GIT_SSH=$PWD/nix/frama-c-public/ssh.sh nix run -f channel:nixos-19.03 openssh --command git clone git@git.frama-c.com:frama-c/frama-clang.git nix/frama-c-public/frama-clang
+   - GIT_SSH=$PWD/nix/frama-c-public/ssh.sh nix run -f channel:nixos-19.03 openssh --command git -C nix/frama-c-public/frama-clang push git@git.frama-c.com:pub/frama-clang origin/master:refs/heads/master
+  tags:
+  - nix
+  only:
+  - schedules