From fa7dff8a5fd98f8cc055ffb6ced4d284c6f9418b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 7 Mar 2025 06:54:45 +0000
Subject: [PATCH 01/64] fix(deps): update dependency scratch-l10n to v5.0.153

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index cc21a64a3..0dd5f9cbb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.85.1",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.152",
+        "scratch-l10n": "5.0.153",
         "selenium-webdriver": "4.29.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.152",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.152.tgz",
-      "integrity": "sha512-tqK+2KRIFNyJBq53rwzx4J2pNcORJYp+spMfYQf8CNJI9iDlA4a6Q6twofW+1PhP8NFQIwo1r9T1WZdv+yaj3A==",
+      "version": "5.0.153",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.153.tgz",
+      "integrity": "sha512-0fCyqGBSFxEh5xqFqdu8CrEdNP1plJlg732yO28rDEHUUeMWdTdOzPjnSy0hCClR8AgniOAE5eA9buBH+eZsFg==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index 5d298ea3d..f9ddc4fbd 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.85.1",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.152",
+    "scratch-l10n": "5.0.153",
     "selenium-webdriver": "4.29.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From a42c76aaeb4cc82a530606baaaebe764de33b24c Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 7 Mar 2025 09:58:02 +0000
Subject: [PATCH 02/64] fix(deps): update dependency scratch-storage to ^4.0.70

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 0dd5f9cbb..1a2cf90ac 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.69"
+        "scratch-storage": "^4.0.70"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.70",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.70.tgz",
-      "integrity": "sha512-iuK6bcr01gqxhL2CB8kvob4pTe7mQJbxQu0Y3T3oFDHIioIqmNTkgGdXICRrXW/hc3W7vjsh7XkILLxYCSmUAw==",
+      "version": "4.0.71",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.71.tgz",
+      "integrity": "sha512-k0rJdL2hdcjAGnVomUQgt3oPYIsIQ99b3e/HsvkrDT7v1eY7zOxoXCcftFjCdKQzh6Zk5ToZ+OSf64tZr89gvA==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index f9ddc4fbd..6a81b09e9 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.69"
+    "scratch-storage": "^4.0.70"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From d7a9b0b4b00a35d3c3103c340b8d303de78d4a78 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 7 Mar 2025 13:55:34 +0000
Subject: [PATCH 03/64] fix(deps): update dependency scratch-storage to ^4.0.71

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 1a2cf90ac..4b6da7c5d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.70"
+        "scratch-storage": "^4.0.71"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.71",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.71.tgz",
-      "integrity": "sha512-k0rJdL2hdcjAGnVomUQgt3oPYIsIQ99b3e/HsvkrDT7v1eY7zOxoXCcftFjCdKQzh6Zk5ToZ+OSf64tZr89gvA==",
+      "version": "4.0.72",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.72.tgz",
+      "integrity": "sha512-Ro7Me7p7KTtDHIurf8KgTldjOGwy9BtPnhuWT8xQoBRo/CWDlFLkQC2QQH7fBMeGdYYbQnhDfzgJIzdU4jP6mg==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index 6a81b09e9..e183c8541 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.70"
+    "scratch-storage": "^4.0.71"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From 438a8b015219f81d6c54ca0aecc46f6416e87be6 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sat, 8 Mar 2025 10:26:11 +0000
Subject: [PATCH 04/64] fix(deps): update dependency scratch-storage to ^4.0.72

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 4b6da7c5d..fd594fc19 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.71"
+        "scratch-storage": "^4.0.72"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.72",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.72.tgz",
-      "integrity": "sha512-Ro7Me7p7KTtDHIurf8KgTldjOGwy9BtPnhuWT8xQoBRo/CWDlFLkQC2QQH7fBMeGdYYbQnhDfzgJIzdU4jP6mg==",
+      "version": "4.0.73",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.73.tgz",
+      "integrity": "sha512-e3gxpBsVUxjW82m7QWxM4vuOflyhsmthfrMclRVHS8LxLh6nLZ098OeYPM+CTJDFjeymqzub/Im/qBxWEWe93Q==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index e183c8541..439131e6e 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.71"
+    "scratch-storage": "^4.0.72"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From d4bc8cf2c8964730ceca90872464bec6b85ab1aa Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sun, 9 Mar 2025 09:44:41 +0000
Subject: [PATCH 05/64] fix(deps): update dependency scratch-l10n to v5.0.154

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index fd594fc19..4b6f18275 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.85.1",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.153",
+        "scratch-l10n": "5.0.154",
         "selenium-webdriver": "4.29.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.153",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.153.tgz",
-      "integrity": "sha512-0fCyqGBSFxEh5xqFqdu8CrEdNP1plJlg732yO28rDEHUUeMWdTdOzPjnSy0hCClR8AgniOAE5eA9buBH+eZsFg==",
+      "version": "5.0.154",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.154.tgz",
+      "integrity": "sha512-ekhhheS94wu+fU3GMSNDj4c4EmbwJMGpU6VtADHjAwR/0fdErDzO38mwg2OYoheUuidzhCfiJTnVYe+eXHEfXQ==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index 439131e6e..985ba2003 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.85.1",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.153",
+    "scratch-l10n": "5.0.154",
     "selenium-webdriver": "4.29.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From 106b20e7eae3c3764aa077822ff7182b246dd42c Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sun, 9 Mar 2025 14:06:25 +0000
Subject: [PATCH 06/64] fix(deps): update dependency scratch-storage to ^4.0.73

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 4b6f18275..bd696279d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.72"
+        "scratch-storage": "^4.0.73"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.73",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.73.tgz",
-      "integrity": "sha512-e3gxpBsVUxjW82m7QWxM4vuOflyhsmthfrMclRVHS8LxLh6nLZ098OeYPM+CTJDFjeymqzub/Im/qBxWEWe93Q==",
+      "version": "4.0.74",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.74.tgz",
+      "integrity": "sha512-Aro9lf3vT3TLSiSk1a3eQhKHgDYuB14iNNLs3UFvjpUXW/UUihCtGEoI7cI9NqdWz0Bl2XQZ0zLletzGNqsx8w==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index 985ba2003..5c9576711 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.72"
+    "scratch-storage": "^4.0.73"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From e04af4880b94e4ee917000c25bbbec7b924a4032 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 10 Mar 2025 07:19:25 +0000
Subject: [PATCH 07/64] fix(deps): update dependency scratch-l10n to v5.0.156

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index bd696279d..ae4bb1c3d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.85.1",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.154",
+        "scratch-l10n": "5.0.156",
         "selenium-webdriver": "4.29.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.154",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.154.tgz",
-      "integrity": "sha512-ekhhheS94wu+fU3GMSNDj4c4EmbwJMGpU6VtADHjAwR/0fdErDzO38mwg2OYoheUuidzhCfiJTnVYe+eXHEfXQ==",
+      "version": "5.0.156",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.156.tgz",
+      "integrity": "sha512-aaEy1ArkT5ASAOs+6yPSUUPUsbRZ4PFTkq083gG53EGmU5Bduzyp2UedXLjX/B/omPophbhYwtmwzZDfgFT41g==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index 5c9576711..870f98fc0 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.85.1",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.154",
+    "scratch-l10n": "5.0.156",
     "selenium-webdriver": "4.29.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From 7cfe49f9832552d98d4536a13e81abfc6b9015ee Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 10 Mar 2025 11:21:45 +0000
Subject: [PATCH 08/64] fix(deps): update dependency scratch-storage to ^4.0.74

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index ae4bb1c3d..6f34158c1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.73"
+        "scratch-storage": "^4.0.74"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.74",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.74.tgz",
-      "integrity": "sha512-Aro9lf3vT3TLSiSk1a3eQhKHgDYuB14iNNLs3UFvjpUXW/UUihCtGEoI7cI9NqdWz0Bl2XQZ0zLletzGNqsx8w==",
+      "version": "4.0.75",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.75.tgz",
+      "integrity": "sha512-Ewuy/y8lr8JXuYcI4Y0Ph6uhq8MrWp+0neveUuDwbYTlZRr04mUd9WwUfOCpnY2bcy8srXEFiW/Q4YQpacwrgA==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index 870f98fc0..e14550ef5 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.73"
+    "scratch-storage": "^4.0.74"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From 7f5efeb1ce2a956130a4b22dd78d916dc5836baa Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 11 Mar 2025 10:29:55 +0000
Subject: [PATCH 09/64] fix(deps): update dependency scratch-l10n to v5.0.157

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 6f34158c1..6ac9603e3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.85.1",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.156",
+        "scratch-l10n": "5.0.157",
         "selenium-webdriver": "4.29.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.156",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.156.tgz",
-      "integrity": "sha512-aaEy1ArkT5ASAOs+6yPSUUPUsbRZ4PFTkq083gG53EGmU5Bduzyp2UedXLjX/B/omPophbhYwtmwzZDfgFT41g==",
+      "version": "5.0.157",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.157.tgz",
+      "integrity": "sha512-W2grUpmiIfOznrgBwjQ8VuVc3L3wWwGsqfbItMUaq+/Jt2ExOQ5jdZ1KYEMuBIXSrxiDAK7ii1NVPyrvYGxMsw==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index e14550ef5..4cd84709b 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.85.1",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.156",
+    "scratch-l10n": "5.0.157",
     "selenium-webdriver": "4.29.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From 2cafbba473c09600c05a1df295efe6ccb5429093 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 11 Mar 2025 16:44:28 +0000
Subject: [PATCH 10/64] fix(deps): update dependency scratch-storage to ^4.0.75

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 6ac9603e3..ad9aecac9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.74"
+        "scratch-storage": "^4.0.75"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.75",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.75.tgz",
-      "integrity": "sha512-Ewuy/y8lr8JXuYcI4Y0Ph6uhq8MrWp+0neveUuDwbYTlZRr04mUd9WwUfOCpnY2bcy8srXEFiW/Q4YQpacwrgA==",
+      "version": "4.0.76",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.76.tgz",
+      "integrity": "sha512-tmUDcqMdvTTEm+9+eyiWL1SFXySY6h71g416bM0knE1eF0tugIxApFyGVdzlMEq+5GAwL9MyUz7uS7/TNtcFzA==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index 4cd84709b..730ca2c0e 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.74"
+    "scratch-storage": "^4.0.75"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From b567326f9d3041414c64f0d7ed51d14ce1ef5aaf Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 11 Mar 2025 22:36:51 +0000
Subject: [PATCH 11/64] chore(deps): update dependency python to 3.13

---
 .github/workflows/ci-cd.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index f2342b06b..691e9a5a4 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -59,7 +59,7 @@ jobs:
       - name: setup Python
         uses: actions/setup-python@v5
         with:
-          python-version: '3.12'
+          python-version: '3.13'
       - run: pip install s3cmd==2.4.0
       - run: npm --production=false ci
       - run: mkdir -p ./test/results

From fbd248fdcf4ef1edfd3921ebd029c60611eca6f5 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 12 Mar 2025 11:24:06 +0000
Subject: [PATCH 12/64] fix(deps): update dependency scratch-l10n to v5.0.159

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index ad9aecac9..b55cf23cb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.85.1",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.157",
+        "scratch-l10n": "5.0.159",
         "selenium-webdriver": "4.29.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.157",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.157.tgz",
