diff --git a/node-scripts/generate-challenges-redirects.js b/node-scripts/generate-challenges-redirects.js
new file mode 100644
index 000000000..889e2d14d
--- /dev/null
+++ b/node-scripts/generate-challenges-redirects.js
@@ -0,0 +1,15 @@
+const { appendFileSync } = require('node:fs');
+const { slugs } = require('../content-testing/content');
+
+let challengesRedirects = '\n';
+slugs.challenges.forEach((slug) => {
+  const videoNumber = slug.split('-')[0];
+  challengesRedirects += `/${videoNumber} /challenges/${slug} 302!\n`;
+});
+
+const redirectsFilePath = './static/_redirects';
+appendFileSync(redirectsFilePath, challengesRedirects);
+
+console.log(
+  `${slugs.challenges.size} challenges redirects were appended to '${redirectsFilePath}'`
+);
diff --git a/package.json b/package.json
index fa9ad0d55..54ec4f8fb 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
   "scripts": {
     "dev": "gatsby develop -H 0.0.0.0",
     "build": "gatsby build --verbose",
-    "build-ci": "npm run tags-transforms && npm run build",
+    "build-ci": "node node-scripts/generate-challenges-redirects && npm run tags-transforms && npm run build",
     "serve": "gatsby serve",
     "clean": "gatsby clean",
     "test": "jest",
diff --git a/static/_redirects b/static/_redirects
index 3a726b796..a902a5d8b 100644
--- a/static/_redirects
+++ b/static/_redirects
@@ -27,7 +27,6 @@
 
 # shortcuts - 302
 
-
 /flock-view https://editor.p5js.org/codingtrain/sketches/fFNCIQw4e 302!
 /decade https://donorbox.org/to-the-power-of-10 302!
 /noc https://nostarch.com/nature-code 302!
@@ -62,7 +61,7 @@
 /p5js /tracks/code-programming-with-p5-js 302!
 /processing /tracks/learning-processing 302!
 /genuary1 https://editor.p5js.org/codingtrain/sketches/vN8EEr59I 302!
-/particles https://thecodingtrain.com/challenges/78-simple-particle-system 302!
-/ca https://thecodingtrain.com/challenges/179-wolfram-ca 302!
-/182 https://thecodingtrain.com/challenges/182-apollonian-gasket 302!
-/180 https://thecodingtrain.com/challenges/180-falling-sand 302!
+/particles /challenges/78-simple-particle-system 302!
+/ca /challenges/179-wolfram-ca 302!
+
+# challenges shortcuts will be appended to this file at build time as /{videoNumber} -> /challenges/{slug}