diff --git a/.github/workflows/release-artifacts.yml b/.github/workflows/release-artifacts.yml
index eee3633d5043cf4d09c76146d3368f670e4cd377..65ea761ad713ef7051b1d2111fd5e87ac8d670e6 100644
--- a/.github/workflows/release-artifacts.yml
+++ b/.github/workflows/release-artifacts.yml
@@ -31,7 +31,7 @@ jobs:
           # if we're running from a tag, get the full list of distros; otherwise just use debian:sid
           dists='["debian:sid"]'
           if [[ $GITHUB_REF == refs/tags/* ]]; then
-              dists=$(scripts-dev/build_debian_packages --show-dists-json)
+              dists=$(scripts-dev/build_debian_packages.py --show-dists-json)
           fi
           echo "::set-output name=distros::$dists"
     # map the step outputs to job outputs
@@ -74,7 +74,7 @@ jobs:
         # see https://github.com/docker/build-push-action/issues/252
         # for the cache magic here
         run: |
-          ./src/scripts-dev/build_debian_packages \
+          ./src/scripts-dev/build_debian_packages.py \
             --docker-build-arg=--cache-from=type=local,src=/tmp/.buildx-cache \
             --docker-build-arg=--cache-to=type=local,mode=max,dest=/tmp/.buildx-cache-new \
             --docker-build-arg=--progress=plain \
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index e9e427732239c0fbc2c097337de2fd0adcdcbb34..3f4e44ca592d70e7f0aa402eeff7b7d5e8e15cdd 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -16,7 +16,7 @@ jobs:
       - uses: actions/checkout@v2
       - uses: actions/setup-python@v2
       - run: pip install -e .
-      - run: scripts-dev/generate_sample_config --check
+      - run: scripts-dev/generate_sample_config.sh --check
 
   lint:
     runs-on: ubuntu-latest
@@ -51,7 +51,7 @@ jobs:
           fetch-depth: 0
       - uses: actions/setup-python@v2
       - run: "pip install 'towncrier>=18.6.0rc1'"
-      - run: scripts-dev/check-newsfragment
+      - run: scripts-dev/check-newsfragment.sh
         env:
           PULL_REQUEST_NUMBER: ${{ github.event.number }}
 
diff --git a/changelog.d/12137.misc b/changelog.d/12137.misc
new file mode 100644
index 0000000000000000000000000000000000000000..118ff77a91c61dc6acce6066b9bd845e89bf3a21
--- /dev/null
+++ b/changelog.d/12137.misc
@@ -0,0 +1 @@
+Give `scripts-dev` scripts suffixes for neater CI config.
\ No newline at end of file
diff --git a/docs/code_style.md b/docs/code_style.md
index 4d8e7c973d05c4d700022510aba71bbd86016ffc..e7c9cd1a5e4f3e10aadecc58f178da9309d8045b 100644
--- a/docs/code_style.md
+++ b/docs/code_style.md
@@ -172,6 +172,6 @@ frobber:
 ```
 
 Note that the sample configuration is generated from the synapse code
-and is maintained by a script, `scripts-dev/generate_sample_config`.
+and is maintained by a script, `scripts-dev/generate_sample_config.sh`.
 Making sure that the output from this script matches the desired format
 is left as an exercise for the reader!
diff --git a/mypy.ini b/mypy.ini
index 23ca4eaa5a8b839df8b41c062fcac1498ae102d6..10971b7225141a81c042a3199c7a7a0c0539b27c 100644
--- a/mypy.ini
+++ b/mypy.ini
@@ -11,7 +11,7 @@ local_partial_types = True
 no_implicit_optional = True
 
 files =
-  scripts-dev/sign_json,
+  scripts-dev/,
   setup.py,
   synapse/,
   tests/
@@ -23,10 +23,20 @@ files =
 # https://docs.python.org/3/library/re.html#re.X
 exclude = (?x)
   ^(
+   |scripts-dev/build_debian_packages.py
+   |scripts-dev/check_signature.py
+   |scripts-dev/definitions.py
+   |scripts-dev/federation_client.py
+   |scripts-dev/hash_history.py
+   |scripts-dev/list_url_patterns.py
+   |scripts-dev/release.py
+   |scripts-dev/tail-synapse.py
+
    |synapse/_scripts/export_signing_key.py
    |synapse/_scripts/move_remote_media_to_new_store.py
    |synapse/_scripts/synapse_port_db.py
    |synapse/_scripts/update_synapse_database.py
+
    |synapse/storage/databases/__init__.py
    |synapse/storage/databases/main/__init__.py
    |synapse/storage/databases/main/cache.py
diff --git a/scripts-dev/build_debian_packages b/scripts-dev/build_debian_packages.py
similarity index 100%
rename from scripts-dev/build_debian_packages
rename to scripts-dev/build_debian_packages.py
diff --git a/scripts-dev/check-newsfragment b/scripts-dev/check-newsfragment.sh
similarity index 100%
rename from scripts-dev/check-newsfragment
rename to scripts-dev/check-newsfragment.sh
diff --git a/scripts-dev/generate_sample_config b/scripts-dev/generate_sample_config.sh
similarity index 86%
rename from scripts-dev/generate_sample_config
rename to scripts-dev/generate_sample_config.sh
index 185e277933e3097edd1dce0041a2f37a6455adf8..375897eacb6771a73bbea12e94ade454e80fc862 100755
--- a/scripts-dev/generate_sample_config
+++ b/scripts-dev/generate_sample_config.sh
@@ -15,11 +15,11 @@ check() {
 
 if [ "$1" == "--check" ]; then
     diff -u "$SAMPLE_CONFIG" <(synapse/_scripts/generate_config.py --header-file docs/.sample_config_header.yaml) >/dev/null || {
-        echo -e "\e[1m\e[31m$SAMPLE_CONFIG is not up-to-date. Regenerate it with \`scripts-dev/generate_sample_config\`.\e[0m" >&2
+        echo -e "\e[1m\e[31m$SAMPLE_CONFIG is not up-to-date. Regenerate it with \`scripts-dev/generate_sample_config.sh\`.\e[0m" >&2
         exit 1
     }
     diff -u "$SAMPLE_LOG_CONFIG" <(synapse/_scripts/generate_log_config.py) >/dev/null || {
-        echo -e "\e[1m\e[31m$SAMPLE_LOG_CONFIG is not up-to-date. Regenerate it with \`scripts-dev/generate_sample_config\`.\e[0m" >&2
+        echo -e "\e[1m\e[31m$SAMPLE_LOG_CONFIG is not up-to-date. Regenerate it with \`scripts-dev/generate_sample_config.sh\`.\e[0m" >&2
         exit 1
     }
 else
diff --git a/scripts-dev/lint.sh b/scripts-dev/lint.sh
index df4d4934d06ff3f195aae4a76719bf559cb1943b..2f5f2c356674aad177e8e293770ccc392af674d8 100755
--- a/scripts-dev/lint.sh
+++ b/scripts-dev/lint.sh
@@ -85,8 +85,6 @@ else
           "synapse" "docker" "tests"
           # annoyingly, black doesn't find these so we have to list them
           "scripts-dev"
-          "scripts-dev/build_debian_packages"
-          "scripts-dev/sign_json"
           "contrib" "synctl" "setup.py" "synmark" "stubs" ".ci"
       )
   fi
diff --git a/scripts-dev/sign_json b/scripts-dev/sign_json.py
similarity index 100%
rename from scripts-dev/sign_json
rename to scripts-dev/sign_json.py
diff --git a/tox.ini b/tox.ini
index 8d6aa7580bb8cd5fa6bdef22e1f37b2c634ef52c..f4829200cca631e3997c97e9e9339188c9dc3ca1 100644
--- a/tox.ini
+++ b/tox.ini
@@ -40,8 +40,6 @@ lint_targets =
     tests
     # annoyingly, black doesn't find these so we have to list them
     scripts-dev
-    scripts-dev/build_debian_packages
-    scripts-dev/sign_json
     stubs
     contrib
     synctl