Prepare 20.3.0
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 70dcb0e..11dd81a 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -4,17 +4,47 @@
 Versions follow `CalVer <https://calver.org>`_ with a strict backwards compatibility policy.
 The third digit is only for regressions.
 
-Changes for the upcoming release can be found in the `"changelog.d" directory <https://github.com/python-attrs/attrs/tree/master/changelog.d>`_ in our repository.
-
-..
-   Do *NOT* add changelog entries here!
-
-   This changelog is managed by towncrier and is compiled at release time.
-
-   See https://www.attrs.org/en/latest/contributing.html#changelog for details.
-
 .. towncrier release notes start
 
+20.3.0 (2020-11-05)
+-------------------
+
+Backward-incompatible Changes
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+- ``attr.define()``, ``attr.frozen()``, ``attr.mutable()``, and ``attr.field()`` remain **provisional**.
+
+  This release does **not** change change anything about them and they are already used widely in production though.
+
+  If you wish to use them together with mypy, you can simply drop `this plugin <https://gist.github.com/hynek/1e3844d0c99e479e716169034b5fa963#file-attrs_ng_plugin-py>`_ into your project.
+
+  Feel free to provide feedback to them in the linked issue #668.
+
+  We will release the ``attrs`` namespace once we have the feeling that the APIs have properly settled.
+  `#668 <https://github.com/python-attrs/attrs/issues/668>`_
+
+
+Changes
+^^^^^^^
+
+- ``attr.s()`` now has a *field_transformer* hook that is called for all ``Attribute``\ s and returns a (modified or updated) list of ``Attribute`` instances.
+  ``attr.asdict()`` has a *value_serializer* hook that can change the way values are converted.
+  Both hooks are meant to help with data (de-)serialization workflows.
+  `#653 <https://github.com/python-attrs/attrs/issues/653>`_
+- ``kw_only=True`` now works on Python 2.
+  `#700 <https://github.com/python-attrs/attrs/issues/700>`_
+- ``raise from`` now works on frozen classes on PyPy.
+  `#703 <https://github.com/python-attrs/attrs/issues/703>`_,
+  `#712 <https://github.com/python-attrs/attrs/issues/712>`_
+- ``attr.asdict()`` and ``attr.astuple()`` now treat ``frozenset``\ s like ``set``\ s with regards to the *retain_collection_types* argument.
+  `#704 <https://github.com/python-attrs/attrs/issues/704>`_
+- The type stubs for ``attr.s()`` and ``attr.make_class()`` are not missing the *collect_by_mro* argument anymore.
+  `#711 <https://github.com/python-attrs/attrs/issues/711>`_
+
+
+----
+
+
 20.2.0 (2020-09-05)
 -------------------
 
diff --git a/changelog.d/653.change.rst b/changelog.d/653.change.rst
deleted file mode 100644
index 241a914..0000000
--- a/changelog.d/653.change.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-``attr.s()`` now has a *field_transformer* hook that is called for all ``Attribute``\ s and returns a (modified or updated) list of ``Attribute`` instances.
-``attr.asdict()`` has a *value_serializer* hook that can change the way values are converted.
-Both hooks are meant to help with data (de-)serialization workflows.
diff --git a/changelog.d/668.breaking.rst b/changelog.d/668.breaking.rst
deleted file mode 100644
index 66656e3..0000000
--- a/changelog.d/668.breaking.rst
+++ /dev/null
@@ -1,9 +0,0 @@
-``attr.define()``, ``attr.frozen()``, ``attr.mutable()``, and ``attr.field()`` remain **provisional**.
-
-This release does **not** change change anything about them and they are already used widely in production though.
-
-If you wish to use them together with mypy, you can simply drop `this plugin <https://gist.github.com/hynek/1e3844d0c99e479e716169034b5fa963#file-attrs_ng_plugin-py>`_ into your project.
-
-Feel free to provide feedback to them in the linked issue #668.
-
-We will release the ``attrs`` namespace once we have the feeling that the APIs have properly settled.
diff --git a/changelog.d/700.change.rst b/changelog.d/700.change.rst
deleted file mode 100644
index d4dc2df..0000000
--- a/changelog.d/700.change.rst
+++ /dev/null
@@ -1 +0,0 @@
-``kw_only=True`` now works on Python 2.
diff --git a/changelog.d/703.change.rst b/changelog.d/703.change.rst
deleted file mode 100644
index c0fde46..0000000
--- a/changelog.d/703.change.rst
+++ /dev/null
@@ -1 +0,0 @@
-``raise from`` now works on frozen classes on PyPy.
diff --git a/changelog.d/704.change.rst b/changelog.d/704.change.rst
deleted file mode 100644
index 26b08e2..0000000
--- a/changelog.d/704.change.rst
+++ /dev/null
@@ -1 +0,0 @@
-``attr.asdict()`` and ``attr.astuple()`` now treat ``frozenset``\ s like ``set``\ s with regards to the *retain_collection_types* argument.
diff --git a/changelog.d/711.change.rst b/changelog.d/711.change.rst
deleted file mode 100644
index 66865e8..0000000
--- a/changelog.d/711.change.rst
+++ /dev/null
@@ -1 +0,0 @@
-The type stubs for ``attr.s()`` and ``attr.make_class()`` are not missing the *collect_by_mro* argument anymore.
diff --git a/changelog.d/712.change.rst b/changelog.d/712.change.rst
deleted file mode 100644
index c0fde46..0000000
--- a/changelog.d/712.change.rst
+++ /dev/null
@@ -1 +0,0 @@
-``raise from`` now works on frozen classes on PyPy.
diff --git a/src/attr/__init__.py b/src/attr/__init__.py
index 2073552..bf329ca 100644
--- a/src/attr/__init__.py
+++ b/src/attr/__init__.py
@@ -21,7 +21,7 @@
 from ._version_info import VersionInfo
 
 
-__version__ = "20.3.0.dev0"
+__version__ = "20.3.0"
 __version_info__ = VersionInfo._from_version_string(__version__)
 
 __title__ = "attrs"