diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 1b1daf36be..7380cb75e9 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -178,7 +178,7 @@ jobs:
- name: Install Dependencies
run: uv sync --no-dev --group tests --extra all
- name: CodSpeed benchmarks
- uses: CodSpeedHQ/action@1c8ae4843586d3ba879736b7f6b7b0c990757fab # v4.12.1
+ uses: CodSpeedHQ/action@658a901452bb54c799643e060733b7afe9121b8d # v4.14.0
with:
mode: simulation
run: uv run --no-sync pytest tests/benchmarks --codspeed
diff --git a/.github/workflows/translate.yml b/.github/workflows/translate.yml
index 22fd7e4f15..87023623ed 100644
--- a/.github/workflows/translate.yml
+++ b/.github/workflows/translate.yml
@@ -79,6 +79,8 @@ jobs:
if: github.repository_owner == 'fastapi'
needs: langs
runs-on: ubuntu-latest
+ permissions:
+ contents: write
strategy:
matrix:
lang: ${{ fromJson(needs.langs.outputs.langs) }}
@@ -91,7 +93,7 @@ jobs:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- persist-credentials: false
+ persist-credentials: true # Required for `git push` in `translate.py`
- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
diff --git a/README.md b/README.md
index 9ed338a1bb..97f7944754 100644
--- a/README.md
+++ b/README.md
@@ -49,7 +49,7 @@ The key features are:
-### Gold and Silver Sponsors
+### Gold Sponsors
@@ -61,6 +61,9 @@ The key features are:
+
+### Silver Sponsors
+
@@ -74,6 +77,10 @@ The key features are:
## Opinions
+
+
+
## FastAPI mini documentary
There's a [FastAPI mini documentary](https://www.youtube.com/watch?v=mpR8ngthqiE) released at the end of 2025, you can watch it online:
-
+
## **Typer**, the FastAPI of CLIs
diff --git a/docs/en/docs/css/custom.css b/docs/en/docs/css/custom.css
index bbfd49b55e..147181c489 100644
--- a/docs/en/docs/css/custom.css
+++ b/docs/en/docs/css/custom.css
@@ -264,3 +264,189 @@ Inspired by Termynal's CSS tricks with modifications
border-bottom: .05rem dotted var(--md-default-fg-color--light);
cursor: help;
}
+
+/* Opinions: interactive logo tabs */
+.fastapi-opinions {
+ margin: 1.5rem 0 2rem;
+}
+.fastapi-opinions__tabs {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 0.25rem;
+ margin-bottom: 1.5rem;
+ border-bottom: 1px solid var(--md-default-fg-color--lightest);
+}
+.fastapi-opinions__tab {
+ position: relative;
+ appearance: none;
+ background: none;
+ border: 0;
+ padding: 0.625rem 0.5rem;
+ margin: 0;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: inherit;
+ font: inherit;
+ min-height: 40px;
+ min-width: 0;
+}
+.fastapi-opinions__tab::after {
+ content: "";
+ position: absolute;
+ left: 50%;
+ right: 50%;
+ bottom: -1px;
+ height: 2px;
+ background-color: var(--md-primary-fg-color);
+ opacity: 0;
+ transition: left 0.2s ease, right 0.2s ease, opacity 0.2s ease;
+}
+.fastapi-opinions__tab[aria-selected="true"]::after {
+ left: 12%;
+ right: 12%;
+ opacity: 1;
+}
+.fastapi-opinions__tab:focus-visible {
+ outline: 2px solid var(--md-primary-fg-color);
+ outline-offset: 2px;
+ border-radius: 4px;
+}
+.fastapi-opinions__mark {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 22px;
+ max-width: 100%;
+ filter: grayscale(1);
+ opacity: 0.5;
+ transition: filter 0.2s, opacity 0.2s;
+}
+.fastapi-opinions__mark img {
+ height: 100%;
+ width: auto;
+ max-width: 100%;
+ object-fit: contain;
+ display: block;
+}
+.fastapi-opinions__tab:hover .fastapi-opinions__mark {
+ filter: grayscale(0.3);
+ opacity: 0.85;
+}
+.fastapi-opinions__tab[aria-selected="true"] .fastapi-opinions__mark {
+ filter: grayscale(0);
+ opacity: 1;
+}
+
+/* Dark mode: brighten dark wordmarks so they read on slate */
+[data-md-color-scheme="slate"] .fastapi-opinions__mark {
+ filter: grayscale(1) invert(0.85);
+}
+[data-md-color-scheme="slate"] .fastapi-opinions__tab:hover .fastapi-opinions__mark {
+ filter: grayscale(0.3) invert(0.4);
+}
+[data-md-color-scheme="slate"] .fastapi-opinions__tab[aria-selected="true"] .fastapi-opinions__mark {
+ filter: none;
+}
+
+.fastapi-opinions__panel {
+ position: relative;
+ padding: 0.5rem 1rem 0.5rem 3rem;
+}
+.fastapi-opinions__panel::before {
+ content: "\201C";
+ position: absolute;
+ top: -0.75rem;
+ left: 0.25rem;
+ font-family: Georgia, "Times New Roman", serif;
+ font-size: 4rem;
+ line-height: 1;
+ color: var(--md-primary-fg-color);
+ opacity: 0.18;
+ pointer-events: none;
+}
+.md-typeset blockquote.fastapi-opinions__quote {
+ margin: 0;
+ font-size: 1rem;
+ font-style: italic;
+ line-height: 1.65;
+ color: var(--md-default-fg-color);
+ border-left: 0;
+ padding-left: 0;
+}
+.fastapi-opinions__quote strong { font-style: normal; }
+.fastapi-opinions__attr {
+ margin-top: 0.875rem;
+ font-size: 0.8rem;
+ color: var(--md-default-fg-color--light);
+}
+.fastapi-opinions__attr strong { color: var(--md-default-fg-color); }
+.fastapi-opinions__attr a {
+ color: var(--md-primary-fg-color);
+ text-decoration: none;
+ font-size: 0.75rem;
+ margin-left: 0.25rem;
+}
+.fastapi-opinions__attr a:hover { text-decoration: underline; }
+
+@media (prefers-reduced-motion: reduce) {
+ .fastapi-opinions__tab::after { transition: none; }
+}
+
+@media (max-width: 600px) {
+ .fastapi-opinions__tabs { gap: 0.125rem; }
+ .fastapi-opinions__mark { height: 18px; }
+ .fastapi-opinions__panel { padding-left: 2.25rem; }
+ .fastapi-opinions__panel::before { font-size: 3rem; }
+}
+
+.fastapi-sponsors {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+ gap: 1rem 1.25rem;
+ margin: 1rem 0 2rem;
+}
+
+.fastapi-sponsors__card {
+ transition: transform 0.15s ease;
+}
+
+.fastapi-sponsors__card:hover {
+ transform: translateY(-1px);
+}
+
+.fastapi-sponsors__card--keystone {
+ width: 100%;
+ max-width: 560px;
+}
+
+.fastapi-sponsors__banner {
+ display: block;
+ border-radius: 12px;
+}
+
+.fastapi-sponsors__card--keystone .fastapi-sponsors__banner { width: 100%; }
+.fastapi-sponsors__card--gold .fastapi-sponsors__banner { height: 80px; }
+.fastapi-sponsors__card--silver .fastapi-sponsors__banner { height: 60px; }
+
+@media (max-width: 600px) {
+ .fastapi-sponsors__card--gold .fastapi-sponsors__banner { height: 64px; }
+ .fastapi-sponsors__card--silver .fastapi-sponsors__banner { height: 50px; }
+}
+
+.fastapi-feature-banner {
+ display: block;
+ max-width: 680px;
+ margin: 1rem auto 1.5rem;
+}
+.fastapi-feature-banner img {
+ display: block;
+ width: 100%;
+ border-radius: 12px;
+}
+
+/* Hidden in MkDocs; rendered on GitHub (which doesn't load this stylesheet) */
+.only-github { display: none; }
diff --git a/docs/en/docs/img/fastapi-conf.jpeg b/docs/en/docs/img/fastapi-conf.jpeg
new file mode 100644
index 0000000000..14e77b997f
Binary files /dev/null and b/docs/en/docs/img/fastapi-conf.jpeg differ
diff --git a/docs/en/docs/img/logos/cisco.svg b/docs/en/docs/img/logos/cisco.svg
new file mode 100644
index 0000000000..b1f6ae27b1
--- /dev/null
+++ b/docs/en/docs/img/logos/cisco.svg
@@ -0,0 +1,35 @@
+
+
diff --git a/docs/en/docs/img/logos/microsoft.svg b/docs/en/docs/img/logos/microsoft.svg
new file mode 100644
index 0000000000..e77821b28f
--- /dev/null
+++ b/docs/en/docs/img/logos/microsoft.svg
@@ -0,0 +1,8 @@
+
+
diff --git a/docs/en/docs/img/logos/netflix.svg b/docs/en/docs/img/logos/netflix.svg
new file mode 100644
index 0000000000..3c015f960b
--- /dev/null
+++ b/docs/en/docs/img/logos/netflix.svg
@@ -0,0 +1 @@
+
diff --git a/docs/en/docs/img/logos/uber.svg b/docs/en/docs/img/logos/uber.svg
new file mode 100644
index 0000000000..bc0bd54d82
--- /dev/null
+++ b/docs/en/docs/img/logos/uber.svg
@@ -0,0 +1,39 @@
+
+
+
+
diff --git a/docs/en/docs/index.md b/docs/en/docs/index.md
index 88fcc45456..026961e25a 100644
--- a/docs/en/docs/index.md
+++ b/docs/en/docs/index.md
@@ -54,18 +54,27 @@ The key features are:
### Keystone Sponsor { #keystone-sponsor }
+
-### Gold and Silver Sponsors { #gold-and-silver-sponsors }
+### Gold Sponsors { #gold-sponsors }
+
+
+### Silver Sponsors { #silver-sponsors }
+
+
@@ -73,6 +82,44 @@ The key features are:
## Opinions { #opinions }
+
+"I'm using FastAPI a ton these days. I'm actually planning to use it for all of my team's ML services at Microsoft. Some of them are getting integrated into the core Windows product and some Office products."+
"We adopted the FastAPI library to spawn a REST server that can be queried to obtain predictions." [for Ludwig]+
"Netflix is pleased to announce the open-source release of our crisis management orchestration framework: Dispatch!" [built with FastAPI]+
"If anyone is looking to build a production Python API, I would highly recommend FastAPI. It is beautifully designed, simple to use and highly scalable β it has become a key component in our API-first development strategy."+
## FastAPI mini documentary { #fastapi-mini-documentary }
There's a [FastAPI mini documentary](https://www.youtube.com/watch?v=mpR8ngthqiE) released at the end of 2025, you can watch it online:
-
+
## **Typer**, the FastAPI of CLIs { #typer-the-fastapi-of-clis }
diff --git a/docs/en/docs/js/custom.js b/docs/en/docs/js/custom.js
index 311995d7cd..a4db853f5c 100644
--- a/docs/en/docs/js/custom.js
+++ b/docs/en/docs/js/custom.js
@@ -201,11 +201,49 @@ function openLinksInNewTab() {
});
}
+function setupOpinionsTabs() {
+ const root = document.querySelector('.fastapi-opinions');
+ if (!root) return;
+ const tabs = Array.from(root.querySelectorAll('[role="tab"]'));
+ const panels = Array.from(root.querySelectorAll('[role="tabpanel"]'));
+ if (!tabs.length) return;
+
+ function activate(tab, focus) {
+ tabs.forEach(t => {
+ const selected = t === tab;
+ t.setAttribute('aria-selected', selected ? 'true' : 'false');
+ t.setAttribute('tabindex', selected ? '0' : '-1');
+ });
+ const targetId = tab.getAttribute('aria-controls');
+ panels.forEach(p => {
+ if (p.id === targetId) p.removeAttribute('hidden');
+ else p.setAttribute('hidden', '');
+ });
+ if (focus) tab.focus();
+ }
+
+ tabs.forEach((tab, i) => {
+ tab.addEventListener('click', () => activate(tab, false));
+ tab.addEventListener('keydown', (e) => {
+ let next = null;
+ if (e.key === 'ArrowRight') next = tabs[(i + 1) % tabs.length];
+ else if (e.key === 'ArrowLeft') next = tabs[(i - 1 + tabs.length) % tabs.length];
+ else if (e.key === 'Home') next = tabs[0];
+ else if (e.key === 'End') next = tabs[tabs.length - 1];
+ if (next) {
+ e.preventDefault();
+ activate(next, true);
+ }
+ });
+ });
+}
+
async function main() {
setupTermynal();
showRandomAnnouncement('announce-left', 5000)
handleSponsorImages();
openLinksInNewTab();
+ setupOpinionsTabs();
}
document$.subscribe(() => {
main()
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index ffff30400e..644918e9cc 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -7,8 +7,18 @@ hide:
## Latest Changes
+### Docs
+
+* π Improve layout and styling. PR [#15462](https://github.com/fastapi/fastapi/pull/15462) by [@alejsdev](https://github.com/alejsdev).
+* π Refactor opinions section with interactive tabs and new logos. PR [#15458](https://github.com/fastapi/fastapi/pull/15458) by [@alejsdev](https://github.com/alejsdev).
+* π Add FastAPI Conf '26 announcement to docs. PR [#15457](https://github.com/fastapi/fastapi/pull/15457) by [@alejsdev](https://github.com/alejsdev).
+
### Internal
+* π· Fix missing credentials issue in `translate` workflow. PR [#15468](https://github.com/fastapi/fastapi/pull/15468) by [@YuriiMotov](https://github.com/YuriiMotov).
+* β¬ Bump sqlmodel from 0.0.32 to 0.0.38. PR [#15437](https://github.com/fastapi/fastapi/pull/15437) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* β¬ Bump CodSpeedHQ/action from 4.12.1 to 4.14.0. PR [#15436](https://github.com/fastapi/fastapi/pull/15436) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* β¬ Bump pydantic from 2.12.5 to 2.13.2. PR [#15439](https://github.com/fastapi/fastapi/pull/15439) by [@dependabot[bot]](https://github.com/apps/dependabot).
* β¬ Bump pydantic-ai from 1.63.0 to 1.83.0. PR [#15417](https://github.com/fastapi/fastapi/pull/15417) by [@dependabot[bot]](https://github.com/apps/dependabot).
* β¬ Bump prek from 0.3.2 to 0.3.9. PR [#15418](https://github.com/fastapi/fastapi/pull/15418) by [@dependabot[bot]](https://github.com/apps/dependabot).
* β¬ Bump fastar from 0.9.0 to 0.11.0. PR [#15419](https://github.com/fastapi/fastapi/pull/15419) by [@dependabot[bot]](https://github.com/apps/dependabot).
diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html
index 54c36fbc7b..7559de529b 100644
--- a/docs/en/overrides/main.html
+++ b/docs/en/overrides/main.html
@@ -10,6 +10,13 @@
Join the FastAPI Cloud waiting list π
+