You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by gi...@apache.org on 2026/06/17 12:37:08 UTC
(airflow-site) branch staging-publish updated: Docs updated via refs/heads/staging:717dbb5bb613d8ccf167a778d181201add40afbc
This is an automated email from the ASF dual-hosted git repository.
github-actions[bot] pushed a commit to branch staging-publish
in repository https://gitbox.apache.org/repos/asf/airflow-site.git
The following commit(s) were added to refs/heads/staging-publish by this push:
new 6c993c2984 Docs updated via refs/heads/staging:717dbb5bb613d8ccf167a778d181201add40afbc
6c993c2984 is described below
commit 6c993c2984b9feb56e89394c81f4f04a6a14183b
Author: GitHub Actions <ac...@users.noreply.github.com>
AuthorDate: Wed Jun 17 12:37:00 2026 +0000
Docs updated via refs/heads/staging:717dbb5bb613d8ccf167a778d181201add40afbc
---
404.html | 90 +-
_gen/indexes/en/blog-index.json | 2 +-
_gen/indexes/en/blog-posts.json | 2 +-
announcements/index.html | 175 ++-
blocktype/index.html | 92 +-
blocktype/testimonial/index.html | 92 +-
blocktype/use-case/index.html | 92 +-
.../images/agentic-approval-dialog.png | Bin 0 -> 414036 bytes
.../images/agentic-collect-results-xcom.png | Bin 0 -> 490951 bytes
.../images/agentic-generate-sql-logs.png | Bin 0 -> 659457 bytes
.../index.html | 638 +++++---
.../index.html | 660 ++++++---
blog/airflow-1.10.10/index.html | 116 +-
blog/airflow-1.10.12/index.html | 116 +-
blog/airflow-1.10.8-1.10.9/index.html | 116 +-
blog/airflow-2.10.0/index.html | 166 +--
blog/airflow-2.2.0/index.html | 116 +-
blog/airflow-2.3.0/index.html | 143 +-
blog/airflow-2.4.0/index.html | 116 +-
blog/airflow-2.5.0/index.html | 116 +-
blog/airflow-2.6.0/index.html | 116 +-
blog/airflow-2.7.0/index.html | 116 +-
blog/airflow-2.8.0/index.html | 143 +-
blog/airflow-2.9.0/index.html | 116 +-
blog/airflow-3.1.0/index.html | 140 +-
blog/airflow-3.2.0/images/3.2.0.jpg | Bin 0 -> 1470642 bytes
blog/airflow-3.2.0/images/asset_partitioning.png | Bin 0 -> 282602 bytes
blog/{airflow-3.1.0 => airflow-3.2.0}/index.html | 511 +++----
blog/airflow-registry/index.html | 158 +-
blog/airflow-survey-2020/index.html | 116 +-
blog/airflow-survey-2022/index.html | 116 +-
blog/airflow-survey-2023/index.html | 114 +-
blog/airflow-survey-2024/index.html | 116 +-
blog/airflow-survey-2025/index.html | 116 +-
blog/airflow-survey/index.html | 116 +-
blog/airflow-three-point-oh-is-here/index.html | 159 +-
blog/airflow-two-point-oh-is-here/index.html | 116 +-
blog/airflow_summit_2021/index.html | 134 +-
blog/airflow_summit_2022/index.html | 134 +-
blog/airflowctl-0.1.0/index.html | 116 +-
blog/announcing-new-website/index.html | 154 +-
blog/apache-airflow-for-newcomers/index.html | 156 +-
.../index.html | 154 +-
blog/common-ai-provider/images/agent-sql-logs.png | Bin 0 -> 512969 bytes
.../images/common-ai-provider.png | Bin 0 -> 304171 bytes
.../images/durable-attempt-1.png | Bin 0 -> 912104 bytes
.../images/durable-attempt-2.png | Bin 0 -> 688474 bytes
blog/common-ai-provider/images/durable-summary.png | Bin 0 -> 122476 bytes
.../images/file-analysis-csv.png | Bin 0 -> 476057 bytes
blog/common-ai-provider/images/hitl-approval.png | Bin 0 -> 319894 bytes
blog/common-ai-provider/images/hitl-review-tab.gif | Bin 0 -> 2121464 bytes
blog/common-ai-provider/images/tool-logging.png | Bin 0 -> 642712 bytes
.../index.html | 682 +++++----
.../index.html | 109 +-
.../index.html | 102 +-
.../index.html | 158 +-
blog/fab-oid-vulnerability/index.html | 116 +-
.../index.html | 114 +-
blog/index.html | 515 ++++---
blog/index.xml | 1544 +++++++++++++++++---
blog/introducing_setup_teardown/index.html | 102 +-
.../index.html | 116 +-
blog/tags/airflow-summit/index.html | 116 +-
blog/tags/airflow-summit/index.xml | 2 +-
blog/tags/community/index.html | 332 +++--
blog/tags/community/index.xml | 23 +-
blog/tags/development/index.html | 116 +-
blog/tags/development/index.xml | 2 +-
blog/tags/documentation/index.html | 109 +-
blog/tags/documentation/index.xml | 2 +-
blog/tags/release/index.html | 297 ++--
blog/tags/release/index.xml | 16 +-
blog/tags/rest-api/index.html | 109 +-
blog/tags/rest-api/index.xml | 2 +-
blog/tags/survey/index.html | 144 +-
blog/tags/survey/index.xml | 2 +-
blog/tags/{airflow-summit => tutorial}/index.html | 170 +--
blog/tags/tutorial/index.xml | 26 +
blog/tags/users/index.html | 144 +-
blog/tags/users/index.xml | 2 +-
blog/tags/vulnerabilities/index.html | 109 +-
blog/tags/vulnerabilities/index.xml | 2 +-
categories/index.html | 90 +-
chunk-187.d9cd6.js => chunk-187.0d38a.js | 0
chunk-291.d9cd6.js => chunk-291.0d38a.js | 2 +-
...s.LICENSE.txt => chunk-291.0d38a.js.LICENSE.txt | 0
chunk-404.0d38a.js | 1 +
chunk-537.d9cd6.js => chunk-537.0d38a.js | 2 +-
chunk-608.d9cd6.js => chunk-608.0d38a.js | 2 +-
chunk-744.d9cd6.js => chunk-744.0d38a.js | 0
chunk-808.d9cd6.js | 1 -
code-of-conduct/index.html | 92 +-
community/index.html | 746 ++++++----
community/index.xml | 2 +-
community/resources/index.html | 96 +-
.../airflow-user-survey-responses-2025.csv.zip | Bin 883765 -> 882476 bytes
docs.0d38a.js | 1 +
docs.d9cd6.js | 1 -
docs/index.html | 120 +-
ecosystem/index.html | 105 +-
index.html | 156 +-
index.xml | 30 +-
index.yaml | 526 ++++++-
...721e94dd89ae3daef991c30b4234063d7998daba862a.js | 13 -
...4a89fce66e8c08401d993520016f677e2877642da245.js | 5 +
main.0d38a.js | 1 +
main.d9cd6.js | 1 -
meetups/index.html | 115 +-
privacy-notice/index.html | 89 +-
roadmap/index.html | 89 +-
...e606a706a8e1dc4fde73c69439f87b336ae29807134.css | 32 +
...0cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css | 32 -
...6978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css | 40 +
...3f0aedad4e9005e35c6c5beffce85a83ba852304b02.css | 40 -
search/index.html | 94 +-
sitemap.xml | 179 +--
sphinx-airflow-theme/LATEST_VERSION.txt | 2 +-
.../sphinx_airflow_theme-0.3.11-py3-none-any.whl | Bin 0 -> 447510 bytes
.../sphinx_airflow_theme-0.3.11.tar.gz | Bin 0 -> 433063 bytes
survey/index.html | 92 +-
tags/index.html | 99 +-
tags/index.xml | 25 +-
use-cases/adjoe/index.html | 94 +-
use-cases/adobe/index.html | 94 +-
use-cases/adyen/index.html | 94 +-
use-cases/big-fish-games/index.html | 94 +-
use-cases/business_operations/index.html | 94 +-
use-cases/dish/index.html | 94 +-
use-cases/etl_analytics/index.html | 94 +-
use-cases/experity/index.html | 94 +-
use-cases/index.html | 182 +--
use-cases/infrastructure-management/index.html | 94 +-
use-cases/mlops/index.html | 94 +-
use-cases/onefootball/index.html | 94 +-
use-cases/plarium-krasnodar/index.html | 94 +-
use-cases/seniorlink/index.html | 94 +-
use-cases/sift/index.html | 94 +-
use-cases/snapp/index.html | 94 +-
use-cases/suse/index.html | 94 +-
139 files changed, 8173 insertions(+), 7682 deletions(-)
diff --git a/404.html b/404.html
index 7290bda2ce..a2b7bda65e 100644
--- a/404.html
+++ b/404.html
@@ -41,8 +41,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -50,8 +50,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -81,8 +81,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -90,14 +90,18 @@
</head>
<body class="td-404">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -262,13 +266,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -278,42 +278,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -490,7 +466,7 @@
<div class="container-fluid td-default">
<div class="home-page-layout base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="four-oh-four">
<div class="four-oh-four__text-container">
@@ -505,8 +481,8 @@
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -581,14 +557,14 @@
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -612,7 +588,7 @@
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -622,7 +598,7 @@
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -701,13 +677,13 @@
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</body>
</html>
diff --git a/_gen/indexes/en/blog-index.json b/_gen/indexes/en/blog-index.json
index 370d423260..a76ec3dae1 100644
--- a/_gen/indexes/en/blog-index.json
+++ b/_gen/indexes/en/blog-index.json
@@ -1 +1 @@
-{"version":"2.3.9","fields":["title","description","author","content","tags","url"],"fieldVectors":[["title/It's a \"Breeze\" to develop Apache Airflow",[0,1.636,1,1.636,2,0.556,3,0.399,4,0.502]],["description/It's a \"Breeze\" to develop Apache Airflow",[2,0.708,4,0.44,5,2.642,6,1.571,7,2.642,8,1.737,9,1.571,10,1.212,11,1.316,12,1.038,13,2.642,14,0.894,15,2.642,16,0.034]],["author/It's a \"Breeze\" to develop Apache Airflow",[11,1.605,17,1.749]],["content/It's a \"Breeze\" to develop Ap [...]
\ No newline at end of file
+{"version":"2.3.9","fields":["title","description","author","content","tags","url"],"fieldVectors":[["title/It's a \"Breeze\" to develop Apache Airflow",[0,1.537,1,1.799,2,0.677,3,0.413,4,0.521]],["description/It's a \"Breeze\" to develop Apache Airflow",[2,0.871,4,0.469,5,2.908,6,1.766,7,2.908,8,1.942,9,1.619,10,1.383,11,1.493,12,1.044,13,2.908,14,0.977,15,2.908,16,0.011]],["author/It's a \"Breeze\" to develop Apache Airflow",[11,1.654,17,1.793]],["content/It's a \"Breeze\" to develop A [...]
\ No newline at end of file
diff --git a/_gen/indexes/en/blog-posts.json b/_gen/indexes/en/blog-posts.json
index 08d5cf77b2..b6fe5d5bc9 100644
--- a/_gen/indexes/en/blog-posts.json
+++ b/_gen/indexes/en/blog-posts.json
@@ -1 +1 @@
-[{"content":"## The story behind the Airflow Breeze tool\nInitially, we started contributing to this fantastic open-source project [Apache Airflow] with a team of three which then grew to five. When we kicked it off a year ago, I realized pretty soon where the biggest bottlenecks and areas for improvement in terms of productivity were. Even with the help of our client, who provided us with a “homegrown” development environment it took us literally days to set it up and learn some basics. [...]
\ No newline at end of file
+[{"content":"## The story behind the Airflow Breeze tool\nInitially, we started contributing to this fantastic open-source project [Apache Airflow] with a team of three which then grew to five. When we kicked it off a year ago, I realized pretty soon where the biggest bottlenecks and areas for improvement in terms of productivity were. Even with the help of our client, who provided us with a “homegrown” development environment it took us literally days to set it up and learn some basics. [...]
\ No newline at end of file
diff --git a/announcements/index.html b/announcements/index.html
index 837d17b39c..3b513ddbb2 100644
--- a/announcements/index.html
+++ b/announcements/index.html
@@ -27,28 +27,26 @@
<title>Announcements | Apache Airflow</title><meta property="og:url" content="/announcements/">
<meta property="og:site_name" content="Apache Airflow">
<meta property="og:title" content="Announcements">
- <meta property="og:description" content=" March 14, 2026 We’ve just released Apache Airflow 2.11.2 🎉
-📦 PyPI: https://pypi.org/project/apache-airflow/2.11.2/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/2.11.2/ 🛠 Release Notes: https://airflow.apache.org/docs/apache-airflow/2.11.2/release_notes.html 🐳 Docker Image: “docker pull apache/airflow:2.11.2” 🚏 Constraints: https://github.com/apache/airflow/tree/constraints-2.11.2
-March 11, 2026 We’ve just released Apache Airflow 3.1.8 🎉
-📦 PyPI: https://pypi.org/project/apache-airflow/3.1.8/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/3.1.8/ 🛠 Release Notes: https://airflow.apache.org/docs/apache-airflow/3.1.8/release_notes.html 🐳 Docker Image: “docker pull apache/airflow:3.1.8” 🚏 Constraints: https://github.com/apache/airflow/tree/constraints-3.1.8
-February 17, 2026 We’ve just released Apache Airflow Helm chart 1.19.0.
-📦 ArtifactHub: https://artifacthub.io/packages/helm/apache-airflow/airflow 📚 Docs: https://airflow.apache.org/docs/helm-chart/1.19.0/ 🛠️ Release Notes: https://airflow.apache.org/docs/helm-chart/1.19.0/release_notes.html 🪶 Sources: https://airflow.apache.org/docs/helm-chart/1.19.0/installing-helm-chart-from-sources.html
-February 4, 2026 We’ve just released Airflow 3.1.7 and Task SDK 1.1.7 🎉">
+ <meta property="og:description" content="June 3, 2026 We’ve just released Apache Airflow CTL 0.1.5 🎉
+Highlights:
+New Dag Next Execution Command Bulk Delete Dag Runs Rerun Latest Dag Version Positional Arguments Simplified JSON Backfill Payload Support 📦 PyPI: https://pypi.org/project/apache-airflow-ctl/0.1.5 📚 Docs: https://airflow.apache.org/docs/apache-airflow-ctl/0.1.5 🛠 Release Notes: https://airflow.apache.org/docs/apache-airflow-ctl/0.1.5/release_notes.html
+May 29, 2026 We’ve just released Apache Airflow 3.2.2 🎉
+📦 PyPI: https://pypi.org/project/apache-airflow/3.2.2/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/3.2.2/ 🛠 Release Notes: https://airflow.apache.org/docs/apache-airflow/3.2.2/release_notes.html 🐳 Docker Image: “docker pull apache/airflow:3.2.2” 🚏 Constraints: https://github.com/apache/airflow/tree/constraints-3.2.2
+May 21, 2026 Airflow PMC welcomes new Airflow PMC Member: Niko Oliveira (@o-nikolas)">
<meta property="og:locale" content="en">
<meta property="og:type" content="website">
<meta property="og:image" content="/images/feature-image.png">
<meta itemprop="name" content="Announcements">
- <meta itemprop="description" content=" March 14, 2026 We’ve just released Apache Airflow 2.11.2 🎉
-📦 PyPI: https://pypi.org/project/apache-airflow/2.11.2/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/2.11.2/ 🛠 Release Notes: https://airflow.apache.org/docs/apache-airflow/2.11.2/release_notes.html 🐳 Docker Image: “docker pull apache/airflow:2.11.2” 🚏 Constraints: https://github.com/apache/airflow/tree/constraints-2.11.2
-March 11, 2026 We’ve just released Apache Airflow 3.1.8 🎉
-📦 PyPI: https://pypi.org/project/apache-airflow/3.1.8/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/3.1.8/ 🛠 Release Notes: https://airflow.apache.org/docs/apache-airflow/3.1.8/release_notes.html 🐳 Docker Image: “docker pull apache/airflow:3.1.8” 🚏 Constraints: https://github.com/apache/airflow/tree/constraints-3.1.8
-February 17, 2026 We’ve just released Apache Airflow Helm chart 1.19.0.
-📦 ArtifactHub: https://artifacthub.io/packages/helm/apache-airflow/airflow 📚 Docs: https://airflow.apache.org/docs/helm-chart/1.19.0/ 🛠️ Release Notes: https://airflow.apache.org/docs/helm-chart/1.19.0/release_notes.html 🪶 Sources: https://airflow.apache.org/docs/helm-chart/1.19.0/installing-helm-chart-from-sources.html
-February 4, 2026 We’ve just released Airflow 3.1.7 and Task SDK 1.1.7 🎉">
+ <meta itemprop="description" content="June 3, 2026 We’ve just released Apache Airflow CTL 0.1.5 🎉
+Highlights:
+New Dag Next Execution Command Bulk Delete Dag Runs Rerun Latest Dag Version Positional Arguments Simplified JSON Backfill Payload Support 📦 PyPI: https://pypi.org/project/apache-airflow-ctl/0.1.5 📚 Docs: https://airflow.apache.org/docs/apache-airflow-ctl/0.1.5 🛠 Release Notes: https://airflow.apache.org/docs/apache-airflow-ctl/0.1.5/release_notes.html
+May 29, 2026 We’ve just released Apache Airflow 3.2.2 🎉
+📦 PyPI: https://pypi.org/project/apache-airflow/3.2.2/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/3.2.2/ 🛠 Release Notes: https://airflow.apache.org/docs/apache-airflow/3.2.2/release_notes.html 🐳 Docker Image: “docker pull apache/airflow:3.2.2” 🚏 Constraints: https://github.com/apache/airflow/tree/constraints-3.2.2
+May 21, 2026 Airflow PMC welcomes new Airflow PMC Member: Niko Oliveira (@o-nikolas)">
<meta itemprop="datePublished" content="2020-08-08T05:30:20+05:30">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
- <meta itemprop="wordCount" content="5948">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
+ <meta itemprop="wordCount" content="6136">
<meta itemprop="image" content="/images/feature-image.png">
@@ -57,8 +55,8 @@ February 4, 2026 We’ve just released Airflow 3.1.7 and Task SDK 1.1.7 🎉">
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -66,8 +64,8 @@ February 4, 2026 We’ve just released Airflow 3.1.7 and Task SDK 1.1.7 🎉">
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -97,8 +95,8 @@ February 4, 2026 We’ve just released Airflow 3.1.7 and Task SDK 1.1.7 🎉">
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -106,14 +104,18 @@ February 4, 2026 We’ve just released Airflow 3.1.7 and Task SDK 1.1.7 🎉">
</head>
<body class="td-section">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -278,13 +280,9 @@ February 4, 2026 We’ve just released Airflow 3.1.7 and Task SDK 1.1.7 🎉">
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -294,42 +292,18 @@ February 4, 2026 We’ve just released Airflow 3.1.7 and Task SDK 1.1.7 🎉">
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -506,9 +480,54 @@ February 4, 2026 We’ve just released Airflow 3.1.7 and Task SDK 1.1.7 🎉">
<div class="container-fluid td-default">
<div class="home-page-layout base-layout">
- <main role="main" class="td-main container">
- <p>
- </p>
+ <main id="main-content" role="main" class="td-main container">
+ <h1 id="june-3-2026">June 3, 2026</h1>
+<p>We’ve just released Apache Airflow CTL 0.1.5 🎉</p>
+<p>Highlights:</p>
+<ul>
+<li>New Dag Next Execution Command</li>
+<li>Bulk Delete Dag Runs</li>
+<li>Rerun Latest Dag Version</li>
+<li>Positional Arguments Simplified</li>
+<li>JSON Backfill Payload Support</li>
+</ul>
+<p>📦 PyPI: <a href="https://pypi.org/project/apache-airflow-ctl/0.1.5">https://pypi.org/project/apache-airflow-ctl/0.1.5</a>
+📚 Docs: <a href="https://airflow.apache.org/docs/apache-airflow-ctl/0.1.5">https://airflow.apache.org/docs/apache-airflow-ctl/0.1.5</a>
+🛠 Release Notes: <a href="https://airflow.apache.org/docs/apache-airflow-ctl/0.1.5/release_notes.html">https://airflow.apache.org/docs/apache-airflow-ctl/0.1.5/release_notes.html</a></p>
+<h1 id="may-29-2026">May 29, 2026</h1>
+<p>We’ve just released Apache Airflow 3.2.2 🎉</p>
+<p>📦 PyPI: <a href="https://pypi.org/project/apache-airflow/3.2.2/">https://pypi.org/project/apache-airflow/3.2.2/</a> <br>
+📚 Docs: <a href="https://airflow.apache.org/docs/apache-airflow/3.2.2/">https://airflow.apache.org/docs/apache-airflow/3.2.2/</a> <br>
+🛠 Release Notes: <a href="https://airflow.apache.org/docs/apache-airflow/3.2.2/release_notes.html">https://airflow.apache.org/docs/apache-airflow/3.2.2/release_notes.html</a> <br>
+🐳 Docker Image: “docker pull apache/airflow:3.2.2” <br>
+🚏 Constraints: <a href="https://github.com/apache/airflow/tree/constraints-3.2.2">https://github.com/apache/airflow/tree/constraints-3.2.2</a></p>
+<h1 id="may-21-2026">May 21, 2026</h1>
+<p>Airflow PMC welcomes new Airflow PMC Member: <strong>Niko Oliveira</strong> (<a href="https://github.com/o-nikolas">@o-nikolas</a>)</p>
+<h1 id="april-24-2026">April 24, 2026</h1>
+<p>We’ve just released Apache Airflow Helm Chart 1.21.0 🎉</p>
+<p>📦 ArtifactHub: <a href="https://artifacthub.io/packages/helm/apache-airflow/airflow">https://artifacthub.io/packages/helm/apache-airflow/airflow</a> <br>
+📚 Docs: <a href="https://airflow.apache.org/docs/helm-chart/1.21.0/">https://airflow.apache.org/docs/helm-chart/1.21.0/</a> <br>
+🛠 Release Notes: <a href="https://airflow.apache.org/docs/helm-chart/1.21.0/release_notes.html">https://airflow.apache.org/docs/helm-chart/1.21.0/release_notes.html</a></p>
+<h1 id="april-22-2026">April 22, 2026</h1>
+<p>We’ve just released Apache Airflow 3.2.1 🎉</p>
+<p>📦 PyPI: <a href="https://pypi.org/project/apache-airflow/3.2.1/">https://pypi.org/project/apache-airflow/3.2.1/</a> <br>
+📚 Docs: <a href="https://airflow.apache.org/docs/apache-airflow/3.2.1/">https://airflow.apache.org/docs/apache-airflow/3.2.1/</a> <br>
+🛠 Release Notes: <a href="https://airflow.apache.org/docs/apache-airflow/3.2.1/release_notes.html">https://airflow.apache.org/docs/apache-airflow/3.2.1/release_notes.html</a> <br>
+🐳 Docker Image: “docker pull apache/airflow:3.2.1” <br>
+🚏 Constraints: <a href="https://github.com/apache/airflow/tree/constraints-3.2.1">https://github.com/apache/airflow/tree/constraints-3.2.1</a></p>
+<h1 id="april-07-2026">April 07, 2026</h1>
+<p>We’ve just released Apache Airflow 3.2.0 🎉</p>
+<p>📦 PyPI: <a href="https://pypi.org/project/apache-airflow/3.2.0/">https://pypi.org/project/apache-airflow/3.2.0/</a> <br>
+📚 Docs: <a href="https://airflow.apache.org/docs/apache-airflow/3.2.0/">https://airflow.apache.org/docs/apache-airflow/3.2.0/</a> <br>
+🛠 Release Notes: <a href="https://airflow.apache.org/docs/apache-airflow/3.2.0/release_notes.html">https://airflow.apache.org/docs/apache-airflow/3.2.0/release_notes.html</a> <br>
+🐳 Docker Image: “docker pull apache/airflow:3.2.0” <br>
+🚏 Constraints: <a href="https://github.com/apache/airflow/tree/constraints-3.2.0">https://github.com/apache/airflow/tree/constraints-3.2.0</a></p>
+<h1 id="march-22-2026">March 22, 2026</h1>
+<p>We’ve just released Apache <strong>Airflow Helm chart 1.20.0</strong>.</p>
+<p>📦 ArtifactHub: <a href="https://artifacthub.io/packages/helm/apache-airflow/airflow">https://artifacthub.io/packages/helm/apache-airflow/airflow</a> <br>
+📚 Docs: <a href="https://airflow.apache.org/docs/helm-chart/1.20.0/">https://airflow.apache.org/docs/helm-chart/1.20.0/</a> <br>
+🛠️ Release Notes: <a href="https://airflow.apache.org/docs/helm-chart/1.20.0/release_notes.html">https://airflow.apache.org/docs/helm-chart/1.20.0/release_notes.html</a> <br>
+🪶 Sources: <a href="https://airflow.apache.org/docs/helm-chart/1.20.0/installing-helm-chart-from-sources.html">https://airflow.apache.org/docs/helm-chart/1.20.0/installing-helm-chart-from-sources.html</a></p>
<h1 id="march-14-2026">March 14, 2026</h1>
<p>We’ve just released Apache Airflow 2.11.2 🎉</p>
<p>📦 PyPI: <a href="https://pypi.org/project/apache-airflow/2.11.2/">https://pypi.org/project/apache-airflow/2.11.2/</a> <br>
@@ -1094,15 +1113,15 @@ February 4, 2026 We’ve just released Airflow 3.1.7 and Task SDK 1.1.7 🎉">
<p><a href="https://airflowsummit.org">Airflow Summit 2022</a></p>
<p>The biggest Airflow Event of the Year returns May 23–27! Airflow Summit 2022 will bring together the global
community of Apache Airflow practitioners and data leaders.</p>
-<h3 id="whats-on-the-agenda">What’s on the Agenda</h3>
+<h2 id="whats-on-the-agenda">What’s on the Agenda</h2>
<p>During the free conference, you will hear about Apache Airflow best practices, trends in building data
pipelines, data governance, Airflow and machine learning, and the future of Airflow.
There will also be a series of presentations on non-code contributions driving the open-source project.</p>
-<h3 id="how-to-attend">How to Attend</h3>
+<h2 id="how-to-attend">How to Attend</h2>
<p>This year’s edition will include a variety of online sessions across different time zones. Additionally,
you can take part in local in-person events organized worldwide for data communities
to watch the event and network.</p>
-<h3 id="interested">Interested?</h3>
+<h2 id="interested">Interested?</h2>
<p>🪶 <a href="https://www.crowdcast.io/e/airflowsummit2022/register?utm_campaign=Astronomer_marketing&utm_source=Astronomer%20website&utm_medium=website&utm_term=Airflow%20Summit">Register for Airflow Summit 2022</a> today! <br>
🗣️ If you have an Airflow story to share, <a href="https://sessionize.com/airflow-summit-2022/">join as a speaker</a> <br>
✨ <a href="https://www.linkedin.com/company/airflow-summit/">Follow Airflow Summit on LinkedIn</a> to stay current with the latest updates. <br>
@@ -1731,8 +1750,8 @@ yet have a viable 1.7.1 release candidate. On April 12, <a href="https://github.
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -1807,14 +1826,14 @@ yet have a viable 1.7.1 release candidate. On April 12, <a href="https://github.
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -1838,7 +1857,7 @@ yet have a viable 1.7.1 release candidate. On April 12, <a href="https://github.
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -1848,7 +1867,7 @@ yet have a viable 1.7.1 release candidate. On April 12, <a href="https://github.
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -1927,13 +1946,13 @@ yet have a viable 1.7.1 release candidate. On April 12, <a href="https://github.
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</body>
</html>
diff --git a/blocktype/index.html b/blocktype/index.html
index 4b1bc48968..144da39d1d 100644
--- a/blocktype/index.html
+++ b/blocktype/index.html
@@ -34,7 +34,7 @@
<meta itemprop="name" content="Blocktype">
<meta itemprop="description" content="Platform created by the community to programmatically author, schedule and monitor workflows.">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="image" content="/images/feature-image.png">
@@ -43,8 +43,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -52,8 +52,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -83,8 +83,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -92,14 +92,18 @@
</head>
<body class="td-taxonomy">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -264,13 +268,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -280,42 +280,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -492,7 +468,7 @@
<div class="container-fluid td-default">
<div class="home-page-layout base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="td-content">
<main class="taxonomy-terms-page">
<h1>Blocktype</h1>
@@ -510,8 +486,8 @@
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -586,14 +562,14 @@
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -617,7 +593,7 @@
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -627,7 +603,7 @@
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -706,13 +682,13 @@
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</body>
</html>
diff --git a/blocktype/testimonial/index.html b/blocktype/testimonial/index.html
index 93d714fdfe..b5ff23e08e 100644
--- a/blocktype/testimonial/index.html
+++ b/blocktype/testimonial/index.html
@@ -34,7 +34,7 @@
<meta itemprop="name" content="Testimonial">
<meta itemprop="description" content="Platform created by the community to programmatically author, schedule and monitor workflows.">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="image" content="/images/feature-image.png">
@@ -43,8 +43,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -52,8 +52,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -83,8 +83,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -92,14 +92,18 @@
</head>
<body class="td-term">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -264,13 +268,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -280,42 +280,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -492,7 +468,7 @@
<div class="container-fluid td-default">
<div class="home-page-layout base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="td-content">
<main class="taxonomy-taxonomy-page">
<h1>Blocktype: <span>Testimonial</span></h1>
@@ -775,8 +751,8 @@
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -851,14 +827,14 @@
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -882,7 +858,7 @@
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -892,7 +868,7 @@
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -971,13 +947,13 @@
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</body>
</html>
diff --git a/blocktype/use-case/index.html b/blocktype/use-case/index.html
index 2a0d3dd1f9..ec72446124 100644
--- a/blocktype/use-case/index.html
+++ b/blocktype/use-case/index.html
@@ -34,7 +34,7 @@
<meta itemprop="name" content="Use-Case">
<meta itemprop="description" content="Platform created by the community to programmatically author, schedule and monitor workflows.">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="image" content="/images/feature-image.png">
@@ -43,8 +43,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -52,8 +52,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -83,8 +83,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -92,14 +92,18 @@
</head>
<body class="td-term">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -264,13 +268,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -280,42 +280,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -492,7 +468,7 @@
<div class="container-fluid td-default">
<div class="home-page-layout base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="td-content">
<main class="taxonomy-taxonomy-page">
<h1>Blocktype: <span>Use-Case</span></h1>
@@ -599,8 +575,8 @@
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -675,14 +651,14 @@
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -706,7 +682,7 @@
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -716,7 +692,7 @@
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -795,13 +771,13 @@
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</body>
</html>
diff --git a/blog/agentic-workloads-airflow-3/images/agentic-approval-dialog.png b/blog/agentic-workloads-airflow-3/images/agentic-approval-dialog.png
new file mode 100644
index 0000000000..f98f0fd62f
Binary files /dev/null and b/blog/agentic-workloads-airflow-3/images/agentic-approval-dialog.png differ
diff --git a/blog/agentic-workloads-airflow-3/images/agentic-collect-results-xcom.png b/blog/agentic-workloads-airflow-3/images/agentic-collect-results-xcom.png
new file mode 100644
index 0000000000..1593e15c8f
Binary files /dev/null and b/blog/agentic-workloads-airflow-3/images/agentic-collect-results-xcom.png differ
diff --git a/blog/agentic-workloads-airflow-3/images/agentic-generate-sql-logs.png b/blog/agentic-workloads-airflow-3/images/agentic-generate-sql-logs.png
new file mode 100644
index 0000000000..ed90c9bdb3
Binary files /dev/null and b/blog/agentic-workloads-airflow-3/images/agentic-generate-sql-logs.png differ
diff --git a/blog/airflow-2.10.0/index.html b/blog/agentic-workloads-airflow-3/index.html
similarity index 55%
copy from blog/airflow-2.10.0/index.html
copy to blog/agentic-workloads-airflow-3/index.html
index 253870f51a..3b57e786de 100644
--- a/blog/airflow-2.10.0/index.html
+++ b/blog/agentic-workloads-airflow-3/index.html
@@ -23,25 +23,26 @@
<link rel="icon" type="image/png" href="/favicons/android-144x144.png" sizes="144x144">
<link rel="icon" type="image/png" href="/favicons/android-192x192.png" sizes="192x192">
-<title>Apache Airflow 2.10.0 is here | Apache Airflow</title><meta property="og:url" content="/blog/airflow-2.10.0/">
+<title>Agentic Workloads on Airflow: Observable, Retryable, and Auditable by Design | Apache Airflow</title><meta property="og:url" content="/blog/agentic-workloads-airflow-3/">
<meta property="og:site_name" content="Apache Airflow">
- <meta property="og:title" content="Apache Airflow 2.10.0 is here">
- <meta property="og:description" content="Apache Airflow 2.10.0 is a game-changer, with powerful Dataset improvements and the groundbreaking Hybrid Executor, set to redefine your workflow capabilities!">
+ <meta property="og:title" content="Agentic Workloads on Airflow: Observable, Retryable, and Auditable by Design">
+ <meta property="og:description" content="How Dynamic Task Mapping and the common.ai provider turn a multi-dimensional research question into a fan-out/fan-in pipeline where every LLM call is a named, logged, independently retryable task, not a hidden step inside a reasoning loop.">
<meta property="og:locale" content="en">
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
- <meta property="article:published_time" content="2024-08-08T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
- <meta property="article:tag" content="Release">
- <meta property="og:image" content="/images/feature-image.png">
+ <meta property="article:published_time" content="2026-04-15T00:00:00+00:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
+ <meta property="article:tag" content="Community">
+ <meta property="article:tag" content="Tutorial">
+ <meta property="og:image" content="/blog/agentic-workloads-airflow-3/images/agentic-approval-dialog.png">
- <meta itemprop="name" content="Apache Airflow 2.10.0 is here">
- <meta itemprop="description" content="Apache Airflow 2.10.0 is a game-changer, with powerful Dataset improvements and the groundbreaking Hybrid Executor, set to redefine your workflow capabilities!">
- <meta itemprop="datePublished" content="2024-08-08T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
- <meta itemprop="wordCount" content="1040">
- <meta itemprop="image" content="/images/feature-image.png">
- <meta itemprop="keywords" content="Release">
+ <meta itemprop="name" content="Agentic Workloads on Airflow: Observable, Retryable, and Auditable by Design">
+ <meta itemprop="description" content="How Dynamic Task Mapping and the common.ai provider turn a multi-dimensional research question into a fan-out/fan-in pipeline where every LLM call is a named, logged, independently retryable task, not a hidden step inside a reasoning loop.">
+ <meta itemprop="datePublished" content="2026-04-15T00:00:00+00:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
+ <meta itemprop="wordCount" content="2691">
+ <meta itemprop="image" content="/blog/agentic-workloads-airflow-3/images/agentic-approval-dialog.png">
+ <meta itemprop="keywords" content="Community,Tutorial">
@@ -49,8 +50,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +59,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -68,7 +69,7 @@
crossorigin="anonymous"></script>
-<meta name="description" content="Apache Airflow 2.10.0 is a game-changer, with powerful Dataset improvements and the groundbreaking Hybrid Executor, set to redefine your workflow capabilities!" />
+<meta name="description" content="How Dynamic Task Mapping and the common.ai provider turn a multi-dimensional research question into a fan-out/fan-in pipeline where every LLM call is a named, logged, independently retryable task, not a hidden step inside a reasoning loop." />
<script>
@@ -89,8 +90,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +99,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +277,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +289,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +478,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -511,27 +488,33 @@
<div class="tags-container">
- <a class="tag" href="/blog/tags/release/">Release</a>
+ <a class="tag" href="/blog/tags/community/">Community</a>
+
+
+
+ <a class="tag" href="/blog/tags/tutorial/">Tutorial</a>
</div>
- <span class="bodytext__medium--brownish-grey">Thu, Aug 8, 2024</span>
+ <span class="blogpost-content__metadata--date">Wed, Apr 15, 2026</span>
</div>
- <p class="blogpost-content__metadata--title">Apache Airflow 2.10.0 is here</p>
+ <h1 class="blogpost-content__metadata--title">Agentic Workloads on Airflow: Observable, Retryable, and Auditable by Design</h1>
<div class="blogpost-content__metadata--author">
- <span class="blogpost-content__metadata--author-name">Utkarsh Sharma</span>
- <a href="https://github.com/utkarsharma2/" class="blogpost-content__metadata--social-media-icon">
- <svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
+
+ <span class="blogpost-content__metadata--author-name">Vikram Koka</span>
+
+ <a href="https://github.com/vikramkoka/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Vikram Koka">
+ <svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
- </a>
-
-
- <a href="https://linkedin.com/in/utkarsh-sharma-5791ab8a/" class="blogpost-content__metadata--social-media-icon">
- <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
+ </a>
+
+
+ <a href="https://linkedin.com/in/vikramkoka/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Vikram Koka">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
<g id="Group_698" data-name="Group 698" transform="translate(5.843 5.004)">
@@ -541,125 +524,336 @@
</g>
</svg>
- </a>
+ </a>
+
+ <br>
</div>
- <p class="blogpost-content__metadata--description">Apache Airflow 2.10.0 is a game-changer, with powerful Dataset improvements and the groundbreaking Hybrid Executor, set to redefine your workflow capabilities!</p>
+ <p class="blogpost-content__metadata--description">How Dynamic Task Mapping and the common.ai provider turn a multi-dimensional research question into a fan-out/fan-in pipeline where every LLM call is a named, logged, independently retryable task, not a hidden step inside a reasoning loop.</p>
</div>
<div class="markdown-content">
- <p>I’m happy to announce that Apache Airflow 2.10.0 is now available, bringing an array of noteworthy enhancements and new features that will greatly serve our community.</p>
-<p><strong>Details</strong>:</p>
-<p>📦 PyPI: <a href="https://pypi.org/project/apache-airflow/2.10.0/">https://pypi.org/project/apache-airflow/2.10.0/</a> <br>
-📚 Docs: <a href="https://airflow.apache.org/docs/apache-airflow/2.10.0/">https://airflow.apache.org/docs/apache-airflow/2.10.0/</a> <br>
-🛠 Release Notes: <a href="https://airflow.apache.org/docs/apache-airflow/2.10.0/release_notes.html">https://airflow.apache.org/docs/apache-airflow/2.10.0/release_notes.html</a> <br>
-🐳 Docker Image: “docker pull apache/airflow:2.10.0” <br>
-🚏 Constraints: <a href="https://github.com/apache/airflow/tree/constraints-2.10.0">https://github.com/apache/airflow/tree/constraints-2.10.0</a></p>
-<h2 id="airflow-now-collects-telemetry-data-by-default">Airflow now collects Telemetry data by default</h2>
-<p>With the release of Airflow 2.10.0, we’ve introduced the collection of basic telemetry data, as outlined <a href="https://airflow.apache.org/docs/apache-airflow/2.10.0/faq.html#does-airflow-collect-any-telemetry-data">here</a>. This data will play a crucial role in helping Airflow maintainers gain a deeper understanding of how Airflow is utilized across various deployments. The insights derived from this information are invaluable in guiding the prioritization of patches, minor releas [...]
-<p>For those who prefer not to participate in data collection, deployments can easily opt out by setting the <code>[usage_data_collection] enabled</code> option to <code>False</code> or by using the <code>SCARF_ANALYTICS=false</code> environment variable.</p>
-<h2 id="multiple-executor-configuration-formerly-hybrid-execution">Multiple Executor Configuration (formerly “Hybrid Execution”)</h2>
-<p>Each executor comes with its unique set of strengths and weaknesses, typically balancing latency, isolation, and compute efficiency. Traditionally, an Airflow environment is limited to a single executor, requiring users to make trade-offs, as no single executor is perfectly suited for all types of tasks.</p>
-<p>We are introducing a new feature that allows for the concurrent use of multiple executors within a single Airflow environment. This flexibility enables users to take advantage of the specific strengths of different executors for various tasks, improving overall efficiency and mitigating weaknesses. Users can set a default executor for the entire environment and, if necessary, assign particular executors to individual DAGs or tasks.</p>
-<p>To configure multiple executors we can pass comma separated list in airflow configuration. The first executor in the list will be the default executor for the environment.</p>
-
-<div class="chem">$$[core]
-executor = 'LocalExecutor,CeleryExecutor'$$</div><p>To make it easier for dag authors, we can also specify aliases for executors that can be specified in the executor configuration</p>
-<pre tabindex="0"><code class="language-commandline" data-lang="commandline">[core]
-executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:ShortName'
-</code></pre><p>DAG authors can specify executors to use at the task</p>
-<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">BashOperator</span><span class="p">(</span>
-</span></span><span class="line"><span class="cl"> <span class="n">task_id</span><span class="o">=</span><span class="s2">"hello_world"</span><span class="p">,</span>
-</span></span><span class="line"><span class="cl"> <span class="n">executor</span><span class="o">=</span><span class="s2">"ShortName"</span><span class="p">,</span>
-</span></span><span class="line"><span class="cl"> <span class="n">bash_command</span><span class="o">=</span><span class="s2">"echo 'hello world!'"</span><span class="p">,</span>
-</span></span><span class="line"><span class="cl"><span class="p">)</span>
-</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="nd">@task</span><span class="p">(</span><span class="n">executor</span><span class="o">=</span><span class="s2">"KubernetesExecutor"</span><span class="p">)</span>
-</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">hello_world</span><span class="p">():</span>
-</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="s2">"hello world!"</span><span class="p">)</span>
-</span></span></code></pre></div><p>We can also specify executors on the DAG level</p>
-<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">hello_world</span><span class="p">():</span>
-</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="s2">"hello world!"</span><span class="p">)</span>
-</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">hello_world_again</span><span class="p">():</span>
-</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="s2">"hello world again!"</span><span class="p">)</span>
+ <p>A question like “How does AI tool usage vary across Airflow versions?” has a natural SQL shape: one cross-tabulation, one result. A question like “What does a typical Airflow deployment look like for practitioners who are actively using AI in their workflow?” does not. It requires querying executor type, deployment method, cloud provider, and Airflow version independently, each filtered to the same respondent group, then synthesizing the results into a cohe [...]
+<p>This is where Airflow’s agentic pattern begins: not when you add an LLM to a workflow, but when the structure of the work itself depends on running multiple LLM calls whose outputs feed a synthesis step. This post builds that pattern using the <a href="https://airflow.apache.org/survey/">2025 Airflow Community Survey</a> data set and the <a href="https://airflow.apache.org/blog/common-ai-provider/"><code>apache-airflow-providers-common-ai</code></a> provider for Airflow 3.</p>
+<p>If you haven’t read the <a href="https://airflow.apache.org/blog/ai-survey-analysis-pipelines/">introductory survey analysis post</a> yet, start there for a walkthrough of the single-query interactive and scheduled pipelines. This post picks up where that one ends.</p>
+<h2 id="the-agentic-gap-in-the-single-query-pattern">The Agentic Gap in the Single-Query Pattern</h2>
+<p>The interactive and scheduled survey DAGs from the introductory post each do one thing: translate a natural language question into SQL, execute it against the CSV, and return the result. The LLM is involved once. The structure of the pipeline does not change based on what that LLM call returns.</p>
+<p>That is not a limitation to fix. It is the right design for that class of question. For a large fraction of production AI workflows, a single well-structured LLM call with good context is sufficient and preferable.</p>
+<p>The pattern becomes agentic when two things are true simultaneously:</p>
+<ol>
+<li>The question requires querying multiple independent dimensions</li>
+<li>The synthesis step, the thing that produces the final answer, depends on <em>all</em> of those results</li>
+</ol>
+<p>In an agent harness framework, this would be handled inside a reasoning loop: the LLM decides to call a tool, receives a result, calls another tool, accumulates context, and eventually produces a synthesis. Each tool call is invisible to any outside observer. If one tool call fails, the loop either retries internally or fails entirely.</p>
+<p>In Airflow, the same logic takes a different shape. Each sub-query becomes a named task. The fan-out is Dynamic Task Mapping. The synthesis is a named task with its inputs in XCom. Every step is observable, independently retryable, and logged.</p>
+<h2 id="the-dag-example_llm_survey_agentic">The DAG: <code>example_llm_survey_agentic</code></h2>
+<p>The full DAG is in
+<a href="https://github.com/apache/airflow/tree/main/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_llm_survey_agentic.py"><code>example_llm_survey_agentic.py</code></a>.</p>
+<p><strong>Question:</strong> <em>“What does a typical Airflow deployment look like for practitioners who actively use AI tools in their workflow?”</em></p>
+<p><strong>Task graph:</strong></p>
+
+<div class="chem">$$decompose_question → generate_sql (×4) → wrap_query (×4) → run_query (×4)
+ (@task) (LLMSQLQuery, (@task, (Analytics,
+ mapped) mapped) mapped)
+ ↓
+ collect_results
+ (@task)
+ ↓
+ synthesize_answer
+ (LLMOperator)
+ ↓
+ result_confirmation
+ (ApprovalOperator)$$</div><p>Seven tasks. Four of them run in parallel. Two LLM calls total: one for SQL generation (four instances), one for synthesis. One human review at the end.</p>
+<table>
+ <thead>
+ <tr>
+ <th>Step</th>
+ <th>Operator</th>
+ <th>What happens</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>1</td>
+ <td><code>@task decompose_question</code></td>
+ <td>Returns a list of four sub-questions, one per dimension.</td>
+ </tr>
+ <tr>
+ <td>2</td>
+ <td><code>LLMSQLQueryOperator</code> (mapped ×4)</td>
+ <td>Each sub-question becomes one SQL query, translated and validated in parallel.</td>
+ </tr>
+ <tr>
+ <td>3</td>
+ <td><code>@task wrap_query</code> (mapped ×4)</td>
+ <td>Wraps each SQL string into a single-element list for <code>AnalyticsOperator</code>.</td>
+ </tr>
+ <tr>
+ <td>4</td>
+ <td><code>AnalyticsOperator</code> (mapped ×4)</td>
+ <td>Apache DataFusion executes all four queries in parallel against the local CSV.</td>
+ </tr>
+ <tr>
+ <td>5</td>
+ <td><code>@task collect_results</code></td>
+ <td>Gathers the four JSON results and labels each by dimension.</td>
+ </tr>
+ <tr>
+ <td>6</td>
+ <td><code>LLMOperator</code></td>
+ <td>Reads all four labeled result sets and writes a narrative characterization.</td>
+ </tr>
+ <tr>
+ <td>7</td>
+ <td><code>ApprovalOperator</code></td>
+ <td>Human reviews the synthesized narrative before the DAG completes.</td>
+ </tr>
+ </tbody>
+</table>
+<h2 id="decomposing-the-question">Decomposing the Question</h2>
+<p><code>decompose_question</code> is a plain <code>@task</code> that returns the list of sub-questions. In this example, the list is static: the four dimensions are hardcoded as strings:</p>
+<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nd">@task</span>
+</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">decompose_question</span><span class="p">()</span> <span class="o">-></span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
+</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="p">[</span>
+</span></span><span class="line"><span class="cl"> <span class="s2">"""
+</span></span></span><span class="line"><span class="cl"><span class="s2">Among respondents who use AI/LLM tools to write Airflow code,
+</span></span></span><span class="line"><span class="cl"><span class="s2">what executor types (CeleryExecutor, KubernetesExecutor, LocalExecutor)
+</span></span></span><span class="line"><span class="cl"><span class="s2">are most commonly enabled? Count an executor as enabled only if the
+</span></span></span><span class="line"><span class="cl"><span class="s2">column value is clearly affirmative. Treat blank, NULL, and negative
+</span></span></span><span class="line"><span class="cl"><span class="s2">values as not enabled. Return the count per executor type."""</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="s2">"""
+</span></span></span><span class="line"><span class="cl"><span class="s2">Among respondents who use AI/LLM tools to write Airflow code,
+</span></span></span><span class="line"><span class="cl"><span class="s2">how do they deploy Airflow? Return the count per deployment method."""</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="s2">"""
+</span></span></span><span class="line"><span class="cl"><span class="s2">Among respondents who use AI/LLM tools to write Airflow code,
+</span></span></span><span class="line"><span class="cl"><span class="s2">which cloud providers are most commonly used for Airflow?
+</span></span></span><span class="line"><span class="cl"><span class="s2">Return the count per cloud provider."""</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="s2">"""
+</span></span></span><span class="line"><span class="cl"><span class="s2">Among respondents who use AI/LLM tools to write Airflow code,
+</span></span></span><span class="line"><span class="cl"><span class="s2">what version of Airflow are they currently running?
+</span></span></span><span class="line"><span class="cl"><span class="s2">Return the count per version."""</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="p">]</span>
</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="k">with</span> <span class="n">DAG</span><span class="p">(</span>
-</span></span><span class="line"><span class="cl"> <span class="n">dag_id</span><span class="o">=</span><span class="s2">"hello_worlds"</span><span class="p">,</span>
-</span></span><span class="line"><span class="cl"> <span class="n">default_args</span><span class="o">=</span><span class="p">{</span><span class="s2">"executor"</span><span class="p">:</span> <span class="s2">"ShortName"</span><span class="p">},</span> <span class="c1"># Applies to all tasks in the DAG</span>
-</span></span><span class="line"><span class="cl"><span class="p">)</span> <span class="k">as</span> <span class="n">dag</span><span class="p">:</span>
-</span></span><span class="line"><span class="cl"> <span class="c1"># All tasks will use the executor from default args automatically</span>
-</span></span><span class="line"><span class="cl"> <span class="n">hw</span> <span class="o">=</span> <span class="n">hello_world</span><span class="p">()</span>
-</span></span><span class="line"><span class="cl"> <span class="n">hw_again</span> <span class="o">=</span> <span class="n">hello_world_again</span><span class="p">()</span>
-</span></span></code></pre></div><h2 id="dynamic-dataset-scheduling-through-datasetalias">Dynamic Dataset scheduling through DatasetAlias</h2>
-<p>Airflow 2.10 comes with <code>DatasetAlias</code> class which can be passed as a value in the <code>outlets</code>, <code>inlets</code> on a task, and <code>schedule</code> on a DAG. An instance of <code>DatasetAlias</code> is resolved dynamically to a real dataset. Downstream can depend on either the resolved dataset or on an alias itself.</p>
-<p><code>DatasetAlias</code> has one argument <code>name</code> that uniquely identifies the dataset. The task must first declare the alias as an outlet, and use <code>outlet_events</code> or <code>yield Metadata</code> to add events to it.</p>
-<h3 id="emit-a-dataset-event-during-task-execution-through-outlet_events">Emit a dataset event during task execution through outlet_events</h3>
-<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">airflow.datasets</span> <span class="kn">import</span> <span class="n">DatasetAlias</span>
+</span></span><span class="line"><span class="cl"><span class="n">sub_questions</span> <span class="o">=</span> <span class="n">decompose_question</span><span class="p">()</span>
+</span></span></code></pre></div><p>The output of this task, a list of four strings, becomes the input to the <code>expand()</code> call on <code>LLMSQLQueryOperator</code> in the next step. Airflow creates one mapped task instance per list element.</p>
+<blockquote>
+<p><strong>Why keep this static?</strong> A dynamic version, where the LLM itself decomposes the high-level question into sub-questions at runtime, is possible and more agentic. It adds an LLM call before any SQL runs, which introduces latency and a failure point early in the graph. For a first example, static decomposition is clearer. The dynamic variant is a follow-on pattern.</p></blockquote>
+<h2 id="sql-generation-mapping-over-sub-questions">SQL Generation: Mapping Over Sub-Questions</h2>
+<p><code>LLMSQLQueryOperator.partial().expand()</code> creates one mapped task instance per sub-question. All four run in parallel, each translating one natural language question into validated SQL against the survey schema:</p>
+<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">generate_sql</span> <span class="o">=</span> <span class="n">LLMSQLQueryOperator</span><span class="o">.</span><span class="n">partial</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">task_id</span><span class="o">=</span><span class="s2">"generate_sql"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">llm_conn_id</span><span class="o">=</span><span class="n">LLM_CONN_ID</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">datasource_config</span><span class="o">=</span><span class="n">survey_datasource</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">schema_context</span><span class="o">=</span><span class="n">SURVEY_SCHEMA</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"><span class="p">)</span><span class="o">.</span><span class="n">expand</span><span class="p">(</span><span class="n">prompt</span><span class="o">=</span><span class="n">sub_questions</span><span class="p">)</span>
+</span></span></code></pre></div><p>In the Airflow UI, this renders as four task instances: <code>generate_sql[0]</code>, <code>generate_sql[1]</code>, <code>generate_sql[2]</code>, <code>generate_sql[3]</code>. Each has its own log, retry counter, and XCom entry. This is what an agent harness’s parallel tool calls look like when they are made explicit.</p>
+<p>Each instance returns a single SQL string. <code>LLMSQLQueryOperator</code> validates the output with sqlglot before returning it. Anything that is not a <code>SELECT</code> statement is rejected.</p>
+<h2 id="the-wrap_query-bridge">The <code>wrap_query</code> Bridge</h2>
+<p><code>AnalyticsOperator</code> expects <code>queries: list[str]</code>, a list because it can run multiple queries in one execution. <code>LLMSQLQueryOperator</code> returns a single <code>str</code>. A small <code>@task</code> bridges the interface:</p>
+<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nd">@task</span>
+</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">wrap_query</span><span class="p">(</span><span class="n">sql</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
+</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="p">[</span><span class="n">sql</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="nd">@task</span><span class="p">(</span><span class="n">outlets</span><span class="o">=</span><span class="p">[</span><span class="n">DatasetAlias</span><span class="p">(</span><span class="s2">"my-task-outputs"</span><span class="p">)])</span>
-</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">my_task_with_outlet_events</span><span class="p">(</span><span class="o">*</span><span class="p">,</span> <span class="n">outlet_events</span><span class="p">):</span>
-</span></span><span class="line"><span class="cl"> <span class="n">outlet_events</span><span class="p">[</span><span class="s2">"my-task-outputs"</span><span class="p">]</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Dataset</span><span class="p">(</span><span class="s2">"s3://bucket/my-task"</span><span class="p">))</span>
-</span></span></code></pre></div><h3 id="emit-a-dataset-event-during-task-execution-by-yielding-metadata">Emit a dataset event during task execution by yielding Metadata</h3>
-<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">airflow.datasets.metadata</span> <span class="kn">import</span> <span class="n">Metadata</span>
+</span></span><span class="line"><span class="cl"><span class="n">wrapped_queries</span> <span class="o">=</span> <span class="n">wrap_query</span><span class="o">.</span><span class="n">expand</span><span class="p">(</span><span class="n">sql</span><span class="o">=</span><span class="n">generate_sql</span><span class="o">.</span><span class="n">output</span><span class="p">)</span>
+</span></span></code></pre></div><p>This step is an implementation detail, not a conceptual one. Four mapped instances of <code>wrap_query</code> run in parallel, each converting one SQL string into a one-element list. The result is four <code>list[str]</code> values that <code>AnalyticsOperator</code> can consume directly.</p>
+<h2 id="parallel-execution-via-datafusion">Parallel Execution via DataFusion</h2>
+<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">run_query</span> <span class="o">=</span> <span class="n">AnalyticsOperator</span><span class="o">.</span><span class="n">partial</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">task_id</span><span class="o">=</span><span class="s2">"run_query"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">datasource_configs</span><span class="o">=</span><span class="p">[</span><span class="n">survey_datasource</span><span class="p">],</span>
+</span></span><span class="line"><span class="cl"> <span class="n">result_output_format</span><span class="o">=</span><span class="s2">"json"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"><span class="p">)</span><span class="o">.</span><span class="n">expand</span><span class="p">(</span><span class="n">queries</span><span class="o">=</span><span class="n">wrapped_queries</span><span class="p">)</span>
+</span></span></code></pre></div><p>Four mapped instances of <code>AnalyticsOperator</code> run in parallel. Each loads the survey CSV into an Apache DataFusion <code>SessionContext</code> in-process and executes its SQL against it. No database server, no shared state between instances.</p>
+<p>This is where independent retry earns its value. If the cloud provider query returns a DataFusion error due to a null value in that column, only <code>run_query[2]</code> fails. <code>run_query[0]</code>, <code>run_query[1]</code>, and <code>run_query[3]</code> have already succeeded and their results are in XCom. When <code>run_query[2]</code> is cleared and retried, the other three results are preserved.</p>
+<h2 id="collecting-and-labeling-results">Collecting and Labeling Results</h2>
+<p><code>collect_results</code> gathers all four outputs from <code>run_query</code> (Airflow passes the list of mapped outputs directly) and labels each one by dimension key:</p>
+<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># DIMENSION_KEYS = ["executor", "deployment", "cloud", "airflow_version"]</span>
+</span></span><span class="line"><span class="cl"><span class="c1"># Order must match the sub-questions returned by decompose_question.</span>
+</span></span><span class="line"><span class="cl"><span class="c1"># Airflow preserves mapped task output ordering by index, so this zip is safe.</span>
</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="nd">@task</span><span class="p">(</span><span class="n">outlets</span><span class="o">=</span><span class="p">[</span><span class="n">DatasetAlias</span><span class="p">(</span><span class="s2">"my-task-outputs"</span><span class="p">)])</span>
-</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">my_task_with_metadata</span><span class="p">():</span>
-</span></span><span class="line"><span class="cl"> <span class="n">s3_dataset</span> <span class="o">=</span> <span class="n">Dataset</span><span class="p">(</span><span class="s2">"s3://bucket/my-task}"</span><span class="p">)</span>
-</span></span><span class="line"><span class="cl"> <span class="k">yield</span> <span class="n">Metadata</span><span class="p">(</span><span class="n">s3_dataset</span><span class="p">,</span> <span class="n">alias</span><span class="o">=</span><span class="s2">"my-task-outputs"</span><span class="p">)</span>
-</span></span></code></pre></div><p>There are two options for scheduling based on dataset aliases. Schedule based on <code>DatasetAlias</code> or real datasets.</p>
-<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">with</span> <span class="n">DAG</span><span class="p">(</span><span class="n">dag_id</span><span class="o">=</span><span class="s2">"dataset-alias-producer"</span><span class="p">):</span>
-</span></span><span class="line"><span class="cl"> <span class="nd">@task</span><span class="p">(</span><span class="n">outlets</span><span class="o">=</span><span class="p">[</span><span class="n">DatasetAlias</span><span class="p">(</span><span class="s2">"example-alias"</span><span class="p">)])</span>
-</span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="nf">produce_dataset_events</span><span class="p">(</span><span class="o">*</span><span class="p">,</span> <span class="n">outlet_events</span><span class="p">):</span>
-</span></span><span class="line"><span class="cl"> <span class="n">outlet_events</span><span class="p">[</span><span class="s2">"example-alias"</span><span class="p">]</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Dataset</span><span class="p">(</span><span class="s2">"s3://bucket/my-task"</span><span class="p">))</span>
+</span></span><span class="line"><span class="cl"><span class="nd">@task</span>
+</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">collect_results</span><span class="p">(</span><span class="n">results</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-></span> <span class="nb">dict</span><span class="p">:</span>
+</span></span><span class="line"><span class="cl"> <span class="n">labeled</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">list</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">raw</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">DIMENSION_KEYS</span><span class="p">,</span> <span class="n">results</span><span class="p">):</span>
+</span></span><span class="line"><span class="cl"> <span class="n">items</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">raw</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl"> <span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="n">row</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">items</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">item</span><span class="p">[</span><span class="s2">"data"</span><span class="p">]]</span>
+</span></span><span class="line"><span class="cl"> <span class="n">labeled</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span>
+</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">labeled</span>
</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="k">with</span> <span class="n">DAG</span><span class="p">(</span><span class="n">dag_id</span><span class="o">=</span><span class="s2">"dataset-consumer"</span><span class="p">,</span> <span class="n">schedule</span><span class="o">=</span><span class="n">Dataset</span><span class="p">(</span><span class="s2">"s3://bucket/my-task"</span><span class="p">)):</span>
-</span></span><span class="line"><span class="cl"> <span class="o">...</span>
-</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="k">with</span> <span class="n">DAG</span><span class="p">(</span><span class="n">dag_id</span><span class="o">=</span><span class="s2">"dataset-alias-consumer"</span><span class="p">,</span> <span class="n">schedule</span><span class="o">=</span><span class="n">DatasetAlias</span><span class="p">(</span><span class="s2">"example-alias"</span><span class="p">)):</span>
-</span></span><span class="line"><span class="cl"> <span class="o">...</span>
-</span></span></code></pre></div><h3 id="dataset-aliases-ui-enhancements">Dataset Aliases UI Enhancements</h3>
-<p>Now users can see Dataset Aliases in legend of each cross-dag dependency graph with a corresponded icon/color.</p>
-<p><img src="/blog/airflow-2.10.0/dag_dependencies_legend.png" alt="DAG Dependencies graph"></p>
-<h2 id="dark-mode-for-airflow-ui">Dark Mode for Airflow UI</h2>
-<p>Airflow 2.10 comes with new Dark Mode feature which is designed to enhance user experience by offering an alternative visual theme that is easier on the eyes, especially in low-light conditions. You can toggle the crescent icon on the right side of the navigation bar to switch between light and dark mode.</p>
-<p><img src="/blog/airflow-2.10.0/airflow_dark_mode.png" alt="Airflow Dark mode"></p>
-<p><img src="/blog/airflow-2.10.0/airflow_light_mode.png" alt="Airflow Light mode"></p>
-<h2 id="task-instance-history">Task Instance History</h2>
-<p>In Apache Airflow 2.10.0, when a task instance is retried or cleared, its execution history is maintained. You can view this history by clicking on the task instance in the Grid view, allowing you to access information about each attempt, such as logs, execution durations, and any failures. This feature improves transparency into the task’s execution process, making it easier to troubleshoot and analyze your DAGs.</p>
-<p><img src="/blog/airflow-2.10.0/task_instance_history.png" alt="Task instance history"></p>
-<p>The history displays the final values of the task instance attributes for each specific run. On the log page, you can also access the logs for each attempt of the task instance. This information is valuable for debugging purposes.</p>
-<p><img src="/blog/airflow-2.10.0/task_instance_history_log.png" alt="Task instance history"></p>
-<h2 id="dataset-ui-enhancements">Dataset UI Enhancements</h2>
-<p>The dataset page has been revamped to include a focused dataset events section with additional details such as extras, consuming DAGs, and producing tasks.
-<img src="/blog/airflow-2.10.0/dataset_list.png" alt="Dataset list"></p>
-<p>We now have separate dependency graph and dataset list pages in new tabs, enhancing the user experience.</p>
-<p><img src="/blog/airflow-2.10.0/dependency_graph.png" alt="Dataset dependency graph"></p>
-<p>Dataset events are now displayed in both the Details tab of each DAG run and within the DAG graph.</p>
-<p><img src="/blog/airflow-2.10.0/dataset_details.png" alt="Dataset list"></p>
-<h3 id="toggle-datasets-in-graph">Toggle datasets in Graph</h3>
-<p>We can now toggle the datasets in the DAG graph</p>
-<p><img src="/blog/airflow-2.10.0/dataset_toggle_on.png" alt="Dataset toggle button on">
-<img src="/blog/airflow-2.10.0/dataset_toggle_off.png" alt="Dataset toggle button off"></p>
-<h3 id="dataset-conditions-in-dag-graph-view">Dataset Conditions in DAG Graph view</h3>
-<p>We now display the graph view with logical gates. Datasets with actual events are highlighted with a different border, making it easier to see what triggered the selected run.</p>
-<p><img src="/blog/airflow-2.10.0/render_dataset_conditions.png" alt="Render dataset conditions in graph view"></p>
-<h3 id="dataset-event-info-in-dag-graph">Dataset event info in DAG Graph</h3>
-<p>For a DAG run, users can now view the dataset events connected to it directly in the graph view.</p>
-<p><img src="/blog/airflow-2.10.0/dataset_info.png" alt="Dataset event info"></p>
-<h2 id="on-demand-dag-re-parsing">On-demand DAG Re-parsing</h2>
-<p>In 2.10 users can now reparse the DAGs on demand using below button on DAG list and DAG detail pages</p>
-<p><img src="/blog/airflow-2.10.0/DAG_reparsing_button_list.png" alt="DAG Reparsing button on DAG list page">
-<img src="/blog/airflow-2.10.0/DAG_reparse_button_detail.png" alt="DAG Reparsing button on DAG detail page"></p>
-<h2 id="additional-new-features">Additional new features</h2>
-<p>Here are just a few interesting new features since there are too many to list in full:</p>
-<ul>
-<li>Deferrable operators can now execute directly from the triggerer without needing to go through the worker. This is especially efficient for certain operators, like sensors, and can help teams save both time and money.</li>
-<li>Crucial executor logs are now integrated into the task logs. If the executor fails to start a task, the relevant error messages will be available in the task logs, simplifying the debugging process.</li>
-</ul>
-<h2 id="contributors">Contributors</h2>
-<p>Thanks to everyone who contributed to this release, including Andrey Anshin, Brent Bovenzi, Daniel Standish, Ephraim Anierobi, Hussein Awala, Jarek Potiuk, Jed Cunningham, Jens Scheffler, Tzu-ping Chung, Vincent, and over 63 others!</p>
-<p>I hope you enjoy using Apache Airflow 2.10.0!</p>
+</span></span><span class="line"><span class="cl"><span class="n">collected</span> <span class="o">=</span> <span class="n">collect_results</span><span class="p">(</span><span class="n">run_query</span><span class="o">.</span><span class="n">output</span><span class="p">)</span>
+</span></span></code></pre></div><p>The output is a dict like:</p>
+<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
+</span></span><span class="line"><span class="cl"> <span class="nt">"executor"</span><span class="p">:</span> <span class="p">[{</span><span class="nt">"KubernetesExecutor"</span><span class="p">:</span> <span class="s2">"Yes"</span><span class="p">,</span> <span class="nt">"count"</span><span class="p">:</span> <span class="mi">847</span><span class="p">},</span> <span class="err">...</span><span class="p">],</span>
+</span></span><span class="line"><span class="cl"> <span class="nt">"deployment"</span><span class="p">:</span> <span class="p">[{</span><span class="nt">"How do you deploy Airflow?"</span><span class="p">:</span> <span class="s2">"Managed Cloud Service"</span><span class="p">,</span> <span class="nt">"count"</span><span class="p">:</span> <span class="mi">1203</span><span class="p">},</span> <span class="err">...</span><span class="p">],</span>
+</span></span><span class="line"><span class="cl"> <span class="nt">"cloud"</span><span class="p">:</span> <span class="p">[{</span><span class="nt">"primary_cloud"</span><span class="p">:</span> <span class="s2">"AWS"</span><span class="p">,</span> <span class="nt">"count"</span><span class="p">:</span> <span class="mi">891</span><span class="p">},</span> <span class="err">...</span><span class="p">],</span>
+</span></span><span class="line"><span class="cl"> <span class="nt">"airflow_version"</span><span class="p">:</span> <span class="p">[{</span><span class="nt">"version"</span><span class="p">:</span> <span class="s2">"3.x"</span><span class="p">,</span> <span class="nt">"count"</span><span class="p">:</span> <span class="mi">412</span><span class="p">},</span> <span class="err">...</span><span class="p">]</span>
+</span></span><span class="line"><span class="cl"><span class="p">}</span>
+</span></span></code></pre></div><p>All four result sets in one XCom entry. This is the input to the synthesis step.</p>
+<h2 id="synthesis-the-second-llm-call">Synthesis: The Second LLM Call</h2>
+<p><code>LLMOperator</code> takes the collected results and produces a narrative. This is the synthesis step, the part of the pipeline that could not exist without all four sub-queries having completed first:</p>
+<p>The <code>generate_sql</code> step also receives a <code>system_prompt=SQL_SYSTEM_PROMPT</code> that instructs the LLM on quoting conventions, AI usage filter semantics, and how to handle blank/NULL/ambiguous values. That system prompt is defined once at the module level and shared across all four mapped instances.</p>
+<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">synthesize_answer</span> <span class="o">=</span> <span class="n">LLMOperator</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">task_id</span><span class="o">=</span><span class="s2">"synthesize_answer"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">llm_conn_id</span><span class="o">=</span><span class="n">LLM_CONN_ID</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">system_prompt</span><span class="o">=</span><span class="n">SYNTHESIS_SYSTEM_PROMPT</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">prompt</span><span class="o">=</span><span class="s2">"""
+</span></span></span><span class="line"><span class="cl"><span class="s2">Given these four independent survey query results about practitioners
+</span></span></span><span class="line"><span class="cl"><span class="s2">who use AI tools to write Airflow code, write a 2-3 sentence
+</span></span></span><span class="line"><span class="cl"><span class="s2">characterization of what a typical Airflow deployment looks like for
+</span></span></span><span class="line"><span class="cl"><span class="s2">this group.
+</span></span></span><span class="line"><span class="cl"><span class="s2">
+</span></span></span><span class="line"><span class="cl"><span class="s2">Results: {{ ti.xcom_pull(task_ids='collect_results') }}"""</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"><span class="p">)</span>
+</span></span><span class="line"><span class="cl"><span class="n">collected</span> <span class="o">>></span> <span class="n">synthesize_answer</span>
+</span></span></code></pre></div><p><code>prompt</code> is a template field, so <code>{{ ti.xcom_pull(task_ids='collect_results') }}</code> renders the full dict at execution time. <code>system_prompt</code> maps to the PydanticAI agent’s <code>instructions</code> parameter, so the framing instruction carries into every token the model generates.</p>
+<p>The output, a 2-3 sentence characterization, goes to XCom and then to the final approval step.</p>
+<blockquote>
+<p><strong>Inline HITL alternative:</strong> <code>LLMOperator</code> supports <code>require_approval=True</code> and <code>allow_modifications=True</code> as constructor parameters, via <code>LLMApprovalMixin</code>. Setting these eliminates the separate <code>ApprovalOperator</code> task and lets the reviewer edit the synthesized narrative directly before approving. Whether to use inline approval or a separate <code>ApprovalOperator</code> is a design choice; both produce the same resu [...]
+<h2 id="walking-through-a-run">Walking Through a Run</h2>
+<p><strong>Step 1: Decompose.</strong> Trigger the DAG. <code>decompose_question</code> completes in milliseconds and returns the four sub-question strings.</p>
+<p><strong>Steps 2–4: Fan-out.</strong> Twelve mapped task instances run: four <code>generate_sql</code>, four <code>wrap_query</code>, four <code>run_query</code>. In the Airflow UI, these appear as three rows of four parallel task instances. Each SQL generation call goes to the LLM; each DataFusion execution runs in-process against the CSV.</p>
+<figure><img src="/blog/agentic-workloads-airflow-3/images/agentic-generate-sql-logs.png"
+ alt="generate_sql[3] task logs showing the LLM-generated SQL query"><figcaption>
+ <p>Each mapped generate_sql instance has its own log showing the prompt, generated SQL, and sqlglot validation.</p>
+ </figcaption>
+</figure>
+
+<figure><img src="/blog/agentic-workloads-airflow-3/images/agentic-collect-results-xcom.png"
+ alt="collect_results XCom showing labeled dimension data"><figcaption>
+ <p>The collect_results task labels each sub-query result by dimension key. All four result sets are visible in XCom.</p>
+ </figcaption>
+</figure>
+
+<figure><img src="/blog/agentic-workloads-airflow-3/images/agentic-approval-dialog.png"
+ alt="ApprovalOperator showing the synthesized narrative"><figcaption>
+ <p>The final ApprovalOperator presents the LLM-synthesized narrative for human review.</p>
+ </figcaption>
+</figure>
+
+<p>A representative generated query for the executor dimension:</p>
+<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">CASE</span><span class="w"> </span><span class="k">WHEN</span><span class="w"> </span><span class="s2">"CeleryExecutor"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'Yes'</span><span class="w"> </span><span class="k">THEN</span><span class="w"> </span><span class="s1">'CeleryExecutor'</span><span class="w"> </span><s [...]
+</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">COUNT</span><span class="p">(</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="k">count</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w"> </span><span class="n">survey</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">WHERE</span><span class="w"> </span><span class="s2">"Are you using AI/LLM (ChatGPT/Cursor/Claude etc) to assist you in writing Airflow code?"</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="s1">'No, I don''t use AI to write Airflow code'</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">AND</span><span class="w"> </span><span class="s2">"CeleryExecutor"</span><span class="w"> </span><span class="k">IS</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">executor_type</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">UNION</span><span class="w"> </span><span class="k">ALL</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">SELECT</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">CASE</span><span class="w"> </span><span class="k">WHEN</span><span class="w"> </span><span class="s2">"KubernetesExecutor"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'Yes'</span><span class="w"> </span><span class="k">THEN</span><span class="w"> </span><span class="s1">'KubernetesExecutor'</span><span class="w"> < [...]
+</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">COUNT</span><span class="p">(</span><span class="o">*</span><span class="p">)</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w"> </span><span class="n">survey</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">WHERE</span><span class="w"> </span><span class="s2">"Are you using AI/LLM (ChatGPT/Cursor/Claude etc) to assist you in writing Airflow code?"</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="s1">'No, I don''t use AI to write Airflow code'</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">AND</span><span class="w"> </span><span class="s2">"KubernetesExecutor"</span><span class="w"> </span><span class="k">IS</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="mi">1</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">-- ... and so on
+</span></span></span></code></pre></div><p><strong>Step 5: Collect.</strong> <code>collect_results</code> assembles the four result sets into a labeled dict.</p>
+<p><strong>Step 6: Synthesize.</strong> <code>LLMOperator</code> calls the LLM once with all four result sets as context. A representative output:</p>
+<blockquote>
+<p>“Among practitioners who actively use AI tools to write Airflow code, the majority (61%) deploy on a managed cloud service or cloud-native setup, with AWS as the primary cloud provider (38%). KubernetesExecutor is the dominant choice (54%), and this group is adopting Airflow 3.x at a notably higher rate than the survey population as a whole (29% vs. 21% overall).”</p></blockquote>
+<p><strong>Step 7: Review.</strong> The <code>ApprovalOperator</code> presents the narrative in the Airflow UI. Approve to complete the DAG; reject to fail it and trigger a retry from the synthesis step if desired.</p>
+<h2 id="what-the-dag-topology-makes-explicit">What the DAG Topology Makes Explicit</h2>
+<p>The core difference between this pattern and the equivalent agent harness implementation is not the output. It is what is auditable after the run.</p>
+<table>
+ <thead>
+ <tr>
+ <th>What’s happening</th>
+ <th>In an agent harness</th>
+ <th>In this DAG</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>Sub-query: executor distribution</td>
+ <td>LLM internal tool call, no external artifact</td>
+ <td>Task <code>generate_sql[0]</code>: SQL in XCom, full log</td>
+ </tr>
+ <tr>
+ <td>Sub-query: cloud provider</td>
+ <td>LLM internal tool call</td>
+ <td>Task <code>generate_sql[2]</code>: SQL in XCom, full log</td>
+ </tr>
+ <tr>
+ <td>Parallel execution</td>
+ <td>Concurrent or sequential, implementation-dependent</td>
+ <td>Explicit mapped instances, each on its own worker</td>
+ </tr>
+ <tr>
+ <td>cloud_provider query fails</td>
+ <td>Entire run restarts from the top, or fails</td>
+ <td>Only <code>run_query[2]</code> retries; other three results preserved</td>
+ </tr>
+ <tr>
+ <td>Synthesis inputs</td>
+ <td>Accumulated context in the LLM’s reasoning loop</td>
+ <td><code>collect_results</code> XCom entry: the exact dict the LLM received</td>
+ </tr>
+ <tr>
+ <td>Why did it characterize it that way?</td>
+ <td>No artifact</td>
+ <td><code>synthesize_answer</code> XCom: input dict and output string both stored</td>
+ </tr>
+ </tbody>
+</table>
+<p>Each <code>generate_sql[i]</code> task log contains the prompt the LLM received, the SQL it returned, and the validation result from sqlglot. Each <code>run_query[i]</code> log contains the DataFusion execution details and the row count returned. The synthesis step’s XCom entry contains the exact dict that was passed as context.</p>
+<p>This is the same information an agent harness has internally. The difference is that Airflow surfaces it as first-class task artifacts, accessible from the Airflow UI without instrumenting or patching the reasoning loop.</p>
+<h2 id="connecting-your-llm">Connecting Your LLM</h2>
+<p>Both <code>LLMSQLQueryOperator</code> and <code>LLMOperator</code> use <code>llm_conn_id="pydanticai_default"</code>. The same connection table from the introductory post applies:</p>
+<table>
+ <thead>
+ <tr>
+ <th>Provider</th>
+ <th>Connection type</th>
+ <th>Required fields</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>OpenAI</td>
+ <td><code>pydanticai</code></td>
+ <td>Password: API key. Extra: <code>{"model": "openai:gpt-4o"}</code></td>
+ </tr>
+ <tr>
+ <td>Anthropic</td>
+ <td><code>pydanticai</code></td>
+ <td>Password: API key. Extra: <code>{"model": "anthropic:claude-haiku-4-5-20251001"}</code></td>
+ </tr>
+ <tr>
+ <td>Google Vertex</td>
+ <td><code>pydanticai-vertex</code></td>
+ <td>Extra: <code>{"model": "google-vertex:gemini-2.0-flash", "project": "...", "vertexai": true}</code></td>
+ </tr>
+ <tr>
+ <td>AWS Bedrock</td>
+ <td><code>pydanticai-bedrock</code></td>
+ <td>Extra: <code>{"model": "bedrock:us.anthropic.claude-opus-4-5", "region_name": "us-east-1"}</code></td>
+ </tr>
+ </tbody>
+</table>
+<p>One connection serves both operators. The synthesis step and the SQL generation steps can use different connections if you want a stronger model for synthesis and a faster one for the SQL generation pass. Set <code>model_id</code> on the <code>LLMOperator</code> to override the connection’s default.</p>
+<h2 id="the-multi-agent-pattern-hidden-in-plain-sight">The Multi-Agent Pattern Hidden in Plain Sight</h2>
+<p>This DAG was not designed around multi-agent frameworks, but it accidentally implements one of the most common separation-of-concerns patterns in that space: the <strong>SQL Architect / Critic / Narrator</strong> triad.</p>
+<p>In agent harness frameworks, these three roles are typically implemented as distinct agent instances that coordinate through an internal routing layer. The underlying rationale is that mixing generation, evaluation, and communication into a single agent produces outputs that are mediocre at all three jobs. Separating them forces each role to reason only about what it is responsible for.</p>
+<p>The survey DAG lands in the same place through a different path: the task boundary enforces the separation.</p>
+<p><strong>SQL Architect → <code>generate_sql[0..3]</code> (<code>LLMSQLQueryOperator</code>).</strong>
+Each mapped instance receives one natural language sub-question and produces one SQL query. Schema context is passed as a system-level framing, not as part of the user prompt, so the model reasons about structure before generating syntax. The Architect role is strict: produce a valid <code>SELECT</code> statement or fail.</p>
+<p><strong>Critic → two layers.</strong>
+The first layer is embedded in <code>LLMSQLQueryOperator</code>: sqlglot parses and validates the generated SQL before the task returns. This is a syntax-level Critic: it rejects anything that is not a <code>SELECT</code>. The second and fuller layer is the <code>LLMBranchOperator</code> pattern: an explicit task that evaluates result quality and decides whether the finding is reportable, needs a drill-down, or warrants a pivot to a different hypothesis. That task does what the Critic do [...]
+<p><strong>Narrator → <code>synthesize_answer</code> (<code>LLMOperator</code>).</strong>
+Receives the labeled result sets from all four dimensions and produces a plain-language characterization. The Narrator’s role is bounded by design: it receives structured data rows, not the intermediate SQL or any reasoning artifacts, and its system prompt constrains it to communication: “focus on patterns and proportions rather than raw counts.” The role separation is enforced by what is in XCom, not by agent routing logic.</p>
+<p>One genuine structural difference remains. In a multi-agent system, the Critic can loop back to the Architect with feedback (“this query has a NULL handling problem, try again”) and the cycle runs until the output meets a quality bar. Airflow DAGs are acyclic. The Critic either raises an exception and triggers a task-level retry of the Architect instance (automatic but blunt), or routes to an alternative path via <code>LLMBranchOperator</code> (explicit and auditable, but [...]
+<p>That acyclicity is a deliberate tradeoff: it is also what makes the DAG’s execution fully auditable and its failure modes predictable. The feedback loop pattern, and the open question of how far it can be supported within a structured workflow model, is part of what Airflow’s roadmap is actively working through.</p>
+<hr>
+<h2 id="try-it">Try It</h2>
+<p>The DAG is in the <code>common.ai</code> provider example DAGs:
+<a href="https://github.com/apache/airflow/tree/main/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_llm_survey_agentic.py"><code>example_llm_survey_agentic.py</code></a>.</p>
+<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pip install <span class="s1">'apache-airflow-providers-common-ai'</span> <span class="se">\
+</span></span></span><span class="line"><span class="cl"><span class="se"></span> <span class="s1">'apache-airflow-providers-common-sql[datafusion]'</span>
+</span></span></code></pre></div><p>Requires Apache Airflow 3.0+.</p>
+<p>Set <code>SURVEY_CSV_PATH</code> to your local cleaned copy of the survey CSV, create a <code>pydanticai_default</code> connection, and trigger <code>example_llm_survey_agentic</code>.</p>
+<p>The Airflow UI will show the four parallel <code>generate_sql</code> and <code>run_query</code> instances fanning out and converging to <code>collect_results</code>. That visual is the clearest way to see what distinguishes the agentic pattern from a single-query run.</p>
+<p>Questions, results, and sub-questions that surprised the LLM are welcome on <a href="https://s.apache.org/airflow-slack">Airflow Slack</a> in <code>#airflow-ai</code>.</p>
</div>
@@ -701,10 +895,10 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
<div class="no-width-restriction no-desktop">
<ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5">
<li>
- <a href="/blog/airflow-2.9.0/" aria-label="Previous - Apache Airflow 2.9.0: Dataset and UI Improvements" class="btn btn-primary"><span class="me-1">←</span>Previous</a>
+ <a href="/blog/ai-survey-analysis-pipelines/" aria-label="Previous - Ask Your Survey Anything: Building AI Analysis Pipelines with Airflow 3" class="btn btn-primary"><span class="me-1">←</span>Previous</a>
</li>
<li>
- <a href="/blog/airflow-survey-2024/" aria-label="Next - Airflow Survey 2024" class="btn btn-primary">Next<span class="ms-1">→</span></a>
+ <a class="btn btn-primary disabled">Next<span class="ms-1">→</span></a>
</li>
</ul>
@@ -730,28 +924,35 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
<div class="tags-container">
- <a class="tag" href="/blog/tags/release/">Release</a>
+ <a class="tag" href="/blog/tags/community/">Community</a>
+
+
+
+ <a class="tag" href="/blog/tags/tutorial/">Tutorial</a>
</div>
- <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Thu, Sep 25, 2025</span>
+ <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Wed, Apr 15, 2026</span>
</div>
<p class="box-event__blogpost--header">
- <a href="/blog/airflow-3.1.0/">
- Apache Airflow 3.1.0: Human-Centered Workflows
+ <a href="/blog/ai-survey-analysis-pipelines/">
+ Ask Your Survey Anything: Building AI Analysis Pipelines with Airflow 3
</a>
</p>
- <p class="box-event__blogpost--author">Kaxil Naik</p>
+ <p class="box-event__blogpost--author">
+
+
+
+ <a href="https://linkedin.com/in/vikramkoka" target="_blank" rel="noopener">Vikram Koka</a>
+
+
+
+ </p>
- <p class="box-event__blogpost--description">Apache Airflow 3.1.0 introduces Human-in-the-Loop workflows, 17-language internationalization, deadline alerts, and React plugin system for data orchestration teams.</p>
+ <p class="box-event__blogpost--description">A walkthrough of two natural language analysis pipelines over the 2025 Airflow Community Survey, covering an interactive human-in-the-loop version and a fully automated scheduled version, using operators from the common.ai and common.sql providers.</p>
<div class="mt-auto">
- <a href="/blog/airflow-3.1.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/ai-survey-analysis-pipelines/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -767,15 +968,19 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
<div class="tags-container">
+ <a class="tag" href="/blog/tags/community/">Community</a>
+
+
+
<a class="tag" href="/blog/tags/release/">Release</a>
</div>
- <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Tue, Apr 22, 2025</span>
+ <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Tue, Apr 14, 2026</span>
</div>
<p class="box-event__blogpost--header">
- <a href="/blog/airflow-three-point-oh-is-here/">
- Apache Airflow® 3 is Generally Available!
+ <a href="/blog/common-ai-provider/">
+ Introducing the Common AI Provider: LLM and AI Agent Support for Apache Airflow
</a>
</p>
@@ -788,20 +993,15 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
,
- <a href="https://linkedin.com/in/vikramkoka" target="_blank" rel="noopener">Vikram Koka</a>
+ <a href="https://linkedin.com/in/pavan-kumar-gopidesu" target="_blank" rel="noopener">Pavan Kumar Gopidesu</a>
</p>
- <p class="box-event__blogpost--description">We're proud to announce that Apache Airflow 3.0.0 has been released.</p>
+ <p class="box-event__blogpost--description">The Common AI Provider adds LLM and AI agent operators to Apache Airflow with 6 operators, 5 toolsets, and 20+ model providers in one package.</p>
<div class="mt-auto">
- <a href="/blog/airflow-three-point-oh-is-here/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/common-ai-provider/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -821,8 +1021,8 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -833,7 +1033,7 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
- <a href=https://github.com/apache/airflow-site/edit/main/landing-pages/site/content/en//blog/airflow-2.10.0>
+ <a href=https://github.com/apache/airflow-site/edit/main/landing-pages/site/content/en//blog/agentic-workloads-airflow-3>
@@ -897,14 +1097,14 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -928,7 +1128,7 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -938,7 +1138,7 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -1027,13 +1227,13 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
<script defer src="/js/auto-render.min.js" integrity="sha512-0HzJcHCD+wBh9kNUUcm3DWH9IbNDfudsYyMD5EHwSuFK6aEsaa/UEPqqk4t0pm4bbmwR6A11yNsD7Q+nz6XF+Q==" crossorigin="anonymous"
onload='renderMathInElement(document.body, null);'>
</script>
- <script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+ <script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-2.10.0/index.html b/blog/ai-survey-analysis-pipelines/index.html
similarity index 55%
copy from blog/airflow-2.10.0/index.html
copy to blog/ai-survey-analysis-pipelines/index.html
index 253870f51a..e85d3afd37 100644
--- a/blog/airflow-2.10.0/index.html
+++ b/blog/ai-survey-analysis-pipelines/index.html
@@ -23,25 +23,26 @@
<link rel="icon" type="image/png" href="/favicons/android-144x144.png" sizes="144x144">
<link rel="icon" type="image/png" href="/favicons/android-192x192.png" sizes="192x192">
-<title>Apache Airflow 2.10.0 is here | Apache Airflow</title><meta property="og:url" content="/blog/airflow-2.10.0/">
+<title>Ask Your Survey Anything: Building AI Analysis Pipelines with Airflow 3 | Apache Airflow</title><meta property="og:url" content="/blog/ai-survey-analysis-pipelines/">
<meta property="og:site_name" content="Apache Airflow">
- <meta property="og:title" content="Apache Airflow 2.10.0 is here">
- <meta property="og:description" content="Apache Airflow 2.10.0 is a game-changer, with powerful Dataset improvements and the groundbreaking Hybrid Executor, set to redefine your workflow capabilities!">
+ <meta property="og:title" content="Ask Your Survey Anything: Building AI Analysis Pipelines with Airflow 3">
+ <meta property="og:description" content="A walkthrough of two natural language analysis pipelines over the 2025 Airflow Community Survey, covering an interactive human-in-the-loop version and a fully automated scheduled version, using operators from the common.ai and common.sql providers.">
<meta property="og:locale" content="en">
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
- <meta property="article:published_time" content="2024-08-08T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
- <meta property="article:tag" content="Release">
+ <meta property="article:published_time" content="2026-04-15T00:00:00+00:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
+ <meta property="article:tag" content="Community">
+ <meta property="article:tag" content="Tutorial">
<meta property="og:image" content="/images/feature-image.png">
- <meta itemprop="name" content="Apache Airflow 2.10.0 is here">
- <meta itemprop="description" content="Apache Airflow 2.10.0 is a game-changer, with powerful Dataset improvements and the groundbreaking Hybrid Executor, set to redefine your workflow capabilities!">
- <meta itemprop="datePublished" content="2024-08-08T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
- <meta itemprop="wordCount" content="1040">
+ <meta itemprop="name" content="Ask Your Survey Anything: Building AI Analysis Pipelines with Airflow 3">
+ <meta itemprop="description" content="A walkthrough of two natural language analysis pipelines over the 2025 Airflow Community Survey, covering an interactive human-in-the-loop version and a fully automated scheduled version, using operators from the common.ai and common.sql providers.">
+ <meta itemprop="datePublished" content="2026-04-15T00:00:00+00:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
+ <meta itemprop="wordCount" content="1636">
<meta itemprop="image" content="/images/feature-image.png">
- <meta itemprop="keywords" content="Release">
+ <meta itemprop="keywords" content="Community,Tutorial">
@@ -49,8 +50,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +59,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -68,7 +69,7 @@
crossorigin="anonymous"></script>
-<meta name="description" content="Apache Airflow 2.10.0 is a game-changer, with powerful Dataset improvements and the groundbreaking Hybrid Executor, set to redefine your workflow capabilities!" />
+<meta name="description" content="A walkthrough of two natural language analysis pipelines over the 2025 Airflow Community Survey, covering an interactive human-in-the-loop version and a fully automated scheduled version, using operators from the common.ai and common.sql providers." />
<script>
@@ -89,8 +90,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +99,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +277,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +289,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +478,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -511,27 +488,33 @@
<div class="tags-container">
- <a class="tag" href="/blog/tags/release/">Release</a>
+ <a class="tag" href="/blog/tags/community/">Community</a>
+
+
+
+ <a class="tag" href="/blog/tags/tutorial/">Tutorial</a>
</div>
- <span class="bodytext__medium--brownish-grey">Thu, Aug 8, 2024</span>
+ <span class="blogpost-content__metadata--date">Wed, Apr 15, 2026</span>
</div>
- <p class="blogpost-content__metadata--title">Apache Airflow 2.10.0 is here</p>
+ <h1 class="blogpost-content__metadata--title">Ask Your Survey Anything: Building AI Analysis Pipelines with Airflow 3</h1>
<div class="blogpost-content__metadata--author">
- <span class="blogpost-content__metadata--author-name">Utkarsh Sharma</span>
- <a href="https://github.com/utkarsharma2/" class="blogpost-content__metadata--social-media-icon">
- <svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
+
+ <span class="blogpost-content__metadata--author-name">Vikram Koka</span>
+
+ <a href="https://github.com/vikramkoka/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Vikram Koka">
+ <svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
- </a>
-
-
- <a href="https://linkedin.com/in/utkarsh-sharma-5791ab8a/" class="blogpost-content__metadata--social-media-icon">
- <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
+ </a>
+
+
+ <a href="https://linkedin.com/in/vikramkoka/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Vikram Koka">
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
<g id="Group_698" data-name="Group 698" transform="translate(5.843 5.004)">
@@ -541,125 +524,368 @@
</g>
</svg>
- </a>
+ </a>
+
+ <br>
</div>
- <p class="blogpost-content__metadata--description">Apache Airflow 2.10.0 is a game-changer, with powerful Dataset improvements and the groundbreaking Hybrid Executor, set to redefine your workflow capabilities!</p>
+ <p class="blogpost-content__metadata--description">A walkthrough of two natural language analysis pipelines over the 2025 Airflow Community Survey, covering an interactive human-in-the-loop version and a fully automated scheduled version, using operators from the common.ai and common.sql providers.</p>
</div>
<div class="markdown-content">
- <p>I’m happy to announce that Apache Airflow 2.10.0 is now available, bringing an array of noteworthy enhancements and new features that will greatly serve our community.</p>
-<p><strong>Details</strong>:</p>
-<p>📦 PyPI: <a href="https://pypi.org/project/apache-airflow/2.10.0/">https://pypi.org/project/apache-airflow/2.10.0/</a> <br>
-📚 Docs: <a href="https://airflow.apache.org/docs/apache-airflow/2.10.0/">https://airflow.apache.org/docs/apache-airflow/2.10.0/</a> <br>
-🛠 Release Notes: <a href="https://airflow.apache.org/docs/apache-airflow/2.10.0/release_notes.html">https://airflow.apache.org/docs/apache-airflow/2.10.0/release_notes.html</a> <br>
-🐳 Docker Image: “docker pull apache/airflow:2.10.0” <br>
-🚏 Constraints: <a href="https://github.com/apache/airflow/tree/constraints-2.10.0">https://github.com/apache/airflow/tree/constraints-2.10.0</a></p>
-<h2 id="airflow-now-collects-telemetry-data-by-default">Airflow now collects Telemetry data by default</h2>
-<p>With the release of Airflow 2.10.0, we’ve introduced the collection of basic telemetry data, as outlined <a href="https://airflow.apache.org/docs/apache-airflow/2.10.0/faq.html#does-airflow-collect-any-telemetry-data">here</a>. This data will play a crucial role in helping Airflow maintainers gain a deeper understanding of how Airflow is utilized across various deployments. The insights derived from this information are invaluable in guiding the prioritization of patches, minor releas [...]
-<p>For those who prefer not to participate in data collection, deployments can easily opt out by setting the <code>[usage_data_collection] enabled</code> option to <code>False</code> or by using the <code>SCARF_ANALYTICS=false</code> environment variable.</p>
-<h2 id="multiple-executor-configuration-formerly-hybrid-execution">Multiple Executor Configuration (formerly “Hybrid Execution”)</h2>
-<p>Each executor comes with its unique set of strengths and weaknesses, typically balancing latency, isolation, and compute efficiency. Traditionally, an Airflow environment is limited to a single executor, requiring users to make trade-offs, as no single executor is perfectly suited for all types of tasks.</p>
-<p>We are introducing a new feature that allows for the concurrent use of multiple executors within a single Airflow environment. This flexibility enables users to take advantage of the specific strengths of different executors for various tasks, improving overall efficiency and mitigating weaknesses. Users can set a default executor for the entire environment and, if necessary, assign particular executors to individual DAGs or tasks.</p>
-<p>To configure multiple executors we can pass comma separated list in airflow configuration. The first executor in the list will be the default executor for the environment.</p>
-
-<div class="chem">$$[core]
-executor = 'LocalExecutor,CeleryExecutor'$$</div><p>To make it easier for dag authors, we can also specify aliases for executors that can be specified in the executor configuration</p>
-<pre tabindex="0"><code class="language-commandline" data-lang="commandline">[core]
-executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:ShortName'
-</code></pre><p>DAG authors can specify executors to use at the task</p>
-<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">BashOperator</span><span class="p">(</span>
-</span></span><span class="line"><span class="cl"> <span class="n">task_id</span><span class="o">=</span><span class="s2">"hello_world"</span><span class="p">,</span>
-</span></span><span class="line"><span class="cl"> <span class="n">executor</span><span class="o">=</span><span class="s2">"ShortName"</span><span class="p">,</span>
-</span></span><span class="line"><span class="cl"> <span class="n">bash_command</span><span class="o">=</span><span class="s2">"echo 'hello world!'"</span><span class="p">,</span>
-</span></span><span class="line"><span class="cl"><span class="p">)</span>
+ <p>The <a href="https://airflow.apache.org/survey/">2025 Airflow Community Survey</a> collected responses
+from nearly 6,000 practitioners across 168 questions. You can open a spreadsheet and filter,
+or write SQL by hand. But what if you could just ask a question and have Airflow figure out
+the query, run it, and bring the result back for your approval?</p>
+<p>This post builds two pipelines that do exactly that, using the
+<a href="https://pypi.org/project/apache-airflow-providers-common-ai/"><code>apache-airflow-providers-common-ai</code></a>
+provider for Airflow 3.</p>
+<p>The first pipeline is <strong>interactive</strong>: a human reviews the question before it reaches the LLM
+and approves the result before the DAG finishes. The second is <strong>scheduled</strong>: it downloads
+fresh survey data, validates the schema, runs the query unattended, and emails the result.</p>
+<p>If you haven’t seen the <a href="https://airflow.apache.org/blog/common-ai-provider/">common.ai provider overview</a> yet, start there for a tour of all the
+operators. This post goes deep on a concrete end-to-end example.</p>
+<h2 id="two-pipelines-one-example-file">Two Pipelines, One Example File</h2>
+<p>Both DAGs live in
+<a href="https://github.com/apache/airflow/tree/main/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_llm_survey_analysis.py"><code>example_llm_survey_analysis.py</code></a>
+and share the same schema context and datasource configuration.</p>
+<p><strong><code>example_llm_survey_interactive</code></strong>: trigger manually, review at both ends:</p>
+
+<div class="chem">$$prompt_confirmation → generate_sql → run_query → extract_data → result_confirmation
+(HITLEntryOperator) (LLMSQLQuery) (Analytics) (@task) (ApprovalOperator)$$</div><p><strong><code>example_llm_survey_scheduled</code></strong>: runs <code>@monthly</code>, no human in the loop:</p>
+
+<div class="chem">$$download_survey → prepare_csv → check_schema → generate_sql → run_query → extract_data → send_result
+(HttpOperator) (@task) (LLMSchema (LLMSQLQuery) (Analytics) (@task) (@task / Email)
+ Compare)$$</div><h2 id="the-data">The Data</h2>
+<p>The <a href="https://airflow.apache.org/survey/">Airflow Community Survey 2025</a> CSV has 5,856 rows
+and 168 columns covering everything from Airflow version and executor type to cloud provider,
+company size, and AI tool usage. A few highlights from the data:</p>
+<ul>
+<li><strong>3,320</strong> respondents identify as Data Engineers</li>
+<li><strong>2,032</strong> use AWS as their primary cloud provider for Airflow</li>
+<li><strong>1,445</strong> are already running Airflow 3</li>
+<li><strong>1,351</strong> say they <em>often</em> use AI tools to write Airflow code</li>
+</ul>
+<p>Those last two numbers together are part of why this example exists: the people most likely
+to use this pipeline are already using Airflow 3 and already using AI in their workflow.</p>
+<blockquote>
+<p><strong>Data prep note:</strong> Apache DataFusion is strict about CSV schemas. The raw survey export
+has 22 duplicate <code>"Other"</code> column names and some free-text cells with embedded newlines.
+Both need cleaning before DataFusion will parse the file. The interactive DAG assumes a
+cleaned copy at the path set by the <code>SURVEY_CSV_PATH</code> environment variable. The scheduled
+DAG downloads the file at runtime and the <code>prepare_csv</code> step handles writing it to disk.</p></blockquote>
+<h2 id="the-interactive-pipeline">The Interactive Pipeline</h2>
+<p>Five tasks. No external services beyond your LLM provider and a local copy of the CSV.</p>
+<table>
+ <thead>
+ <tr>
+ <th>Step</th>
+ <th>Operator</th>
+ <th>What happens</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>1</td>
+ <td><code>HITLEntryOperator</code></td>
+ <td>DAG pauses. Human reviews and optionally edits the question.</td>
+ </tr>
+ <tr>
+ <td>2</td>
+ <td><code>LLMSQLQueryOperator</code></td>
+ <td>LLM translates the confirmed question into SQL, validated by sqlglot.</td>
+ </tr>
+ <tr>
+ <td>3</td>
+ <td><code>AnalyticsOperator</code></td>
+ <td>Apache DataFusion executes the SQL against the local CSV.</td>
+ </tr>
+ <tr>
+ <td>4</td>
+ <td><code>@task extract_data</code></td>
+ <td>Strips the query from the JSON result so the reviewer sees only data rows.</td>
+ </tr>
+ <tr>
+ <td>5</td>
+ <td><code>ApprovalOperator</code></td>
+ <td>DAG pauses again. Human approves or rejects the result.</td>
+ </tr>
+ </tbody>
+</table>
+<p>The LLM and DataFusion steps run unattended. The human shows up at step 1 to confirm the
+question and at step 5 to sign off on the answer. Everything in between is automated.</p>
+<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nd">@dag</span>
+</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">example_llm_survey_interactive</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="nd">@task</span><span class="p">(</span><span class="n">executor</span><span class="o">=</span><span class="s2">"KubernetesExecutor"</span><span class="p">)</span>
-</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">hello_world</span><span class="p">():</span>
-</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="s2">"hello world!"</span><span class="p">)</span>
-</span></span></code></pre></div><p>We can also specify executors on the DAG level</p>
-<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">hello_world</span><span class="p">():</span>
-</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="s2">"hello world!"</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl"> <span class="n">prompt_confirmation</span> <span class="o">=</span> <span class="n">HITLEntryOperator</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">task_id</span><span class="o">=</span><span class="s2">"prompt_confirmation"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">subject</span><span class="o">=</span><span class="s2">"Review the survey analysis question"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">params</span><span class="o">=</span><span class="p">{</span>
+</span></span><span class="line"><span class="cl"> <span class="s2">"prompt"</span><span class="p">:</span> <span class="n">Param</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="s2">"How does AI tool usage for writing Airflow code compare "</span>
+</span></span><span class="line"><span class="cl"> <span class="s2">"between Airflow 3 users and Airflow 2 users?"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="nb">type</span><span class="o">=</span><span class="s2">"string"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">description</span><span class="o">=</span><span class="s2">"The natural language question to answer via SQL"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="p">)</span>
+</span></span><span class="line"><span class="cl"> <span class="p">},</span>
+</span></span><span class="line"><span class="cl"> <span class="n">response_timeout</span><span class="o">=</span><span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="mi">1</span><span class="p">),</span>
+</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">hello_world_again</span><span class="p">():</span>
-</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="s2">"hello world again!"</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl"> <span class="n">generate_sql</span> <span class="o">=</span> <span class="n">LLMSQLQueryOperator</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">task_id</span><span class="o">=</span><span class="s2">"generate_sql"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">prompt</span><span class="o">=</span><span class="s2">"{{ ti.xcom_pull(task_ids='prompt_confirmation')['params_input']['prompt'] }}"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">llm_conn_id</span><span class="o">=</span><span class="n">LLM_CONN_ID</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">datasource_config</span><span class="o">=</span><span class="n">survey_datasource</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">schema_context</span><span class="o">=</span><span class="n">SURVEY_SCHEMA</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="k">with</span> <span class="n">DAG</span><span class="p">(</span>
-</span></span><span class="line"><span class="cl"> <span class="n">dag_id</span><span class="o">=</span><span class="s2">"hello_worlds"</span><span class="p">,</span>
-</span></span><span class="line"><span class="cl"> <span class="n">default_args</span><span class="o">=</span><span class="p">{</span><span class="s2">"executor"</span><span class="p">:</span> <span class="s2">"ShortName"</span><span class="p">},</span> <span class="c1"># Applies to all tasks in the DAG</span>
-</span></span><span class="line"><span class="cl"><span class="p">)</span> <span class="k">as</span> <span class="n">dag</span><span class="p">:</span>
-</span></span><span class="line"><span class="cl"> <span class="c1"># All tasks will use the executor from default args automatically</span>
-</span></span><span class="line"><span class="cl"> <span class="n">hw</span> <span class="o">=</span> <span class="n">hello_world</span><span class="p">()</span>
-</span></span><span class="line"><span class="cl"> <span class="n">hw_again</span> <span class="o">=</span> <span class="n">hello_world_again</span><span class="p">()</span>
-</span></span></code></pre></div><h2 id="dynamic-dataset-scheduling-through-datasetalias">Dynamic Dataset scheduling through DatasetAlias</h2>
-<p>Airflow 2.10 comes with <code>DatasetAlias</code> class which can be passed as a value in the <code>outlets</code>, <code>inlets</code> on a task, and <code>schedule</code> on a DAG. An instance of <code>DatasetAlias</code> is resolved dynamically to a real dataset. Downstream can depend on either the resolved dataset or on an alias itself.</p>
-<p><code>DatasetAlias</code> has one argument <code>name</code> that uniquely identifies the dataset. The task must first declare the alias as an outlet, and use <code>outlet_events</code> or <code>yield Metadata</code> to add events to it.</p>
-<h3 id="emit-a-dataset-event-during-task-execution-through-outlet_events">Emit a dataset event during task execution through outlet_events</h3>
-<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">airflow.datasets</span> <span class="kn">import</span> <span class="n">DatasetAlias</span>
+</span></span><span class="line"><span class="cl"> <span class="n">run_query</span> <span class="o">=</span> <span class="n">AnalyticsOperator</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">task_id</span><span class="o">=</span><span class="s2">"run_query"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">datasource_configs</span><span class="o">=</span><span class="p">[</span><span class="n">survey_datasource</span><span class="p">],</span>
+</span></span><span class="line"><span class="cl"> <span class="n">queries</span><span class="o">=</span><span class="p">[</span><span class="s2">"{{ ti.xcom_pull(task_ids='generate_sql') }}"</span><span class="p">],</span>
+</span></span><span class="line"><span class="cl"> <span class="n">result_output_format</span><span class="o">=</span><span class="s2">"json"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="nd">@task</span><span class="p">(</span><span class="n">outlets</span><span class="o">=</span><span class="p">[</span><span class="n">DatasetAlias</span><span class="p">(</span><span class="s2">"my-task-outputs"</span><span class="p">)])</span>
-</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">my_task_with_outlet_events</span><span class="p">(</span><span class="o">*</span><span class="p">,</span> <span class="n">outlet_events</span><span class="p">):</span>
-</span></span><span class="line"><span class="cl"> <span class="n">outlet_events</span><span class="p">[</span><span class="s2">"my-task-outputs"</span><span class="p">]</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Dataset</span><span class="p">(</span><span class="s2">"s3://bucket/my-task"</span><span class="p">))</span>
-</span></span></code></pre></div><h3 id="emit-a-dataset-event-during-task-execution-by-yielding-metadata">Emit a dataset event during task execution by yielding Metadata</h3>
-<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">airflow.datasets.metadata</span> <span class="kn">import</span> <span class="n">Metadata</span>
+</span></span><span class="line"><span class="cl"> <span class="nd">@task</span>
+</span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="nf">extract_data</span><span class="p">(</span><span class="n">raw</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+</span></span><span class="line"><span class="cl"> <span class="n">results</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">raw</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl"> <span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="n">row</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">results</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">item</span><span class="p">[</span><span class="s2">"data"</span><span class="p">]]</span>
+</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="nd">@task</span><span class="p">(</span><span class="n">outlets</span><span class="o">=</span><span class="p">[</span><span class="n">DatasetAlias</span><span class="p">(</span><span class="s2">"my-task-outputs"</span><span class="p">)])</span>
-</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">my_task_with_metadata</span><span class="p">():</span>
-</span></span><span class="line"><span class="cl"> <span class="n">s3_dataset</span> <span class="o">=</span> <span class="n">Dataset</span><span class="p">(</span><span class="s2">"s3://bucket/my-task}"</span><span class="p">)</span>
-</span></span><span class="line"><span class="cl"> <span class="k">yield</span> <span class="n">Metadata</span><span class="p">(</span><span class="n">s3_dataset</span><span class="p">,</span> <span class="n">alias</span><span class="o">=</span><span class="s2">"my-task-outputs"</span><span class="p">)</span>
-</span></span></code></pre></div><p>There are two options for scheduling based on dataset aliases. Schedule based on <code>DatasetAlias</code> or real datasets.</p>
-<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">with</span> <span class="n">DAG</span><span class="p">(</span><span class="n">dag_id</span><span class="o">=</span><span class="s2">"dataset-alias-producer"</span><span class="p">):</span>
-</span></span><span class="line"><span class="cl"> <span class="nd">@task</span><span class="p">(</span><span class="n">outlets</span><span class="o">=</span><span class="p">[</span><span class="n">DatasetAlias</span><span class="p">(</span><span class="s2">"example-alias"</span><span class="p">)])</span>
-</span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="nf">produce_dataset_events</span><span class="p">(</span><span class="o">*</span><span class="p">,</span> <span class="n">outlet_events</span><span class="p">):</span>
-</span></span><span class="line"><span class="cl"> <span class="n">outlet_events</span><span class="p">[</span><span class="s2">"example-alias"</span><span class="p">]</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Dataset</span><span class="p">(</span><span class="s2">"s3://bucket/my-task"</span><span class="p">))</span>
+</span></span><span class="line"><span class="cl"> <span class="n">result_data</span> <span class="o">=</span> <span class="n">extract_data</span><span class="p">(</span><span class="n">run_query</span><span class="o">.</span><span class="n">output</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="k">with</span> <span class="n">DAG</span><span class="p">(</span><span class="n">dag_id</span><span class="o">=</span><span class="s2">"dataset-consumer"</span><span class="p">,</span> <span class="n">schedule</span><span class="o">=</span><span class="n">Dataset</span><span class="p">(</span><span class="s2">"s3://bucket/my-task"</span><span class="p">)):</span>
-</span></span><span class="line"><span class="cl"> <span class="o">...</span>
+</span></span><span class="line"><span class="cl"> <span class="n">result_confirmation</span> <span class="o">=</span> <span class="n">ApprovalOperator</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">task_id</span><span class="o">=</span><span class="s2">"result_confirmation"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">subject</span><span class="o">=</span><span class="s2">"Review the survey query result"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">body</span><span class="o">=</span><span class="n">result_data</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">response_timeout</span><span class="o">=</span><span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="mi">1</span><span class="p">),</span>
+</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="k">with</span> <span class="n">DAG</span><span class="p">(</span><span class="n">dag_id</span><span class="o">=</span><span class="s2">"dataset-alias-consumer"</span><span class="p">,</span> <span class="n">schedule</span><span class="o">=</span><span class="n">DatasetAlias</span><span class="p">(</span><span class="s2">"example-alias"</span><span class="p">)):</span>
-</span></span><span class="line"><span class="cl"> <span class="o">...</span>
-</span></span></code></pre></div><h3 id="dataset-aliases-ui-enhancements">Dataset Aliases UI Enhancements</h3>
-<p>Now users can see Dataset Aliases in legend of each cross-dag dependency graph with a corresponded icon/color.</p>
-<p><img src="/blog/airflow-2.10.0/dag_dependencies_legend.png" alt="DAG Dependencies graph"></p>
-<h2 id="dark-mode-for-airflow-ui">Dark Mode for Airflow UI</h2>
-<p>Airflow 2.10 comes with new Dark Mode feature which is designed to enhance user experience by offering an alternative visual theme that is easier on the eyes, especially in low-light conditions. You can toggle the crescent icon on the right side of the navigation bar to switch between light and dark mode.</p>
-<p><img src="/blog/airflow-2.10.0/airflow_dark_mode.png" alt="Airflow Dark mode"></p>
-<p><img src="/blog/airflow-2.10.0/airflow_light_mode.png" alt="Airflow Light mode"></p>
-<h2 id="task-instance-history">Task Instance History</h2>
-<p>In Apache Airflow 2.10.0, when a task instance is retried or cleared, its execution history is maintained. You can view this history by clicking on the task instance in the Grid view, allowing you to access information about each attempt, such as logs, execution durations, and any failures. This feature improves transparency into the task’s execution process, making it easier to troubleshoot and analyze your DAGs.</p>
-<p><img src="/blog/airflow-2.10.0/task_instance_history.png" alt="Task instance history"></p>
-<p>The history displays the final values of the task instance attributes for each specific run. On the log page, you can also access the logs for each attempt of the task instance. This information is valuable for debugging purposes.</p>
-<p><img src="/blog/airflow-2.10.0/task_instance_history_log.png" alt="Task instance history"></p>
-<h2 id="dataset-ui-enhancements">Dataset UI Enhancements</h2>
-<p>The dataset page has been revamped to include a focused dataset events section with additional details such as extras, consuming DAGs, and producing tasks.
-<img src="/blog/airflow-2.10.0/dataset_list.png" alt="Dataset list"></p>
-<p>We now have separate dependency graph and dataset list pages in new tabs, enhancing the user experience.</p>
-<p><img src="/blog/airflow-2.10.0/dependency_graph.png" alt="Dataset dependency graph"></p>
-<p>Dataset events are now displayed in both the Details tab of each DAG run and within the DAG graph.</p>
-<p><img src="/blog/airflow-2.10.0/dataset_details.png" alt="Dataset list"></p>
-<h3 id="toggle-datasets-in-graph">Toggle datasets in Graph</h3>
-<p>We can now toggle the datasets in the DAG graph</p>
-<p><img src="/blog/airflow-2.10.0/dataset_toggle_on.png" alt="Dataset toggle button on">
-<img src="/blog/airflow-2.10.0/dataset_toggle_off.png" alt="Dataset toggle button off"></p>
-<h3 id="dataset-conditions-in-dag-graph-view">Dataset Conditions in DAG Graph view</h3>
-<p>We now display the graph view with logical gates. Datasets with actual events are highlighted with a different border, making it easier to see what triggered the selected run.</p>
-<p><img src="/blog/airflow-2.10.0/render_dataset_conditions.png" alt="Render dataset conditions in graph view"></p>
-<h3 id="dataset-event-info-in-dag-graph">Dataset event info in DAG Graph</h3>
-<p>For a DAG run, users can now view the dataset events connected to it directly in the graph view.</p>
-<p><img src="/blog/airflow-2.10.0/dataset_info.png" alt="Dataset event info"></p>
-<h2 id="on-demand-dag-re-parsing">On-demand DAG Re-parsing</h2>
-<p>In 2.10 users can now reparse the DAGs on demand using below button on DAG list and DAG detail pages</p>
-<p><img src="/blog/airflow-2.10.0/DAG_reparsing_button_list.png" alt="DAG Reparsing button on DAG list page">
-<img src="/blog/airflow-2.10.0/DAG_reparse_button_detail.png" alt="DAG Reparsing button on DAG detail page"></p>
-<h2 id="additional-new-features">Additional new features</h2>
-<p>Here are just a few interesting new features since there are too many to list in full:</p>
-<ul>
-<li>Deferrable operators can now execute directly from the triggerer without needing to go through the worker. This is especially efficient for certain operators, like sensors, and can help teams save both time and money.</li>
-<li>Crucial executor logs are now integrated into the task logs. If the executor fails to start a task, the relevant error messages will be available in the task logs, simplifying the debugging process.</li>
-</ul>
-<h2 id="contributors">Contributors</h2>
-<p>Thanks to everyone who contributed to this release, including Andrey Anshin, Brent Bovenzi, Daniel Standish, Ephraim Anierobi, Hussein Awala, Jarek Potiuk, Jed Cunningham, Jens Scheffler, Tzu-ping Chung, Vincent, and over 63 others!</p>
-<p>I hope you enjoy using Apache Airflow 2.10.0!</p>
+</span></span><span class="line"><span class="cl"> <span class="n">prompt_confirmation</span> <span class="o">>></span> <span class="n">generate_sql</span> <span class="o">>></span> <span class="n">run_query</span>
+</span></span></code></pre></div><h2 id="walking-through-a-run">Walking Through a Run</h2>
+<p><strong>Step 1: Prompt confirmation.</strong> Trigger the DAG and navigate to the HITL review tab.
+The default question appears in an editable field. Change it to anything the schema supports,
+or leave it as-is and confirm.</p>
+<blockquote>
+<p><em>“How does AI tool usage for writing Airflow code compare between Airflow 3 users and Airflow 2 users?”</em></p></blockquote>
+<p><strong>Step 2: SQL generation.</strong> <code>LLMSQLQueryOperator</code> receives the confirmed question, constructs
+a system prompt from <code>SURVEY_SCHEMA</code>, and calls the LLM. It returns validated SQL. sqlglot
+parses the output and rejects anything that isn’t a <code>SELECT</code>. The generated query goes to XCom.</p>
+<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">SELECT</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s2">"Which version of Airflow do you currently use?"</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">airflow_version</span><span class="p">,</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s2">"Are you using AI/LLM (ChatGPT/Cursor/Claude etc) to assist you in writing Airflow code?"</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">ai_usage</span><span class="p">,</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">COUNT</span><span class="p">(</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">respondents</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">FROM</span><span class="w"> </span><span class="n">survey</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">WHERE</span><span class="w"> </span><span class="s2">"Which version of Airflow do you currently use?"</span><span class="w"> </span><span class="k">IS</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">AND</span><span class="w"> </span><span class="s2">"Are you using AI/LLM (ChatGPT/Cursor/Claude etc) to assist you in writing Airflow code?"</span><span class="w"> </span><span class="k">IS</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">GROUP</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">airflow_version</span><span class="p">,</span><span class="w"> </span><span class="n">ai_usage</span><span class="w">
+</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">airflow_version</span><span class="p">,</span><span class="w"> </span><span class="n">respondents</span><span class="w"> </span><span class="k">DESC</span><span class="w">
+</span></span></span></code></pre></div><p><strong>Step 3: DataFusion execution.</strong> <code>AnalyticsOperator</code> loads the CSV into a DataFusion
+<code>SessionContext</code>, registers it as the <code>survey</code> table, and executes the SQL in-process.
+No database server, no network call. The 5,856-row CSV runs in under a second.</p>
+<p><strong>Step 4: Extract data.</strong> The raw JSON from <code>AnalyticsOperator</code> includes the original
+query string alongside the result rows. This <code>@task</code> strips the query so the reviewer
+isn’t looking at SQL when they should be looking at data.</p>
+<p><strong>Step 5: Result confirmation.</strong> The data rows appear in the Airflow UI approval dialog.
+The analyst reads the result, clicks Approve (or Reject if something looks off), and the
+DAG completes.</p>
+<h2 id="the-scheduled-pipeline">The Scheduled Pipeline</h2>
+<p>The scheduled variant adds three capabilities the interactive version intentionally omits:
+data acquisition, schema validation, and result delivery. It runs <code>@monthly</code> (configurable)
+with no human steps.</p>
+<table>
+ <thead>
+ <tr>
+ <th>Step</th>
+ <th>Operator</th>
+ <th>What happens</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>1</td>
+ <td><code>HttpOperator</code></td>
+ <td>Downloads the survey CSV from <code>airflow.apache.org</code>.</td>
+ </tr>
+ <tr>
+ <td>2</td>
+ <td><code>@task prepare_csv</code></td>
+ <td>Writes the CSV to disk and generates a reference schema file from <code>SURVEY_SCHEMA</code>.</td>
+ </tr>
+ <tr>
+ <td>3</td>
+ <td><code>LLMSchemaCompareOperator</code></td>
+ <td>LLM compares the downloaded CSV schema against the reference. Raises if critical columns are missing or renamed.</td>
+ </tr>
+ <tr>
+ <td>4</td>
+ <td><code>LLMSQLQueryOperator</code></td>
+ <td>Translates the fixed question into validated SQL.</td>
+ </tr>
+ <tr>
+ <td>5</td>
+ <td><code>AnalyticsOperator</code></td>
+ <td>Executes the SQL via DataFusion.</td>
+ </tr>
+ <tr>
+ <td>6</td>
+ <td><code>@task extract_data</code></td>
+ <td>Extracts data rows from the JSON result.</td>
+ </tr>
+ <tr>
+ <td>7</td>
+ <td><code>@task send_result</code></td>
+ <td>Sends the result via <code>SmtpHook</code> if <code>SMTP_CONN_ID</code> and <code>NOTIFY_EMAIL</code> are set, otherwise logs to the task log.</td>
+ </tr>
+ </tbody>
+</table>
+<p>The schema check at step 3 is worth calling out. <code>LLMSchemaCompareOperator</code> compares the
+live download against a reference file derived from <code>SURVEY_SCHEMA</code>. If the survey format
+changes between runs (a renamed column, a dropped field), the operator catches it before
+any SQL runs, rather than failing silently mid-pipeline with a cryptic DataFusion error.</p>
+<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nd">@dag</span>
+</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">example_llm_survey_scheduled</span><span class="p">():</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"> <span class="n">download_survey</span> <span class="o">=</span> <span class="n">HttpOperator</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">task_id</span><span class="o">=</span><span class="s2">"download_survey"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">http_conn_id</span><span class="o">=</span><span class="n">AIRFLOW_WEBSITE_CONN_ID</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">endpoint</span><span class="o">=</span><span class="n">SURVEY_CSV_ENDPOINT</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">method</span><span class="o">=</span><span class="s2">"GET"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">response_filter</span><span class="o">=</span><span class="k">lambda</span> <span class="n">r</span><span class="p">:</span> <span class="n">r</span><span class="o">.</span><span class="n">text</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">log_response</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="p">)</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"> <span class="nd">@task</span>
+</span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="nf">prepare_csv</span><span class="p">(</span><span class="n">csv_text</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
+</span></span><span class="line"><span class="cl"> <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">SURVEY_CSV_PATH</span><span class="p">),</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl"> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">SURVEY_CSV_PATH</span><span class="p">,</span> <span class="s2">"w"</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">"utf-8"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+</span></span><span class="line"><span class="cl"> <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">csv_text</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl"> <span class="n">columns</span> <span class="o">=</span> <span class="p">[</span><span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'"'</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">SURVEY_SCHEMA</span><span class="o">.</ [...]
+</span></span><span class="line"><span class="cl"> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">REFERENCE_CSV_PATH</span><span class="p">,</span> <span class="s2">"w"</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">"utf-8"</span><span class="p">)</sp [...]
+</span></span><span class="line"><span class="cl"> <span class="n">csv_mod</span><span class="o">.</span><span class="n">writer</span><span class="p">(</span><span class="n">ref</span><span class="p">)</span><span class="o">.</span><span class="n">writerow</span><span class="p">(</span><span class="n">columns</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"> <span class="n">csv_ready</span> <span class="o">=</span> <span class="n">prepare_csv</span><span class="p">(</span><span class="n">download_survey</span><span class="o">.</span><span class="n">output</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"> <span class="n">check_schema</span> <span class="o">=</span> <span class="n">LLMSchemaCompareOperator</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">task_id</span><span class="o">=</span><span class="s2">"check_schema"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">prompt</span><span class="o">=</span><span class="s2">"Compare the survey CSV schema against the reference. Flag missing or renamed columns."</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">llm_conn_id</span><span class="o">=</span><span class="n">LLM_CONN_ID</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">data_sources</span><span class="o">=</span><span class="p">[</span><span class="n">survey_datasource</span><span class="p">,</span> <span class="n">reference_datasource</span><span class="p">],</span>
+</span></span><span class="line"><span class="cl"> <span class="n">context_strategy</span><span class="o">=</span><span class="s2">"basic"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="p">)</span>
+</span></span><span class="line"><span class="cl"> <span class="n">csv_ready</span> <span class="o">>></span> <span class="n">check_schema</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"> <span class="n">generate_sql</span> <span class="o">=</span> <span class="n">LLMSQLQueryOperator</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">task_id</span><span class="o">=</span><span class="s2">"generate_sql"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">prompt</span><span class="o">=</span><span class="n">SCHEDULED_PROMPT</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">llm_conn_id</span><span class="o">=</span><span class="n">LLM_CONN_ID</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">datasource_config</span><span class="o">=</span><span class="n">survey_datasource</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">schema_context</span><span class="o">=</span><span class="n">SURVEY_SCHEMA</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="p">)</span>
+</span></span><span class="line"><span class="cl"> <span class="n">check_schema</span> <span class="o">>></span> <span class="n">generate_sql</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"> <span class="n">run_query</span> <span class="o">=</span> <span class="n">AnalyticsOperator</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">task_id</span><span class="o">=</span><span class="s2">"run_query"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">datasource_configs</span><span class="o">=</span><span class="p">[</span><span class="n">survey_datasource</span><span class="p">],</span>
+</span></span><span class="line"><span class="cl"> <span class="n">queries</span><span class="o">=</span><span class="p">[</span><span class="s2">"{{ ti.xcom_pull(task_ids='generate_sql') }}"</span><span class="p">],</span>
+</span></span><span class="line"><span class="cl"> <span class="n">result_output_format</span><span class="o">=</span><span class="s2">"json"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="p">)</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"> <span class="nd">@task</span>
+</span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="nf">extract_data</span><span class="p">(</span><span class="n">raw</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+</span></span><span class="line"><span class="cl"> <span class="n">results</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">raw</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl"> <span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="n">row</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">results</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">item</span><span class="p">[</span><span class="s2">"data"</span><span class="p">]]</span>
+</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"> <span class="n">result_data</span> <span class="o">=</span> <span class="n">extract_data</span><span class="p">(</span><span class="n">run_query</span><span class="o">.</span><span class="n">output</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"> <span class="nd">@task</span>
+</span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="nf">send_result</span><span class="p">(</span><span class="n">data</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
+</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">SMTP_CONN_ID</span> <span class="ow">and</span> <span class="n">NOTIFY_EMAIL</span><span class="p">:</span>
+</span></span><span class="line"><span class="cl"> <span class="kn">from</span> <span class="nn">airflow.providers.smtp.hooks.smtp</span> <span class="kn">import</span> <span class="n">SmtpHook</span>
+</span></span><span class="line"><span class="cl"> <span class="k">with</span> <span class="n">SmtpHook</span><span class="p">(</span><span class="n">smtp_conn_id</span><span class="o">=</span><span class="n">SMTP_CONN_ID</span><span class="p">)</span> <span class="k">as</span> <span class="n">hook</span><span class="p">:</span>
+</span></span><span class="line"><span class="cl"> <span class="n">hook</span><span class="o">.</span><span class="n">send_email_smtp</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">to</span><span class="o">=</span><span class="n">NOTIFY_EMAIL</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">subject</span><span class="o">=</span><span class="sa">f</span><span class="s2">"Airflow Survey Analysis: </span><span class="si">{</span><span class="n">SCHEDULED_PROMPT</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">html_content</span><span class="o">=</span><span class="sa">f</span><span class="s2">"<pre></span><span class="si">{</span><span class="n">data</span><span class="si">}</span><span class="s2"></pre>"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="p">)</span>
+</span></span><span class="line"><span class="cl"> <span class="k">else</span><span class="p">:</span>
+</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Survey analysis result:</span><span class="se">\n</span><span class="si">{</span><span class="n">data</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"> <span class="n">generate_sql</span> <span class="o">>></span> <span class="n">run_query</span> <span class="o">>></span> <span class="n">result_data</span> <span class="o">>></span> <span class="n">send_result</span><span class="p">(</span><span class="n">result_data</span><span class="p">)</span>
+</span></span></code></pre></div><h2 id="connecting-your-llm">Connecting Your LLM</h2>
+<p>Both DAGs use <code>llm_conn_id="pydanticai_default"</code>. Create a connection in the Airflow UI:</p>
+<table>
+ <thead>
+ <tr>
+ <th>Provider</th>
+ <th>Connection type</th>
+ <th>Required fields</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>OpenAI</td>
+ <td><code>pydanticai</code></td>
+ <td>Password: API key. Extra: <code>{"model": "openai:gpt-4o"}</code></td>
+ </tr>
+ <tr>
+ <td>Anthropic</td>
+ <td><code>pydanticai</code></td>
+ <td>Password: API key. Extra: <code>{"model": "anthropic:claude-haiku-4-5-20251001"}</code></td>
+ </tr>
+ <tr>
+ <td>Google Vertex</td>
+ <td><code>pydanticai-vertex</code></td>
+ <td>Extra: <code>{"model": "google-vertex:gemini-2.0-flash", "project": "...", "vertexai": true}</code></td>
+ </tr>
+ <tr>
+ <td>AWS Bedrock</td>
+ <td><code>pydanticai-bedrock</code></td>
+ <td>Extra: <code>{"model": "bedrock:us.anthropic.claude-opus-4-5", "region_name": "us-east-1"}</code></td>
+ </tr>
+ </tbody>
+</table>
+<p>Switch providers by changing the connection. Neither DAG requires any code changes.</p>
+<p>For the scheduled DAG, also create an HTTP connection named <code>airflow_website</code> with host
+<code>https://airflow.apache.org</code> (no auth required), and optionally set the <code>SMTP_CONN_ID</code>
+and <code>NOTIFY_EMAIL</code> environment variables to enable email delivery.</p>
+<h2 id="what-this-shows">What This Shows</h2>
+<p>Four capabilities come together across these two pipelines that haven’t been easy to combine before:</p>
+<p><strong>Natural language as the interface.</strong> Neither pipeline requires the analyst to write SQL.
+<code>LLMSQLQueryOperator</code> handles schema awareness, column quoting, and query structure. The
+<code>SURVEY_SCHEMA</code> context is the only thing it needs.</p>
+<p><strong>In-process query execution.</strong> <code>AnalyticsOperator</code> runs Apache DataFusion inside the Airflow
+worker. There’s no database to configure, no connection to manage for the data itself. Point
+it at a file URI and it runs.</p>
+<p><strong>Schema-aware data validation.</strong> <code>LLMSchemaCompareOperator</code> uses an LLM to compare schemas
+and surface structural changes in plain language, not a column count diff, but an explanation
+of what changed and why it matters for downstream queries. It turns a silent mid-pipeline
+failure into an early, actionable error.</p>
+<p><strong>Human oversight without blocking automation.</strong> The <code>HITLEntryOperator</code> and <code>ApprovalOperator</code>
+are standard Airflow operators from <code>airflow.providers.standard.operators.hitl</code>. They have no
+AI imports. They just pause the DAG and wait. The interactive pipeline uses them at both ends;
+the scheduled pipeline skips them entirely. Adding or removing human review requires no changes
+to the LLM or DataFusion steps.</p>
+<h2 id="try-it">Try It</h2>
+<p>Both DAGs are in the <code>common.ai</code> provider example DAGs:
+<a href="https://github.com/apache/airflow/tree/main/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_llm_survey_analysis.py"><code>example_llm_survey_analysis.py</code></a>.</p>
+<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pip install <span class="s1">'apache-airflow-providers-common-ai'</span> <span class="se">\
+</span></span></span><span class="line"><span class="cl"><span class="se"></span> <span class="s1">'apache-airflow-providers-common-sql[datafusion]'</span> <span class="se">\
+</span></span></span><span class="line"><span class="cl"><span class="se"></span> <span class="s1">'apache-airflow-providers-http'</span> <span class="se">\
+</span></span></span><span class="line"><span class="cl"><span class="se"></span> <span class="s1">'apache-airflow-providers-smtp'</span> <span class="c1"># optional, for email delivery</span>
+</span></span></code></pre></div><p>Requires Apache Airflow 3.0+. <code>apache-airflow-providers-standard</code> (which provides
+<code>HITLEntryOperator</code> and <code>ApprovalOperator</code>) ships with Airflow 3 and does not need
+a separate install.</p>
+<p>For the interactive DAG: set <code>SURVEY_CSV_PATH</code> to your local copy of the survey CSV, create
+a <code>pydanticai_default</code> connection, and trigger <code>example_llm_survey_interactive</code>.</p>
+<p>For the scheduled DAG: create the <code>airflow_website</code> HTTP connection, set <code>SMTP_CONN_ID</code> and
+<code>NOTIFY_EMAIL</code> if you want email delivery, and trigger <code>example_llm_survey_scheduled</code>.</p>
+<p>To go further, the follow-on post <a href="https://airflow.apache.org/blog/agentic-workloads-airflow-3/">Agentic Workloads on Airflow 3</a>
+extends this example into a multi-query synthesis pattern, answering questions that require
+querying several dimensions in parallel and synthesizing the results with a second LLM call.</p>
+<p>Questions, feedback, and survey queries that stumped the LLM are all welcome on
+<a href="https://s.apache.org/airflow-slack">Airflow Slack</a> in <code>#airflow-ai</code>.</p>
</div>
@@ -701,10 +927,10 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
<div class="no-width-restriction no-desktop">
<ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5">
<li>
- <a href="/blog/airflow-2.9.0/" aria-label="Previous - Apache Airflow 2.9.0: Dataset and UI Improvements" class="btn btn-primary"><span class="me-1">←</span>Previous</a>
+ <a href="/blog/common-ai-provider/" aria-label="Previous - Introducing the Common AI Provider: LLM and AI Agent Support for Apache Airflow" class="btn btn-primary"><span class="me-1">←</span>Previous</a>
</li>
<li>
- <a href="/blog/airflow-survey-2024/" aria-label="Next - Airflow Survey 2024" class="btn btn-primary">Next<span class="ms-1">→</span></a>
+ <a href="/blog/agentic-workloads-airflow-3/" aria-label="Next - Agentic Workloads on Airflow: Observable, Retryable, and Auditable by Design" class="btn btn-primary">Next<span class="ms-1">→</span></a>
</li>
</ul>
@@ -730,28 +956,35 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
<div class="tags-container">
- <a class="tag" href="/blog/tags/release/">Release</a>
+ <a class="tag" href="/blog/tags/community/">Community</a>
+
+
+
+ <a class="tag" href="/blog/tags/tutorial/">Tutorial</a>
</div>
- <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Thu, Sep 25, 2025</span>
+ <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Wed, Apr 15, 2026</span>
</div>
<p class="box-event__blogpost--header">
- <a href="/blog/airflow-3.1.0/">
- Apache Airflow 3.1.0: Human-Centered Workflows
+ <a href="/blog/agentic-workloads-airflow-3/">
+ Agentic Workloads on Airflow: Observable, Retryable, and Auditable by Design
</a>
</p>
- <p class="box-event__blogpost--author">Kaxil Naik</p>
+ <p class="box-event__blogpost--author">
+
+
+
+ <a href="https://linkedin.com/in/vikramkoka" target="_blank" rel="noopener">Vikram Koka</a>
+
+
+
+ </p>
- <p class="box-event__blogpost--description">Apache Airflow 3.1.0 introduces Human-in-the-Loop workflows, 17-language internationalization, deadline alerts, and React plugin system for data orchestration teams.</p>
+ <p class="box-event__blogpost--description">How Dynamic Task Mapping and the common.ai provider turn a multi-dimensional research question into a fan-out/fan-in pipeline where every LLM call is a named, logged, independently retryable task, not a hidden step inside a reasoning loop.</p>
<div class="mt-auto">
- <a href="/blog/airflow-3.1.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/agentic-workloads-airflow-3/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -767,15 +1000,19 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
<div class="tags-container">
+ <a class="tag" href="/blog/tags/community/">Community</a>
+
+
+
<a class="tag" href="/blog/tags/release/">Release</a>
</div>
- <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Tue, Apr 22, 2025</span>
+ <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Tue, Apr 14, 2026</span>
</div>
<p class="box-event__blogpost--header">
- <a href="/blog/airflow-three-point-oh-is-here/">
- Apache Airflow® 3 is Generally Available!
+ <a href="/blog/common-ai-provider/">
+ Introducing the Common AI Provider: LLM and AI Agent Support for Apache Airflow
</a>
</p>
@@ -788,20 +1025,15 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
,
- <a href="https://linkedin.com/in/vikramkoka" target="_blank" rel="noopener">Vikram Koka</a>
+ <a href="https://linkedin.com/in/pavan-kumar-gopidesu" target="_blank" rel="noopener">Pavan Kumar Gopidesu</a>
</p>
- <p class="box-event__blogpost--description">We're proud to announce that Apache Airflow 3.0.0 has been released.</p>
+ <p class="box-event__blogpost--description">The Common AI Provider adds LLM and AI agent operators to Apache Airflow with 6 operators, 5 toolsets, and 20+ model providers in one package.</p>
<div class="mt-auto">
- <a href="/blog/airflow-three-point-oh-is-here/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/common-ai-provider/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -821,8 +1053,8 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -833,7 +1065,7 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
- <a href=https://github.com/apache/airflow-site/edit/main/landing-pages/site/content/en//blog/airflow-2.10.0>
+ <a href=https://github.com/apache/airflow-site/edit/main/landing-pages/site/content/en//blog/ai-survey-analysis-pipelines>
@@ -897,14 +1129,14 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -928,7 +1160,7 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -938,7 +1170,7 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -1027,13 +1259,13 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
<script defer src="/js/auto-render.min.js" integrity="sha512-0HzJcHCD+wBh9kNUUcm3DWH9IbNDfudsYyMD5EHwSuFK6aEsaa/UEPqqk4t0pm4bbmwR6A11yNsD7Q+nz6XF+Q==" crossorigin="anonymous"
onload='renderMathInElement(document.body, null);'>
</script>
- <script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+ <script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-1.10.10/index.html b/blog/airflow-1.10.10/index.html
index f7a86cf705..1780e8e1f8 100644
--- a/blog/airflow-1.10.10/index.html
+++ b/blog/airflow-1.10.10/index.html
@@ -31,14 +31,14 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2020-04-09T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Release">
<meta property="og:image" content="/images/feature-image.png">
<meta itemprop="name" content="Apache Airflow 1.10.10">
<meta itemprop="description" content="We are happy to present Apache Airflow 1.10.10">
<meta itemprop="datePublished" content="2020-04-09T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="1142">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Release">
@@ -49,8 +49,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +58,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -89,8 +89,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +98,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +276,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +288,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +477,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -515,14 +491,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Thu, Apr 9, 2020</span>
+ <span class="blogpost-content__metadata--date">Thu, Apr 9, 2020</span>
</div>
- <p class="blogpost-content__metadata--title">Apache Airflow 1.10.10</p>
+ <h1 class="blogpost-content__metadata--title">Apache Airflow 1.10.10</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Kaxil Naik</span>
- <a href="https://github.com/kaxil/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/kaxil/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Kaxil Naik">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -530,7 +506,7 @@
</a>
- <a href="https://linkedin.com/in/kaxil/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/kaxil/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Kaxil Naik">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -765,12 +741,7 @@ objc[1873]: +[__NSPlaceholderDate initialize] may have been in progress in anoth
<p class="box-event__blogpost--description">We are happy to present Apache Airflow 1.10.12</p>
<div class="mt-auto">
- <a href="/blog/airflow-1.10.12/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-1.10.12/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -802,12 +773,7 @@ objc[1873]: +[__NSPlaceholderDate initialize] may have been in progress in anoth
<p class="box-event__blogpost--description">We are happy to present the new 1.10.8 and 1.10.9 releases of Apache Airflow.</p>
<div class="mt-auto">
- <a href="/blog/airflow-1.10.8-1.10.9/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-1.10.8-1.10.9/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -827,8 +793,8 @@ objc[1873]: +[__NSPlaceholderDate initialize] may have been in progress in anoth
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -903,14 +869,14 @@ objc[1873]: +[__NSPlaceholderDate initialize] may have been in progress in anoth
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -934,7 +900,7 @@ objc[1873]: +[__NSPlaceholderDate initialize] may have been in progress in anoth
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -944,7 +910,7 @@ objc[1873]: +[__NSPlaceholderDate initialize] may have been in progress in anoth
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -1023,13 +989,13 @@ objc[1873]: +[__NSPlaceholderDate initialize] may have been in progress in anoth
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-1.10.12/index.html b/blog/airflow-1.10.12/index.html
index b59564c61a..34e6ad22a4 100644
--- a/blog/airflow-1.10.12/index.html
+++ b/blog/airflow-1.10.12/index.html
@@ -31,14 +31,14 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2020-08-25T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Release">
<meta property="og:image" content="/images/feature-image.png">
<meta itemprop="name" content="Apache Airflow 1.10.12">
<meta itemprop="description" content="We are happy to present Apache Airflow 1.10.12">
<meta itemprop="datePublished" content="2020-08-25T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="910">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Release">
@@ -49,8 +49,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +58,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -89,8 +89,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +98,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +276,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +288,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +477,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -515,14 +491,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Tue, Aug 25, 2020</span>
+ <span class="blogpost-content__metadata--date">Tue, Aug 25, 2020</span>
</div>
- <p class="blogpost-content__metadata--title">Apache Airflow 1.10.12</p>
+ <h1 class="blogpost-content__metadata--title">Apache Airflow 1.10.12</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Kaxil Naik</span>
- <a href="https://github.com/kaxil/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/kaxil/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Kaxil Naik">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -530,7 +506,7 @@
</a>
- <a href="https://linkedin.com/in/kaxil/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/kaxil/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Kaxil Naik">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -743,12 +719,7 @@ William Tran, Xiaodong Deng, YI FU, Zikun Zhu, dewaldabrie, pulsar314, retornam,
<p class="box-event__blogpost--description">We are happy to present Apache Airflow 1.10.10</p>
<div class="mt-auto">
- <a href="/blog/airflow-1.10.10/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-1.10.10/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -780,12 +751,7 @@ William Tran, Xiaodong Deng, YI FU, Zikun Zhu, dewaldabrie, pulsar314, retornam,
<p class="box-event__blogpost--description">We are happy to present the new 1.10.8 and 1.10.9 releases of Apache Airflow.</p>
<div class="mt-auto">
- <a href="/blog/airflow-1.10.8-1.10.9/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-1.10.8-1.10.9/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -805,8 +771,8 @@ William Tran, Xiaodong Deng, YI FU, Zikun Zhu, dewaldabrie, pulsar314, retornam,
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -881,14 +847,14 @@ William Tran, Xiaodong Deng, YI FU, Zikun Zhu, dewaldabrie, pulsar314, retornam,
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -912,7 +878,7 @@ William Tran, Xiaodong Deng, YI FU, Zikun Zhu, dewaldabrie, pulsar314, retornam,
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -922,7 +888,7 @@ William Tran, Xiaodong Deng, YI FU, Zikun Zhu, dewaldabrie, pulsar314, retornam,
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -1011,13 +977,13 @@ William Tran, Xiaodong Deng, YI FU, Zikun Zhu, dewaldabrie, pulsar314, retornam,
<script defer src="/js/auto-render.min.js" integrity="sha512-0HzJcHCD+wBh9kNUUcm3DWH9IbNDfudsYyMD5EHwSuFK6aEsaa/UEPqqk4t0pm4bbmwR6A11yNsD7Q+nz6XF+Q==" crossorigin="anonymous"
onload='renderMathInElement(document.body, null);'>
</script>
- <script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+ <script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-1.10.8-1.10.9/index.html b/blog/airflow-1.10.8-1.10.9/index.html
index ec66619ecc..ede139df47 100644
--- a/blog/airflow-1.10.8-1.10.9/index.html
+++ b/blog/airflow-1.10.8-1.10.9/index.html
@@ -31,14 +31,14 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2020-02-23T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Release">
<meta property="og:image" content="/images/feature-image.png">
<meta itemprop="name" content="Apache Airflow 1.10.8 & 1.10.9">
<meta itemprop="description" content="We are happy to present the new 1.10.8 and 1.10.9 releases of Apache Airflow.">
<meta itemprop="datePublished" content="2020-02-23T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="437">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Release">
@@ -49,8 +49,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +58,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -89,8 +89,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +98,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +276,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +288,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +477,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -515,14 +491,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Sun, Feb 23, 2020</span>
+ <span class="blogpost-content__metadata--date">Sun, Feb 23, 2020</span>
</div>
- <p class="blogpost-content__metadata--title">Apache Airflow 1.10.8 & 1.10.9</p>
+ <h1 class="blogpost-content__metadata--title">Apache Airflow 1.10.8 & 1.10.9</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Kaxil Naik</span>
- <a href="https://github.com/kaxil/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/kaxil/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Kaxil Naik">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -530,7 +506,7 @@
</a>
- <a href="https://linkedin.com/in/kaxil/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/kaxil/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Kaxil Naik">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -677,12 +653,7 @@ for 1.10.* series but would no longer be available from Airflow 2.0</p>
<p class="box-event__blogpost--description">We are happy to present Apache Airflow 1.10.12</p>
<div class="mt-auto">
- <a href="/blog/airflow-1.10.12/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-1.10.12/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -714,12 +685,7 @@ for 1.10.* series but would no longer be available from Airflow 2.0</p>
<p class="box-event__blogpost--description">We are happy to present Apache Airflow 1.10.10</p>
<div class="mt-auto">
- <a href="/blog/airflow-1.10.10/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-1.10.10/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -739,8 +705,8 @@ for 1.10.* series but would no longer be available from Airflow 2.0</p>
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -815,14 +781,14 @@ for 1.10.* series but would no longer be available from Airflow 2.0</p>
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -846,7 +812,7 @@ for 1.10.* series but would no longer be available from Airflow 2.0</p>
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -856,7 +822,7 @@ for 1.10.* series but would no longer be available from Airflow 2.0</p>
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -935,13 +901,13 @@ for 1.10.* series but would no longer be available from Airflow 2.0</p>
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-2.10.0/index.html b/blog/airflow-2.10.0/index.html
index 253870f51a..71eb6ca080 100644
--- a/blog/airflow-2.10.0/index.html
+++ b/blog/airflow-2.10.0/index.html
@@ -31,14 +31,14 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2024-08-08T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Release">
<meta property="og:image" content="/images/feature-image.png">
<meta itemprop="name" content="Apache Airflow 2.10.0 is here">
<meta itemprop="description" content="Apache Airflow 2.10.0 is a game-changer, with powerful Dataset improvements and the groundbreaking Hybrid Executor, set to redefine your workflow capabilities!">
<meta itemprop="datePublished" content="2024-08-08T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="1040">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Release">
@@ -49,8 +49,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +58,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -89,8 +89,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +98,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +276,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +288,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +477,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -515,14 +491,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Thu, Aug 8, 2024</span>
+ <span class="blogpost-content__metadata--date">Thu, Aug 8, 2024</span>
</div>
- <p class="blogpost-content__metadata--title">Apache Airflow 2.10.0 is here</p>
+ <h1 class="blogpost-content__metadata--title">Apache Airflow 2.10.0 is here</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Utkarsh Sharma</span>
- <a href="https://github.com/utkarsharma2/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/utkarsharma2/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Utkarsh Sharma">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -530,7 +506,7 @@
</a>
- <a href="https://linkedin.com/in/utkarsh-sharma-5791ab8a/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/utkarsh-sharma-5791ab8a/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Utkarsh Sharma">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -730,28 +706,40 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
<div class="tags-container">
+ <a class="tag" href="/blog/tags/community/">Community</a>
+
+
+
<a class="tag" href="/blog/tags/release/">Release</a>
</div>
- <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Thu, Sep 25, 2025</span>
+ <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Tue, Apr 14, 2026</span>
</div>
<p class="box-event__blogpost--header">
- <a href="/blog/airflow-3.1.0/">
- Apache Airflow 3.1.0: Human-Centered Workflows
+ <a href="/blog/common-ai-provider/">
+ Introducing the Common AI Provider: LLM and AI Agent Support for Apache Airflow
</a>
</p>
- <p class="box-event__blogpost--author">Kaxil Naik</p>
+ <p class="box-event__blogpost--author">
+
+
+
+ <a href="https://linkedin.com/in/kaxil" target="_blank" rel="noopener">Kaxil Naik</a>
+
+ ,
+
+
+ <a href="https://linkedin.com/in/pavan-kumar-gopidesu" target="_blank" rel="noopener">Pavan Kumar Gopidesu</a>
+
+
+
+ </p>
- <p class="box-event__blogpost--description">Apache Airflow 3.1.0 introduces Human-in-the-Loop workflows, 17-language internationalization, deadline alerts, and React plugin system for data orchestration teams.</p>
+ <p class="box-event__blogpost--description">The Common AI Provider adds LLM and AI agent operators to Apache Airflow with 6 operators, 5 toolsets, and 20+ model providers in one package.</p>
<div class="mt-auto">
- <a href="/blog/airflow-3.1.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/common-ai-provider/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -771,37 +759,19 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
</div>
- <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Tue, Apr 22, 2025</span>
+ <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Tue, Apr 7, 2026</span>
</div>
<p class="box-event__blogpost--header">
- <a href="/blog/airflow-three-point-oh-is-here/">
- Apache Airflow® 3 is Generally Available!
+ <a href="/blog/airflow-3.2.0/">
+ Apache Airflow 3.2.0: Data-Aware Workflows at Scale
</a>
</p>
- <p class="box-event__blogpost--author">
-
-
-
- <a href="https://linkedin.com/in/kaxil" target="_blank" rel="noopener">Kaxil Naik</a>
-
- ,
-
-
- <a href="https://linkedin.com/in/vikramkoka" target="_blank" rel="noopener">Vikram Koka</a>
-
-
-
- </p>
+ <p class="box-event__blogpost--author">Rahul Vats</p>
- <p class="box-event__blogpost--description">We're proud to announce that Apache Airflow 3.0.0 has been released.</p>
+ <p class="box-event__blogpost--description">Apache Airflow 3.2.0 introduces Asset partitioning for granular pipeline orchestration, multi-team deployments for enterprise scale, synchronous deadline alert callbacks, and continued progress toward full Task SDK separation.</p>
<div class="mt-auto">
- <a href="/blog/airflow-three-point-oh-is-here/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-3.2.0/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -821,8 +791,8 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -897,14 +867,14 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -928,7 +898,7 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -938,7 +908,7 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -1027,13 +997,13 @@ executor = 'LocalExecutor,KubernetesExecutor,my.custom.module.ExecutorClass:
<script defer src="/js/auto-render.min.js" integrity="sha512-0HzJcHCD+wBh9kNUUcm3DWH9IbNDfudsYyMD5EHwSuFK6aEsaa/UEPqqk4t0pm4bbmwR6A11yNsD7Q+nz6XF+Q==" crossorigin="anonymous"
onload='renderMathInElement(document.body, null);'>
</script>
- <script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+ <script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-2.2.0/index.html b/blog/airflow-2.2.0/index.html
index 0cc01d2278..6d889c3afc 100644
--- a/blog/airflow-2.2.0/index.html
+++ b/blog/airflow-2.2.0/index.html
@@ -31,14 +31,14 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2021-10-11T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Release">
<meta property="og:image" content="/images/feature-image.png">
<meta itemprop="name" content="What's new in Apache Airflow 2.2.0">
<meta itemprop="description" content="We're proud to announce that Apache Airflow 2.2.0 has been released.">
<meta itemprop="datePublished" content="2021-10-11T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="658">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Release">
@@ -49,8 +49,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +58,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -89,8 +89,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +98,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +276,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +288,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +477,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -515,14 +491,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Mon, Oct 11, 2021</span>
+ <span class="blogpost-content__metadata--date">Mon, Oct 11, 2021</span>
</div>
- <p class="blogpost-content__metadata--title">What's new in Apache Airflow 2.2.0</p>
+ <h1 class="blogpost-content__metadata--title">What's new in Apache Airflow 2.2.0</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Jed Cunningham</span>
- <a href="https://github.com/jedcunningham/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/jedcunningham/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Jed Cunningham">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -530,7 +506,7 @@
</a>
- <a href="https://linkedin.com/in/jedidiah-cunningham/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/jedidiah-cunningham/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Jed Cunningham">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -678,12 +654,7 @@
<p class="box-event__blogpost--description">Apache Airflow 2.9.0 is here! Lots of exciting new Dataset and UI features/improvements this time around.</p>
<div class="mt-auto">
- <a href="/blog/airflow-2.9.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-2.9.0/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -715,12 +686,7 @@
<p class="box-event__blogpost--description">Apache Airflow 2.7.0 has been released!</p>
<div class="mt-auto">
- <a href="/blog/airflow-2.7.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-2.7.0/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -740,8 +706,8 @@
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -816,14 +782,14 @@
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -847,7 +813,7 @@
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -857,7 +823,7 @@
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -936,13 +902,13 @@
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-2.3.0/index.html b/blog/airflow-2.3.0/index.html
index 155936cbd5..7859460b8b 100644
--- a/blog/airflow-2.3.0/index.html
+++ b/blog/airflow-2.3.0/index.html
@@ -31,14 +31,14 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2022-04-30T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Release">
<meta property="og:image" content="/images/feature-image.png">
<meta itemprop="name" content="Apache Airflow 2.3.0 is here">
<meta itemprop="description" content="We're proud to announce that Apache Airflow 2.3.0 has been released.">
<meta itemprop="datePublished" content="2022-04-30T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="708">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Release">
@@ -49,8 +49,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +58,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -89,8 +89,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +98,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +276,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +288,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +477,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -515,14 +491,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Sat, Apr 30, 2022</span>
+ <span class="blogpost-content__metadata--date">Sat, Apr 30, 2022</span>
</div>
- <p class="blogpost-content__metadata--title">Apache Airflow 2.3.0 is here</p>
+ <h1 class="blogpost-content__metadata--title">Apache Airflow 2.3.0 is here</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Ephraim Anierobi</span>
- <a href="https://github.com/ephraimbuddy/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/ephraimbuddy/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Ephraim Anierobi">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -530,7 +506,7 @@
</a>
- <a href="https://linkedin.com/in/ephraimanierobi/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/ephraimanierobi/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Ephraim Anierobi">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -724,12 +700,7 @@ Sade’s “Smooth Operator”. Enjoy!</li>
<p class="box-event__blogpost--description">Introducing Apache Airflow 2.8.0: Enhanced with New Features and Significant Improvements</p>
<div class="mt-auto">
- <a href="/blog/airflow-2.8.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-2.8.0/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -745,28 +716,40 @@ Sade’s “Smooth Operator”. Enjoy!</li>
<div class="tags-container">
+ <a class="tag" href="/blog/tags/community/">Community</a>
+
+
+
<a class="tag" href="/blog/tags/release/">Release</a>
</div>
- <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Thu, Sep 25, 2025</span>
+ <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Tue, Apr 14, 2026</span>
</div>
<p class="box-event__blogpost--header">
- <a href="/blog/airflow-3.1.0/">
- Apache Airflow 3.1.0: Human-Centered Workflows
+ <a href="/blog/common-ai-provider/">
+ Introducing the Common AI Provider: LLM and AI Agent Support for Apache Airflow
</a>
</p>
- <p class="box-event__blogpost--author">Kaxil Naik</p>
+ <p class="box-event__blogpost--author">
+
+
+
+ <a href="https://linkedin.com/in/kaxil" target="_blank" rel="noopener">Kaxil Naik</a>
+
+ ,
+
+
+ <a href="https://linkedin.com/in/pavan-kumar-gopidesu" target="_blank" rel="noopener">Pavan Kumar Gopidesu</a>
+
+
+
+ </p>
- <p class="box-event__blogpost--description">Apache Airflow 3.1.0 introduces Human-in-the-Loop workflows, 17-language internationalization, deadline alerts, and React plugin system for data orchestration teams.</p>
+ <p class="box-event__blogpost--description">The Common AI Provider adds LLM and AI agent operators to Apache Airflow with 6 operators, 5 toolsets, and 20+ model providers in one package.</p>
<div class="mt-auto">
- <a href="/blog/airflow-3.1.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/common-ai-provider/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -786,8 +769,8 @@ Sade’s “Smooth Operator”. Enjoy!</li>
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -862,14 +845,14 @@ Sade’s “Smooth Operator”. Enjoy!</li>
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -893,7 +876,7 @@ Sade’s “Smooth Operator”. Enjoy!</li>
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -903,7 +886,7 @@ Sade’s “Smooth Operator”. Enjoy!</li>
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -982,13 +965,13 @@ Sade’s “Smooth Operator”. Enjoy!</li>
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-2.4.0/index.html b/blog/airflow-2.4.0/index.html
index 371a48782d..cddd418656 100644
--- a/blog/airflow-2.4.0/index.html
+++ b/blog/airflow-2.4.0/index.html
@@ -31,14 +31,14 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2022-09-19T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Release">
<meta property="og:image" content="/images/feature-image.png">
<meta itemprop="name" content="Apache Airflow 2.4.0: That Data Aware Release">
<meta itemprop="description" content="We're proud to announce that Apache Airflow 2.4.0 has been released with many exciting improvements.">
<meta itemprop="datePublished" content="2022-09-19T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="849">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Release">
@@ -49,8 +49,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +58,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -89,8 +89,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +98,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +276,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +288,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +477,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -515,14 +491,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Mon, Sep 19, 2022</span>
+ <span class="blogpost-content__metadata--date">Mon, Sep 19, 2022</span>
</div>
- <p class="blogpost-content__metadata--title">Apache Airflow 2.4.0: That Data Aware Release</p>
+ <h1 class="blogpost-content__metadata--title">Apache Airflow 2.4.0: That Data Aware Release</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Ash Berlin-Taylor</span>
- <a href="https://github.com/ashberlin/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/ashberlin/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Ash Berlin-Taylor">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -530,7 +506,7 @@
</a>
- <a href="https://linkedin.com/in/ashberlin-taylor/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/ashberlin-taylor/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Ash Berlin-Taylor">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -727,12 +703,7 @@
<p class="box-event__blogpost--description">We're proud to announce that Apache Airflow 2.5.0 has been released with many quality of life changes.</p>
<div class="mt-auto">
- <a href="/blog/airflow-2.5.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-2.5.0/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -764,12 +735,7 @@
<p class="box-event__blogpost--description">We're proud to announce that Apache Airflow 2.0.0 has been released.</p>
<div class="mt-auto">
- <a href="/blog/airflow-two-point-oh-is-here/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-two-point-oh-is-here/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -789,8 +755,8 @@
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -865,14 +831,14 @@
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -896,7 +862,7 @@
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -906,7 +872,7 @@
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -985,13 +951,13 @@
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-2.5.0/index.html b/blog/airflow-2.5.0/index.html
index 8ac39992e4..dbc4556e50 100644
--- a/blog/airflow-2.5.0/index.html
+++ b/blog/airflow-2.5.0/index.html
@@ -31,14 +31,14 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2022-12-02T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Release">
<meta property="og:image" content="/images/feature-image.png">
<meta itemprop="name" content="Apache Airflow 2.5.0: Tick-Tock">
<meta itemprop="description" content="We're proud to announce that Apache Airflow 2.5.0 has been released with many quality of life changes.">
<meta itemprop="datePublished" content="2022-12-02T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="391">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Release">
@@ -49,8 +49,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +58,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -89,8 +89,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +98,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +276,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +288,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +477,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -515,14 +491,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Fri, Dec 2, 2022</span>
+ <span class="blogpost-content__metadata--date">Fri, Dec 2, 2022</span>
</div>
- <p class="blogpost-content__metadata--title">Apache Airflow 2.5.0: Tick-Tock</p>
+ <h1 class="blogpost-content__metadata--title">Apache Airflow 2.5.0: Tick-Tock</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Ash Berlin-Taylor</span>
- <a href="https://github.com/ashberlin/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/ashberlin/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Ash Berlin-Taylor">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -530,7 +506,7 @@
</a>
- <a href="https://linkedin.com/in/ashberlin-taylor/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/ashberlin-taylor/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Ash Berlin-Taylor">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -658,12 +634,7 @@ c. Everything runs in one process, so you can put a breakpoint in your IDE, and
<p class="box-event__blogpost--description">We're proud to announce that Apache Airflow 2.4.0 has been released with many exciting improvements.</p>
<div class="mt-auto">
- <a href="/blog/airflow-2.4.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-2.4.0/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -695,12 +666,7 @@ c. Everything runs in one process, so you can put a breakpoint in your IDE, and
<p class="box-event__blogpost--description">We're proud to announce that Apache Airflow 2.0.0 has been released.</p>
<div class="mt-auto">
- <a href="/blog/airflow-two-point-oh-is-here/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-two-point-oh-is-here/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -720,8 +686,8 @@ c. Everything runs in one process, so you can put a breakpoint in your IDE, and
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -796,14 +762,14 @@ c. Everything runs in one process, so you can put a breakpoint in your IDE, and
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -827,7 +793,7 @@ c. Everything runs in one process, so you can put a breakpoint in your IDE, and
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -837,7 +803,7 @@ c. Everything runs in one process, so you can put a breakpoint in your IDE, and
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -916,13 +882,13 @@ c. Everything runs in one process, so you can put a breakpoint in your IDE, and
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-2.6.0/index.html b/blog/airflow-2.6.0/index.html
index 61c03abf0f..bacab21eb0 100644
--- a/blog/airflow-2.6.0/index.html
+++ b/blog/airflow-2.6.0/index.html
@@ -31,14 +31,14 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2023-04-30T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Release">
<meta property="og:image" content="/images/feature-image.png">
<meta itemprop="name" content="what's new in Apache Airflow 2.6.0">
<meta itemprop="description" content="Apache Airflow 2.6.0 has been released!">
<meta itemprop="datePublished" content="2023-04-30T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="535">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Release">
@@ -49,8 +49,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +58,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -89,8 +89,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +98,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +276,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +288,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +477,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -515,14 +491,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Sun, Apr 30, 2023</span>
+ <span class="blogpost-content__metadata--date">Sun, Apr 30, 2023</span>
</div>
- <p class="blogpost-content__metadata--title">what's new in Apache Airflow 2.6.0</p>
+ <h1 class="blogpost-content__metadata--title">what's new in Apache Airflow 2.6.0</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Jed Cunningham</span>
- <a href="https://github.com/jedcunningham/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/jedcunningham/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Jed Cunningham">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -530,7 +506,7 @@
</a>
- <a href="https://linkedin.com/in/jedidiah-cunningham/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/jedidiah-cunningham/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Jed Cunningham">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -682,12 +658,7 @@
<p class="box-event__blogpost--description">Apache Airflow 2.9.0 is here! Lots of exciting new Dataset and UI features/improvements this time around.</p>
<div class="mt-auto">
- <a href="/blog/airflow-2.9.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-2.9.0/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -719,12 +690,7 @@
<p class="box-event__blogpost--description">Apache Airflow 2.7.0 has been released!</p>
<div class="mt-auto">
- <a href="/blog/airflow-2.7.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-2.7.0/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -744,8 +710,8 @@
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -820,14 +786,14 @@
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -851,7 +817,7 @@
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -861,7 +827,7 @@
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -940,13 +906,13 @@
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-2.7.0/index.html b/blog/airflow-2.7.0/index.html
index 2547614f25..e2ad73ad5b 100644
--- a/blog/airflow-2.7.0/index.html
+++ b/blog/airflow-2.7.0/index.html
@@ -31,14 +31,14 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2023-08-18T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Release">
<meta property="og:image" content="/images/feature-image.png">
<meta itemprop="name" content="Apache Airflow 2.7.0 is here">
<meta itemprop="description" content="Apache Airflow 2.7.0 has been released!">
<meta itemprop="datePublished" content="2023-08-18T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="816">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Release">
@@ -49,8 +49,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +58,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -89,8 +89,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +98,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +276,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +288,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +477,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -515,14 +491,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Fri, Aug 18, 2023</span>
+ <span class="blogpost-content__metadata--date">Fri, Aug 18, 2023</span>
</div>
- <p class="blogpost-content__metadata--title">Apache Airflow 2.7.0 is here</p>
+ <h1 class="blogpost-content__metadata--title">Apache Airflow 2.7.0 is here</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Jed Cunningham</span>
- <a href="https://github.com/jedcunningham/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/jedcunningham/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Jed Cunningham">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -530,7 +506,7 @@
</a>
- <a href="https://linkedin.com/in/jedidiah-cunningham/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/jedidiah-cunningham/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Jed Cunningham">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -685,12 +661,7 @@ The following providers have been moved and require certain minimum providers ve
<p class="box-event__blogpost--description">Apache Airflow 2.9.0 is here! Lots of exciting new Dataset and UI features/improvements this time around.</p>
<div class="mt-auto">
- <a href="/blog/airflow-2.9.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-2.9.0/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -722,12 +693,7 @@ The following providers have been moved and require certain minimum providers ve
<p class="box-event__blogpost--description">Apache Airflow 2.6.0 has been released!</p>
<div class="mt-auto">
- <a href="/blog/airflow-2.6.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-2.6.0/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -747,8 +713,8 @@ The following providers have been moved and require certain minimum providers ve
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -823,14 +789,14 @@ The following providers have been moved and require certain minimum providers ve
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -854,7 +820,7 @@ The following providers have been moved and require certain minimum providers ve
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -864,7 +830,7 @@ The following providers have been moved and require certain minimum providers ve
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -943,13 +909,13 @@ The following providers have been moved and require certain minimum providers ve
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-2.8.0/index.html b/blog/airflow-2.8.0/index.html
index d7f30f7279..f3325a87ca 100644
--- a/blog/airflow-2.8.0/index.html
+++ b/blog/airflow-2.8.0/index.html
@@ -31,14 +31,14 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2023-12-15T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Release">
<meta property="og:image" content="/images/feature-image.png">
<meta itemprop="name" content="Apache Airflow 2.8.0 is here">
<meta itemprop="description" content="Introducing Apache Airflow 2.8.0: Enhanced with New Features and Significant Improvements">
<meta itemprop="datePublished" content="2023-12-15T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="730">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Release">
@@ -49,8 +49,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +58,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -89,8 +89,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +98,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +276,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +288,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +477,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -515,14 +491,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Fri, Dec 15, 2023</span>
+ <span class="blogpost-content__metadata--date">Fri, Dec 15, 2023</span>
</div>
- <p class="blogpost-content__metadata--title">Apache Airflow 2.8.0 is here</p>
+ <h1 class="blogpost-content__metadata--title">Apache Airflow 2.8.0 is here</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Ephraim Anierobi</span>
- <a href="https://github.com/ephraimbuddy/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/ephraimbuddy/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Ephraim Anierobi">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -530,7 +506,7 @@
</a>
- <a href="https://linkedin.com/in/ephraimanierobi/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/ephraimanierobi/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Ephraim Anierobi">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -703,12 +679,7 @@ We care for your security, and “secure by default” is one of the thi
<p class="box-event__blogpost--description">We're proud to announce that Apache Airflow 2.3.0 has been released.</p>
<div class="mt-auto">
- <a href="/blog/airflow-2.3.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-2.3.0/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -724,28 +695,40 @@ We care for your security, and “secure by default” is one of the thi
<div class="tags-container">
+ <a class="tag" href="/blog/tags/community/">Community</a>
+
+
+
<a class="tag" href="/blog/tags/release/">Release</a>
</div>
- <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Thu, Sep 25, 2025</span>
+ <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Tue, Apr 14, 2026</span>
</div>
<p class="box-event__blogpost--header">
- <a href="/blog/airflow-3.1.0/">
- Apache Airflow 3.1.0: Human-Centered Workflows
+ <a href="/blog/common-ai-provider/">
+ Introducing the Common AI Provider: LLM and AI Agent Support for Apache Airflow
</a>
</p>
- <p class="box-event__blogpost--author">Kaxil Naik</p>
+ <p class="box-event__blogpost--author">
+
+
+
+ <a href="https://linkedin.com/in/kaxil" target="_blank" rel="noopener">Kaxil Naik</a>
+
+ ,
+
+
+ <a href="https://linkedin.com/in/pavan-kumar-gopidesu" target="_blank" rel="noopener">Pavan Kumar Gopidesu</a>
+
+
+
+ </p>
- <p class="box-event__blogpost--description">Apache Airflow 3.1.0 introduces Human-in-the-Loop workflows, 17-language internationalization, deadline alerts, and React plugin system for data orchestration teams.</p>
+ <p class="box-event__blogpost--description">The Common AI Provider adds LLM and AI agent operators to Apache Airflow with 6 operators, 5 toolsets, and 20+ model providers in one package.</p>
<div class="mt-auto">
- <a href="/blog/airflow-3.1.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/common-ai-provider/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -765,8 +748,8 @@ We care for your security, and “secure by default” is one of the thi
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -841,14 +824,14 @@ We care for your security, and “secure by default” is one of the thi
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -872,7 +855,7 @@ We care for your security, and “secure by default” is one of the thi
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -882,7 +865,7 @@ We care for your security, and “secure by default” is one of the thi
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -961,13 +944,13 @@ We care for your security, and “secure by default” is one of the thi
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-2.9.0/index.html b/blog/airflow-2.9.0/index.html
index e361ef3393..81189dfa48 100644
--- a/blog/airflow-2.9.0/index.html
+++ b/blog/airflow-2.9.0/index.html
@@ -31,14 +31,14 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2024-04-08T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Release">
<meta property="og:image" content="/images/feature-image.png">
<meta itemprop="name" content="Apache Airflow 2.9.0: Dataset and UI Improvements">
<meta itemprop="description" content="Apache Airflow 2.9.0 is here! Lots of exciting new Dataset and UI features/improvements this time around.">
<meta itemprop="datePublished" content="2024-04-08T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="1041">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Release">
@@ -49,8 +49,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +58,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -89,8 +89,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +98,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +276,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +288,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +477,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -515,14 +491,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Mon, Apr 8, 2024</span>
+ <span class="blogpost-content__metadata--date">Mon, Apr 8, 2024</span>
</div>
- <p class="blogpost-content__metadata--title">Apache Airflow 2.9.0: Dataset and UI Improvements</p>
+ <h1 class="blogpost-content__metadata--title">Apache Airflow 2.9.0: Dataset and UI Improvements</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Jed Cunningham</span>
- <a href="https://github.com/jedcunningham/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/jedcunningham/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Jed Cunningham">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -530,7 +506,7 @@
</a>
- <a href="https://linkedin.com/in/jedidiah-cunningham/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/jedidiah-cunningham/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Jed Cunningham">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -744,12 +720,7 @@ xcom_objectstorage_compression = gzip$$</div><p>See the <a href="https://airflow
<p class="box-event__blogpost--description">Apache Airflow 2.7.0 has been released!</p>
<div class="mt-auto">
- <a href="/blog/airflow-2.7.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-2.7.0/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -781,12 +752,7 @@ xcom_objectstorage_compression = gzip$$</div><p>See the <a href="https://airflow
<p class="box-event__blogpost--description">Apache Airflow 2.6.0 has been released!</p>
<div class="mt-auto">
- <a href="/blog/airflow-2.6.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-2.6.0/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -806,8 +772,8 @@ xcom_objectstorage_compression = gzip$$</div><p>See the <a href="https://airflow
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -882,14 +848,14 @@ xcom_objectstorage_compression = gzip$$</div><p>See the <a href="https://airflow
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -913,7 +879,7 @@ xcom_objectstorage_compression = gzip$$</div><p>See the <a href="https://airflow
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -923,7 +889,7 @@ xcom_objectstorage_compression = gzip$$</div><p>See the <a href="https://airflow
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -1012,13 +978,13 @@ xcom_objectstorage_compression = gzip$$</div><p>See the <a href="https://airflow
<script defer src="/js/auto-render.min.js" integrity="sha512-0HzJcHCD+wBh9kNUUcm3DWH9IbNDfudsYyMD5EHwSuFK6aEsaa/UEPqqk4t0pm4bbmwR6A11yNsD7Q+nz6XF+Q==" crossorigin="anonymous"
onload='renderMathInElement(document.body, null);'>
</script>
- <script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+ <script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-3.1.0/index.html b/blog/airflow-3.1.0/index.html
index a5c95b8e32..84eac91d67 100644
--- a/blog/airflow-3.1.0/index.html
+++ b/blog/airflow-3.1.0/index.html
@@ -31,14 +31,14 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2025-09-25T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Release">
<meta property="og:image" content="/blog/airflow-3.1.0/images/3.1.0.jpg">
<meta itemprop="name" content="Apache Airflow 3.1.0: Human-Centered Workflows">
<meta itemprop="description" content="Apache Airflow 3.1.0 introduces Human-in-the-Loop workflows, 17-language internationalization, deadline alerts, and React plugin system for data orchestration teams.">
<meta itemprop="datePublished" content="2025-09-25T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="1583">
<meta itemprop="image" content="/blog/airflow-3.1.0/images/3.1.0.jpg">
<meta itemprop="keywords" content="Release">
@@ -49,8 +49,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +58,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -89,8 +89,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +98,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +276,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +288,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +477,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -515,14 +491,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Thu, Sep 25, 2025</span>
+ <span class="blogpost-content__metadata--date">Thu, Sep 25, 2025</span>
</div>
- <p class="blogpost-content__metadata--title">Apache Airflow 3.1.0: Human-Centered Workflows</p>
+ <h1 class="blogpost-content__metadata--title">Apache Airflow 3.1.0: Human-Centered Workflows</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Kaxil Naik</span>
- <a href="https://github.com/kaxil/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/kaxil/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Kaxil Naik">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -530,7 +506,7 @@
</a>
- <a href="https://linkedin.com/in/kaxil/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/kaxil/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Kaxil Naik">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -791,15 +767,19 @@ human-centered. We can’t wait to see what you build with it!</p>
<div class="tags-container">
+ <a class="tag" href="/blog/tags/community/">Community</a>
+
+
+
<a class="tag" href="/blog/tags/release/">Release</a>
</div>
- <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Tue, Apr 22, 2025</span>
+ <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Tue, Apr 14, 2026</span>
</div>
<p class="box-event__blogpost--header">
- <a href="/blog/airflow-three-point-oh-is-here/">
- Apache Airflow® 3 is Generally Available!
+ <a href="/blog/common-ai-provider/">
+ Introducing the Common AI Provider: LLM and AI Agent Support for Apache Airflow
</a>
</p>
@@ -812,20 +792,15 @@ human-centered. We can’t wait to see what you build with it!</p>
,
- <a href="https://linkedin.com/in/vikramkoka" target="_blank" rel="noopener">Vikram Koka</a>
+ <a href="https://linkedin.com/in/pavan-kumar-gopidesu" target="_blank" rel="noopener">Pavan Kumar Gopidesu</a>
</p>
- <p class="box-event__blogpost--description">We're proud to announce that Apache Airflow 3.0.0 has been released.</p>
+ <p class="box-event__blogpost--description">The Common AI Provider adds LLM and AI agent operators to Apache Airflow with 6 operators, 5 toolsets, and 20+ model providers in one package.</p>
<div class="mt-auto">
- <a href="/blog/airflow-three-point-oh-is-here/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/common-ai-provider/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -845,24 +820,19 @@ human-centered. We can’t wait to see what you build with it!</p>
</div>
- <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Thu, Aug 8, 2024</span>
+ <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Tue, Apr 7, 2026</span>
</div>
<p class="box-event__blogpost--header">
- <a href="/blog/airflow-2.10.0/">
- Apache Airflow 2.10.0 is here
+ <a href="/blog/airflow-3.2.0/">
+ Apache Airflow 3.2.0: Data-Aware Workflows at Scale
</a>
</p>
- <p class="box-event__blogpost--author">Utkarsh Sharma</p>
+ <p class="box-event__blogpost--author">Rahul Vats</p>
- <p class="box-event__blogpost--description">Apache Airflow 2.10.0 is a game-changer, with powerful Dataset improvements and the groundbreaking Hybrid Executor, set to redefine your workflow capabilities!</p>
+ <p class="box-event__blogpost--description">Apache Airflow 3.2.0 introduces Asset partitioning for granular pipeline orchestration, multi-team deployments for enterprise scale, synchronous deadline alert callbacks, and continued progress toward full Task SDK separation.</p>
<div class="mt-auto">
- <a href="/blog/airflow-2.10.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-3.2.0/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -882,8 +852,8 @@ human-centered. We can’t wait to see what you build with it!</p>
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -958,14 +928,14 @@ human-centered. We can’t wait to see what you build with it!</p>
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -989,7 +959,7 @@ human-centered. We can’t wait to see what you build with it!</p>
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -999,7 +969,7 @@ human-centered. We can’t wait to see what you build with it!</p>
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -1078,13 +1048,13 @@ human-centered. We can’t wait to see what you build with it!</p>
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-3.2.0/images/3.2.0.jpg b/blog/airflow-3.2.0/images/3.2.0.jpg
new file mode 100644
index 0000000000..de4a50335f
Binary files /dev/null and b/blog/airflow-3.2.0/images/3.2.0.jpg differ
diff --git a/blog/airflow-3.2.0/images/asset_partitioning.png b/blog/airflow-3.2.0/images/asset_partitioning.png
new file mode 100644
index 0000000000..97d039b498
Binary files /dev/null and b/blog/airflow-3.2.0/images/asset_partitioning.png differ
diff --git a/blog/airflow-3.1.0/index.html b/blog/airflow-3.2.0/index.html
similarity index 63%
copy from blog/airflow-3.1.0/index.html
copy to blog/airflow-3.2.0/index.html
index a5c95b8e32..a2c6511b34 100644
--- a/blog/airflow-3.1.0/index.html
+++ b/blog/airflow-3.2.0/index.html
@@ -23,24 +23,24 @@
<link rel="icon" type="image/png" href="/favicons/android-144x144.png" sizes="144x144">
<link rel="icon" type="image/png" href="/favicons/android-192x192.png" sizes="192x192">
-<title>Apache Airflow 3.1.0: Human-Centered Workflows | Apache Airflow</title><meta property="og:url" content="/blog/airflow-3.1.0/">
+<title>Apache Airflow 3.2.0: Data-Aware Workflows at Scale | Apache Airflow</title><meta property="og:url" content="/blog/airflow-3.2.0/">
<meta property="og:site_name" content="Apache Airflow">
- <meta property="og:title" content="Apache Airflow 3.1.0: Human-Centered Workflows">
- <meta property="og:description" content="Apache Airflow 3.1.0 introduces Human-in-the-Loop workflows, 17-language internationalization, deadline alerts, and React plugin system for data orchestration teams.">
+ <meta property="og:title" content="Apache Airflow 3.2.0: Data-Aware Workflows at Scale">
+ <meta property="og:description" content="Apache Airflow 3.2.0 introduces Asset partitioning for granular pipeline orchestration, multi-team deployments for enterprise scale, synchronous deadline alert callbacks, and continued progress toward full Task SDK separation.">
<meta property="og:locale" content="en">
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
- <meta property="article:published_time" content="2025-09-25T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:published_time" content="2026-04-07T00:00:00+00:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Release">
- <meta property="og:image" content="/blog/airflow-3.1.0/images/3.1.0.jpg">
-
- <meta itemprop="name" content="Apache Airflow 3.1.0: Human-Centered Workflows">
- <meta itemprop="description" content="Apache Airflow 3.1.0 introduces Human-in-the-Loop workflows, 17-language internationalization, deadline alerts, and React plugin system for data orchestration teams.">
- <meta itemprop="datePublished" content="2025-09-25T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
- <meta itemprop="wordCount" content="1583">
- <meta itemprop="image" content="/blog/airflow-3.1.0/images/3.1.0.jpg">
+ <meta property="og:image" content="/blog/airflow-3.2.0/images/3.2.0.jpg">
+
+ <meta itemprop="name" content="Apache Airflow 3.2.0: Data-Aware Workflows at Scale">
+ <meta itemprop="description" content="Apache Airflow 3.2.0 introduces Asset partitioning for granular pipeline orchestration, multi-team deployments for enterprise scale, synchronous deadline alert callbacks, and continued progress toward full Task SDK separation.">
+ <meta itemprop="datePublished" content="2026-04-07T00:00:00+00:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
+ <meta itemprop="wordCount" content="1619">
+ <meta itemprop="image" content="/blog/airflow-3.2.0/images/3.2.0.jpg">
<meta itemprop="keywords" content="Release">
@@ -49,8 +49,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +58,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -68,7 +68,7 @@
crossorigin="anonymous"></script>
-<meta name="description" content="Apache Airflow 3.1.0 introduces Human-in-the-Loop workflows, 17-language internationalization, deadline alerts, and React plugin system for data orchestration teams." />
+<meta name="description" content="Apache Airflow 3.2.0 introduces Asset partitioning for granular pipeline orchestration, multi-team deployments for enterprise scale, synchronous deadline alert callbacks, and continued progress toward full Task SDK separation." />
<script>
@@ -89,8 +89,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +98,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +276,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +288,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +477,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -515,14 +491,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Thu, Sep 25, 2025</span>
+ <span class="blogpost-content__metadata--date">Tue, Apr 7, 2026</span>
</div>
- <p class="blogpost-content__metadata--title">Apache Airflow 3.1.0: Human-Centered Workflows</p>
+ <h1 class="blogpost-content__metadata--title">Apache Airflow 3.2.0: Data-Aware Workflows at Scale</h1>
<div class="blogpost-content__metadata--author">
- <span class="blogpost-content__metadata--author-name">Kaxil Naik</span>
+ <span class="blogpost-content__metadata--author-name">Rahul Vats</span>
- <a href="https://github.com/kaxil/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/vatsrahul1001/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Rahul Vats">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -530,7 +506,7 @@
</a>
- <a href="https://linkedin.com/in/kaxil/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/vats-rahul/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Rahul Vats">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -545,182 +521,211 @@
</div>
- <p class="blogpost-content__metadata--description">Apache Airflow 3.1.0 introduces Human-in-the-Loop workflows, 17-language internationalization, deadline alerts, and React plugin system for data orchestration teams.</p>
+ <p class="blogpost-content__metadata--description">Apache Airflow 3.2.0 introduces Asset partitioning for granular pipeline orchestration, multi-team deployments for enterprise scale, synchronous deadline alert callbacks, and continued progress toward full Task SDK separation.</p>
</div>
<div class="markdown-content">
- <p>We are thrilled to announce the release of <strong>Apache Airflow 3.1.0</strong>, an update that puts humans at the center of data
-workflows. This release introduces powerful new capabilities for human decision-making in automated
-processes, comprehensive internationalization support, and significant developer experience improvements.</p>
+ <p>We’re proud to announce the release of <strong>Apache Airflow 3.2.0</strong>! Airflow 3.1 puts humans at the center of automated workflows. 3.2 brings that same precision to data: Asset partitioning for granular pipeline orchestration, multi-team deployments for enterprise scale, synchronous deadline alert callbacks, and continued progress toward full Task SDK separation.</p>
<p><strong>Details</strong>:</p>
-<p>📦 PyPI: <a href="https://pypi.org/project/apache-airflow/3.1.0/">https://pypi.org/project/apache-airflow/3.1.0/</a> <br>
-📚 Core Airflow Docs: <a href="https://airflow.apache.org/docs/apache-airflow/3.1.0/">https://airflow.apache.org/docs/apache-airflow/3.1.0/</a> <br>
-📚 Task SDK Docs: <a href="https://airflow.apache.org/docs/task-sdk/1.1.0/">https://airflow.apache.org/docs/task-sdk/1.1.0/</a> <br>
-🛠️ Release Notes: <a href="https://airflow.apache.org/docs/apache-airflow/3.1.0/release_notes.html">https://airflow.apache.org/docs/apache-airflow/3.1.0/release_notes.html</a> <br>
-🪶 Sources: <a href="https://airflow.apache.org/docs/apache-airflow/3.1.0/installation/installing-from-sources.html">https://airflow.apache.org/docs/apache-airflow/3.1.0/installation/installing-from-sources.html</a> <br>
-🚏 Constraints: <a href="https://github.com/apache/airflow/tree/constraints-3.1.0">https://github.com/apache/airflow/tree/constraints-3.1.0</a></p>
-<h2 id="-human-in-the-loop-hitl-when-automation-meets-human-judgment">🤝 Human-in-the-Loop (HITL): When Automation Meets Human Judgment</h2>
-<p>This powerful capability bridges the gap between automated processes and human expertise, making Airflow invaluable for:</p>
-<p><img src="/blog/airflow-3.1.0/images/hitl.gif" alt="Human-in-the-Loop HITL"></p>
+<p>📦 PyPI: <a href="https://pypi.org/project/apache-airflow/3.2.0/">https://pypi.org/project/apache-airflow/3.2.0/</a> <br>
+📚 Docs: <a href="https://airflow.apache.org/docs/apache-airflow/3.2.0/">https://airflow.apache.org/docs/apache-airflow/3.2.0/</a> <br>
+🛠️ Release Notes: <a href="https://airflow.apache.org/docs/apache-airflow/3.2.0/release_notes.html">https://airflow.apache.org/docs/apache-airflow/3.2.0/release_notes.html</a> <br>
+🐳 Docker Image: <code>docker pull apache/airflow:3.2.0</code> <br>
+🚏 Constraints: <a href="https://github.com/apache/airflow/tree/constraints-3.2.0">https://github.com/apache/airflow/tree/constraints-3.2.0</a></p>
+<h1 id="-asset-partitioning-aip-76-only-the-right-work-gets-triggered">🗂️ Asset Partitioning (AIP-76): Only the Right Work Gets Triggered</h1>
+<p>Asset partitioning has been one of the most requested additions to data-aware scheduling. If you work with date-partitioned S3 paths, Hive table partitions, BigQuery partitions, or really any partitioned data store, you’ve dealt with this: An upstream task updates one partition, and every downstream Dag fires regardless of which slice actually changed. It’s wasteful, and for large deployments it creates real operational noise.</p>
+<p>Asset partitioning in 3.2 makes this granular. Downstream Dags trigger only when the specific partition they care about gets updated. It’s the biggest change to data-aware scheduling since Assets were introduced, and it turns partition-driven orchestration into something Airflow handles natively rather than something you work around.</p>
+<p><img src="/blog/airflow-3.2.0/images/asset_partitioning.png" alt="Asset Partitioning"></p>
+<h2 id="key-capabilities">Key Capabilities</h2>
<ul>
-<li><strong>AI/ML Model Validation</strong>: Pause inference pipelines for human review of model outputs</li>
-<li><strong>Content Moderation</strong>: Route content through human reviewers before publication</li>
-<li><strong>Approval Workflows</strong>: Require manager approval for sensitive operations</li>
-<li><strong>Data Quality Gates</strong>: Allow data stewards to validate critical datasets</li>
+<li><strong>Partition-driven scheduling</strong>: Dags trigger on specific partition updates, not every asset change</li>
+<li><strong>CronPartitionTimetable</strong>: Schedule Dags against partitions using cron expressions. Also available in the Task SDK</li>
+<li><strong>Backfill for partitioned Dags</strong>: Backfill historical partitions without re-triggering everything downstream (#61464)</li>
+<li><strong>Multi-asset partitions</strong>: A single Dag can listen for partitions across multiple assets, which matters when your downstream work depends on several sources aligning (#60577)</li>
</ul>
-<p><strong>HITL</strong> tasks pause in a deferred state while presenting intuitive web forms in the Airflow UI. Users with appropriate roles can review context data, DAG parameters, and XCom values before making informed decisions.</p>
-<h2 id="example-code">Example Code:</h2>
-<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">airflow.sdk</span> <span class="kn">import</span> <span class="n">DAG</span>
-</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">airflow.providers.standard.operators.hitl</span> <span class="kn">import</span> <span class="n">HITLOperator</span>
+<p>For more advanced use cases, there are temporal and range partition mappers (#61522, #55247) for mapping time ranges and value ranges to partition keys, a partition key field on Dag run references (#61725) so you can inspect exactly which partition triggered a run, and PartitionedAssetTimetable for full control over how partition events from multiple assets get resolved into a unified trigger.</p>
+<p><strong>Example</strong>: Three upstream ingestion Dags each write to a separate asset on an hourly cadence. The downstream Dag only triggers when all three have updated the same hourly partition. Since the three assets don’t share a partition key natively, a mapper resolves them into a common key.</p>
+<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">annotations</span>
</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="k">with</span> <span class="n">DAG</span><span class="p">(</span><span class="s2">"content_moderation"</span><span class="p">,</span> <span class="n">schedule</span><span class="o">=</span><span class="s2">"@daily"</span><span class="p">)</span> <span class="k">as</span> <span class="n">dag</span><span class="p">:</span>
-</span></span><span class="line"><span class="cl"> <span class="n">moderate_content</span> <span class="o">=</span> <span class="n">HITLOperator</span><span class="p">(</span>
-</span></span><span class="line"><span class="cl"> <span class="n">task_id</span><span class="o">=</span><span class="s2">"review_content"</span><span class="p">,</span>
-</span></span><span class="line"><span class="cl"> <span class="n">message</span><span class="o">=</span><span class="s2">"Please review this content for publication"</span><span class="p">,</span>
-</span></span><span class="line"><span class="cl"> <span class="n">data_key</span><span class="o">=</span><span class="s2">"content_to_review"</span>
-</span></span><span class="line"><span class="cl"> <span class="p">)</span>
-</span></span></code></pre></div><h1 id="-ui-enhancements--performance">📊 UI Enhancements & Performance</h1>
-<h2 id="calendar-and-gantt-views-make-their-comeback">Calendar and Gantt Views Make Their Comeback</h2>
-<p>Remember those beloved Calendar and Gantt chart views from Airflow 2.x? They’re back, completely rebuilt for the
-modern React UI after being omitted from the 3.0 release.</p>
-<p>The new Calendar view is genuinely interactive with filtering capabilities that make it easy to drill down
-into specific time periods and dag states.</p>
-<p><img src="/blog/airflow-3.1.0/images/calendar.gif" alt="Calendar View"></p>
-<p>The Gantt chart is now integrated directly into the grid view and renders much faster than the old
-version, giving you that timeline perspective without the performance headaches.</p>
-<p><img src="/blog/airflow-3.1.0/images/gantt.png" alt="Gantt View"></p>
-<h2 id="theme-updates-that-actually-matter">Theme Updates That Actually Matter</h2>
-<p>We’ve refreshed the color palette using modern design principles, making the UI more consistent, professional
-and most of all taken a careful look at contrast ratios so the UI should be more accessible.</p>
-<h2 id="other-improvements">Other Improvements</h2>
-<p>We’ve added a lot more filtering options across the pages!</p>
-<p>Plus, you can now pin your <strong>favorite DAGs</strong> to keep them at the top of your list or to filter for them easily. It’s
-one of those small features that makes a huge difference when dealing with 100s of workflows.</p>
-<p><img src="/blog/airflow-3.1.0/images/favorite.png" alt="Favorite Dags in the UI">
-Credited to Volker Janz.</p>
+</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">airflow.sdk</span> <span class="kn">import</span> <span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">DAG</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">Asset</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">CronPartitionTimetable</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">PartitionedAssetTimetable</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">StartOfHourMapper</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">asset</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">task</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"><span class="p">)</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"><span class="n">team_a_player_stats</span> <span class="o">=</span> <span class="n">Asset</span><span class="p">(</span><span class="n">uri</span><span class="o">=</span><span class="s2">"file://incoming/player-stats/team_a.csv"</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s2">"team_a_player_stats"</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl"><span class="n">combined_player_stats</span> <span class="o">=</span> <span class="n">Asset</span><span class="p">(</span><span class="n">uri</span><span class="o">=</span><span class="s2">"file://curated/player-stats/combined.csv"</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s2">"combined_player_stats"</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"><span class="k">with</span> <span class="n">DAG</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">dag_id</span><span class="o">=</span><span class="s2">"ingest_team_a_player_stats"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">schedule</span><span class="o">=</span><span class="n">CronPartitionTimetable</span><span class="p">(</span><span class="s2">"0 * * * *"</span><span class="p">,</span> <span class="n">timezone</span><span class="o">=</span><span class="s2">"UTC"</span><span class="p">),</span>
+</span></span><span class="line"><span class="cl"> <span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s2">"player-stats"</span><span class="p">,</span> <span class="s2">"ingestion"</span><span class="p">],</span>
+</span></span><span class="line"><span class="cl"><span class="p">):</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"> <span class="nd">@task</span><span class="p">(</span><span class="n">outlets</span><span class="o">=</span><span class="p">[</span><span class="n">team_a_player_stats</span><span class="p">])</span>
+</span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="nf">ingest_team_a_stats</span><span class="p">():</span>
+</span></span><span class="line"><span class="cl"> <span class="s2">"""Materialize Team A player statistics for the current hourly partition."""</span>
+</span></span><span class="line"><span class="cl"> <span class="k">pass</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"> <span class="n">ingest_team_a_stats</span><span class="p">()</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"><span class="nd">@asset</span><span class="p">(</span><span class="n">schedule</span><span class="o">=</span><span class="n">CronPartitionTimetable</span><span class="p">(</span><span class="s2">"15 * * * *"</span><span class="p">,</span> <span class="n">timezone</span><span class="o">=</span><span class="s2">"UTC"</span><span class="p">))</span>
+</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">team_b_player_stats</span><span class="p">():</span>
+</span></span><span class="line"><span class="cl"> <span class="k">pass</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"><span class="k">with</span> <span class="n">DAG</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">dag_id</span><span class="o">=</span><span class="s2">"clean_and_combine_player_stats"</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">schedule</span><span class="o">=</span><span class="n">PartitionedAssetTimetable</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">assets</span><span class="o">=</span><span class="n">team_a_player_stats</span> <span class="o">&</span> <span class="n">team_b_player_stats</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"> <span class="n">default_partition_mapper</span><span class="o">=</span><span class="n">StartOfHourMapper</span><span class="p">(),</span>
+</span></span><span class="line"><span class="cl"> <span class="p">),</span>
+</span></span><span class="line"><span class="cl"> <span class="n">catchup</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+</span></span><span class="line"><span class="cl"><span class="p">):</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"> <span class="nd">@task</span><span class="p">(</span><span class="n">outlets</span><span class="o">=</span><span class="p">[</span><span class="n">combined_player_stats</span><span class="p">])</span>
+</span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="nf">combine_player_stats</span><span class="p">(</span><span class="n">dag_run</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+</span></span><span class="line"><span class="cl"> <span class="s2">"""Merge the aligned hourly partitions into a combined dataset."""</span>
+</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="n">dag_run</span><span class="o">.</span><span class="n">partition_key</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl">
+</span></span><span class="line"><span class="cl"> <span class="n">combine_player_stats</span><span class="p">()</span>
+</span></span></code></pre></div><p>See <a href="https://github.com/apache/airflow/blob/main/airflow-core/src/airflow/example_dags/example_asset_partition.py"><code>example_asset_partition.py</code></a> and the Task SDK API docs for <code>PartitionedAssetTimetable</code> and partition mappers.</p>
+<h1 id="-multi-team-deployments-aip-67-airflow-for-the-enterprise">🏢 Multi-Team Deployments (AIP-67): Airflow for the Enterprise</h1>
<blockquote>
-<p>📊 <strong>UI Development Milestone</strong>: Airflow 3.1.0 features <strong>5x more UI pull requests</strong> than the 2.10 release and <strong>50% more</strong> than Airflow 3.0, demonstrating the community’s commitment to user experience excellence.</p></blockquote>
-<h1 id="-deadline-alerts-proactive-workflow-monitoring">⏰ <strong>Deadline Alerts</strong>: Proactive Workflow Monitoring</h1>
-<p>Say goodbye to reactive monitoring. <strong>Deadline Alerts</strong> provide proactive notifications when DAG runs
-exceed time thresholds, helping ensure SLA compliance and timely completion of critical workflows.</p>
-<p>Configure monitoring by specifying:</p>
+<p>⚠️ <strong>Experimental</strong>: Multi-Team support is experimental in Airflow 3.2 and may change in future releases based on user feedback.</p></blockquote>
+<p>Airflow 3.2 introduces multi-team support, allowing organizations to run multiple isolated teams within a single Airflow deployment. Each team can have its own Dags, connections, variables, pools, and executors— enabling true resource and permission isolation without requiring separate Airflow instances per team.</p>
+<p>This is particularly valuable for platform teams that serve multiple data engineering or data science teams from shared infrastructure, while maintaining strong boundaries between teams’ resources and access.</p>
+<h2 id="key-capabilities-1">Key Capabilities</h2>
<ul>
-<li><strong>Reference point</strong>: DAG queued time, logical date, or fixed datetime</li>
-<li><strong>Interval</strong>: Time threshold (positive or negative)</li>
-<li><strong>Callback</strong>: Notifications via Airflow Notifiers or custom functions</li>
+<li><strong>Per-team resource isolation</strong>: Each team has its own Dags, connections, variables, and pools</li>
+<li><strong>Per-team executors</strong>: Different teams can use different executors (e.g. Celery, Kubernetes, Local, AWS ECS, etc.) and configure them separately — #57837, #57910</li>
+<li><strong>Team-scoped authorization</strong>: Keycloak and Simple auth managers support team-scoped access control (#61351, #61861)</li>
+<li><strong>Team-scoped secrets</strong>: Use <code>AIRFLOW_VAR__{TEAM}___{KEY}</code> environment variable or <code>AIRFLOW_CONN__<TEAM>___<CONN_ID></code> pattern for team-specific secrets (#62588)</li>
+<li><strong>CLI management</strong>: New CLI commands for managing teams (#55283)</li>
+<li><strong>UI team selector</strong>: Team selector in connection, variable, and pool create/edit forms (#60237, #60474, #61082)</li>
+<li><strong>Full API support</strong>: <code>team_name</code> field added to Connection, Variable, and Pool APIs (#59336, #57102, #60952)</li>
</ul>
-<h2 id="example-code-1">Example Code:</h2>
-<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">timedelta</span>
-</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">airflow.sdk.definitions.deadline</span> <span class="kn">import</span> <span class="n">DeadlineAlert</span><span class="p">,</span> <span class="n">DeadlineReference</span><span class="p">,</span> <span class="n">AsyncCallback</span>
-</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">airflow.providers.slack.notifications.slack_webhook</span> <span class="kn">import</span> <span class="n">SlackWebhookNotifier</span>
-</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="k">with</span> <span class="n">DAG</span><span class="p">(</span>
-</span></span><span class="line"><span class="cl"> <span class="s2">"critical_etl"</span><span class="p">,</span>
+<h2 id="enabling-multi-team">Enabling Multi-Team</h2>
+
+<div class="chem">$$# In airflow.cfg:
+[core]
+multi_team = True
+
+# Or via environment variable:
+export AIRFLOW__CORE__MULTI_TEAM=True$$</div><h1 id="-deadline-alerts-now-with-synchronous-callbacks-aip-86">⏰ Deadline Alerts: Now With Synchronous Callbacks (AIP-86)</h1>
+<blockquote>
+<p>⚠️ <strong>Experimental</strong>: Deadline Alerts are experimental in Airflow 3.2 and may change in future releases based on user feedback.</p></blockquote>
+<p>Building on the Deadline Alerts system introduced in Airflow 3.1, this release adds synchronous callback support. In 3.1, callbacks ran through the triggerer (async only), which limited integration options. Synchronous callbacks execute directly via the executor, with optional targeting of a specific executor via the executor parameter.</p>
+<h2 id="whats-new-in-32">What’s New in 3.2</h2>
+<ul>
+<li><strong>SyncCallback support</strong>: Unlike <code>AsyncCallback</code> which runs on the triggerer, <code>SyncCallback</code> executes directly on the worker via the executor, with optional targeting of a specific executor</li>
+<li><strong>Multiple Deadline Alerts per Dag</strong>: Pass a list to the deadline parameter to configure multiple thresholds on a single Dag</li>
+<li><strong>Missed-deadline metadata in Grid API</strong>: Dag run API now includes missed-deadline information for programmatic monitoring</li>
+<li><strong>Improved UX for custom DeadlineReferences</strong>: Cleaner developer experience when defining custom deadline reference points (#57222)</li>
+</ul>
+<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="k">with</span> <span class="n">DAG</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">dag_id</span><span class="o">=</span><span class="s2">"sync_deadline"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">deadline</span><span class="o">=</span><span class="n">DeadlineAlert</span><span class="p">(</span>
-</span></span><span class="line"><span class="cl"> <span class="n">reference</span><span class="o">=</span><span class="n">DeadlineReference</span><span class="o">.</span><span class="n">DAGRUN_QUEUED_AT</span><span class="p">,</span>
-</span></span><span class="line"><span class="cl"> <span class="n">interval</span><span class="o">=</span><span class="n">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="mi">2</span><span class="p">),</span>
-</span></span><span class="line"><span class="cl"> <span class="n">callback</span><span class="o">=</span><span class="n">AsyncCallback</span><span class="p">(</span>
+</span></span><span class="line"><span class="cl"> <span class="n">reference</span><span class="o">=</span><span class="n">DeadlineReference</span><span class="o">.</span><span class="n">FIXED_DATETIME</span><span class="p">(</span><span class="n">datetime</span><span class="p">(</span><span class="mi">1980</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">2</span><span class="p">)),</span>
+</span></span><span class="line"><span class="cl"> <span class="n">interval</span><span class="o">=</span><span class="n">timedelta</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span>
+</span></span><span class="line"><span class="cl"> <span class="n">callback</span><span class="o">=</span><span class="n">SyncCallback</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">SlackWebhookNotifier</span><span class="p">,</span>
-</span></span><span class="line"><span class="cl"> <span class="n">kwargs</span><span class="o">=</span><span class="p">{</span><span class="s2">"text"</span><span class="p">:</span> <span class="s2">"🚨 Critical ETL missed deadline!"</span><span class="p">}</span>
+</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">"text"</span><span class="p">:</span> <span class="s2">"Sync Callback; Alert should trigger immediately!"</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
-</span></span><span class="line"><span class="cl"><span class="p">)</span> <span class="k">as</span> <span class="n">dag</span><span class="p">:</span>
-</span></span><span class="line"><span class="cl"> <span class="c1"># Your tasks here</span>
-</span></span></code></pre></div><p>Perfect for monitoring daily ETLs, alerting before critical deadlines, or escalating resource-constrained workflows.</p>
-<h1 id="-going-global-with-17-languages">🌍 Going Global with 17 Languages</h1>
-<p>Airflow now speaks your team’s language. Literally. We have added comprehensive internationalization support
-for <strong>17 languages</strong>, including Arabic, Chinese, French, German, Spanish and more. The interface detects your
-browser preferences automatically, but you can switch languages on the fly without refreshing the page.</p>
-<p><img src="/blog/airflow-3.1.0/images/i18n-demo.gif" alt="Internationalization Demo"></p>
-<p>For our Arabic and Hebrew users, we’ve built in <strong>proper right-to-left (RTL) support</strong></p>
-<p>The best part? We have made it straightforward for the community to contribute additional languages with clear
-contribution guidelines, so this is just the beginning of Airflow’s global reach.</p>
-<h1 id="-build-your-airflow-your-way">🎨 Build <em>your Airflow</em>, <em>your way</em></h1>
-<p>The new <strong>React Plugin System</strong> (<strong>AIP-68</strong>) transforms how you extend Airflow’s interface. We have replaced
-the old Flask-based approach with a modern toolkit that lets you customize Airflow exactly how your team works.</p>
-<p>Want to embed your company’s dashboard right in the Airflow UI? Build React applications or iframes that will
-render inside Airflow’s (nav bar, dashboard, details page, etc.). Want to link to your existing tools
-seamlessly? Create custom external links to your resources. Want to extend Airflow’s API server? Register
-FastAPI sub applications and middlewares that fit your specific processes.</p>
-<p>The system includes:</p>
+</span></span><span class="line"><span class="cl"><span class="p">):</span>
+</span></span><span class="line"><span class="cl"> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s1">'empty_task'</span><span class="p">)</span>
+</span></span></code></pre></div><h1 id="-ui-enhancements">🖥️ UI Enhancements</h1>
+<ul>
+<li><strong>HITL Approval History</strong>: The Human-in-the-Loop approval interface now shows the complete audit trail of approvals and rejections for any task. (#56760, #55952)</li>
+<li><strong>XCom Management</strong>: You can now add, edit, and delete XCom values directly from the UI. (#58921)</li>
+<li><strong>Segmented state bar</strong>: Collapsed task groups and mapped tasks now show a segmented state bar for at-a-glance status (#61854)</li>
+<li><strong>Unified tooltips</strong>: Grid and Graph view tooltips now show dates, duration, and child states (#62119)</li>
+<li><strong>Filename in Dag Code tab</strong>: File identification now shown in the Code tab (#60759)</li>
+<li><strong>Copy button for logs</strong>: One-click log copying (#61185)</li>
+<li><strong>Date range filter</strong>: Filter Dag executions by date range (#60772)</li>
+<li><strong>Task upstream/downstream filter</strong>: Filter by upstream or downstream tasks in Graph and Grid views (#57237)</li>
+<li><strong>Data redaction</strong>: Sensitive fields are now redacted in the UI and Public API (#59873)</li>
+<li><strong>Custom theme support</strong>: <code>globalCss</code> and theme config for white-label/custom deployments (#61161, #58411)</li>
+<li><strong>Inherit core UI theme in React plugins</strong>: Plugin UIs now automatically match the core Airflow theme (#60256)</li>
+<li><strong>Task display names in Gantt</strong>: <code>task_display_name</code> shown for better readability (#61438)</li>
+</ul>
+<h1 id="-performance-improvements">🚀 Performance Improvements</h1>
+<p><strong>Rendered Task Instance Fields Cleanup: ~42x Faster.</strong> The cleanup job for rendered task instance fields has been rewritten and is roughly 42 times faster for Dags with many mapped tasks. Retention is now based on the N most recent Dag runs rather than N most recent task executions, which is both more intuitive and dramatically more performant. Config renamed: <code>max_num_rendered_ti_fields_per_task</code> → <code>num_dag_runs_to_retain_rendered_fields</code> (old name [...]
+<p><strong>Scheduler Improvements.</strong> For large-scale deployments, 3.2 addresses several known bottlenecks:</p>
+<ul>
+<li>The scheduler no longer loads all TaskInstances into memory, preventing memory spikes on large deployments (#60956)</li>
+<li>Faster task dequeuing loop (#61376)</li>
+<li>Queue query now enforces <code>max_active_tasks</code> directly, preventing over-queueing (#54103)</li>
+</ul>
+<p><strong>API Server Improvements:</strong></p>
<ul>
-<li><strong>External Views</strong> for linking to existing tools (external links or embedded iframes)</li>
-<li><strong>React Applications</strong> support for rendering external react apps</li>
-<li><strong>FastAPI Sub Applications</strong> to extend the API server</li>
-<li><strong>Root Middlewares</strong> for intercepting API requests (even core ones)</li>
+<li>Eliminated SerializedDag loads on task start, reducing memory usage (#60803)</li>
+<li><code>serialized_dag</code> data column now uses JSONB on PostgreSQL (#55979)</li>
</ul>
-<p>We’ve already seen teams integrate everything from Wikipedia searches to data lineage
-visualizations to yes, someone building a snake game to play while waiting on dag runs!</p>
-<p><img src="/blog/airflow-3.1.0/images/snake.gif" alt="Snake Game Plugin">
-Credited to Tamara Fingerlin.</p>
-<h1 id="-enhanced-developer-and-authoring-experience">🔧 Enhanced Developer and Authoring Experience</h1>
-<h2 id="task-sdk-evolution">Task SDK Evolution</h2>
-<p>Airflow 3.1 advances the decoupling of the <strong>Task SDK</strong> from Airflow Core through improved DAG serialization. While
-complete separation arrives in 3.2.0, the foundation enables:</p>
+<h1 id="-task-sdk-evolution--developer-experience">🔧 Task SDK Evolution & Developer Experience</h1>
+<h2 id="task-sdk-decoupling-continues">Task SDK Decoupling Continues</h2>
+<p>Airflow 3.2 continues moving components from <code>airflow-core</code> into the Task SDK, progressing toward full client-server separation. This enables Dag authors to independently upgrade the Task SDK without requiring Airflow Core upgrades, reducing coordination overhead between Dag authors and Ops teams.</p>
+<p>Modules moved to Task SDK in this release (old import paths still work with deprecation warnings):</p>
<ul>
-<li><strong>Independent Upgrades</strong>: Reduced coordination need between Dag authors and Airflow Ops teams</li>
-<li><strong>Forward Compatibility</strong>: Dag authors should now write Dags by importing from the <strong>airflow.sdk</strong> namespace for future-proofing. (Naturally, the old imports still work but issue a warning.)</li>
-<li><strong>Deployment Flexibility</strong>: Better support for separated component deployment</li>
+<li><strong>Exceptions</strong>: <code>AirflowSkipException</code>, <code>TaskDeferred</code>, etc. → <code>airflow.sdk.exceptions</code> (#59780)</li>
+<li><strong>Serde</strong>: <code>airflow.serialization.serde</code> → <code>airflow.sdk.serde</code>; serializers → <code>airflow.sdk.serde.serializers.*</code> (#58900)</li>
+<li><strong>SkipMixin / BranchMixIn</strong>: Moved to Task SDK; existing imports work via <code>common-compat</code> (#62749, #62776)</li>
+<li><strong>Lineage module</strong>: Moved to Task SDK for client-server separation (#60968, #61157)</li>
+<li><strong>Listeners module</strong>: Moved to shared library (#59883)</li>
+<li><strong>XCom API</strong>: Decoupled from <code>XComEncoder</code> (#58900)</li>
</ul>
-<h2 id="python-313-support">Python 3.13 Support</h2>
-<p>Airflow 3.1.0 adds <strong>Python 3.13</strong> support while removing Python 3.9 (end-of-life). The platform now supports Python 3.10, 3.11, 3.12, and 3.13.</p>
-<h2 id="inference-execution">Inference Execution</h2>
-<p>A new streaming API endpoint (<strong><code>/dags/{dag_id}/dagRuns/{dag_run_id}/wait</code></strong>) allows applications to watch DAG runs
-until completion, enabling responsive integration patterns for real-time workflows.</p>
-<p>The below example use <a href="https://www.python-httpx.org/async/"><code>httpx</code></a> to trigger a dag run, and emits the final dag run
-state after it finishes:</p>
-<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">asyncio</span>
-</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">json</span>
+<h2 id="pythonoperator-async-support">PythonOperator Async Support</h2>
+<p><code>PythonOperator</code> now supports async callables. You can pass an async function as the <code>python_callable</code> and the operator will correctly await it, enabling async I/O patterns without needing a custom operator. (#60268)</p>
+<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="nd">@task</span><span class="p">(</span><span class="n">show_return_value_in_logs</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">load_xml_files</span><span class="p">(</span><span class="n">files</span><span class="p">):</span>
+</span></span><span class="line"><span class="cl"> <span class="kn">import</span> <span class="nn">asyncio</span>
+</span></span><span class="line"><span class="cl"> <span class="kn">from</span> <span class="nn">io</span> <span class="kn">import</span> <span class="n">BytesIO</span>
+</span></span><span class="line"><span class="cl"> <span class="kn">from</span> <span class="nn">more_itertools</span> <span class="kn">import</span> <span class="n">chunked</span>
+</span></span><span class="line"><span class="cl"> <span class="kn">from</span> <span class="nn">os</span> <span class="kn">import</span> <span class="n">cpu_count</span>
+</span></span><span class="line"><span class="cl"> <span class="kn">from</span> <span class="nn">tenacity</span> <span class="kn">import</span> <span class="n">retry</span><span class="p">,</span> <span class="n">stop_after_attempt</span><span class="p">,</span> <span class="n">wait_fixed</span>
</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">httpx</span>
+</span></span><span class="line"><span class="cl"> <span class="kn">from</span> <span class="nn">airflow.providers.sftp.hooks.sftp</span> <span class="kn">import</span> <span class="n">SFTPClientPool</span>
</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="n">dag_id</span> <span class="o">=</span> <span class="s2">"my-dag"</span>
+</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="s2">"number of files:"</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">files</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">create_and_wait</span><span class="p">(</span><span class="n">client</span><span class="p">):</span>
-</span></span><span class="line"><span class="cl"> <span class="c1"># Create a dag run...</span>
-</span></span><span class="line"><span class="cl"> <span class="n">r</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="sa">f</span><span class="s2">"https://my-airflow.example.com/api/v2/dags/</span><span class="si">{</span><span class="n">dag_id</span><span class="si">}</span><span class="s2">/dagRuns"</span><span class="p">)</span>
-</span></span><span class="line"><span class="cl"> <span class="n">run_id</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">json</span><span class="p">()[</span><span class="s2">"dag_run_id"</span><span class="p">]</span>
-</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">stream</span><span class="p">(</span>
-</span></span><span class="line"><span class="cl"> <span class="s2">"GET"</span><span class="p">,</span>
-</span></span><span class="line"><span class="cl"> <span class="sa">f</span><span class="s2">"https://my-airflow.example.com/api/v2/dags/</span><span class="si">{</span><span class="n">dag_id</span><span class="si">}</span><span class="s2">/dagRuns/</span><span class="si">{</span><span class="n">run_id</span><span class="si">}</span><span class="s2">/wait"</span><span class="p">,</span>
-</span></span><span class="line"><span class="cl"> <span class="p">)</span> <span class="k">as</span> <span class="n">r</span><span class="p">:</span>
-</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">r</span><span class="o">.</span><span class="n">aiter_lines</span><span class="p">():</span>
-</span></span><span class="line"><span class="cl"> <span class="k">pass</span> <span class="c1"># You can do progress report here instead.</span>
-</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="s2">"Dag run state:"</span><span class="p">,</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">())[</span><span class="s2">"state"</span><span class="p">])</span>
+</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">SFTPClientPool</span><span class="p">(</span><span class="n">sftp_conn_id</span><span class="o">=</span><span class="n">sftp_conn</span><span class="p">,</span> <span class="n">pool_size</span><span class="o">=</span><span class="n">cpu_count</span><span class="p">())</span> <span class="k">as</span> <span class="n">pool</span><span class="p">:</span>
+</span></span><span class="line"><span class="cl"> <span class="nd">@retry</span><span class="p">(</span><span class="n">stop</span><span class="o">=</span><span class="n">stop_after_attempt</span><span class="p">(</span><span class="mi">3</span><span class="p">),</span> <span class="n">wait</span><span class="o">=</span><span class="n">wait_fixed</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span>
+</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">def</span> <span class="nf">download_file</span><span class="p">(</span><span class="n">file</span><span class="p">):</span>
+</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">pool</span><span class="o">.</span><span class="n">get_sftp_client</span><span class="p">()</span> <span class="k">as</span> <span class="n">sftp</span><span class="p">:</span>
+</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="s2">"downloading:"</span><span class="p">,</span> <span class="n">file</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl"> <span class="n">buffer</span> <span class="o">=</span> <span class="n">BytesIO</span><span class="p">()</span>
+</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">sftp</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="n">xml_encoding</span><span class="p">)</span> <span class="k">as</span> <span class="n">remote_file</span><span class="p">:</span>
+</span></span><span class="line"><span class="cl"> <span class="n">data</span> <span class="o">=</span> <span class="k">await</span> <span class="n">remote_file</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+</span></span><span class="line"><span class="cl"> <span class="n">buffer</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">xml_encoding</span><span class="p">))</span>
+</span></span><span class="line"><span class="cl"> <span class="n">buffer</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">buffer</span>
</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
-</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">httpx</span><span class="o">.</span><span class="n">AsyncClient</span><span class="p">()</span> <span class="k">as</span> <span class="n">client</span><span class="p">:</span>
-</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">create_and_wait</span><span class="p">(</span><span class="n">client</span><span class="p">)</span>
+</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">batch</span> <span class="ow">in</span> <span class="n">chunked</span><span class="p">(</span><span class="n">files</span><span class="p">,</span> <span class="n">cpu_count</span><span class="p">()</span> <span class="o">*</span> <span class="mi">2</span><span class="p">):</span>
+</span></span><span class="line"><span class="cl"> <span class="n">tasks</span> <span class="o">=</span> <span class="p">[</span><span class="n">asyncio</span><span class="o">.</span><span class="n">create_task</span><span class="p">(</span><span class="n">download_file</span><span class="p">(</span><span class="n">f</span><span class="p">))</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">batch</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
-</span></span><span class="line"><span class="cl"><span class="n">asyncio</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">main</span><span class="p">())</span>
-</span></span></code></pre></div><h1 id="-amazing-community">🙏 Amazing Community</h1>
-<p>Apache Airflow 3.1.0 represents an extraordinary community effort, showcasing the vibrant ecosystem that drives this project forward with <strong>163 contributors</strong> making this release possible across <strong>1,400+ commits</strong>.</p>
-<h2 id="leading-contributors">Leading Contributors</h2>
-<p>Special thanks to our top 20 contributors who drove this release forward: <strong>Amogh Desai</strong>, <strong>Ash Berlin-Taylor</strong>, <strong>Brent Bovenzi</strong>, <strong>Bugra Ozturk</strong>, <strong>Daniel Standish</strong>, <strong>Elad Kalif</strong>, <strong>Ephraim Anierobi</strong>, <strong>GPK</strong>, <strong>Guan-Ming (Wesley) Chiu</strong>, <strong>Jarek Potiuk</strong>, <strong>Jens Scheffler</strong>, <strong>Karthikeyan Singaravelan</strong>, <strong>Kaxil Nai [...]
-<details>
-<summary>View all 143 additional contributors</summary>
-<p>1in3x, Aaron Chen, Aayush Bisen, Abhishek, Achim Gädke, Aldo, Alex Neal Albinda, Alyssa Mhie M. Matila, Anand Raman, Andrei Serdiukov, Ankit Chaurasia, Antony Southworth, Aritra Basu, Aryan Khurana, Atul Singh, Azis, BBQing, Bjorn Olsen, Bowrna, Brunda10, Carl Leake, Chang-Yen (Brian) Li, Christos Bisias, Collin McNulty, Constance Martineau, D. Ferruzzi, DHARMENDRA AHIRWAR, Damian Shaw, Daniel Wolf, David Blain, Denis Krivenko, Dev-iL, Dheeraj Turaga, Diogo Rodrigues, Domadelfin, Dov [...]
-</details>
-<h2 id="ui-excellence--community-growth">UI Excellence & Community Growth</h2>
-<p>The exceptional growth in UI contributions - <strong>5x more pull requests</strong> than Airflow 2.10 and <strong>50% more</strong> than Airflow 3.0 - reflects the dedicated efforts of our UI maintainers and an expanding community of <strong>70 frontend contributors</strong> who have made user experience a cornerstone of this release.</p>
-<h2 id="global-collaboration">Global Collaboration</h2>
-<p>The internationalization effort represents contributors from around the world, making Airflow truly accessible across <strong>17 languages</strong> and diverse technical communities, demonstrating the truly global nature of the Airflow project.</p>
-<hr>
-<p><em>Apache Airflow is a community-driven project. Special thanks to all contributors who made this release possible through code, documentation, testing, and feedback. The future of workflow orchestration is built together.</em></p>
-<h1 id="-migration--upgrade-notes">📝 Migration & Upgrade Notes</h1>
-<ul>
-<li><strong>Python Support</strong>: Ensure you’re running Python 3.10+ before upgrading. We recommend at least Python 3.12 for performance improvements from the Python core team – 3.13 if you can manage it is even better!</li>
-<li><strong>Provider Updates</strong>: Update to the latest provider packages to take advantage of new features.</li>
-<li><strong>Breaking Changes</strong>: Review the <a href="https://airflow.apache.org/docs/apache-airflow/3.1.0/installation/upgrading.html">migration guide</a> for configuration changes and removed features if you are upgrading directly from Airflow 2.x.</li>
-</ul>
+</span></span><span class="line"><span class="cl"> <span class="c1"># Wait for this batch to finish before starting the next</span>
+</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">task</span> <span class="ow">in</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">as_completed</span><span class="p">(</span><span class="n">tasks</span><span class="p">):</span>
+</span></span><span class="line"><span class="cl"> <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">task</span>
+</span></span><span class="line"><span class="cl"> <span class="c1"># Do something with result or accumulate it and return it as an XCom</span>
+</span></span></code></pre></div><h1 id="updated-security-model">Updated security model</h1>
+<p>We are working on improving isolation and improving security of Airflow deployments and in order to make our users better informed of what expectations they should have for Airflow security, we updated the security model to reflect changes implemented in Airflow 3.2.0 and explain future improvements that we work on in this area. See more: <a href="https://airflow.apache.org/docs/apache-airflow/stable/security/security_model.html">Airflow Security Model</a>.</p>
+<h1 id="-community-appreciation">🙏 Community Appreciation</h1>
+<p>This release represents the collaborative effort of hundreds of contributors from around the world. Special thanks to our release manager and all the developers, documentarians, testers, and community members who made Airflow 3.2.0 possible.</p>
+<p>Thanks to contributors like you, the Airflow project continues to thrive. Whether you’re filing issues, submitting PRs, improving documentation, or helping others in the community, every contribution matters.</p>
<h1 id="-get-involved">🔗 Get Involved</h1>
<ul>
<li><strong>Try the Release</strong>: Upgrade your development environment and explore the new features</li>
-<li><strong>Join the Conversation</strong>: Connect with us on (<a href="https://s.apache.org/airflow-slack">Airflow Slack</a>) and the (<a href="https://airflow.apache.org/community/">dev mailing list</a>)</li>
-<li><strong>Contribute</strong>: Check out our <a href="https://github.com/apache/airflow/blob/main/contributing-docs/README.rst">contribution guide</a>.</li>
-<li><strong>Provide Feedback</strong>: Share your experiences and suggestions on GitHub (<a href="https://github.com/apache/airflow">https://github.com/apache/airflow</a>)</li>
+<li><strong>Join the Conversation</strong>: Connect with us on <a href="https://s.apache.org/airflow-slack">Slack</a> and the <a href="https://airflow.apache.org/community/">dev mailing list</a></li>
+<li><strong>Contribute</strong>: Check out our <a href="https://github.com/apache/airflow/blob/main/contributing-docs/README.rst">contribution guide</a></li>
+<li><strong>Provide Feedback</strong>: Share your experiences and suggestions on <a href="https://github.com/apache/airflow">GitHub</a></li>
</ul>
-<p>Apache Airflow 3.1.0 marks a new chapter in making data orchestration more inclusive, intelligent, and
-human-centered. We can’t wait to see what you build with it!</p>
+<p>Apache Airflow 3.2.0 marks a new chapter in data-aware, partition-driven workflow orchestration. We can’t wait to see what you build with it!</p>
</div>
@@ -762,10 +767,10 @@ human-centered. We can’t wait to see what you build with it!</p>
<div class="no-width-restriction no-desktop">
<ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5">
<li>
- <a href="/blog/airflow-three-point-oh-is-here/" aria-label="Previous - Apache Airflow® 3 is Generally Available!" class="btn btn-primary"><span class="me-1">←</span>Previous</a>
+ <a href="/blog/airflow-registry/" aria-label="Previous - Introducing the Apache Airflow Registry" class="btn btn-primary"><span class="me-1">←</span>Previous</a>
</li>
<li>
- <a href="/blog/airflowctl-0.1.0/" aria-label="Next - Apache Airflow CTL aka airflowctl 0.1.0" class="btn btn-primary">Next<span class="ms-1">→</span></a>
+ <a href="/blog/common-ai-provider/" aria-label="Next - Introducing the Common AI Provider: LLM and AI Agent Support for Apache Airflow" class="btn btn-primary">Next<span class="ms-1">→</span></a>
</li>
</ul>
@@ -791,15 +796,19 @@ human-centered. We can’t wait to see what you build with it!</p>
<div class="tags-container">
+ <a class="tag" href="/blog/tags/community/">Community</a>
+
+
+
<a class="tag" href="/blog/tags/release/">Release</a>
</div>
- <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Tue, Apr 22, 2025</span>
+ <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Tue, Apr 14, 2026</span>
</div>
<p class="box-event__blogpost--header">
- <a href="/blog/airflow-three-point-oh-is-here/">
- Apache Airflow® 3 is Generally Available!
+ <a href="/blog/common-ai-provider/">
+ Introducing the Common AI Provider: LLM and AI Agent Support for Apache Airflow
</a>
</p>
@@ -812,20 +821,15 @@ human-centered. We can’t wait to see what you build with it!</p>
,
- <a href="https://linkedin.com/in/vikramkoka" target="_blank" rel="noopener">Vikram Koka</a>
+ <a href="https://linkedin.com/in/pavan-kumar-gopidesu" target="_blank" rel="noopener">Pavan Kumar Gopidesu</a>
</p>
- <p class="box-event__blogpost--description">We're proud to announce that Apache Airflow 3.0.0 has been released.</p>
+ <p class="box-event__blogpost--description">The Common AI Provider adds LLM and AI agent operators to Apache Airflow with 6 operators, 5 toolsets, and 20+ model providers in one package.</p>
<div class="mt-auto">
- <a href="/blog/airflow-three-point-oh-is-here/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/common-ai-provider/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -845,24 +849,19 @@ human-centered. We can’t wait to see what you build with it!</p>
</div>
- <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Thu, Aug 8, 2024</span>
+ <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Thu, Sep 25, 2025</span>
</div>
<p class="box-event__blogpost--header">
- <a href="/blog/airflow-2.10.0/">
- Apache Airflow 2.10.0 is here
+ <a href="/blog/airflow-3.1.0/">
+ Apache Airflow 3.1.0: Human-Centered Workflows
</a>
</p>
- <p class="box-event__blogpost--author">Utkarsh Sharma</p>
+ <p class="box-event__blogpost--author">Kaxil Naik</p>
- <p class="box-event__blogpost--description">Apache Airflow 2.10.0 is a game-changer, with powerful Dataset improvements and the groundbreaking Hybrid Executor, set to redefine your workflow capabilities!</p>
+ <p class="box-event__blogpost--description">Apache Airflow 3.1.0 introduces Human-in-the-Loop workflows, 17-language internationalization, deadline alerts, and React plugin system for data orchestration teams.</p>
<div class="mt-auto">
- <a href="/blog/airflow-2.10.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-3.1.0/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -882,8 +881,8 @@ human-centered. We can’t wait to see what you build with it!</p>
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -894,7 +893,7 @@ human-centered. We can’t wait to see what you build with it!</p>
- <a href=https://github.com/apache/airflow-site/edit/main/landing-pages/site/content/en//blog/airflow-3.1.0>
+ <a href=https://github.com/apache/airflow-site/edit/main/landing-pages/site/content/en//blog/airflow-3.2.0>
@@ -958,14 +957,14 @@ human-centered. We can’t wait to see what you build with it!</p>
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -989,7 +988,7 @@ human-centered. We can’t wait to see what you build with it!</p>
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -999,7 +998,7 @@ human-centered. We can’t wait to see what you build with it!</p>
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -1078,13 +1077,23 @@ human-centered. We can’t wait to see what you build with it!</p>
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+
+ <link rel="stylesheet" href="/css/katex.min.css" integrity="sha512-gOEGFitvtJ61R3hXFUUUe3y41f6+z5PhwilCn099jGb5sbyHxY7ZouQ5yp1GKlpDrpuzWDxb8k+Htmryd79FnQ==" crossorigin="anonymous">
+
+ <script defer src="/js/katex.min.js" integrity="sha512-trp8Fh0R8XxxTU783+gLzNWOie1rHVnIVicLWBTuaLLjA1cN69xrNSgTPL7GWJqvtKw6Q6h9UrKyrSeDQbcZnw==" crossorigin="anonymous" ></script>
+
+ <script defer src="/js/mhchem.min.js" integrity="sha512-3ev+ZV+t8BSzoQQ3rz9+H/C0Eq+islU1W1BuSYQ+XNPvlZi96z5MlGcS7WrzVceYvYXt56+1nKQcGNVcyQwZWg==" crossorigin="anonymous" ></script>
+
+ <script defer src="/js/auto-render.min.js" integrity="sha512-0HzJcHCD+wBh9kNUUcm3DWH9IbNDfudsYyMD5EHwSuFK6aEsaa/UEPqqk4t0pm4bbmwR6A11yNsD7Q+nz6XF+Q==" crossorigin="anonymous"
+onload='renderMathInElement(document.body, null);'>
+</script>
+ <script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-registry/index.html b/blog/airflow-registry/index.html
index 6321699b9e..9a917828a1 100644
--- a/blog/airflow-registry/index.html
+++ b/blog/airflow-registry/index.html
@@ -31,14 +31,14 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2026-03-19T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Community">
<meta property="og:image" content="/images/feature-image.png">
<meta itemprop="name" content="Introducing the Apache Airflow Registry">
<meta itemprop="description" content="The Apache Airflow Registry is a searchable catalog of 98 providers and 1,600+ modules — operators, hooks, sensors, triggers, and more — now live on airflow.apache.org.">
<meta itemprop="datePublished" content="2026-03-19T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="520">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Community">
@@ -49,8 +49,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +58,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -89,8 +89,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +98,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +276,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +288,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +477,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -515,14 +491,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Thu, Mar 19, 2026</span>
+ <span class="blogpost-content__metadata--date">Thu, Mar 19, 2026</span>
</div>
- <p class="blogpost-content__metadata--title">Introducing the Apache Airflow Registry</p>
+ <h1 class="blogpost-content__metadata--title">Introducing the Apache Airflow Registry</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Kaxil Naik</span>
- <a href="https://github.com/kaxil/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/kaxil/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Kaxil Naik">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -530,7 +506,7 @@
</a>
- <a href="https://linkedin.com/in/kaxil/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/kaxil/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Kaxil Naik">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -662,7 +638,7 @@
<a href="/blog/airflow-survey-2025/" aria-label="Previous - Airflow Survey 2025" class="btn btn-primary"><span class="me-1">←</span>Previous</a>
</li>
<li>
- <a class="btn btn-primary disabled">Next<span class="ms-1">→</span></a>
+ <a href="/blog/airflow-3.2.0/" aria-label="Next - Apache Airflow 3.2.0: Data-Aware Workflows at Scale" class="btn btn-primary">Next<span class="ms-1">→</span></a>
</li>
</ul>
@@ -692,28 +668,31 @@
- <a class="tag" href="/blog/tags/airflow-summit/">Airflow summit</a>
+ <a class="tag" href="/blog/tags/tutorial/">Tutorial</a>
</div>
- <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Mon, May 16, 2022</span>
+ <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Wed, Apr 15, 2026</span>
</div>
<p class="box-event__blogpost--header">
- <a href="/blog/airflow_summit_2022/">
- Airflow Summit 2022
+ <a href="/blog/agentic-workloads-airflow-3/">
+ Agentic Workloads on Airflow: Observable, Retryable, and Auditable by Design
</a>
</p>
- <p class="box-event__blogpost--author">Jarek Potiuk</p>
+ <p class="box-event__blogpost--author">
+
+
+
+ <a href="https://linkedin.com/in/vikramkoka" target="_blank" rel="noopener">Vikram Koka</a>
+
+
+
+ </p>
- <p class="box-event__blogpost--description">Airflow Summit 2022 is here</p>
+ <p class="box-event__blogpost--description">How Dynamic Task Mapping and the common.ai provider turn a multi-dimensional research question into a fan-out/fan-in pipeline where every LLM call is a named, logged, independently retryable task, not a hidden step inside a reasoning loop.</p>
<div class="mt-auto">
- <a href="/blog/airflow_summit_2022/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/agentic-workloads-airflow-3/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -733,28 +712,31 @@
- <a class="tag" href="/blog/tags/airflow-summit/">Airflow summit</a>
+ <a class="tag" href="/blog/tags/tutorial/">Tutorial</a>
</div>
- <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Sun, Mar 21, 2021</span>
+ <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Wed, Apr 15, 2026</span>
</div>
<p class="box-event__blogpost--header">
- <a href="/blog/airflow_summit_2021/">
- Airflow Summit 2021
+ <a href="/blog/ai-survey-analysis-pipelines/">
+ Ask Your Survey Anything: Building AI Analysis Pipelines with Airflow 3
</a>
</p>
- <p class="box-event__blogpost--author">Tomasz Urbaszek</p>
+ <p class="box-event__blogpost--author">
+
+
+
+ <a href="https://linkedin.com/in/vikramkoka" target="_blank" rel="noopener">Vikram Koka</a>
+
+
+
+ </p>
- <p class="box-event__blogpost--description">We are thrilled about Airflow Summit 2021!</p>
+ <p class="box-event__blogpost--description">A walkthrough of two natural language analysis pipelines over the 2025 Airflow Community Survey, covering an interactive human-in-the-loop version and a fully automated scheduled version, using operators from the common.ai and common.sql providers.</p>
<div class="mt-auto">
- <a href="/blog/airflow_summit_2021/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/ai-survey-analysis-pipelines/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -774,8 +756,8 @@
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -850,14 +832,14 @@
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -881,7 +863,7 @@
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -891,7 +873,7 @@
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -970,13 +952,13 @@
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-survey-2020/index.html b/blog/airflow-survey-2020/index.html
index 95e7f8ee17..c90cbd3dca 100644
--- a/blog/airflow-survey-2020/index.html
+++ b/blog/airflow-survey-2020/index.html
@@ -31,7 +31,7 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2021-03-09T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Community">
<meta property="article:tag" content="Survey">
<meta property="article:tag" content="Users">
@@ -40,7 +40,7 @@
<meta itemprop="name" content="Airflow Survey 2020">
<meta itemprop="description" content="We observe steady growth in number of users as well as in an amount of active contributors. So listening and understanding our community is of high importance.">
<meta itemprop="datePublished" content="2021-03-09T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="2136">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Community,Survey,Users">
@@ -51,8 +51,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -60,8 +60,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -91,8 +91,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -100,14 +100,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -274,13 +278,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -290,42 +290,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -503,7 +479,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -525,14 +501,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Tue, Mar 9, 2021</span>
+ <span class="blogpost-content__metadata--date">Tue, Mar 9, 2021</span>
</div>
- <p class="blogpost-content__metadata--title">Airflow Survey 2020</p>
+ <h1 class="blogpost-content__metadata--title">Airflow Survey 2020</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Tomek Urbaszek</span>
- <a href="https://github.com/turbaszek/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/turbaszek/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Tomek Urbaszek">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -540,7 +516,7 @@
</a>
- <a href="https://linkedin.com/in/tomaszurbaszek/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/tomaszurbaszek/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Tomek Urbaszek">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -1965,12 +1941,7 @@ to share their experience and tools.</p>
<p class="box-event__blogpost--description">Receiving and adjusting to our users’ feedback is a must. Let’s see who Airflow users are, how they play with it, and what they miss.</p>
<div class="mt-auto">
- <a href="/blog/airflow-survey/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-survey/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -2010,12 +1981,7 @@ to share their experience and tools.</p>
<p class="box-event__blogpost--description">With more than 5,818 responses from 122 countries, this is the largest data engineering survey to date. Conducted annually, the Apache Airflow Survey offers valuable insights into Airflow usage and helps guide our future efforts.</p>
<div class="mt-auto">
- <a href="/blog/airflow-survey-2025/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-survey-2025/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -2035,8 +2001,8 @@ to share their experience and tools.</p>
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -2111,14 +2077,14 @@ to share their experience and tools.</p>
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -2142,7 +2108,7 @@ to share their experience and tools.</p>
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -2152,7 +2118,7 @@ to share their experience and tools.</p>
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -2231,13 +2197,13 @@ to share their experience and tools.</p>
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-survey-2022/index.html b/blog/airflow-survey-2022/index.html
index b21274f779..a25d2ceb62 100644
--- a/blog/airflow-survey-2022/index.html
+++ b/blog/airflow-survey-2022/index.html
@@ -31,7 +31,7 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2022-06-17T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Community">
<meta property="article:tag" content="Survey">
<meta property="article:tag" content="Users">
@@ -40,7 +40,7 @@
<meta itemprop="name" content="Airflow Survey 2022">
<meta itemprop="description" content="2021 saw rapid adoption of Airflow 2, and continued growth of the community. This annual survey helps us understand how people are using Airflow, and where we can best focus our efforts going forward.">
<meta itemprop="datePublished" content="2022-06-17T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="3866">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Community,Survey,Users">
@@ -51,8 +51,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -60,8 +60,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -91,8 +91,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -100,14 +100,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -274,13 +278,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -290,42 +290,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -503,7 +479,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -525,14 +501,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Fri, Jun 17, 2022</span>
+ <span class="blogpost-content__metadata--date">Fri, Jun 17, 2022</span>
</div>
- <p class="blogpost-content__metadata--title">Airflow Survey 2022</p>
+ <h1 class="blogpost-content__metadata--title">Airflow Survey 2022</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">John Thomas, Ewa Tatarczak</span>
- <a href="https://github.com/Tohn%20Jhomas/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/Tohn%20Jhomas/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of John Thomas, Ewa Tatarczak">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -540,7 +516,7 @@
</a>
- <a href="https://linkedin.com/in/john-e-thomas/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/john-e-thomas/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of John Thomas, Ewa Tatarczak">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -2331,12 +2307,7 @@
<p class="box-event__blogpost--description">With more than 5,818 responses from 122 countries, this is the largest data engineering survey to date. Conducted annually, the Apache Airflow Survey offers valuable insights into Airflow usage and helps guide our future efforts.</p>
<div class="mt-auto">
- <a href="/blog/airflow-survey-2025/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-survey-2025/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -2376,12 +2347,7 @@
<p class="box-event__blogpost--description">With more than 5,250 responses from 116 countries, this is the largest data engineering survey to date. Conducted annually, it offers valuable insights into Airflow usage and helps guide our future efforts.</p>
<div class="mt-auto">
- <a href="/blog/airflow-survey-2024/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-survey-2024/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -2401,8 +2367,8 @@
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -2477,14 +2443,14 @@
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -2508,7 +2474,7 @@
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -2518,7 +2484,7 @@
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -2597,13 +2563,13 @@
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-survey-2023/index.html b/blog/airflow-survey-2023/index.html
index 4faa055211..56f49c7c11 100644
--- a/blog/airflow-survey-2023/index.html
+++ b/blog/airflow-survey-2023/index.html
@@ -31,7 +31,7 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2023-09-21T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Community">
<meta property="article:tag" content="Survey">
<meta property="article:tag" content="Users">
@@ -40,7 +40,7 @@
<meta itemprop="name" content="Airflow Survey 2023">
<meta itemprop="description" content="Airflow 2 has seen rapid adoption, accompanied by continuous community growth. This annual survey helps us understand how people use Airflow and where we can best focus our efforts as we advance.">
<meta itemprop="datePublished" content="2023-09-21T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="3">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Community,Survey,Users">
@@ -51,8 +51,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -60,8 +60,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -91,8 +91,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -100,14 +100,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -274,13 +278,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -290,42 +290,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -503,7 +479,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -525,14 +501,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Thu, Sep 21, 2023</span>
+ <span class="blogpost-content__metadata--date">Thu, Sep 21, 2023</span>
</div>
- <p class="blogpost-content__metadata--title">Airflow Survey 2023</p>
+ <h1 class="blogpost-content__metadata--title">Airflow Survey 2023</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Michael Robinson</span>
- <a href="https://github.com/merobi-hub/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/merobi-hub/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Michael Robinson">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -646,12 +622,7 @@
<p class="box-event__blogpost--description">With more than 5,818 responses from 122 countries, this is the largest data engineering survey to date. Conducted annually, the Apache Airflow Survey offers valuable insights into Airflow usage and helps guide our future efforts.</p>
<div class="mt-auto">
- <a href="/blog/airflow-survey-2025/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-survey-2025/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -691,12 +662,7 @@
<p class="box-event__blogpost--description">With more than 5,250 responses from 116 countries, this is the largest data engineering survey to date. Conducted annually, it offers valuable insights into Airflow usage and helps guide our future efforts.</p>
<div class="mt-auto">
- <a href="/blog/airflow-survey-2024/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-survey-2024/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -716,8 +682,8 @@
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -792,14 +758,14 @@
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -823,7 +789,7 @@
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -833,7 +799,7 @@
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -912,13 +878,13 @@
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-survey-2024/index.html b/blog/airflow-survey-2024/index.html
index e231f42786..c43556730c 100644
--- a/blog/airflow-survey-2024/index.html
+++ b/blog/airflow-survey-2024/index.html
@@ -31,7 +31,7 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2025-02-27T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Community">
<meta property="article:tag" content="Survey">
<meta property="article:tag" content="Users">
@@ -40,7 +40,7 @@
<meta itemprop="name" content="Airflow Survey 2024">
<meta itemprop="description" content="With more than 5,250 responses from 116 countries, this is the largest data engineering survey to date. Conducted annually, it offers valuable insights into Airflow usage and helps guide our future efforts.">
<meta itemprop="datePublished" content="2025-02-27T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="45">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Community,Survey,Users">
@@ -51,8 +51,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -60,8 +60,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -91,8 +91,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -100,14 +100,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -274,13 +278,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -290,42 +290,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -503,7 +479,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -525,14 +501,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Thu, Feb 27, 2025</span>
+ <span class="blogpost-content__metadata--date">Thu, Feb 27, 2025</span>
</div>
- <p class="blogpost-content__metadata--title">Airflow Survey 2024</p>
+ <h1 class="blogpost-content__metadata--title">Airflow Survey 2024</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Ankit Chaurasia</span>
- <a href="https://github.com/sunank200/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/sunank200/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Ankit Chaurasia">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -540,7 +516,7 @@
</a>
- <a href="https://linkedin.com/in/sunank200/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/sunank200/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Ankit Chaurasia">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -662,12 +638,7 @@
<p class="box-event__blogpost--description">With more than 5,818 responses from 122 countries, this is the largest data engineering survey to date. Conducted annually, the Apache Airflow Survey offers valuable insights into Airflow usage and helps guide our future efforts.</p>
<div class="mt-auto">
- <a href="/blog/airflow-survey-2025/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-survey-2025/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -707,12 +678,7 @@
<p class="box-event__blogpost--description">Airflow 2 has seen rapid adoption, accompanied by continuous community growth. This annual survey helps us understand how people use Airflow and where we can best focus our efforts as we advance.</p>
<div class="mt-auto">
- <a href="/blog/airflow-survey-2023/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-survey-2023/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -732,8 +698,8 @@
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -808,14 +774,14 @@
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -839,7 +805,7 @@
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -849,7 +815,7 @@
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -928,13 +894,13 @@
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-survey-2025/index.html b/blog/airflow-survey-2025/index.html
index ea3456b09c..ff710de9ea 100644
--- a/blog/airflow-survey-2025/index.html
+++ b/blog/airflow-survey-2025/index.html
@@ -31,7 +31,7 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2026-01-22T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Community">
<meta property="article:tag" content="Survey">
<meta property="article:tag" content="Users">
@@ -40,7 +40,7 @@
<meta itemprop="name" content="Airflow Survey 2025">
<meta itemprop="description" content="With more than 5,818 responses from 122 countries, this is the largest data engineering survey to date. Conducted annually, the Apache Airflow Survey offers valuable insights into Airflow usage and helps guide our future efforts.">
<meta itemprop="datePublished" content="2026-01-22T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="45">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Community,Survey,Users">
@@ -51,8 +51,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -60,8 +60,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -91,8 +91,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -100,14 +100,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -276,13 +280,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -292,42 +292,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -507,7 +483,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -529,14 +505,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Thu, Jan 22, 2026</span>
+ <span class="blogpost-content__metadata--date">Thu, Jan 22, 2026</span>
</div>
- <p class="blogpost-content__metadata--title">Airflow Survey 2025</p>
+ <h1 class="blogpost-content__metadata--title">Airflow Survey 2025</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Ankit Chaurasia</span>
- <a href="https://github.com/sunank200/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/sunank200/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Ankit Chaurasia">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -544,7 +520,7 @@
</a>
- <a href="https://linkedin.com/in/sunank200/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/sunank200/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Ankit Chaurasia">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -666,12 +642,7 @@
<p class="box-event__blogpost--description">With more than 5,250 responses from 116 countries, this is the largest data engineering survey to date. Conducted annually, it offers valuable insights into Airflow usage and helps guide our future efforts.</p>
<div class="mt-auto">
- <a href="/blog/airflow-survey-2024/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-survey-2024/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -711,12 +682,7 @@
<p class="box-event__blogpost--description">Airflow 2 has seen rapid adoption, accompanied by continuous community growth. This annual survey helps us understand how people use Airflow and where we can best focus our efforts as we advance.</p>
<div class="mt-auto">
- <a href="/blog/airflow-survey-2023/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-survey-2023/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -736,8 +702,8 @@
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -812,14 +778,14 @@
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -843,7 +809,7 @@
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -853,7 +819,7 @@
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -932,13 +898,13 @@
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-survey/index.html b/blog/airflow-survey/index.html
index dea2f96c3e..f18751c37b 100644
--- a/blog/airflow-survey/index.html
+++ b/blog/airflow-survey/index.html
@@ -31,7 +31,7 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2019-12-11T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Community">
<meta property="article:tag" content="Survey">
<meta property="article:tag" content="Users">
@@ -40,7 +40,7 @@
<meta itemprop="name" content="Airflow Survey 2019">
<meta itemprop="description" content="Receiving and adjusting to our users’ feedback is a must. Let’s see who Airflow users are, how they play with it, and what they miss.">
<meta itemprop="datePublished" content="2019-12-11T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="1723">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Community,Survey,Users">
@@ -51,8 +51,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -60,8 +60,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -91,8 +91,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -100,14 +100,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -274,13 +278,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -290,42 +290,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -503,7 +479,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -525,14 +501,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Wed, Dec 11, 2019</span>
+ <span class="blogpost-content__metadata--date">Wed, Dec 11, 2019</span>
</div>
- <p class="blogpost-content__metadata--title">Airflow Survey 2019</p>
+ <h1 class="blogpost-content__metadata--title">Airflow Survey 2019</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Tomek Urbaszek</span>
- <a href="https://github.com/nuclearpinguin/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/nuclearpinguin/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Tomek Urbaszek">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -540,7 +516,7 @@
</a>
- <a href="https://linkedin.com/in/tomaszurbaszek/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/tomaszurbaszek/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Tomek Urbaszek">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -1443,12 +1419,7 @@ declare DAGs.</p>
<p class="box-event__blogpost--description">We observe steady growth in number of users as well as in an amount of active contributors. So listening and understanding our community is of high importance.</p>
<div class="mt-auto">
- <a href="/blog/airflow-survey-2020/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-survey-2020/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -1488,12 +1459,7 @@ declare DAGs.</p>
<p class="box-event__blogpost--description">With more than 5,818 responses from 122 countries, this is the largest data engineering survey to date. Conducted annually, the Apache Airflow Survey offers valuable insights into Airflow usage and helps guide our future efforts.</p>
<div class="mt-auto">
- <a href="/blog/airflow-survey-2025/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-survey-2025/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -1513,8 +1479,8 @@ declare DAGs.</p>
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -1589,14 +1555,14 @@ declare DAGs.</p>
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -1620,7 +1586,7 @@ declare DAGs.</p>
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -1630,7 +1596,7 @@ declare DAGs.</p>
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -1709,13 +1675,13 @@ declare DAGs.</p>
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-three-point-oh-is-here/index.html b/blog/airflow-three-point-oh-is-here/index.html
index 689d213e90..be1e3368d8 100644
--- a/blog/airflow-three-point-oh-is-here/index.html
+++ b/blog/airflow-three-point-oh-is-here/index.html
@@ -31,14 +31,14 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2025-04-22T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Release">
<meta property="og:image" content="/images/feature-image.png">
<meta itemprop="name" content="Apache Airflow® 3 is Generally Available!">
<meta itemprop="description" content="We're proud to announce that Apache Airflow 3.0.0 has been released.">
<meta itemprop="datePublished" content="2025-04-22T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="2194">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Release">
@@ -49,8 +49,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +58,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -89,8 +89,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +98,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +276,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +288,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +477,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -515,15 +491,16 @@
</div>
- <span class="bodytext__medium--brownish-grey">Tue, Apr 22, 2025</span>
+ <span class="blogpost-content__metadata--date">Tue, Apr 22, 2025</span>
</div>
- <p class="blogpost-content__metadata--title">Apache Airflow® 3 is Generally Available!</p>
+ <h1 class="blogpost-content__metadata--title">Apache Airflow® 3 is Generally Available!</h1>
<div class="blogpost-content__metadata--author">
+
<span class="blogpost-content__metadata--author-name">Kaxil Naik</span>
- <a href="https://github.com/kaxil/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/kaxil/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Kaxil Naik">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -531,7 +508,7 @@
</a>
- <a href="https://linkedin.com/in/kaxil/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/kaxil/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Kaxil Naik">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -546,9 +523,10 @@
<br>
+
<span class="blogpost-content__metadata--author-name">Vikram Koka</span>
- <a href="https://github.com/vikramkoka/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/vikramkoka/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Vikram Koka">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -556,7 +534,7 @@
</a>
- <a href="https://linkedin.com/in/vikramkoka/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/vikramkoka/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Vikram Koka">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
@@ -1040,28 +1018,40 @@ Let’s build the future of data orchestration—together.</p>
<div class="tags-container">
+ <a class="tag" href="/blog/tags/community/">Community</a>
+
+
+
<a class="tag" href="/blog/tags/release/">Release</a>
</div>
- <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Thu, Sep 25, 2025</span>
+ <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Tue, Apr 14, 2026</span>
</div>
<p class="box-event__blogpost--header">
- <a href="/blog/airflow-3.1.0/">
- Apache Airflow 3.1.0: Human-Centered Workflows
+ <a href="/blog/common-ai-provider/">
+ Introducing the Common AI Provider: LLM and AI Agent Support for Apache Airflow
</a>
</p>
- <p class="box-event__blogpost--author">Kaxil Naik</p>
+ <p class="box-event__blogpost--author">
+
+
+
+ <a href="https://linkedin.com/in/kaxil" target="_blank" rel="noopener">Kaxil Naik</a>
+
+ ,
+
+
+ <a href="https://linkedin.com/in/pavan-kumar-gopidesu" target="_blank" rel="noopener">Pavan Kumar Gopidesu</a>
+
+
+
+ </p>
- <p class="box-event__blogpost--description">Apache Airflow 3.1.0 introduces Human-in-the-Loop workflows, 17-language internationalization, deadline alerts, and React plugin system for data orchestration teams.</p>
+ <p class="box-event__blogpost--description">The Common AI Provider adds LLM and AI agent operators to Apache Airflow with 6 operators, 5 toolsets, and 20+ model providers in one package.</p>
<div class="mt-auto">
- <a href="/blog/airflow-3.1.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/common-ai-provider/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -1081,24 +1071,19 @@ Let’s build the future of data orchestration—together.</p>
</div>
- <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Thu, Aug 8, 2024</span>
+ <span class="bodytext__medium--brownish-grey box-event__blogpost--date">Tue, Apr 7, 2026</span>
</div>
<p class="box-event__blogpost--header">
- <a href="/blog/airflow-2.10.0/">
- Apache Airflow 2.10.0 is here
+ <a href="/blog/airflow-3.2.0/">
+ Apache Airflow 3.2.0: Data-Aware Workflows at Scale
</a>
</p>
- <p class="box-event__blogpost--author">Utkarsh Sharma</p>
+ <p class="box-event__blogpost--author">Rahul Vats</p>
- <p class="box-event__blogpost--description">Apache Airflow 2.10.0 is a game-changer, with powerful Dataset improvements and the groundbreaking Hybrid Executor, set to redefine your workflow capabilities!</p>
+ <p class="box-event__blogpost--description">Apache Airflow 3.2.0 introduces Asset partitioning for granular pipeline orchestration, multi-team deployments for enterprise scale, synchronous deadline alert callbacks, and continued progress toward full Task SDK separation.</p>
<div class="mt-auto">
- <a href="/blog/airflow-2.10.0/">
-
-
-<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" >Read more</button>
-
- </a>
+ <a href="/blog/airflow-3.2.0/" class="btn-hollow btn-blue bodytext__medium--cerulean-blue">Read more</a>
</div>
</div>
</div>
@@ -1118,8 +1103,8 @@ Let’s build the future of data orchestration—together.</p>
-<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16">
+<button id="scroll-to-top-btn" class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed" aria-label="Scroll to top">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="black" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
<path d="m7.247 4.86-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z"/>
</svg>
</button>
@@ -1194,14 +1179,14 @@ Let’s build the future of data orchestration—together.</p>
- <a class="footer-section__media-section--link icon-github-white" target="_blank" href="https://github.com/apache/airflow/">
+ <a class="footer-section__media-section--link icon-github-white" target="_blank" rel="noopener noreferrer" href="https://github.com/apache/airflow/" aria-label="Github (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2 [...]
</svg>
</a>
- <a class="footer-section__media-section--link icon-slack" target="_blank" href="https://apache-airflow.slack.com/">
+ <a class="footer-section__media-section--link icon-slack" target="_blank" rel="noopener noreferrer" href="https://apache-airflow.slack.com/" aria-label="Slack (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
@@ -1225,7 +1210,7 @@ Let’s build the future of data orchestration—together.</p>
</a>
- <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow/">
+ <a class="footer-section__media-section--link icon-stackoverflow" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/airflow/" aria-label="Stack Overflow (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"/>
@@ -1235,7 +1220,7 @@ Let’s build the future of data orchestration—together.</p>
</a>
- <a class="footer-section__media-section--link icon-youtube" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/">
+ <a class="footer-section__media-section--link icon-youtube" target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" aria-label="Youtube (opens in new tab)">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="tra [...]
</svg>
@@ -1314,13 +1299,13 @@ Let’s build the future of data orchestration—together.</p>
</div>
</footer>
-<script src="/js/main.min.358b664598ed6c414b48721e94dd89ae3daef991c30b4234063d7998daba862a.js" integrity="sha256-NYtmRZjtbEFLSHIelN2Jrj2u+ZHDC0I0Bj15mNq6hio=" crossorigin="anonymous"></script>
+<script src="/js/main.min.b7e4638e0ed88d563c8a4a89fce66e8c08401d993520016f677e2877642da245.js" integrity="sha256-t+Rjjg7YjVY8ikqJ/OZujAhAHZk1IAFvZ34od2QtokU=" crossorigin="anonymous"></script>
<script defer src="/js/click-to-copy.min.73478a7d4807698aed7e355eb23f9890ca18fea3158604c8471746d046702bad.js" integrity="sha256-c0eKfUgHaYrtfjVesj+YkMoY/qMVhgTIRxdG0EZwK60=" crossorigin="anonymous"></script>
<script src='/js/tabpane-persist.js'></script>
</body>
- <script src="/main.d9cd6.js"></script>
+ <script src="/main.0d38a.js"></script>
</html>
diff --git a/blog/airflow-two-point-oh-is-here/index.html b/blog/airflow-two-point-oh-is-here/index.html
index 0f6789d748..5095efe116 100644
--- a/blog/airflow-two-point-oh-is-here/index.html
+++ b/blog/airflow-two-point-oh-is-here/index.html
@@ -31,14 +31,14 @@
<meta property="og:type" content="article">
<meta property="article:section" content="blog">
<meta property="article:published_time" content="2020-12-17T00:00:00+00:00">
- <meta property="article:modified_time" content="2026-03-22T10:42:49+01:00">
+ <meta property="article:modified_time" content="2026-06-16T10:48:01-04:00">
<meta property="article:tag" content="Release">
<meta property="og:image" content="/images/feature-image.png">
<meta itemprop="name" content="Apache Airflow 2.0 is here!">
<meta itemprop="description" content="We're proud to announce that Apache Airflow 2.0.0 has been released.">
<meta itemprop="datePublished" content="2020-12-17T00:00:00+00:00">
- <meta itemprop="dateModified" content="2026-03-22T10:42:49+01:00">
+ <meta itemprop="dateModified" content="2026-06-16T10:48:01-04:00">
<meta itemprop="wordCount" content="1165">
<meta itemprop="image" content="/images/feature-image.png">
<meta itemprop="keywords" content="Release">
@@ -49,8 +49,8 @@
-<link rel="preload" href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" as="style">
-<link href="/scss/main.min.db9dd91853717cf9ecc493f0aedad4e9005e35c6c5beffce85a83ba852304b02.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" as="style">
+<link href="/scss/main.min.942a962cba6c653f2e7d96978c01c2ec6e0c929abe530a11254f1d39a3046d6b.css" rel="stylesheet" integrity="">
@@ -58,8 +58,8 @@
-<link rel="preload" href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" as="style">
-<link href="/scss/main-custom.min.e7ee681c727c8d8df1f500cb5badb1659ab72f6c251d0b5d8eb490ce1196d31c.css" rel="stylesheet" integrity="">
+<link rel="preload" href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" as="style">
+<link href="/scss/main-custom.min.a54e00540ae2dd48022d4e606a706a8e1dc4fde73c69439f87b336ae29807134.css" rel="stylesheet" integrity="">
<script
@@ -89,8 +89,8 @@
-<link rel="preload" href="/main.d9cd6.js" as="script">
-<link rel="preload" href="/chunk-608.d9cd6.js" as="script">
+<link rel="preload" href="/main.0d38a.js" as="script">
+<link rel="preload" href="/chunk-608.0d38a.js" as="script">
<link rel="preload" href="/" as="script">
@@ -98,14 +98,18 @@
</head>
<body class="td-page">
+<a href="#main-content" class="skip-link">Skip to main content</a>
<header>
-<nav class="js-navbar-scroll navbar">
+<a href="https://airflowsummit.org" target="_blank" class="d-block fixed-top px-3 py-2 bg-success text-center text-bold text-white">
+ Airflow Summit 2026 is coming August 31 - September 2 in Austin, TX. Register now to secure your spot!
+</a>
+<nav class="js-navbar-scroll navbar" aria-label="Main navigation" style="top: 40px;">
<div class="navbar__icon-container">
- <a href="/">
+ <a href="/" aria-label="Apache Airflow home">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
@@ -272,13 +276,9 @@
</div>
<div class="navbar__theme-toggle">
- <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
- <symbol id="check2" viewBox="0 0 16 16">
- <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
- </symbol>
- <symbol id="circle-half" viewBox="0 0 16 16">
- <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
- </symbol>
+
+
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l- [...]
@@ -288,42 +288,18 @@
</symbol>
</svg>
-<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
- id="bd-theme"
- type="button"
- aria-expanded="false"
- data-bs-toggle="dropdown"
- data-bs-display="static"
- aria-label="Toggle theme (auto)">
- <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
-</button>
-<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
- Light
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
- <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
- Dark
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
- <li>
- <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
- <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
- Auto
- <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
- </button>
- </li>
-</ul>
+<div class="theme-toggle-pill" role="radiogroup" aria-label="Toggle color theme">
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="light" aria-label="Light theme">
+ <svg class="bi"><use href="#sun-fill"></use></svg>
+ </button>
+ <button type="button" class="theme-toggle-pill__btn" data-theme-value="dark" aria-label="Dark theme">
+ <svg class="bi"><use href="#moon-stars-fill"></use></svg>
+ </button>
+</div>
</div>
<div class="no-desktop navbar__drawer-container">
- <button class="navbar__toggle-button" id="navbar-toggle-button">
+ <button class="navbar__toggle-button" id="navbar-toggle-button" aria-label="Open navigation menu" aria-expanded="false" aria-controls="navbar-drawer">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
@@ -501,7 +477,7 @@
</header>
<div class="container-fluid td-default">
<div class="base-layout">
- <main role="main" class="td-main container">
+ <main id="main-content" role="main" class="td-main container">
<div class="blogpost-content">
@@ -515,14 +491,14 @@
</div>
- <span class="bodytext__medium--brownish-grey">Thu, Dec 17, 2020</span>
+ <span class="blogpost-content__metadata--date">Thu, Dec 17, 2020</span>
</div>
- <p class="blogpost-content__metadata--title">Apache Airflow 2.0 is here!</p>
+ <h1 class="blogpost-content__metadata--title">Apache Airflow 2.0 is here!</h1>
<div class="blogpost-content__metadata--author">
<span class="blogpost-content__metadata--author-name">Ash Berlin-Taylor</span>
- <a href="https://github.com/ashb/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://github.com/ashb/" class="blogpost-content__metadata--social-media-icon" aria-label="GitHub profile of Ash Berlin-Taylor">
<svg xmlns="http://www.w3.org/2000/svg" width="21.737" height="21.2" viewBox="0 0 21.737 21.2">
<path id="Path_1378" d="M33.971 1181.31a10.87 10.87 0 0 0-3.435 21.182c.543.1.742-.236.742-.524 0-.258-.009-.941-.015-1.848-3.023.657-3.661-1.457-3.661-1.457a2.876 2.876 0 0 0-1.207-1.59c-.987-.674.075-.661.075-.661a2.283 2.283 0 0 1 1.665 1.12 2.314 2.314 0 0 0 3.163.9 2.322 2.322 0 0 1 .69-1.453c-2.413-.274-4.951-1.207-4.951-5.371a4.2 4.2 0 0 1 1.119-2.917 3.908 3.908 0 0 1 .107-2.876s.913-.292 2.989 1.114a10.3 10.3 0 0 1 5.442 0c2.075-1.406 2.986-1.114 2.986-1.114a3.9 3.9 0 0 1 .1 [...]
</svg>
@@ -530,7 +506,7 @@
</a>
- <a href="https://linkedin.com/in/ashberlin/" class="blogpost-content__metadata--social-media-icon">
+ <a href="https://linkedin.com/in/ashberlin/" class="blogpost-content__metadata--social-media-icon" aria-label="LinkedIn profile of Ash Berlin-Taylor">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 21">
<g id="Group_1745" data-name="Group 1745" transform="translate(.155 -.055)">
<ellipse id="Ellipse_20" cx="10" cy="10.5" fill="#51504f" data-name="Ellipse 20" rx="10" ry="10.5" transform="translate(-.155 .055)"/>
... 21808 lines suppressed ...