diff --git a/.github/mergify.yml b/.github/mergify.yml
index 7969fe95c25c68ade0d1dbdd3fc2aafa0426cf5d..94eb5d825c3fe9752e729cec2a94189477057eab 100644
--- a/.github/mergify.yml
+++ b/.github/mergify.yml
@@ -57,6 +57,23 @@ pull_request_rules:
       - label=merge me
       - base!=master
       - body~=backport
+      - label=merge delay passed
+      - '#approved-reviews-by>=1'
+
+  # merge+squash strategy for backports: require 1 approver instead of 2
+  - actions:
+      queue:
+        name: default
+        method: squash
+        # both update methods get absorbed by the squash, so we use the most
+        # reliable
+        update_method: merge
+    name: Put pull requests in the squash+merge queue
+    conditions:
+      - label=merge me
+      - base!=master
+      - body~=backport
+      - label=merge delay passed
       - '#approved-reviews-by>=1'
 
   # backports should be labeled as such
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b9718af9e77bc18f7bb2407dd94bd531ee6eb171..4fdf3ed52045992dcc77606b804136b821a92807 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -59,16 +59,24 @@ build-linux:
     TARBALL_EXT: tar.xz
     ADD_CABAL_ARGS: "--enable-split-sections"
 
-build-x86_64-linux-alpine:
+build-linux-alpine:
   extends: .build
+  parallel:
+    matrix:
+      - ARCH: i386
+        OS: [alpine3_12]
+        GHC_VERSION: 9.0.2
+      - ARCH: x86_64
+        OS: [alpine3_12]
   tags:
     - x86_64-linux
   before_script:
     # for cabal build
     - sudo apk add --no-cache zlib zlib-dev zlib-static
-  image: "registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-alpine3_12:$DOCKER_REV"
+  image: "registry.gitlab.haskell.org/ghc/ci-images/$PLATFORM:$DOCKER_REV"
   variables:
-    TARBALL_ARCHIVE_SUFFIX: x86_64-linux-alpine
+    PLATFORM: "${ARCH}-linux-${OS}"
+    TARBALL_ARCHIVE_SUFFIX: $PLATFORM
     TARBALL_EXT: tar.xz
     ADD_CABAL_ARGS: "--enable-split-sections --enable-executable-static"
 
diff --git a/.gitlab/ci.sh b/.gitlab/ci.sh
index b0a680795865369c8fb686cd80065f4642025745..c856f9f2cb951a5a6db2be0c2c58327327370b20 100755
--- a/.gitlab/ci.sh
+++ b/.gitlab/ci.sh
@@ -27,6 +27,8 @@ export BOOTSTRAP_HASKELL_NONINTERACTIVE=1
 export BOOTSTRAP_HASKELL_GHC_VERSION=$GHC_VERSION
 export BOOTSTRAP_HASKELL_CABAL_VERSION=$CABAL_INSTALL_VERSION
 export BOOTSTRAP_HASKELL_ADJUST_CABAL_CONFIG=yes
+# We don't use stack, and it isn't available on i386-deb9
+export BOOTSTRAP_HASKELL_INSTALL_NO_STACK=yes
 
 # for some reason the subshell doesn't pick up the arm64 environment on darwin
 # and starts installing x86_64 GHC
@@ -63,6 +65,7 @@ args=(
     ${ADD_CABAL_ARGS}
 )
 
+run cabal update hackage.haskell.org,HEAD
 run cabal v2-build ${args[@]} cabal-install
 
 mkdir "$CI_PROJECT_DIR/out"
diff --git a/.readthedocs.yml b/.readthedocs.yml
index 347901d93bdfeafa94d23a8e3143f9df4e6be605..016f7e47a487db6eabd82a4411fa3fe3a1cf3db0 100644
--- a/.readthedocs.yml
+++ b/.readthedocs.yml
@@ -3,7 +3,11 @@ version: 2
 sphinx:
   configuration: doc/conf.py
 
+build:
+  os: "ubuntu-22.04"
+  tools:
+    python: "3.8"
+
 python:
-  version: 3.7
   install:
     - requirements: doc/requirements.txt
diff --git a/cabal.project.release b/cabal.project.release
index 1f50c83e32447dc8b6f77632154f1b0106ec8515..8d171824287438a8971c7202bdedb5cb9c20f4d0 100644
--- a/cabal.project.release
+++ b/cabal.project.release
@@ -5,3 +5,4 @@ packages: cabal-install/
 tests: False
 benchmarks: False
 optimization: True
+index-state: hackage.haskell.org 2023-10-13T10:16:13Z