diff --git a/download-experimental.sh b/download-experimental.sh
index a26016e8d9067c0f6218f119ab4a3ec7ab4d36c4..6b2a1a3df1971bca055238867f9861a64935350d 100755
--- a/download-experimental.sh
+++ b/download-experimental.sh
@@ -4,10 +4,11 @@ set -eu -o pipefail
 
 ARCHIVE_DIR="/home/www/html/firmware/gluon/archive"
 EXPERIMENTAL_LINK="/home/www/html/firmware/gluon/experimental"
+PIPELINE_ID_FILE="/home/www/html/firmware/gluon/.last-downloaded-pipeline-id"
 MYDIR=$(readlink -f $(dirname "$0"))
 
 cd "$ARCHIVE_DIR"
-downloaded_version=$("$MYDIR/download-latest-firmware-build.py")
+downloaded_version=$("$MYDIR/download-latest-firmware-build.py" --pipeline-id-file "$PIPELINE_ID_FILE")
 downloaded_version_abs=$(readlink -f "$downloaded_version")
 
 rm "$EXPERIMENTAL_LINK"
diff --git a/download-latest-firmware-build.py b/download-latest-firmware-build.py
index 22335fdc2216aa3d5b3adfda97d5e7ddad62d685..c56a8ddbabada6e2683dee70b0ac5d74d9cf2cc7 100755
--- a/download-latest-firmware-build.py
+++ b/download-latest-firmware-build.py
@@ -9,12 +9,14 @@ import argparse
 import os.path
 import re
 import tempfile
+import sys
 
 GITLAB_API_BASE = "https://gitlab.freifunk-stuttgart.de/api/v4"
 PROJECT_ID = 1
 
 ap = argparse.ArgumentParser()
 ap.add_argument("--pipeline-id", help="Pipeline ID to download. If omitted, download latest successfull.", default=None)
+ap.add_argument("--pipeline-id-file", help="Store downloaded Pipeline ID in this file and only download if latest pipeline ID doesn't match file contents", type=argparse.FileType("r+"))
 args = ap.parse_args()
 
 def find_version_from_archive(archive_file_list):
@@ -48,6 +50,13 @@ def find_latest_pipeline_id():
 
 if args.pipeline_id is None:
     pipeline_id = find_latest_pipeline_id()
+
+    if args.pipeline_id_file:
+        pipeline_id_file = args.pipeline_id_file.read()
+
+        if pipeline_id == args.pipeline_id_file:
+            print("Pipeline up to date")
+            sys.exit(1)
 else:
     pipeline_id = args.pipeline_id
    
@@ -69,6 +78,9 @@ for job in pipeline_jobs:
                     print(version)
                     artifact_zip.extractall("gluon/output/")
                     os.rename("gluon/output", version)
+                    if args.pipeline_id_file:
+                        args.pipeline_id_file.truncate(0)
+                        args.pipeline_id_file.write(pipeline_id)
                 else:
                     print(f"'{version}' already exists")
                     sys.exit(1)