diff --git a/.github/workflows/deploy-release.sh b/.github/workflows/deploy-release.sh
index 5cd95a0..5f179dd 100755
--- a/.github/workflows/deploy-release.sh
+++ b/.github/workflows/deploy-release.sh
@@ -27,6 +27,11 @@ fi
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
+
+
+ io7m-oci-image
+
+
io7m
diff --git a/.github/workflows/run-with-xvfb.sh b/.github/workflows/run-with-xvfb.sh
new file mode 100755
index 0000000..bc9a745
--- /dev/null
+++ b/.github/workflows/run-with-xvfb.sh
@@ -0,0 +1,66 @@
+#!/bin/bash -ex
+#
+# Automatically generated: DO NOT EDIT.
+#
+# Generation code: https://www.github.com/io7m-com/.github/
+#
+
+exec > >(tee build.txt) 2>&1
+
+#---------------------------------------------------------------------
+# Install all of the various required packages.
+#
+# We use:
+# xvfb to provide a virtual X server
+# fluxbox to provide a bare-minimum window manager with click-to-focus
+# ffmpeg to record the session
+# feh to set a background
+#
+
+sudo apt-get -y update
+sudo apt-get -y upgrade
+sudo apt-get -y install xvfb fluxbox feh ffmpeg
+
+#---------------------------------------------------------------------
+# Start Xvfb on a new display.
+#
+
+Xvfb :99 &
+export DISPLAY=:99
+sleep 1
+
+#---------------------------------------------------------------------
+# Start recording the session.
+#
+
+ffmpeg -f x11grab -y -r 60 -video_size 1280x1024 -i :99 -vcodec vp9 test-suite.webm &
+FFMPEG_PID="$!"
+
+#---------------------------------------------------------------------
+# Start fluxbox on the X server.
+#
+
+fluxbox &
+sleep 1
+
+#---------------------------------------------------------------------
+# Set a desktop image.
+#
+
+feh --bg-tile .github/workflows/wallpaper.png
+sleep 1
+
+#---------------------------------------------------------------------
+# Execute the passed-in build command.
+#
+
+"$@"
+
+#---------------------------------------------------------------------
+# Wait a while, and then instruct ffmpeg to stop recording. This step
+# is necessary because video files need to be processed when recording
+# stops.
+#
+
+sleep 20
+kill -INT "${FFMPEG_PID}" || true
diff --git a/.github/workflows/wallpaper.png b/.github/workflows/wallpaper.png
new file mode 100644
index 0000000..02f437e
Binary files /dev/null and b/.github/workflows/wallpaper.png differ