diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8d23bbed929b205dbcdeeb6b53cc47aa2b8e759e
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,49 @@
+variables:
+  GIT_SUBMODULE_STRATEGY: normal
+
+sagetex-sty-copy:
+  image: 
+    name: docker.io/sagemath/sagemath
+    entrypoint: [""]
+  tags: ["x64"]
+  script: cp /home/sage/sage/local/var/lib/sage/venv-python3.*/share/texmf/tex/latex/sagetex/sagetex.sty .
+  artifacts:
+    paths:
+      - sagetex.sty
+
+create-sage-script:
+  image: docker.io/texlive/texlive
+  tags: ["x64"]
+  needs: [sagetex-sty-copy]
+  script:
+    - make main.sagetex.sage
+  after_script:
+    - cat main.log
+  artifacts:
+    paths:
+      - main.sagetex.sage
+      - sagetex.sty
+
+run-sage-script:
+  image: 
+    name: docker.io/sagemath/sagemath
+    entrypoint: [""]
+  needs: [create-sage-script]
+  tags: ["x64"]
+  script:
+    - sage -pip install "pseudowalls==0.0.3" --extra-index-url https://gitlab.com/api/v4/projects/43962374/packages/pypi/simple
+    -  sage main.sagetex.sage
+  artifacts:
+    paths:
+      - "*sagetex*"
+      - "sage-plots-for-main.tex/*"
+
+build:
+  image: docker.io/texlive/texlive
+  needs: [run-sage-script]
+  tags: ["x64"]
+  script: make main.pdf || echo failed final make
+  artifacts:
+    paths:
+      - main.pdf
+
diff --git a/main.tex b/main.tex
index 71c9681a6ad24882289374170d2054af155ba4b7..7e91a4caba290055e97a43bee619d36ff15c65cd 100644
--- a/main.tex
+++ b/main.tex
@@ -150,6 +150,9 @@ $\chern(F) = (R,C,D)$, and consider the possible Chern characters
 $\chern(E) = (r,c,d)$ of some semistabilizer $E$.
  
 \begin{sagesilent}
+	# Requires extra package:
+  #! sage -pip install "pseudowalls==0.0.3" --extra-index-url https://gitlab.com/api/v4/projects/43962374/packages/pypi/simple
+
 	from pseudowalls import *
 
 	v = Chern_Char(*var("R C D", domain="real"))