-      "integrity": "sha512-W2grUpmiIfOznrgBwjQ8VuVc3L3wWwGsqfbItMUaq+/Jt2ExOQ5jdZ1KYEMuBIXSrxiDAK7ii1NVPyrvYGxMsw==",
+      "version": "5.0.159",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.159.tgz",
+      "integrity": "sha512-YxQLPXCS3i7/EK+qbryYkwC7rOvqX1KfKc/5aKe8y1aFp3Hha+XZGvqQK98XAXHS5fpGv51agwo2fZZfLs+Zxg==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index 730ca2c0e..1deb3e513 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.85.1",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.157",
+    "scratch-l10n": "5.0.159",
     "selenium-webdriver": "4.29.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From 5e040f8435ae1d39e0a37f40dc09ae212442d5d1 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 12 Mar 2025 16:35:37 +0000
Subject: [PATCH 13/64] fix(deps): update dependency scratch-storage to ^4.0.76

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index b55cf23cb..1c9e44b35 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.75"
+        "scratch-storage": "^4.0.76"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.76",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.76.tgz",
-      "integrity": "sha512-tmUDcqMdvTTEm+9+eyiWL1SFXySY6h71g416bM0knE1eF0tugIxApFyGVdzlMEq+5GAwL9MyUz7uS7/TNtcFzA==",
+      "version": "4.0.78",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.78.tgz",
+      "integrity": "sha512-ZoPZ/VWKdfXd2RQexQOoMAuzgTn3b3KXwoFzXV1TXxwPxdmdaXZ22XnT/YyXmneHx/dxntj0Dyy2gnkrAo97oQ==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index 1deb3e513..d3ad11480 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.75"
+    "scratch-storage": "^4.0.76"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From 7fd460e51f6a94826e032825ce88a73e5435eca5 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 12 Mar 2025 22:07:24 +0000
Subject: [PATCH 14/64] chore(deps): update dependency autoprefixer to v10.4.21

---
 package-lock.json | 20 ++++++++++----------
 package.json      |  2 +-
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 1c9e44b35..f81fa8af7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -42,7 +42,7 @@
         "@scratch/scratch-gui": "^11.0.0-beta.2",
         "@types/jest": "29.5.14",
         "async": "3.2.6",
-        "autoprefixer": "10.4.20",
+        "autoprefixer": "10.4.21",
         "babel-loader": "8.4.1",
         "babel-plugin-transform-require-context": "0.1.1",
         "bowser": "1.9.4",
