Backend Frameworks Comparison
|
This content was generated with the assistance of AI and should be verified against the official documentation of each framework before being relied on. See the bibliographies of the Backend Frameworks Comparison and the Web Frameworks Comparison for the data sources and the date of each figure. |
This page compares 48 backend frameworks on the same metrics: the frameworks documented on this site, plus others that matter because they are popular, because they are growing, or for historical context. Every number carries a source and a date, and anything that could not be sourced is shown as n/a instead of being estimated. The data snapshot date is 2026-10-27: all sources were read on that day, and each caption names the edition or measurement date of its data. Downloads, survey shares and stars change every month, so treat the figures as a dated snapshot.
The raw data (CSV files), the chart and table generators and the scoring rubric are kept in the repository under scripts/framework-charts/; npm run charts:frameworks regenerates every figure and table on this page.
The view layers of full-stack frameworks (Razor and Blazor, Django templates, Blade, Livewire and Inertia, Thymeleaf) are compared on the Web Frameworks Comparison; language-level metrics (indices, benchmarks of the languages themselves, salaries) are on the Programming Languages Comparative.
Jump to the Summary and recommendations if you only need the conclusions.
Scope and inclusion criteria
A framework is included when at least one of these holds:
-
It has its own section on this site: Spring Boot, Quarkus, Jakarta EE (through the JSF and JSP and Struts sections), ASP.NET Core, ASP.NET MVC 5 and Web API 2, ASP.NET Web Forms, Express and Fastify (in Node.js), NestJS, Django, FastAPI, Flask, Tornado, Pyramid, Laravel, axum and Vapor.
-
It appears in the framework lists of the Stack Overflow Developer Survey 2025, State of JS 2025 or the JetBrains State of Developer Ecosystem 2023, or ranks in its registry’s downloads: Micronaut, Helidon, Ktor, Vert.x, Javalin and Play (JVM); Hono, Koa, AdonisJS and Elysia (Node.js and Bun); Litestar, Sanic, Django REST framework and Django Ninja (Python); Symfony, Slim and CodeIgniter (PHP); Actix Web, Rocket and Loco (Rust); Hummingbird (Swift); Ruby on Rails, Gin, Echo, Fiber, Go
net/httpas the baseline, and Phoenix (Elixir). -
It matters for history: ASP.NET Web Forms, Apache Struts, J2EE and EJB 2, Zend Framework and Laminas, CakePHP.
Frameworks without a section on this site get fewer metrics where data is scarce: the feature matrix, the deployment-target coverage and some concurrency rows are only assessed for the documented ones. Runtimes (Node.js, Deno, Bun) and content-management systems (WordPress, Drupal) appear in some surveys but are not frameworks and are excluded; WordPress is documented in WordPress and compared with other CMSs on the CMS Comparison. Every framework name links to its section on this site, or to its official website when the site has no section.
| Framework | Group | Language | First release | Status | Licence | Governance | On this site |
|---|---|---|---|---|---|---|---|
jvm |
Java/Kotlin |
2014-04-01 |
active |
Apache-2.0 |
n/a |
yes |
|
jvm |
Java/Kotlin |
2019-03-06 |
active |
Apache-2.0 |
Commonhaus Foundation |
yes |
|
jvm |
Java |
2019-09-03 |
active |
n/a |
Eclipse Foundation |
yes |
|
jvm |
Java/Kotlin |
2018-10-23 |
active |
Apache-2.0 |
n/a |
no |
|
jvm |
Java |
2018-09-05 |
active |
Apache-2.0 |
n/a |
no |
|
jvm |
Kotlin |
2018-11-19 |
active |
Apache-2.0 |
JetBrains |
no |
|
jvm |
Java |
2014-05-27 |
active |
n/a |
Eclipse Foundation |
no |
|
jvm |
Java/Kotlin |
2017-05-24 |
active |
Apache-2.0 |
n/a |
no |
|
jvm |
Scala/Java |
2019-06-19 |
active |
Apache-2.0 |
n/a |
no |
|
dotnet |
C# |
2016-06-27 |
active |
MIT |
Microsoft |
yes |
|
dotnet |
C# |
2012-05-31 |
legacy |
n/a |
Microsoft |
yes |
|
dotnet |
C# |
2002 |
legacy |
n/a |
Microsoft |
yes |
|
node |
JavaScript/TypeScript |
2010-12-29 |
active |
MIT |
OpenJS Foundation |
yes |
|
node |
JavaScript/TypeScript |
2016-10-07 |
active |
MIT |
OpenJS Foundation |
yes |
|
node |
TypeScript |
2017-05-14 |
active |
MIT |
n/a |
yes |
|
node |
TypeScript |
2021-12-14 |
active |
MIT |
Yusuke Wada and Hono contributors |
no |
|
node |
JavaScript |
2013-11-06 |
active |
MIT |
n/a |
no |
|
node |
TypeScript |
2019-01-26 |
active |
MIT |
n/a |
no |
|
node |
TypeScript (Bun) |
2022-12-24 |
active |
MIT |
n/a |
no |
|
python |
Python |
2010-05-17 |
active |
BSD-3-Clause |
Django Software Foundation |
yes |
|
python |
Python |
2018-12-08 |
active |
MIT |
n/a |
yes |
|
python |
Python |
2010-04-16 |
active |
BSD-3-Clause |
Pallets |
yes |
|
python |
Python |
2010-05-18 |
active |
Apache-2.0 |
The Tornado Authors |
yes |
|
python |
Python |
2011-01-31 |
active |
LicenseRef-Repoze-BSD-derived |
n/a |
yes |
|
python |
Python |
2023-08-21 |
active |
MIT |
Litestar organisation |
no |
|
python |
Python |
2016-10-15 |
active |
MIT |
Sanic Community Organization |
no |
|
python |
Python |
2011-02-21 |
active |
BSD-3-Clause |
n/a |
no |
|
python |
Python |
2019-12-04 |
active |
MIT |
n/a |
no |
|
php |
PHP |
2013-05-28 |
active |
MIT |
n/a |
yes |
|
php |
PHP |
2011-12-08 |
active |
MIT |
Symfony SAS (sponsor) and community |
no |
|
php |
PHP |
2012-04-14 |
active |
MIT |
n/a |
no |
|
php |
PHP |
2020-02-24 |
active |
MIT |
CodeIgniter Foundation |
no |
|
rust |
Rust |
2021-07-22 |
active |
MIT |
n/a |
yes |
|
rust |
Rust |
2017-10-23 |
active |
MIT OR Apache-2.0 |
The Actix Team |
no |
|
rust |
Rust |
2016-12-23 |
active |
MIT OR Apache-2.0 |
Sergio Benitez |
no |
|
rust |
Rust |
2023-11-23 |
active |
Apache-2.0 |
n/a |
no |
|
swift |
Swift |
n/a |
active |
MIT |
QuTheory, LLC |
yes |
|
swift |
Swift |
n/a |
active |
Apache-2.0 |
n/a |
no |
|
other |
Ruby |
2009-07-25 |
active |
MIT |
n/a |
no |
|
other |
Go |
2016-12-03 |
active |
MIT |
n/a |
no |
|
other |
Go |
2015-04-01 |
active |
MIT |
LabStack LLC |
no |
|
other |
Go |
2020-01-15 |
active |
MIT |
n/a |
no |
|
other |
Go |
n/a |
active |
n/a |
n/a |
no |
|
other |
Elixir |
2014-04-21 |
active |
MIT |
phoenixframework.org |
no |
|
historical |
Java |
2001 |
legacy |
Apache-2.0 |
Apache Software Foundation |
yes |
|
historical |
Java |
n/a |
historical |
n/a |
n/a |
no |
|
historical |
PHP |
2019-12-31 |
legacy |
BSD-3-Clause |
Linux Foundation |
no |
|
historical |
PHP |
2014-01-26 |
active |
MIT |
Cake Software Foundation |
no |
How metrics, scales and scores were assigned
Metrics. A value is recorded only when it was read in the source named for it; otherwise it is n/a and charts draw a gap or an "n/a" label, never a zero.
Values derived from published data (State of JS ratios from the published answer counts, TechEmpower requests per second from the raw results, js-framework-benchmark factors) use the publisher’s own formula, documented in scripts/framework-charts/data/NOTES.md.
| Metric | What it measures | Source | Edition or date |
|---|---|---|---|
Survey usage, admired, desired |
Share of respondents who used a framework; share of its users who want to keep using it; share of all respondents who want to use it |
2019 to 2025 (2026 has no frameworks question) |
|
State of JS usage, retention, interest |
Usage, positive sentiment among users (retention) and among non-users (interest), Node.js frameworks only |
2016 to 2025 |
|
Share within a language |
Share of a language’s developers who use the framework (only comparable within one language) |
2023 (with 2022) |
|
Registry downloads |
npm, PyPI, Packagist, NuGet, crates.io, Hex and RubyGems downloads, each registry with its own unit and period; Maven Central publishes none |
12 months to 2026-06 (npm), last 30 or 90 days, or totals |
|
GitHub stars |
Stars of the main repository |
snapshot read 2026-10-27 |
|
Job demand |
Share of Hacker News "Who is hiring?" postings that mention the framework |
Hacker News through Algolia |
2015-01 to 2026-10 |
Throughput |
Responses per second in TechEmpower tests (JSON, single query, multiple queries, fortunes, plaintext) |
rounds 16 to 23 (round 23 run on 2025-01-30, the last) |
|
Memory and startup |
Published RSS, memory and startup figures (no house measurements) |
2026-06-02 run; home pages read 2026-10-27 |
|
Ecosystem and support |
Release history, major versions, release cadence, support cycles and LTS |
package registries, endoflife.date |
2026-10-27 |
Security |
Advisories per year, OpenSSF Scorecard and its security-policy check |
2026-10-27; Scorecard run 2026-08-24 |
Radar scores (0 to 10, higher is better). Each radar axis is either computed ©, a formula over the data, or editorial (E), a judgement with a written basis per framework. Scores are relative to the frameworks on this page: 10 is the best in this comparison, not a theoretical maximum, and an axis without inputs is n/a.
-
Popularity ©: mean of the survey usage relative to the most used framework, registry downloads on a log scale within one registry (a framework on several registries is scored in the one with the most frameworks on this page), and GitHub stars on a log scale.
-
Growth ©: change in survey usage from 2023 to 2025, in npm downloads and Packagist downloads year over year, and in State of JS usage, each scaled between the slowest and fastest grower.
-
Talent pool and jobs ©: professional usage in the survey and Hacker News job-posting share, relative to the best framework.
-
Ease of use (E): concepts to learn before the first endpoint, configuration needed, conventions, and quality of the official tutorial, supported by the admired and retention scores.
-
Ecosystem and maturity (E): age, release cadence, support policy and LTS, governance, extension ecosystem and official integrations.
-
Productivity (E): batteries included (the feature matrix), scaffolding and hot reload.
-
Throughput ©: TechEmpower round 23 fortunes,
10 × (1 − log10(best / rps) / 2); 100 times slower than the best scores 0. -
Memory and Startup ©: from the like-for-like Quarkus comparison only, JIT variant; 10 times more than the best scores 0.
Registry downloads count CI runs, mirrors and caches, not people, and the units of the registries differ (npm counts per tarball, Packagist per install, PyPI without mirrors). They are therefore only compared within one registry, never on one axis.
The full formulas, the rubric and the method of every dataset are in scripts/framework-charts/data/NOTES.md.
Overview and timeline
The oldest frameworks still in wide use date from the late 2000s: Django, Flask and Tornado reached PyPI in 2010, Express in 2010 and Ruby on Rails on RubyGems in 2009. The JVM frameworks built for containers (Quarkus, Micronaut, Helidon) arrived in 2018 and 2019, and the newest frameworks here are Hono (2021), Elysia (2022), Litestar (2.0 in 2023) and Loco (2023). Registry dates are the first publication on the registry, which for older projects can be later than the first release; the timeline uses them so that every date has a source.
frameworks.csv, read 2026-10-27.Popularity
Three independent signals are used: what developers say they use (surveys), what build systems download (registries) and what developers star (GitHub). In the Stack Overflow survey 2025, the most used backend frameworks are Express (19.9% of respondents), ASP.NET Core (19.7%), FastAPI (14.8%), Spring Boot (14.7%) and Flask (14.4%); classic ASP.NET still has 14.2%. The highest admired scores belong to the less used Phoenix (79%) and axum (76.4%), followed by ASP.NET Core (61.3%) and FastAPI (55.5%).
The JetBrains survey asks each language community separately, so its shares only compare frameworks of the same language: 72% of Java developers use Spring Boot, against 4% for Quarkus and 2% for Micronaut; 61% of PHP developers use Laravel and 21% Symfony; Django (40%) and Flask (38%) are close among Python developers in 2023, with FastAPI at 25% (20% in 2022).
For Node.js frameworks, State of JS 2025 adds usage among JavaScript developers: Express is used by 80.8% of the respondents to that question, NestJS by 32%, Fastify by 20.2% and Hono by 15.5%.
Registry downloads must be read within one registry. On npm, Express had 3,513 million downloads in the 12 months to 2026-06, Hono 841 million, NestJS 362 million, Koa 301 million and Fastify 237 million. Maven Central publishes no download counts, so JVM frameworks have no registry signal; .NET’s ASP.NET Core ships with the SDK, so its NuGet counts are a proxy.
GitHub stars favour projects that are popular with individual developers: FastAPI (103,301), Django (91,473), Gin (89,403), Spring Boot (81,754) and NestJS (76,893) lead.
| Framework | SO usage 2025 | SO admired | SO desired | State of JS usage 2025 | State of JS retention | JetBrains 2023 (own language) | GitHub stars |
|---|---|---|---|---|---|---|---|
14.7% |
53.7% |
11.0% |
n/a |
n/a |
72.0% |
82k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
4.0% |
16k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
2.0% |
6k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
1.0% |
4k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
3.0% |
15k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
15k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
8k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
22.0% |
13k |
|
19.7% |
61.3% |
14.7% |
n/a |
n/a |
56.0% |
38k |
|
14.2% |
34.1% |
6.5% |
n/a |
n/a |
34.0% |
1k |
|
19.9% |
45.5% |
11.4% |
80.8% |
81.2% |
20.0% |
70k |
|
2.9% |
49.7% |
2.7% |
20.2% |
86.5% |
n/a |
37k |
|
6.7% |
49.8% |
6.0% |
32.0% |
73.7% |
n/a |
77k |
|
n/a |
n/a |
n/a |
15.5% |
95.0% |
n/a |
33k |
|
n/a |
n/a |
n/a |
11.7% |
64.4% |
n/a |
36k |
|
n/a |
n/a |
n/a |
3.8% |
79.2% |
n/a |
19k |
|
n/a |
n/a |
n/a |
5.5% |
91.1% |
n/a |
19k |
|
12.6% |
46.4% |
10.4% |
n/a |
n/a |
40.0% |
91k |
|
14.8% |
55.5% |
13.0% |
n/a |
n/a |
25.0% |
103k |
|
14.4% |
41.7% |
8.9% |
n/a |
n/a |
38.0% |
75k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
2.0% |
22k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
2.0% |
4k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
9k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
19k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
30k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
9k |
|
8.9% |
47.8% |
6.5% |
n/a |
n/a |
61.0% |
35k |
|
4.0% |
50.0% |
3.1% |
n/a |
n/a |
21.0% |
31k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
4.0% |
12k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
10.0% |
6k |
|
2.8% |
76.4% |
3.8% |
n/a |
n/a |
n/a |
28k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
25k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
26k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
10k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
26k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
2k |
|
5.9% |
52.0% |
5.5% |
n/a |
n/a |
85.0% |
59k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
51.0% |
89k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
13.0% |
33k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
40k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
43.0% |
n/a |
|
2.4% |
79.0% |
4.0% |
n/a |
n/a |
n/a |
23k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
1k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
3.0% |
0k |
|
n/a |
n/a |
n/a |
n/a |
n/a |
5.0% |
9k |
| Framework | Registry | Package | Period | Downloads | Primary | Source |
|---|---|---|---|---|---|---|
npm |
express |
12 months to 2026-06 |
3512.9M |
yes |
||
npm |
hono |
12 months to 2026-06 |
840.8M |
yes |
||
npm |
@nestjs/core |
12 months to 2026-06 |
362.3M |
yes |
||
npm |
koa |
12 months to 2026-06 |
301.2M |
yes |
||
npm |
fastify |
12 months to 2026-06 |
236.5M |
yes |
||
npm |
elysia |
12 months to 2026-06 |
14.7M |
yes |
||
npm |
@adonisjs/core |
12 months to 2026-06 |
3.4M |
yes |
||
PyPI |
fastapi |
last 30 days |
381.6M |
yes |
||
PyPI |
flask |
last 30 days |
136.5M |
yes |
||
PyPI |
tornado |
last 30 days |
97.7M |
yes |
||
PyPI |
django |
last 30 days |
41.1M |
yes |
||
PyPI |
djangorestframework |
last 30 days |
24.1M |
yes |
||
PyPI |
django-ninja |
last 30 days |
3.7M |
yes |
||
PyPI |
pyramid |
last 30 days |
2.0M |
yes |
||
PyPI |
litestar |
last 30 days |
1.7M |
yes |
||
PyPI |
sanic |
last 30 days |
1.1M |
yes |
||
Packagist |
laravel/framework |
last 30 days |
20.2M |
yes |
||
Packagist |
symfony/framework-bundle |
last 30 days |
8.6M |
yes |
||
Packagist |
slim/slim |
last 30 days |
1.5M |
yes |
||
Packagist |
cakephp/cakephp |
last 30 days |
0.5M |
yes |
||
Packagist |
laminas/laminas-mvc |
last 30 days |
0.5M |
yes |
||
Packagist |
codeigniter4/framework |
last 30 days |
0.4M |
yes |
||
NuGet |
Microsoft.AspNetCore.App.Ref |
total |
593.0M |
yes |
||
NuGet |
Microsoft.AspNetCore.Mvc.Testing |
total |
430.3M |
no |
||
NuGet |
Microsoft.AspNet.WebApi.Core |
total |
413.4M |
no |
||
NuGet |
Microsoft.AspNet.Mvc |
total |
315.7M |
yes |
||
NuGet |
Microsoft.AspNetCore.OpenApi |
total |
271.0M |
no |
||
crates.io |
axum |
last 90 days |
142.7M |
yes |
||
crates.io |
actix-web |
last 90 days |
12.4M |
yes |
||
crates.io |
rocket |
last 90 days |
2.3M |
yes |
||
crates.io |
loco-rs |
last 90 days |
0.1M |
yes |
||
Hex |
phoenix |
last 90 days |
5.9M |
yes |
||
RubyGems |
rails |
total |
807.2M |
yes |
Growth trends
The survey series shows the steadiest movements. FastAPI doubled its share of Stack Overflow respondents between 2023 (7.42%) and 2025 (14.8%), and ASP.NET Core grew from 16.57% to 19.7%; classic ASP.NET fell from 26.3% in 2019 to 14.2% in 2025. Express stayed flat (19.28% in 2023, 19.9% in 2025).
On npm, Hono’s downloads grew 28 times between the 12 months to 2025-06 and the 12 months to 2026-06 (from 30 million to 841 million), Elysia’s 5.3 times and the others about twice; months for which the npm API returned no data are gaps. On Packagist, average daily installs keep rising: Laravel from 266,983 (July 2024 to June 2025) to 292,970 (July 2025 to June 2026), Symfony from 130,141 to 145,107.
The popularity-against-growth view separates established and rising frameworks (right and top: FastAPI, Hono), established and plateauing ones (right and bottom: Express, Django, Ruby on Rails) and smaller risers. GitHub stars over time are not shown yet, so this page does not meet the "stars over time" goal of its specification: the GitHub API refused the authoring environment, the GH Archive dataset on BigQuery needs cloud credentials, and the public ClickHouse copy of GitHub events only starts in 2023 and is incomplete. A later update with credentials can add the yearly history.
Talent pool and job market
Ease of finding developers. The pool is largest for the frameworks with the highest professional usage in the 2025 survey: ASP.NET Core (21.3% of professional respondents), Express (20.3%) and Spring Boot (15.6%), followed by FastAPI and Flask.
Job opportunities. In the 2025 Hacker News "Who is hiring?" threads, Ruby on Rails appears in 3.79% of the postings, FastAPI in 2.95%, Django in 2.65% and NestJS in 0.82%; Rails was at 12.44% in 2015 and Django at 5.98%. These threads lean towards start-ups and remote work, and framework names that are common words (Gin, Echo, Fiber, Play, Rocket, Phoenix on its own) are not counted. No source publishes salaries by framework; language-level salaries are on the Programming Languages Comparative.
| Framework | SO 2025 all respondents | SO 2025 professionals | HN hiring 2025 | HN hiring 2020 | HN hiring 2015 | Salary |
|---|---|---|---|---|---|---|
14.7% |
15.6% |
0.3% |
1.0% |
0.5% |
n/a |
|
n/a |
n/a |
0.1% |
0.0% |
0.0% |
n/a |
|
n/a |
n/a |
0.0% |
0.2% |
0.0% |
n/a |
|
19.7% |
21.3% |
0.0% |
0.2% |
0.0% |
n/a |
|
14.2% |
15.0% |
0.3% |
0.4% |
0.7% |
n/a |
|
19.9% |
20.3% |
0.1% |
0.5% |
0.2% |
n/a |
|
2.9% |
3.1% |
0.3% |
0.0% |
0.0% |
n/a |
|
6.7% |
7.4% |
0.8% |
0.1% |
0.0% |
n/a |
|
12.6% |
11.7% |
2.6% |
4.9% |
6.0% |
n/a |
|
14.8% |
15.1% |
3.0% |
0.1% |
0.0% |
n/a |
|
14.4% |
13.2% |
0.5% |
1.4% |
1.7% |
n/a |
|
8.9% |
9.3% |
0.5% |
0.9% |
0.4% |
n/a |
|
4.0% |
4.3% |
0.1% |
0.3% |
0.5% |
n/a |
|
2.8% |
2.7% |
0.0% |
0.0% |
0.0% |
n/a |
|
n/a |
n/a |
0.0% |
0.0% |
0.0% |
n/a |
|
5.9% |
6.2% |
3.8% |
7.5% |
12.4% |
n/a |
|
2.4% |
2.5% |
0.3% |
0.3% |
0.0% |
n/a |
Ease of use and learning curve
Ease of use is an editorial score (rubric above, basis per framework in the radar tables). Micro-frameworks (Flask, Express, Hono, Gin) need the fewest concepts before the first endpoint; convention-driven full-stack frameworks (Ruby on Rails, Laravel, Django) need more concepts but guide every step; frameworks built on dependency injection and modules (Spring Boot, NestJS) and on new runtime models (axum, Actix Web, Phoenix) take longest to learn. Supporting signals are the admired scores (Phoenix 79%, axum 76.4%, ASP.NET Core 61.3%) and State of JS retention (Hono 95%, Elysia 91.1%, Fastify 86.5%). The site’s own comparisons go deeper for some pairs: Quarkus versus Spring Boot, Express and Fastify (and the Express.js section), axum and the other Rust frameworks, Vapor and other Swift servers and choosing an ASP.NET framework.
Ecosystem and maturity
The table lists each framework’s latest release, how many major versions it shipped in the last five years, how many releases in the last 12 months, and its support cycle and LTS from endoflife.date. ASP.NET Core (.NET 10 LTS supported to 2028-11-14), Django (5.2 LTS to 2028-04-30), Symfony (7.4 LTS to 2029-11-30) and Quarkus publish LTS releases; Spring Boot publishes support and extended-support dates per minor version; Laravel ships a yearly major with dated support. Frameworks on 0.x versioning (FastAPI, axum) can break on minor versions; FastAPI had 123 releases in 12 months.
| Framework | First release | Latest version | Latest release | Majors in 5 years | Releases in 12 months | Current cycle | Cycle end of life | LTS | Extension ecosystem |
|---|---|---|---|---|---|---|---|---|---|
2014-04-01 |
4.1.2 |
2026-10-22 |
2 |
n/a |
4.1 |
2027-07-31 |
no |
n/a |
|
2019-03-06 |
3.40.1 |
2026-09-29 |
1 |
n/a |
3.40 |
2027-09-30 |
yes |
n/a |
|
2019-09-03 |
11.0.0 |
2025-05-29 |
2 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
2018-10-23 |
5.2.20 |
2026-10-23 |
2 |
n/a |
5 |
not announced |
no |
n/a |
|
2018-09-05 |
27.0.1 |
2026-10-20 |
3 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
2018-11-19 |
3.6.0 |
2026-09-16 |
2 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
2014-05-27 |
5.2.2 |
2026-10-21 |
1 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
2017-05-24 |
7.2.4 |
2026-10-25 |
3 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
2019-06-19 |
3.0.12 |
2026-09-30 |
1 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
2016-06-27 |
10.0.14 |
2026-10-25 |
5 |
n/a |
10 |
2028-11-14 |
yes |
n/a |
|
2012-05-31 |
5.3.0 |
2023-10-23 |
n/a |
n/a |
4.8.1 |
not announced |
no |
n/a |
|
2002 |
n/a |
n/a |
n/a |
n/a |
4.8.1 |
not announced |
no |
n/a |
|
2010-12-29 |
5.3.0 |
2026-10-09 |
1 |
7 |
5 |
not announced |
no |
n/a |
|
2016-10-07 |
5.12.7 |
2026-10-13 |
2 |
26 |
n/a |
n/a |
n/a |
n/a |
|
2017-05-14 |
12.3.1 |
2026-10-27 |
4 |
44 |
n/a |
n/a |
n/a |
n/a |
|
2021-12-14 |
4.13.14 |
2026-10-25 |
4 |
66 |
n/a |
n/a |
n/a |
n/a |
|
2013-11-06 |
3.2.1 |
2026-05-21 |
1 |
4 |
n/a |
n/a |
n/a |
n/a |
|
2019-01-26 |
7.6.0 |
2026-10-05 |
2 |
21 |
n/a |
n/a |
n/a |
n/a |
|
2022-12-24 |
1.4.30 |
2026-08-26 |
1 |
17 |
n/a |
n/a |
n/a |
n/a |
|
2010-05-17 |
6.1.2 |
2026-10-06 |
3 |
31 |
6.1 |
2027-12-31 |
yes |
n/a |
|
2018-12-08 |
0.162.0 |
2026-10-23 |
n/a |
123 |
n/a |
n/a |
n/a |
n/a |
|
2010-04-16 |
3.1.3 |
2026-02-19 |
1 |
1 |
n/a |
n/a |
n/a |
n/a |
|
2010-05-18 |
6.6 |
2026-10-21 |
0 |
9 |
n/a |
n/a |
n/a |
n/a |
|
2011-01-31 |
2.1 |
2026-03-11 |
0 |
1 |
n/a |
n/a |
n/a |
n/a |
|
2023-08-21 |
2.25.0 |
2026-10-18 |
1 |
8 |
n/a |
n/a |
n/a |
n/a |
|
2016-10-15 |
25.12.1 |
2026-05-31 |
4 |
3 |
n/a |
n/a |
n/a |
n/a |
|
2011-02-21 |
3.18.3 |
2026-10-06 |
0 |
7 |
n/a |
n/a |
n/a |
n/a |
|
2019-12-04 |
1.7.1 |
2026-09-19 |
1 |
10 |
n/a |
n/a |
n/a |
n/a |
|
2013-05-28 |
13.38.0 |
2026-10-20 |
5 |
120 |
13 |
2028-03-17 |
yes |
21,253 packagist dependents |
|
2011-12-08 |
8.1.9 |
2026-10-12 |
3 |
66 |
8.1 |
2027-01-31 |
yes |
12,126 packagist dependents |
|
2012-04-14 |
4.15.3 |
2026-09-01 |
0 |
4 |
n/a |
n/a |
n/a |
1,603 packagist dependents |
|
2020-02-24 |
4.7.5 |
2026-10-09 |
0 |
8 |
n/a |
n/a |
n/a |
554 packagist dependents |
|
2021-07-22 |
0.8.9 |
2026-04-14 |
n/a |
3 |
n/a |
n/a |
n/a |
n/a |
|
2017-10-23 |
4.18.1 |
2026-10-23 |
1 |
10 |
n/a |
n/a |
n/a |
n/a |
|
2016-12-23 |
0.5.2 |
2026-10-23 |
n/a |
1 |
n/a |
n/a |
n/a |
n/a |
|
2023-11-23 |
1.2.0 |
2026-09-24 |
1 |
4 |
n/a |
n/a |
n/a |
n/a |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
|
2009-07-25 |
8.1.4 |
2026-09-24 |
2 |
10 |
8.1 |
2027-10-10 |
no |
n/a |
|
2016-12-03 |
v1.12.0 |
2026-02-28 |
0 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
2015-04-01 |
v4.16.2 |
2026-10-23 |
0 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
2020-01-15 |
v3.6.1 |
2026-10-14 |
1 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
n/a |
n/a |
n/a |
n/a |
n/a |
1.27 |
not announced |
no |
n/a |
|
2014-04-21 |
1.8.16 |
2026-10-20 |
0 |
20 |
1.8 |
not announced |
no |
n/a |
|
2001 |
7.4.0 |
2026-09-17 |
2 |
n/a |
7 |
not announced |
no |
n/a |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
|
2019-12-31 |
3.8.0 |
2024-11-18 |
0 |
0 |
n/a |
n/a |
n/a |
396 packagist dependents |
|
2014-01-26 |
5.4.3 |
2026-10-03 |
1 |
27 |
5.4 |
not announced |
no |
2,007 packagist dependents |
Productivity
The feature matrix covers the frameworks documented on this site; each "yes" or "partial" links to the page that documents the feature. Django, Spring Boot, Quarkus, ASP.NET Core and Laravel include the most out of the box (ORM and migrations, authentication, validation, templates, testing and scaffolding), while Express, axum and Tornado provide a core and leave the rest to libraries. Lines of code of a same-sized reference application could not be measured like for like from the site’s examples, so they are not part of this comparison.
| Framework | ORM and migrations | Admin | Auth | Validation | Jobs | Templates | OpenAPI | Testing | CLI | Hot reload | Type safety |
|---|---|---|---|---|---|---|---|---|---|---|---|
no |
|||||||||||
no |
|||||||||||
no |
|||||||||||
no |
no |
no |
no |
no |
no |
no |
no |
no |
|||
no |
no |
no |
|||||||||
no |
|||||||||||
no |
no |
||||||||||
no |
|||||||||||
no |
no |
no |
no |
no |
no |
||||||
no |
no |
no |
no |
no |
no |
no |
|||||
no |
no |
no |
no |
no |
|||||||
no |
no |
||||||||||
no |
no |
no |
no |
no |
no |
no |
no |
no |
|||
no |
no |
Performance
Throughput
TechEmpower’s round 23 (Citrine hardware, run on 2025-01-30) is the last published round: the FrameworkBenchmarks repository has been archived. In the fortunes test (a database query, an HTML template and escaping, the closest to a real endpoint) the best implementations of Helidon (696,144 responses per second), ASP.NET Core (691,656 with Native AOT, 609,967 with Minimal APIs on the JIT), Micronaut (660,238) and Quarkus (431,465) lead, ahead of Fiber (411,214), Spring Boot (243,640) and FastAPI (109,167); Django (31,793) and Laravel (16,493) are at the low end. These are highly tuned implementations, and real applications spend most of their time in their own code and database, so the differences shrink in practice. For load testing your own service see JMeter and performance testing a Spring Boot application.
Across rounds, every framework shown jumps between round 22 (2023-10) and round 23 (2025-01): Spring Boot from 24,083 to 243,640 fortunes responses per second, Django from 14,077 to 31,793. Because all frameworks move together, compare frameworks within one round rather than reading the jump as a change in the frameworks.
| Framework | JSON | Single query | Multiple queries (20) | Fortunes | Plaintext | Implementations |
|---|---|---|---|---|---|---|
2,233,345 |
n/a |
n/a |
696,144 |
8,418,021 |
helidon-nima |
|
2,556,896 |
824,366 |
80,693 |
691,656 |
27,770,995 |
aspnetcore-minimal, aspnetcore-mvc, aspnetcore-aot |
|
1,468,052 |
836,808 |
85,904 |
660,238 |
2,884,144 |
micronaut, micronaut-graalvm |
|
2,457,422 |
802,294 |
58,379 |
431,465 |
7,675,046 |
quarkus |
|
542,699 |
440,178 |
16,834 |
411,214 |
646,197 |
fiber |
|
706,645 |
333,599 |
35,190 |
247,407 |
960,849 |
ktor |
|
328,413 |
205,876 |
31,593 |
243,640 |
832,510 |
spring |
|
540,665 |
103,367 |
14,785 |
220,494 |
1,033,428 |
rocket |
|
855,437 |
432,423 |
16,230 |
189,512 |
1,609,824 |
echo |
|
536,573 |
200,772 |
26,972 |
175,739 |
632,360 |
phoenix |
|
443,007 |
175,508 |
37,203 |
128,666 |
509,038 |
starlite |
|
417,312 |
157,219 |
33,671 |
114,839 |
613,797 |
sanic |
|
498,192 |
222,675 |
17,305 |
110,596 |
1,639,755 |
gin |
|
354,899 |
163,894 |
37,254 |
109,167 |
338,365 |
fastapi |
|
192,830 |
84,218 |
11,070 |
82,444 |
259,719 |
nestjs |
|
87,349 |
77,864 |
33,821 |
73,619 |
89,589 |
slim |
|
203,338 |
63,046 |
9,567 |
42,546 |
139,128 |
rails |
|
167,280 |
41,193 |
3,604 |
31,793 |
179,697 |
django |
|
314,970 |
29,689 |
3,296 |
31,769 |
497,457 |
pyramid |
|
100,140 |
35,267 |
2,900 |
26,849 |
117,634 |
tornado-py3 |
|
63,238 |
30,371 |
14,428 |
25,865 |
64,054 |
symfony |
|
572,932 |
123,286 |
11,475 |
17,937 |
953,808 |
koa |
|
26,902 |
17,837 |
6,950 |
16,493 |
26,657 |
laravel |
|
19,902 |
16,700 |
12,828 |
15,904 |
20,629 |
codeigniter |
|
19,204 |
11,626 |
3,649 |
9,702 |
19,041 |
cakephp |
|
2,632,083 |
n/a |
n/a |
n/a |
9,029,986 |
vertx-web |
|
1,269,833 |
n/a |
n/a |
n/a |
1,817,739 |
javalin |
|
129,241 |
n/a |
n/a |
n/a |
295,170 |
play2-java |
|
224,163 |
n/a |
n/a |
n/a |
279,968 |
express |
|
844,960 |
n/a |
n/a |
n/a |
1,175,038 |
fastify |
|
740,451 |
n/a |
n/a |
n/a |
1,080,093 |
hono |
|
1,837,294 |
n/a |
n/a |
n/a |
26,060,081 |
elysia |
|
2,709,795 |
n/a |
n/a |
n/a |
12,392,331 |
axum |
|
263,364 |
n/a |
n/a |
n/a |
310,442 |
vapor |
|
146,978 |
n/a |
n/a |
n/a |
244,953 |
hummingbird2 |
|
388,485 |
n/a |
n/a |
n/a |
1,612,144 |
go |
Memory consumption and startup time
No house measurements were made for this page: memory and startup figures come only from published sources and are labelled. The Quarkus team’s comparison (2026-06-02, 4 CPUs, Quarkus 3.35.4 and Spring Boot 4.0.6) measures both frameworks the same way: boot and first response 4,352 ms (Quarkus JIT) against 10,582 ms (Spring Boot JIT), and 574 ms against 2,169 ms as native images; RSS after the first request 271 MiB against 477 MiB (JIT) and 98 MiB against 303 MiB (native). These are vendor-reported for Quarkus, and published by a competing project for Spring Boot. The Micronaut and Helidon home pages publish smaller numbers (Micronaut native startup 15 ms and 42 MB) without a method, so they are not comparable with the Quarkus figures. The ASP.NET Core Native AOT documentation shows its results only as a chart image, so .NET is n/a; for native images and tuning on the JVM see Quarkus native executables and Quarkus performance and tuning.
| Framework | Variant | Metric | Value | Kind | Publisher | Source | Note |
|---|---|---|---|---|---|---|---|
jit |
boot and first response ms |
4,352 ms |
vendor-reported |
Quarkus team (Red Hat) |
n/a |
||
jit |
boot and first response ms |
10,582 ms |
published-third-party |
Quarkus team (Red Hat) |
measured and published by the Quarkus team, a competing project |
||
native |
boot and first response ms |
574 ms |
vendor-reported |
Quarkus team (Red Hat) |
n/a |
||
native |
boot and first response ms |
2,169 ms |
published-third-party |
Quarkus team (Red Hat) |
measured and published by the Quarkus team, a competing project |
||
jit |
rss after first request mib |
271 MiB |
vendor-reported |
Quarkus team (Red Hat) |
n/a |
||
jit |
rss after first request mib |
477 MiB |
published-third-party |
Quarkus team (Red Hat) |
measured and published by the Quarkus team, a competing project |
||
native |
rss after first request mib |
98 MiB |
vendor-reported |
Quarkus team (Red Hat) |
n/a |
||
native |
rss after first request mib |
303 MiB |
published-third-party |
Quarkus team (Red Hat) |
measured and published by the Quarkus team, a competing project |
||
jit |
throughput tps |
14,917 transactions/s |
vendor-reported |
Quarkus team (Red Hat) |
n/a |
||
jit |
throughput tps |
7,524 transactions/s |
published-third-party |
Quarkus team (Red Hat) |
measured and published by the Quarkus team, a competing project |
||
native |
throughput tps |
5,437 transactions/s |
vendor-reported |
Quarkus team (Red Hat) |
n/a |
||
native |
throughput tps |
2,150 transactions/s |
published-third-party |
Quarkus team (Red Hat) |
measured and published by the Quarkus team, a competing project |
||
jit |
startup ms |
235 ms |
vendor-reported |
Micronaut Foundation (micronaut.io home page) |
n/a |
||
native |
startup ms |
15 ms |
vendor-reported |
Micronaut Foundation (micronaut.io home page) |
n/a |
||
jit |
memory mb |
356 MB |
vendor-reported |
Micronaut Foundation (micronaut.io home page) |
n/a |
||
native |
memory mb |
42 MB |
vendor-reported |
Micronaut Foundation (micronaut.io home page) |
n/a |
||
jit |
startup ms |
640 ms |
vendor-reported |
Oracle Helidon team (helidon.io home page) |
startup published in seconds (0.64, 0.77, 0.26) and converted to ms |
||
jlink-jit |
startup ms |
770 ms |
vendor-reported |
Oracle Helidon team (helidon.io home page) |
startup published in seconds (0.64, 0.77, 0.26) and converted to ms |
||
jlink-aot-cache |
startup ms |
260 ms |
vendor-reported |
Oracle Helidon team (helidon.io home page) |
startup published in seconds (0.64, 0.77, 0.26) and converted to ms |
||
jit |
memory mb |
110 MB |
vendor-reported |
Oracle Helidon team (helidon.io home page) |
startup published in seconds (0.64, 0.77, 0.26) and converted to ms |
||
jlink-jit |
memory mb |
118 MB |
vendor-reported |
Oracle Helidon team (helidon.io home page) |
startup published in seconds (0.64, 0.77, 0.26) and converted to ms |
||
jlink-aot-cache |
memory mb |
71 MB |
vendor-reported |
Oracle Helidon team (helidon.io home page) |
startup published in seconds (0.64, 0.77, 0.26) and converted to ms |
||
native |
startup ms |
n/a |
n/a |
n/a |
the ASP.NET Core Native AOT documentation shows startup and memory only as a chart image without numbers |
||
jit |
startup ms |
n/a |
n/a |
n/a |
n/a |
no published startup or memory figure found; no house measurement was made (see NOTES.md) |
|
jit |
startup ms |
n/a |
n/a |
n/a |
n/a |
no published startup or memory figure found; no house measurement was made (see NOTES.md) |
|
jit |
startup ms |
n/a |
n/a |
n/a |
n/a |
no published startup or memory figure found; no house measurement was made (see NOTES.md) |
|
jit |
startup ms |
n/a |
n/a |
n/a |
n/a |
no published startup or memory figure found; no house measurement was made (see NOTES.md) |
|
jit |
startup ms |
n/a |
n/a |
n/a |
n/a |
no published startup or memory figure found; no house measurement was made (see NOTES.md) |
|
jit |
startup ms |
n/a |
n/a |
n/a |
n/a |
no published startup or memory figure found; no house measurement was made (see NOTES.md) |
|
jit |
startup ms |
n/a |
n/a |
n/a |
n/a |
no published startup or memory figure found; no house measurement was made (see NOTES.md) |
|
jit |
startup ms |
n/a |
n/a |
n/a |
n/a |
no published startup or memory figure found; no house measurement was made (see NOTES.md) |
|
jit |
startup ms |
n/a |
n/a |
n/a |
n/a |
no published startup or memory figure found; no house measurement was made (see NOTES.md) |
|
jit |
startup ms |
n/a |
n/a |
n/a |
n/a |
no published startup or memory figure found; no house measurement was made (see NOTES.md) |
|
jit |
startup ms |
n/a |
n/a |
n/a |
n/a |
no published startup or memory figure found; no house measurement was made (see NOTES.md) |
Concurrency model
The concurrency model decides what happens when a handler blocks on I/O or computes for a long time. Thread-per-request stacks (Spring MVC, Struts) can switch to Java virtual threads (Spring Boot concurrency alternatives); event-loop stacks (Node.js frameworks, Vert.x, Quarkus’s reactive core) must never block the loop (Node.js concurrency models); async Python (FastAPI async and concurrency) and Rust frameworks run async handlers on an executor; PHP runs one request per worker process; Go starts a goroutine per request and Phoenix one BEAM process.
| Framework | Model | Blocking I/O | CPU-bound work | Evidence |
|---|---|---|---|---|
thread per request, optional virtual threads |
fine on virtual threads; blocks a platform thread otherwise |
runs on request threads |
||
event loop with worker threads, optional virtual threads |
must leave the event loop (worker or virtual thread) |
move off the event loop |
||
event loop (Netty) with thread offloading |
offload to an executor |
offload to an executor |
||
virtual threads |
fine (virtual thread parks) |
runs on request threads |
||
event loop (multi-reactor) |
must leave the event loop |
move off the event loop |
||
coroutines |
use Dispatchers.IO |
use Dispatchers.Default |
||
thread per request (Jetty thread pool), optional virtual threads |
blocks a thread |
runs on request threads |
||
asynchronous actor-based (Pekko/Akka) |
use a separate execution context |
use a separate execution context |
||
async/await on the .NET thread pool |
use async APIs; sync I/O starves the thread pool |
runs on thread-pool threads |
||
event loop (single thread) |
must be non-blocking |
blocks the event loop; use worker threads |
||
event loop (single thread) |
must be non-blocking |
blocks the event loop; use worker threads |
||
event loop (single thread) |
must be non-blocking |
blocks the event loop; use worker threads |
||
event loop (single thread) |
must be non-blocking |
blocks the event loop |
||
event loop (runtime dependent) |
must be non-blocking |
blocks the event loop |
||
event loop (single thread) |
must be non-blocking |
blocks the event loop |
||
event loop (Bun) |
must be non-blocking |
blocks the event loop |
||
worker processes/threads (WSGI), optional async views (ASGI) |
blocks the worker; async views need async-safe calls |
blocks the worker |
||
async/await (ASGI) plus thread pool for sync endpoints |
use async libraries or def endpoints |
blocks the loop; use processes |
||
worker processes/threads (WSGI) |
blocks the worker |
blocks the worker |
||
event loop (IOLoop, asyncio) |
must be non-blocking |
blocks the loop |
||
worker processes/threads (WSGI) |
blocks the worker |
blocks the worker |
||
async/await (ASGI) |
use async libraries |
blocks the loop |
||
async/await (event loop) |
use async libraries |
blocks the loop |
||
worker processes (PHP-FPM), optional long-running workers (Octane) |
blocks the worker |
blocks the worker |
||
worker processes (PHP-FPM) |
blocks the worker |
blocks the worker |
||
worker processes (PHP-FPM) |
blocks the worker |
blocks the worker |
||
worker processes (PHP-FPM) |
blocks the worker |
blocks the worker |
||
worker processes (PHP-FPM) |
blocks the worker |
blocks the worker |
||
async/await on a multi-threaded runtime (Tokio) |
use async I/O or spawn_blocking |
use spawn_blocking or a thread pool |
||
async/await, one runtime per worker thread |
use async I/O or web::block |
use web::block |
||
async/await (Tokio) |
use async I/O or spawn_blocking |
use spawn_blocking |
||
async/await (Tokio, built on axum) |
use async I/O or spawn_blocking |
use spawn_blocking |
||
event loops (SwiftNIO) with Swift concurrency |
must not block an event loop |
offload from the event loop |
||
event loops (SwiftNIO) with Swift concurrency |
must not block an event loop |
offload from the event loop |
||
threads and processes (Puma) |
blocks a thread |
limited by the GVL; use processes |
||
goroutine per request |
fine (goroutine parks) |
scheduled across GOMAXPROCS threads |
||
goroutine per request |
fine (goroutine parks) |
scheduled across GOMAXPROCS threads |
||
goroutine per connection (fasthttp worker pool) |
fine (goroutine parks) |
scheduled across GOMAXPROCS threads |
||
goroutine per request |
fine (goroutine parks) |
scheduled across GOMAXPROCS threads |
||
lightweight processes (BEAM) |
fine (process blocks alone) |
preemptively scheduled |
||
thread per request (servlet container) |
blocks a thread |
runs on request threads |
Performance against ease of use
Other metrics
Security track record. Advisories per year come from OSV.dev (which includes the GitHub Advisory Database), counted for each framework’s main packages and deduplicated by CVE. Large, long-lived frameworks have the most: Django (162 in total), Ruby on Rails (119), Symfony (102), Apache Struts (60) and Spring Boot with Spring Web (48). A higher count often reflects more code and more active disclosure, not lower quality. The OpenSSF Scorecard and its security-policy check say whether a project publishes how to report vulnerabilities.
Deployment targets (containers, serverless, native binaries) and real-time support are listed where the site’s section documents them; the real-time stacks themselves are compared in the WebRTC and WebSockets decision guide, not here.
| Framework | Advisories 2021-2025 | Advisories (all) | Scorecard | Security policy | Deployment targets documented | Real-time | AI tooling |
|---|---|---|---|---|---|---|---|
18 |
48 |
6.9 |
yes |
containers, serverless, native binary |
yes |
yes |
|
5 |
7 |
5.8 |
yes |
containers, serverless, native binary |
yes |
n/a |
|
n/a |
n/a |
n/a |
n/a |
containers, native binary |
yes |
n/a |
|
3 |
3 |
7.2 |
yes |
n/a |
n/a |
n/a |
|
0 |
0 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
0 |
0 |
4.6 |
no |
n/a |
n/a |
n/a |
|
5 |
14 |
5.1 |
yes |
n/a |
n/a |
n/a |
|
0 |
0 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
2 |
4 |
5.4 |
yes |
n/a |
n/a |
n/a |
|
15 |
36 |
6.7 |
yes |
containers, native binary |
yes |
n/a |
|
n/a |
n/a |
5.2 |
yes |
n/a |
yes |
n/a |
|
n/a |
n/a |
n/a |
n/a |
n/a |
yes |
n/a |
|
4 |
5 |
8.5 |
yes |
containers, serverless, native binary |
yes |
yes |
|
3 |
17 |
8.3 |
yes |
containers, serverless, native binary |
yes |
yes |
|
1 |
2 |
6.8 |
partial |
containers, serverless |
yes |
yes |
|
8 |
52 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
4 |
5 |
5.5 |
yes |
n/a |
n/a |
n/a |
|
0 |
1 |
6 |
yes |
n/a |
n/a |
n/a |
|
2 |
5 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
53 |
162 |
6.7 |
partial |
containers, serverless |
yes |
n/a |
|
2 |
2 |
n/a |
n/a |
containers, serverless |
yes |
n/a |
|
2 |
5 |
7.1 |
partial |
containers, serverless |
yes |
yes |
|
9 |
23 |
6.6 |
yes |
containers |
yes |
n/a |
|
1 |
1 |
4.3 |
yes |
containers |
yes |
n/a |
|
4 |
9 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
2 |
4 |
4.1 |
partial |
n/a |
n/a |
n/a |
|
1 |
7 |
6.3 |
yes |
n/a |
n/a |
n/a |
|
0 |
0 |
4.3 |
no |
n/a |
n/a |
n/a |
|
17 |
28 |
5.8 |
yes |
containers, serverless |
yes |
yes |
|
24 |
102 |
7.5 |
yes |
n/a |
n/a |
n/a |
|
0 |
2 |
4.8 |
yes |
n/a |
n/a |
n/a |
|
12 |
19 |
7.1 |
yes |
n/a |
n/a |
n/a |
|
0 |
0 |
5.5 |
no |
containers, serverless |
yes |
yes |
|
1 |
4 |
7 |
partial |
n/a |
n/a |
n/a |
|
1 |
2 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
0 |
0 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
6 |
7 |
7.1 |
yes |
containers, serverless, native binary |
yes |
n/a |
|
0 |
0 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
29 |
119 |
6.3 |
yes |
n/a |
n/a |
n/a |
|
2 |
5 |
6 |
no |
n/a |
n/a |
n/a |
|
1 |
7 |
6.2 |
yes |
n/a |
n/a |
n/a |
|
8 |
14 |
7 |
yes |
n/a |
n/a |
n/a |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
|
1 |
5 |
6.7 |
yes |
n/a |
n/a |
n/a |
|
9 |
60 |
8.1 |
yes |
containers |
yes |
n/a |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
|
13 |
23 |
n/a |
n/a |
n/a |
n/a |
n/a |
|
7 |
22 |
4.4 |
no |
n/a |
n/a |
n/a |
Comparison table
One table with every framework and every metric. Scores are 0 to 10 (higher is better), (E) marks the editorial axes, and n/a means the data does not exist or could not be sourced.
| Framework | Popularity | Growth | Talent/jobs | Ease of use (E) | Ecosystem (E) | Productivity (E) | Throughput | Memory | Startup | Concurrency model | LTS | Advisories |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
8.6 |
2.7 |
4.1 |
6.0 |
9.0 |
8.0 |
7.7 |
7.5 |
6.1 |
thread per request, optional virtual threads |
no |
48 |
|
8.4 |
n/a |
0.1 |
6.0 |
7.0 |
9.0 |
9.0 |
10.0 |
10.0 |
event loop with worker threads, optional virtual threads |
yes |
7 |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
|
7.6 |
n/a |
0.0 |
6.0 |
6.0 |
7.0 |
9.9 |
n/a |
n/a |
event loop (Netty) with thread offloading |
no |
3 |
|
7.1 |
n/a |
n/a |
6.0 |
5.0 |
5.0 |
10.0 |
n/a |
n/a |
virtual threads |
n/a |
0 |
|
8.3 |
n/a |
n/a |
7.0 |
6.0 |
6.0 |
7.8 |
n/a |
n/a |
coroutines |
n/a |
0 |
|
8.3 |
n/a |
n/a |
4.0 |
7.0 |
4.0 |
n/a |
n/a |
n/a |
event loop (multi-reactor) |
n/a |
14 |
|
7.8 |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
thread per request (Jetty thread pool), optional virtual threads |
n/a |
0 |
|
8.2 |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
asynchronous actor-based (Pekko/Akka) |
n/a |
4 |
|
9.7 |
2.1 |
5.0 |
7.0 |
9.0 |
9.0 |
10.0 |
n/a |
n/a |
async/await on the .NET thread pool |
yes |
36 |
|
7.6 |
1.1 |
3.9 |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
no |
n/a |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
no |
n/a |
|
9.9 |
0.2 |
5.0 |
9.0 |
8.0 |
3.0 |
n/a |
n/a |
n/a |
event loop (single thread) |
no |
5 |
|
6.4 |
2.7 |
1.1 |
8.0 |
7.0 |
6.0 |
n/a |
n/a |
n/a |
event loop (single thread) |
n/a |
17 |
|
7.4 |
1.8 |
2.8 |
5.0 |
7.0 |
8.0 |
5.4 |
n/a |
n/a |
event loop (single thread) |
n/a |
2 |
|
9.2 |
10.0 |
n/a |
9.0 |
5.0 |
5.0 |
n/a |
n/a |
n/a |
event loop (runtime dependent) |
n/a |
52 |
|
9.0 |
0.4 |
n/a |
8.0 |
6.0 |
3.0 |
2.1 |
n/a |
n/a |
event loop (single thread) |
n/a |
5 |
|
7.7 |
0.3 |
n/a |
7.0 |
5.0 |
8.0 |
n/a |
n/a |
n/a |
event loop (single thread) |
n/a |
1 |
|
8.0 |
4.0 |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
event loop (Bun) |
n/a |
5 |
|
8.4 |
0.9 |
6.2 |
7.0 |
10.0 |
9.0 |
3.3 |
n/a |
n/a |
worker processes/threads (WSGI), optional async views (ASGI) |
yes |
162 |
|
9.1 |
10.0 |
7.4 |
8.0 |
6.0 |
8.0 |
6.0 |
n/a |
n/a |
async/await (ASGI) plus thread pool for sync endpoints |
n/a |
2 |
|
8.8 |
2.1 |
3.8 |
9.0 |
8.0 |
5.0 |
n/a |
n/a |
n/a |
worker processes/threads (WSGI) |
n/a |
5 |
|
9.0 |
n/a |
n/a |
5.0 |
6.0 |
4.0 |
2.9 |
n/a |
n/a |
event loop (IOLoop, asyncio) |
n/a |
23 |
|
7.3 |
n/a |
n/a |
n/a |
n/a |
n/a |
3.3 |
n/a |
n/a |
worker processes/threads (WSGI) |
n/a |
1 |
|
7.6 |
n/a |
n/a |
6.0 |
4.0 |
7.0 |
6.3 |
n/a |
n/a |
async/await (ASGI) |
n/a |
9 |
|
7.8 |
n/a |
n/a |
7.0 |
5.0 |
5.0 |
6.1 |
n/a |
n/a |
async/await (event loop) |
n/a |
4 |
|
8.8 |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
7 |
|
7.8 |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
0 |
|
7.8 |
1.0 |
2.8 |
8.0 |
9.0 |
9.0 |
1.9 |
n/a |
n/a |
worker processes (PHP-FPM), optional long-running workers (Octane) |
yes |
28 |
|
6.8 |
1.7 |
1.1 |
5.0 |
9.0 |
7.0 |
2.9 |
n/a |
n/a |
worker processes (PHP-FPM) |
yes |
102 |
|
8.3 |
3.8 |
n/a |
n/a |
n/a |
n/a |
5.1 |
n/a |
n/a |
worker processes (PHP-FPM) |
n/a |
2 |
|
7.6 |
10.0 |
n/a |
8.0 |
6.0 |
6.0 |
1.8 |
n/a |
n/a |
worker processes (PHP-FPM) |
n/a |
19 |
|
6.8 |
n/a |
0.7 |
5.0 |
6.0 |
4.0 |
n/a |
n/a |
n/a |
async/await on a multi-threaded runtime (Tokio) |
n/a |
0 |
|
8.7 |
n/a |
0.0 |
5.0 |
6.0 |
4.0 |
n/a |
n/a |
n/a |
async/await, one runtime per worker thread |
n/a |
4 |
|
8.3 |
n/a |
n/a |
n/a |
n/a |
n/a |
7.5 |
n/a |
n/a |
async/await (Tokio) |
n/a |
2 |
|
7.1 |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
async/await (Tokio, built on axum) |
n/a |
0 |
|
8.8 |
n/a |
n/a |
5.0 |
5.0 |
8.0 |
n/a |
n/a |
n/a |
event loops (SwiftNIO) with Swift concurrency |
n/a |
7 |
|
6.5 |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
event loops (SwiftNIO) with Swift concurrency |
n/a |
0 |
|
6.2 |
0.6 |
6.5 |
8.0 |
9.0 |
9.0 |
3.9 |
n/a |
n/a |
threads and processes (Puma) |
no |
119 |
|
9.9 |
n/a |
n/a |
8.0 |
7.0 |
4.0 |
6.0 |
n/a |
n/a |
goroutine per request |
n/a |
5 |
|
9.0 |
n/a |
n/a |
n/a |
n/a |
n/a |
7.2 |
n/a |
n/a |
goroutine per request |
n/a |
7 |
|
9.2 |
n/a |
n/a |
8.0 |
5.0 |
4.0 |
8.9 |
n/a |
n/a |
goroutine per connection (fasthttp worker pool) |
n/a |
14 |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
goroutine per request |
no |
n/a |
|
5.0 |
2.0 |
0.9 |
5.0 |
7.0 |
9.0 |
7.0 |
n/a |
n/a |
lightweight processes (BEAM) |
no |
5 |
|
6.3 |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
thread per request (servlet container) |
no |
60 |
|
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
|
6.2 |
1.3 |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
n/a |
23 |
|
7.9 |
2.7 |
n/a |
7.0 |
7.0 |
7.0 |
0.7 |
n/a |
n/a |
worker processes (PHP-FPM) |
no |
22 |
Radar comparisons
Each radar compares at most six frameworks on nine axes; computed axes are marked © and editorial axes (E), and gaps in an outline mean n/a. Memory and startup are only computed for Quarkus and Spring Boot, the two frameworks measured like for like.
scripts/framework-charts.| Framework | Popularity © | Growth © | Talent pool / jobs © | Ease of use (E) | Ecosystem and maturity (E) | Productivity (E) | Throughput © | Memory © | Startup © |
|---|---|---|---|---|---|---|---|---|---|
8.6 |
2.7 |
4.1 |
6.0 |
9.0 |
8.0 |
7.7 |
7.5 |
6.1 |
|
8.4 |
n/a |
0.1 |
6.0 |
7.0 |
9.0 |
9.0 |
10.0 |
10.0 |
|
7.6 |
n/a |
0.0 |
6.0 |
6.0 |
7.0 |
9.9 |
n/a |
n/a |
|
7.1 |
n/a |
n/a |
6.0 |
5.0 |
5.0 |
10.0 |
n/a |
n/a |
|
8.3 |
n/a |
n/a |
7.0 |
6.0 |
6.0 |
7.8 |
n/a |
n/a |
|
8.3 |
n/a |
n/a |
4.0 |
7.0 |
4.0 |
n/a |
n/a |
n/a |
| Framework | Popularity © | Growth © | Talent pool / jobs © | Ease of use (E) | Ecosystem and maturity (E) | Productivity (E) | Throughput © | Memory © | Startup © |
|---|---|---|---|---|---|---|---|---|---|
9.7 |
2.1 |
5.0 |
7.0 |
9.0 |
9.0 |
10.0 |
n/a |
n/a |
|
7.8 |
1.0 |
2.8 |
8.0 |
9.0 |
9.0 |
1.9 |
n/a |
n/a |
|
6.8 |
1.7 |
1.1 |
5.0 |
9.0 |
7.0 |
2.9 |
n/a |
n/a |
|
7.6 |
10.0 |
n/a |
8.0 |
6.0 |
6.0 |
1.8 |
n/a |
n/a |
|
7.9 |
2.7 |
n/a |
7.0 |
7.0 |
7.0 |
0.7 |
n/a |
n/a |
| Framework | Popularity © | Growth © | Talent pool / jobs © | Ease of use (E) | Ecosystem and maturity (E) | Productivity (E) | Throughput © | Memory © | Startup © |
|---|---|---|---|---|---|---|---|---|---|
9.9 |
0.2 |
5.0 |
9.0 |
8.0 |
3.0 |
n/a |
n/a |
n/a |
|
6.4 |
2.7 |
1.1 |
8.0 |
7.0 |
6.0 |
n/a |
n/a |
n/a |
|
7.4 |
1.8 |
2.8 |
5.0 |
7.0 |
8.0 |
5.4 |
n/a |
n/a |
|
9.2 |
10.0 |
n/a |
9.0 |
5.0 |
5.0 |
n/a |
n/a |
n/a |
|
9.0 |
0.4 |
n/a |
8.0 |
6.0 |
3.0 |
2.1 |
n/a |
n/a |
|
7.7 |
0.3 |
n/a |
7.0 |
5.0 |
8.0 |
n/a |
n/a |
n/a |
| Framework | Popularity © | Growth © | Talent pool / jobs © | Ease of use (E) | Ecosystem and maturity (E) | Productivity (E) | Throughput © | Memory © | Startup © |
|---|---|---|---|---|---|---|---|---|---|
8.4 |
0.9 |
6.2 |
7.0 |
10.0 |
9.0 |
3.3 |
n/a |
n/a |
|
9.1 |
10.0 |
7.4 |
8.0 |
6.0 |
8.0 |
6.0 |
n/a |
n/a |
|
8.8 |
2.1 |
3.8 |
9.0 |
8.0 |
5.0 |
n/a |
n/a |
n/a |
|
7.6 |
n/a |
n/a |
6.0 |
4.0 |
7.0 |
6.3 |
n/a |
n/a |
|
7.8 |
n/a |
n/a |
7.0 |
5.0 |
5.0 |
6.1 |
n/a |
n/a |
|
9.0 |
n/a |
n/a |
5.0 |
6.0 |
4.0 |
2.9 |
n/a |
n/a |
| Framework | Popularity © | Growth © | Talent pool / jobs © | Ease of use (E) | Ecosystem and maturity (E) | Productivity (E) | Throughput © | Memory © | Startup © |
|---|---|---|---|---|---|---|---|---|---|
6.8 |
n/a |
0.7 |
5.0 |
6.0 |
4.0 |
n/a |
n/a |
n/a |
|
8.7 |
n/a |
0.0 |
5.0 |
6.0 |
4.0 |
n/a |
n/a |
n/a |
|
9.9 |
n/a |
n/a |
8.0 |
7.0 |
4.0 |
6.0 |
n/a |
n/a |
|
9.2 |
n/a |
n/a |
8.0 |
5.0 |
4.0 |
8.9 |
n/a |
n/a |
|
8.8 |
n/a |
n/a |
5.0 |
5.0 |
8.0 |
n/a |
n/a |
n/a |
|
5.0 |
2.0 |
0.9 |
5.0 |
7.0 |
9.0 |
7.0 |
n/a |
n/a |
| Framework | Popularity © | Growth © | Talent pool / jobs © | Ease of use (E) | Ecosystem and maturity (E) | Productivity (E) | Throughput © | Memory © | Startup © |
|---|---|---|---|---|---|---|---|---|---|
8.6 |
2.7 |
4.1 |
6.0 |
9.0 |
8.0 |
7.7 |
7.5 |
6.1 |
|
9.7 |
2.1 |
5.0 |
7.0 |
9.0 |
9.0 |
10.0 |
n/a |
n/a |
|
9.9 |
0.2 |
5.0 |
9.0 |
8.0 |
3.0 |
n/a |
n/a |
n/a |
|
8.4 |
0.9 |
6.2 |
7.0 |
10.0 |
9.0 |
3.3 |
n/a |
n/a |
|
7.8 |
1.0 |
2.8 |
8.0 |
9.0 |
9.0 |
1.9 |
n/a |
n/a |
|
6.2 |
0.6 |
6.5 |
8.0 |
9.0 |
9.0 |
3.9 |
n/a |
n/a |
| Framework | Axis | Score | Basis |
|---|---|---|---|
Ease of use |
6 |
Auto-configuration and starters remove most setup, but dependency injection, annotations and the Spring ecosystem are a lot to learn; SO 2025 admired 53.7% |
|
Ecosystem and maturity |
9 |
First release 2014, support dates per minor version with extended support (endoflife.date), large starter ecosystem |
|
Productivity |
8 |
Feature matrix 9/11 (ORM, security, validation, scheduling, Thymeleaf, testing, Initializr, devtools); OpenAPI through springdoc |
|
Ease of use |
6 |
Familiar Jakarta EE/MicroProfile APIs and dev mode, but build-time model and extensions add concepts |
|
Ecosystem and maturity |
7 |
First release 2019, Commonhaus Foundation, LTS releases (endoflife.date), smaller extension ecosystem than Spring |
|
Productivity |
9 |
Feature matrix 9.5/11 incl. OpenAPI and dev mode with continuous testing |
|
Ease of use |
6 |
Annotation-driven like Spring with compile-time DI; fewer learning resources |
|
Ecosystem and maturity |
6 |
First release 2018, no LTS cycle on endoflife.date, two majors in five years |
|
Productivity |
7 |
Not documented on the site; official modules cover data, security, validation, OpenAPI, test and CLI |
|
Ease of use |
6 |
Helidon SE is a small functional API on virtual threads; MP flavour follows MicroProfile |
|
Ecosystem and maturity |
5 |
First release 2018, three majors in five years (latest 27.x), small ecosystem |
|
Productivity |
5 |
Not documented on the site; SE favours explicit code, MP adds MicroProfile APIs |
|
Ease of use |
7 |
Kotlin DSL and coroutines; concise for Kotlin developers, plugin model to learn |
|
Ecosystem and maturity |
6 |
First release 2018, built and backed by JetBrains, smaller plugin ecosystem |
|
Productivity |
6 |
Not documented on the site; routing, auth, serialization and test host built in, no ORM or admin |
|
Ease of use |
4 |
Event-loop programming model and reactive APIs need care (never block the loop) |
|
Ecosystem and maturity |
7 |
On Maven Central as io.vertx since 2014, Eclipse Foundation, used underneath Quarkus (concurrency.csv) |
|
Productivity |
4 |
Toolkit rather than framework: assemble modules for web, data and auth |
|
Ease of use |
7 |
Minimal APIs give a small first endpoint; MVC, DI and middleware are well documented; SO 2025 admired 61.3% |
|
Ecosystem and maturity |
9 |
First release 2016, Microsoft, LTS cycles (endoflife.date: 10 LTS to 2028-11-14), five majors in five years |
|
Productivity |
9 |
Feature matrix 9/11 (EF Core, Identity, validation, Razor, OpenAPI, test host, dotnet new, hot reload) |
|
Ease of use |
8 |
Convention-heavy with artisan scaffolding and starter kits; SO 2025 admired 47.8% |
|
Ecosystem and maturity |
9 |
On Packagist since 2013, yearly majors with support dates on endoflife.date, 120 releases in 12 months, 21,000+ Packagist dependents |
|
Productivity |
9 |
Feature matrix 8/11 (Eloquent, auth, validation, queues, Blade, artisan); admin via Nova or third parties |
|
Ease of use |
5 |
Flexible components and bundles; configuration and DI concepts take time; SO 2025 admired 50% |
|
Ecosystem and maturity |
9 |
On Packagist since 2011, Symfony SAS sponsorship, LTS releases (endoflife.date: 7.4) |
|
Productivity |
7 |
Not documented on the site; maker bundle, Doctrine, security, forms, validator and Messenger available as official bundles |
|
Ease of use |
8 |
Small footprint, little configuration, straightforward MVC |
|
Ecosystem and maturity |
6 |
CodeIgniter 4 on Packagist since 2020, CodeIgniter Foundation, no support policy on endoflife.date |
|
Productivity |
6 |
Not documented on the site; query builder, migrations, validation, CLI (spark) built in |
|
Ease of use |
7 |
Convention over configuration with bake scaffolding |
|
Ecosystem and maturity |
7 |
On Packagist since 2014, Cake Software Foundation, 27 releases in 12 months |
|
Productivity |
7 |
Not documented on the site; ORM, migrations, auth plugin, validation and bake |
|
Ease of use |
9 |
Minimal API: a route in a few lines; most concepts are plain Node.js; SO 2025 admired 45.5%, State of JS retention 81.2% |
|
Ecosystem and maturity |
8 |
First release 2010, OpenJS Foundation, one major (5) in five years, highest npm downloads on the page |
|
Productivity |
3 |
Feature matrix 1/11: almost everything comes from third-party middleware |
|
Ease of use |
8 |
Small API with schemas and plugins; State of JS retention 86.5% |
|
Ecosystem and maturity |
7 |
First release 2016, OpenJS Foundation, 26 releases in 12 months |
|
Productivity |
6 |
Feature matrix 5/11 (schema validation, inject testing, official plugins for auth, swagger, views) |
|
Ease of use |
5 |
Angular-style modules, decorators and DI before the first endpoint; State of JS retention 73.7% |
|
Ecosystem and maturity |
7 |
First release 2017, four majors in five years, many official @nestjs integration packages |
|
Productivity |
8 |
Feature matrix 8/11 (validation pipes, queues, Swagger module, testing, CLI, watch mode) |
|
Ease of use |
9 |
Tiny Web-Standards API that runs unchanged on several runtimes; State of JS retention 95% |
|
Ecosystem and maturity |
5 |
First release 2021, community project, 66 releases in 12 months |
|
Productivity |
5 |
Not documented on the site; built-in middleware for validation and JWT; no ORM or scaffolding |
|
Ease of use |
8 |
Minimal async middleware core |
|
Ecosystem and maturity |
6 |
First release 2013, 4 releases in 12 months; State of JS retention 64.4% |
|
Productivity |
3 |
Core only: routing, body parsing and everything else from middleware |
|
Ease of use |
7 |
Laravel-like conventions in TypeScript with an ace CLI; State of JS retention 79.2% |
|
Ecosystem and maturity |
5 |
On npm as @adonisjs/core since 2019, 21 releases in 12 months, smaller community |
|
Productivity |
8 |
Not documented on the site; official packages for ORM, auth, validation, templates, testing and CLI |
|
Ease of use |
7 |
Many built-in concepts (apps, ORM, admin) but excellent tutorial; SO 2025 admired 46.4% |
|
Ecosystem and maturity |
10 |
On PyPI since 2010, Django Software Foundation, LTS releases (endoflife.date: 5.2 LTS) |
|
Productivity |
9 |
Feature matrix 8.5/11 (ORM, admin, auth, forms, templates, tests, manage.py, autoreload) |
|
Ease of use |
8 |
Type hints drive validation and docs; short first endpoint; SO 2025 admired 55.5% |
|
Ecosystem and maturity |
6 |
First release 2018, still 0.x versioning, 123 releases in 12 months |
|
Productivity |
8 |
Feature matrix 7.5/11 (Pydantic validation, automatic OpenAPI, TestClient, fastapi dev) |
|
Ease of use |
9 |
A route in a few lines; explicit and well documented; SO 2025 admired 41.7% |
|
Ecosystem and maturity |
8 |
First release 2010, Pallets, one release in 12 months |
|
Productivity |
5 |
Feature matrix 4/11: Jinja templates, test client and CLI; ORM, auth and validation via extensions |
|
Ease of use |
6 |
ASGI with DI, DTOs and plugins; more concepts than FastAPI |
|
Ecosystem and maturity |
4 |
2.0 on PyPI in 2023, community organisation, small ecosystem |
|
Productivity |
7 |
Not documented on the site; built-in OpenAPI, validation, DTOs, SQLAlchemy plugin, CLI |
|
Ease of use |
7 |
Flask-like API with async handlers |
|
Ecosystem and maturity |
5 |
First release 2016, Sanic Community Organization, calendar versioning |
|
Productivity |
5 |
Not documented on the site; routing, blueprints, CLI and auto-reload; ORM and auth via extensions |
|
Ease of use |
5 |
Low-level async request handlers and IOLoop concepts |
|
Ecosystem and maturity |
6 |
On PyPI since 2010, The Tornado Authors, no major version in five years |
|
Productivity |
4 |
Feature matrix 3.5/11 (templates, test case, autoreload) |
|
Ease of use |
5 |
Rust ownership, async and extractors are a steep start; SO 2025 admired 76.4% |
|
Ecosystem and maturity |
6 |
First release 2021, still 0.x versioning, 3 releases in 12 months |
|
Productivity |
4 |
Feature matrix 1/11: composable extractors and Tower middleware; ORM, auth, OpenAPI from crates |
|
Ease of use |
5 |
Rust plus actor-style workers; macros help, borrow checker still applies |
|
Ecosystem and maturity |
6 |
First release 2017, The Actix Team, one major in five years |
|
Productivity |
4 |
Not documented on the site; routing, extractors, middleware; ORM and validation from crates |
|
Ease of use |
8 |
Small Go API close to net/http |
|
Ecosystem and maturity |
7 |
First version on the Go proxy 2016, no major version in five years |
|
Productivity |
4 |
Not documented on the site; routing, binding and validation, middleware; no ORM or scaffolding |
|
Ease of use |
8 |
Express-like API in Go |
|
Ecosystem and maturity |
5 |
First release 2020, one major (v3) in five years |
|
Productivity |
4 |
Not documented on the site; routing, middleware catalog, templates via contrib |
|
Ease of use |
5 |
Swift concurrency, SwiftNIO and Fluent concepts; small community |
|
Ecosystem and maturity |
5 |
QuTheory, LLC; release history n/a; Swift on the server is a niche |
|
Productivity |
8 |
Feature matrix 8/11 (Fluent ORM, auth, validation, queues, Leaf, XCTVapor, toolbox) |
|
Ease of use |
5 |
Elixir and OTP concepts are new to most teams; SO 2025 admired 79% (most admired) |
|
Ecosystem and maturity |
7 |
First release 2014, stable 1.x line (no major in five years), 20 releases in 12 months |
|
Productivity |
9 |
Not documented on the site; generators, Ecto, LiveView, channels, auth generator, dashboard |
|
Ease of use |
8 |
Convention over configuration and generators; SO 2025 admired 52% |
|
Ecosystem and maturity |
9 |
On RubyGems since 2009, support dates per release (endoflife.date), two majors in five years |
|
Productivity |
9 |
Not documented on the site; Active Record, migrations, auth generator, Active Job, Action Cable, generators |
Summary and recommendations
These recommendations are an editorial judgement built on the data above; each cites the metric it relies on. The snapshot date is 2026-10-27, and surveys and downloads change every month, so re-check the numbers before a decision that will last years.
Safe mainstream choices, by language.
-
JVM: Spring Boot. 72% of Java developers use it (JetBrains 2023), 14.7% of all survey respondents (2025), the most complete feature matrix and support dates per minor version. Choose Quarkus when startup time and memory matter (574 ms and 98 MiB native, vendor-reported).
-
.NET: ASP.NET Core. 19.7% survey usage, 61.3% admired, top-tier TechEmpower throughput and LTS releases.
-
Python: Django for full applications, FastAPI for APIs. Django has an admin, ORM and LTS releases; FastAPI doubled its survey share between 2023 and 2025 and generates OpenAPI from type hints.
-
PHP: Laravel. 61% of PHP developers (JetBrains 2023), rising Packagist downloads, yearly majors with dated support.
-
Node.js: NestJS for structured services, Fastify for lean ones (in Node.js). Express (see the Express.js section) remains the most downloaded but provides the least out of the box.
Trends to watch. The growth data support three: FastAPI (survey share 7.42% to 14.8%, 2023 to 2025), Hono (841 million npm downloads in 12 months, 95% State of JS retention) and ASP.NET Core (16.57% to 19.7%). axum and Phoenix are niche (2.8% and 2.4% usage) but the most admired frameworks in the 2025 survey.
Avoid for new projects, keep for legacy maintenance.
-
ASP.NET Web Forms and ASP.NET MVC 5 run on .NET Framework (current cycle 4.8.1 on endoflife.date), not on modern .NET; MVC 5’s last NuGet release is 5.3.0 (2023-10-23) and classic ASP.NET’s survey usage fell from 26.3% (2019) to 14.2% (2025). See choosing an ASP.NET framework.
-
Apache Struts has the fourth-highest advisory count on this page (60) and 1,370 GitHub stars; new Java web applications fit Spring Boot better.
-
J2EE and EJB 2 are historical (their successor is Jakarta EE), and Zend Framework continues as Laminas.
Recommendation by purpose.
| Purpose | Framework | Fit | Basis |
|---|---|---|---|
REST/JSON API |
best |
mainstream JVM choice; SO 2025 usage 14.7%; full feature matrix |
|
REST/JSON API |
best |
top TechEmpower fortunes; SO 2025 admired 61.3% |
|
REST/JSON API |
best |
automatic OpenAPI; fastest Python growth (SO usage 2023 to 2025) |
|
REST/JSON API |
good |
structured TypeScript APIs with OpenAPI module |
|
REST/JSON API |
good |
largest npm downloads but few built-in features |
|
REST/JSON API |
good |
Go baseline for small, fast services |
|
Enterprise or regulated systems |
best |
support dates with extended support (endoflife.date) |
|
Enterprise or regulated systems |
best |
Microsoft LTS (.NET 10 to 2028-11-14) |
|
Enterprise or regulated systems |
good |
LTS releases (endoflife.date) |
|
Enterprise or regulated systems |
good |
LTS releases from the Django Software Foundation |
|
High throughput or low latency |
best |
TechEmpower round 23 fortunes among the highest |
|
High throughput or low latency |
good |
Rust performance; fortunes n/a in round 23 |
|
High throughput or low latency |
good |
TechEmpower fortunes score 9 of 10 on the page |
|
High throughput or low latency |
good |
TechEmpower fortunes score 8.9 of 10 on the page |
|
Serverless and fast startup |
best |
native boot and first response 574 ms, RSS 98 MiB (vendor-reported) |
|
Serverless and fast startup |
good |
native startup 15 ms (vendor-reported, no method) |
|
Serverless and fast startup |
good |
Native AOT documented on the site |
|
Serverless and fast startup |
good |
runs on edge and serverless runtimes |
|
Data and AI APIs in Python |
best |
Pydantic and OpenAPI; HN 2025 mention share 2.95% |
|
Data and AI APIs in Python |
good |
admin and ORM for data-heavy back offices |
|
Data and AI APIs in Python |
acceptable |
minimal; extensions needed |
|
Real-time |
best |
channels and LiveView on BEAM processes; SO 2025 most admired (79%) |
|
Real-time |
good |
SignalR |
|
Real-time |
good |
WebSocket gateways on the Node.js event loop |
|
Real-time |
good |
broadcasting with Reverb |
|
Small teams or MVPs |
best |
generators and conventions; SO 2025 admired 52% |
|
Small teams or MVPs |
best |
artisan, starter kits and first-party services |
|
Small teams or MVPs |
good |
admin and auth out of the box |
|
Small teams or MVPs |
good |
short path to a documented API |
|
Full-stack server-rendered apps |
best |
templates, forms, admin |
|
Full-stack server-rendered apps |
best |
Blade, Livewire and Inertia |
|
Full-stack server-rendered apps |
best |
Hotwire by default |
|
Full-stack server-rendered apps |
good |
Razor Pages and Blazor |
|
Full-stack server-rendered apps |
good |
Thymeleaf and htmx |
Hiring perspective. The largest talent pools are ASP.NET Core, Express, Spring Boot, FastAPI and Flask (the highest professional survey usage); Ruby on Rails, FastAPI and Django lead the 2025 Hacker News postings. Niche but growing choices (Hono, axum, Phoenix, Litestar) are easier to sell to developers than to staff quickly: plan for training.
The strongest conclusion is the least surprising one: for most teams the right framework is the most used one of the language the team already knows, and the metrics above matter mainly at the edges (startup-sensitive serverless work, extreme throughput, hiring in a small market).
Bibliography
Every number on this page comes from one of the sources below, with its publisher, edition and retrieval date. Captions and tables link to these entries.
The registry of sources is sources.csv in scripts/framework-charts/data, with 62 entries; 47 are used on this page. Every source was opened on 2026-10-27 unless marked otherwise.
| Source | Publisher | Edition or date | Retrieved | Used for |
|---|---|---|---|---|
Stack Overflow |
2019 |
2026-10-27 |
Web frameworks usage (all and professional), loved and wanted |
|
Stack Overflow |
2020 |
2026-10-27 |
Web frameworks usage, loved and wanted |
|
Stack Overflow |
2021 |
2026-10-27 |
Web frameworks usage, loved and wanted |
|
Stack Overflow |
2022 |
2026-10-27 |
Web frameworks and technologies usage, loved and wanted |
|
Stack Overflow |
2023 |
2026-10-27 |
Web frameworks and technologies usage, admired and desired |
|
Stack Overflow |
2024 |
2026-10-27 |
Web frameworks and technologies usage, admired and desired |
|
Stack Overflow |
2025 |
2026-10-27 |
Web frameworks and technologies usage, admired and desired (latest edition with a frameworks question); talent pool |
|
Devographics |
2016-2025 |
2026-10-27 |
front-end, meta-framework and back-end framework usage, retention, interest and awareness |
|
JetBrains |
2023 (with 2022 comparison) |
2026-10-27 |
web framework usage within each language community (Java, JavaScript, PHP, Python, Ruby, C#, Go, Scala) |
|
npm, Inc. |
daily ranges 2015-01-10 to 2026-09-30 |
2026-10-27 |
monthly npm downloads, 12-month totals |
|
npm, Inc. |
2026-10-27 |
2026-10-27 |
first and latest versions, publish dates, licences |
|
pypistats.org |
last 180 days |
2026-10-27 |
PyPI downloads without mirrors |
|
Python Software Foundation |
2026-10-27 |
2026-10-27 |
release history and licences |
|
Microsoft |
2026-10-27 |
2026-10-27 |
total downloads per package |
|
Microsoft |
2026-10-27 |
2026-10-27 |
version history and publish dates |
|
Packagist |
2026-10-27 |
2026-10-27 |
monthly average daily downloads, totals, dependents, version history |
|
Rust Foundation |
2026-10-27 |
2026-10-27 |
downloads (total, 90 days), version history; requests need a User-Agent header |
|
Ruby Central |
2026-10-27 |
2026-10-27 |
total downloads and version history |
|
Hex |
2026-10-27 |
2026-10-27 |
downloads and version history |
|
Sonatype |
2026-10-27 |
2026-10-27 |
maven-metadata.xml version lists and .pom Last-Modified dates; Maven Central publishes no download counts |
|
2026-10-27 |
2026-10-27 |
module versions and release times (cached from 2019) |
||
2026-10-27 |
2026-10-27 |
GitHub stars, forks, open issues and licence per repository |
||
Open Source Security Foundation |
2026-08-24 run |
2026-10-27 |
overall score, Security-Policy and Maintained checks |
|
GitHub |
n/a |
2026-10-27 |
(unverified) refused with HTTP 403 for repositories outside this site; stars over time, contributors and dependents are n/a |
|
Google / OpenSSF |
2026-10-27 |
2026-10-27 |
security advisories per package (includes GitHub Security Advisories, PYSEC, RUSTSEC, Go) |
|
endoflife.date |
2026-10-27 |
2026-10-27 |
release cycles, support and end-of-life dates, LTS |
|
HTTP Archive |
2026-09 crawl |
2026-10-27 |
Core Web Vitals pass rates and adoption (origins) per technology |
|
W3Techs (Q-Success) |
2026-10-27 |
2026-10-27 |
share of websites using each JavaScript library |
|
Hacker News (Y Combinator) |
2015-01 to 2026-10 |
2026-10-27 |
job-posting mention share per framework |
|
Algolia |
2026-10-27 |
2026-10-27 |
thread discovery and comment trees |
|
Spring Boot vs Quarkus performance comparison (tuned scenario) |
Quarkus team (Red Hat) |
run of 2026-06-02 (commit 38345ca), shown on quarkus.io |
2026-10-27 |
vendor-reported boot time, RSS and throughput, JIT and native |
Micronaut Foundation |
2026-10-27 |
2026-10-27 |
vendor-reported startup and memory, JVM and native |
|
Oracle |
2026-10-27 |
2026-10-27 |
vendor-reported startup and memory footprint |
|
Microsoft |
ASP.NET Core 10.0 |
2026-10-27 |
checked only: startup and memory are shown as a chart image without numbers |
|
Official websites of each framework (website column of frameworks.csv) |
framework projects |
2026-10-27 |
2026-10-27 |
governance and ownership statements; concurrency-model evidence for undocumented frameworks |
Irurueta Docs |
2026-10-27 |
2026-10-27 |
feature, deployment, real-time and concurrency evidence |
|
Irurueta Docs |
2026-10-27 |
2026-10-27 |
Web Forms, MVC and Blazor release years |
|
Irurueta Docs |
2026-10-27 |
2026-10-27 |
Struts 1 release year |
|
Irurueta Docs |
2026-10-27 |
2026-10-27 |
feature-matrix "no" values and editorial radar axes; rubric in NOTES.md |
|
TechEmpower |
Round 16 Final Citrine; 2018-06-03; Citrine hardware |
2026-10-27 |
requests per second per test (results/round16/ph.json) |
|
TechEmpower |
Round 17 Final Citrine; 2018-09-06; Citrine hardware |
2026-10-27 |
requests per second per test (results/round17/ph.json) |
|
TechEmpower |
Round 18 Citrine; 2019-06-05; Citrine hardware |
2026-10-27 |
requests per second per test (results/round18/ph.json) |
|
TechEmpower |
Round 19 Citrine; 2020-05-14; Citrine hardware |
2026-10-27 |
requests per second per test (results/round19/ph.json) |
|
TechEmpower |
Round 20 Citrine; 2021-01-04; Citrine hardware |
2026-10-27 |
requests per second per test (results/round20/ph.json) |
|
TechEmpower |
Round 21 Citrine; 2022-06-30; Citrine hardware |
2026-10-27 |
requests per second per test (results/round21/ph.json) |
|
TechEmpower |
Continuous Benchmarking Run 2023-10-11 08:00:48; 2023-10-11; Citrine hardware |
2026-10-27 |
requests per second per test (results/round22/ph.json) |
|
TechEmpower |
Continuous Benchmarking Run 2025-01-30 18:47:41; 2025-01-30; Citrine hardware |
2026-10-27 |
requests per second per test (results/round23/ph.json); last round, the FrameworkBenchmarks repository is archived |
| Source | Publisher | Edition or date | Retrieved | Reason |
|---|---|---|---|---|
Python Software Foundation |
n/a |
2026-10-27 |
(unverified) not queried: requires a Google Cloud project; long-term PyPI history is therefore n/a |
|
pepy.tech |
n/a |
2026-10-27 |
(unverified) not used: the API requires a key |
|
PingCAP |
n/a |
2026-10-27 |
(unverified) repository endpoint returned HTTP 500 and the stargazer history endpoint HTTP 401 |
|
NIST |
n/a |
2026-10-27 |
(unverified) returned HTTP 403; CVE ids come from OSV aliases |
|
Internet Archive |
n/a |
2026-10-27 |
(unverified) not reachable from the authoring environment |