NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #3995 most downloaded on PyPI
Provider package apache-airflow-providers-openlineage for Apache Airflow
Last release 6 days ago
29 Sep 2026
Ships fairly regularly
a new release about every 2 weeks
Nearly every release is documented
notes for 59 of 59 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
127 releases · first in 2023
One column per quarter.
- Fix OpenLineage emitting duplicate START events for rescheduled sensors
Release Date: 2026-09-29
Fix OpenLineage emitting duplicate START events for rescheduled sensors (#73144)
Document Databricks parent-job propagation in the Spark guide (#72643)
Fix OpenLineage emitting duplicate START events for rescheduled sensors (#73144)
Document Databricks parent-job propagation in the Spark guide (#72643)
Nothing published for this version
- Fix incorrect availability versions for OpenLineage config options
Release Date: 2026-08-23
Fix incorrect availability versions for OpenLineage config options (#71449)
Avoid lazy-loading the bundle when resolving 'team_name' for Dag run lineage (#70312)
Fix incorrect availability versions for OpenLineage config options (#71449)
Avoid lazy-loading the bundle when resolving 'team_name' for Dag run lineage (#70312)
Nothing published for this version
- OpenLineage: add execute_in_thread to emit task events without forking
Release Date: 2026-08-08
OpenLineage: add execute_in_thread to emit task events without forking (#68708)
Add team_name tag to OpenLineage metrics (#69109)
Fix openlineage team name handling, add dag_version_data and TI note (#70772)
OpenLineage: reuse per-process adapter in dag-state-change pool workers (#69283)
Fix OpenLineage team_name access and other failing paths (#70626)
Bump openlineage libraries to 1.52 in openlineage provider (#70773)
Add OpenLineage parent info to EMR Spark steps (#70182)
Document GlueJobOperator support for OpenLineage Spark injection (#69652)
OpenLineage: add execute_in_thread to emit task events without forking (#68708)
Add team_name tag to OpenLineage metrics (#69109)
Fix openlineage team name handling, add dag_version_data and TI note (#70772)
OpenLineage: reuse per-process adapter in dag-state-change pool workers (#69283)
Fix OpenLineage team_name access and other failing paths (#70626)
Bump openlineage libraries to 1.52 in openlineage provider (#70773)
Add OpenLineage parent info to EMR Spark steps (#70182)
Document GlueJobOperator support for OpenLineage Spark injection (#69652)
Nothing published for this version
Nothing published for this version
Nothing published for this version
- Add unified emission_policy config for OpenLineage provider
Release Date: 2026-07-10
Add unified emission_policy config for OpenLineage provider (#66992)
Add OpenLineage Spark conf injection to DatabricksSubmitRunOperator (#67894)
Add unified emission_policy config for OpenLineage provider (#66992)
Add OpenLineage Spark conf injection to DatabricksSubmitRunOperator (#67894)
Nothing published for this version
- Add openlineage system tests for missing use cases
Release Date: 2026-06-22
Add openlineage system tests for missing use cases (#68664)
Nothing published for this version
- Openlineage: Read HTTP API key auth from Airflow connection
Release Date: 2026-06-07
Openlineage: Read HTTP API key auth from Airflow connection (#66342)
Self-heal ProcessPoolExecutor on BrokenProcessPool (#67400)
Remove further findings from positional session check (#67712)
Correct README.rst common compat version reference inconsistency (#67554)
Openlineage: Read HTTP API key auth from Airflow connection (#66342)
Self-heal ProcessPoolExecutor on BrokenProcessPool (#67400)
Remove further findings from positional session check (#67712)
Correct README.rst common compat version reference inconsistency (#67554)
Nothing published for this version
- Add standardized SQL check representation for listeners
Release Date: 2026-05-23
Add standardized SQL check representation for listeners (#66849)
Cache connections in OpenLineage SQL hook lineage (#64843)
Add standardized SQL check representation for listeners (#66849)
Cache connections in OpenLineage SQL hook lineage (#64843)
Nothing published for this version
- Remove the DualStatsManager and the Stats interfaces
Release Date: 2026-05-11
Remove the DualStatsManager and the Stats interfaces (#63932)
Add public emit_dataset_lineage and emit_query_lineage API for OpenLineage provider (#65788)
Add dynamically emitted asset events to OpenLineage (#65727)
Prevent stats from breaking executor initializer (#66351)
Manual state change should not use fork-execute model on scheduler (#65677)
Cleanup integration names for consistency (#66287)
Bump Ol client dependency to 1.46 (#66145)
Remove the DualStatsManager and the Stats interfaces (#63932)
Add public emit_dataset_lineage and emit_query_lineage API for OpenLineage provider (#65788)
Add dynamically emitted asset events to OpenLineage (#65727)
Prevent stats from breaking executor initializer (#66351)
Manual state change should not use fork-execute model on scheduler (#65677)
Cleanup integration names for consistency (#66287)
Bump Ol client dependency to 1.46 (#66145)
Nothing published for this version
- Add rendered map_index template to OpenLineage events
Release Date: 2026-04-26
Add rendered map_index template to OpenLineage events (#65529)
Fix DetachedInstanceError in OpenLineage listener by using safe_getattr (#65579)
Add rendered map_index template to OpenLineage events (#65529)
Fix DetachedInstanceError in OpenLineage listener by using safe_getattr (#65579)
Nothing published for this version
- Add OpenLineage parent and transport info injection to 'EmrServerlessStartJobOperator'
Release Date: 2026-04-13
Add OpenLineage parent and transport info injection to 'EmrServerlessStartJobOperator' (#64807)
Add OpenLineage parent info injection to GlueJobOperator (#64513)
Add dagrun partition info to OpenLineage events (#64897)
Fix OpenLineage SQL utils emitting duplicate datasets for tables in multiple schemas (#64622)
Fix example dags documentation links (#65071)
Add OpenLineage parent and transport info injection to 'EmrServerlessStartJobOperator' (#64807)
Add OpenLineage parent info injection to GlueJobOperator (#64513)
Add dagrun partition info to OpenLineage events (#64897)
Fix OpenLineage SQL utils emitting duplicate datasets for tables in multiple schemas (#64622)
Fix example dags documentation links (#65071)
Nothing published for this version
Nothing published for this version
- Add Deadline Alerts to OL events
Release Date: 2026-03-28
Add Deadline Alerts to OL events (#63352)
Add Python 3.14 Support (#63520)
Clarify HLL in extraction precedence (#63723)
Fix typos and spelling (#64139)
Add Deadline Alerts to OL events (#63352)
Add Python 3.14 Support (#63520)
Clarify HLL in extraction precedence (#63723)
Fix typos and spelling (#64139)
Nothing published for this version
Release Date: 2026-03-13 ### Features - Add DagRun note to OL events
Release Date: 2026-03-13
Add DagRun note to OL events (#62347)
Nothing published for this version
Emit warning for deprecated BaseOperatorLink.get_link signature
DeltaTriggerTimetable for trigger-based scheduling (#47074)This change introduces DeltaTriggerTimetable, a new built-in timetable that complements the existing suite of Airflow timetables by supporting delta-based trigger schedules without relying on data intervals.
Airflow currently has two major types of timetables:
CronDataIntervalTimetable, DeltaDataIntervalTimetable)CronTriggerTimetable)However, there was no equivalent trigger-based option for delta intervals like timedelta(days=1).
As a result, even simple schedules like schedule=timedelta(days=1) were interpreted through a data interval
lens—adding unnecessary complexity for users who don't care about upstream/downstream data dependencies.
This feature is backported to Airflow 2.11.0 to help users begin transitioning before upgrading to Airflow 3.0.
schedule=timedelta(...) still defaults to DeltaDataIntervalTimetable.[scheduler] create_delta_data_intervals (default: True) allows opting in to DeltaTriggerTimetable.False, meaning DeltaTriggerTimetable becomes the default for timedelta schedules.By flipping this config in 2.11, users can preview and adopt the new scheduling behavior in advance — minimizing surprises during upgrade.
Previously, Airflow reported timing metrics in milliseconds for StatsD but in seconds for other backends
such as OpenTelemetry and Datadog. This inconsistency made it difficult to interpret or compare
timing metrics across systems.
Airflow 2.11 introduces a new config option:
[metrics] timer_unit_consistency (default: False in 2.11, True and dropped in Airflow 3.0).When enabled, all timing metrics are consistently reported in milliseconds, regardless of the backend.
This setting has become mandatory and always True in Airflow 3.0 (the config will be removed), so
enabling it in 2.11 allows users to migrate early and avoid surprises during upgrade.
This release introduces several changes to help users prepare for upgrading to Airflow 3:
execution_date now also include a logical_date field. Airflow 3 drops execution_date entirely in favor of logical_date (#44283)airflow config lint and airflow config update commands in 2.11 to help audit and migrate configs for Airflow 3.0. (#45736, #50353, #46757)Support for Python 3.8 has been removed, as it has reached end-of-life. Airflow 2.11 requires Python 3.9, 3.10, 3.11, or 3.12.
DeltaTriggerTimetable (#47074)airflow config update and airflow config lint changes to ease migration to Airflow 3 (#45736, #50353)ti.log_url timestamp format from "%Y-%m-%dT%H:%M:%S%z" to "%Y-%m-%dT%H:%M:%S.%f%z" (#50306)airflow.cfg contains a random fernet_key and secret_key (#47755)rendered_map_index via internal api (#49057)TaskInstancePydantic into TaskInstance (#48571)log_url property on TaskInstancePydantic (Internal API) (#50560)TypeError when deserializing task with execution_timeout set to None (#46822)check_query_exists returns a bool (#46707)/xcom/list got exception when applying filter on the value column (#46053)logical_date to models using execution_date (#44283)BaseOperatorLink.get_link signature (#46448)airflow.cfg variable (#48084)XCom docs to show examples of pushing multiple XComs (#46284, #47068)Release Date: 2026-03-02
feat: Consume SQL hook lineage in OpenLineage (#62171)
feat: Add Dag Edge Labels to OpenLineage event (#62018)
feat: Add OpenLineage support for HITL operators (#61867)
Bump min sqlalchemy version to 1.4.54 (#62299)
Route providers to consume Stats from common compat provider (#61812)
feat: Consume SQL hook lineage in OpenLineage (#62171)
feat: Add Dag Edge Labels to OpenLineage event (#62018)
feat: Add OpenLineage support for HITL operators (#61867)
Bump min sqlalchemy version to 1.4.54 (#62299)
Route providers to consume Stats from common compat provider (#61812)
Nothing published for this version
Deprecate --tree flag for tasks list cli command
No significant changes.
renderedTemplates as keys to skip camelCasing (#42206) (#42208)camelcase xcom entries (#42182) (#42187)0.2.4 as it breaks our integration (#42101)LibCST (#42089)--tree flag for tasks list cli command (#41965)security_model.rst to clear unauthenticated endpoints exceptions (#42085)Release Date: 2026-02-14
Move lineage from airflow core to task sdk (#61157)
Nothing published for this version
Remove deprecation warning for cgitb in Plugins Manager
No significant changes.
tojson filter to example_inlet_event_extra example dag (#41890)keycloak (#41791)Release Date: 2026-02-02
Add AirflowRunFacet to AF3 tasks with externally changed state (#60583)
Add SQLAlchemy to the dev‑dependency group in providers (#60472)
Option to disable exporting of legacy metric names (#53722)
Refresh OpenLineage provider docs (#60462)
Add OpenLineage known limitations to troubleshooting page (#61072)
Add AirflowRunFacet to AF3 tasks with externally changed state (#60583)
Add SQLAlchemy to the dev‑dependency group in providers (#60472)
Option to disable exporting of legacy metric names (#53722)
Refresh OpenLineage provider docs (#60462)
Add OpenLineage known limitations to troubleshooting page (#61072)
Nothing published for this version
…occur when the DAG is active. While this is a breaking change, the previous behavior is considered a bug.
Previously, when a DAG is paused or removed, incoming dataset events would still trigger it, and the DAG would run when it is unpaused or added back in a DAG file. This has been changed; a DAG's dataset schedule can now only be satisfied by events that occur when the DAG is active. While this is a breaking change, the previous behavior is considered a bug.
The behavior of time-based scheduling is unchanged, including the timetable part
of DatasetOrTimeSchedule.
try_number is no longer incremented during task execution (#39336)Previously, the try number (try_number) was incremented at the beginning of task execution on the worker. This was problematic for many reasons.
For one it meant that the try number was incremented when it was not supposed to, namely when resuming from reschedule or deferral. And it also resulted in
the try number being "wrong" when the task had not yet started. The workarounds for these two issues caused a lot of confusion.
Now, instead, the try number for a task run is determined at the time the task is scheduled, and does not change in flight, and it is never decremented. So after the task runs, the observed try number remains the same as it was when the task was running; only when there is a "new try" will the try number be incremented again.
One consequence of this change is, if users were "manually" running tasks (e.g. by calling ti.run() directly, or command line airflow tasks run),
try number will no longer be incremented. Airflow assumes that tasks are always run after being scheduled by the scheduler, so we do not regard this as a breaking change.
/logout endpoint in FAB Auth Manager is now CSRF protected (#40145)The /logout endpoint's method in FAB Auth Manager has been changed from GET to POST in all existing
AuthViews (AuthDBView, AuthLDAPView, AuthOAuthView, AuthOIDView, AuthRemoteUserView), and
now includes CSRF protection to enhance security and prevent unauthorized logouts.
This new feature adds capability for Apache Airflow to emit 1) airflow system traces of scheduler, triggerer, executor, processor 2) DAG run traces for deployed DAG runs in OpenTelemetry format. Previously, only metrics were supported which emitted metrics in OpenTelemetry. This new feature will add richer data for users to use OpenTelemetry standard to emit and send their trace data to OTLP compatible endpoints.
(@skip_if, @run_if) to make it simple to apply whether or not to skip a Task. (#41116)This feature adds a decorator to make it simple to skip a Task.
Previously known as hybrid executors, this new feature allows Airflow to use multiple executors concurrently. DAGs, or even individual tasks, can be configured
to use a specific executor that suits its needs best. A single DAG can contain tasks all using different executors. Please see the Airflow documentation for
more details. Note: This feature is still experimental. See documentation on Executor <https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/executor/index.html#using-multiple-executors-concurrently>_ for a more detailed description.
Airflow integrates Scarf to collect basic usage data during operation. Deployments can opt-out of data collection by setting the [usage_data_collection]enabled option to False, or the SCARF_ANALYTICS=false environment variable.
See FAQ on this <https://airflow.apache.org/docs/apache-airflow/stable/faq.html#does-airflow-collect-any-telemetry-data>_ for more information.
accessors to read dataset events defined as inlet (#39367)dag test (#40010)endDate in task instance tooltip. (#39547)accessors to read dataset events defined as inlet (#39367, #39893)run_if & skip_if decorators (#41116)renderedjson component (#40964)get_extra_dejson method with nested parameter which allows you to specify if you want the nested json as string to be also deserialized (#39811)__getattr__ to task decorator stub (#39425)RemovedIn20Warning in airflow task command (#39244)db migrate error messages (#39268)suppress_and_warn warning (#39263)declarative_base from sqlalchemy.orm instead of sqlalchemy.ext.declarative (#39134)on_task_instance_failed access to the error that caused the failure (#38155)output_processor parameter to BashProcessor (#40843)never_fail in BaseSensor (#40915)start_date (#40878)external_task_group_id to WorkflowTrigger (#39617)BaseSensorOperator introduce skip_policy parameter (#40924)__init__ (#41086)OTel Traces (#40874)pydocstyle rules to pyproject.toml (#40569)pydocstyle rule D213 in ruff. (#40448, #40464)Dag.test() to run with an executor if desired (#40205)AirflowInternalRuntimeError for raise non catchable errors (#38778)pytest to 8.0+ (#39450)back_populates between DagScheduleDatasetReference.dag and DagModel.schedule_dataset_references (#39392)B028 (no-explicit-stacklevel) in core (#39123)ImportError to ParseImportError for avoid shadowing with builtin exception (#39116)SubDagOperator examples warnings (#39057)model_dump instead of dict for serialize Pydantic V2 model (#38933)ws from 7.5.5 to 7.5.10 in /airflow/www (#40288)filesystems and dataset-uris to "how to create your own provider" page (#40801)otel_on to True in example airflow.cfg (#40712)task_id from send_email to send_email_notification in taskflow.rst (#41060)Release Date: 2026-01-17
Add on_task_instance_skipped support to OpenLineage listener (#60409)
Add JobDependenciesRunFacet to asset-triggered OL DAG events (#59521)
Fixing static checks in OL adapter on main (#60042)
Consume ''AirflowOptionalProviderFeatureException'' from compat sdk in providers (#60335)
New year means updated Copyright notices (#60344)
Move listeners module to shared library for client server separation (#59883)
Move over plugins_manager to a shared library (#59956)
Allow providers to consume AirflowConfigException from compat sdk (#60044)
Source openlineage provider to use airflow.sdk.configuration.conf (#60026)
Make sqlalchemy optional dependency for openlineage provider (#59921)
Improve changelog descriptions in PR #59947 (latest versions only) (#60036)
Add on_task_instance_skipped support to OpenLineage listener (#60409)
Add JobDependenciesRunFacet to asset-triggered OL DAG events (#59521)
Fixing static checks in OL adapter on main (#60042)
Consume ''AirflowOptionalProviderFeatureException'' from compat sdk in providers (#60335)
New year means updated Copyright notices (#60344)
Move listeners module to shared library for client server separation (#59883)
Move over plugins_manager to a shared library (#59956)
Allow providers to consume AirflowConfigException from compat sdk (#60044)
Source openlineage provider to use airflow.sdk.configuration.conf (#60026)
Make sqlalchemy optional dependency for openlineage provider (#59921)
Improve changelog descriptions in PR #59947 (latest versions only) (#60036)
Nothing published for this version
Do not provide deprecated execution_date in @apply_lineage
No significant changes.
AirflowSecurityManagerV2 leave transactions in the idle in transaction state (#39935)SafeDogStatsdLogger to use get_validator to enable pattern matching (#39370)has_access (#39421)execution_date in @apply_lineage (#39327)sql_alchemy_engine_args config example (#38971)yandex provider to avoid mypy errors (#39990)provider_info_cache decorator (#39750)defer (#39742)idx_last_scheduling_decision on dag_run table (#39275)CronDataIntervalTimetable (#39780)Release Date: 2026-01-02
Move MappedOperator to serialization (#59628)
Split SerializedBaseOperator from serde logic (#59627)
Minor cleanups removing SDK references from Core (#59491)
Refactor deprecated SQLA query openlineage provider (#59448)
Bump OpenLineage client dependency to 1.41 (#59321)
Extract shared "module_loading" distribution (#59139)
Move MappedOperator to serialization (#59628)
Split SerializedBaseOperator from serde logic (#59627)
Minor cleanups removing SDK references from Core (#59491)
Refactor deprecated SQLA query openlineage provider (#59448)
Bump OpenLineage client dependency to 1.41 (#59321)
Extract shared "module_loading" distribution (#59139)
Nothing published for this version
Undeprecate BaseXCom.get_one method for now
10.17.0 or later (#38071)If you use Stackdriver logging, you must use Google provider version 10.17.0 or later. Airflow 2.9.1 now passes gcp_log_name to the StackdriverTaskHandler instead of name, and this will fail on earlier provider versions.
This fixes a bug where the log name configured in [logging] remove_base_log_folder was overridden when Airflow configured logging, resulting in task logs going to the wrong destination.
href for nav bar (#39282)firefox (#39261)log_url (#39183)UX (#39119)ux in react dag page (#39122)AUTH_ROLE_PUBLIC is set in check_authentication (#39012)map_index_template so it renders for failed tasks as long as it was defined before the point of failure (#38902)Undeprecate BaseXCom.get_one method for now (#38991)inherit_cache attribute for CreateTableAs custom SA Clause (#38985)SAWarning 'Coercing Subquery object into a select() for use in IN()' (#38926)cartesian product in AirflowSecurityManagerV2 (#38913)methodtools.lru_cache instead of functools.lru_cache in class methods (#37757)airflow dags backfill only if -I / --ignore-first-depends-on-past provided (#38676)TriggerDagRunOperator deprecate execution_date in favor of logical_date (#39285)@deprecated decorator (#39205)is_authorized_custom_view from auth manager to handle custom actions (#39167)minischeduler skip (#38976)undici from 5.28.3 to 5.28.4 in /airflow/www (#38751)PythonOperator op_kwargs (#39242)user and role commands (#39224)k8s 1.29 to supported version in docs (#39168)DagBag class docstring to include all params (#38814)Release Date: 2025-12-13
chore: Adjust AirflowRunFacet and docs after moving OL methods to BaseSQLOperator (#58903)
Move the traces and metrics code under a common observability package (#56187)
Implement timetables in SDK (#58669)
Remove global from openlineage provider (#58868)
chore: Adjust AirflowRunFacet and docs after moving OL methods to BaseSQLOperator (#58903)
Move the traces and metrics code under a common observability package (#56187)
Implement timetables in SDK (#58669)
Remove global from openlineage provider (#58868)
Nothing published for this version
Bump aiohttp min version to avoid CVE-2024-23829 and CVE-2024-23334
Lifecycle events:
on_startingbefore_stoppingDagRun State Change Events:
on_dag_run_runningon_dag_run_successon_dag_run_failedTaskInstance State Change Events:
on_task_instance_runningon_task_instance_successon_task_instance_failedAfter discussion <https://lists.apache.org/thread/r06j306hldg03g2my1pd4nyjxg78b3h4>__
and a voting process <https://lists.apache.org/thread/pgcgmhf6560k8jbsmz8nlyoxosvltph2>__,
the Airflow's PMC and Committers have reached a resolution to no longer maintain MsSQL as a supported Database Backend.
As of Airflow 2.9.0 support of MsSQL has been removed for Airflow Database Backend.
A migration script which can help migrating the database before upgrading to Airflow 2.9.0 is available in
airflow-mssql-migration repo on Github <https://github.com/apache/airflow-mssql-migration>_.
Note that the migration script is provided without support and warranty.
This does not affect the existing provider packages (operators and hooks), DAGs can still access and process data from MsSQL.
Datasets must use a URI that conform to rules laid down in AIP-60, and the value
will be automatically normalized when the DAG file is parsed. See
documentation on Datasets <https://airflow.apache.org/docs/apache-airflow/stable/authoring-and-scheduling/datasets.html>_ for
a more detailed description on the rules.
You may need to change your Dataset identifiers if they look like a URI, but are used in a less mainstream way, such as relying on the URI's auth section, or have a case-sensitive protocol name.
get_permitted_menu_items in BaseAuthManager has been renamed filter_permitted_menu_items (#37627)The Audit Log event name for REST API events will be prepended with api. or ui., depending on if it came from the Airflow UI or externally.
There are a few caveats though:
Pendulum2 does not support Python 3.12. For Python 3.12 you need to use
Pendulum 3 <https://pendulum.eustace.io/blog/announcing-pendulum-3-0-0.html>_
Minimum SQLAlchemy version supported when Pandas is installed for Python 3.12 is 1.4.36 released in
April 2022. Airflow 2.9.0 increases the minimum supported version of SQLAlchemy to 1.4.36 for all
Python versions.
Not all Providers support Python 3.12. At the initial release of Airflow 2.9.0 the following providers are released without support for Python 3.12:
apache.beam - pending on Apache Beam support for 3.12 <https://github.com/apache/beam/issues/29149>_papermill - pending on Releasing Python 3.12 compatible papermill client version
including this merged issue <https://github.com/nteract/papermill/pull/771>_There's now a limit to the length of data that can be stored in the Rendered Template Fields.
The limit is set to 4096 characters. If the data exceeds this limit, it will be truncated. You can change this limit
by setting the [core]max_template_field_length configuration option in your airflow config.
Xcom table column value type has changed from blob to longblob. This will allow you to store relatively big data in Xcom but process can take a significant amount of time if you have a lot of large data stored in Xcom.
To downgrade from revision: b4078ac230a1, ensure that you don't have Xcom values larger than 65,535 bytes. Otherwise, you'll need to clean those rows or run airflow db clean xcom to clean the Xcom table.
Matomo as an option for analytics_tool. (#38221)hashable (#37465)queuedEvent endpoint to get/delete DatasetDagRunQueue (#37176)DatasetOrTimeSchedule (#36710)on_skipped_callback to BaseOperator (#36374)@task.bash TaskFlow decorator (#30176, #37875)ExternalPythonOperator use version from sys.version_info (#38377)run_id column to log table (#37731)tryNumber to grid task instance tooltip (#37911)ExternalPythonOperator (#37409)Pathlike (#36947)nowait and skip_locked into with_row_locks (#36889)dag/dagRun in the REST API (#36641)Connexion from auth manager interface (#36209)total_entries count on the event logs endpoint (#38625)tz in next run ID info (#38482)chakra styles to keep dropdowns in filter bar (#38456)__exit__ is called in decorator context managers (#38383)BaseAuthManager.is_authorized_custom_view abstract (#37915)/get_logs_with_metadata endpoint (#37756)encoding to the SQL engine in SQLAlchemy v2 (#37545)consuming_dags attr eagerly before dataset listener (#36247)importlib_metadata with compat to Python 3.10/3.12 stdlib (#38366)__new__ magic method of BaseOperatorMeta to avoid bad mixing classic and decorated operators (#37937)sys.version_info for determine Python Major.Minor (#38372)blinker add where it requires (#38140)> 39.0.0 (#38112)assert outside of the tests (#37718)flask._request_ctx_stack (#37522)login attribute in airflow.__init__.py (#37565)datetime.datetime.utcnow by airflow.utils.timezone.utcnow in core (#35448)is_authorized_cluster_activity from auth manager (#36175)exception to templates ref list (#36656)Release Date: 2025-11-30
Note
This release of provider is only available for Airflow 2.11+ as explained in the Apache Airflow providers support policy < https://github.com/apache/airflow/blob/main/PROVIDERS.rst#minimum-supported-version-of-airflow-for-community-managed-providers >_.
Add few attrs from external_task sensor to OpenLineage events (#58719)
Auto-inject OpenLineage parent info into TriggerDagRunOperator conf (#58672)
Fix OL root macros should reflect root from dagrun conf parent (#58428)
Fix root in parentRunFacet is not always sourced from dag run (#58407)
Bump minimum Airflow version in providers to Airflow 2.11.0 (#58612)
Bump min version of openlineage libraries to 1.40.0 to fix compat issues (#58302)
Note
This release of provider is only available for Airflow 2.11+ as explained in the Apache Airflow providers support policy <https://github.com/apache/airflow/blob/main/PROVIDERS.rst#minimum-supported-version-of-airflow-for-community-managed-providers>_.
Add few attrs from external_task sensor to OpenLineage events (#58719)
Auto-inject OpenLineage parent info into TriggerDagRunOperator conf (#58672)
Fix OL root macros should reflect root from dagrun conf parent (#58428)
Fix root in parentRunFacet is not always sourced from dag run (#58407)
Bump minimum Airflow version in providers to Airflow 2.11.0 (#58612)
Bump min version of openlineage libraries to 1.40.0 to fix compat issues (#58302)
Nothing published for this version
Use pyarrow-hotfix to mitigate CVE-2023-47248
Raw HTML code in DAG docs and DAG params descriptions is disabled by default
To ensure that no malicious javascript can be injected with DAG descriptions or trigger UI forms by DAG authors
a new parameter webserver.allow_raw_html_descriptions was added with default value of False.
If you trust your DAG authors code and want to allow using raw HTML in DAG descriptions and params, you can restore the previous
behavior by setting the configuration value to True.
To ensure Airflow is secure by default, the raw HTML support in trigger UI has been super-seeded by markdown support via
the description_md attribute. If you have been using description_html please migrate to description_md.
The custom_html_form is now deprecated. (#35460)
prev_end_date_success method access (#34528)List Task Instances view (#34529)clear_number to track DAG run being cleared (#34126)multiselect to run state in grid view (#35403)Connection.get_hook in case of ImportError (#36005)taskinstance (#35810)AIRFLOW_CONFIG path (#35818)JSON-string connection representation generator (#35723)BaseOperatorLink into the separate module (#35032)cbreak in execute_interactive and handle SIGINT (#35602)synchronize_log_template function (#35366)BaseOperatorLink.operators (#35003)SA2-compatible syntax for TaskReschedule (#33720)EventScheduler (#34808)update_forward_refs (#34657)Dataset from airflow package in codebase (#34610)airflow.datasets.Dataset in examples and tests (#34605)version top-level element from docker compose files (#33831)NOT EXISTS subquery instead of tuple_not_in_condition (#33527)triggerer_heartbeat (#33320)airflow variables export to print to stdout (#33279)reset_user_sessions to work from either CLI or web (#36056)overscroll behaviour to auto (#35717)borderWidthRight to grid for Firefox scrollbar (#35346)processor_subdir in serialized_dag table (#35661)get_dag_by_pickle util function (#35339)mappedoperator (#35257)Literal from typing_extensions (#33794)4.3.10 (#35991)Connection.to_json_dict to Connection.to_dict (#35894)moto version to >= 4.2.9 (#35687)pyarrow-hotfix to mitigate CVE-2023-47248 (#35650)axios from 0.26.0 to 1.6.0 in /airflow/www/ (#35624)navbar_text_color and rm condition in style (#35553)dag_next_execution (#35539)TCH004 and TCH005 rules (#35475)AirflowException from airflow (#34541)postcss from 8.4.25 to 8.4.31 in /airflow/www (#34770)airflow.models.dag.DAG in examples (#34617)re2 regex engine in the .airflowignore documentation. (#35663)best-practices.rst (#35692)dag-run.rst to mention Airflow's support for extended cron syntax through croniter (#35342)webserver.rst to include information of supported OAuth2 providers (#35237)rst code block format (#34708)Release Date: 2025-11-17
feat(openlineage): Add parentRunFacet for DAG events (#57809)
nit: Use new taskinstance method to determine if task will emit OL event (#57446)
Convert all airflow distributions to be compliant with ASF requirements (#58138)
Refactor import statement for Session to use sqlalchemy.orm (#57586)
Migrate openlineage provider to common.compat (#57124)
[Doc] Fixing 404 errors for OpenLineage & Oracle providers (#57469)
feat(openlineage): Add parentRunFacet for DAG events (#57809)
nit: Use new taskinstance method to determine if task will emit OL event (#57446)
Convert all airflow distributions to be compliant with ASF requirements (#58138)
Refactor import statement for Session to use sqlalchemy.orm (#57586)
Migrate openlineage provider to common.compat (#57124)
[Doc] Fixing 404 errors for OpenLineage & Oracle providers (#57469)
Nothing published for this version
Update dags.rst to put SubDag deprecation note right after the SubDag section heading
No significant changes.
codemirror and extra (#35122)get_plugin_info for class based listeners. (#35022)all_skipped trigger rule as skipped if any task is in upstream_failed state (#34392)pendulum requirement to <3.0 (#35336)sentry_sdk to 1.33.0 (#35298)@babel/traverse from 7.16.0 to 7.23.2 in /airflow/www (#34988)undici from 5.19.1 to 5.26.3 in /airflow/www (#34971)SchedulerJobRunner (#34810)max_tis per query > parallelism (#34742)connexion<3.0 upper bound (#35218)< 3.12 (#35123)3.1.0 (#34943)conn.extras (#35165)mysql-connector-python from recommended MySQL driver (#34287)set_downstream example (#35075)airflow_local_settings.py template (#34826)'>' in provider section name (#34813)Release Date: 2025-10-26
Fix openlineage dag state event emit on timed out dag (#56542)
Only import OpenLineage plugin listeners/hooks if plugin is enabled (#56266)
nit: Bump required OL client for Openlineage provider (#56302)
chore: safeguard external call in OL sqlparser (#55692)
Correct 'Dag' to 'DAG' for code snippets in provider docs (#56727)
Remove placeholder Release Date in changelog and index files (#56056)
Fix openlineage dag state event emit on timed out dag (#56542)
Only import OpenLineage plugin listeners/hooks if plugin is enabled (#56266)
nit: Bump required OL client for Openlineage provider (#56302)
chore: safeguard external call in OL sqlparser (#55692)
Correct 'Dag' to 'DAG' for code snippets in provider docs (#56727)
Remove placeholder Release Date in changelog and index files (#56056)
Nothing published for this version
Deprecate numeric type python version in PythonVirtualEnvOperator
No significant changes
taskgroup is mapped (#34587)cluster_activity view not loading due to standaloneDagProcessor templating (#34274)loglevel=DEBUG in 'Not syncing DAG-level permissions' (#34268)access_control={} (#34114)ab_user table in the CLI session (#34120)next_run_datasets_summary endpoint (#34143)_run_task_session in mapped render_template_fields (#33309)version_added (#34011)AUTH_REMOTE_USER from FAB in WSGI middleware example (#34721)astroid version < 3 (#34658)os.path.splitext to Path.* (#34352, #33669)pyproject.toml (#34014)isinstance in fab_security manager (#33760)isinstance calls for the same object in a single call (#33767)str.splitlines() to split lines (#33592)len() (#33454)Release Date: 2025-09-28
Adjust OpenLineage utils to be compatible with Airflow 3.1.0 (#56040)
Adjust OpenLineage utils to be compatible with Airflow 3.1.0 (#56040)
Nothing published for this version
When setting catchup=False, CronTriggerTimetable no longer skips a run if the scheduler does not query the timetable immediately after the previous ru
When setting catchup=False, CronTriggerTimetable no longer skips a run if
the scheduler does not query the timetable immediately after the previous run
has been triggered.
This should not affect scheduling in most cases, but can change the behaviour if
a DAG is paused-unpaused to manually skip a run. Previously, the timetable (with
catchup=False) would only start a run after a DAG is unpaused, but with this
change, the scheduler would try to look at little bit back to schedule the
previous run that covers a part of the period when the DAG was paused. This
means you will need to keep a DAG paused longer (namely, for the entire cron
period to pass) to really skip a run.
Note that this is also the behaviour exhibited by various other cron-based
scheduling tools, such as anacron.
conf.set() becomes case insensitive to match conf.get() behavior (#33452)Also, conf.get() will now break if used with non-string parameters.
conf.set(section, key, value) used to be case sensitive, i.e. conf.set("SECTION", "KEY", value)
and conf.set("section", "key", value) were stored as two distinct configurations.
This was inconsistent with the behavior of conf.get(section, key), which was always converting the section and key to lower case.
As a result, configuration options set with upper case characters in the section or key were unreachable.
That's why we are now converting section and key to lower case in conf.set too.
We also changed a bit the behavior of conf.get(). It used to allow objects that are not strings in the section or key.
Doing this will now result in an exception. For instance, conf.get("section", 123) needs to be replaced with conf.get("section", "123").
MappedTaskGroup tasks not respecting upstream dependency (#33732)SECURITY_MANAGER_CLASS should be a reference to class, not a string (#33690)get_url_for_login in security manager (#33660)2.7.0 db migration job errors (#33652)groupby in TIS duration calculation (#33535)dialect.name in custom SA types (#33503)end_date is less than utcnow (#33488)formatDuration method (#33486)conf.set case insensitive (#33452)soft_fail argument when poke is called (#33401)processor_subdir (#33357)<br> text in Provider's view (#33326)soft_fail argument when ExternalTaskSensor runs in deferrable mode (#33196)expand_kwargs method (#32272)Pydantic 1 compatibility (#34081, #33998)Pydantic 2 (#33956)devel_only extra in Airflow's setup.py (#33907)FAB to 4.3.4 in order to fix issues with filters (#33931)sqlalchemy to 1.4.24 (#33892)OrderedDict with plain dict (#33508)Pydantic warning about orm_mode rename (#33220)Pydantic limitation for version < 2 (#33507)Release Date: 2025-09-22
fix: prevent user facets from overriding OL facets (#55765)
Remove SDK dependency from SerializedDAG (#55538)
Decouple secrets_masker project from airflow configuration (#55259)
fix: prevent user facets from overriding OL facets (#55765)
Remove SDK dependency from SerializedDAG (#55538)
Decouple secrets_masker project from airflow configuration (#55259)
Nothing published for this version
Add deprecation info to the Airflow modules and classes docstring
As of now, Python 3.7 is no longer supported by the Python community. Therefore, to use Airflow 2.7.0, you must ensure your Python version is either 3.8, 3.9, 3.10, or 3.11.
The old Graph View is removed. The new Graph View is the default view now.
If you are using dag_run.conf dictionary and web UI JSON entry to run your DAG you should either:
Add params to your DAG <https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/params.html#use-params-to-provide-a-trigger-ui-form>_show_trigger_form_if_no_params to bring back old behaviourInstead, you should use "airflow db migrate" command to create or upgrade database. This command will not create default connections. In order to create default connections you need to run "airflow connections create-default-connections" explicitly, after running "airflow db migrate".
The "default" context is Python's default_ssl_contest instead of previously used "none". The
default_ssl_context provides a balance between security and compatibility but in some cases,
when certificates are old, self-signed or misconfigured, it might not work. This can be configured
by setting "ssl_context" in "email" configuration of Airflow.
Setting it to "none" brings back the "none" setting that was used in Airflow 2.6 and before, but it is not recommended due to security reasons ad this setting disables validation of certificates and allows MITM attacks.
For security reasons, the test connection functionality is disabled by default across Airflow UI,
API and CLI. The availability of the functionality can be controlled by the
test_connection flag in the core section of the Airflow
configuration (airflow.cfg). It can also be controlled by the
environment variable AIRFLOW__CORE__TEST_CONNECTION.
The following values are accepted for this config param:
Disabled: Disables the test connection functionality and
disables the Test Connection button in the UI.This is also the default value set in the Airflow configuration.
2. Enabled: Enables the test connection functionality and
activates the Test Connection button in the UI.
Hidden: Disables the test connection functionality and
hides the Test Connection button in UI.For more information on capabilities of users, see the documentation: https://airflow.apache.org/docs/apache-airflow/stable/security/security_model.html#capabilities-of-authenticated-ui-users It is strongly advised to not enable the feature until you make sure that only highly trusted UI/API users have "edit connection" permissions.
xcomEntries API disables support for the deserialize flag by default (#32176)For security reasons, the /dags/*/dagRuns/*/taskInstances/*/xcomEntries/*
API endpoint now disables the deserialize option to deserialize arbitrary
XCom values in the webserver. For backward compatibility, server admins may set
the [api] enable_xcom_deserialize_support config to True to enable the
flag and restore backward compatibility.
However, it is strongly advised to not enable the feature, and perform deserialization at the client side instead.
Default name of the Celery application changed from airflow.executors.celery_executor to airflow.providers.celery.executors.celery_executor.
You should change both your configuration and Health check command to use the new name:
celery_app_name configuration in celery section) use airflow.providers.celery.executors.celery_executorairflow.providers.celery.executors.celery_executor.appscheduler.max_tis_per_query is changed from 512 to 16 (#32572)This change is expected to make the Scheduler more responsive.
scheduler.max_tis_per_query needs to be lower than core.parallelism.
If both were left to their default value previously, the effective default value of scheduler.max_tis_per_query was 32
(because it was capped at core.parallelism).
To keep the behavior as close as possible to the old config, one can set scheduler.max_tis_per_query = 0,
in which case it'll always use the value of core.parallelism.
In order to use the executors, you need to install the providers:
apache-airflow-providers-celery package >= 3.3.0apache-airflow-providers-cncf-kubernetes package >= 7.4.0apache-airflow-providers-daskexecutor package in any versionYou can achieve it also by installing airflow with [celery], [cncf.kubernetes], [daskexecutor] extras respectively.
Users who base their images on the apache/airflow reference image (not slim) should be unaffected - the base
reference image comes with all the three providers installed.
This index seems to have great positive effect in a setup with tens of millions such rows.
BranchExternalPythonOperator (#32787, #33360)Per-LocalTaskJob Configuration (#32313)AirflowClusterPolicySkipDag exception (#32013)reactflow for datasets graph (#31775)chain which doesn't require matched lists (#31927)--retry and --retry-delay to airflow db check (#31836)section query param in get config rest API (#30936)Scheduled->Queued->Running task state transition times (#30612)db upgrade to db migrate and add connections create-default-connections (#32810, #33136)<= parallelism (#32572)isdisjoint instead of not intersection (#32616)dag_processor status. (#32382)[triggers.running] (#32050)TriggerDagRunOperator: Add wait_for_completion to template_fields (#31122)PythonVirtualenvOperator termination log in alert (#31747)airflow db commands to SQLAlchemy 2.0 style (#31486)validators into their own modules (#30802)get_log api (#30729)Gantt chart: Use earliest/oldest ti dates if different than dag run start/end (#33215)virtualenv detection for Python virtualenv operator (#33223)chmod airflow.cfg (#33118)max_active_runs reached its upper limit. (#31414)get_task_instances query (#33054)$ref (#32887)PythonOperator sub-classes extend its decorator (#32845)virtualenv is installed in PythonVirtualenvOperator (#32939)__iter__ in is_container() (#32850)dagRunTimeout (#32565)/blocked endpoint (#32571)cli.dags.trigger command output (#32548)whitespaces from airflow connections form (#32292)readonly property in our API (#32510)resizer wouldn't expanse grid view (#31581)type_ arg to drop_constraint (#31306)drop_constraint call in migrations (#31302)requirepass redis sentinel (#30352)/config (#31057)dag_processing (#33161)Pydantic to < 2.0.0 (#33235)cncf.kubernetes provider (#32767, #32891)pydocstyle check - core Airflow only (#31297)1.2.3 to 1.2.4 in /airflow/www (#32680)6.3.0 to 6.3.1 in /airflow/www (#32506)4.18.0 (#32445)stylelint from 13.13.1 to 15.10.1 in /airflow/www (#32435)4.0.0 to 4.1.3 in /airflow/www (#32443)Pydantic 2 (#32366)enums (#31735)0.272 (#31966)asynctest (#31664)2.0 style (#31569, #31772, #32350, #32339, #32474, #32645)3.7 support (#30963)0.0.262 (#30809)1.2.0 (#30687)DAGRun / DAG / Task in templates-ref.rst (#33013)Release Date: 2025-09-09
add tasksDuration to state run facet (#53644)
Fix setproctitle usage on macos (#53122)
Fix mypy no-redef errors for timeout imports in providers (#54471)
Decouple serialization and deserialization code for tasks (#54569)
Move secrets_masker over to airflow_shared distribution (#54449)
Remove MappedOperator inheritance (#53696)
Update usage of timeout contextmanager from SDK where possible (#54183)
Make term Dag consistent in providers docs (#55101)
docs: fix broken link on OpenLineage developer section (#54356)
add tasksDuration to state run facet (#53644)
Fix setproctitle usage on macos (#53122)
Fix mypy no-redef errors for timeout imports in providers (#54471)
Decouple serialization and deserialization code for tasks (#54569)
Move secrets_masker over to airflow_shared distribution (#54449)
Remove MappedOperator inheritance (#53696)
Update usage of timeout contextmanager from SDK where possible (#54183)
Make term Dag consistent in providers docs (#55101)
docs: fix broken link on OpenLineage developer section (#54356)
Nothing published for this version
In the past SchedulerJob and other *Job classes are known to have been used to perform external health checks for Airflow components. Those are, howev
Job classes (#31277).In the past SchedulerJob and other *Job classes are known to have been used to perform
external health checks for Airflow components. Those are, however, Airflow DB ORM related classes.
The DB models and database structure of Airflow are considered as internal implementation detail, following
public interface <https://airflow.apache.org/docs/apache-airflow/stable/public-airflow-interface.html>_).
Therefore, they should not be used for external health checks. Instead, you should use the
airflow jobs check CLI command (introduced in Airflow 2.1) for that purpose.
job_type column (#31182)api_client_retry_configuration (#31174)interleave_timestamp_parser config to the logging section (#31102)MappedTaskGroup import in taskinstance file (#31100)apache-hive extra so it installs the correct package (#31068)airflow providers get command output (#30978)pandas.DataFrame (#30943)order_by request in list DAG rest api (#30926)state and start_date from being reset when clearing a task in a running DagRun (#30125)dag_processing.processes metric (#30891)config directory in docker compose (#30662)version_added config field for might_contain_dag and metrics_allow_list (#30969)Release Date: 2025-08-11
Allow secrets redact function to have different redaction than '***' (#53977)
Fix several deprecation warnings related to airflow.sdk (#53791)
Allow secrets redact function to have different redaction than '***' (#53977)
Fix several deprecation warnings related to airflow.sdk (#53791)
Nothing published for this version
This is potentially a breaking change for any custom trigger implementations that override the cleanup() method and uses synchronous code, however usi…
Default setting handles case where impersonation is needed and both users (airflow and the impersonated user)
have the same group set as main group. Previously the default was also other-writeable and the user might choose
to use the other-writeable setting if they wish by configuring file_task_handler_new_folder_permissions
and file_task_handler_new_file_permissions in logging section.
This stops SLA callbacks from keeping the dag processor manager permanently busy. It means reduced CPU, and fixes issues where SLAs stop the system from seeing changes to existing dag files. Additional metrics added to help track queue state.
cleanup() method in BaseTrigger is now defined as asynchronous (following async/await) pattern (#30152).This is potentially a breaking change for any custom trigger implementations that override the cleanup()
method and uses synchronous code, however using synchronous operations in cleanup was technically wrong,
because the method was executed in the main loop of the Triggerer and it was introducing unnecessary delays
impacting other triggers. The change is unlikely to affect any existing trigger implementations.
scheduler.tasks.running no longer exist (#30374)The gauge has never been working and its value has always been 0. Having an accurate value for this metric is complex so it has been decided that removing this gauge makes more sense than fixing it with no certainty of the correctness of its value.
task_queued_timeout config (#30375)Logic for handling tasks stuck in the queued state has been consolidated, and the all configurations
responsible for timing out stuck queued tasks have been deprecated and merged into
[scheduler] task_queued_timeout. The configurations that have been deprecated are
[kubernetes] worker_pods_pending_timeout, [celery] stalled_task_timeout, and
[celery] task_adoption_timeout. If any of these configurations are set, the longest timeout will be
respected. For example, if [celery] stalled_task_timeout is 1200, and [scheduler] task_queued_timeout
is 600, Airflow will set [scheduler] task_queued_timeout to 1200.
The configurations view now only displays the running configuration. Previously, the default configuration
was displayed at the top but it was not obvious whether this default configuration was overridden or not.
Subsequently, the non-documented endpoint /configuration?raw=true is deprecated and will be removed in
Airflow 3.0. The HTTP response now returns an additional Deprecation header. The /config endpoint on
the REST API is the standard way to fetch Airflow configuration programmatically.
ExternalTaskSensor now has an explicit skipped_states list
Maximum retry task delay is set to be 24h (86400s) by default. You can change it globally via core.max_task_retry_delay
parameter.
The Hive Macros (hive.max_partition, hive.closest_ds_partition) are available only when Hive Provider is
installed. Please install Hive Provider > 5.1.0 when using those macros.
max_active_tis_per_dagrun for Dynamic Task Mapping (#29094)TriggerDagRunOperator (#30292)Blocklist to disable specific metric tags or metric names (#29881)check_migrations config (#29714)cli.dags.trigger (#29224)db export-archived command. (#29485)airflow db drop-archived command (#29309)FileTrigger (#29265)connections import CLI command (#28738)AIP-51 <https://github.com/apache/airflow/pulls?q=is%3Apr+is%3Amerged+label%3AAIP-51+milestone%3A%22Airflow+2.6.0%22>_)UX in grid view (#30373)select() to new style (#30515)metrics_*_list (#30174)on_*_callback/sla_miss_callbacks (#28469)renamed and previous_name in config sections (#28324)triggerer status (#27755)too old resource version exception by retrieving the latest resource_version (#30425)TriggerDagRunOperator with deferrable parameter (#30406)example_sensor_decorator DAG (#30513)skip_exit_code in BashOperator (#30734)scheduler.tasks.running (#30374)/airflow/www (#30568)/airflow/www (#30319)/airflow/www (#30316)dag.fileloc instead of dag.full_filepath in exception message (#30610)importlib-metadata backport to < 5.0.0 (#29924)importlib.metadata to get Version for speed (#29723)db export-cleaned to db export-archived (#29450)freezegun with time-machine (#28193)airflow/kubernetes/* (#28212)audit_logs.rst (#30405)*_lookup_pattern parameters (#29580)Release Date: 2025-08-02
Add OpenLineage support for EmptyOperator (#53730)
feat: Add new documentation facet to all OL events (#52343)
fix: Adjust emits_ol_events to account for inlets check since AF3.0.2 (#53449)
fix: Check dynamic transport env vars in is_disabled() (#53370)
Remove direct scheduler BaseOperator refs (#52234)
Fix Task Group Deprecation error from plugin (#53813)
Updating openlineage-integration-common and openlineage-python dependencies for apache-airflow-providers-openlineage provider. (#53671)
Add Python 3.13 support for Airflow. (#46891)
Cleanup type ignores in openlineage provider where possible (#53284)
Remove type ignore across codebase after mypy upgrade (#53243)
Make openlineage compatible with mypy 1.16.1 (#53119)
Remove upper-binding for "python-requires" (#52980)
Temporarily switch to use >=,< pattern instead of '~=' (#52967)
Add OpenLineage support for EmptyOperator (#53730)
feat: Add new documentation facet to all OL events (#52343)
fix: Adjust emits_ol_events to account for inlets check since AF3.0.2 (#53449)
fix: Check dynamic transport env vars in is_disabled() (#53370)
Remove direct scheduler BaseOperator refs (#52234)
Fix Task Group Deprecation error from plugin (#53813)
Updating openlineage-integration-common and openlineage-python dependencies for apache-airflow-providers-openlineage provider. (#53671)
Add Python 3.13 support for Airflow. (#46891)
Cleanup type ignores in openlineage provider where possible (#53284)
Remove type ignore across codebase after mypy upgrade (#53243)
Make openlineage compatible with mypy 1.16.1 (#53119)
Remove upper-binding for "python-requires" (#52980)
Temporarily switch to use >=,< pattern instead of '~=' (#52967)
Nothing published for this version
Deprecate use of core get_kube_client in PodManager
TaskRunner: notify of component start and finish (#27855)AirflowModelViews(Variables/Connection) (#24079, #27994, #27923)Is /not Null filter for value is None on webui (#26584)one_done trigger rule (#26146)TI.xcom_pull() with explicit task_ids and map_indexes (#27699)urlsplit (#27389)branch_task_ids into SkipMixin (#27434).first() to .scalar() (#27323)howtos about sensors (#27333)extra__conn_type__ prefix required for UI behaviors (#26995)crashloopbackoff when using hostname_callable (#24999)__future__.annotations automatically by isort (#26383)V1Pod in task callback (#27609)taskInstance errors and split into two tables (#26575)autoregistered DAGs if there are any import errors (#26398)from airflow import version lazy import (#26239)is_mapped attribute (#27881)airflow/callbacks/* airflow/cli/* (#27721)airflow/api_connexion/* directory (#27718)airflow/listener/* directory (#27731)airflow/lineage/* directory (#27732)airflow/api/* directory (#27716)minimatch from 3.0.4 to 3.0.8 in /airflow/www (#27688)1.4.1 to 1.4.2 in /airflow/www (#27697)BaseTrigger.run (#27416)2022.10.1 (#27383)memray files to gitignore / dockerignore (#27001)sphinx-autoapi (#26743)RTIF.delete_old_records() (#26667)pyupgrade edge cases (#26384)docker-compose.yaml (#26726)In order to make airflow dags test more useful as a testing and debugging tool, we no longer run a backfill job and instead run a "local task runner". Users can still backfill their DAGs using the airflow dags backfill command.
KubernetesPodOperator no longer considers any core kubernetes config params, so this section now only applies to kubernetes executor. Renaming it reduces potential for confusion.
ExternalTaskSensor no longer hangs indefinitely when failed_states is set, an execute_date_fn is used, and some but not all of the dependent tasks fail. Instead, an AirflowException is thrown as soon as any of the dependent tasks fail. Any code handling this failure in addition to timeouts should move to caching the AirflowException BaseClass and not only the AirflowSensorTimeout subclass.
The old option will continue to work but will issue deprecation warnings, and will be removed entirely in Airflow 3.
TaskRunner: notify of component start and finish (#27855)
Add DagRun state change to the Listener plugin system(#27113)
Metric for raw task return codes (#27155)
Add logic for XComArg to pull specific map indexes (#27771)
Clear TaskGroup (#26658, #28003)
Add critical section query duration metric (#27700)
Add: #23880 :: Audit log for AirflowModelViews(Variables/Connection) (#24079, #27994, #27923)
Add postgres 15 support (#27444)
Expand tasks in mapped group at run time (#27491)
reset commits, clean submodules (#27560)
scheduler_job, add metric for scheduler loop timer (#27605)
Allow datasets to be used in taskflow (#27540)
Add expanded_ti_count to ti context (#27680)
Add user comment to task instance and dag run (#26457, #27849, #27867)
Enable copying DagRun JSON to clipboard (#27639)
Implement extra controls for SLAs (#27557)
add dag parsed time in DAG view (#27573)
Add max_wait for exponential_backoff in BaseSensor (#27597)
Expand tasks in mapped group at parse time (#27158)
Add disable retry flag on backfill (#23829)
Adding sensor decorator (#22562)
Api endpoint update ti (#26165)
Filtering datasets by recent update events (#26942)
Support Is /not Null filter for value is None on webui (#26584)
Add search to datasets list (#26893)
Split out and handle 'params' in mapped operator (#26100)
Add authoring API for TaskGroup mapping (#26844)
Add one_done trigger rule (#26146)
Create a more efficient airflow dag test command that also has better local logging (#26400)
Support add/remove permissions to roles commands (#26338)
Auto tail file logs in Web UI (#26169)
Add triggerer info to task instance in API (#26249)
Flag to deserialize value on custom XCom backend (#26343)
Allow depth-first execution (#27827)
UI: Update offset height if data changes (#27865)
Improve TriggerRuleDep typing and readability (#27810)
Make views requiring session, keyword only args (#27790)
Optimize TI.xcom_pull() with explicit task_ids and map_indexes (#27699)
Allow hyphens in pod id used by k8s executor (#27737)
optimise task instances filtering (#27102)
Use context managers to simplify log serve management (#27756)
Fix formatting leftovers (#27750)
Improve task deadlock messaging (#27734)
Improve "sensor timeout" messaging (#27733)
Replace urlparse with urlsplit (#27389)
Align TaskGroup semantics to AbstractOperator (#27723)
Add new files to parsing queue on every loop of dag processing (#27060)
Make Kubernetes Executor & Scheduler resilient to error during PMH execution (#27611)
Separate dataset deps into individual graphs (#27356)
Use log.exception where more economical than log.error (#27517)
Move validation branch_task_ids into SkipMixin (#27434)
Coerce LazyXComAccess to list when pushed to XCom (#27251)
Update cluster-policies.rst docs (#27362)
Add warning if connection type already registered within the provider (#27520)
Activate debug logging in commands with --verbose option (#27447)
Add classic examples for Python Operators (#27403)
change .first() to .scalar() (#27323)
Improve reset_dag_run description (#26755)
Add examples and howtos about sensors (#27333)
Make grid view widths adjustable (#27273)
Sorting plugins custom menu links by category before name (#27152)
Simplify DagRun.verify_integrity (#26894)
Add mapped task group info to serialization (#27027)
Correct the JSON style used for Run config in Grid View (#27119)
No extra__conn_type__ prefix required for UI behaviors (#26995)
Improve dataset update blurb (#26878)
Rename kubernetes config section to kubernetes_executor (#26873)
decode params for dataset searches (#26941)
Get rid of the DAGRun details page & rely completely on Grid (#26837)
Fix scheduler crashloopbackoff when using hostname_callable (#24999)
Reduce log verbosity in KubernetesExecutor. (#26582)
Don't iterate tis list twice for no reason (#26740)
Clearer code for PodGenerator.deserialize_model_file (#26641)
Don't import kubernetes unless you have a V1Pod (#26496)
Add updated_at column to DagRun and Ti tables (#26252)
Move the deserialization of custom XCom Backend to 2.4.0 (#26392)
Avoid calculating all elements when one item is needed (#26377)
Add __future__.annotations automatically by isort (#26383)
Handle list when serializing expand_kwargs (#26369)
Apply PEP-563 (Postponed Evaluation of Annotations) to core airflow (#26290)
Add more weekday operator and sensor examples #26071 (#26098)
Align TaskGroup semantics to AbstractOperator (#27723)
Gracefully handle whole config sections being renamed (#28008)
Add allow list for imports during deserialization (#27887)
Soft delete datasets that are no longer referenced in DAG schedules or task outlets (#27828)
Redirect to home view when there are no valid tags in the URL (#25715)
Refresh next run datasets info in dags view (#27839)
Make MappedTaskGroup depend on its expand inputs (#27876)
Make DagRun state updates for paused DAGs faster (#27725)
Don't explicitly set include_examples to False on task run command (#27813)
Fix menu border color (#27789)
Fix backfill queued task getting reset to scheduled state. (#23720)
Fix clearing child dag mapped tasks from parent dag (#27501)
Handle json encoding of V1Pod in task callback (#27609)
Fix ExternalTaskSensor can't check zipped dag (#27056)
Avoid re-fetching DAG run in TriggerDagRunOperator (#27635)
Continue on exception when retrieving metadata (#27665)
External task sensor fail fix (#27190)
Add the default None when pop actions (#27537)
Display parameter values from serialized dag in trigger dag view. (#27482, #27944)
Move TriggerDagRun conf check to execute (#27035)
Resolve trigger assignment race condition (#27072)
Update google_analytics.html (#27226)
Fix some bug in web ui dags list page (auto-refresh & jump search null state) (#27141)
Fixed broken URL for docker-compose.yaml (#26721)
Fix xcom arg.py .zip bug (#26636)
Fix 404 taskInstance errors and split into two tables (#26575)
Fix browser warning of improper thread usage (#26551)
template rendering issue fix (#26390)
Clear autoregistered DAGs if there are any import errors (#26398)
Fix from airflow import version lazy import (#26239)
allow scroll in triggered dag runs modal (#27965)
Remove is_mapped attribute (#27881)
Simplify FAB table resetting (#27869)
Fix old-style typing in Base Sensor (#27871)
Switch (back) to late imports (#27730)
Completed D400 for multiple folders (#27748)
simplify notes accordion test (#27757)
completed D400 for airflow/callbacks/* airflow/cli/* (#27721)
Completed D400 for airflow/api_connexion/* directory (#27718)
Completed D400 for airflow/listener/* directory (#27731)
Completed D400 for airflow/lineage/* directory (#27732)
Update API & Python Client versions (#27642)
Completed D400 & D401 for airflow/api/* directory (#27716)
Completed D400 for multiple folders (#27722)
Bump minimatch from 3.0.4 to 3.0.8 in /airflow/www (#27688)
Bump loader-utils from 1.4.1 to 1.4.2 ``in ``/airflow/www (#27697)
Disable nested task mapping for now (#27681)
bump alembic minimum version (#27629)
remove unused code.html (#27585)
Enable python string normalization everywhere (#27588)
Upgrade dependencies in order to avoid backtracking (#27531)
Strengthen a bit and clarify importance of triaging issues (#27262)
Deduplicate type hints (#27508)
Add stub 'yield' to BaseTrigger.run (#27416)
Remove upper-bound limit to dask (#27415)
Limit Dask to under 2022.10.1 (#27383)
Update old style typing (#26872)
Enable string normalization for docs (#27269)
Slightly faster up/downgrade tests (#26939)
Deprecate use of core get_kube_client in PodManager (#26848)
Add memray files to gitignore / dockerignore (#27001)
Bump sphinx and sphinx-autoapi (#26743)
Simplify RTIF.delete_old_records() (#26667)
migrate last react files to typescript (#26112)
Work around pyupgrade edge cases (#26384)
Document dag_file_processor_timeouts metric as deprecated (#27067)
Drop support for PostgreSQL 10 (#27594)
Update index.rst (#27529)
Add note about pushing the lazy XCom proxy to XCom (#27250)
Fix BaseOperator link (#27441)
[docs] best-practices add use variable with template example. (#27316)
docs for custom view using plugin (#27244)
Update graph view and grid view on overview page (#26909)
Documentation fixes (#26819)
make consistency on markup title string level (#26696)
Add documentation to dag test function (#26713)
Fix broken URL for docker-compose.yaml (#26726)
Add a note against use of top level code in timetable (#26649)
Fix example_datasets dag names (#26495)
Update docs: zip-like effect is now possible in task mapping (#26435)
changing to task decorator in docs from classic operator use (#25711)
Release Date: 2025-07-06
[OpenLineage] Added operator_provider_version to task event (#52468)
fix non existing 'ti.dag_run' access in openlineage provider (#51932)
Fix type import to AbstractOperator (#51773)
Move 'BaseHook' implementation to task SDK (#51873)
Disable UP038 ruff rule and revert mandatory 'X | Y' in insintance checks (#52644)
Add a bunch of no-redef ignores so Mypy is happy (#52507)
chore: use task_instance as source for all airflow identifiers used in listener (#52339)
Drop support for Python 3.9 (#52072)
Replace 'models.BaseOperator' to Task SDK one for Standard Provider (#52292)
Use BaseSensorOperator from task sdk in providers (#52296)
nit: bump openlineage libraries requirement to 1.34 (#52075)
Fixing ruff static check failures on main (#51937)
[OpenLineage] Added operator_provider_version to task event (#52468)
fix non existing 'ti.dag_run' access in openlineage provider (#51932)
Fix type import to AbstractOperator (#51773)
Move 'BaseHook' implementation to task SDK (#51873)
Disable UP038 ruff rule and revert mandatory 'X | Y' in insintance checks (#52644)
Add a bunch of no-redef ignores so Mypy is happy (#52507)
chore: use task_instance as source for all airflow identifiers used in listener (#52339)
Drop support for Python 3.9 (#52072)
Replace 'models.BaseOperator' to Task SDK one for Standard Provider (#52292)
Use BaseSensorOperator from task sdk in providers (#52296)
nit: bump openlineage libraries requirement to 1.34 (#52075)
Fixing ruff static check failures on main (#51937)
Nothing published for this version
Remove remaining deprecated classes and replace them with PEP562
@task.short_circuit TaskFlow decorator (#25752)execution_date_or_run_id optional in tasks test command (#26114)DagProcessors parsing files from different locations. (#25935)ExternalPythonOperator (#25780)dags test (#26111)expand_kwargs() against a literal list (#25925)output property to MappedOperator (#25604)TaskGroup in ExternalTaskSensor (#24902)@task.kubernetes taskflow decorator (#25663)schedule param (#25410)CronTriggerTimetable (#23662)XComArg.zip(*xcom_args) (#25176)sla_miss metric (#23402)map() semantic (#25085)expand_kwargs() (#24989)DagWarning model, and a check for missing pools (#23317)ExternalTaskMarker operator (#23964)SlaCallbackRequest if the DAG is scheduled (#26089)Operator.output more (#25617)hacky double-rendering prevention in mapped task (#25924)DAG(schedule=...) improvements (#25648)operator_name dupe in serialized JSON (#25819)task_group_to_grid (#25654)CronTriggerTimetable (#25503)/grid endpoint (#25481)@task.branch decorator (#25242)audit_log route (#25415)getTasks from Grid view (#25359)@dag arguments (#25044)SchedulerJob and TaskInstance (#24912)getfqdn with more resilient version (#24981)NBSP characters by whitespaces (#24797)airflow db upgrade (#24518)expand() error vague so it's not misleading (#24018)[webserver]analytics_tool (#24032)dttm searchable field in audit log (#23794)execute_in_subprocess (#23286)func.count to count rows (#23657)sql_alchemy_conn for celery result backend when result_backend is not set (#24496)AirflowDagCycleException message (#26204)TaskInstance.task not defined before handle_failure (#26040)DAGs and Datasets menu links based on role permission (#26183)TaskGroup tooltip via function docstring (#26028)DagRun.start_date not set during backfill with --reset-dagruns True (#26135)mapped_task is SKIPPED (#25995)TaskInstance related endpoints to avoid API errors (#26076)BranchDateTimeOperator to be timezone-awreness-insensitive (#25944)list-mapped-task-instance (#25965)iter_mapped_dependants (#25793)/ in variable get endpoint (#25774)XComArg fails to resolve (#25661)json arg help in airflow variables set command (#25726)ti_state on find_zombies query (#25725)axios errors (#25703)dag_owner_attributes table (#25579)expand_kwargs() input type before unmapping (#25355)ExternalTaskSensor not working with dynamic task (#25215)MappedOperator members in sync with BaseOperator (#24034)ERD schema for the MetaData DB (#26217)PEP562 (#26167)dag_edges and task_group_to_dict to corresponding util modules (#26212)ORM after forking to run a DAG processor (#26216)PEP-562 getattr (#26153)BaseSerialization.serialize "public" to other classes. (#26142)moment-timezone from 0.5.34 to 0.5.35 in /airflow/www (#26080)CamelCase to generated operations types (#25887)SkipMixin (#25864)undici from 5.8.0 to 5.9.1 in /airflow/www (#25801)_BranchPythonDecoratedOperator (#25783)filename_template deprecation message (#25749)ParamSpec to replace ... in Callable (#25658)elasticsearch test config to avoid warning on deprecated template (#25520)terser from 4.8.0 to 4.8.1 in /airflow/ui (#25178)typescript types from rest API docs (#25123)typescript (#25089)typescript. (#25096)ts (#25267)ts. (#25074)ti if it returns None (#25047)js file structure (#25003)moment from 2.29.3 to 2.29.4 in /airflow/www (#24885)xcom_push flag from BashOperator (#24824)typescript (#24715)charts.css to chart.css (#24531)grid.css to chart.css (#24529)set_new_process_group utility (#24371)moto version (#24222)[github_enterprise] from ref docs (#24033)f-strings in logging calls (#23597)JPype1 (#23847)Celery Flower (#25986)MySQL Charset problems (#25938)Trigger Rules (#25840)task_instance_mutation_hook usage (#25607)task-generated mapping example (#23424)2.2.0 (#24413)Release Date: 2025-06-18
feat: Add NominalTimeRunFacet to all OL events (#51404)
feat: Add TagsJobFacet to DAGRun OpenLineage events (#51303)
feat: Add Airflow-specific OL system tests validation and more tests (#51084)
feat: merge TimeDeltaSensorAsync to TimeDeltaSensor (#51133)
expose OpenLineage's lineage_root_* macros in plugin (#50532)
fix: Use task owner for TASK level Ownership facet (#51305)
Fix openlineage doc error (#51356)
Fix OpenLineage macro _get_logical_date (#51210)
Fix failing static checks (#51197)
Fix simple grammar mistakes in doc (#51138)
Fixes issue RuntimeTaskInstance does not contain log_url | added during taskrunner startup (#50376)
nit: task-level facets should not overwrite integration-level facets (#51690)
Make duration in 'List Dag Run' page sortable (#51495)
import MappedOperator from airflow.sdk.definitions.mappedoperator (#51492)
feat: Add NominalTimeRunFacet to all OL events (#51404)
feat: Add TagsJobFacet to DAGRun OpenLineage events (#51303)
feat: Add Airflow-specific OL system tests validation and more tests (#51084)
feat: merge TimeDeltaSensorAsync to TimeDeltaSensor (#51133)
expose OpenLineage's lineage_root_* macros in plugin (#50532)
fix: Use task owner for TASK level Ownership facet (#51305)
Fix openlineage doc error (#51356)
Fix OpenLineage macro _get_logical_date (#51210)
Fix failing static checks (#51197)
Fix simple grammar mistakes in doc (#51138)
Fixes issue RuntimeTaskInstance does not contain log_url | added during taskrunner startup (#50376)
nit: task-level facets should not overwrite integration-level facets (#51690)
Make duration in 'List Dag Run' page sortable (#51495)
import MappedOperator from airflow.sdk.definitions.mappedoperator (#51492)
Nothing published for this version
fix all "high" npm vulnerabilities
requirements.txt in Python Operators (#17349)SmoothOperator (#22813)execution_timeout configurable (#22389)ti_deps rules (#22698)dag-processor cli command (#22305)ignore_first_depends_on_past for scheduled jobs (#22491)list-import-errors to airflow dags command (#22084)standalone_dag_processor config is True. (#21731)celery.task_timeout_error metric (#21602)db downgrade cli command (#21596)ALL_SKIPPED trigger rule (#21662)db clean CLI command for purging old data (#20838)celery_logging_level (#21506)ShortCircuitOperator configurability for respecting downstream trigger rules (#20044)dag_id_pattern parameter to the /dags endpoint (#18924)--skip-init to db reset command (#22989).airflowignore files (#21392) (#22051)has_access decorator by ~200ms (#22858)try_number in airflow vars (#22297)airflow dags list CLI command (#21991)is_zipfiles in refresh_dag (#21926)airflow dag subcommands (#21793)py DAG files are zipped during parsing (#21538)run_id (#20975)get_connection() (#21162)worker_enable_remote_control for celery (#21507)CgroupTaskRunner (#21481)SchedulerJob (#21181)airflow by 6x (#21438)template_fields (#21054)ShortCircuitOperator push XCom by returning python_callable result (#20071)Connection.get_hook parameter to make it the same as in SqlSensor and SqlOperator. (#19849)XCOM value in PythonOperator (#19378)hook_params in BaseSqlOperator (#18718)taskinstance REST API schema to include dag_run_id field (#19105)extra to be nullable in connection payload as per schema(REST API). (#23183)dag_id extraction for dag level access checks in web ui (#23015)CLI command (#22688)db reset (#22990)external_task_ids. (#22809)DagParam to hold falsy values (#22964)get_logs_with_metadata endpoint. (#22898)PoolSlotsAvailableDep statues (#22807)email_on_failure with render_template_as_native_obj (#22770)DagFileProcessorManager (#22685)ScheduleInterval spec (#22635)is_smart_sensor_compatible() (#22386)run_id k8s and elasticsearch compatibility with Airflow 2.1 (#22385)except_skip None on BranchPythonOperator (#20411)RefreshConfiguration workaround for K8s token refreshing (#20759)/connections/<connection> endpoint (#22227)queued_dttm when submitting task to directly to executor (#22259)bulk_write_to_db (#21757)request.referrer from views.py (#21751)DbApiHook use get_uri from Connection (#21764)dag_id, task_id etc to XCom.serialize_value (#19505)on_task_instance_running listener can get at task (#21157)@task_group (#20870)airflow trigger cli (#20781)@task_group as a whole (#20671)start_date if a task continues after deferral (#20062)execution_date label when get cleanup pods list (#20417)class_permission_name to mixin so it applies to all classes (#18749)catchup=False is used in example dags (#19396)towncrier now (#22003)rbac = True from docs (#22725)sql_alchemy_connect_args (#22045)db upgrade / db downgrade (#21879)postgres:// with postgresql:// (#21205)CeleryExecutor docs (#20783)DummyOperator with EmptyOperator (#22974)DummyOperator in favor of EmptyOperator (#22832)moment from 2.29.1 to 2.29.2 in /airflow/www (#22873)prismjs from 1.26.0 to 1.27.0 in /airflow/www (#22823)nanoid from 3.1.23 to 3.3.2 in /airflow/www (#22803)minimist from 1.2.5 to 1.2.6 in /airflow/www (#22798)Airflow.Base.metadata in FAB models (#22353)sql_alchemy_conn if old postgres scheme used (#22333)xcom.dagrun_id to xcom.dag_run_id (#21806)conn.extra (#21816)jsonschema to 5.0 (#21712)days_ago (#21653):type lines now sphinx-autoapi supports type hints (#20951)DagRun.run_id instead of execution_date when updating state of TIs (UI & REST API) (#18724)PodLauncher to PodManager (#20576)get_readable_dags and get_editable_dags, and get_accessible_dags. (#19961)__var and __type members (#19303)max_tis_per_query initialisation on SchedulerJob (#19020)init_role() from API (#18820)Release Date: 2025-05-18
Note
This release of provider is only available for Airflow 2.10+ as explained in the Apache Airflow providers support policy < https://github.com/apache/airflow/blob/main/PROVIDERS.rst#minimum-supported-version-of-airflow-for-community-managed-providers >_.
add root parent information to OpenLineage events (#49237)
feat: Add DAG versioning information to OpenLineage events (#48741)
Improve execution time messages for DAG or Task not found (#49352)
Remove AIRFLOW_2_10_PLUS conditions (#49877)
Bump min Airflow version in providers to 2.10 (#49843)
nit: Remove duplicate warning when no OL metadata returned (#50350)
Note
This release of provider is only available for Airflow 2.10+ as explained in the Apache Airflow providers support policy <https://github.com/apache/airflow/blob/main/PROVIDERS.rst#minimum-supported-version-of-airflow-for-community-managed-providers>_.
add root parent information to OpenLineage events (#49237)
feat: Add DAG versioning information to OpenLineage events (#48741)
Improve execution time messages for DAG or Task not found (#49352)
Remove AIRFLOW_2_10_PLUS conditions (#49877)
Bump min Airflow version in providers to 2.10 (#49843)
nit: Remove duplicate warning when no OL metadata returned (#50350)
Your coding agent can read these notes before it upgrades. Set up the MCP server →