@@ -5832,9 +5832,9 @@
       "license": "MIT"
     },
     "node_modules/autoprefixer": {
-      "version": "10.4.20",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
-      "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
+      "version": "10.4.21",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
+      "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
       "dev": true,
       "funding": [
         {
@@ -5852,11 +5852,11 @@
       ],
       "license": "MIT",
       "dependencies": {
-        "browserslist": "^4.23.3",
-        "caniuse-lite": "^1.0.30001646",
+        "browserslist": "^4.24.4",
+        "caniuse-lite": "^1.0.30001702",
         "fraction.js": "^4.3.7",
         "normalize-range": "^0.1.2",
-        "picocolors": "^1.0.1",
+        "picocolors": "^1.1.1",
         "postcss-value-parser": "^4.2.0"
       },
       "bin": {
@@ -7040,9 +7040,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001700",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz",
-      "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==",
+      "version": "1.0.30001703",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001703.tgz",
+      "integrity": "sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==",
       "dev": true,
       "funding": [
         {
diff --git a/package.json b/package.json
index d3ad11480..087d5b8c2 100644
--- a/package.json
+++ b/package.json
@@ -77,7 +77,7 @@
     "@scratch/scratch-gui": "^11.0.0-beta.2",
     "@types/jest": "29.5.14",
     "async": "3.2.6",
-    "autoprefixer": "10.4.20",
+    "autoprefixer": "10.4.21",
     "babel-loader": "8.4.1",
     "babel-plugin-transform-require-context": "0.1.1",
     "bowser": "1.9.4",

From 070958abbb1367a84c356fb46e904cd85615346b Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Wed, 12 Mar 2025 20:17:35 -0700
Subject: [PATCH 15/64] ci: break ci-cd.yml into multiple jobs

---
 .github/workflows/ci-cd.yml | 117 +++++++++++++++++++++++++-----------
 1 file changed, 83 insertions(+), 34 deletions(-)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index 691e9a5a4..348a93dae 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -18,27 +18,34 @@ env:
   SKIP_CLEANUP: true
 
 jobs:
-  build-and-test-and-maybe-deploy:
+  set-environment: # this job just a trick to DRY the environment logic
     runs-on: ubuntu-latest
-    environment: >-
-      ${{
-        (
-          (github.ref == 'refs/heads/master') && 'production'
-        ) ||
-        (
-          (
-            (github.ref == 'refs/heads/develop') ||
-            (github.ref == 'refs/heads/beta') ||
-            startsWith(github.ref, 'refs/heads/hotfix/') ||
-            startsWith(github.ref, 'refs/heads/release/')
-          ) && 'staging'
-        ) ||
-        ''
-      }}
     env:
-      # SCRATCH_ENV comes from the GitHub Environment
-      # See https://github.com/scratchfoundation/scratch-www/settings/variables/actions
-      SCRATCH_SHOULD_DEPLOY: ${{ vars.SCRATCH_ENV != '' }}
+      GH_ENVIRONMENT: >-
+        ${{
+          (
+            (github.ref == 'refs/heads/master') && 'production'
+          ) ||
+          (
+            (
+              (github.ref == 'refs/heads/develop') ||
+              (github.ref == 'refs/heads/beta') ||
+              startsWith(github.ref, 'refs/heads/hotfix/') ||
+              startsWith(github.ref, 'refs/heads/release/')
+            ) && 'staging'
+          ) ||
+          ''
+        }}
+    outputs:
+      environment: ${{ env.GH_ENVIRONMENT }}
+      should_deploy: ${{ (env.GH_ENVIRONMENT || '') != '' }}
+  build:
+    runs-on: ubuntu-latest
+    needs: set-environment
+    environment: ${{ needs.set-environment.outputs.environment }}
+    env:
+      SCRATCH_ENV: ${{ needs.set-environment.outputs.environment }}
+      SCRATCH_SHOULD_DEPLOY: ${{ needs.set-environment.outputs.should_deploy }}
     steps:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
       - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
@@ -48,7 +55,7 @@ jobs:
       - name: info
         run: |
           cat <<EOF
-          Scratch environment: ${{ vars.SCRATCH_ENV }}
+          Scratch environment: ${SCRATCH_ENV}
           Node version: $(node --version)
           NPM version: $(npm --version)
           github.workflow: ${{ github.workflow }}
@@ -77,7 +84,6 @@ jobs:
           CLOUDDATA_HOST: ${{ secrets.CLOUDDATA_HOST }}
           PROJECT_HOST: ${{ secrets.PROJECT_HOST }}
           STATIC_HOST: ${{ secrets.STATIC_HOST }}
-          SCRATCH_ENV: ${{ vars.SCRATCH_ENV }}
           ONBOARDING_TEST_ACTIVE: "${{ vars.ONBOARDING_TEST_ACTIVE }}"
           ONBOARDING_TEST_PROJECT_IDS: "${{ vars.ONBOARDING_TEST_PROJECT_IDS }}"
           ONBOARDING_TESTING_STARTING_DATE: "${{ vars.ONBOARDING_TESTING_STARTING_DATE }}"
@@ -92,8 +98,40 @@ jobs:
           JEST_JUNIT_OUTPUT_NAME=localization-jest-results.xml npm run test:unit:jest:localization -- --reporters=jest-junit
           npm run test:unit:tap -- --output-file ./test/results/unit-raw.tap
           npm run test:unit:convertReportToXunit
+      - name: compress artifacts
+        if: ${{ needs.set-environment.outputs.should_deploy }}
+        run: |
+          mkdir -p artifacts/
+          tar -cavf artifacts/build.tar.zst build &
+          tar -cavf artifacts/node_modules.tar.zst node_modules &
+          wait
+      - name: upload artifacts
+        if: ${{ needs.set-environment.outputs.should_deploy }}
+        uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4
+        with:
+          path: artifacts/
+          compression-level: 0 # don't re-compress the already compressed artifacts
+  deploy:
+    runs-on: ubuntu-latest
+    needs: [set-environment, build]
+    environment: ${{ needs.set-environment.outputs.environment }}
+    if: ${{ needs.set-environment.outputs.should_deploy }}
+    steps:
+      - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
+      - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
+        with:
+          cache: 'npm'
+          node-version-file: '.nvmrc'
+      - name: download artifacts
+        uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4
+        with:
+          name: artifacts
+      - name: extract artifacts
+        run: |
+          tar -xavf artifacts/build.tar.zst &
+          tar -xavf artifacts/node_modules.tar.zst &
+          wait
       - name: deploy
-        if: ${{ env.SCRATCH_SHOULD_DEPLOY == 'true' }}
         run: npm run deploy
         env:
           S3_LOCAL_DIR: build
@@ -103,15 +141,34 @@ jobs:
           FASTLY_API_KEY: ${{ secrets.FASTLY_API_KEY }}
           FASTLY_SERVICE_ID: ${{ secrets.FASTLY_SERVICE_ID }}
           SCRATCH_BRANCH: ${{ github.ref_name }}
-          SCRATCH_ENV: ${{ vars.SCRATCH_ENV }}
+          SCRATCH_ENV: ${{ needs.set-environment.outputs.environment }}
           SLACK_WEBHOOK_CIRCLECI_NOTIFICATIONS: ${{ secrets.SLACK_WEBHOOK_CIRCLECI_NOTIFICATIONS }} # TODO: rename or replace
           SLACK_WEBHOOK_ENGINEERING: ${{ secrets.SLACK_WEBHOOK_ENGINEERING }}
           SLACK_WEBHOOK_MODS: ${{ secrets.SLACK_WEBHOOK_MODS }}
           RADISH_URL: ${{ vars.RADISH_URL }}
-      - name: integration tests
-        if: ${{ env.SCRATCH_SHOULD_DEPLOY == 'true' }}
+  integration-tests:
+    runs-on: ubuntu-latest
+    needs: [set-environment, deploy]
+    environment: ${{ needs.set-environment.outputs.environment }}
+    if: ${{ needs.set-environment.outputs.should_deploy }}
+    steps:
+      - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
+      - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
+        with:
+          cache: 'npm'
+          node-version-file: '.nvmrc'
+      - name: download artifacts
+        uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4
+        with:
+          name: artifacts
+      - name: extract artifacts
         run: |
-          if [ '${{ vars.SCRATCH_ENV }}' == 'production' ]; then
+          tar -xavf artifacts/build.tar.zst &
+          tar -xavf artifacts/node_modules.tar.zst &
+          wait
+      - name: integration tests
+        run: |
+          if [ '${{ needs.set-environment.outputs.environment }}' == 'production' ]; then
             # if the health test fails, there's no point in trying to run the integration tests
             npm run test:health
             # health test succeeded, so proceed with integration tests
@@ -144,11 +201,3 @@ jobs:
           OWNED_UNSHARED_SCRATCH2_PROJECT_ID: ${{ secrets.OWNED_UNSHARED_SCRATCH2_PROJECT_ID }}
           TEST_STUDIO_ID: ${{ secrets.TEST_STUDIO_ID }}
           RATE_LIMIT_CHECK: ${{ secrets.RATE_LIMIT_CHECK }}
-      - name: compress artifact
-        if: ${{ env.SCRATCH_SHOULD_DEPLOY == 'true' }}
-        run: tar -czvf build.tgz build
-      - name: upload artifact
-        if: ${{ env.SCRATCH_SHOULD_DEPLOY == 'true' }}
-        uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4
-        with:
-          path: build.tgz

From 5eb77e58f18c043e9be144060472482d34b2a490 Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Wed, 12 Mar 2025 20:21:11 -0700
Subject: [PATCH 16/64] ci: fix empty job

---
 .github/workflows/ci-cd.yml | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index 348a93dae..c80c0bf02 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -36,6 +36,11 @@ jobs:
           ) ||
           ''
         }}
+    steps:
+      # apparently you're not allowed to have a job with no steps
+      - name: Report environment
+        run: |
+          echo "Environment: ${{ env.GH_ENVIRONMENT }}"
     outputs:
       environment: ${{ env.GH_ENVIRONMENT }}
       should_deploy: ${{ (env.GH_ENVIRONMENT || '') != '' }}

From 79901c3d133df39bc80261aa3923c5c8f7164380 Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Wed, 12 Mar 2025 20:28:58 -0700
Subject: [PATCH 17/64] ci: debug the "should deploy" flag

---
 .github/workflows/ci-cd.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index c80c0bf02..9fcd4e751 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -61,6 +61,7 @@ jobs:
         run: |
           cat <<EOF
           Scratch environment: ${SCRATCH_ENV}
+          Should deploy: ${SCRATCH_SHOULD_DEPLOY}
           Node version: $(node --version)
           NPM version: $(npm --version)
           github.workflow: ${{ github.workflow }}

From 3aef5208828cf946f48cd76e6ac4f25fef95edf2 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 13 Mar 2025 06:25:46 +0000
Subject: [PATCH 18/64] fix(deps): update dependency scratch-l10n to v5.0.161

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index f81fa8af7..15c674ecd 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.85.1",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.159",
+        "scratch-l10n": "5.0.161",
         "selenium-webdriver": "4.29.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.159",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.159.tgz",
-      "integrity": "sha512-YxQLPXCS3i7/EK+qbryYkwC7rOvqX1KfKc/5aKe8y1aFp3Hha+XZGvqQK98XAXHS5fpGv51agwo2fZZfLs+Zxg==",
+      "version": "5.0.161",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.161.tgz",
+      "integrity": "sha512-6af4zs38lEtAgUGjtYyHiwCkShKbJ6E+c2qZba9oyPblRQD6a2uewtKHgbV8p8acSxWnTwvmrMCE8p4dyMjrpw==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index 087d5b8c2..13b3bd1f7 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.85.1",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.159",
+    "scratch-l10n": "5.0.161",
     "selenium-webdriver": "4.29.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From b491ddbcee0ff9142e6cdf6b7a3ef4146f5fad02 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 13 Mar 2025 11:21:51 +0000
Subject: [PATCH 19/64] fix(deps): update dependency scratch-storage to ^4.0.78

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 15c674ecd..2dd777145 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.76"
+        "scratch-storage": "^4.0.78"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.78",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.78.tgz",
-      "integrity": "sha512-ZoPZ/VWKdfXd2RQexQOoMAuzgTn3b3KXwoFzXV1TXxwPxdmdaXZ22XnT/YyXmneHx/dxntj0Dyy2gnkrAo97oQ==",
+      "version": "4.0.79",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.79.tgz",
+      "integrity": "sha512-ULCvNZUEWdJKVx3HYzOJpIFHOqgxX3rbXYQ5cbOY3t5moklLt2vTJAYVXZ+dQ5VzD8EUdJmWamtlexYr0BE0Lg==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index 13b3bd1f7..05ca161ad 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.76"
+    "scratch-storage": "^4.0.78"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From 41a1a7af35b981e3486ac9b5db7c9ce732c30da2 Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Thu, 13 Mar 2025 06:36:30 -0700
Subject: [PATCH 20/64] ci: fix transferring build to later jobs

---
 .github/workflows/ci-cd.yml | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index 9fcd4e751..99656b080 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -69,11 +69,6 @@ jobs:
           github.head_ref: ${{ github.head_ref }}
           github.ref: ${{ github.ref }}
           EOF
-      - name: setup Python
-        uses: actions/setup-python@v5
-        with:
-          python-version: '3.13'
-      - run: pip install s3cmd==2.4.0
       - run: npm --production=false ci
       - run: mkdir -p ./test/results
       - name: lint
@@ -121,24 +116,30 @@ jobs:
     runs-on: ubuntu-latest
     needs: [set-environment, build]
     environment: ${{ needs.set-environment.outputs.environment }}
-    if: ${{ needs.set-environment.outputs.should_deploy }}
+    # if: ${{ needs.set-environment.outputs.should_deploy == 'true' }}
     steps:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
       - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
         with:
           cache: 'npm'
           node-version-file: '.nvmrc'
+      - name: setup Python
+        uses: actions/setup-python@v5
+        with:
+          python-version: '3.13'
+      - run: pip install s3cmd==2.4.0
       - name: download artifacts
         uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4
         with:
-          name: artifacts
+          # if `name` is not specified, it will download all artifacts
+          path: artifacts/
       - name: extract artifacts
         run: |
           tar -xavf artifacts/build.tar.zst &
           tar -xavf artifacts/node_modules.tar.zst &
           wait
       - name: deploy
-        run: npm run deploy
+        run: echo TEMP TURNED OFF FOR TESTING npm run deploy
         env:
           S3_LOCAL_DIR: build
           S3_BUCKET_NAME: ${{ secrets.S3_BUCKET_NAME }}
@@ -156,7 +157,7 @@ jobs:
     runs-on: ubuntu-latest
     needs: [set-environment, deploy]
     environment: ${{ needs.set-environment.outputs.environment }}
-    if: ${{ needs.set-environment.outputs.should_deploy }}
+    if: ${{ needs.set-environment.outputs.should_deploy == 'true' }}
     steps:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
       - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
@@ -166,7 +167,8 @@ jobs:
       - name: download artifacts
         uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4
         with:
-          name: artifacts
+          # if `name` is not specified, it will download all artifacts
+          path: artifacts/
       - name: extract artifacts
         run: |
           tar -xavf artifacts/build.tar.zst &

From abb91404dea7f908c250033b15cb3fc6f09ccc1e Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Thu, 13 Mar 2025 07:02:55 -0700
Subject: [PATCH 21/64] ci: notice if archiving fails

---
 .github/workflows/ci-cd.yml | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index 99656b080..577ab3d71 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -101,11 +101,12 @@ jobs:
           npm run test:unit:convertReportToXunit
       - name: compress artifacts
         if: ${{ needs.set-environment.outputs.should_deploy }}
+        env:
+          ZSTD_NBTHREADS: 0 # tell zstd to automatically choose thread count
         run: |
           mkdir -p artifacts/
-          tar -cavf artifacts/build.tar.zst build &
-          tar -cavf artifacts/node_modules.tar.zst node_modules &
-          wait
+          tar -cavf artifacts/build.tar.zst build
+          tar -cavf artifacts/node_modules.tar.zst node_modules
       - name: upload artifacts
         if: ${{ needs.set-environment.outputs.should_deploy }}
         uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4
@@ -134,10 +135,11 @@ jobs:
           # if `name` is not specified, it will download all artifacts
           path: artifacts/
       - name: extract artifacts
+        env:
+          ZSTD_NBTHREADS: 0 # tell zstd to automatically choose thread count
         run: |
-          tar -xavf artifacts/build.tar.zst &
-          tar -xavf artifacts/node_modules.tar.zst &
-          wait
+          tar -xavf artifacts/build.tar.zst
+          tar -xavf artifacts/node_modules.tar.zst
       - name: deploy
         run: echo TEMP TURNED OFF FOR TESTING npm run deploy
         env:
@@ -170,10 +172,11 @@ jobs:
           # if `name` is not specified, it will download all artifacts
           path: artifacts/
       - name: extract artifacts
+        env:
+          ZSTD_NBTHREADS: 0 # tell zstd to automatically choose thread count
         run: |
-          tar -xavf artifacts/build.tar.zst &
-          tar -xavf artifacts/node_modules.tar.zst &
-          wait
+          tar -xavf artifacts/build.tar.zst
+          tar -xavf artifacts/node_modules.tar.zst
       - name: integration tests
         run: |
           if [ '${{ needs.set-environment.outputs.environment }}' == 'production' ]; then

From 91a2924f382925f5cf0e110bb85fcc01d904b06a Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Thu, 13 Mar 2025 07:04:55 -0700
Subject: [PATCH 22/64] ci: debug artifact download/extract

---
 .github/workflows/ci-cd.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index 577ab3d71..f15d6d0e4 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -138,6 +138,7 @@ jobs:
         env:
           ZSTD_NBTHREADS: 0 # tell zstd to automatically choose thread count
         run: |
+          ls -lRh artifacts/
           tar -xavf artifacts/build.tar.zst
           tar -xavf artifacts/node_modules.tar.zst
       - name: deploy

From 486d11e466c86bb6ff39ce9a24eafb0d9ca43762 Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Thu, 13 Mar 2025 07:36:47 -0700
Subject: [PATCH 23/64] ci: upload artifacts for build and node_modules
 separately

---
 .github/workflows/ci-cd.yml | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index f15d6d0e4..f5f0c20b3 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -107,12 +107,20 @@ jobs:
           mkdir -p artifacts/
           tar -cavf artifacts/build.tar.zst build
           tar -cavf artifacts/node_modules.tar.zst node_modules
-      - name: upload artifacts
+      - name: "upload artifact: build"
         if: ${{ needs.set-environment.outputs.should_deploy }}
         uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4
         with:
-          path: artifacts/
-          compression-level: 0 # don't re-compress the already compressed artifacts
+          name: build
+          path: artifacts/build.tar.zst
+          compression-level: 0 # don't re-compress compressed data
+      - name: "upload artifact: node_modules"
+        if: ${{ needs.set-environment.outputs.should_deploy }}
+        uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4
+        with:
+          name: node_modules
+          path: artifacts/node_modules.tar.zst
+          compression-level: 0 # don't re-compress compressed data
   deploy:
     runs-on: ubuntu-latest
     needs: [set-environment, build]
@@ -134,6 +142,9 @@ jobs:
         with:
           # if `name` is not specified, it will download all artifacts
           path: artifacts/
+          # upload-artifact makes a ZIP file with the provided `name` (default: `artifact`)
+          # by default, download-artifact will extract that ZIP file into a subdirectory with the same name
+          merge-multiple: true # don't make a subdirectory for each artifact name
       - name: extract artifacts
         env:
           ZSTD_NBTHREADS: 0 # tell zstd to automatically choose thread count
@@ -172,6 +183,9 @@ jobs:
         with:
           # if `name` is not specified, it will download all artifacts
           path: artifacts/
+          # upload-artifact makes a ZIP file with the provided `name` (default: `artifact`)
+          # by default, download-artifact will extract that ZIP file into a subdirectory with the same name
+          merge-multiple: true # don't make a subdirectory for each artifact name
       - name: extract artifacts
         env:
           ZSTD_NBTHREADS: 0 # tell zstd to automatically choose thread count

From 77d1754817e9c75515da0cc85f60c25c9d0a912e Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Thu, 13 Mar 2025 07:55:26 -0700
Subject: [PATCH 24/64] ci: temporarily enable integration tests on
 non-deploying branches

---
 .github/workflows/ci-cd.yml | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index f5f0c20b3..2de6e0173 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -171,7 +171,7 @@ jobs:
     runs-on: ubuntu-latest
     needs: [set-environment, deploy]
     environment: ${{ needs.set-environment.outputs.environment }}
-    if: ${{ needs.set-environment.outputs.should_deploy == 'true' }}
+    # if: ${{ needs.set-environment.outputs.should_deploy == 'true' }}
     steps:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
       - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
@@ -194,15 +194,15 @@ jobs:
           tar -xavf artifacts/node_modules.tar.zst
       - name: integration tests
         run: |
-          if [ '${{ needs.set-environment.outputs.environment }}' == 'production' ]; then
+          # if [ '${{ needs.set-environment.outputs.environment }}' == 'production' ]; then
             # if the health test fails, there's no point in trying to run the integration tests
             npm run test:health
             # health test succeeded, so proceed with integration tests
             JEST_JUNIT_OUTPUT_NAME=integration-jest-results.xml npm run test:integration -- --reporters=jest-junit
-          else
-            echo "Skipping integration tests for non-production environment"
-            echo "Please run the integration tests manually if necessary"
-          fi
+          # else
+          #   echo "Skipping integration tests for non-production environment"
+          #   echo "Please run the integration tests manually if necessary"
+          # fi
         env:
           ROOT_URL: ${{ secrets.ROOT_URL }}
 

From 1508efb5ed14872f76578f9d9c67d54a88ca238e Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Thu, 13 Mar 2025 08:27:03 -0700
Subject: [PATCH 25/64] ci: set conditionals back to normal

---
 .github/workflows/ci-cd.yml | 21 +++++++++------------
 1 file changed, 9 insertions(+), 12 deletions(-)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index 2de6e0173..49d1ba6f3 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -125,7 +125,7 @@ jobs:
     runs-on: ubuntu-latest
     needs: [set-environment, build]
     environment: ${{ needs.set-environment.outputs.environment }}
-    # if: ${{ needs.set-environment.outputs.should_deploy == 'true' }}
+    if: ${{ needs.set-environment.outputs.should_deploy == 'true' }}
     steps:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
       - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
@@ -153,7 +153,7 @@ jobs:
           tar -xavf artifacts/build.tar.zst
           tar -xavf artifacts/node_modules.tar.zst
       - name: deploy
-        run: echo TEMP TURNED OFF FOR TESTING npm run deploy
+        run: npm run deploy
         env:
           S3_LOCAL_DIR: build
           S3_BUCKET_NAME: ${{ secrets.S3_BUCKET_NAME }}
@@ -171,7 +171,9 @@ jobs:
     runs-on: ubuntu-latest
     needs: [set-environment, deploy]
     environment: ${{ needs.set-environment.outputs.environment }}
-    # if: ${{ needs.set-environment.outputs.should_deploy == 'true' }}
+    # GHA can't reach staging
+    # TODO: run integration tests against localhost?
+    if: ${{ needs.set-environment.outputs.environment == 'production' }}
     steps:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
       - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
@@ -194,15 +196,10 @@ jobs:
           tar -xavf artifacts/node_modules.tar.zst
       - name: integration tests
         run: |
-          # if [ '${{ needs.set-environment.outputs.environment }}' == 'production' ]; then
-            # if the health test fails, there's no point in trying to run the integration tests
-            npm run test:health
-            # health test succeeded, so proceed with integration tests
-            JEST_JUNIT_OUTPUT_NAME=integration-jest-results.xml npm run test:integration -- --reporters=jest-junit
-          # else
-          #   echo "Skipping integration tests for non-production environment"
-          #   echo "Please run the integration tests manually if necessary"
-          # fi
+          # if the health test fails, there's no point in trying to run the integration tests
+          npm run test:health
+          # health test succeeded, so proceed with integration tests
+          JEST_JUNIT_OUTPUT_NAME=integration-jest-results.xml npm run test:integration -- --reporters=jest-junit
         env:
           ROOT_URL: ${{ secrets.ROOT_URL }}
 

From 67c7c42f8d1dcddc0893b16f00369ef3a656a89a Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Thu, 13 Mar 2025 08:35:51 -0700
Subject: [PATCH 26/64] ci: build and deploy after creating release branches
 and PRs

---
 .github/workflows/ci-cd.yml | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index 49d1ba6f3..ed0131176 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -5,6 +5,10 @@ on:
   push: # Runs whenever a commit is pushed to the repository
     branches: [master, develop, beta, hotfix/*] # ...on any of these branches
   workflow_dispatch: # Allows you to run this workflow manually from the Actions tab
+  workflow_run: # Runs whenever another workflow is run
+    workflows: ["Create release branch and PRs"] # ...specifically, when this workflow is run
+    types:
+      - completed # ...after it completes
 
 concurrency:
   group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}'

From 6d2c365f3f0399d092f904072bf52509b18f67ba Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Thu, 13 Mar 2025 09:18:25 -0700
Subject: [PATCH 27/64] ci: use caching instead of artifacts for node_modules

---
 .github/workflows/ci-cd.yml | 27 ++++++++++++++++-----------
 1 file changed, 16 insertions(+), 11 deletions(-)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index ed0131176..1a913a1c4 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -110,7 +110,6 @@ jobs:
         run: |
           mkdir -p artifacts/
           tar -cavf artifacts/build.tar.zst build
-          tar -cavf artifacts/node_modules.tar.zst node_modules
       - name: "upload artifact: build"
         if: ${{ needs.set-environment.outputs.should_deploy }}
         uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4
@@ -118,13 +117,11 @@ jobs:
           name: build
           path: artifacts/build.tar.zst
           compression-level: 0 # don't re-compress compressed data
-      - name: "upload artifact: node_modules"
-        if: ${{ needs.set-environment.outputs.should_deploy }}
-        uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4
+      - name: save node_modules for other jobs
+        uses: actions/cache/save@v4
         with:
-          name: node_modules
-          path: artifacts/node_modules.tar.zst
-          compression-level: 0 # don't re-compress compressed data
+          path: node_modules
+          key: ${{ runner.os }}-node_modules-${{ hashFiles('**/.nvmrc', '**/package-lock.json') }}
   deploy:
     runs-on: ubuntu-latest
     needs: [set-environment, build]
@@ -134,8 +131,13 @@ jobs:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
       - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
         with:
-          cache: 'npm'
           node-version-file: '.nvmrc'
+      - name: retrieve node_modules
+        uses: actions/cache/restore@v4
+        with:
+          fail-on-cache-miss: true
+          path: node_modules
+          key: ${{ runner.os }}-node_modules-${{ hashFiles('**/.nvmrc', '**/package-lock.json') }}
       - name: setup Python
         uses: actions/setup-python@v5
         with:
@@ -155,7 +157,6 @@ jobs:
         run: |
           ls -lRh artifacts/
           tar -xavf artifacts/build.tar.zst
-          tar -xavf artifacts/node_modules.tar.zst
       - name: deploy
         run: npm run deploy
         env:
@@ -182,8 +183,13 @@ jobs:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
       - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
         with:
-          cache: 'npm'
           node-version-file: '.nvmrc'
+      - name: retrieve node_modules
+        uses: actions/cache/restore@v4
+        with:
+          fail-on-cache-miss: true
+          path: node_modules
+          key: ${{ runner.os }}-node_modules-${{ hashFiles('**/.nvmrc', '**/package-lock.json') }}
       - name: download artifacts
         uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4
         with:
@@ -197,7 +203,6 @@ jobs:
           ZSTD_NBTHREADS: 0 # tell zstd to automatically choose thread count
         run: |
           tar -xavf artifacts/build.tar.zst
-          tar -xavf artifacts/node_modules.tar.zst
       - name: integration tests
         run: |
           # if the health test fails, there's no point in trying to run the integration tests

From 696d8de7534a860c13e3564c5a0c81759ae1abc6 Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Thu, 13 Mar 2025 09:19:43 -0700
Subject: [PATCH 28/64] ci: temporarily enable building on non-deploy
 environments

---
 .github/workflows/ci-cd.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index 1a913a1c4..861a97759 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -126,7 +126,7 @@ jobs:
     runs-on: ubuntu-latest
     needs: [set-environment, build]
     environment: ${{ needs.set-environment.outputs.environment }}
-    if: ${{ needs.set-environment.outputs.should_deploy == 'true' }}
+    # if: ${{ needs.set-environment.outputs.should_deploy == 'true' }}
     steps:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
       - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4

From 407f879dff3302750cac70aa35399ae8511b4c90 Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Thu, 13 Mar 2025 09:29:36 -0700
Subject: [PATCH 29/64] ci: debug node_modules cache key

---
 .github/workflows/ci-cd.yml | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index 861a97759..825b1ec79 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -117,6 +117,8 @@ jobs:
           name: build
           path: artifacts/build.tar.zst
           compression-level: 0 # don't re-compress compressed data
+      - name: debug node_modules cache key
+        run: find . -name .nvmrc -o -name package-lock.json -print0 | xargs -0 md5sum
       - name: save node_modules for other jobs
         uses: actions/cache/save@v4
         with:
@@ -132,6 +134,8 @@ jobs:
       - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
         with:
           node-version-file: '.nvmrc'
+      - name: debug node_modules cache key
+        run: find . -name .nvmrc -o -name package-lock.json -print0 | xargs -0 md5sum
       - name: retrieve node_modules
         uses: actions/cache/restore@v4
         with:

From 8538b19d97b48a0404f8594fc145f47b4e610feb Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Thu, 13 Mar 2025 12:37:23 -0700
Subject: [PATCH 30/64] ci: don't let copilot steer you wrong

---
 .github/workflows/ci-cd.yml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index 825b1ec79..0c37d5707 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -118,12 +118,12 @@ jobs:
           path: artifacts/build.tar.zst
           compression-level: 0 # don't re-compress compressed data
       - name: debug node_modules cache key
-        run: find . -name .nvmrc -o -name package-lock.json -print0 | xargs -0 md5sum
+        run: md5sum .nvmrc package-lock.json
       - name: save node_modules for other jobs
         uses: actions/cache/save@v4
         with:
           path: node_modules
-          key: ${{ runner.os }}-node_modules-${{ hashFiles('**/.nvmrc', '**/package-lock.json') }}
+          key: ${{ runner.os }}-node_modules-${{ hashFiles('.nvmrc', 'package-lock.json') }}
   deploy:
     runs-on: ubuntu-latest
     needs: [set-environment, build]
@@ -135,13 +135,13 @@ jobs:
         with:
           node-version-file: '.nvmrc'
       - name: debug node_modules cache key
-        run: find . -name .nvmrc -o -name package-lock.json -print0 | xargs -0 md5sum
+        run: md5sum .nvmrc package-lock.json
       - name: retrieve node_modules
         uses: actions/cache/restore@v4
         with:
           fail-on-cache-miss: true
           path: node_modules
-          key: ${{ runner.os }}-node_modules-${{ hashFiles('**/.nvmrc', '**/package-lock.json') }}
+          key: ${{ runner.os }}-node_modules-${{ hashFiles('.nvmrc', 'package-lock.json') }}
       - name: setup Python
         uses: actions/setup-python@v5
         with:
@@ -193,7 +193,7 @@ jobs:
         with:
           fail-on-cache-miss: true
           path: node_modules
-          key: ${{ runner.os }}-node_modules-${{ hashFiles('**/.nvmrc', '**/package-lock.json') }}
+          key: ${{ runner.os }}-node_modules-${{ hashFiles('.nvmrc', 'package-lock.json') }}
       - name: download artifacts
         uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4
         with:

From e90db5d865c1f6a41db80251841b7e5bfd9bf6b4 Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Thu, 13 Mar 2025 12:56:38 -0700
Subject: [PATCH 31/64] ci: clean up, prep for PR

---
 .github/workflows/ci-cd.yml | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index 0c37d5707..ffc915736 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -104,22 +104,21 @@ jobs:
           npm run test:unit:tap -- --output-file ./test/results/unit-raw.tap
           npm run test:unit:convertReportToXunit
       - name: compress artifacts
-        if: ${{ needs.set-environment.outputs.should_deploy }}
+        if: ${{ needs.set-environment.outputs.should_deploy == 'true' }}
         env:
           ZSTD_NBTHREADS: 0 # tell zstd to automatically choose thread count
         run: |
           mkdir -p artifacts/
           tar -cavf artifacts/build.tar.zst build
       - name: "upload artifact: build"
-        if: ${{ needs.set-environment.outputs.should_deploy }}
+        if: ${{ needs.set-environment.outputs.should_deploy == 'true' }}
         uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4
         with:
           name: build
           path: artifacts/build.tar.zst
           compression-level: 0 # don't re-compress compressed data
-      - name: debug node_modules cache key
-        run: md5sum .nvmrc package-lock.json
       - name: save node_modules for other jobs
+        if: ${{ needs.set-environment.outputs.should_deploy == 'true' }}
         uses: actions/cache/save@v4
         with:
           path: node_modules
@@ -128,14 +127,12 @@ jobs:
     runs-on: ubuntu-latest
     needs: [set-environment, build]
     environment: ${{ needs.set-environment.outputs.environment }}
-    # if: ${{ needs.set-environment.outputs.should_deploy == 'true' }}
+    if: ${{ needs.set-environment.outputs.should_deploy == 'true' }}
     steps:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
       - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
         with:
           node-version-file: '.nvmrc'
-      - name: debug node_modules cache key
-        run: md5sum .nvmrc package-lock.json
       - name: retrieve node_modules
         uses: actions/cache/restore@v4
         with:
@@ -181,7 +178,8 @@ jobs:
     needs: [set-environment, deploy]
     environment: ${{ needs.set-environment.outputs.environment }}
     # GHA can't reach staging
-    # TODO: run integration tests against localhost?
+    # TODO: Run integration tests against localhost? Not only would that let us test any and all branches,
+    # but we could also, I dunno, consider fully testing _before_ we deploy? :sweat_smile:
     if: ${{ needs.set-environment.outputs.environment == 'production' }}
     steps:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4

From 38709790569c84cc4d811ef35b668f05d902dfd9 Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Thu, 13 Mar 2025 13:19:34 -0700
Subject: [PATCH 32/64] ci: add friendly job names

---
 .github/workflows/ci-cd.yml | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index ffc915736..a82c76393 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -23,6 +23,7 @@ env:
 
 jobs:
   set-environment: # this job just a trick to DRY the environment logic
+    name: Set Environment
     runs-on: ubuntu-latest
     env:
       GH_ENVIRONMENT: >-
@@ -49,6 +50,7 @@ jobs:
       environment: ${{ env.GH_ENVIRONMENT }}
       should_deploy: ${{ (env.GH_ENVIRONMENT || '') != '' }}
   build:
+    name: Build and Unit Tests
     runs-on: ubuntu-latest
     needs: set-environment
     environment: ${{ needs.set-environment.outputs.environment }}
@@ -124,6 +126,7 @@ jobs:
           path: node_modules
           key: ${{ runner.os }}-node_modules-${{ hashFiles('.nvmrc', 'package-lock.json') }}
   deploy:
+    name: Deploy
     runs-on: ubuntu-latest
     needs: [set-environment, build]
     environment: ${{ needs.set-environment.outputs.environment }}
@@ -174,6 +177,7 @@ jobs:
           SLACK_WEBHOOK_MODS: ${{ secrets.SLACK_WEBHOOK_MODS }}
           RADISH_URL: ${{ vars.RADISH_URL }}
   integration-tests:
+    name: Production Integration Tests
     runs-on: ubuntu-latest
     needs: [set-environment, deploy]
     environment: ${{ needs.set-environment.outputs.environment }}

From 144298f5d3ee0cc8389d273073779450fa56992b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 14 Mar 2025 06:44:53 +0000
Subject: [PATCH 33/64] fix(deps): update dependency scratch-l10n to v5.0.163

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 2dd777145..2b284e052 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.85.1",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.161",
+        "scratch-l10n": "5.0.163",
         "selenium-webdriver": "4.29.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.161",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.161.tgz",
-      "integrity": "sha512-6af4zs38lEtAgUGjtYyHiwCkShKbJ6E+c2qZba9oyPblRQD6a2uewtKHgbV8p8acSxWnTwvmrMCE8p4dyMjrpw==",
+      "version": "5.0.163",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.163.tgz",
+      "integrity": "sha512-vgnZ8IFZo0jsYPfD6eV8Qq8y2ekNWx67x6X6o3PIJ/Q3TcYRzjWdur3RgzuvZtS8795iJTngWJgxNvw+akSn6Q==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index 05ca161ad..d6987a563 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.85.1",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.161",
+    "scratch-l10n": "5.0.163",
     "selenium-webdriver": "4.29.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From 47d350395467c305c3137dec4fb88ea17ba2dcc6 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 14 Mar 2025 10:08:29 +0000
Subject: [PATCH 34/64] fix(deps): update dependency scratch-storage to ^4.0.79

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 2b284e052..ad49bc038 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.78"
+        "scratch-storage": "^4.0.79"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.79",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.79.tgz",
-      "integrity": "sha512-ULCvNZUEWdJKVx3HYzOJpIFHOqgxX3rbXYQ5cbOY3t5moklLt2vTJAYVXZ+dQ5VzD8EUdJmWamtlexYr0BE0Lg==",
+      "version": "4.0.80",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.80.tgz",
+      "integrity": "sha512-T1oMwDCBVqm6wUuYyko+mDomr1BCvITKG+TtTo8MACYM1tuZv2ZbPWnypNphuqGD79olSkZ7VLCYH4MoM3fE3Q==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index d6987a563..c736bfe76 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.78"
+    "scratch-storage": "^4.0.79"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From fe8fbec845de405ca11de7a63849d1943e1216e8 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 14 Mar 2025 18:50:05 +0000
Subject: [PATCH 35/64] chore(deps): update babel monorepo to v7.26.10

---
 package-lock.json | 70 +++++++++++++++++++++++------------------------
 package.json      |  4 +--
 2 files changed, 37 insertions(+), 37 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index ad49bc038..d5040b186 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -27,8 +27,8 @@
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
-        "@babel/core": "7.26.9",
-        "@babel/eslint-parser": "7.26.8",
+        "@babel/core": "7.26.10",
+        "@babel/eslint-parser": "7.26.10",
         "@babel/plugin-syntax-dynamic-import": "7.8.3",
         "@babel/plugin-transform-async-to-generator": "7.25.9",
         "@babel/plugin-transform-object-rest-spread": "7.25.9",
@@ -240,22 +240,22 @@
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.26.9",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz",
-      "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==",
+      "version": "7.26.10",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz",
+      "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
         "@babel/code-frame": "^7.26.2",
-        "@babel/generator": "^7.26.9",
+        "@babel/generator": "^7.26.10",
         "@babel/helper-compilation-targets": "^7.26.5",
         "@babel/helper-module-transforms": "^7.26.0",
-        "@babel/helpers": "^7.26.9",
-        "@babel/parser": "^7.26.9",
+        "@babel/helpers": "^7.26.10",
+        "@babel/parser": "^7.26.10",
         "@babel/template": "^7.26.9",
-        "@babel/traverse": "^7.26.9",
-        "@babel/types": "^7.26.9",
+        "@babel/traverse": "^7.26.10",
+        "@babel/types": "^7.26.10",
         "convert-source-map": "^2.0.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
@@ -271,9 +271,9 @@
       }
     },
     "node_modules/@babel/eslint-parser": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.26.8.tgz",
-      "integrity": "sha512-3tBctaHRW6xSub26z7n8uyOTwwUsCdvIug/oxBH9n6yCO5hMj2vwDJAo7RbBMKrM7P+W2j61zLKviJQFGOYKMg==",
+      "version": "7.26.10",
+      "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.26.10.tgz",
+      "integrity": "sha512-QsfQZr4AiLpKqn7fz+j7SN+f43z2DZCgGyYbNJ2vJOqKfG4E6MZer1+jqGZqKJaxq/gdO2DC/nUu45+pOL5p2Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -290,14 +290,14 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.26.9",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz",
-      "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==",
+      "version": "7.26.10",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz",
+      "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@babel/parser": "^7.26.9",
-        "@babel/types": "^7.26.9",
+        "@babel/parser": "^7.26.10",
+        "@babel/types": "^7.26.10",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^3.0.2"
@@ -558,27 +558,27 @@
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.26.9",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz",
-      "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==",
+      "version": "7.26.10",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz",
+      "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@babel/template": "^7.26.9",
-        "@babel/types": "^7.26.9"
+        "@babel/types": "^7.26.10"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.26.9",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz",
-      "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==",
+      "version": "7.26.10",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz",
+      "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.26.9"
+        "@babel/types": "^7.26.10"
       },
       "bin": {
         "parser": "bin/babel-parser.js"
@@ -2029,17 +2029,17 @@
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.26.9",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz",
-      "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==",
+      "version": "7.26.10",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz",
+      "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.26.2",
-        "@babel/generator": "^7.26.9",
-        "@babel/parser": "^7.26.9",
+        "@babel/generator": "^7.26.10",
+        "@babel/parser": "^7.26.10",
         "@babel/template": "^7.26.9",
-        "@babel/types": "^7.26.9",
+        "@babel/types": "^7.26.10",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
       },
