Like I did last year, I reserved some time during my holiday break to prepare an independent report of the Flask ecosystem in 2025.

Project activity
Before I start showing you numbers, I feel it is necessary to clarify that I have not used large language models (LLMs) or other generative AI tools to help me create the reports you will see in this article. Consequently, the chance I’m showing you hallucinated data is zero. The chance of me having made a mistake is not zero, however, so please do check my work and if you find any errors let me know so that I can correct them!
Okay, let’s get to it. The Flask project released twice du…
Like I did last year, I reserved some time during my holiday break to prepare an independent report of the Flask ecosystem in 2025.

Project activity
Before I start showing you numbers, I feel it is necessary to clarify that I have not used large language models (LLMs) or other generative AI tools to help me create the reports you will see in this article. Consequently, the chance I’m showing you hallucinated data is zero. The chance of me having made a mistake is not zero, however, so please do check my work and if you find any errors let me know so that I can correct them!
Okay, let’s get to it. The Flask project released twice during all of 2025, and both releases were patch releases to the 3.1.0 release that came out in November 2024. In short, not much has happened in Flask during 2025.
To put this into perspective, here is a table that shows the releases since 2018, the year in which version 1.0.0 came out:
| Year | Major.Minor | Patch release count | Total releases |
|---|---|---|---|
| 2018 | 1.0 | 4 | 5 |
| 2019 | 1.1 | 3 | 4 |
| 2020 | 2 | 2 | |
| 2021 | 2.0 | 4 | 5 |
| 2022 | 2.1, 2.2 | 6 | 8 |
| 2023 | 2.3, 3.0 | 6 | 8 |
| 2024 | 3.1 | 3 | 4 |
| 2025 | 2 | 2 |
But of course, the releases do not tell the complete story. I also like to look at GitHub activity to see how things are going with the project. Below is a table that shows the number of pull requests that were merged per year, also since 2018:
| Merged PRs | Flask | Werkzeug | Total |
|---|---|---|---|
| 2018 | 111 | 93 | 204 |
| 2019 | 142 | 103 | 245 |
| 2020 | 120 | 162 | 282 |
| 2021 | 178 | 175 | 353 |
| 2022 | 134 | 92 | 226 |
| 2023 | 111 | 133 | 244 |
| 2024 | 58 | 73 | 131 |
| 2025 | 26 | 17 | 43 |
It is likely that there are a small number of commits that are not counted in this table because they were made directly and not through a pull request, but from a quick review of the commit log it does not appear this is something that the Flask maintainers do very often. So I feel this is an accurate representation of the project activity that confirms the decreasing trend that I also noted in my review of last year.
This time I thought it would be a good idea to also look at pull requests that were closed without merging.
| Unmerged PRs | Flask | Werkzeug | Total | % |
|---|---|---|---|---|
| 2018 | 64 | 52 | 116 | 36% |
| 2019 | 68 | 19 | 87 | 26% |
| 2020 | 76 | 35 | 111 | 28% |
| 2021 | 109 | 50 | 159 | 31% |
| 2022 | 90 | 36 | 126 | 36% |
| 2023 | 81 | 34 | 115 | 32% |
| 2024 | 53 | 24 | 77 | 37% |
| 2025 | 99 | 14 | 113 | 72% |
And this is quite interesting. Historically, the percentage of all pull requests that ended up closed without merging was hovering around 30%, but in 2025 it jumped to 72%. I guess one possible explanation to this large increase could be that the Flask maintainers consider that the project is now fairly complete, so they are less interested in accepting contributions from the community.
Another explanation is that in 2025 many developers started using generative AI tools to create pull requests. This is a new trend that I noticed on my own projects as well. These pull requests are almost always bad, and the contributors that submit them do not have the interest nor the knowledge to improve them. One example that supports this theory is this simple documentation issue. There is currently an open pull request for it that is awaiting review from the maintainers, but I counted 7 closed PRs from people who submitted their own versions of this fix, most of them dated after the currently in-progress one, and all failing to properly address the reported issue.
What’s new in Flask
This was an extremely slow year for Flask, so there is nothing really new and exciting to report. There is a fix for an issue that prevented the stream_with_context from working in asynchronous routes. Aside from this, there were a handful of Python typing fixes and a change in the order in which rotated secret keys are tried. The changes that went into Werkzeug during 2025 were also minor and equally uninteresting.
I reviewed the list of 47 pull requests that were merged during 2025 for the Flask and Werkzeug projects, to see if I could find anything worth reporting that is not reflected in the change logs or that maybe hasn’t been released yet. And I did find a couple of nuggets.
In the 2024 review, I reported that there was a plan to merge the application and request contexts into a single context. This change has already been made, and will be included in the 3.2.0 release, which does not have a date yet. Overall, my opinion of this change can be summarized in three letters: "meh". It is a large internal change that simplifies and restructures the context handling logic, but for Flask users this does not appear to bring any substantial benefits. At least I fail to see them if they exist.
There are good news and bad news about this change. The good news is that there are only very minor externally facing behavior changes planned for the upcoming 3.2 release. The functionality of the request context was moved to the app context, but in 3.2 there will still be a request context, although it will be deprecated. You may see some deprecation warnings from your own code or from Flask extensions that access the request context directly, but aside from that everything will hopefully continue to work as before.
The bad news is that the request context will be removed completely when 4.0 is released, so at that point I expect some applications will stop working and will need code changes or dependency updates before they can be upgraded to the latest version of Flask. What’s unclear to me is when will 4.0 be released, what will be in it besides this, and how much time there will be between the 3.2 and 4.0 releases. At the current pace of development it is really hard to find justification for a new major release anyway, so maybe this isn’t going to be a problem for a while. We’ll have to see how the Flask maintainers handle this transition.
Another interesting change that isn’t mentioned in the change log is that since the 3.1.1 release Flask and Werkzeug have switched to the uv package manager for its continuous integration and release jobs on GitHub Actions.
What about Quart?
As I’m sure most of you know, Quart is an async-native port of Flask, created by Phil Jones and also maintained by the Flask core developers, a group that includes Phil as well.
Sadly, Quart did not have any releases in 2025. The last release is 0.20.0, which came out in December 2024.
Looking at the Quart repository on GitHub, there have been only 14 commits in all of 2025, and they were all for minor things such as adding a new logo, improving type hints or fixing documentation typos.
Flask extensions
This time around I thought it would be good to take a quick look at the most frequently used extensions for Flask and see how active they have been.
| Extension | Last release | Last commit |
|---|---|---|
| Flask-Login | October 2023 | August 2025 |
| Flask-Security | November 2025 | December 2025 |
| Flask-HTTPAuth (*) | August 2023 | December 2025 |
| Flask-SQLAlchemy | September 2023 | June 2025 |
| Flask-Migrate (*) | January 2025 | December 2025 |
| Flask-Session | March 2024 | April 2024 |
| Flask-WTF | October 2024 | December 2025 |
| Flask-Mail | May 2024 | June 2025 |
| Flask-Admin | November 2025 | December 2025 |
| Flask-Babel | October 2023 | June 2024 |
| Flask-CORS | December 2025 | December 2025 |
| Flask-SocketIO (*) | December 2025 | December 2025 |
| Flask-Moment (*) | January 2025 | December 2025 |
I came up with this list from memory, so please don’t be offended if I missed some of your favorite extensions. Also, inclusion in this list doesn’t mean I’m making an endorsement. In fact, some of these extensions I do not like and never use in my projects. I do, however, fully endorse the ones that are marked with (*), as these are maintained by myself.
Something that is important to mention is that several of these extensions are currently maintained by the pallets-eco organization, a group of volunteers dedicated to keeping extensions updated after their original creators or maintainers move on to other things.
Flask vs. other web frameworks
Let’s see how Flask stands against competing Python web frameworks.
First we can compare download counts. For this I’m using the PyPI BigQuery dataset, which has download counts for all PyPI packages.
| Downloads | Flask | Django | FastAPI |
|---|---|---|---|
| 2023 | 1001M (73%) | 135M (10%) | 228M (17%) |
| 2024 | 1160M (58%) | 225M (11%) | 612M (31%) |
| 2025 | 1577M (46%) | 313M (9%) | 1523M (45%) |
From this table you can see that the three leading frameworks all gained downloads, but FastAPI did it at an incredible pace. In practical terms, Flask and FastAPI are now tied at the top.
But of course, the download numbers for Django are suspiciously low. I noticed this last year, and couldn’t find an explanation, so if you have any theories let me know. Below you can see the queries that I used to get the 2025 download counts, in case you want to debug them and investigate this difference in downloads:
SELECT COUNT(*) FROM `bigquery-public-data.pypi.file_downloads` WHERE TIMESTAMP_TRUNC(timestamp, DAY) BETWEEN TIMESTAMP("2025-01-01") AND TIMESTAMP("2026-01-01") AND file.project = "flask"
SELECT COUNT(*) FROM `bigquery-public-data.pypi.file_downloads` WHERE TIMESTAMP_TRUNC(timestamp, DAY) BETWEEN TIMESTAMP("2025-01-01") AND TIMESTAMP("2026-01-01") AND file.project = "django"
SELECT COUNT(*) FROM `bigquery-public-data.pypi.file_downloads` WHERE TIMESTAMP_TRUNC(timestamp, DAY) BETWEEN TIMESTAMP("2025-01-01") AND TIMESTAMP("2026-01-01") AND file.project = "fastapi"
We can also have a look at the last Python developer survey, which was conducted in Q4 of 2024, but is the last one available at the time I’m writing this in December 2025. Here is how the top three web frameworks split among developers in the last two surveys:
| Survey | Flask | Django | FastAPI |
|---|---|---|---|
| 2023 | 33% | 33% | 29% |
| 2024 | 34% | 35% | 38% |
Here we can see once again that FastAPI is unstoppable at the moment. And before this is asked in the comments, the answer is no, I’m not currently planning a FastAPI Mega-Tutorial. But I never say never...
And with this, I conclude this review of the Flask project in 2025. I hope you find this analysis useful. Happy 2026, and I hope you’ll be back in one year for another Flask review!
Thank you for visiting my blog! If you enjoyed this article, please consider supporting my work and keeping me caffeinated with a small one-time donation through Buy me a coffee. Thanks!