diff --git a/changes/1118.feature.rst b/changes/1118.feature.rst
deleted file mode 100644
index 1fe3b822b..000000000
--- a/changes/1118.feature.rst
+++ /dev/null
@@ -1 +0,0 @@
-Briefcase will now surface git's error messages if an error occurs when cloning a template repository.
diff --git a/changes/1218.bugfix.rst b/changes/1218.bugfix.rst
deleted file mode 100644
index 407164f9e..000000000
--- a/changes/1218.bugfix.rst
+++ /dev/null
@@ -1 +0,0 @@
-Briefcase now uses ``ditto`` to archive apps for submission to the notarization service, rather than standard ``zip`` tooling. This ensures that UTF-8 encoding and filesystem resources are preserved.
diff --git a/changes/1270.feature.rst b/changes/1270.feature.rst
deleted file mode 100644
index 8d8170d51..000000000
--- a/changes/1270.feature.rst
+++ /dev/null
@@ -1 +0,0 @@
-Briefcase now supports per-app configuration of ``pip install`` command line arguments using ``requirement_installer_args``.
diff --git a/changes/1472.feature.1.rst b/changes/1472.feature.1.rst
deleted file mode 100644
index c79859e2a..000000000
--- a/changes/1472.feature.1.rst
+++ /dev/null
@@ -1 +0,0 @@
-When a macOS notarization attempt fails, Briefcase now displays the cause of the notarization failure.
diff --git a/changes/1472.feature.2.rst b/changes/1472.feature.2.rst
deleted file mode 100644
index 4bf7421ed..000000000
--- a/changes/1472.feature.2.rst
+++ /dev/null
@@ -1 +0,0 @@
-If macOS app notarization is interrupted, the notarization attempt can now be resumed.
diff --git a/changes/1876.bugfix.txt b/changes/1876.bugfix.txt
deleted file mode 100644
index ab1386abd..000000000
--- a/changes/1876.bugfix.txt
+++ /dev/null
@@ -1 +0,0 @@
-Added escape template for Gradle which handles single quotes.
diff --git a/changes/1899.feature.rst b/changes/1899.feature.rst
deleted file mode 100644
index 766e1fe0e..000000000
--- a/changes/1899.feature.rst
+++ /dev/null
@@ -1 +0,0 @@
-When an existing project uses the ``convert`` wizard to add a Briefcase configuration, the updated ``pyproject.toml`` now includes a stub configuration for all platforms.
diff --git a/changes/1900.feature.rst b/changes/1900.feature.rst
deleted file mode 100644
index 5a3bdca8c..000000000
--- a/changes/1900.feature.rst
+++ /dev/null
@@ -1 +0,0 @@
-The "briefcase convert" command can now be used to configure a console-based applications.
diff --git a/changes/1907.feature.rst b/changes/1907.feature.rst
deleted file mode 100644
index 5314cb83d..000000000
--- a/changes/1907.feature.rst
+++ /dev/null
@@ -1 +0,0 @@
-If Briefcase receives an error invoking a system tool, it will now surface the raw error message to the user in addition to logging the error.
diff --git a/changes/2006.feature.rst b/changes/2006.feature.rst
deleted file mode 100644
index 10a460000..000000000
--- a/changes/2006.feature.rst
+++ /dev/null
@@ -1 +0,0 @@
-The project wizard now generates a more complete configuration file when no GUI framework is selected.
diff --git a/changes/2032.misc.rst b/changes/2032.misc.rst
deleted file mode 100644
index 46a936b4d..000000000
--- a/changes/2032.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-CI configurations were updated to reflect the stable status of 3.13, and the "system" option for app-build-verify.
diff --git a/changes/2034.bugfix.rst b/changes/2034.bugfix.rst
deleted file mode 100644
index d3d0339a6..000000000
--- a/changes/2034.bugfix.rst
+++ /dev/null
@@ -1 +0,0 @@
-Pre-release Python interpreter versions are no longer rejected as matching candidates in PEP 621 ``requires-python`` checks.
diff --git a/changes/2039.misc.rst b/changes/2039.misc.rst
deleted file mode 100644
index 1bff33bd0..000000000
--- a/changes/2039.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Briefcase now uses `httpx `_ internally instead of ``requests``.
diff --git a/changes/2043.misc.rst b/changes/2043.misc.rst
deleted file mode 100644
index 08cd276c7..000000000
--- a/changes/2043.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-The pinned dependencies in pyproject.toml and tox.ini were updated to their latest versions.
diff --git a/changes/2044.misc.rst b/changes/2044.misc.rst
deleted file mode 100644
index f1c1e39e3..000000000
--- a/changes/2044.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated tox from 4.21.2 to 4.23.0.
diff --git a/changes/2048.misc.rst b/changes/2048.misc.rst
deleted file mode 100644
index 15be23a1f..000000000
--- a/changes/2048.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated actions/checkout from 4.2.1 to 4.2.2.
diff --git a/changes/2049.misc.rst b/changes/2049.misc.rst
deleted file mode 100644
index 8d8af9eed..000000000
--- a/changes/2049.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated actions/setup-python from 5.2.0 to 5.3.0.
diff --git a/changes/2050.misc.rst b/changes/2050.misc.rst
deleted file mode 100644
index 9eb46067a..000000000
--- a/changes/2050.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-The ``pre-commit`` hook for ``pyupgrade`` was updated to its latest version.
diff --git a/changes/2051.misc.rst b/changes/2051.misc.rst
deleted file mode 100644
index 3e25f1811..000000000
--- a/changes/2051.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated tox from 4.23.0 to 4.23.2.
diff --git a/changes/2052.misc.rst b/changes/2052.misc.rst
deleted file mode 100644
index a22fc8d38..000000000
--- a/changes/2052.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated coverage[toml] from 7.6.1 to 7.6.4.
diff --git a/changes/2056.misc.rst b/changes/2056.misc.rst
deleted file mode 100644
index 08cd276c7..000000000
--- a/changes/2056.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-The pinned dependencies in pyproject.toml and tox.ini were updated to their latest versions.
diff --git a/changes/2061.misc.rst b/changes/2061.misc.rst
deleted file mode 100644
index 08cd276c7..000000000
--- a/changes/2061.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-The pinned dependencies in pyproject.toml and tox.ini were updated to their latest versions.
diff --git a/changes/2062.misc.rst b/changes/2062.misc.rst
deleted file mode 100644
index da78620d0..000000000
--- a/changes/2062.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated coverage[toml] from 7.6.4 to 7.6.7.
diff --git a/changes/2065.misc.rst b/changes/2065.misc.rst
deleted file mode 100644
index a46ce52b7..000000000
--- a/changes/2065.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated coverage[toml] from 7.6.7 to 7.6.8.
diff --git a/changes/2066.misc.rst b/changes/2066.misc.rst
deleted file mode 100644
index e3d95834e..000000000
--- a/changes/2066.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated setuptools from 75.5.0 to 75.6.0.
diff --git a/changes/2072.misc.rst b/changes/2072.misc.rst
deleted file mode 100644
index 8c2d3944e..000000000
--- a/changes/2072.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated pytest from 8.3.3 to 8.3.4.
diff --git a/changes/2074.removal.rst b/changes/2074.removal.rst
deleted file mode 100644
index 4900e597a..000000000
--- a/changes/2074.removal.rst
+++ /dev/null
@@ -1 +0,0 @@
-Flatpak apps no longer request D-Bus session access by default. Most apps have no need to access the D-Bus session, unless they're a development tool that is inspecting D-Bus messages at runtime. If you experience errors related to this change, it is likely caused by an inconsistency between the ``bundle`` definition in your app configuration, and the way the app describes its bundle ID at runtime. If you *do* require D-Bus access, adding ``finish_arg."socket=session-bus" = true`` to the Flatpak configuration for your app will restore D-Bus session access.
diff --git a/changes/2077.bugfix.rst b/changes/2077.bugfix.rst
deleted file mode 100644
index 2991a96d0..000000000
--- a/changes/2077.bugfix.rst
+++ /dev/null
@@ -1 +0,0 @@
-Briefcase no longer fails to create projects or builds because it cannot update the Git configuration for the relevant template.
diff --git a/changes/2079.misc.rst b/changes/2079.misc.rst
deleted file mode 100644
index f569e8e4a..000000000
--- a/changes/2079.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated coverage[toml] from 7.6.8 to 7.6.9.
diff --git a/changes/2080.feature.rst b/changes/2080.feature.rst
deleted file mode 100644
index a0beea04a..000000000
--- a/changes/2080.feature.rst
+++ /dev/null
@@ -1 +0,0 @@
-The web template now targets PyScript version 2024.11.1. In addition, the web template can provide a base ``pyscript.toml`` that Briefcase will update as required during the build process.
diff --git a/changes/2087.bugfix.rst b/changes/2087.bugfix.rst
deleted file mode 100644
index 36d892617..000000000
--- a/changes/2087.bugfix.rst
+++ /dev/null
@@ -1 +0,0 @@
-Support packages for Linux Flatpak and AppImage builds are now downloaded from the ``astral-sh`` repository, rather than the ``indygreg`` repository. This reflect the recent transfer of ownership of the project.
diff --git a/changes/2091.misc.rst b/changes/2091.misc.rst
deleted file mode 100644
index b21133338..000000000
--- a/changes/2091.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated sphinxcontrib-spelling from 8.0.0 to 8.0.1.
diff --git a/changes/2092.misc.rst b/changes/2092.misc.rst
deleted file mode 100644
index 9eb46067a..000000000
--- a/changes/2092.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-The ``pre-commit`` hook for ``pyupgrade`` was updated to its latest version.
diff --git a/changes/2093.misc.rst b/changes/2093.misc.rst
deleted file mode 100644
index fe61a218d..000000000
--- a/changes/2093.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated actions/upload-artifact from 4.4.3 to 4.5.0.
diff --git a/changes/2095.misc.rst b/changes/2095.misc.rst
deleted file mode 100644
index 4ef80fce5..000000000
--- a/changes/2095.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated coverage[toml] from 7.6.9 to 7.6.10.
diff --git a/changes/2096.bugfix.rst b/changes/2096.bugfix.rst
deleted file mode 100644
index c2ef5afa5..000000000
--- a/changes/2096.bugfix.rst
+++ /dev/null
@@ -1 +0,0 @@
-A Debian-based system that does *not* have ``build-essential`` installed, but *does* have the constituent packages of ``build-essential`` installed, can now build Briefcase system packages.
diff --git a/changes/2100.misc.rst b/changes/2100.misc.rst
deleted file mode 100644
index 41280800d..000000000
--- a/changes/2100.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated setuptools from 75.6.0 to 75.7.0.
diff --git a/changes/2101.feature.rst b/changes/2101.feature.rst
deleted file mode 100644
index 7c35ebbcd..000000000
--- a/changes/2101.feature.rst
+++ /dev/null
@@ -1 +0,0 @@
-Briefcase now uses native pip handling for cross-platform installs.
diff --git a/changes/2101.removal.rst b/changes/2101.removal.rst
deleted file mode 100644
index 431e59260..000000000
--- a/changes/2101.removal.rst
+++ /dev/null
@@ -1 +0,0 @@
-Briefcase can no longer install pure Python iOS packages from a source archive (i.e., a ``.tar.gz`` file published on PyPI). If a package is pure Python, it *must* be provided as a ``py3-none-any`` wheel. Briefcase's `iOS platform documentation `__ contains details on how to provide a ``py3-none-any`` wheel when PyPI does not provide one.
diff --git a/changes/2102.bugfix.rst b/changes/2102.bugfix.rst
deleted file mode 100644
index 166261a93..000000000
--- a/changes/2102.bugfix.rst
+++ /dev/null
@@ -1 +0,0 @@
-The arguments passed to xcodebuild when compiling an iOS app have been modified to avoid a warning about an ignored argument.
diff --git a/changes/2106.misc.rst b/changes/2106.misc.rst
deleted file mode 100644
index e8f324e44..000000000
--- a/changes/2106.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated setuptools from 75.7.0 to 75.8.0.
diff --git a/changes/2107.misc.rst b/changes/2107.misc.rst
deleted file mode 100644
index 11f316467..000000000
--- a/changes/2107.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated actions/upload-artifact from 4.5.0 to 4.6.0.
diff --git a/changes/2108.misc.rst b/changes/2108.misc.rst
deleted file mode 100644
index 594995a4b..000000000
--- a/changes/2108.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated ncipollo/release-action from 1.14.0 to 1.15.0.
diff --git a/changes/2110.bugfix.rst b/changes/2110.bugfix.rst
deleted file mode 100644
index beae9a627..000000000
--- a/changes/2110.bugfix.rst
+++ /dev/null
@@ -1 +0,0 @@
-The hints displayed to the user when an identity has been selected now more accurately reflect the context in which they have been invoked.
diff --git a/changes/2110.feature.rst b/changes/2110.feature.rst
deleted file mode 100644
index a5fcfde9c..000000000
--- a/changes/2110.feature.rst
+++ /dev/null
@@ -1 +0,0 @@
-When a verbosity level of 3 (i.e., ``-vvv``) is selected, any tasks that would normally be performed in parallel will now be performed serially.
diff --git a/changes/2113.feature.rst b/changes/2113.feature.rst
deleted file mode 100644
index 296daa387..000000000
--- a/changes/2113.feature.rst
+++ /dev/null
@@ -1 +0,0 @@
-Linux on arm64 is now a fully supported platform.
diff --git a/changes/2114.feature.rst b/changes/2114.feature.rst
deleted file mode 100644
index a5a488be1..000000000
--- a/changes/2114.feature.rst
+++ /dev/null
@@ -1 +0,0 @@
-Project bootstraps now have access to the Briefcase console and the overrides specified with ``-Q`` options at the command line.
diff --git a/changes/2114.removal.rst b/changes/2114.removal.rst
deleted file mode 100644
index 0395b4454..000000000
--- a/changes/2114.removal.rst
+++ /dev/null
@@ -1 +0,0 @@
-The API for project bootstraps has been slightly modified. The constructor for a bootstrap must now accept a console argument; the ``extra_context()`` method must now accept a ``project_overrides`` argument.
diff --git a/changes/2115.misc.rst b/changes/2115.misc.rst
deleted file mode 100644
index 916447d51..000000000
--- a/changes/2115.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-The methods used for handling questions in the new project wizard have been refactored into a common utility.
diff --git a/changes/2119.feature.rst b/changes/2119.feature.rst
deleted file mode 100644
index 1299b897a..000000000
--- a/changes/2119.feature.rst
+++ /dev/null
@@ -1 +0,0 @@
-Project bootstraps can now define a ``post_generate()`` extension point. This will be invoked after the new project template has been generated, providing a way for bootstraps to add additional files to the generated project.
diff --git a/changes/2124.misc.rst b/changes/2124.misc.rst
deleted file mode 100644
index f7c71b436..000000000
--- a/changes/2124.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-The Printer, Logger and Console classes have been unified into a single Console class.
diff --git a/changes/2126.misc.rst b/changes/2126.misc.rst
deleted file mode 100644
index 1923a8802..000000000
--- a/changes/2126.misc.rst
+++ /dev/null
@@ -1 +0,0 @@
-The base path provided to post_generate was corrected to include the app name.
diff --git a/docs/background/releases.rst b/docs/background/releases.rst
index 77f6ec7ac..58d76125e 100644
--- a/docs/background/releases.rst
+++ b/docs/background/releases.rst
@@ -4,6 +4,51 @@ Release History
.. towncrier release notes start
+0.3.21 (2025-01-24)
+===================
+
+Features
+--------
+
+* Briefcase will now surface git's error messages if an error occurs when cloning a template repository. (`#1118 `__)
+* Briefcase now supports per-app configuration of ``pip install`` command line arguments using ``requirement_installer_args``. (`#1270 `__)
+* If macOS app notarization is interrupted, the notarization attempt can now be resumed. (`#1472 `__)
+* When a macOS notarization attempt fails, Briefcase now displays the cause of the notarization failure. (`#1472 `__)
+* When an existing project uses the ``convert`` wizard to add a Briefcase configuration, the updated ``pyproject.toml`` now includes a stub configuration for all platforms. (`#1899 `__)
+* The ``briefcase convert`` command can now be used to configure a console-based applications. (`#1900 `__)
+* If Briefcase receives an error invoking a system tool, it will now surface the raw error message to the user in addition to logging the error. (`#1907 `__)
+* The project wizard now generates a more complete configuration file when no GUI framework is selected. (`#2006 `__)
+* The web template now targets PyScript version 2024.11.1. In addition, the web template can provide a base ``pyscript.toml`` that Briefcase will update as required during the build process. (`#2080 `__)
+* Briefcase now uses native pip handling for iOS installs. (`#2101 `__)
+* When a verbosity level of 3 (i.e., ``-vvv``) is selected, any tasks that would normally be performed in parallel will now be performed serially. (`#2110 `__)
+* Linux on arm64 is now a fully supported platform. (`#2113 `__)
+* Project bootstraps now have access to the Briefcase console and the overrides specified with ``-Q`` options at the command line. (`#2114 `__)
+* Project bootstraps can now define a ``post_generate()`` extension point. This will be invoked after the new project template has been generated, providing a way for bootstraps to add additional files to the generated project. (`#2119 `__)
+
+Bugfixes
+--------
+
+* Briefcase now uses ``ditto`` to archive apps for submission to the notarization service, rather than standard ``zip`` tooling. This ensures that UTF-8 encoding and file system resources are preserved. (`#1218 `__)
+* The Gradle file generated for Android projects now correctly escapes single quotes. (`#1876 `__)
+* Pre-release Python interpreter versions are no longer rejected as matching candidates in PEP 621 ``requires-python`` checks. (`#2034 `__)
+* Briefcase no longer fails to create projects or builds because it cannot update the Git configuration for the relevant template. (`#2077 `__)
+* Support packages for Linux Flatpak and AppImage builds are now downloaded from the ``astral-sh`` repository, rather than the ``indygreg`` repository. This reflect the recent transfer of ownership of the project. (`#2087 `__)
+* A Debian-based system that does *not* have ``build-essential`` installed, but *does* have the constituent packages of ``build-essential`` installed, can now build Briefcase system packages. (`#2096 `__)
+* The arguments passed to ``xcodebuild`` when compiling an iOS app have been modified to avoid a warning about an ignored argument. (`#2102 `__)
+* The hints displayed to the user when an identity has been selected now more accurately reflect the context in which they have been invoked. (`#2110 `__)
+
+Backward Incompatible Changes
+-----------------------------
+
+* Flatpak apps no longer request D-Bus session access by default. Most apps have no need to access the D-Bus session, unless they're a development tool that is inspecting D-Bus messages at runtime. If you experience errors related to this change, it is likely caused by an inconsistency between the ``bundle`` definition in your app configuration, and the way the app describes its bundle ID at runtime. If you *do* require D-Bus access, adding ``finish_arg."socket=session-bus" = true`` to the Flatpak configuration for your app will restore D-Bus session access. (`#2074 `__)
+* Briefcase can no longer install pure Python iOS packages from a source archive (i.e., a ``.tar.gz`` file published on PyPI). If a package is pure Python, it *must* be provided as a ``py3-none-any`` wheel. Briefcase's `iOS platform documentation `__ contains details on how to provide a ``py3-none-any`` wheel when PyPI does not provide one. (`#2101 `__)
+* The API for project bootstraps has been slightly modified. The constructor for a bootstrap must now accept a console argument; the ``extra_context()`` method must now accept a ``project_overrides`` argument. (`#2114 `__)
+
+Misc
+----
+
+* `#2032 `__, `#2039 `__, `#2043 `__, `#2044 `__, `#2048 `__, `#2049 `__, `#2050 `__, `#2051 `__, `#2052 `__, `#2056 `__, `#2061 `__, `#2062 `__, `#2065 `__, `#2066 `__, `#2072 `__, `#2079 `__, `#2091 `__, `#2092 `__, `#2093 `__, `#2095 `__, `#2100 `__, `#2106 `__, `#2107 `__, `#2108 `__, `#2115 `__, `#2124 `__, `#2126 `__
+
0.3.20 (2024-10-15)
===================