diff --git a/.gitlab/rel_eng/default.nix b/.gitlab/rel_eng/default.nix
index 4cd6e98499b2e82a7e69da0ba68406198142ab6d..a7515ae2f8ffebffb80e80b0269329130f03a53c 100644
--- a/.gitlab/rel_eng/default.nix
+++ b/.gitlab/rel_eng/default.nix
@@ -27,6 +27,15 @@ let
     buildCommand = ''
       mkdir -p $out/bin
 
+      makeWrapper ${./recompress-all} $out/bin/recompress-all \
+        --prefix PATH : ${gnumake}/bin \
+        --prefix PATH : ${gnutar}/bin \
+        --prefix PATH : ${lzip}/bin \
+        --prefix PATH : ${bzip2}/bin \
+        --prefix PATH : ${gzip}/bin \
+        --prefix PATH : ${xz}/bin \
+        --prefix PATH : ${zip}/bin
+
       makeWrapper ${./upload.sh} $out/bin/upload.sh \
         --prefix PATH : ${moreutils}/bin \
         --prefix PATH : ${lftp}/bin \
@@ -35,8 +44,8 @@ let
         --prefix PATH : ${s3cmd}/bin \
         --prefix PATH : ${gnupg}/bin \
         --prefix PATH : ${pinentry}/bin \
-        --prefix PATH : ${parallel}/bin \
         --prefix PATH : ${python3}/bin \
+        --prefix PATH : $out/bin \
         --set ENTER_FHS_ENV ${bindistPrepEnv}/bin/enter-fhs \
         --set BASH ${bash}/bin/bash
 
diff --git a/.gitlab/rel_eng/recompress-all b/.gitlab/rel_eng/recompress-all
new file mode 100755
index 0000000000000000000000000000000000000000..2eea72d49f2a4319a2678c87edd5caccaa0b7ceb
--- /dev/null
+++ b/.gitlab/rel_eng/recompress-all
@@ -0,0 +1,29 @@
+#!/usr/bin/env -S make -f
+
+MAKEFLAGS += --no-builtin-rules
+MAKEFLAGS += --no-builtin-variables
+
+usage :
+	echo "recompress [dest files]"
+	exit 1
+
+%.gz : %.xz
+	echo "[xz->gz] $< to $@..."
+	xz -c $< | gzip -c > $@
+
+%.bz2 : %.xz
+	echo "[xz->bz2] $< to $@..."
+	xz -c $< | bzip2 -c > $@
+
+%.lz : %.xz
+	echo "[xz->lz] $< to $@..."
+	xz -c $< | lzip -c > $@
+
+%.zip : %.tar.xz
+	echo "[tarxz->zip] $< to $@..."
+	tmp="$(mktemp tmp.XXX)" && \
+		tar -C "$$tmp" -xf $< && \
+		cd "$$tmp" && \
+		zip -9 -r $@ * && \
+		rm -R "$$tmp"
+
diff --git a/.gitlab/rel_eng/upload.sh b/.gitlab/rel_eng/upload.sh
index 9456ca22a392d79df6ebd15e224a340bbbb3d1ca..64e3b307fc07a10031faa611bf792cce075c420d 100755
--- a/.gitlab/rel_eng/upload.sh
+++ b/.gitlab/rel_eng/upload.sh
@@ -193,29 +193,21 @@ function prepare_docs() {
 
 function recompress() {
     set -Eeuo pipefail
-    combine <(basename -s .xz *.xz) not <(basename -s .lz *.lz) | \
-        parallel 'echo "Recompressing {}.xz to {}.lz"; unxz -c {}.xz | lzip - -o {}.lz'
-
-    for darwin_bindist in $(ls ghc-*-darwin.tar.xz); do
-        local dest="$(basename $darwin_bindist .xz).bz2"
-        if [[ ! -f "$dest" ]]; then
-            echo "Recompressing Darwin bindist to bzip2..."
-            unxz -c "$darwin_bindist" | bzip2 > "$dest"
-        fi
+    needed=()
+
+    for i in ghc-*.tar.xz; do
+        needed+=( "$(basename $i .xz).gz" )
     done
 
-    for windows_bindist in $(ls ghc-*-mingw32*.tar.xz); do
-      local tmp="$(mktemp -d tmp.XXX)"
-      local dest="$(realpath $(basename $windows_bindist .tar.xz).zip)"
-      echo $dest
-      if [[ ! -f "$dest" ]]; then
-          echo "Recompressing Windows bindist to zip..."
-          tar -C "$tmp" -xf "$windows_bindist"
-          ls $tmp
-          (cd "$tmp"; zip -9 -r "$dest" *)
-      fi
-      rm -R "$tmp"
+    for i in ghc-*-darwin.tar.xz; do
+        needed+=( "$(basename $i .xz).bz2" )
     done
+
+    for i in ghc-*-mingw32.tar.xz; do
+        needed+=( "$(basename $i .tar.xz).zip" )
+    done
+
+    recompress-all -l ${needed[@]}
 }
 
 function upload_docs() {