diff --git a/crates/tor-rtcompat/misc/matrix.py b/crates/tor-rtcompat/misc/matrix
similarity index 100%
rename from crates/tor-rtcompat/misc/matrix.py
rename to crates/tor-rtcompat/misc/matrix
diff --git a/doc/Release.md b/doc/Release.md
index 240a0794a5685ac4a756f35996ec8a79f38b1956..014405f106f490e837e5767aad400432f1c62fce 100644
--- a/doc/Release.md
+++ b/doc/Release.md
@@ -31,7 +31,7 @@
 
    To bump the patch version of _every_ crate, run:
 
-   ; for crate in $(./maint/list_crates.py); do cargo set-version -p "$crate" --bump patch; done
+   ; for crate in $(./maint/list_crates); do cargo set-version -p "$crate" --bump patch; done
 
    To find only the crates that changed since version 0.0.x, you can run:
 
@@ -47,7 +47,7 @@
    a list of crates from lowest- to highest-level, see the top-level
    Cargo.toml.
 
-   ; for crate in $(./maint/list_crates.py); do cargo publish -p "$crate"; echo "Sleeping"; sleep 30; done
+   ; for crate in $(./maint/list_crates); do cargo publish -p "$crate"; echo "Sleeping"; sleep 30; done
 
     (The "sleep 30" is probably too long, but some delay seems to be
     necessary to give crates.io time to publish each crate before the next
diff --git a/maint/add_warning.py b/maint/add_warning
similarity index 97%
rename from maint/add_warning.py
rename to maint/add_warning
index dd265cb0a6ccae68717e1c6f5bfa512f4aeb903f..4744c3cd031076967ebd53a5f2e93e6348dd3b55 100755
--- a/maint/add_warning.py
+++ b/maint/add_warning
@@ -108,7 +108,7 @@ def main(lints,files):
 
     if not files:
         print("No files provided.  Example usage:")
-        print("   ./maint/add_warning.py ./maint/add_warning.py crates/*/src/{lib,main}.rs")
+        print("   ./maint/add_warning ./maint/add_warning crates/*/src/{lib,main}.rs")
 
     for fn in files:
         process(lints, fn)
diff --git a/maint/check_toposort.py b/maint/check_toposort
similarity index 100%
rename from maint/check_toposort.py
rename to maint/check_toposort
diff --git a/maint/gen_md_links.py b/maint/gen_md_links
similarity index 99%
rename from maint/gen_md_links.py
rename to maint/gen_md_links
index d6f2716530274635e2753cdb2b67217a84f5f639..8a28da9f95866712e5ca9265f2775368a619139a 100644
--- a/maint/gen_md_links.py
+++ b/maint/gen_md_links
@@ -8,7 +8,7 @@ the appropriate https URLs for them.
 Takes input either from a file, or from stdin.
 
 Example:
-  ./gen_md_links.py < new_changelog
+  ./gen_md_links < new_changelog
 """
 
 import re, subprocess
diff --git a/maint/list_crates.py b/maint/list_crates
similarity index 100%
rename from maint/list_crates.py
rename to maint/list_crates
diff --git a/maint/postprocess_coverage_cobertura.py b/maint/postprocess_coverage_cobertura
similarity index 100%
rename from maint/postprocess_coverage_cobertura.py
rename to maint/postprocess_coverage_cobertura
diff --git a/maint/postprocess_coverage_html.py b/maint/postprocess_coverage_html
similarity index 100%
rename from maint/postprocess_coverage_html.py
rename to maint/postprocess_coverage_html
diff --git a/maint/with_coverage b/maint/with_coverage
index 85a03126e420f1580df19957ecbcb86653e50272..e8470ee15797d9e55220a4c9b0769cce275a24c1 100755
--- a/maint/with_coverage
+++ b/maint/with_coverage
@@ -138,7 +138,7 @@ grcov "$COVERAGE_BASEDIR/coverage_meta" \
 	--ignore="*/github.com-1ecc6299db9ec823/*"
 
 if [ "$format" == cobertura ]; then
-	python3 "$COVERAGE_BASEDIR/maint/postprocess_coverage_cobertura.py" "$COVERAGE_BASEDIR/$output"
+	python3 "$COVERAGE_BASEDIR/maint/postprocess_coverage_cobertura" "$COVERAGE_BASEDIR/$output"
 	echo "Full report: $COVERAGE_BASEDIR/$output"
 	exit
 elif [ "$format" != html ]; then
@@ -153,7 +153,7 @@ if [ "$(command -v python3 2>/dev/null)" = "" ]; then
     echo "python3 not installed; not post-processing the index file."
 else
     echo "Postprocessing..."
-    python3 "$COVERAGE_BASEDIR/maint/postprocess_coverage_html.py" "$COVERAGE_BASEDIR/coverage_meta/commands" "$COVERAGE_BASEDIR/$output/index.html" "$COVERAGE_BASEDIR/$output/index.html"
+    python3 "$COVERAGE_BASEDIR/maint/postprocess_coverage_html" "$COVERAGE_BASEDIR/coverage_meta/commands" "$COVERAGE_BASEDIR/$output/index.html" "$COVERAGE_BASEDIR/$output/index.html"
 fi
 
 echo "Full report: $COVERAGE_BASEDIR/$output/index.html"