# Apache Airflow changelog > A platform to programmatically author, schedule and monitor data workflows. - Vendor: Apache Software Foundation - Category: Developer Tools - Official site: https://airflow.apache.org - Tracked by: What's New (https://whatsnew.fyi/product/apache-airflow) - Harvested from: GitHub (apache/airflow) - Entries below: 10 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## Releases ### java-sdk/1.0.0-beta1 — Apache Airflow Java SDK 1.0.0-beta1 - Date: 2026-07-13 - Version: java-sdk/1.0.0-beta1 - Original notes: https://github.com/apache/airflow/releases/tag/java-sdk/1.0.0-beta1 - Permalink: https://whatsnew.fyi/product/apache-airflow/releases/java-sdk-1.0.0-beta1 - Labels: Pre-release First release of the Apache Airflow Java SDK (beta). ### 3.3.0 — Apache Airflow 3.3.0 - Date: 2026-07-06 - Version: 3.3.0 - Original notes: https://github.com/apache/airflow/releases/tag/3.3.0 - Permalink: https://whatsnew.fyi/product/apache-airflow/releases/3.3.0 - **added** — Asset partitioning with new partition mappers RollupMapper, FanOutMapper, FixedKeyMapper, and SegmentWindow that compose with time windows and wait policies to control when partitioned runs fire - **added** — PartitionedAtRuntime timetable that allows Dag to declare partition keys assigned at run start rather than mapped from upstream events - **added** — Partition mapper max downstream keys configuration option [scheduler] partition_mapper_max_downstream_keys to bound total fan-out per upstream event - **added** — First-class state store for tasks and assets via task_state_store and asset_state_store accessors that persist arbitrary key-value state across retries and runs - **added** — State store support for per-key retention with periodic garbage collection and optional clear_on_success - **added** — Pluggable retry policies that enable custom retry strategies such as retrying only on specific exceptions or backing off based on custom logic - **added** — Coordinator layer and Language Task SDK for Java and Go that allows task implementations to be written in non-Python languages while Dag and scheduling stay in Python - **added** — Task stub declaration with @task.stub(queue=...) for routing to language-specific coordinators - **added** — rerun_with_latest_version setting to control whether cleared, rerun, or backfilled Dag runs use the latest bundle version or the original version - **added** — Example Dags from provider distributions registered as dedicated bundles named apache-airflow-providers--example-dags - **changed** — Remote task log handler resolution now owned by airflow_shared.logging.factory module with well-defined precedence over custom configs and ProvidersManager scheme dispatch - **changed** — Remote logging resolution is now lazy on first use instead of eagerly resolved - **deprecated** — airflow.logging_config.load_logging_config is deprecated in favor of new private helpers - **deprecated** — Legacy fallback reading airflow_local_settings.py for remote logging configuration to be removed in Airflow 4.0 📦 PyPI: https://pypi.org/project/apache-airflow/3.3.0/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/3.3.0/ 🛠 Release Notes: https://airflow.apache.org/docs/apache-airflow/3.3.0/release_notes.html 🐳 Docker Image: "docker pull apache/airflow:3.3.0" 🚏 Constraints: https://github.com/apache/airflow/tree/constraints-3.3.0 ##### Significant Changes ###### Asset Partitioning (#64571, #65447, #66030, #66848, #67184, #67475, #67716, #68978) Building on the asset partitioning introduced in 3.2.0, Airflow 3.3.0 substantially expands how a single upstream asset event fans out to partitioned downstream Dag runs. New partition mappers — ``RollupMapper`` (many-to-one), ``FanOutMapper`` (one-to-many), and ``FixedKeyMapper`` + ``SegmentWindow`` (categorical rollup) — compose with time windows (day/week/month/quarter/year) and a ``wait_policy`` (``WaitForAll`` or ``MinimumCount(n)``) to control when partitioned runs fire. Windows can fan out forward or backward in time, and total fan-out per upstream event is bounded by the new ``[scheduler] partition_mapper_max_downstream_keys`` config (configurable per mapper). Airflow 3.3.0 also adds the ``PartitionedAtRuntime`` timetable, which lets a Dag declare that its partition key(s) are assigned when the run starts rather than mapped from an upstream event. For detailed usage instructions, see :doc:`/authoring-and-scheduling/assets`. ###### Task and Asset State Store (#65759, #66073, #66160, #66463, #66586, #66859, #67041, #67292, #67319) Airflow 3.3.0 introduces a first-class state store for tasks and assets (AIP-103). Tasks can persist arbitrary key-value state that survives across retries and runs via a new ``task_state_store`` accessor, and assets can carry their own state via ``asset_state_store`` — both available from the Task SDK. State is kept in the metadata database by default, or in a custom worker-side backend (``[workers] state_store_backend``), supports per-key retention with periodic garbage collection and an optional ``clear_on_success``, and is fully manageable through the Core API and Execution API. For detailed usage instructions, see :doc:`/core-concepts/task-and-asset-state-store`. ###### Pluggable Retry Policies (#65474) Task retry behaviour is now pluggable (AIP-105). In addition to a fixed ``retries`` count, you can attach a custom retry policy that decides whether and when a task is retried, enabling strategies such as retrying only on specific exceptions or backing off based on custom logic. For detailed usage instructions, see :ref:`concepts:retry-policies`. ###### Language Task SDK (Java and Go) (#65958, #67161, #67635, #67699) Airflow 3.3.0 adds a Coordinator layer (AIP-108) that lets individual task implementations be written in non-Python languages while the Dag and its scheduling stay in Python. A task is declared in the Dag with ``@task.stub(queue=...)``; the worker routes it to a configured coordinator (``JavaCoordinator`` for JVM languages, ``ExecutableCoordinator`` for self-contained native binaries such as Go) that runs the task in a language runtime and proxies Variables, Connections, and XComs back through the Execution API. .. warning:: The Coordinator layer and the Java/Go SDKs are experimental in 3.3.0 and may change in future versions based on user feedback. For detailed usage instructions, see :doc:`/authoring-and-scheduling/language-sdks/index`. ###### Dag bundle version on clear, rerun, and backfill (#63884) The new ``rerun_with_latest_version`` setting controls whether a cleared, rerun, or backfilled Dag run uses the latest bundle version or the original version from the initial run. The default is resolved by precedence: an explicit request parameter/CLI flag, then the Dag-level ``rerun_with_latest_version``, then ``[core] rerun_with_latest_version``, and finally ``False`` for clear/rerun and ``True`` for backfills (preserving historical behavi _[Truncated at 4000 characters — full notes: https://github.com/apache/airflow/releases/tag/3.3.0]_ ### helm-chart/1.22.0 — Apache Airflow Helm Chart 1.22.0 - Date: 2026-06-13 - Version: helm-chart/1.22.0 - Original notes: https://github.com/apache/airflow/releases/tag/helm-chart/1.22.0 - Permalink: https://whatsnew.fyi/product/apache-airflow/releases/helm-chart-1.22.0 - **changed** — Minimum Helm version was updated to 3.19.0 - **changed** — Default Airflow image is updated to 3.2.2 - **added** — Add support for configuring enableServiceLinks - **added** — Add optional OTel service to the Airflow Helm Chart - **added** — Add serviceAccountTokenVolume to cleanup cron - **added** — Add requirePersistence option to worker logGroomerSidecar - **changed** — Add checksum for api-server config in API server deployment - **fixed** — Fix Helm chart executor label to support executor aliases - **fixed** — Fix triggerer KEDA database connection rendering - **fixed** — Fix Celery worker liveness probe hostname lookup - **fixed** — Fix Go template error comparing slice to nil using eq - **fixed** — Fix Kubernetes worker service account values - **fixed** — Add binding for workers.kubernetes and condition workers ServiceAccount - **fixed** — Fix launcher RBAC for executor class paths - **fixed** — Fix task log access with NetworkPolicies for Airflow 2 and 3 - **fixed** — Add missing tpl rendering for ServiceAccount annotations - **fixed** — Fix go-template if statements for log groomer retention values - **fixed** — Fix database cleanup lifecycle hooks - **fixed** — Fix cleanup pod lifecycle hooks not being applied - **fixed** — Fix deprecation warning #### Significant Changes ##### Minimum Helm version was updated to `3.19.0` (#66970) ##### Default Airflow image is updated to `3.2.2` (#67681) The default Airflow image that is used with the Chart is now `3.2.2`, previously it was `3.2.1`. ##### Added support for configuring `enableServiceLinks` (#67447) The default will become `false` in Chart 2.0. If you rely on these environment variables, explicitly set `enableServiceLinks: true`, or migrate your code to use DNS-based service lookups. #### New Features - Add optional OTel service to the Airflow Helm Chart (#64902) - Add `serviceAccountTokenVolume` to cleanup cron (#67446) - Add `requirePersistence` option to worker `logGroomerSidecar` (#65884) #### Improvements - Add checksum for api-server config in API server deployment (#66468) #### Bug Fixes - Fix Helm chart executor label to support executor aliases (#67762) - Fix triggerer KEDA database connection rendering (#67538) - Fix Celery worker liveness probe hostname lookup (#67471) - Fix Go template error comparing slice to nil using `eq` (#64032) - Fix Kubernetes worker service account values (#66598) - Add binding for `workers.kubernetes` and condition workers ServiceAccount (#66730) - Fix launcher RBAC for executor class paths (#66208) - Fix task log access with NetworkPolicies for Airflow 2 and 3 (#65754) - Add missing `tpl` rendering for ServiceAccount annotations (#66095) - Fix go-template `if` statements for log groomer retention values (#66012) - Fix database cleanup lifecycle hooks (#65881) - Fix cleanup pod lifecycle hooks not being applied (#65764) - Fix deprecation warning (#66238) #### Doc only changes - Expand Helm Chart upgrade tasks in the Airflow 3 migration guide (#66118) #### Misc - Change job/pod role bindings rendering and refactor related tests (#66626) - Standardize on `Dag` capitalization in chart wording (#66114) ### airflow-ctl/0.1.5 — Apache Airflow Ctl (airflowctl) 0.1.5 - Date: 2026-06-03 - Version: airflow-ctl/0.1.5 - Original notes: https://github.com/apache/airflow/releases/tag/airflow-ctl/0.1.5 - Permalink: https://whatsnew.fyi/product/apache-airflow/releases/airflow-ctl-0.1.5 - **added** — Add dags next execution command - **added** — Add bulk delete Dag Runs - **added** — Add rerun_with_latest_version config hierarchy for clear/rerun behavior - **added** — Implement patching of task group instances in API - **added** — Allow remote version check without authentication - **added** — Add cursor-based pagination for get_dag_runs endpoint - **added** — Enable queueing new tasks - **added** — Add cursor-based pagination for get_task_instances endpoint - **added** — Add is_backfillable property to DAG API responses - **added** — Add Core API endpoints for task state and asset state - **changed** — Expose required primitive parameters of auto-generated commands as positional arguments instead of --flag options - **changed** — Align Dag capitalization from DAG to Dag for airflowctl - **changed** — Send backfill create and dry-run payloads as JSON - **changed** — Cap airflowctl httpx dependency below 1.0 - **fixed** — Fix connections import schema handling - **fixed** — Fix broken download URLs and variable names in docs - **fixed** — Fix missing pyyaml runtime dependency - **fixed** — Fix dagrun list crash when --state is omitted - **fixed** — Fix backfill params not overriding existing DAG run conf - **fixed** — Support clearing, marking success/failure, and deleting multiple task instances :package: PyPI: https://pypi.org/project/apache-airflow-ctl/0.1.5 :books: Docs: https://airflow.apache.org/docs/apache-airflow-ctl/0.1.5 :hammer_and_wrench: Release Notes: https://airflow.apache.org/docs/apache-airflow-ctl/0.1.5/release_notes.html ##### Significant Changes - Add dags next execution command (#66172, #66188) - Add bulk delete Dag Runs (#67095) - Add `rerun_with_latest_version` config hierarchy for clear/rerun behavior (#63884) - Implement patching of task group instances in API (#62812) - Allow remote version check without authentication (#65099) - Add cursor-based pagination for `get_dag_runs` endpoint (#65604) - Enable queueing new tasks (#63484) - Add cursor-based pagination for `get_task_instances` endpoint (#64845) - Add `is_backfillable` property to DAG API responses (#64644) - Expose required primitive parameters of auto-generated commands as positional arguments instead of `--flag` options. Optional parameters keep the `--flag` form. Follows the dev-list lazy consensus on airflowctl parameter style (see ) (#66768) ##### Bug Fixes - Fix connections import schema handling (#67063) - Fix broken download URLs and variable names in docs (#67046) - Fix missing `pyyaml` runtime dependency (#65489) - Fix `dagrun list` crash when `--state` is omitted (#65608) - Fix backfill params not overriding existing DAG run conf (#64939) - Fix Ruff issues in client-py (#64868) ##### Improvements - AIP-103: Add Core API endpoints for task state and asset state (#67041) - Add comment to avoid manual edits to `RELEASE_NOTES.rst` in airflowctl PRs (#67128) - Align Dag capitalization from "DAG" to "Dag" for airflowctl (#66112) - Send backfill create and dry-run payloads as JSON (#65158) - Use existing `safe_load` function in airflowctl utils to load help texts (#65841) - Cap airflowctl `httpx` dependency below 1.0 (#65607) - Remove unused `airflow-ctl/newsfragments` directory (#65507) - Fix incorrect fallback logic (#64586) - Run non-provider mypy checks as regular pre-commit static checks instead of separate CI jobs (#64780) - Support clearing, marking success/failure, and deleting multiple task instances (#64141) ### 3.2.2 — Apache Airflow 3.2.2 - Date: 2026-05-29 - Version: 3.2.2 - Original notes: https://github.com/apache/airflow/releases/tag/3.2.2 - Permalink: https://whatsnew.fyi/product/apache-airflow/releases/3.2.2 - **security** — SMTP STARTTLS upgrade now validates the SMTP server's certificate against the system's trusted CA bundle by default instead of accepting any certificate - **changed** — REST API list endpoints switched from full-match *_pattern query parameters to index-friendly *_prefix_pattern parameters for search filters - **added** — Add per-search-bar "Match anywhere" toggle in the UI to allow users to switch between prefix-based and substring-based search - **fixed** — Fix triggerer race condition and deadlock that caused deferred tasks to stall indefinitely - **added** — Add triggerer subprocess watchdog with [triggerer] runner_health_check_threshold config option to detect hung triggers - **changed** — Tighten [core] allowed_deserialization_classes_regexp to require full-string matches using re.fullmatch() instead of re.match() - **changed** — Custom deadline reference classes must now be registered via the deadline_references attribute on AirflowPlugin - **fixed** — Fix Callback.handle_event triggerer crash when OpenTelemetry metrics receive dict typed tag values - **fixed** — Fix UI modulepreload hrefs to use the api-server static path - **fixed** — Correctly pre-allocate external_executor_id with multiple executors on PostgreSQL - **fixed** — Return raw import-error stacktrace when a DAG file has no registered DAG - **fixed** — Fix Expand/Collapse All functionality on XComs and Audit Log JSON cells in the UI - **fixed** — Load Monaco workers via a same-origin Blob shim in the UI - **fixed** — Show DAG name in browser tab title - **changed** — Require starlette>=1.0.1 for Host-header parsing fix and cadwyn>=6.1.1 for compatibility - **fixed** — Revoke JWT on /auth/logout regardless of auth manager logout URL - **fixed** — Fix deadlock in ti_update_state caused by FOR UPDATE locking dag_run 📦 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 ##### Significant Changes - The SMTP STARTTLS upgrade performed by ``airflow.utils.email.send_email`` now validates the SMTP server's certificate against the system's trusted CA bundle by default. Previously the ``starttls()`` call was made without an SSL context, so any certificate was accepted. Deployments that intentionally point Airflow at an SMTP server with a self-signed or otherwise non-validating certificate and need to preserve the previous behaviour must set ``email.ssl_context = "none"`` in ``airflow.cfg``. The ``"default"`` value (now also the default when the option is unset) uses :func:`ssl.create_default_context`. Previously this option applied only to the ``SMTP_SSL`` path; it now applies to the STARTTLS path as well. (#65346) - In #64963, the Airflow UI switched from full-match ``*_pattern`` REST API query parameters to the new index-friendly ``*_prefix_pattern`` parameters on list endpoints. This is a behavioral change for search-as-you-type filters in the UI: matches are prefix-based (``LIKE 'term%'`` via a range scan) instead of substring-based (``ILIKE '%term%'``), which means the database can use B-tree indexes and search stays fast on large deployments. The REST API itself keeps both forms: existing ``*_pattern`` parameters still behave exactly as before. In #66015, a per-search-bar "Match anywhere" toggle was added so users who relied on the previous substring behavior can opt back into it from the UI. Each search input and each text filter pill now has a small regex-icon toggle next to the value; flipping it on switches that input from ``*_prefix_pattern`` to ``*_pattern``. (#66015) - Fix triggerer race condition and deadlock that caused deferred tasks to stall indefinitely Triggers that call synchronous SDK methods (e.g. ``get_task_states`` used by ``safe_to_cancel`` in several Google provider operators) could crash the triggerer's internal subprocess. The triggerer would then continue to heartbeat normally — appearing healthy to the scheduler — while silently processing zero triggers, causing every deferred task to time out. This was first reported in issue #64620; a partial fix shipped in Airflow 3.2.1 (#64882) but introduced a new deadlock with the same visible symptom under load. Both issues are fixed by replacing the lock-based serialization with response multiplexing: each request now carries a unique ID and the response is routed back to the correct caller, so concurrent requests from trigger threads no longer contend or deadlock regardless of how many triggers are running or what SDK methods they call. **New: triggerer subprocess watchdog** Even with the race fixed, a trigger that blocks the event loop (e.g. by calling ``time.sleep()`` or performing blocking I/O directly in ``async def run()``) would previously leave the triggerer appearing healthy indefinitely. A new ``[triggerer] runner_health_check_threshold`` config option (default: 30 seconds) adds a watchdog: if the triggerer subprocess goes silent for longer than the threshold, the parent process stops updating the heartbeat so the scheduler can detect the hang and reassign triggers rather than waiting for them to individually time out. Set the option to ``0`` to disable the watchdog. (#66412) - Tighten ``[core] allowed_deserialization_classes_regexp`` to require full-string matches Patterns in ``[core] allowed_deserialization_classes_regexp`` are now matched against the entire classname using ``re.fullmatch()`` instead of ``re.match()``. Previously a pattern such as ``airflow\.models\.Variable`` admitte _[Truncated at 4000 characters — full notes: https://github.com/apache/airflow/releases/tag/3.2.2]_ ### helm-chart/1.21.0 — Apache Airflow Helm Chart 1.21.0 - Date: 2026-04-24 - Version: helm-chart/1.21.0 - Original notes: https://github.com/apache/airflow/releases/tag/helm-chart/1.21.0 - Permalink: https://whatsnew.fyi/product/apache-airflow/releases/helm-chart-1.21.0 - **changed** — Move workers config options under workers.celery.* and workers.kubernetes.* - **deprecated** — workers.safeToEvict is now deprecated in favor of workers.celery.safeToEvict/workers.kubernetes.safeToEvict - **deprecated** — workers.hostAliases is now deprecated in favor of workers.celery.hostAliases/workers.kubernetes.hostAliases - **deprecated** — workers.priorityClassName is now deprecated in favor of workers.celery.priorityClassName/workers.kubernetes.priorityClassName - **deprecated** — workers.runtimeClassName is now deprecated in favor of workers.celery.runtimeClassName/workers.kubernetes.runtimeClassName - **deprecated** — workers.schedulerName is now deprecated in favor of workers.celery.schedulerName/workers.kubernetes.schedulerName - **deprecated** — workers.serviceAccount is now deprecated in favor of workers.celery.serviceAccount/workers.kubernetes.serviceAccount - **deprecated** — workers.extraContainers is now deprecated in favor of workers.celery.extraContainers/workers.kubernetes.extraContainers - **deprecated** — workers.extraInitContainers is now deprecated in favor of workers.celery.extraInitContainers/workers.kubernetes.extraInitContainers - **deprecated** — workers.extraVolumes is now deprecated in favor of workers.celery.extraVolumes/workers.kubernetes.extraVolumes - **deprecated** — workers.affinity is now deprecated in favor of workers.celery.affinity/workers.kubernetes.affinity - **deprecated** — workers.tolerations is now deprecated in favor of workers.celery.tolerations/workers.kubernetes.tolerations - **deprecated** — workers.topologySpreadConstraints is now deprecated in favor of workers.celery.topologySpreadConstraints/workers.kubernetes.topologySpreadConstraints - **deprecated** — workers.podAnnotations is now deprecated in favor of workers.celery.podAnnotations/workers.kubernetes.podAnnotations Significant Changes Workers config options have been moved under workers.celery.* and workers.kubernetes.* Please update your configuration accordingly: - workers.safeToEvict is now deprecated in favor of workers.celery.safeToEvict/workers.kubernetes.safeToEvict (#61915). - workers.hostAliases is now deprecated in favor of workers.celery.hostAliases/workers.kubernetes.hostAliases (#61960). - workers.priorityClassName is now deprecated in favor of workers.celery.priorityClassName/workers.kubernetes.priorityClassName (#61961). - workers.runtimeClassName is now deprecated in favor of workers.celery.runtimeClassName/workers.kubernetes.runtimeClassName (#61962). - workers.schedulerName is now deprecated in favor of workers.celery.schedulerName/workers.kubernetes.schedulerName (#62030). - workers.serviceAccount is now deprecated in favor of workers.celery.serviceAccount/workers.kubernetes.serviceAccount (#64730). - workers.extraContainers is now deprecated in favor of workers.celery.extraContainers/workers.kubernetes.extraContainers (#64739). - workers.extraInitContainers is now deprecated in favor of workers.celery.extraInitContainers/workers.kubernetes.extraInitContainers (#64741). ### 3.2.1 — Apache Airflow 3.2.1 - Date: 2026-04-22 - Version: 3.2.1 - Original notes: https://github.com/apache/airflow/releases/tag/3.2.1 - Permalink: https://whatsnew.fyi/product/apache-airflow/releases/3.2.1 - **changed** — The /dags endpoint now requires additional permissions (DagAccessEntity.RUN, DagAccessEntity.HITL_DETAIL, and DagAccessEntity.TASK_INSTANCE) instead of only read access to DAGs - **changed** — Allow UI theme config with only CSS overrides, icon only, or empty {} to restore OSS defaults, making the tokens field optional in theme configuration - **fixed** — Fix DEFAULT_LOGGING_CONFIG to use right kwargs - **fixed** — Fix zip DAG import errors being cleared during bundle refresh - **fixed** — Fix dispose_orm() not disposing async engine on shutdown - **fixed** — Fix get_team_name_dep creating wasted async sessions when multi_team=False - **fixed** — Fix asset graph view leaking DAGs outside the user's permissions - **fixed** — Fix migration: add missing disable_sqlite_fkeys to migration 0108 - **fixed** — Fix heartbeat: add fast-path UPDATE to avoid row lock in the common case - **fixed** — Fix deactivated state not shown for stale DAGs in UI - **fixed** — Fix N+1 queries during DAG serialization with bulk prefetch - **fixed** — Fix serializer for empty string extra in connection - **fixed** — Fix menu positioning for dropdowns in connection forms in UI - **fixed** — Fix SearchBar value not syncing with defaultValue changes in UI - **fixed** — Fix SDK configuration to use $AIRFLOW_CONFIG env - **fixed** — Fix Session staying opened between yields - **fixed** — Fix Session leak from StreamingResponse API endpoints - **fixed** — Fix redirect loop when stale root-path _token cookie exists from older Airflow instance - **fixed** — Fix @task decorator to validate operator arg types at decoration time - **added** — Add write_to_os support for writing task logs to OpenSearch 📦 PyPI: https://pypi.org/project/apache-airflow/3.2.1/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/3.2.1/ 🛠 Release Notes: https://airflow.apache.org/docs/apache-airflow/3.2.1/release_notes.html 🐳 Docker Image: "docker pull apache/airflow:3.2.1" 🚏 Constraints: https://github.com/apache/airflow/tree/constraints-3.2.1 ##### Significant Changes - Users who only have read access to DAGs will no longer be able to fetch data from the ``/dags`` endpoint, as it now requires additional permissions (``DagAccessEntity.RUN``, ``DagAccessEntity.HITL_DETAIL``, and ``DagAccessEntity.TASK_INSTANCE``). This change was made because the endpoint returns aggregated data from these multiple entities. Please update your custom user roles to include read access for DAG Runs, Task Instances, and HITL Details if those users should still have access to the ``/dags`` endpoint. (#64822) ##### Improvements - Allow UI theme config with only CSS overrides, icon only, or empty ``{}`` to restore OSS defaults. The ``tokens`` field is now optional in the theme configuration. (#64552) ##### Bug Fixes - Fix ``DEFAULT_LOGGING_CONFIG`` to use right ``kwargs`` (#65412) (#65424) - Fix zip DAG import errors being cleared during bundle refresh (#63617) (#65296) - Fix ``dispose_orm()`` not disposing async engine on shutdown (#65274) (#65284) - Fix ``get_team_name_dep`` creating wasted async sessions when ``multi_team=False`` (#65275) (#65282) - Fix asset graph view leaking DAGs outside the user's permissions (#65273) (#65280) - Fix migration: add missing ``disable_sqlite_fkeys`` to migration 0108 (#65288) (#65290) - Fix heartbeat: add fast-path ``UPDATE`` to avoid row lock in the common case (#65029) (#65137) - UI: Fix deactivated state not shown for stale DAGs (#65214) (#65218) - Fix N+1 queries during DAG serialization with bulk prefetch (#64929) (#65208) - Fix serializer for empty string extra in connection (#65014) (#65215) - UI: Fix menu positioning for ``dropdowns`` in connection forms (#65007) (#65085) (#65138) - UI: Fix ``SearchBar`` value not syncing with ``defaultValue`` changes (#65054) (#65140) - Fix SDK configuration to use ``$AIRFLOW_CONFIG`` env (#64936) (#65200) - Fix ``Session`` staying opened between yields (#65179) (#65195) - Fix ``Session`` leak from ``StreamingResponse`` API endpoints (#65162) (#65193) - Fix redirect loop when stale root-path ``_token`` cookie exists from older Airflow instance (#64955) (#65177) - Fix ``@task`` decorator to validate operator arg types at decoration time (#65041) (#65050) - Fix CLI error handling and exit codes for failed commands (#65052) (#65097) - Fix ``is_alive`` default to ``None`` in ``jobs list`` CLI (#65065) (#65091) - Fix missing ``dag_id`` in ``get_task_instance`` (#64957) (#64968) (#65067) - UI: Fix cancel ``debounce`` on clear to prevent stale search value (#64893) (#64907) - Fix read out-of-order issue with send method in ``CommsDecoder`` (#64894) (#64946) - Fix bulk connection delete banner (#64735) (#64961) - Fix migrations: move ``UPDATE``s inside ``disable_sqlite_fkeys`` in migration 0097 (#64876) (#64940) - Fix heartbeat to return 410 Gone when cleared ``TI`` exists in TIH (#61631) (#64693) - Fix scheduler: skip asset-triggered Dags without ``SerializedDagModel`` (#64322) (#64738) - Fix N+1 query pattern in task instance states and count endpoints (#60352) (#64695) - Fix ``TypeError`` in ``GET /dags/{dag_id}/tasks`` when ``order_by`` field has ``None`` values (#64384) (#64587) - UI: Fix duplicate nav sidebar when iframe navigates away from auth pages (#63873) (#64854) - UI: Fix Gantt view "Error invalid date" on running ``DagRun`` (#64752) (#64853) - Fix ``connections import`` returning non-zero exit code on failure (#64416) (#64449) - Fix structlog positional formatting for single-dict arguments (#62849) (#64773) - UI: Fix external link ``target`` and add ``rel`` attributes (#64542) (#64772) - UI: Fix ``DagVersionSelect`` o _[Truncated at 4000 characters — full notes: https://github.com/apache/airflow/releases/tag/3.2.1]_ ### 3.2.0 — Apache Airflow 3.2.0 - Date: 2026-04-07 - Version: 3.2.0 - Original notes: https://github.com/apache/airflow/releases/tag/3.2.0 - Permalink: https://whatsnew.fyi/product/apache-airflow/releases/3.2.0 - **added** — Asset partitioning feature allows scheduling downstream processing based on specific partitions of data instead of entire assets - **added** — Multi-team deployments support enabling organizations to run multiple isolated teams within a single Airflow deployment with separate Dags, connections, variables, pools, and executors - **added** — Synchronous callback support for Deadline Alerts via SyncCallback in addition to asynchronous AsyncCallback - **added** — Grid view now uses virtualization to render only visible rows, improving performance for Dags with large numbers of task runs - **added** — XCom values can now be added, edited, and deleted directly from the Airflow UI - **added** — Human-in-the-Loop approval interface now includes full history view showing complete audit trail of approvals and rejections - **added** — Gantt chart now displays all task tries, not just the latest attempt - **added** — Task display names now shown in Gantt chart for better readability - **added** — New --only-idle flag for the scheduler CLI to only count runs when the scheduler is idle - **changed** — Grid, graph, gantt, and task-detail views now fetch task-instance summaries through a single streaming HTTP request instead of one request per run - **changed** — Old single-run endpoint GET /ui/grid/ti_summaries/{dag_id}/{run_id} has been removed in favor of streaming endpoint - **added** — Structured JSON logging for all API server output via new json_logs option under [logging] section - **fixed** — Gantt chart no longer crashes on tasks with null datetime fields - **changed** — Gantt chart now uses ISO dates for cross-browser consistent date format 📦 PyPI: https://pypi.org/project/apache-airflow/3.2.0/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/3.2.0/ 🛠 Release Notes: https://airflow.apache.org/docs/apache-airflow/3.2.0/release_notes.html 🐳 Docker Image: "docker pull apache/airflow:3.2.0" 🚏 Constraints: https://github.com/apache/airflow/tree/constraints-3.2.0 ##### Significant Changes ###### Asset Partitioning The headline feature of Airflow 3.2.0 is asset partitioning — a major evolution of data-aware scheduling. Instead of triggering Dags based on an entire asset, you can now schedule downstream processing based on specific partitions of data. Only the relevant slice of data triggers downstream work, making pipeline orchestration far more efficient and precise. This matters when working with partitioned data lakes — date-partitioned S3 paths, Hive table partitions, BigQuery table partitions, or any other partitioned data store. Previously, any update to an asset triggered all downstream Dags regardless of which partition changed. Now only the right work gets triggered at the right time. For detailed usage instructions, see :doc:`/authoring-and-scheduling/assets`. ###### Multi-Team Deployments 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. 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. For detailed usage instructions, see :doc:`/core-concepts/multi-team`. .. warning:: Multi-Team Deployments are experimental in 3.2.0 and may change in future versions based on user feedback. ###### Synchronous callback support for Deadline Alerts Deadline Alerts now support synchronous callbacks via ``SyncCallback`` in addition to the existing asynchronous ``AsyncCallback``. Synchronous callbacks are executed by the executor (rather than the triggerer), and can optionally target a specific executor via the ``executor`` parameter. A Dag can also define multiple Deadline Alerts by passing a list to the ``deadline`` parameter, and each alert can use either callback type. .. warning:: Deadline Alerts are experimental in 3.2.0 and may change in future versions based on user feedback. Synchronous deadline callbacks (``SyncCallback``) do not currently support Connections stored in the Airflow metadata database. For detailed usage instructions, see :doc:`/howto/deadline-alerts`. ###### UI Enhancements & Performance - **Grid View Virtualization**: The Grid view now uses virtualization -- only visible rows are rendered to the DOM. This dramatically improves performance when viewing Dags with large numbers of task runs, reducing render time and memory usage for complex Dags. (#60241) - **XCom Management in the UI**: You can now add, edit, and delete XCom values directly from the Airflow UI. This makes it much easier to debug and manage XCom state during development and day-to-day operations without needing CLI commands. (#58921) - **HITL Detail History**: The Human-in-the-Loop approval interface now includes a full history view, letting operators and reviewers see the complete audit trail of approvals and rejections for any task. (#56760, #55952) - **Gantt Chart Improvements**: - All task tries displayed: Gantt chart now shows every attempt, not just the latest - Task display names in Gantt: task_display_name shown for better readability (#61438) - ISO dates in Gantt: Cross-browser consistent date format (#61250) - Fixed null datetime crash: Gantt chart no longer crashes on tasks with null datetime fields ###### New ``--only-idle`` flag for _[Truncated at 4000 characters — full notes: https://github.com/apache/airflow/releases/tag/3.2.0]_ ### helm-chart/1.20.0 — Apache Airflow Helm Chart 1.20.0 - Date: 2026-03-22 - Version: helm-chart/1.20.0 - Original notes: https://github.com/apache/airflow/releases/tag/helm-chart/1.20.0 - Permalink: https://whatsnew.fyi/product/apache-airflow/releases/helm-chart-1.20.0 - **removed** — Support for Apache Airflow versions below 2.11.0 has been dropped - **deprecated** — workers.command is deprecated in favor of workers.celery.command/workers.kubernetes.command - **deprecated** — workers.securityContexts is deprecated in favor of workers.celery.securityContexts/workers.kubernetes.securityContexts - **deprecated** — workers.containerLifecycleHooks is deprecated in favor of workers.celery.containerLifecycleHooks/workers.kubernetes.containerLifecycleHooks - **deprecated** — workers.kerberosSidecar is deprecated in favor of workers.celery.kerberosSidecar/workers.kubernetes.kerberosSidecar - **deprecated** — workers.kerberosInitContainer is deprecated in favor of workers.celery.kerberosInitContainer/workers.kubernetes.kerberosInitContainer - **deprecated** — workers.terminationGracePeriodSeconds is deprecated in favor of workers.celery.terminationGracePeriodSeconds/workers.kubernetes.terminationGracePeriodSeconds - **deprecated** — workers.nodeSelector is deprecated in favor of workers.celery.nodeSelector/workers.kubernetes.nodeSelector - **deprecated** — workers.podDisruptionBudget is deprecated in favor of workers.celery.podDisruptionBudget - **deprecated** — workers.keda is deprecated in favor of workers.celery.keda - **deprecated** — workers.resources is deprecated in favor of workers.celery.resources and workers.kubernetes.resources - **changed** — Readiness probe will be removed from Git-Sync; set dags.gitSync.recommendedProbeSetting to true to enable feature behavior - **changed** — Liveness probe behavior for Git-Sync will be changed; set dags.gitSync.recommendedProbeSetting to true to enable feature behavior - **removed** — Automatic KUBERNETES_ENVIRONMENT_VARIABLES and KUBERNETES_SECRETS prefixes have been removed from container_extra_envs and custom_airflow_environment helper functions - **changed** — Default Airflow image is updated to 3.1.8 - **added** — Support Helm template expressions in podAnnotations and airflowPodAnnotations values - **added** — Add minute-level log retention to clean-logs script - **added** — Add LOG_MAX_SIZE environment variable to log groomer - **removed** — Remove JWT secrets from triggerer, worker and dag-processor #### Significant Changes ##### Support for old versions of Apache Airflow <2.11 has been dropped (#61018) Minimum supported version of Apache Airflow is now 2.11.0. If you want to deploy an old version of Apache Airflow, please use the last released version of the chart 1.19.0. ##### ``workers`` specific sections have been moved to ``workers.celery`` / ``workers.kubernetes`` sections Please update your configuration accordingly: * ``workers.command`` command is now deprecated in favor of ``workers.celery.command``/``workers.kubernetes.command`` (#60067). * ``workers.securityContexts`` command is now deprecated in favor of ``workers.celery.securityContexts``/``workers.kubernetes.securityContexts`` (#60396). * ``workers.containerLifecycleHooks`` command is now deprecated in favor of ``workers.celery.containerLifecycleHooks``/``workers.kubernetes.containerLifecycleHooks`` (#61369). * ``workers.kerberosSidecar`` section is now deprecated in favor of ``workers.celery.kerberosSidecar``/``workers.kubernetes.kerberosSidecar`` (#61881). * ``workers.kerberosInitContainer`` section is now deprecated in favor of ``workers.celery.kerberosInitContainer``/``workers.kubernetes.kerberosInitContainer`` (#60751). * ``workers.terminationGracePeriodSeconds`` command is now deprecated in favor of ``workers.celery.terminationGracePeriodSeconds``/``workers.kubernetes.terminationGracePeriodSeconds`` (#61892). * ``workers.nodeSelector`` command is now deprecated in favor of ``workers.celery.nodeSelector``/``workers.kubernetes.nodeSelector`` (#61957). * ``workers.podDisruptionBudget`` section is now deprecated in favor of ``workers.celery.podDisruptionBudget``. Please update your configuration accordingly. (#61414) * ``workers.keda`` section is now deprecated in favor of ``workers.celery.keda``. Please update your configuration accordingly. (#61820) * ``workers.resources`` section is now deprecated in favor of ``workers.celery.resources`` and ``workers.kubernetes.resources``. Please update your configuration accordingly. (#61890) The previous configuration options are still working, but are deprecated and will be removed in a future version. ##### As Git-Sync is not service-type object, the readiness probe will be removed. (#62334) To enable feature behaviour set ``dags.gitSync.recommendedProbeSetting`` to ``true``. Section itself will be removed in future release as to not break setups during upgrades. As Git-Sync has dedicated liveness service, the liveness probe behaviour will be changed. To enable feature behaviour set ``dags.gitSync.recommendedProbeSetting`` to ``true``. Please update your configuration accordingly. ##### Automatic env variables removed from ``container_extra_envs`` and ``custom_airflow_environment`` (#60750) The automatic prefix addition for Kubernetes Executor environment variables and secrets has been removed from both the ``container_extra_envs`` and ``custom_airflow_environment`` helper functions. **What changed:** Previously, when you added environment variables to component-specific configurations (e.g., ``.Values.scheduler.env``), the chart automatically created an additional environment variable (to specified in the ``env`` section) with the ``AIRFLOW__KUBERNETES_ENVIRONMENT_VARIABLES__`` prefix for Kubernetes Executor worker pods. After this change, only the variable specified in ``env`` section will be created. Furthermore, for values specified under ``.Values.secret`` section, the ``AIRFLOW__KUBERNETES_SECRETS__`` prefix is no longer automatically added. Secrets are now passed as-is via ``secretKeyRef`` without the prefixed copy for worker pods. **Why this change:** * Prevent unintended exposure of sensitive data like ``client_secret`` information. Previously, due to prefix, it was recognized as internal Airflow configuration leading to unintended exposure in Airflow UI (under Admin -> Configuration), even when ``AIRFLOW__API__EXPOSE_CONFIG`` is set to ``non-sensi _[Truncated at 4000 characters — full notes: https://github.com/apache/airflow/releases/tag/helm-chart/1.20.0]_ ### airflow-ctl/0.1.3 — Apache Airflow Ctl (airflowctl) 0.1.3 - Date: 2026-03-19 - Version: airflow-ctl/0.1.3 - Original notes: https://github.com/apache/airflow/releases/tag/airflow-ctl/0.1.3 - Permalink: https://whatsnew.fyi/product/apache-airflow/releases/airflow-ctl-0.1.3 - **added** — Add airflowctl auth token command to print JWT access tokens - **added** — Add --action-on-existing-key option to pools import and connections import - **added** — Add retry mechanism to airflowctl - **added** — Support for airflowctl on headless environments - **changed** — airflowctl auth login now prompts for credentials interactively when none are provided - **fixed** — Fix airflowctl pools export ignoring --output table/yaml/plain - **fixed** — Fix airflowctl connections import failure when JSON omits extra field - **fixed** — Amend compatibility issues for airflowctl - **changed** — Send limit parameter in execute_list server requests - **changed** — Clean up stale Python 3.9 workaround in airflow-ctl CLI config parser - **changed** — Expose timetable_partitioned in UI API 📦 PyPI: https://pypi.org/project/apache-airflow-ctl/0.1.3/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow-ctl/0.1.3/ 🛠 Release Notes: https://airflow.apache.org/docs/apache-airflow-ctl/0.1.3/release_notes.html Thanks to all the contributors who made this possible. Next time, Release notes will be available through public documentation. ##### Significant Changes - Add airflowctl auth token command to print JWT access tokens ([#62843](https://github.com/apache/airflow/pull/62843)) - Add `--action-on-existing-key` to pools import and connections import ([#62702](https://github.com/apache/airflow/pull/62702)) - Add retry mechanism to airflowctl and remove flaky integration mark ([#63016](https://github.com/apache/airflow/pull/63016)) - airflowctl auth login: prompt for credentials interactively when none are provided ([#62549](https://github.com/apache/airflow/pull/62549)) - feat(airflowctl): support on headless environments ([#62217](https://github.com/apache/airflow/pull/62217)) ##### Bug Fixes - Fix airflowctl pools export ignoring --output table/yaml/plain ([#62665](https://github.com/apache/airflow/pull/62665)) - Fix airflowctl connections import failure when JSON omits extra field ([#62662](https://github.com/apache/airflow/pull/62662)) - Amend compatibility issues for airflowctl ([#63388](https://github.com/apache/airflow/pull/63388)) ##### Improvements - Send limit parameter in execute_list server requests ([#63048](https://github.com/apache/airflow/pull/63048)) - Run test coverage when airflowctl command has any change ([#63216](https://github.com/apache/airflow/pull/63216)) - airflow-ctl: add coverage tests for console formatting output ([#62627](https://github.com/apache/airflow/pull/62627)) - Clean up stale Python 3.9 workaround in airflow-ctl CLI config parser ([#62206](https://github.com/apache/airflow/pull/62206)) - Expose timetable_partitioned in UI API ([#62777](https://github.com/apache/airflow/pull/62777))