diff --git a/.github/workflows/twisted_trunk.yml b/.github/workflows/twisted_trunk.yml
index 55081f8133b27becccddfc39d17759e9222dd3c1..f7a4ee7c137546b71b9f33424f0d45b05909dad5 100644
--- a/.github/workflows/twisted_trunk.yml
+++ b/.github/workflows/twisted_trunk.yml
@@ -96,7 +96,11 @@ jobs:
     if: needs.check_repo.outputs.should_run_workflow == 'true'
     runs-on: ubuntu-latest
     container:
-      image: matrixdotorg/sytest-synapse:buster
+      # We're using ubuntu:focal because it uses Python 3.8 which is our minimum supported Python version.
+      # This job is a canary to warn us about unreleased twisted changes that would cause problems for us if
+      # they were to be released immediately. For simplicity's sake (and to save CI runners) we use the oldest
+      # version, assuming that any incompatibilities on newer versions would also be present on the oldest.
+      image: matrixdotorg/sytest-synapse:focal
       volumes:
         - ${{ github.workspace }}:/src
 
diff --git a/changelog.d/15893.misc b/changelog.d/15893.misc
new file mode 100644
index 0000000000000000000000000000000000000000..656d73b23120893c1df301db7be1e22e43551e8f
--- /dev/null
+++ b/changelog.d/15893.misc
@@ -0,0 +1 @@
+Drop Debian Buster since we no longer support Python 3.7.
diff --git a/docs/deprecation_policy.md b/docs/deprecation_policy.md
index 46c18d7d320525eff60ecfd46895b4195ad8158a..8403664850721ef0492e3f7074011e9ef1625b52 100644
--- a/docs/deprecation_policy.md
+++ b/docs/deprecation_policy.md
@@ -23,7 +23,7 @@ people building from source should ensure they can fetch recent versions of Rust
 (e.g. by using [rustup](https://rustup.rs/)).
 
 The oldest supported version of SQLite is the version
-[provided](https://packages.debian.org/buster/libsqlite3-0) by
+[provided](https://packages.debian.org/bullseye/libsqlite3-0) by
 [Debian oldstable](https://wiki.debian.org/DebianOldStable).
 
 Context
diff --git a/docs/development/contributing_guide.md b/docs/development/contributing_guide.md
index f5ba55afb7a322957f7cee427acd8a77ae705a87..e9210b17769572c0824bc7397c911fd3fcd451aa 100644
--- a/docs/development/contributing_guide.md
+++ b/docs/development/contributing_guide.md
@@ -322,7 +322,7 @@ The following command will let you run the integration test with the most common
 configuration:
 
 ```sh
-$ docker run --rm -it -v /path/where/you/have/cloned/the/repository\:/src:ro -v /path/to/where/you/want/logs\:/logs matrixdotorg/sytest-synapse:buster
+$ docker run --rm -it -v /path/where/you/have/cloned/the/repository\:/src:ro -v /path/to/where/you/want/logs\:/logs matrixdotorg/sytest-synapse:focal
 ```
 (Note that the paths must be full paths! You could also write `$(realpath relative/path)` if needed.)
 
diff --git a/scripts-dev/build_debian_packages.py b/scripts-dev/build_debian_packages.py
index 4c9f134ddd835cb900f523b70bef29e2ddd62d98..8fe10f2cb57f245f478e5805330856bec8316dfc 100755
--- a/scripts-dev/build_debian_packages.py
+++ b/scripts-dev/build_debian_packages.py
@@ -23,7 +23,6 @@ from typing import Collection, Optional, Sequence, Set
 # These are expanded inside the dockerfile to be a fully qualified image name.
 # e.g. docker.io/library/debian:bullseye
 DISTS = (
-    "debian:buster",  # oldstable: EOL 2022-08
     "debian:bullseye",
     "debian:bookworm",
     "debian:sid",