diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e667cc7c3ffbc673ed5a0dfb2096186d9443fe2f..4dbc82a92d3b0051461aad8751c8087d8ddd5343 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -40,8 +40,14 @@ setup:
   script:
     - sed -i
       -e "s|%%BRANCH%%|${CI_COMMIT_BRANCH}|g"
+      -e "s|%%COMMIT_SHA%%|${CI_COMMIT_SHORT_SHA}|g"
+      -e "s|%%COMMIT_TIMESTAMP%%|${CI_COMMIT_TIMESTAMP}|g"
+      -e "s|%%JOB_ID%%|${CI_JOB_ID}|g"
+      -e "s|%%JOB_TIMESTAMP%%|${CI_JOB_STARTED_AT}|g"
+      -e "s|%%JOB_URL%%|${CI_JOB_URL}|g"
+      -e "s|%%PROJECT_PATH%%|${CI_PROJECT_PATH}|g"
+      -e "s|%%PROJECT_TITLE%%|${CI_PROJECT_TITLE}|g"
       -e "s|%%PROJECT_URL%%|${CI_PROJECT_URL}|g"
-      -e "s|%%PROJECT_NAMESPACE%%|${CI_PROJECT_NAMESPACE}|g"
       src/*.html
     - mv src public
   artifacts:
@@ -64,4 +70,33 @@ pages:
   rules:
     - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
 
+# Purge all of this site's URLs from the Cloudflare cache
+create-purge-json:
+  stage: deploy
+  rules:
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+  needs: ['pages']
+  tags:
+    - docker
+  script:
+    - >-
+      echo -en "{\n  \"files\": [\n    \"$CI_PAGES_URL/\"" > purge.json;
+      for d in $(find public/* -type d); do echo -en ",\n    \"$CI_PAGES_URL/${d#public/}/\"" >> purge.json; done;
+      for f in $(find public -type f); do echo -en ",\n    \"$CI_PAGES_URL/${f#public/}\"" >> purge.json; done;
+      echo -e "\n  ]\n}" >> purge.json
+    - cat purge.json
+  artifacts:
+    paths:
+      - purge.json
+
+trigger-cache-purge:
+  stage: .post
+  rules:
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+  trigger:
+    include: purge-cache.gitlab-ci.yml
+  variables:
+    PARENT_PIPELINE_ID: $CI_PIPELINE_ID
+
+
 # vi: set ts=2 sw=2 et ft=yaml:
diff --git a/purge-cache.gitlab-ci.yml b/purge-cache.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0b4c616f97bb299e162ee611b5c6675a942eaa35
--- /dev/null
+++ b/purge-cache.gitlab-ci.yml
@@ -0,0 +1,25 @@
+# Purge the Cloudflare cache using the request body contained in purge.json
+#
+# We delay this job to give the pages:deploy job time to finish. If we don't
+# delay, then the cache might refill with old pages before the new pages are
+# finished deploying.
+purge-cache:
+  tags:
+    - docker
+  rules:
+    - if: $CF_PURGE_CACHE_ZONE && $CF_PURGE_CACHE_TOKEN
+      when: delayed
+      start_in: 3 minutes
+  needs:
+    - pipeline: $PARENT_PIPELINE_ID
+      job: create-purge-json
+  script:
+    - cat purge.json
+    - >-
+      wget -qO- "https://api.cloudflare.com/client/v4/zones/$CF_PURGE_CACHE_ZONE/purge_cache"
+      --header "Content-Type: application/json"
+      --header "Authorization: Bearer $CF_PURGE_CACHE_TOKEN"
+      --post-file purge.json
+
+
+# vi: set ts=2 sw=2 et ft=yaml:
diff --git a/src/another-page.html b/src/another-page.html
deleted file mode 100644
index 2d1289133224c526a183ad48358992a5e049ea00..0000000000000000000000000000000000000000
--- a/src/another-page.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta name="generator" content="GitLab Pages">
-    <title>Another Page - Plain HTML site using GitLab Pages</title>
-    <link rel="stylesheet" href="style.css">
-  </head>
-  <body>
-    <div class="navbar">
-      <a href="https://pages.gitlab.io/plain-html/">Plain HTML Example</a>
-      <a href="https://gitlab.com/pages/plain-html/">Repository</a>
-      <a href="https://gitlab.com/pages/">Other Examples</a>
-    </div>
-
-    <h1>Hello World!</h1>
-
-    <p>
-      This is a another page for testing global replacements.
-    </p>
-    <p>
-      It was built on the <strong>%%BRANCH%%</strong> branch of the
-      <a href="%%PROJECT_URL%%"><strong>%%PROJECT_NAMESPACE%%</strong></a> project.
-    </p>
-    <p>
-      Go back to the <a href="index.html">homepage</a>.
-    </p>
-  </body>
-</html>
-
-<!-- vi: set ts=2 sw=2 et ft=html: -->
diff --git a/src/cache-test.html b/src/cache-test.html
new file mode 100644
index 0000000000000000000000000000000000000000..182e635318ba82921bede8437f054c9ac0f296a5
--- /dev/null
+++ b/src/cache-test.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta name="generator" content="GitLab Pages">
+    <title>Cache Test | %%PROJECT_TITLE%%</title>
+    <link rel="preload" href="style.css" as="style">
+    <link rel="stylesheet" href="style.css">
+  </head>
+  <body>
+    <div class="navbar">
+      <a href="./">Homepage</a>
+      <a href="cache-test.html">Cache Test</a>
+      <a href="sub/">Subdirectory</a>
+      <a href="%%PROJECT_URL%%">Repository</a>
+    </div>
+
+    <h1>Cache Test</h1>
+
+    <p>
+      This page is meant for testing caching.
+    </p>
+    <p>
+      It was built on the <strong>%%BRANCH%%</strong> branch of the
+      <a href="%%PROJECT_URL%%"><strong>%%PROJECT_PATH%%</strong></a> project.
+    </p>
+    <p>
+      The current site revision is <a href="%%PROJECT_URL%%/-/commit/%%COMMIT_SHA%%"><code>%%COMMIT_SHA%%</code></a> from %%COMMIT_TIMESTAMP%%.
+    </p>
+    <p>
+      It was built in <a href="%%JOB_URL%%">Job %%JOB_ID%%</a> at %%JOB_TIMESTAMP%%.
+    </p>
+  </body>
+</html>
+
+<!-- vi: set ts=2 sw=2 et ft=html: -->
diff --git a/src/index.html b/src/index.html
index 17171232f7a56fedd280198d8effd1cdd2cec643..2d74d6340cfe8b5e907081fca0236ceec96b89a4 100644
--- a/src/index.html
+++ b/src/index.html
@@ -1,16 +1,18 @@
 <!DOCTYPE html>
-<html>
+<html lang="en">
   <head>
     <meta charset="utf-8">
     <meta name="generator" content="GitLab Pages">
-    <title>Plain HTML site using GitLab Pages</title>
+    <title>%%PROJECT_TITLE%%</title>
+    <link rel="preload" href="style.css" as="style">
     <link rel="stylesheet" href="style.css">
   </head>
   <body>
     <div class="navbar">
-      <a href="https://pages.gitlab.io/plain-html/">Plain HTML Example</a>
-      <a href="https://gitlab.com/pages/plain-html/">Repository</a>
-      <a href="https://gitlab.com/pages/">Other Examples</a>
+      <a href="./">Homepage</a>
+      <a href="cache-test.html">Cache Test</a>
+      <a href="sub/">Subdirectory</a>
+      <a href="%%PROJECT_URL%%">Repository</a>
     </div>
 
     <h1>Hello World!</h1>
@@ -20,10 +22,7 @@
     </p>
     <p>
       It was built on the <strong>%%BRANCH%%</strong> branch of the
-      <a href="%%PROJECT_URL%%"><strong>%%PROJECT_NAMESPACE%%</strong></a> project.
-    </p>
-    <p>
-      Go check out this <a href="another-page.html">other page</a>.
+      <a href="%%PROJECT_URL%%"><strong>%%PROJECT_PATH%%</strong></a> project.
     </p>
   </body>
 </html>
diff --git a/src/sub/index.html b/src/sub/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..5bdde53c8cf48a21dd8dd644d187db9ae08ef1e4
--- /dev/null
+++ b/src/sub/index.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta name="generator" content="GitLab Pages">
+    <title>Subdirectory | %%PROJECT_TITLE%%</title>
+    <link rel="preload" href="../style.css" as="style">
+    <link rel="stylesheet" href="../style.css">
+  </head>
+  <body>
+    <div class="navbar">
+      <a href="../">Homepage</a>
+      <a href="../cache-test.html">Cache Test</a>
+      <a href="./">Subdirectory</a>
+      <a href="%%PROJECT_URL%%">Repository</a>
+    </div>
+
+    <h1>Subdirectory Page</h1>
+
+    <p>
+      This page is in a subdirectory.
+    </p>
+  </body>
+</html>
+
+<!-- vi: set ts=2 sw=2 et ft=html: -->