@@ -2048,9 +2048,9 @@
       }
     },
     "node_modules/@babel/types": {
-      "version": "7.26.9",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz",
-      "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==",
+      "version": "7.26.10",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz",
+      "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
diff --git a/package.json b/package.json
index c736bfe76..b6aefdc27 100644
--- a/package.json
+++ b/package.json
@@ -62,8 +62,8 @@
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",
-    "@babel/core": "7.26.9",
-    "@babel/eslint-parser": "7.26.8",
+    "@babel/core": "7.26.10",
+    "@babel/eslint-parser": "7.26.10",
     "@babel/plugin-syntax-dynamic-import": "7.8.3",
     "@babel/plugin-transform-async-to-generator": "7.25.9",
     "@babel/plugin-transform-object-rest-spread": "7.25.9",

From 14e50fecae81cc0b7bac8acb1892cfba6eb43a94 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sat, 15 Mar 2025 10:29:08 +0000
Subject: [PATCH 36/64] fix(deps): update dependency scratch-l10n to v5.0.165

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index d5040b186..159f6df02 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.85.1",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.163",
+        "scratch-l10n": "5.0.165",
         "selenium-webdriver": "4.29.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.163",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.163.tgz",
-      "integrity": "sha512-vgnZ8IFZo0jsYPfD6eV8Qq8y2ekNWx67x6X6o3PIJ/Q3TcYRzjWdur3RgzuvZtS8795iJTngWJgxNvw+akSn6Q==",
+      "version": "5.0.165",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.165.tgz",
+      "integrity": "sha512-q1acbS/5zR3fD9yFVS2TMqzv5X7A7fwYjWcAVLLCCETJVXGB8+VP3HhqGjhQ9zg8V5kgaHRzq4APtxcAkzikqA==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index b6aefdc27..b056d881a 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.85.1",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.163",
+    "scratch-l10n": "5.0.165",
     "selenium-webdriver": "4.29.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From b218fc23c70dd40aa9eed75acc9dfcff5652fda6 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sat, 15 Mar 2025 13:11:23 +0000
Subject: [PATCH 37/64] fix(deps): update dependency scratch-storage to ^4.0.80

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 159f6df02..fbcabfc49 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.79"
+        "scratch-storage": "^4.0.80"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.80",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.80.tgz",
-      "integrity": "sha512-T1oMwDCBVqm6wUuYyko+mDomr1BCvITKG+TtTo8MACYM1tuZv2ZbPWnypNphuqGD79olSkZ7VLCYH4MoM3fE3Q==",
+      "version": "4.0.81",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.81.tgz",
+      "integrity": "sha512-mUrbLeMcO/s6/M6Aioa+x905ARFDrXlLCSYdXTJ1q8xd7YlQo2rfqx0euuq4q0dUgObIPolbLi8DXdP2s9Wrbg==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index b056d881a..dcd0bbcda 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.79"
+    "scratch-storage": "^4.0.80"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From 1b808468fb134270cb100d958cca8236bd4fc426 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sun, 16 Mar 2025 06:39:21 +0000
Subject: [PATCH 38/64] fix(deps): update dependency scratch-l10n to v5.0.167

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index fbcabfc49..48034396d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.85.1",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.165",
+        "scratch-l10n": "5.0.167",
         "selenium-webdriver": "4.29.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.165",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.165.tgz",
-      "integrity": "sha512-q1acbS/5zR3fD9yFVS2TMqzv5X7A7fwYjWcAVLLCCETJVXGB8+VP3HhqGjhQ9zg8V5kgaHRzq4APtxcAkzikqA==",
+      "version": "5.0.167",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.167.tgz",
+      "integrity": "sha512-pksZuW9qfirGGsDtZqRbnc76QbqFYzQvRJEOb2V9Bq6udbYUusLGaR3ylGFoNtlwsrdRlFDkMu5QIZN6S8nY5w==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index dcd0bbcda..3f150a769 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.85.1",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.165",
+    "scratch-l10n": "5.0.167",
     "selenium-webdriver": "4.29.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From 49c7cd670dd28d8981c365ba3b2c30c177ada1a4 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sun, 16 Mar 2025 10:06:42 +0000
Subject: [PATCH 39/64] fix(deps): update dependency scratch-storage to ^4.0.81

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 48034396d..247aebbaa 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.80"
+        "scratch-storage": "^4.0.81"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.81",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.81.tgz",
-      "integrity": "sha512-mUrbLeMcO/s6/M6Aioa+x905ARFDrXlLCSYdXTJ1q8xd7YlQo2rfqx0euuq4q0dUgObIPolbLi8DXdP2s9Wrbg==",
+      "version": "4.0.83",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.83.tgz",
+      "integrity": "sha512-ycHDGoc45/IRzbLHzjPoi+XS3uhFLvwpxbU6r4oNBRGGvigvHkrPExIWWbHxR6jJO+MOdtL8EEBf6SJUY6bR/w==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index 3f150a769..a37d4efff 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.80"
+    "scratch-storage": "^4.0.81"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From 7c200262e0387027461f247f272d15acaab6c9e7 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 17 Mar 2025 05:33:16 +0000
Subject: [PATCH 40/64] fix(deps): update dependency scratch-l10n to v5.0.168

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 247aebbaa..4083b765e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.85.1",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.167",
+        "scratch-l10n": "5.0.168",
         "selenium-webdriver": "4.29.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.167",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.167.tgz",
-      "integrity": "sha512-pksZuW9qfirGGsDtZqRbnc76QbqFYzQvRJEOb2V9Bq6udbYUusLGaR3ylGFoNtlwsrdRlFDkMu5QIZN6S8nY5w==",
+      "version": "5.0.168",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.168.tgz",
+      "integrity": "sha512-q0cAXLe2D2zyGqiT9haVyT0B8fqMSzlkzX/1T5jD1Etvi1LZQCZtsfmH+bGXdgzaWq95RQK0EBRgtzw1aJVFAA==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index a37d4efff..de142cd9b 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.85.1",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.167",
+    "scratch-l10n": "5.0.168",
     "selenium-webdriver": "4.29.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From e7b14efc2fdabc2ed786f1e35986d92651933008 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 18 Mar 2025 07:13:53 +0000
Subject: [PATCH 41/64] fix(deps): update dependency scratch-l10n to v5.0.170

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 4083b765e..7475bbfd9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.85.1",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.168",
+        "scratch-l10n": "5.0.170",
         "selenium-webdriver": "4.29.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.168",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.168.tgz",
-      "integrity": "sha512-q0cAXLe2D2zyGqiT9haVyT0B8fqMSzlkzX/1T5jD1Etvi1LZQCZtsfmH+bGXdgzaWq95RQK0EBRgtzw1aJVFAA==",
+      "version": "5.0.170",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.170.tgz",
+      "integrity": "sha512-rGH5IIn8edFwgWd94+7gek2a8W1eBToyBxPRf9JZugiwE4sV/sIDt4SFfs9zam54LDMSeVL1K42hEtFuYqH6rg==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index de142cd9b..29ee627d7 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.85.1",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.168",
+    "scratch-l10n": "5.0.170",
     "selenium-webdriver": "4.29.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From 5bc442b490ce519f7b54a903f6afa70e90f819d9 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 18 Mar 2025 10:35:55 +0000
Subject: [PATCH 42/64] fix(deps): update dependency scratch-storage to ^4.0.83

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 7475bbfd9..c738da792 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.81"
+        "scratch-storage": "^4.0.83"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.83",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.83.tgz",
-      "integrity": "sha512-ycHDGoc45/IRzbLHzjPoi+XS3uhFLvwpxbU6r4oNBRGGvigvHkrPExIWWbHxR6jJO+MOdtL8EEBf6SJUY6bR/w==",
+      "version": "4.0.84",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.84.tgz",
+      "integrity": "sha512-DwqFY7PTFl/nZAFR6Z0j0shrnhS9n+8BL2jspPMXAqZDn0QtDnkBzAdBzWjivqYYEilzlCOxzpASpsrQ2sO6Ag==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index 29ee627d7..6d158515c 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.81"
+    "scratch-storage": "^4.0.83"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From 22ae727a28d2fb7673c08b987f8026438bdbc331 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 19 Mar 2025 10:16:01 +0000
Subject: [PATCH 43/64] fix(deps): update dependency scratch-l10n to v5.0.172

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index c738da792..e9dc8dd9f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.85.1",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.170",
+        "scratch-l10n": "5.0.172",
         "selenium-webdriver": "4.29.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.170",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.170.tgz",
-      "integrity": "sha512-rGH5IIn8edFwgWd94+7gek2a8W1eBToyBxPRf9JZugiwE4sV/sIDt4SFfs9zam54LDMSeVL1K42hEtFuYqH6rg==",
+      "version": "5.0.172",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.172.tgz",
+      "integrity": "sha512-SVvyZIQYuf85yUsZ6vPjm9Xi5/D/J+Q7kJWTV9Puhu0oR8WEiOVy0vWJqAWDzePj3OcruCkhuA1OAZG2A6FfQg==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index 6d158515c..48d3de53a 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.85.1",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.170",
+    "scratch-l10n": "5.0.172",
     "selenium-webdriver": "4.29.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From 68bae4418752aad5301630355ce95c6e693498d3 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 19 Mar 2025 17:05:27 +0000
Subject: [PATCH 44/64] fix(deps): update dependency scratch-storage to ^4.0.84

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index e9dc8dd9f..69a9a7e31 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.83"
+        "scratch-storage": "^4.0.84"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.84",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.84.tgz",
-      "integrity": "sha512-DwqFY7PTFl/nZAFR6Z0j0shrnhS9n+8BL2jspPMXAqZDn0QtDnkBzAdBzWjivqYYEilzlCOxzpASpsrQ2sO6Ag==",
+      "version": "4.0.85",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.85.tgz",
+      "integrity": "sha512-sniKaDJFsxJnYA4BSDHImKO71mAu8c229JCnCQK0XpHz6SAGmHIqT4L5Rkca6TSjvFyOdnzK+j54kA7U8CSc2Q==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index 48d3de53a..82395084a 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.83"
+    "scratch-storage": "^4.0.84"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From c18c46b76f9e37ecfe9a63885fdaebdcc8c2b1e4 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 20 Mar 2025 12:12:23 +0000
Subject: [PATCH 45/64] fix(deps): update dependency scratch-l10n to v5.0.173

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 69a9a7e31..e1ce3f64e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.85.1",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.172",
+        "scratch-l10n": "5.0.173",
         "selenium-webdriver": "4.29.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.172",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.172.tgz",
-      "integrity": "sha512-SVvyZIQYuf85yUsZ6vPjm9Xi5/D/J+Q7kJWTV9Puhu0oR8WEiOVy0vWJqAWDzePj3OcruCkhuA1OAZG2A6FfQg==",
+      "version": "5.0.173",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.173.tgz",
+      "integrity": "sha512-3h+fI810tgHxF00+fStATlV79VJEHiOaHpruSI3j0duryBxkqB7QrJGv6+UKgq59nEltaOgz9AiTgyiY3X6zWw==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index 82395084a..a9da59572 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.85.1",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.172",
+    "scratch-l10n": "5.0.173",
     "selenium-webdriver": "4.29.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From dd360142f9e9997f12f94017dc5c118306e3fa0c Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 20 Mar 2025 15:49:03 +0000
Subject: [PATCH 46/64] fix(deps): update dependency scratch-storage to ^4.0.85

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index e1ce3f64e..e06c7670e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.84"
+        "scratch-storage": "^4.0.85"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.85",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.85.tgz",
-      "integrity": "sha512-sniKaDJFsxJnYA4BSDHImKO71mAu8c229JCnCQK0XpHz6SAGmHIqT4L5Rkca6TSjvFyOdnzK+j54kA7U8CSc2Q==",
+      "version": "4.0.86",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.86.tgz",
+      "integrity": "sha512-dUXJ7xSzYweTYmV0FQuUOgA6H6cwdteAHxUavJfMLxiLFxDpHXk5CuzO6tS9RZHt7+7F0+Lxyry9tpWpwAYteQ==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index a9da59572..a4a78efbc 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.84"
+    "scratch-storage": "^4.0.85"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From 218169d447ec61fb4dc79ac96ba0c8f4f7e08c2e Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 02:40:39 +0000
Subject: [PATCH 47/64] chore(deps): update dependency sass to v1.86.0

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index e06c7670e..5a9aa488c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -110,7 +110,7 @@
         "redux-mock-store": "1.5.5",
         "redux-thunk": "2.4.2",
         "regenerator-runtime": "0.13.9",
-        "sass": "1.85.1",
+        "sass": "1.86.0",
         "sass-loader": "10.5.2",
         "scratch-l10n": "5.0.173",
         "selenium-webdriver": "4.29.0",
@@ -22555,9 +22555,9 @@
       "license": "MIT"
     },
     "node_modules/sass": {
-      "version": "1.85.1",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.1.tgz",
-      "integrity": "sha512-Uk8WpxM5v+0cMR0XjX9KfRIacmSG86RH4DCCZjLU2rFh5tyutt9siAXJ7G+YfxQ99Q6wrRMbMlVl6KqUms71ag==",
+      "version": "1.86.0",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.0.tgz",
+      "integrity": "sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
diff --git a/package.json b/package.json
index a4a78efbc..6bafb8ca3 100644
--- a/package.json
+++ b/package.json
@@ -145,7 +145,7 @@
     "redux-mock-store": "1.5.5",
     "redux-thunk": "2.4.2",
     "regenerator-runtime": "0.13.9",
-    "sass": "1.85.1",
+    "sass": "1.86.0",
     "sass-loader": "10.5.2",
     "scratch-l10n": "5.0.173",
     "selenium-webdriver": "4.29.0",

From fc838dd904279906e12cb3fc82885482658e12a8 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 12:08:34 +0000
Subject: [PATCH 48/64] fix(deps): update dependency scratch-l10n to v5.0.174

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 5a9aa488c..f953cba27 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.86.0",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.173",
+        "scratch-l10n": "5.0.174",
         "selenium-webdriver": "4.29.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.173",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.173.tgz",
-      "integrity": "sha512-3h+fI810tgHxF00+fStATlV79VJEHiOaHpruSI3j0duryBxkqB7QrJGv6+UKgq59nEltaOgz9AiTgyiY3X6zWw==",
+      "version": "5.0.174",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.174.tgz",
+      "integrity": "sha512-FVfznilqFd/iQ0S+Ml2alpwkVss7ALYe2DBh8GP9y86RcKovSIecZZY+9q/bI3H3oYONOhpGqbsNqzXFcRayxw==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index 6bafb8ca3..38d8fea5f 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.86.0",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.173",
+    "scratch-l10n": "5.0.174",
     "selenium-webdriver": "4.29.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From 2446ff3f1046db74265381fb87fc7bdd1d0f58b4 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Fri, 21 Mar 2025 16:13:38 +0000
Subject: [PATCH 49/64] fix(deps): update dependency scratch-storage to ^4.0.86

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index f953cba27..9b7f5f0eb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.85"
+        "scratch-storage": "^4.0.86"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.86",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.86.tgz",
-      "integrity": "sha512-dUXJ7xSzYweTYmV0FQuUOgA6H6cwdteAHxUavJfMLxiLFxDpHXk5CuzO6tS9RZHt7+7F0+Lxyry9tpWpwAYteQ==",
+      "version": "4.0.87",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.87.tgz",
+      "integrity": "sha512-hXWbZGcDIG2KDlmHm+0Tzv9XXx1b38/YK/6eBXMv6TgYSoJpDtQpSc1PYQoZBSUIJiXtWenUtLgoQm+xU6JFuQ==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index 38d8fea5f..a2d5a22a6 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.85"
+    "scratch-storage": "^4.0.86"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From 1d8d1e520f13b81b519c80430cef341dd5d8f95f Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sat, 22 Mar 2025 09:26:21 +0000
Subject: [PATCH 50/64] fix(deps): update dependency scratch-storage to ^4.0.87

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 9b7f5f0eb..af24b8459 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.86"
+        "scratch-storage": "^4.0.87"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.87",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.87.tgz",
-      "integrity": "sha512-hXWbZGcDIG2KDlmHm+0Tzv9XXx1b38/YK/6eBXMv6TgYSoJpDtQpSc1PYQoZBSUIJiXtWenUtLgoQm+xU6JFuQ==",
+      "version": "4.0.88",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.88.tgz",
+      "integrity": "sha512-NL5TaO4zfbvqtUXwrok7g/zTAw84p3Rvu//eFcoosAGMzADumyqR5eXW5yeC7SqO/q4YA4+ozIUmkzGsF8c3vw==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index a2d5a22a6..cba798c13 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.86"
+    "scratch-storage": "^4.0.87"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From b12d0403cd81eda487dd376ebe198546e319bc19 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sat, 22 Mar 2025 14:39:37 +0000
Subject: [PATCH 51/64] fix(deps): update dependency scratch-l10n to v5.0.176

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index af24b8459..427ddf056 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.86.0",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.174",
+        "scratch-l10n": "5.0.176",
         "selenium-webdriver": "4.29.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.174",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.174.tgz",
-      "integrity": "sha512-FVfznilqFd/iQ0S+Ml2alpwkVss7ALYe2DBh8GP9y86RcKovSIecZZY+9q/bI3H3oYONOhpGqbsNqzXFcRayxw==",
+      "version": "5.0.176",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.176.tgz",
+      "integrity": "sha512-heD4dUVR+FBZtpcOiMTDxXdrUTVvX8OS+Y2kvQOyWLXc/fFTzQOBhh/IaxiTiixyKOwp8Suiz/kD+J/q0xGnUA==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index cba798c13..66a261b76 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.86.0",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.174",
+    "scratch-l10n": "5.0.176",
     "selenium-webdriver": "4.29.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From f470e9c7e95f5837d8450d7d6d8b47934ed4e61e Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sun, 23 Mar 2025 06:42:40 +0000
Subject: [PATCH 52/64] fix(deps): update dependency scratch-storage to ^4.0.88

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 427ddf056..158720134 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.87"
+        "scratch-storage": "^4.0.88"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.88",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.88.tgz",
-      "integrity": "sha512-NL5TaO4zfbvqtUXwrok7g/zTAw84p3Rvu//eFcoosAGMzADumyqR5eXW5yeC7SqO/q4YA4+ozIUmkzGsF8c3vw==",
+      "version": "4.0.89",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.89.tgz",
+      "integrity": "sha512-ZacBMSa1RhiAV5p7d1027750eOSoPqDQfXP+xS2sjzGHM/MLe4zjr3W9gDdvFvQl6rIinDTBGXhsnVOmoob58g==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index 66a261b76..3b32c7c6e 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.87"
+    "scratch-storage": "^4.0.88"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From 9ed06c625ce17a5b251dd103ff08332d906b20d4 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 24 Mar 2025 07:11:55 +0000
Subject: [PATCH 53/64] fix(deps): update dependency scratch-l10n to v5.0.178

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 158720134..e382cc8f0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.86.0",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.176",
+        "scratch-l10n": "5.0.178",
         "selenium-webdriver": "4.29.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.176",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.176.tgz",
-      "integrity": "sha512-heD4dUVR+FBZtpcOiMTDxXdrUTVvX8OS+Y2kvQOyWLXc/fFTzQOBhh/IaxiTiixyKOwp8Suiz/kD+J/q0xGnUA==",
+      "version": "5.0.178",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.178.tgz",
+      "integrity": "sha512-WIjViLNGpsX44rg+njWQ2KACeZ8Lg8BSoANSG0DXQJcZWm5zJoxWERLsP4rekbpP87aSMK1ZTrhdfdlwFc+CqA==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index 3b32c7c6e..3ce1af663 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.86.0",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.176",
+    "scratch-l10n": "5.0.178",
     "selenium-webdriver": "4.29.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From 489ff782dc5e32eb6336eed0fd729ff5a9716300 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 24 Mar 2025 13:11:21 +0000
Subject: [PATCH 54/64] fix(deps): update dependency scratch-storage to ^4.0.89

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index e382cc8f0..6e4490314 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.88"
+        "scratch-storage": "^4.0.89"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.89",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.89.tgz",
-      "integrity": "sha512-ZacBMSa1RhiAV5p7d1027750eOSoPqDQfXP+xS2sjzGHM/MLe4zjr3W9gDdvFvQl6rIinDTBGXhsnVOmoob58g==",
+      "version": "4.0.90",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.90.tgz",
+      "integrity": "sha512-CZm9UI0t551V34fifoNc3XOTOAIkwbP0dQJUOaeXpE/rxn27ofjcqrcwAEwXpBtMsOqKUIZyNLL/yOMW163VKw==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index 3ce1af663..1f3dd08ca 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.88"
+    "scratch-storage": "^4.0.89"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From d80e534f14c31e478e22bbcc6cd5b7acbc21c4e3 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 24 Mar 2025 22:41:52 +0000
Subject: [PATCH 55/64] chore(deps): update dependency selenium-webdriver to
 v4.30.0

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 6e4490314..c45b3908b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -113,7 +113,7 @@
         "sass": "1.86.0",
         "sass-loader": "10.5.2",
         "scratch-l10n": "5.0.178",
-        "selenium-webdriver": "4.29.0",
+        "selenium-webdriver": "4.30.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
         "style-loader": "4.0.0",
@@ -23043,9 +23043,9 @@
       "license": "MIT"
     },
     "node_modules/selenium-webdriver": {
-      "version": "4.29.0",
-      "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.29.0.tgz",
-      "integrity": "sha512-8XPGtDoji5xk7ZUCzFT1rqHmCp67DCzESsttId7DzmrJmlTRmRLF6X918rbwclcH89amcBNM4zB3lVPj404I0g==",
+      "version": "4.30.0",
+      "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.30.0.tgz",
+      "integrity": "sha512-3DGtQI/xyAg05SrqzzpFaXRWYL+Kku3fsikCoBaxApKzhBMUX5UiHdPb2je2qKMf2PjJiEFaj0L5xELHYRbYMA==",
       "dev": true,
       "funding": [
         {
diff --git a/package.json b/package.json
index 1f3dd08ca..12e74ccab 100644
--- a/package.json
+++ b/package.json
@@ -148,7 +148,7 @@
     "sass": "1.86.0",
     "sass-loader": "10.5.2",
     "scratch-l10n": "5.0.178",
-    "selenium-webdriver": "4.29.0",
+    "selenium-webdriver": "4.30.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",
     "style-loader": "4.0.0",

From f24ea8cb8686af245d11ce360eeb35d225169779 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 25 Mar 2025 07:15:19 +0000
Subject: [PATCH 56/64] fix(deps): update dependency scratch-storage to ^4.0.90

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index c45b3908b..eea1af6fc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.89"
+        "scratch-storage": "^4.0.90"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.90",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.90.tgz",
-      "integrity": "sha512-CZm9UI0t551V34fifoNc3XOTOAIkwbP0dQJUOaeXpE/rxn27ofjcqrcwAEwXpBtMsOqKUIZyNLL/yOMW163VKw==",
+      "version": "4.0.91",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.91.tgz",
+      "integrity": "sha512-dEEWxxvQrSKXO+jHpJogCWXCDUFRjMNb7BjCt0857xzlXCy5ja2b+YpR9qkS4wzRk973paWRhsQrUWYqnUgHKg==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index 12e74ccab..38fdf6e82 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.89"
+    "scratch-storage": "^4.0.90"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",

From a8e005e9067161e325957502587db016aa67c0e9 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 25 Mar 2025 09:08:10 +0000
Subject: [PATCH 57/64] fix(deps): update dependency scratch-l10n to v5.0.179

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index eea1af6fc..b38b2860e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.86.0",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.178",
+        "scratch-l10n": "5.0.179",
         "selenium-webdriver": "4.30.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.178",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.178.tgz",
-      "integrity": "sha512-WIjViLNGpsX44rg+njWQ2KACeZ8Lg8BSoANSG0DXQJcZWm5zJoxWERLsP4rekbpP87aSMK1ZTrhdfdlwFc+CqA==",
+      "version": "5.0.179",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.179.tgz",
+      "integrity": "sha512-dry7DPNxIkmpSEViVwHTZKR+/vddkTBOzviS9PdX/zKiBgUtv+Kq+DdNWeszAR3ZEIis7+TNwXRCVaQ/lXfdLA==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index 38fdf6e82..af3583491 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.86.0",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.178",
+    "scratch-l10n": "5.0.179",
     "selenium-webdriver": "4.30.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From a7d614034d0cf98260b947cf783cb7a396f2db81 Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Tue, 25 Mar 2025 07:54:45 -0700
Subject: [PATCH 58/64] ci: remove workflow_run CI/CD trigger, add deploy info

The `workflow_run` trigger ran this workflow at the right time but not
in the right place. It correctly ran after the release branch creation
workflow finished, but it ran in the branch selected in the GitHub UI.
That branch can't be the release branch since it doesn't exist at that
time.
---
 .github/workflows/ci-cd.yml | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index a82c76393..b7d522120 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -3,12 +3,8 @@ name: CI/CD
 on:
   pull_request: # Runs whenever a pull request is created or updated
   push: # Runs whenever a commit is pushed to the repository
-    branches: [master, develop, beta, hotfix/*] # ...on any of these branches
+    branches: [master, develop, beta, hotfix/*, release/*] # ...on any of these branches
   workflow_dispatch: # Allows you to run this workflow manually from the Actions tab
-  workflow_run: # Runs whenever another workflow is run
-    workflows: ["Create release branch and PRs"] # ...specifically, when this workflow is run
-    types:
-      - completed # ...after it completes
 
 concurrency:
   group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}'
@@ -136,6 +132,13 @@ jobs:
       - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
         with:
           node-version-file: '.nvmrc'
+      - name: info
+        run: |
+          cat <<EOF
+          Scratch environment: ${SCRATCH_ENV}
+          Node version: $(node --version)
+          NPM version: $(npm --version)
+          EOF
       - name: retrieve node_modules
         uses: actions/cache/restore@v4
         with:

From 75c7aa8a0b2111adcc100673b9cbdd7b58947fe6 Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Tue, 25 Mar 2025 09:29:20 -0700
Subject: [PATCH 59/64] ci: use workflow_call in prepare-release to run ci-cd

---
 .github/workflows/ci-cd.yml           | 14 +++++++++++++-
 .github/workflows/prepare-release.yml |  7 +++++--
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index b7d522120..77d7929e9 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -3,7 +3,13 @@ name: CI/CD
 on:
   pull_request: # Runs whenever a pull request is created or updated
   push: # Runs whenever a commit is pushed to the repository
-    branches: [master, develop, beta, hotfix/*, release/*] # ...on any of these branches
+    branches: [master, develop, beta, hotfix/*] # ...on any of these branches
+  workflow_call: # Runs whenever another workflow calls this workflow
+    inputs:
+      ref:
+        description: 'The branch or other ref to run this workflow on'
+        type: string
+        required: true
   workflow_dispatch: # Allows you to run this workflow manually from the Actions tab
 
 concurrency:
@@ -55,6 +61,8 @@ jobs:
       SCRATCH_SHOULD_DEPLOY: ${{ needs.set-environment.outputs.should_deploy }}
     steps:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
+        with:
+          ref: ${{ inputs.ref }} # this should be empty to use `checkout`'s default UNLESS provided by workflow_call
       - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
         with:
           cache: 'npm'
@@ -129,6 +137,8 @@ jobs:
     if: ${{ needs.set-environment.outputs.should_deploy == 'true' }}
     steps:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
+        with:
+          ref: ${{ inputs.ref }} # this should be empty to use `checkout`'s default UNLESS provided by workflow_call
       - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
         with:
           node-version-file: '.nvmrc'
@@ -190,6 +200,8 @@ jobs:
     if: ${{ needs.set-environment.outputs.environment == 'production' }}
     steps:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
+        with:
+          ref: ${{ inputs.ref }} # this should be empty to use `checkout`'s default UNLESS provided by workflow_call
       - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4
         with:
           node-version-file: '.nvmrc'
diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml
index f6a8f00f9..9900c3957 100644
--- a/.github/workflows/prepare-release.yml
+++ b/.github/workflows/prepare-release.yml
@@ -1,6 +1,6 @@
 name: Create release branch and PRs
 
-# Controls when the action will run. 
+# Controls when the action will run.
 on:
   # Allows you to run this workflow manually from the Actions tab
   workflow_dispatch:
@@ -47,4 +47,7 @@ jobs:
           pr_title: "[Master] ${{ steps.vars.outputs.branch }}"
           github_token: ${{ secrets.GITHUB_TOKEN }}
           pr_allow_empty: true
-
+      - name: Call CI/CD workflow
+        uses: ./.github/workflows/ci-cd.yml
+        with:
+          ref: ${{ steps.vars.outputs.branch }}

From 36786c511a49177dd5a6aae0fb26288d67b4c1c2 Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Tue, 25 Mar 2025 09:38:56 -0700
Subject: [PATCH 60/64] ci: oops, calling a workflow needs to be a job, not a
 step

---
 .github/workflows/prepare-release.yml | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml
index 9900c3957..923af6cad 100644
--- a/.github/workflows/prepare-release.yml
+++ b/.github/workflows/prepare-release.yml
@@ -12,6 +12,9 @@ jobs:
     # The type of runner that the job will run on
     runs-on: ubuntu-latest
 
+    outputs:
+      branch: ${{ steps.vars.outputs.branch }}
+
     # Steps represent a sequence of tasks that will be executed as part of the job
     steps:
       # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
@@ -47,7 +50,9 @@ jobs:
           pr_title: "[Master] ${{ steps.vars.outputs.branch }}"
           github_token: ${{ secrets.GITHUB_TOKEN }}
           pr_allow_empty: true
-      - name: Call CI/CD workflow
-        uses: ./.github/workflows/ci-cd.yml
-        with:
-          ref: ${{ steps.vars.outputs.branch }}
+  call-ci-cd:
+    name: Call CI/CD workflow
+    needs: build
+    uses: ./.github/workflows/ci-cd.yml
+    with:
+      ref: ${{ needs.build.outputs.branch }}

From 7e2ef1a92c7c0801339803658d4d62262d0a5f31 Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Tue, 25 Mar 2025 09:49:32 -0700
Subject: [PATCH 61/64] ci: inherit secrets when prepare-release calls ci-ci

---
 .github/workflows/prepare-release.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml
index 923af6cad..f09e9f307 100644
--- a/.github/workflows/prepare-release.yml
+++ b/.github/workflows/prepare-release.yml
@@ -54,5 +54,6 @@ jobs:
     name: Call CI/CD workflow
     needs: build
     uses: ./.github/workflows/ci-cd.yml
+    secrets: inherit
     with:
       ref: ${{ needs.build.outputs.branch }}

From d3fedf5882f348caea77615cf95abd8abb195d94 Mon Sep 17 00:00:00 2001
From: Christopher Willis-Ford <7019101+cwillisf@users.noreply.github.com>
Date: Tue, 25 Mar 2025 10:01:38 -0700
Subject: [PATCH 62/64] ci: fix SCRATCH_ENV debug info in the deploy job

---
 .github/workflows/ci-cd.yml | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index 77d7929e9..92ca3420f 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -134,6 +134,8 @@ jobs:
     runs-on: ubuntu-latest
     needs: [set-environment, build]
     environment: ${{ needs.set-environment.outputs.environment }}
+    env:
+      SCRATCH_ENV: ${{ needs.set-environment.outputs.environment }}
     if: ${{ needs.set-environment.outputs.should_deploy == 'true' }}
     steps:
       - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4
@@ -175,6 +177,7 @@ jobs:
           ls -lRh artifacts/
           tar -xavf artifacts/build.tar.zst
       - name: deploy
+        # This also uses SCRATCH_ENV, defined at the job level
         run: npm run deploy
         env:
           S3_LOCAL_DIR: build
@@ -184,7 +187,6 @@ jobs:
           FASTLY_API_KEY: ${{ secrets.FASTLY_API_KEY }}
           FASTLY_SERVICE_ID: ${{ secrets.FASTLY_SERVICE_ID }}
           SCRATCH_BRANCH: ${{ github.ref_name }}
-          SCRATCH_ENV: ${{ needs.set-environment.outputs.environment }}
           SLACK_WEBHOOK_CIRCLECI_NOTIFICATIONS: ${{ secrets.SLACK_WEBHOOK_CIRCLECI_NOTIFICATIONS }} # TODO: rename or replace
           SLACK_WEBHOOK_ENGINEERING: ${{ secrets.SLACK_WEBHOOK_ENGINEERING }}
           SLACK_WEBHOOK_MODS: ${{ secrets.SLACK_WEBHOOK_MODS }}

From e4a46adad112e8da79a6c52cf16e8dee7d47cba2 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 26 Mar 2025 07:11:26 +0000
Subject: [PATCH 63/64] fix(deps): update dependency scratch-l10n to v5.0.180

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index b38b2860e..b8f7e70ee 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -112,7 +112,7 @@
         "regenerator-runtime": "0.13.9",
         "sass": "1.86.0",
         "sass-loader": "10.5.2",
-        "scratch-l10n": "5.0.179",
+        "scratch-l10n": "5.0.180",
         "selenium-webdriver": "4.30.0",
         "slick-carousel": "1.8.1",
         "stream-browserify": "3.0.0",
@@ -22836,9 +22836,9 @@
       }
     },
     "node_modules/scratch-l10n": {
-      "version": "5.0.179",
-      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.179.tgz",
-      "integrity": "sha512-dry7DPNxIkmpSEViVwHTZKR+/vddkTBOzviS9PdX/zKiBgUtv+Kq+DdNWeszAR3ZEIis7+TNwXRCVaQ/lXfdLA==",
+      "version": "5.0.180",
+      "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.180.tgz",
+      "integrity": "sha512-o7V5dV3ldrTrPF/YwijUBwBCN+KZ2cj7EBa3KSHrhjtF5UpazKavv3TgXWFfBMHh5Gp5ZfljMnfdyyhBPh9sZw==",
       "dev": true,
       "license": "AGPL-3.0-only",
       "dependencies": {
diff --git a/package.json b/package.json
index af3583491..8c772218e 100644
--- a/package.json
+++ b/package.json
@@ -147,7 +147,7 @@
     "regenerator-runtime": "0.13.9",
     "sass": "1.86.0",
     "sass-loader": "10.5.2",
-    "scratch-l10n": "5.0.179",
+    "scratch-l10n": "5.0.180",
     "selenium-webdriver": "4.30.0",
     "slick-carousel": "1.8.1",
     "stream-browserify": "3.0.0",

From 89f7d202d6aae019c80f5193c421470b09e49860 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 26 Mar 2025 12:44:44 +0000
Subject: [PATCH 64/64] fix(deps): update dependency scratch-storage to ^4.0.91

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index b8f7e70ee..54002f5db 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "react-twitter-embed": "3.0.3",
         "react-use": "17.6.0",
         "scratch-parser": "6.0.0",
-        "scratch-storage": "^4.0.90"
+        "scratch-storage": "^4.0.91"
       },
       "devDependencies": {
         "@babel/cli": "7.26.4",
@@ -22959,9 +22959,9 @@
       }
     },
     "node_modules/scratch-storage": {
-      "version": "4.0.91",
-      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.91.tgz",
-      "integrity": "sha512-dEEWxxvQrSKXO+jHpJogCWXCDUFRjMNb7BjCt0857xzlXCy5ja2b+YpR9qkS4wzRk973paWRhsQrUWYqnUgHKg==",
+      "version": "4.0.92",
+      "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.92.tgz",
+      "integrity": "sha512-OHv4A6pvzUopGJ0ATM6nQUZVoBVbw2VrZXZGpi7EFo9v32FVD6tv5mt7bI05MI6uJMJt1oPr7qbXQ1KhdtrTog==",
       "license": "AGPL-3.0-only",
       "dependencies": {
         "@babel/runtime": "^7.21.0",
diff --git a/package.json b/package.json
index 8c772218e..bb2aae4cf 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "react-twitter-embed": "3.0.3",
     "react-use": "17.6.0",
     "scratch-parser": "6.0.0",
-    "scratch-storage": "^4.0.90"
+    "scratch-storage": "^4.0.91"
   },
   "devDependencies": {
     "@babel/cli": "7.26.4",