diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 49871c2110f82b112bbb9b1c5c1477f24da00da6..16bbf56c9d7ba019719b67b601c6a0475406ca46 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,13 +1,26 @@
 stages:
-  - build_content
+  - build_js
+  - build_html
   - build_image
 
-build_content:
-  stage: build_content
+build_js:
+  stage: build_js
+  image: node:14
+  script:
+    - npm install --dev
+    - make js
+  artifacts:
+    paths:
+      - theme/static/
+
+build_html:
+  stage: build_html
+  dependencies:
+    - build_js
   image: python:3
   script:
     - pip install -r requirements.txt
-    - pelican content -o output -s pelicanconf.py
+    - make html
   artifacts:
     paths:
       - output/
@@ -15,7 +28,7 @@ build_content:
 build_image:
   stage: build_image
   dependencies:
-    - build_content
+    - build_html
   image:
     name: gcr.io/kaniko-project/executor:debug
     entrypoint: [""]
diff --git a/Makefile b/Makefile
index 69c5bafd18bc2f5536c61ae9c32295387abac1db..4447eb670e9223a99cd86909a7652f452d4c0a9d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,8 @@
+js:
+	npm run build
+
 html:
-	npm run build && pelican content -o output -s pelicanconf.py
+	pelican content -o output -s pelicanconf.py
 
 regenerate:
 	npm run build && pelican -r content -o output -s pelicanconf.py