diff --git a/doc/_static/switcher.json b/doc/_static/switcher.json
index 36e743db21b8..cc275467efc4 100644
--- a/doc/_static/switcher.json
+++ b/doc/_static/switcher.json
@@ -1,7 +1,7 @@
[
{
"name": "3.10 (stable)",
- "version": "3.10.8",
+ "version": "3.10.9",
"url": "https://matplotlib.org/stable/",
"preferred": true
},
diff --git a/doc/_static/zenodo_cache/17595503.svg b/doc/_static/zenodo_cache/17595503.svg
new file mode 100644
index 000000000000..891bd118d125
--- /dev/null
+++ b/doc/_static/zenodo_cache/17595503.svg
@@ -0,0 +1,35 @@
+
\ No newline at end of file
diff --git a/doc/_static/zenodo_cache/19716234.svg b/doc/_static/zenodo_cache/19716234.svg
new file mode 100644
index 000000000000..910ecbef7fae
--- /dev/null
+++ b/doc/_static/zenodo_cache/19716234.svg
@@ -0,0 +1,35 @@
+
\ No newline at end of file
diff --git a/doc/api/prev_api_changes/api_changes_3.10.9.rst b/doc/api/prev_api_changes/api_changes_3.10.9.rst
new file mode 100644
index 000000000000..592faadc347b
--- /dev/null
+++ b/doc/api/prev_api_changes/api_changes_3.10.9.rst
@@ -0,0 +1,20 @@
+API Changes for 3.10.9
+======================
+
+
+Deprecations
+------------
+
+
+Arbitrary code in ``axes.prop_cycle`` rcParam strings
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The ``axes.prop_cycle`` rcParam accepts Python expressions that are evaluated
+in a limited context. The evaluation context has been further limited and some
+expressions that previously worked (list comprehensions, for example) no longer
+will. This change is made without a deprecation period to improve security.
+The previously documented cycler operations at
+https://matplotlib.org/cycler/ are still supported.
+
+This change was originally slated for v3.11.0 of Matplotlib, but was additionally
+backported due to the security implications.
diff --git a/doc/project/citing.rst b/doc/project/citing.rst
index c5e56e6f12d4..da26e99be540 100644
--- a/doc/project/citing.rst
+++ b/doc/project/citing.rst
@@ -32,6 +32,12 @@ By version
.. START OF AUTOGENERATED
+v3.10.9
+ .. image:: ../_static/zenodo_cache/19716234.svg
+ :target: https://doi.org/10.5281/zenodo.19716234
+v3.10.8
+ .. image:: ../_static/zenodo_cache/17595503.svg
+ :target: https://doi.org/10.5281/zenodo.17595503
v3.10.7
.. image:: ../_static/zenodo_cache/17298696.svg
:target: https://doi.org/10.5281/zenodo.17298696
diff --git a/doc/release/github_stats.rst b/doc/release/github_stats.rst
index cd9e71ff9376..e01a1727b162 100644
--- a/doc/release/github_stats.rst
+++ b/doc/release/github_stats.rst
@@ -2,20 +2,23 @@
.. _github-stats:
-GitHub statistics for 3.10.8 (Nov 12, 2025)
+GitHub statistics for 3.10.9 (Apr 23, 2026)
===========================================
-GitHub statistics for 2024/12/14 (tag: v3.10.0) - 2025/11/12
+GitHub statistics for 2024/12/14 (tag: v3.10.0) - 2026/04/23
These lists are automatically generated, and may be incomplete or contain duplicates.
-We closed 4 issues and merged 16 pull requests.
-The full list can be seen `on GitHub `__
+We closed 10 issues and merged 34 pull requests.
+The full list can be seen `on GitHub `__
-The following 35 authors contributed 445 commits.
+The following 37 authors contributed 519 commits.
* Aasma Gupta
+* Aman Srivastava
* Antony Lee
+* beelauuu
+* Ben Root
* Christine P. Chai
* David Stansby
* dependabot[bot]
@@ -23,7 +26,6 @@ The following 35 authors contributed 445 commits.
* G.D. McBain
* Greg Lucas
* hannah
-* heinrich5991
* hu-xiaonan
* Ian Thomas
* Inês Cachola
@@ -31,52 +33,76 @@ The following 35 authors contributed 445 commits.
* Jouni K. Seppänen
* Khushi_29
* Kyle Sunden
-* Lucas Gruwez
* Lumberbot (aka Jack)
+* m-sahare
* N R Navaneet
* Nathan G. Wiseman
-* Nathan Goldbaum
-* Nick Coish
* Oscar Gustafsson
* Praful Gulani
* Qian Zhang
-* Rafael Katri
* Raphael Erik Hviding
+* Raphael Quast
* Roman
* Ruth Comer
* saikarna913
* Scott Shambaugh
+* Steve Berardi
* Thomas A Caswell
* Tim Hoffmann
* Trygve Magnus Ræder
+* Vikash Kumar
GitHub issues and pull requests:
-Pull Requests (16):
-
-* :ghpull:`30717`: Backport PR #30714 on branch v3.10.x (FIX: Gracefully handle numpy arrays as input to check_in_list())
-* :ghpull:`30714`: FIX: Gracefully handle numpy arrays as input to check_in_list()
-* :ghpull:`30560`: Consistent zoom boxes
-* :ghpull:`30711`: Backport PR #30697 on branch v3.10.x (BUG: raise when creating a MacOS FigureManager outside the main thread)
-* :ghpull:`30697`: BUG: raise when creating a MacOS FigureManager outside the main thread
-* :ghpull:`30656`: Backport PR #29810 on branch v3.10.x (Declare free-threaded support in MacOS backend extension)
-* :ghpull:`30702`: Backport PR #30624 on branch v3.10.x (TST: Increase tolerances for Ghostscript 10.06)
-* :ghpull:`30700`: Backport PR #30698 on branch v3.10.x (BLD: update trove metadata to support py3.14)
-* :ghpull:`30624`: TST: Increase tolerances for Ghostscript 10.06
-* :ghpull:`30698`: BLD: update trove metadata to support py3.14
-* :ghpull:`30688`: Backport PR #30687 on branch v3.10.x (DOC: Fix pip link)
-* :ghpull:`30675`: Backport PR #30657 on branch v3.10.x (Fix AttributeError: module 'gi' has no attribute 'require_version')
-* :ghpull:`30674`: Backport PR #30672 on branch v3.10.x (Use pathlib.Path instead of matplotlib.path.Path in text.pyi)
-* :ghpull:`30672`: Use pathlib.Path instead of matplotlib.path.Path in text.pyi
-* :ghpull:`30657`: Fix ``AttributeError: module 'gi' has no attribute 'require_version'``
-* :ghpull:`29810`: Declare free-threaded support in MacOS backend extension
-
-Issues (4):
-
-* :ghissue:`30706`: [Bug]: Axes.grouped_bar() with non-string orientation (e.g., NumPy array) raises ambiguous truth-value error instead of clean ValueError
-* :ghissue:`30666`: [Bug]: calling pyplot.gca() outside the main thread crashes the interpreter with the MacOS backend
-* :ghissue:`30669`: [Bug]: Type hint for fontproperties keyword in text.pyi is wrong
-* :ghissue:`30654`: [Bug]: error plotting: AttributeError: module 'gi' has no attribute 'require_version'
+Pull Requests (34):
+
+* :ghpull:`31556`: FIX: Inverted PyErr_Occurred check in enum type caster (_enums.h)
+* :ghpull:`31078`: Backport PR #31075 on branch v3.10.x (Fix remove method for figure title and xy-labels)
+* :ghpull:`31280`: Backport PR #31278 on branch v3.10.x (Fix ``clabel`` manual argument not accepting unit-typed coordinates)
+* :ghpull:`31520`: Backport PR #31020 on branch v3.10.x (DOC: Fix doc builds with Sphinx 9)
+* :ghpull:`31511`: Backport PR #31504 on branch v3.10.x (Re-order variants to prioritize narrower types)
+* :ghpull:`31504`: Re-order variants to prioritize narrower types
+* :ghpull:`31445`: Backport PR #31437: mathtext: Fix type inconsistency with fontmaps
+* :ghpull:`31437`: mathtext: Fix type inconsistency with fontmaps
+* :ghpull:`31411`: Backport PR #31323 on branch v3.10.x (FIX: Prevent crash when removing a subfigure containing subplots)
+* :ghpull:`31421`: Backport PR #31420 on branch v3.10.x (Fix outdated Savannah URL for freetype download)
+* :ghpull:`31420`: Fix outdated Savannah URL for freetype download
+* :ghpull:`31418`: Backport PR #31401: BLD: Temporarily pin setuptools-scm<10
+* :ghpull:`31323`: FIX: Prevent crash when removing a subfigure containing subplots
+* :ghpull:`31401`: BLD: Temporarily pin setuptools-scm<10
+* :ghpull:`31278`: Fix ``clabel`` manual argument not accepting unit-typed coordinates
+* :ghpull:`31154`: Backport PR #31153 on branch v3.10.x (TST: Use correct method of clearing mock objects)
+* :ghpull:`31153`: TST: Use correct method of clearing mock objects
+* :ghpull:`31075`: Fix remove method for figure title and xy-labels
+* :ghpull:`31036`: Backport PR #31035 on branch v3.10.x (DOCS: Fix typo in time array step size comment)
+* :ghpull:`30986`: Backport PR #30985 on branch v3.10.x (MNT: do not assign a numpy array shape)
+* :ghpull:`30985`: MNT: do not assign a numpy array shape
+* :ghpull:`30971`: Backport PR #30969 on branch v3.10.x (DOC: Simplify barh() example)
+* :ghpull:`30965`: Backport PR #30952 on branch v3.10.x (DOC: Tutorial on API shortcuts)
+* :ghpull:`30964`: Backport PR #30960 on branch v3.10.x (SVG backend - handle font weight as integer)
+* :ghpull:`30960`: SVG backend - handle font weight as integer
+* :ghpull:`30924`: Backport PR #30910 on branch v3.10.x (DOC: Improve writer parameter docs of Animation.save())
+* :ghpull:`30870`: Backport PR #30869 on branch v3.10.x (FIX: Accept array for zdir)
+* :ghpull:`30869`: FIX: Accept array for zdir
+* :ghpull:`30860`: Backport PR #30858 on branch v3.10.x (DOC: reinstate "codex" search term)
+* :ghpull:`30818`: Backport PR #30817 on branch v3.10.x (Update sphinx-gallery header patch)
+* :ghpull:`30801`: Backport PR #30763 on branch v3.10.x (DOC: Add example how to align tick labels)
+* :ghpull:`30791`: Backport PR #30788 on branch v3.10.8-doc (Fix typo in key-mapping for "f11")
+* :ghpull:`30790`: Backport PR #30788 on branch v3.10.x (Fix typo in key-mapping for "f11")
+* :ghpull:`30788`: Fix typo in key-mapping for "f11"
+
+Issues (10):
+
+* :ghissue:`31495`: Unavoidable warnings with pybind11 main branch
+* :ghissue:`31433`: [MNT]: Mypy error
+* :ghissue:`31340`: [Bug]: outdated savannah URL in subprojects/freetype-2.6.1.wrap
+* :ghissue:`31319`: [Bug]: Crash when removing a subfigure with a subplot in a figure
+* :ghissue:`27525`: [Bug]: clabel manual argument does not accept units
+* :ghissue:`31112`: [TST] Upcoming dependency test failures
+* :ghissue:`31073`: [Bug]: Crash when Removing Suptitle in a Figure with Constrained Layout
+* :ghissue:`30981`: [TST] Upcoming dependency test failures
+* :ghissue:`30868`: [Bug]: Axe3D text() method does not allow zdir=numpy.array(...)
+* :ghissue:`21566`: [ENH]: set_horizontalalignment("right") on Y axis labels when yaxis.ticks_right() is used.
Previous GitHub statistics
diff --git a/doc/release/prev_whats_new/github_stats_3.10.8.rst b/doc/release/prev_whats_new/github_stats_3.10.8.rst
new file mode 100644
index 000000000000..dd3d19e036eb
--- /dev/null
+++ b/doc/release/prev_whats_new/github_stats_3.10.8.rst
@@ -0,0 +1,77 @@
+.. _github-stats_3-10-8:
+
+GitHub statistics for 3.10.8 (Nov 12, 2025)
+===========================================
+
+GitHub statistics for 2024/12/14 (tag: v3.10.0) - 2025/11/12
+
+These lists are automatically generated, and may be incomplete or contain duplicates.
+
+We closed 4 issues and merged 16 pull requests.
+The full list can be seen `on GitHub `__
+
+The following 35 authors contributed 445 commits.
+
+* Aasma Gupta
+* Antony Lee
+* Christine P. Chai
+* David Stansby
+* dependabot[bot]
+* Elliott Sales de Andrade
+* G.D. McBain
+* Greg Lucas
+* hannah
+* heinrich5991
+* hu-xiaonan
+* Ian Thomas
+* Inês Cachola
+* Jody Klymak
+* Jouni K. Seppänen
+* Khushi_29
+* Kyle Sunden
+* Lucas Gruwez
+* Lumberbot (aka Jack)
+* N R Navaneet
+* Nathan G. Wiseman
+* Nathan Goldbaum
+* Nick Coish
+* Oscar Gustafsson
+* Praful Gulani
+* Qian Zhang
+* Rafael Katri
+* Raphael Erik Hviding
+* Roman
+* Ruth Comer
+* saikarna913
+* Scott Shambaugh
+* Thomas A Caswell
+* Tim Hoffmann
+* Trygve Magnus Ræder
+
+GitHub issues and pull requests:
+
+Pull Requests (16):
+
+* :ghpull:`30717`: Backport PR #30714 on branch v3.10.x (FIX: Gracefully handle numpy arrays as input to check_in_list())
+* :ghpull:`30714`: FIX: Gracefully handle numpy arrays as input to check_in_list()
+* :ghpull:`30560`: Consistent zoom boxes
+* :ghpull:`30711`: Backport PR #30697 on branch v3.10.x (BUG: raise when creating a MacOS FigureManager outside the main thread)
+* :ghpull:`30697`: BUG: raise when creating a MacOS FigureManager outside the main thread
+* :ghpull:`30656`: Backport PR #29810 on branch v3.10.x (Declare free-threaded support in MacOS backend extension)
+* :ghpull:`30702`: Backport PR #30624 on branch v3.10.x (TST: Increase tolerances for Ghostscript 10.06)
+* :ghpull:`30700`: Backport PR #30698 on branch v3.10.x (BLD: update trove metadata to support py3.14)
+* :ghpull:`30624`: TST: Increase tolerances for Ghostscript 10.06
+* :ghpull:`30698`: BLD: update trove metadata to support py3.14
+* :ghpull:`30688`: Backport PR #30687 on branch v3.10.x (DOC: Fix pip link)
+* :ghpull:`30675`: Backport PR #30657 on branch v3.10.x (Fix AttributeError: module 'gi' has no attribute 'require_version')
+* :ghpull:`30674`: Backport PR #30672 on branch v3.10.x (Use pathlib.Path instead of matplotlib.path.Path in text.pyi)
+* :ghpull:`30672`: Use pathlib.Path instead of matplotlib.path.Path in text.pyi
+* :ghpull:`30657`: Fix ``AttributeError: module 'gi' has no attribute 'require_version'``
+* :ghpull:`29810`: Declare free-threaded support in MacOS backend extension
+
+Issues (4):
+
+* :ghissue:`30706`: [Bug]: Axes.grouped_bar() with non-string orientation (e.g., NumPy array) raises ambiguous truth-value error instead of clean ValueError
+* :ghissue:`30666`: [Bug]: calling pyplot.gca() outside the main thread crashes the interpreter with the MacOS backend
+* :ghissue:`30669`: [Bug]: Type hint for fontproperties keyword in text.pyi is wrong
+* :ghissue:`30654`: [Bug]: error plotting: AttributeError: module 'gi' has no attribute 'require_version'
diff --git a/doc/release/release_notes.rst b/doc/release/release_notes.rst
index 8ea4ad3d4f57..e2cd258ee3a7 100644
--- a/doc/release/release_notes.rst
+++ b/doc/release/release_notes.rst
@@ -19,10 +19,12 @@ Version 3.10
:maxdepth: 1
prev_whats_new/whats_new_3.10.0.rst
+ ../api/prev_api_changes/api_changes_3.10.9.rst
../api/prev_api_changes/api_changes_3.10.7.rst
../api/prev_api_changes/api_changes_3.10.1.rst
../api/prev_api_changes/api_changes_3.10.0.rst
github_stats.rst
+ prev_whats_new/github_stats_3.10.8.rst
prev_whats_new/github_stats_3.10.7.rst
prev_whats_new/github_stats_3.10.6.rst
prev_whats_new/github_stats_3.10.5.rst
diff --git a/tools/cache_zenodo_svg.py b/tools/cache_zenodo_svg.py
index 07b67a3e04ee..2ac019140196 100644
--- a/tools/cache_zenodo_svg.py
+++ b/tools/cache_zenodo_svg.py
@@ -63,6 +63,8 @@ def _get_xdg_cache_dir():
if __name__ == "__main__":
data = {
+ "v3.10.9": "19716234",
+ "v3.10.8": "17595503",
"v3.10.7": "17298696",
"v3.10.6": "16999430",
"v3.10.5": "16644850",