NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1700 most downloaded on PyPI
Provider package apache-airflow-providers-smtp for Apache Airflow
Last release 5 days ago
29 Sep 2026
Ships fairly regularly
a new release about every 4 weeks
Nearly every release is documented
notes for 40 of 40 stable releases
1 version withdrawn
withdrawn after publishing
4 years old
86 releases · first in 2023
One column per quarter.
…risk due to potential remote code execution vulnerabilities when deserializing arbitrary Python objects.
Airflow 3.1 introduces Human-in-the-Loop (HITL) functionality that enables workflows to pause and wait for human decision-making. This powerful feature is particularly valuable for AI/ML workflows, content moderation, and approval processes where human judgment is essential.
HITL tasks pause execution in a deferred state while waiting for human input via the Airflow UI. Users with appropriate roles can see pending tasks, review context (including XCom data and DAG parameters), and complete actions through intuitive web forms. The feature also supports API-driven interactions for custom UIs and notification integration.
For detailed usage instructions, see /tutorial/hitl.
Note: HITL operators require apache-airflow-providers-standard package and Airflow 3.1+.
Airflow 3.1 advances the decoupling of the Task SDK from Airflow Core through improved DAG serialization with versioned contracts. While complete code separation is planned for Airflow 3.2.0, the serialization foundation enables independent upgrades when components are deployed separately.
For DAG Authors: Import constructs from airflow.sdk namespace:
from airflow.sdk import DAG, task, asset
Access to latest authoring features with forward compatibility
Reduced dependency on server-side Airflow versions
For Platform Teams: Foundation for independent upgrades:
Schema compliance ensures compatibility across versions
Deployment flexibility when components are separated
Reduced coordination overhead between development and operations teams
For technical details on the serialization contract, see /administration-and-deployment/dag-serialization.
Deadline Alerts provide proactive monitoring for DAG execution by automatically triggering notifications when time thresholds are exceeded. This helps ensure SLA compliance and timely completion of critical workflows.
Configure deadline monitoring by specifying:
Reference point: Choose from DAG run queued time, logical date, or fixed datetime
Interval: Time threshold relative to the reference point (positive or negative)
Callback: Response action using Airflow Notifiers or custom functions
Example use cases:
Alert if a daily ETL hasn't completed 1 hour after its scheduled time
Notify stakeholders 30 minutes before a critical deadline
Escalate when resource-constrained DAGs remain queued too long
Current Limitations: Deadline Alerts currently support only asynchronous callbacks (AsyncCallback). Support for synchronous callbacks (SyncCallback) is planned for a future release.
For configuration details and examples, see /howto/deadline-alerts.
Warning
Deadline Alerts are experimental in 3.1 and may change in future versions based on user feedback.
Airflow 3.1 delivers comprehensive internationalization (i18n) support, making the web interface accessible to users worldwide. The React-based UI now supports 17 languages with robust translation infrastructure.
Supported Languages:
Arabic
Catalan
Dutch
English
French
German
Hebrew
Hindi
Hungarian
Italian
Korean
Polish
Portuguese
Simplified Chinese
Spanish
Traditional Chinese
Turkish
The translation system includes automated completeness checking and clear contribution guidelines for community translators.
Airflow 3.1 introduces a modern plugin architecture enabling rich integrations through React components and external views. This extensibility framework allows organizations to embed custom dashboards, monitoring tools, and domain-specific interfaces directly within the Airflow UI.
New Plugin Capabilities:
React Apps: Full-featured React applications integrated into Airflow navigation
External Views: Embed external web applications via iframe with seamless authentication
Dashboard Integration: Custom widgets and panels for operational dashboards
Menu Integration: Add custom navigation items and organize tools logically
Developer Experience:
Hot reloading during development with airflow-react-plugin dev tools
TypeScript support and modern React patterns
Standardized plugin loading and validation
Comprehensive documentation and boilerplate generation
This plugin system replaces legacy Flask-based approaches with modern web standards, improving performance, maintainability, and user experience.
For more details and examples, see /howto/custom-view-plugin.
Airflow 3.1 brings significant UI improvements including rebuilt Calendar and Gantt chart views for the modern React UI, comprehensive filtering capabilities, and a refreshed visual design system.
Visual Design Improvements
The UI now features an updated color palette leveraging Chakra UI semantic tokens, providing better consistency, accessibility, and theme support across the interface. This modernization improves readability and creates a more cohesive visual experience throughout Airflow.
Rebuilt Views and Enhanced Filtering
The Calendar and Gantt views from Airflow 2.x have been rebuilt for the modern React UI, along with enhanced filtering capabilities across all views. These improvements provide better performance and a more consistent user experience with the rest of the modern Airflow interface.
DAG Dashboard Organization
Users can now pin and favorite DAGs for better dashboard organization, making it easier to find and prioritize frequently used workflows. This feature is particularly valuable for teams managing large numbers of DAGs, providing quick access to critical workflows without searching through extensive DAG lists.
Airflow 3.1 introduces a new streaming API endpoint that allows applications to watch DAG runs until completion, enabling more responsive integration patterns for real-time and inference workflows.
New Streaming Endpoint: The /dags/{dag_id}/dagRuns/{dag_run_id}/wait endpoint repeatedly emits JSON updates at specified intervals until the DAG run reaches a finished state.
# Watch a DAG run with 2-second polling interval, including XCom results
curl -X GET "http://localhost:8080/api/v2/dags/ml_pipeline/dagRuns/manual_2024_01_15/wait?result=inference_task" \
-H "Accept: application/x-ndjson"
This enables use cases like:
ML Inference Monitoring: Trigger inference DAGs and wait for completion before returning results
Real-time Processing: Monitor event-driven workflows with immediate response requirements
API Integration: Build responsive services that react to DAG completion without polling
Synchronous Workflows: Create quasi-synchronous behavior for workflows that need immediate feedback
ALL_DONE_MIN_ONE_SUCCESS: This rule triggers when all upstream tasks are done (success, failed) and at least one has succeeded, filling a gap between existing trigger rules for complex workflow patterns. Skipped upstream tasks work as usually - they skip downstream task.
DAG parsing duration is now exposed in the UI, providing better visibility into DAG processing performance and helping identify parsing bottlenecks. This information is displayed alongside other DAG metadata to assist with performance optimization.
Support for Python 3.9 has been removed, as it has reached end-of-life. Airflow 3.1.0 requires Python 3.10, 3.11, 3.12 or 3.13.
Webserver Configuration Reorganization
Several webserver configuration options have been moved to the api section for better organization:
[webserver] log_fetch_timeout_sec → [api] log_fetch_timeout_sec
[webserver] hide_paused_dags_by_default → [api] hide_paused_dags_by_default
[webserver] page_size → [api] page_size
[webserver] default_wrap → [api] default_wrap
[webserver] require_confirmation_dag_change → [api] require_confirmation_dag_change
[webserver] auto_refresh_interval → [api] auto_refresh_interval
Unused configuration options have been removed:
[webserver] instance_name_has_markup
[webserver] warn_deployment_exposure
API Server Logging Configuration
The API server configuration option [api] access_logfile has been replaced with [api] log_config to align with uvicorn's logging configuration. The new option accepts a path to a logging configuration file compatible with logging.config.fileConfig, providing more flexible logging configuration.
Security Improvement: XCom Deserialization
The enable_xcom_deserialize_support configuration option has been removed as a security improvement. This option previously allowed deserializing unknown objects in the API, which posed a security risk due to potential remote code execution vulnerabilities when deserializing arbitrary Python objects.
The XCom display improvements now handle showing non-native XComs (like custom objects, Assets, datetime objects) in a human-readable way through safer methods that don't require deserializing unknown objects in the API server. This provides better user experience when viewing XCom data in the Airflow UI while eliminating the security risk.
Asset API Key Rename
The consuming_dags key in asset API responses has been renamed to scheduled_dags to better reflect its purpose. This key contains only DAGs that use the asset in their schedule argument, not all DAGs that technically use the asset.
Removed Functions
The following functions have been removed from the task-sdk (airflow.sdk.definitions.taskgroup) and moved to server-side API services:
get_task_group_children_getter
task_group_to_dict
These functions are now internal to Airflow's API layer and should not be imported directly by users.
The default number of API server workers ([api] workers) has been reduced from 4 to 1.
With FastAPI, sync code runs in external thread pools, making multiple workers within a single process less necessary. Additionally, with uvicorn's spawn behavior instead of fork, there is no shared copy-on-write memory between workers, so horizontal scaling with multiple API server instances is now the recommended approach for better resource utilization and fault isolation.
A good starting point for the number of workers is to set it to the number of CPU cores available. If you do have multiple CPU cores available for the API server, consider deploying multiple API server instances instead of increasing the number of workers.
Most users should not notice the difference, but it is now possible to emit structured log key/value pairs from tasks.
If your class subclasses LoggingMixin (which all BaseHook and BaseOperator do -- i.e. all hooks and operators) then self.log is now a structloglogger.
The advantage of using structured logging is that it is much easier to find specific information about log message, especially when using a central store such as OpenSearch/Elastic/Splunk etc. You don't have to make any changes, but you can now take advantage of this.
# Inside a Task/Hook etc.
# Before:
# self.log.info("Registering adapter %r", item.name)
# Now:
self.log.info("Registering adapter", name=item.name)
This will produce a log that (in the UI) will look something like this:
[2025-09-16 10:36:13] INFO - Registering adapter name="adapter1"
or in JSON (i.e. the log files on disk):
{"timestamp": "2025-09-16T10:36:13Z", "log_level": "info", "event": "Registering adapter", "name": "adapter1"}
You can also use structlog loggers at the top level of modules etc, and stdlib both continue to work:
import logging
import structlog
log1 = logging.getLogger(__name__)
log2 = strcutlog.get_logger(__name__)
log1.info("Loading something from %s", __name__)
log2.info("Loading something", source=__name__)
(You can't add arbitrary key/value pairs to stdlib, but the normal percent-formatter approaches still work fine.)
The deserializer interface in airflow.serialization.serializers has changed for improved security.
Before 3.1.0:
def deserialize(classname: str, version: int, data: Any)
Starting with 3.1.0:
def deserialize(cls: type, version: int, data: Any)
The class loading is now handled in serde.py, and the deserializer receives the loaded class directly rather than a classname string. This update avoids the use of import_string in the deserializer, making deserialization more secure.
Add Calendar and Gantt chart views to modern React UI with enhanced filtering (#54252, #51667)
Add Python 3.13 support for Airflow runtime and dependencies (#46891)
Add SQLAlchemy 2.0 support with various compatibility fixes for Python 3.13 (#52233, #52518, #54940)
Add support for the psycopg3 postgres driver (#52976)
Add ability to track & display user who triggers DAG runs (#51738, #53510, #54164, #55112)
Add toggle for log grouping in task log viewer for better organization (#51146)
Add tag filtering improvements with Any/All selection options (#51162)
Add comprehensive filtering for DAG runs, task instances, and audit logs (#53652, #54210, #55082)
Add XCom browsing with filtering and improved navigation (#54049)
Add bulk task instance actions and deletion endpoints (#50443, #50165, #50235)
Add DAG run deletion functionality through UI (#50368)
Add test connection button for connection validation (#51055)
Add hyperlink support for URLs in XCom values (#54288)
Add pool column to task instances list and improve pool integration (#51185, #51031)
Add drag-and-drop log grouping and improved log visualization (#51146)
Add color support for XCom JSON display (#51323)
Add configuration column to DAG runs page (#51270)
Add enhanced note visibility and management in task headers (#51764, #54163)
Introduce React plugin system (AIP-68) for modern UI extensions (#52255)
Add support for external view plugins via iframe integration (#51003, #51889)
Add dashboard integration capabilities for custom React apps (#54131, #54144)
Add comprehensive plugin development tools and documentation (#53643)
Implement complete HITL operator suite (HITLOperator, ApprovalOperator, HITLEntryOperator) for human decision workflows (#52868)
Add HITL UI integration with role-based access and form handling (#53035)
Add HITL API endpoints with filtering and query support (#53376, #53923)
Add HITL utility functions for generating URLs to required actions page (#54827)
Improve HITL user experience with bug fixes, UI enhancements, and data model consistency (#55463, #55539, #55575, #55546, #55543, #55536, #55535)
Add ordering and filtering support for HITL details endpoints (#55217)
Add "No Response Received" required action state (#55149)
Add operator filter for HITL task instances (#54773)
Implement deadline alert system for proactive DAG monitoring (AIP-86) (#53951, #53903, #53201, #55086)
Add configurable reference points and notification callbacks (#50677, #50093)
Add deadline calculation and tracking in DAG execution lifecycle (#51638, #50925)
Add comprehensive UI translation support for 16 languages (#51266, #51038, #51219, #50929, #50981, #51793 and more)
Add right-to-left (RTL) layout support for Arabic and Hebrew (#51376)
Add language selection interface and browser preference detection (#51369)
Add translation completeness validation and automated checks (#51166, #51131)
Add calendar data API endpoints for DAG execution visualization (#52748)
Add endpoint to watch DAG runs until completion (#51920, #53346)
Add DAG run ID pattern search functionality (#52437)
Add multi-sorting capabilities for improved data navigation (#53408)
Add bulk connection deletion API and UI (#51201)
Add task group detail pages across DAG runs (#50412, #50309)
Add asset event tracking with last event timestamps (#50060, #50279)
Add has_import_errors filter to Core API GET /dags endpoint (#54563)
Add dag_version filter to get_dag_runs endpoint (#54882)
Add pattern search for event log endpoint (#55114)
Add dry_run support with consistent audit log handling (#55116)
Add utility functions for generic filter counting (#54817)
Add keyboard navigation for Grid view interface (#51784)
Add improved error handling for plugin import failures (#49643)
Add plugin validation in /plugins API with warnings for invalid plugins (#55673)
Improve accessibility for screen readers and assistive technologies with proper language detection (#55839)
Add enhanced variable management with upsert operations (#48547)
Add favorites/pinning support for DAG dashboard organization (#51264)
Add system theme support with automatic OS preference detection (#52649)
Add hotkey shortcut to toggle between Grid and Graph views (#54667)
Add queued DAGs filter button to DAGs page (#55052)
Add DAG parsing duration visibility in UI (#54752)
Add owner links support in DAG Header UI for better navigation (#50627)
Add dag_display_name aliases for improved API consistency (#50332, #50065, #50014, #49933, #49641)
Add enhanced search capabilities with SearchParamsKeys constants (#55218)
Add ALL_DONE_MIN_ONE_SUCCESS trigger rule for flexible task dependencies (#53959)
Add fail_when_dag_is_paused parameter to TriggerDagRunOperator for better control (#48214)
Add XCom validation to prevent empty keys in XCom.set() and XCom.get() operations (#46929)
Add collapsible plugin menu when multiple plugins are present (#55265)
Add external view plugin categories (admin, browse, docs, user) (#52737)
Add iframe plugins integration to DAG pages (#52795)
Add plugin error display in UI with comprehensive error handling (#49643, #49436)
Add collapsible failed task logs to prevent React error overflow (#54377)
Add dynamic legend system for calendar view (#55155)
Add React UI for Edge functionality (#53563)
Add pending actions display to DAG UI (#55041)
Add description field for filter parameters (#54903)
Add Catalan language support to Airflow UI (#55013)
Add Hungarian language support to Airflow UI (#54716)
Add map_index validation in categorize_task_instances (#54791)
Add Grid view UX improvements (#54846)
Add HITL UX improvements for better user experience (#54990)
Add async support for Notifiers (AIP-86) (#53831)
Add filtering capabilities for tasks view (#54484)
Add asset-based filtering support to DAG API endpoint (#54263)
Add iframe plugins to navigation (#51706)
Add RTL (right-to-left) layout support for Arabic and Hebrew (#51376)
Add test connection button to UI (#51055)
Add task instance bulk actions endpoint (#50443)
Add connection bulk deletion functionality (#51201)
Add pool column to task instances list (#51185)
Add iframe_views to backend plugin support (#51003)
Add keyboard shortcuts to clear and mark state for task instances and DAG runs (#50885)
Add deadline relationship to DAG runs and deadline model (#50925, #50093)
Add DAG run deletion UI (#50368)
Add task instance deletion UI and endpoint (#50235, #50165)
Switch all airflow logging to structlog (#52651, #55434, #55431, #55638)
Add Filter Bar to Audit Log (#55487)
Add Filters UI for Asset View (#54640)
Update color palette and leverage Chakra semantic tokens (#53981, #55739)
Improve calendar view UI with enhanced tooltips and visual fixes (#55476)
Fix DAG list filtering to include QUEUED runs with null start_date (#52668)
Fix XCom deletion failure for mapped task instances through bulk deletion API (#51850)
Fix XCom deletion failure for mapped task instances (#54954)
Fix task timeout handling within task SDK (#54089)
Fix task instance tries API duplicate entries (#50597)
Fix connection validation and type checking during construction (#54759)
Fix mapped task instance index display in Task Instances tab (#55363)
Fix Gantt chart state mismatch with Grid view (#55300)
Fix Gantt chart status color display issues (#55296)
Fix XCom mapping for dynamically-mapped task groups (#51556)
Fix missing ti_successes and related metrics in Airflow 3.0 Task SDK (#55322)
Fix bulk operation permissions for connection, pool and variable (#55278)
Fix clearTaskInstances API: Restore include_past/future support on UI (#54416)
Fix migration when XCom has NaN values (#53812)
Fix HITL related UI schema generated by prek hooks (#55204)
Fix consistent no-log handling for tasks with try_number=0 in API and UI (#55035)
Fix timezone conversion in datetime trigger parameters (#54593)
Fix audit log payload for DAG pause/unpause actions (#55091)
Fix pushing None as an XCom value (#55080)
Fix scheduler processing of cleared running tasks stuck in RESTARTING state (#55084)
Fix XCom deletion failure for mapped task instances (#54954)
Fix outgoing graph edges should exit opposite of incoming edges (#54789)
Fix external links in Navigation buttons (#52220)
Fix Error when viewing DAG details of a no longer configured bundle (#52086)
Fix compatibility with new numpy and pandas versions (#52071)
Fix connection recovery from URI when host has protocol (#51953)
Fix last DAG run not showing on DAG listing (#51115)
Fix task instance tries API returning duplicate entries (#50597)
Fix Graph view vanishing and loading issues (#53886, #54756)
Fix rendered template display formatting for better readability (#53657)
Fix Grid view expand/collapse button functionality (#54257)
Fix tooltip visibility and positioning issues (#53913)
Fix grid keyboard navigation focus management (#54271)
Fix plugin registration for invalid objects and middleware registration (#55264, #55399)
Fix external links for plugins with undefined URL routes (#55221)
Fix language display consistency and flag representation (#51560, #51177)
Fix RTL layout rendering for Arabic and Hebrew interfaces (#51853)
Fix graph export cropping when view is partial (#55012)
Fix log viewer "Toggle Source" to hide only source fields, not all structured log fields (#55474)
Output on stdout/stderr from within tasks is now filterable in the Sources list in the UI log view (#55508)
Redact JWT tokens in task logs (#55499)
Fix grid view to handle long task name (#55332)
Allow slash characters in Variable keys similar to Airflow 2.x (#55324)
Fix Grid cache invalidation for multi-run task operations (#55504)
Fix Gantt chart rendering issues (#55554)
Fix XCom access in DAG processor callbacks for notifiers (#55542)
Fix alignment of arrows in RTL mode for right-to-left languages (#55619)
Fix connection form extras not inferring correct type in UI (#55492)
Fix incorrect log timestamps in UI when default_timezone is not UTC (#54431)
Fix handling of priority_weight for DAG processor callbacks (#55436)
Fix pointless requests from Gantt view when there is no Run ID (#55668)
Ensure filename and lineno of logger calls are present in Task Logs (#55581)
Fix DAG disappearing after callback execution in stale detection (#55698)
Fix DB downgrade to Airflow 2 when fab tables exists (#55738)
Fix UI stats endpoint causing dashboard loading issues (#55733)
Fix unintended console output when DAG not found in serialized_dag table (#54972)
Fix scheduler handling of orphaned tasks from Airflow 2 during upgrade (#55848)
Fix logging format to respect existing configuration during upgrade to prevent unexpected log format changes (#55824)
Fix Grid view crashes when DAG version information is missing (#55771)
Fix compatibility for custom triggers migrating from Airflow 2.x that use synchronous connection calls (#55799)
Fix DAG runs triggered from UI incorrectly marked as REST API triggers instead of UI triggers (#54650)
Fix XCom API responses failing when encountering non-serializable objects by falling back to string representation (#55880)
Fix asset queue display in UI showing incorrect timestamps for deleted queue events (#54652)
Fix SQLite database migrations failing due to foreign key constraint handling (#55883)
Fix DAG deserialization failure when using non-default weight_rule values like 'absolute' (#55906)
Fix async connection retrieval in triggerer context preventing event loop blocking (#55812)
Fix Airflow downgrade compatibility by handling serialized DAG format conversion from v3 to v2 (#55975)
Fix 'All Log Levels' filter not working in task log viewer (#55851)
Fix Grid view scrollbar overlapping issues on Firefox browser (#55960)
Fix Gantt chart misalignment with Grid view layout (#55995)
Fix Grid view task names being extremely collapsed and unreadable when displaying many DAG runs (#55997)
Fix LocalExecutor race condition where tasks could start before database state was committed (#56010)
Move secrets masker to shared distribution for better modularity (#54449)
Move email notifications from scheduler to DAG processor for better architecture (#55238)
Add graph UI load optimization with latest run info endpoint (#53429)
Optimize UI bundle size by moving translations to dynamic loading (#51735)
Relocate Task SDK components for improved separation (#55174, #54795)
Refactor trigger rule utilities and weight rule consolidation (#54797, #53393)
Remove deprecated Airflow 2.x modules and legacy imports (#50482)
Clean up unused code and improve module organization (#52176, #52173, #53031)
Add SQLAlchemy 2.0 CI support for future compatibility (#52233)
Improve test fixtures and SDK communication testing (#54795, #50603)
Add translation completeness linting and validation tools (#51166)
Upgrade to latest versions of important dependencies (#55350)
Move webserver configuration options to API section (#50693, #50656)
Improve DAG bundle handling and versioning support (#47592)
Add database management CLI tools for external database operations (#50657)
Add comprehensive HITL operator documentation and examples (#54618)
Add guards for registering middlewares from plugins (#55399)
Optimize Gantt group expansion with de-bouncing and deferred rendering (#55334)
Differentiate between triggers and watchers currently running for better visibility (#55376)
Removed unused config: dag_stale_not_seen_duration (#55601, #55684)
Update UI's query client strategy for improved performance (#55528)
Unify datetime format across the UI for consistency (#55572)
Mark React Apps as Experimental for Airflow 3.1 release (#55478)
Improve OOM error messaging for clearer task failure diagnosis (#55602)
Display responder username for better audit trail in HITL workflows (#55509)
The constraint file do not contain developer dependencies anymore (#53631)
Add hyperlinks to dag_id column in DAG Runs and Task Instances pages for better navigation (#55648)
Add responsive web design (RWD) support to Grid view (#55745)
Add comprehensive Human-in-the-Loop operator tutorial and examples (#54618)
Add deadline alerts configuration and usage documentation (#53727)
Make term Dag consistent in docs task-sdk (#55100)
Add migration guide for upgrading from legacy SLA functionality to deadline alerts (#55743)
Add DAG bundles triggerer limitation documentation (#55232)
Add deadline alerts usage guides and best practices (#53727)
Remove --preview flag from ruff check instructions for Airflow 3 upgrade path (#55516)
Add documentation for context parameter (#55377)
Release Date: 2026-09-29
Template every connection id accepted by provider operators (#73286)
Template every connection id accepted by provider operators (#73286)
Nothing published for this version
Add deprecation notice for using Connection from models in favor of SDK approach
No significant changes.
Fix scheduler heartbeat timeout failures with intermittent DetachedInstanceError crashes (#53838) (#53858)
Fix connection editing where sensitive fields like passwords and extras were lost when updating connections (#53943) (#53973)
Fix BaseOperator on_kill functionality not working when tasks are killed externally in TaskSDK (#53718) (#53832)
Fix TaskInstance notes not refreshing automatically without manual page refresh (#53307) (#54025)
Fix invalid execution API URLs causing failures in task supervisor (#53082) (#53518)
Fix task failure callbacks not running on DAG Processor when tasks are externally killed (#53058) (#53143)
Fix task_success_overtime configuration option not being configurable (#53342) (#53351)
Fix CSS warning for nth-child selector (#53982) (#54000)
Fix DAG filtering where "all" option did not show all DAGs as expected (#53656) (#53672)
Fix accordion child contents not being visible when content overflows (#53595) (#53602)
Fix navbar positioning for anchor calculations (#52016) (#53581)
Fix DagBag safe mode configuration resolution in DAG processor (#52694) (#53507)
Fix large log reading causing out-of-memory issues in API server (#49470) (#53167)
Fix connection exceptions consistency between Airflow 2.x and 3.x (#52968) (#53093)
Remove unnecessary group_by clause in event logs query for performance (#53733) (#53807)
Allow remote logging providers to load connections from API Server (#53719) (#53761)
Add certificate support for API server client communication with self-signed certificates (#53574) (#53793)
Respect apps flags for API server command configuration (#52929) (#53775)
Skip empty DAG run configuration rows and set statement timeout (#50788) (#53619)
Remove incorrect warning for BaseOperator.executor attribute (#53496) (#53519)
Add back DAG parsing pre-import optimization for improved performance (#50371) (#52698)
Flexible form use ReactMarkdown instead of default Markdown component (#54032) (#54040)
Unconditionally disable start_from_trigger functionality (#53744) (#53750)
Serialize NaN and infinity values to string (#53835) (#53844)
Make log redaction safer in edge case when redaction has an error (#54046) (#54048)
Flexible form use ReactMarkdown instead of default Markdown component (#54032) (#54040)
Fix inconsistent casing in UI of decorated tasks (#54056) (#54092)
Fix AIRFLOW_API_APPS constant in API server command (#54007) (#54012)
Add deprecation notice for using Connection from models in favor of SDK approach (#53594) (#53621)
Remove remnants of ~= used in requires-python configuration (#52985) (#52987)
Remove upper-binding for "python-requires" specification (#52980) (#52984)
Update GitPython from 3.1.44 to 3.1.45 (#53725) (#53731)(#53724) (#53732)
Update DAG author documentation to use "DAG author" terminology (#53857) (#53950)
Update architecture diagrams labels from "Webserver(s)" to "API Server(s)" (#53917) (#54020)
Remove bold formatting for Public Interface documentation in Airflow 3.0+ (#53955) (#53964)
Add user-facing documentation for running separate Task Execution API server (#53789) (#53794)
Add documentation for self-signed certificate configuration (#53788) (#53792)
Update systemd unit files and documentation for Airflow 3.0 compatibility (#52294) (#53609)
Update public interface documentation to reflect airflow.sdk and AIP-72 changes (#52197) (#53117)
Update BaseOperator documentation string for clarity (#53403) (#53404)
Remove extra slash from endpoint URL formatting (#53755) (#53764)
Clarify our security model for sensitive connection information (#54088) (#54100)
Release Date: 2026-09-14
Fix late-binding loop variable in the SMTP OAuth2 callback (#70640)
Fix late-binding loop variable in the SMTP OAuth2 callback (#70640)
Nothing published for this version
📦 PyPI: https://pypi.org/project/apache-airflow/3.0.3/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/3.0.3/ 🛠️ Release Notes: https://airflow
📦 PyPI: https://pypi.org/project/apache-airflow/3.0.3/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/3.0.3/ 🛠️ Release Notes: https://airflow.apache.org/docs/apache-airflow/3.0.3/release_notes.html 🪶 Sources: https://airflow.apache.org/docs/apache-airflow/3.0.3/installation/installing-from-sources.html 🐳 Docker Image: "docker pull apache/airflow:3.0.3" 🚏 Constraints: https://github.com/apache/airflow/tree/constraints-3.0.3
xcom_pull to cover different scenarios for mapped tasks (#51568)run_as_user) support for task execution (#51780)exception to context for task callbacks (#52066)EOF is missed (#51180) (#51970)EventsTimetable's description during serialization (#51926)EOF detection of subprocesses in Dag Processor (#51895)dag.test (#51673)dag.test consistent with airflow dags test CLI command (#51476)No Status Filter (#52154)MappedOperator (#52681)AssetEventOperations.get to use alias_name when specified (#52324)start_from_trigger is True (#52873)example_external_task_parent_deferrable.py imports (#52957)no_status and duration for grid summaries (#53092)ti.log_url not in Task Context (#50376)XCom.get_all() method (#53102)connections_test CLI to use Connection instead of BaseHook (#51834) (#51917)libcst 1.8.1 for Python 3.9 (#51609)Full Changelog: https://github.com/apache/airflow/compare/3.0.2...3.0.3
Release Date: 2026-08-08
Escape attachment filename in Content-Disposition header (#69435)
Escape attachment filename in Content-Disposition header (#69435)
Nothing published for this version
Nothing published for this version
Add backwards compatibility shim and deprecation warning for EmailOperator
📦 PyPI: https://pypi.org/project/apache-airflow/3.0.2/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/3.0.2/ 🛠️ Release Notes: https://airflow.apache.org/docs/apache-airflow/3.0.2/release_notes.html 🪶 Sources: https://airflow.apache.org/docs/apache-airflow/3.0.2/installation/installing-from-sources.html
sys.path in task runner (#51318)sys.path in dag processor (#50385)SIGSEGV signals during DAG file imports (#51171)dag.test() (#51182)ForwardRef error by reordering discriminated union definitions (#50688)BaseNotifier (#50340)upstream_mapped_index when xcom access is needed (#50641)/run API endpoint for older Task SDK clientsFlexibleForm component (#50845)+1 more when tags exceed the display limit by one (#50669)default_args handling in operator .partial() to prevent TypeError when unused keys are present (#50525)airflow tasks clear command (#49631)--local flag in dag list and dag list-import-errors CLI commands (#49380)DagProcessor stats log to show the correct parse duration (#50316)get_log API (#50547)logical_date check when validating inlets and outlets (#51464)ti update state and set task to fail if exception encountered (#51295)example_dags in standard provider to example_dags in sources (#51275)airflow-core package (#51192)task.test to Task SDK (#50827)dag.test to Task SDK (#50300,#50419)ti.run to Task SDK execution path (#50141)airflow dags test from local files (#50420)execution_time module (#50940)dagrun value for list display (#50834)secret_key config to api section (#50839)webserver configs to fab provider (#50774,#50269,#50208,#50896)dag_run nullable in Details page (#50719)ab_user table (#50343)owner_links field to DAGDetailsResponse for enhanced owner metadata in the API (#50557)AssetAlias for alias in Asset Metadata example (#50768)schedule_interval in tutorial dags (#50947)PythonOperator in tutorial dag (#50962)Full Changelog: https://github.com/apache/airflow/compare/3.0.1...3.0.2
Release Date: 2026-07-10
Fix "AttributeError: 'NoneType' object has no attribute 'close'" for SmtpHook (#62409)
Fix "AttributeError: 'NoneType' object has no attribute 'close'" for SmtpHook (#62409)
Nothing published for this version
Fix a few SqlAlchemy deprecation warnings
📦 PyPI: https://pypi.org/project/apache-airflow/3.0.1/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/3.0.1/index.html 🛠️ Release Notes: https://airflow.apache.org/docs/apache-airflow/3.0.1/release_notes.html 🪶 Sources: https://airflow.apache.org/docs/apache-airflow/3.0.1/installation/installing-from-sources.html
dag_code records with no serialized dag (#49478)dag_code and serialized_dag tables on 3.0 upgrade (#49563)scheduler_interval field on downgrade (#49583)base_url in api server (#49545)max_active_tis_per_dag is not respected by dynamically mapped tasks (#49708)SimpleAuthManager (#49697)(#49866)bundle_version to DagRun response (#49726)task_ids in xcom_pull the same as multiple when provided as part of a list (#49692)DAGModel stale and associate bundle on import errors to aid migration from 2.10.5 (#49769)pip with avoiding resolution too deep issues in Python 3.12 (#49853)BashSensor (#49935)map_index_template on task completion (#49809)ContinuousTimetable false triggering when last run ends in future (#45175)Stats (#50088)TaskGroup (#49996)mapIndex to clear the relevant task instances. (#50256)STRAIGHT_JOIN prefix for MySQL query optimization in get_sorted_triggers (#46303)sqlalchemy[asyncio] extra is in core deps (#49452)HANDLER_SUPPORTS_TRIGGERER (#49370)gitpython as a core dependency (#49537)@babel/runtime from 7.26.0 to 7.27.0 (#49479)get_current_context (#49630)RunBackfillForm (#49609)backfill_id (#49691)(#49716)SimpleAllAdminMiddleware to allow api usage without auth header in request (#49599)react-router and react-router-dom from 7.4.0 to 7.5.2 (#49742)root_dag_id in dagbag and restore logic (#49668)airflow.cfg files across all containers in default docker-compose.yaml (#49681)/airflow-core (#49512)apache-airflow meta package (#49846)@task.kuberenetes_cmd (#46913)vite from 5.4.17 to 5.4.19 for Airflow UI (#49162)(#50074)map_index filter option to GetTICount and GetTaskStates (#49818)stats ui endpoint (#49985)state attribute to RuntimeTaskInstance for easier ti.state access in Task Context (#50031)dag_run_conf to RunBackfillForm (#49763)dateInterval validation and error handling (#50072)Task Instances [{map_index}] tab to mapped task details (#50085)security/api.rst (#49675)max_consecutive_failed_dag_runs default value to zero in TaskSDK dag (#49795) (#49803)example_params_ui_tutorial) (#49905)Full Changelog: https://github.com/apache/airflow/compare/3.0.0...3.0.1
Release Date: 2026-05-23
Fix SMTP connection test for noop tuple response (#66406)
Fix SMTP email callback to use email_conn_id (#65072)
Fix SMTP connection test for noop tuple response (#66406)
Fix SMTP email callback to use email_conn_id (#65072)
Nothing published for this version
📣 We are proud to announce the General Availability of Apache Airflow® 3.0, the most significant release in the project’s history.
📣 We are proud to announce the General Availability of Apache Airflow® 3.0, the most significant release in the project’s history.
Airflow 3.0 builds on the foundation of Airflow 2 and introduces a new service-oriented architecture, a modern React-based UI, enhanced security, and a host of long-requested features such as DAG versioning, improved backfills, event-driven scheduling, and support for remote execution.
You can read more about what 3.0 brings in https://airflow.apache.org/blog/airflow-three-point-oh-is-here/.
📦 PyPI: https://pypi.org/project/apache-airflow/3.0.0/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/3.0.0 🛠️ Release Notes: https://airflow.apache.org/docs/apache-airflow/3.0.0/release_notes.html 🪶 Sources: https://airflow.apache.org/docs/apache-airflow/3.0.0/installation/installing-from-sources.html
This is the result of 300+ developers within the Airflow community working together tirelessly for many months! A huge thank you to all of them for their contributions.
Resources
We are proud to announce the General Availability of Apache Airflow 3.0 — the most significant release in the project's history. This version introduces a service-oriented architecture, a stable DAG authoring interface, expanded support for event-driven and ML workflows, and a fully modernized UI built on React. Airflow 3.0 reflects years of community investment and lays the foundation for the next era of scalable, modular orchestration.
Service-Oriented Architecture: A new Task Execution API and airflow api-server enable task execution in remote environments with improved isolation and flexibility (AIP-72).
Edge Executor: A new executor that supports distributed, event-driven, and edge-compute workflows (AIP-69), now generally available.
Stable Authoring Interface: DAG authors should now use the new airflow.sdk namespace to import core DAG constructs like @dag, @task, and DAG.
Scheduler-Managed Backfills: Backfills are now scheduled and tracked like regular DAG runs, with native UI and API support (AIP-78).
DAG Versioning: Airflow now tracks structural changes to DAGs over time, enabling inspection of historical DAG definitions via the UI and API (AIP-66).
Asset-Based Scheduling: The dataset model has been renamed and redesigned as assets, with a new @asset decorator and cleaner event-driven DAG definition (AIP-74, AIP-75).
Support for ML and AI Workflows: DAGs can now run with logical_date=None, enabling use cases such as model inference, hyperparameter tuning, and non-interval workflows (AIP-83).
Removal of Legacy Features: SLAs, SubDAGs, DAG and Xcom pickling, and several internal context variables have been removed. Use the upgrade tools to detect deprecated usage.
Split CLI and API Changes: The CLI has been split into airflow and airflowctl (AIP-81), and REST API now defaults to logical_date=None when triggering a new DAG run.
Modern React UI: A complete UI overhaul built on React and FastAPI includes version-aware views, backfill management, and improved DAG and task introspection (AIP-38, AIP-84).
Migration Tooling: Use ruff and airflow config update to validate DAGs and configurations. Upgrade requires Airflow 2.7 or later and Python 3.9–3.12.
Airflow 3.0 introduces the most significant set of changes since the 2.0 release, including architectural shifts, new execution models, and improvements to DAG authoring and scheduling.
Airflow now supports a service-oriented architecture, enabling tasks to be executed remotely via a new Task Execution API. This API decouples task execution from the scheduler and introduces a stable contract for running tasks outside of Airflow's traditional runtime environment.
To support this, Airflow introduces the Task SDK — a lightweight runtime environment for running Airflow tasks in external systems such as containers, edge environments, or other runtimes. This lays the groundwork for language-agnostic task execution and brings improved isolation, portability, and extensibility to Airflow-based workflows.
Airflow 3.0 also introduces a new airflow.sdk namespace that exposes the core authoring interfaces for defining DAGs and tasks. DAG authors should now import objects like DAG, @dag, and @task from airflow.sdk rather than internal modules. This new namespace provides a stable, forward-compatible interface for DAG authoring across future versions of Airflow.
Airflow 3.0 introduces the Edge Executor as a generally available feature, enabling execution of tasks in distributed or remote compute environments. Designed for event-driven and edge-compute use cases, the Edge Executor integrates with the Task Execution API to support task orchestration beyond the traditional Airflow runtime. This advancement facilitates hybrid and cross-environment orchestration patterns, allowing task workers to operate closer to data or application layers.
Backfills are now fully managed by the scheduler, rather than being launched as separate command-line jobs. This change unifies backfill logic with regular DAG execution and ensures that backfill runs follow the same scheduling, versioning, and observability models as other DAG runs.
Airflow 3.0 also introduces native UI and REST API support for initiating and monitoring backfills, making them more accessible and easier to integrate into automated workflows. These improvements lay the foundation for smarter, safer historical reprocessing — now available directly through the Airflow UI and API.
Airflow 3.0 introduces native DAG versioning. DAG structure changes (e.g., renamed tasks, dependency shifts) are now tracked directly in the metadata database. This allows users to inspect historical DAG structures through the UI and API, and lays the foundation for safer backfills, improved observability, and runtime-determined DAG logic.
Note: DAG bundles are not initialized in the triggerer. In practice, this means that triggers cannot come from a DAG bundle. This is because the triggerer does not deal with changes in trigger code over time, as everything happens in the main process. Triggers can come from anywhere else on sys.path instead.
Airflow 3.0 ships with a completely redesigned user interface built on React and FastAPI. This modern architecture improves responsiveness, enables more consistent navigation across views, and unlocks new UI capabilities — including support for DAG versioning, asset-centric DAG definitions, and more intuitive filtering and search.
The new UI replaces the legacy Flask-based frontend and introduces a foundation for future extensibility and community contributions.
The concept of Datasets has been renamed to Assets, unifying terminology with common practices in the modern data ecosystem. The internal model has also been reworked to better support future features like asset partitions and validations.
The @asset decorator and related changes to the DAG parser enable clearer, asset-centric DAG definitions, allowing Airflow to more naturally support event-driven and data-aware scheduling patterns.
This renaming impacts modules, classes, functions, configuration keys, and internal models. Key changes include:
Dataset → Asset
DatasetEvent → AssetEvent
DatasetAlias → AssetAlias
airflow.datasets.* → airflow.sdk.*
airflow.timetables.simple.DatasetTriggeredTimetable → airflow.timetables.simple.AssetTriggeredTimetable
airflow.timetables.datasets.DatasetOrTimeSchedule → airflow.timetables.assets.AssetOrTimeSchedule
airflow.listeners.spec.dataset.on_dataset_created → airflow.listeners.spec.asset.on_asset_created
airflow.listeners.spec.dataset.on_dataset_changed → airflow.listeners.spec.asset.on_asset_changed
core.dataset_manager_class → core.asset_manager_class
core.dataset_manager_kwargs → core.asset_manager_kwargs
Airflow 3.0 removes the legacy schedule_interval and timetable parameters. DAGs must now use the unified schedule field for all time- and event-based scheduling logic. This simplifies DAG definition and improves consistency across scheduling paradigms.
Airflow 3.0 changes the default behavior for new DAGs by setting catchup_by_default = False in the configuration file. This means DAGs that do not explicitly set catchup=... will no longer backfill missed intervals by default. This change reduces confusion for new users and better reflects the growing use of on-demand and event-driven workflows.
The default DAG schedule has been changed to None from @once.
Task code can no longer directly access the metadata database. Interactions with DAG state, task history, or DAG runs must be performed via the Airflow REST API or exposed context. This change improves architectural separation and enables remote execution.
Airflow no longer supports triggering DAG runs with a logical date in the future. This change aligns with the logical execution model and removes ambiguity in backfills and event-driven DAGs. Use logical_date=None to trigger runs with the current timestamp.
For DAG runs triggered by an Asset event or through the REST API without specifying a logical_date, Airflow now sets logical_date=None by default. These DAG runs do not have a data interval, and attempting to access data_interval_start, data_interval_end, or logical_date from the task context will raise a KeyError.
DAG authors should use dag_run.logical_date and perform appropriate checks or fallbacks if supporting multiple trigger types. This change improves consistency with event-driven semantics but may require updates to existing DAGs that assume these values are always present.
Airflow 3.0 refines task callback behavior to improve clarity and consistency. In particular, on_success_callback is no longer executed when a task is marked as SKIPPED, aligning it more closely with expected semantics.
Several default configuration values have been updated in Airflow 3.0 to better reflect modern usage patterns and simplify onboarding:
catchup_by_default is now set to False by default. DAGs will not automatically backfill unless explicitly configured to do so.
create_cron_data_intervals is now set to False by default. As a result, cron expressions will be interpreted using the CronTriggerTimetable instead of the legacy CronDataIntervalTimetable. This only affects DAGs that pass a bare cron string to schedule=; DAGs that pass an explicit timetable instance are unaffected. If you rely on the data interval semantics (data_interval_start / data_interval_end, or templated values like ds / ts derived from logical_date), set create_cron_data_intervals=True explicitly before the upgrade. Flipping the value later, after Airflow 3 DAG runs already exist, will skip one scheduled run on each affected DAG to avoid colliding with the previous run's logical_date.
SimpleAuthManager is now the default auth_manager. To continue using Flask AppBuilder-based authentication, install the apache-airflow-providers-fab provider and explicitly set auth_manager = airflow.providers.fab.auth_manager.FabAuthManager.
These changes represent the most significant evolution of the Airflow platform since the release of 2.0 — setting the stage for more scalable, event-driven, and language-agnostic orchestration in the years ahead.
Airflow 3.0 introduces several important improvements and behavior changes in how DAGs and tasks are scheduled, prioritized, and executed.
Airflow 3.0 now requires the standalone DAG processor to parse DAGs. This dedicated process improves scheduler performance, isolation, and observability. It also simplifies architecture by clearly separating DAG parsing from scheduling logic. This change may affect custom deployments that previously used embedded DAG parsing.
The priority_weight value on a task is now capped by the number of available pool slots. This ensures that resource availability remains the primary constraint in task execution order, preventing high-priority tasks from starving others when resource contention exists.
Teardown tasks will now be executed even when a DAG run is terminated early. This ensures that cleanup logic is respected, improving reliability for workflows that use teardown tasks to manage ephemeral infrastructure, temporary files, or downstream notifications.
Scheduler components now use run_with_db_retries to handle transient database issues more gracefully. This enhances Airflow's fault tolerance in high-volume environments and reduces the likelihood of scheduler restarts due to temporary database connection problems.
Airflow 3.0 fixes a bug that caused incorrect task statistics to be reported for dynamic task mapping. Stats now accurately reflect the number of mapped task instances and their statuses, improving observability and debugging for dynamic workflows.
SequentialExecutor was primarily used for local testing but is now redundant, as LocalExecutor supports SQLite with WAL mode and provides better performance with parallel execution. Users should switch to LocalExecutor or CeleryExecutor as alternatives.
Airflow 3.0 includes several changes that improve consistency, clarity, and long-term stability for DAG authors.
Airflow 3.0 introduces a new, stable public API for DAG authoring under the airflow.sdk namespace, available via the apache-airflow-task-sdk package.
The goal of this change is to decouple DAG authoring from Airflow internals (Scheduler, API Server, etc.), providing a forward-compatible, stable interface for writing and maintaining DAGs across Airflow versions.
DAG authors should now import core constructs from airflow.sdk rather than internal modules.
Key Imports from airflow.sdk:
Classes:
Asset
BaseNotifier
BaseOperator
BaseOperatorLink
BaseSensorOperator
Connection
Context
DAG
EdgeModifier
Label
ObjectStoragePath
Param
TaskGroup
Variable
Decorators and Functions:
@asset
@dag
@setup
@task
@task_group
@teardown
chain
chain_linear
cross_downstream
get_current_context
get_parsing_context
For an exhaustive list of available classes, decorators, and functions, check airflow.sdk.__all__.
All DAGs should update imports to use airflow.sdk instead of referencing internal Airflow modules directly. Legacy import paths (e.g., airflow.models.dag.DAG, airflow.decorator.task) are deprecated and will be removed in a future Airflow version. Some additional utilities and helper functions that DAGs sometimes use from airflow.utils.* and others will be progressively migrated to the Task SDK in future minor releases.
These future changes aim to complete the decoupling of DAG authoring constructs from internal Airflow services. DAG authors should expect continued improvements to airflow.sdk with no backwards-incompatible changes to existing constructs.
For example, update:
# Old (Airflow 2.x)
from airflow.models import DAG
from airflow.decorators import task
# New (Airflow 3.x)
from airflow.sdk import DAG, task
The DAG argument fail_stop has been renamed to fail_fast for improved clarity. This parameter controls whether a DAG run should immediately stop execution when a task fails. DAG authors should update any code referencing fail_stop to use the new name.
Several legacy context variables have been removed or may no longer be available in certain types of DAG runs, including:
conf
execution_date
dag_run.external_trigger
In asset-triggered and manually triggered DAG runs with logical_date=None, data interval fields such as data_interval_start and data_interval_end may not be present in the task context. DAG authors should use explicit references such as dag_run.logical_date and conditionally check for the presence of interval-related fields where applicable.
Internal task context functions such as get_parsing_context have been moved to a more appropriate location (e.g., airflow.models.taskcontext). DAG authors using these utilities directly should update import paths accordingly.
The TriggerRule.ALWAYS rule can no longer be used with teardown tasks or tasks that are expected to honor upstream dependency semantics. DAG authors should ensure that teardown logic is defined with the appropriate trigger rules for consistent task resolution behavior.
A new utility function, create_asset_aliases(), allows DAG authors to define reusable aliases for frequently referenced Assets. This improves modularity and reuse across DAG files and is particularly helpful for teams adopting asset-centric DAGs.
The Operator Extra links, which can be defined either via plugins or custom operators now do not execute any user code in the Airflow UI, but instead push the "full" links to XCom backend and the link is fetched from the XCom backend when viewing task details, for example from grid view.
Example for users with custom links class:
@attr.s(auto_attribs=True)
class CustomBaseIndexOpLink(BaseOperatorLink):
"""Custom Operator Link for Google BigQuery Console."""
index: int = attr.ib()
@property
def name(self) -> str:
return f"BigQuery Console #{self.index + 1}"
@property
def xcom_key(self) -> str:
return f"bigquery_{self.index + 1}"
def get_link(self, operator, *, ti_key):
search_queries = XCom.get_one(
task_id=ti_key.task_id, dag_id=ti_key.dag_id, run_id=ti_key.run_id, key="search_query"
)
return f"https://console.cloud.google.com/bigquery?j={search_query}"
The link has an xcom_key defined, which is how it will be stored in the XCOM backend, with key as xcom_key and value as the entire link, this case: https://console.cloud.google.com/bigquery?j=search
Operator (including Sensors), Executors & Hooks can no longer be registered or imported via Airflow's plugin mechanism. These types of classes are just treated as plain Python classes by Airflow, so there is no need to register them with Airflow. They can be imported directly from their respective provider packages.
Before:
from airflow.hooks.my_plugin import MyHook
You should instead import it as:
from my_plugin import MyHook
Airflow 3.0 expands the types of DAGs that can be expressed by removing the constraint that each DAG run must correspond to a unique data interval. This change, introduced in AIP-83, enables support for workflows that don't operate on a fixed schedule — such as model training, hyperparameter tuning, and inference tasks.
These ML- and AI-oriented DAGs often run ad hoc, are triggered by external systems, or need to execute multiple times with different parameters over the same dataset. By allowing multiple DAG runs with logical_date=None, Airflow now supports these scenarios natively without requiring workarounds.
Airflow 3.0 introduces several configuration and interface updates that improve consistency, clarify ownership of core utilities, and remove legacy behaviors that were no longer aligned with modern usage patterns.
Airflow no longer silently updates configuration options that retain deprecated default values. Users are now required to explicitly set any config values that differ from the current defaults. This change improves transparency and prevents unintentional behavior changes during upgrades.
Several configuration defaults have changed in Airflow 3.0 to better reflect modern usage patterns:
The default value of catchup_by_default is now False. DAGs will not backfill missed intervals unless explicitly configured to do so.
The default value of create_cron_data_intervals is now False. Cron expressions are now interpreted using the CronTriggerTimetable instead of the legacy CronDataIntervalTimetable. This change simplifies interval logic and aligns with the future direction of Airflow's scheduling system. Set this flag explicitly before upgrading from Airflow 2 if you rely on data interval semantics; flipping it later (after Airflow 3 DAG runs exist) will skip one scheduled run per affected DAG.
Several core components have been moved to more intuitive or stable locations:
The SecretsMasker class has been relocated to airflow.sdk.execution_time.secrets_masker.
The ObjectStoragePath utility previously located under airflow.io is now available via airflow.sdk.
These changes simplify imports and reflect broader efforts to stabilize utility interfaces across the Airflow codebase.
Asset event mappings in the task context are improved to better support asset use cases, including new features introduced in AIP-74.
Events of an asset or asset alias are now accessed directly by a concrete object to avoid ambiguity. Using a str to access events is no longer supported. Use an Asset or AssetAlias object, or Asset.ref to refer to an entity explicitly instead, such as:
outlet_events[Asset.ref(name="myasset")] # Get events for asset named "myasset". outlet_events[AssetAlias(name="myalias")] # Get events for asset alias named "myalias".
Alternatively, two helpers for_asset and for_asset_alias are added as shortcuts:
outlet_events.for_asset(name="myasset") # Get events for asset named "myasset". outlet_events.for_asset_alias(name="myalias") # Get events for asset alias named "myalias".
The internal representation of asset event triggers now also includes an explicit uri field, simplifying traceability and aligning with the broader asset-aware execution model introduced in Airflow 3.0. DAG authors interacting directly with inlet_events may need to update logic that assumes the previous structure.
In Airflow 2, the xcom_pull() method allowed pulling XComs by key without specifying task_ids, despite the fact that the underlying DB model defines task_id as part of the XCom primary key. This created ambiguity: if two tasks pushed XComs with the same key, xcom_pull() would pull whichever one happened to be first, leading to unpredictable behavior.
Airflow 3 resolves this inconsistency by requiring task_ids when pulling by key. This change aligns with the task-scoped nature of XComs as defined by the schema, ensuring predictable and consistent behavior.
DAG Authors should update their dags to use task_ids if their dags used xcom_pull without task_ids such as:
kwargs["ti"].xcom_pull(key="key")
Should be updated to:
kwargs["ti"].xcom_pull(task_ids="task1", key="key")
As part of the deprecation cleanup, several legacy configuration options have been removed. These include:
[scheduler] allow_trigger_in_future
[scheduler] use_job_schedule
[scheduler] use_local_tz
[scheduler] processor_poll_interval
[logging] dag_processor_manager_log_location
[logging] dag_processor_manager_log_stdout
[logging] log_processor_filename_template
All the webserver configurations have also been removed since API server now replaces webserver, so the configurations like below have no effect:
[webserver] allow_raw_html_descriptions
[webserver] cookie_samesite
[webserver] error_logfile
[webserver] access_logformat
[webserver] web_server_master_timeout
etc
Several configuration options previously located under the [webserver] section have been moved to the new ``[api]`` section. The following configuration keys have been moved:
[webserver] web_server_host → [api] host
[webserver] web_server_port → [api] port
[webserver] workers → [api] workers
[webserver] web_server_worker_timeout → [api] worker_timeout
[webserver] web_server_ssl_cert → [api] ssl_cert
[webserver] web_server_ssl_key → [api] ssl_key
[webserver] access_logfile → [api] access_logfile
The following DAG parsing configuration options were moved to the new ``[dag_processor]`` section:
[core] dag_file_processor_timeout → [dag_processor] dag_file_processor_timeout
[scheduler] parsing_processes → [dag_processor] parsing_processes
[scheduler] file_parsing_sort_mode → [dag_processor] file_parsing_sort_mode
[scheduler] max_callbacks_per_loop → [dag_processor] max_callbacks_per_loop
[scheduler] min_file_process_interval → [dag_processor] min_file_process_interval
[scheduler] stale_dag_threshold → [dag_processor] stale_dag_threshold
[scheduler] print_stats_interval → [dag_processor] print_stats_interval
Users should review their airflow.cfg files or use the airflow config lint command to identify outdated or removed options.
Airflow 3.0 includes improved support for upgrade validation. Use the following tools to proactively catch incompatible configs or deprecated usage patterns:
airflow config lint: Identifies removed or invalid config keys
ruff check --select AIR30 --preview: Flags removed interfaces and common migration issues
Airflow 3.0 introduces changes to both the CLI and REST API interfaces to better align with service-oriented deployments and event-driven workflows.
The Airflow CLI has been split into two distinct interfaces:
The core airflow CLI now handles only local functionality (e.g., airflow tasks test, airflow dags list).
Remote functionality, including triggering DAGs or managing connections in service-mode environments, is now handled by a separate CLI called airflowctl, distributed via the apache-airflow-client package.
This change improves security and modularity for deployments that use Airflow in a distributed or API-first context.
The legacy REST API v1, previously built with Connexion and Marshmallow, has been replaced by a modern FastAPI-based REST API v2.
This new implementation improves performance, aligns more closely with web standards, and provides a consistent developer experience across the API and UI.
Key changes include stricter validation (422 errors instead of 400), the removal of the execution_date parameter in favor of logical_date, and more consistent query parameter handling.
The v2 API is now the stable, fully supported interface for programmatic access to Airflow, and also powers the new UI - achieving full feature parity between the UI and API.
For details, see the Airflow REST API v2 documentation.
The behavior of the POST /dags/{dag_id}/dagRuns endpoint has changed. If a logical_date is not explicitly provided when triggering a DAG via the REST API, it now defaults to None.
This aligns with event-driven DAGs and manual runs in Airflow 3.0, but may break backward compatibility with scripts or tools that previously relied on Airflow auto-generating a timestamped logical_date.
Several deprecated CLI arguments and commands that were marked for removal in earlier versions have now been cleaned up in Airflow 3.0. Run airflow --help to review the current set of available commands and arguments.
Deprecated --ignore-depends-on-past cli option is replaced by --depends-on-past ignore.
--tree flag for airflow tasks list command is removed. The format of the output with that flag can be expensive to generate and extremely large, depending on the DAG. airflow dag show is a better way to visualize the relationship of tasks in a DAG.
Changing dag_id from flag (-d, --dag-id) to a positional argument in the dags list-runs CLI command.
The airflow db init and airflow db upgrade commands have been removed. Use airflow db migrate instead to initialize or migrate the metadata database. If you would like to create default connections use airflow connections create-default-connections.
airflow api-server has replaced airflow webserver cli command.
Airflow 3.0 completes the migration of several core operators, sensors, hooks, and triggers into the new apache-airflow-providers-standard package. This package now includes commonly used components such as:
PythonOperator, BashOperator
ExternalTaskSensor, FileSensor
ShortCircuitOperator, LatestOnlyOperator
SubprocessHook, FilesystemHook
DateTimeTrigger, TimeDeltaTrigger, FileTrigger
These operators, sensors, hooks, and triggers were previously bundled inside airflow-core but are now treated as provider-managed components to improve modularity, testability, and lifecycle independence.
This change enables more consistent versioning across providers and prepares Airflow for a future where all integrations — including "standard" ones — follow the same interface model.
To maintain compatibility with existing DAGs, the apache-airflow-providers-standard package is installable on both Airflow 2.x and 3.x. Users upgrading from Airflow 2.x are encouraged to begin updating import paths and testing provider installation in advance of the upgrade.
Legacy imports such as airflow.operators.python.PythonOperator are deprecated and will be removed soon. They should be replaced with:
from airflow.providers.standard.operators.python import PythonOperator
The SimpleHttpOperator has been migrated to apache-airflow-providers-http and renamed to HttpOperator
Airflow 3.0 introduces a modernized user experience that complements the new React-based UI architecture (see Significant Changes). Several areas of the interface have been enhanced to improve visibility, consistency, and navigability.
The Airflow Home page now provides a high-level operational overview of your environment. It includes health checks for core components (Scheduler, Triggerer, DAG Processor), summary stats for DAG and task instance states, and a real-time feed of asset-triggered events. This view helps users quickly identify pipeline health, recent activity, and potential failures.
The DAG List page has been refreshed with a cleaner layout and improved responsiveness. Users can browse DAGs by name, tags, or owners. While full-text search has not yet been integrated, filters and navigation have been refined for clarity in large deployments.
The Graph and Grid views now display task information in the context of the DAG version that was used at runtime. This improves traceability for DAGs that evolve over time and provides more accurate debugging of historical runs.
The Graph view now supports visualizing the full chain of asset and task dependencies, including assets consumed or produced across DAG boundaries. This allows users to inspect upstream and downstream lineage in a unified view, making it easier to trace data flows, debug triggering behavior, and understand conditional dependencies between assets and tasks.
The "Code" tab now displays the exact DAG source as parsed by the scheduler for the selected DAG version. This allows users to inspect the precise code that was executed, even for historical runs, and helps debug issues related to versioned DAG changes.
Task log access has been streamlined across views. Logs are now easier to access from both the Grid and Task Instance pages, with cleaner formatting and reduced visual noise.
New UI components support asset-centric DAGs and backfill workflows:
Asset definitions are now visible from the DAG details page, allowing users to inspect upstream and downstream asset relationships.
Backfills can be triggered and monitored directly from the UI, including support for scheduler-managed backfills introduced in Airflow 3.0.
These improvements make Airflow more accessible to operators, data engineers, and stakeholders working across both time-based and event-driven workflows.
A number of deprecated features, modules, and interfaces have been removed in Airflow 3.0, completing long-standing migrations and cleanups.
Users are encouraged to review the following removals to ensure compatibility:
SubDag support has been removed entirely, including the SubDagOperator, related CLI and API interfaces. TaskGroups are now the recommended alternative for nested DAG structures.
SLAs have been removed: The legacy SLA feature, including SLA callbacks and metrics, has been removed. A more flexible replacement mechanism, DeadlineAlerts, is planned for a future version of Airflow. Users who relied on SLA-based notifications should consider implementing custom alerting using task-level success/failure hooks or external monitoring integrations.
Pickling support has been removed: All legacy features related to DAG pickling have been fully removed. This includes the PickleDag CLI/API, as well as implicit behaviors around store_serialized_dags = False. DAGs must now be serialized using the JSON-based serialization system. Ensure any custom Python objects used in DAGs are JSON-serializable.
Context parameter cleanup: Several previously available context variables have been removed from the task execution context, including conf, execution_date, and dag_run.external_trigger. These values are either no longer applicable or have been renamed (e.g., use dag_run.logical_date instead of execution_date). DAG authors should ensure that templated fields and Python callables do not reference these deprecated keys.
Deprecated core imports have been fully removed. Any use of airflow.operators.*, airflow.hooks.*, or similar legacy import paths should be updated to import from their respective providers.
Configuration cleanup: Several legacy config options have been removed, including:
scheduler.allow_trigger_in_future: DAG runs can no longer be triggered with a future logical date. Use logical_date=None instead.
scheduler.use_job_schedule and scheduler.use_local_tz have also been removed. These options were deprecated and no longer had any effect.
Deprecated utility methods such as those in airflow.utils.helpers, airflow.utils.process_utils, and airflow.utils.timezone have been removed. Equivalent functionality can now be found in the standard Python library or Airflow provider modules.
Removal of deprecated CLI flags and behavior: Several CLI entrypoints and arguments that were marked for removal in earlier versions have been cleaned up.
To assist with the upgrade, tools like ruff (e.g., rule AIR302) and airflow config lint can help identify obsolete imports and configuration keys. These utilities are recommended for locating and resolving common incompatibilities during migration. Please see Upgrade Guide for more information.
The following table summarizes user-facing features removed in 3.0 and their recommended replacements. Not all of these are called out individually above.
Feature |
Replacement / Notes |
|---|---|
SubDagOperator / SubDAGs |
Use TaskGroups |
SLA callbacks / metrics |
Deadline Alerts (planned post-3.0) |
DAG Pickling |
Use JSON serialization; pickling is no longer supported |
Xcom Pickling |
Use custom Xcom backend; pickling is no longer supported |
execution_date context var |
Use dag_run.logical_date |
conf and dag_run.external_trigger |
Removed from context; use DAG params or dag_run APIs |
Core EmailOperator |
Use EmailOperator from the smtp provider |
none_failed_or_skipped rule |
Use none_failed_min_one_success |
dummy trigger rule |
Use always |
fail_stop argument |
Use fail_fast |
store_serialized_dags=False |
DAGs are always serialized; config has no effect |
Deprecated core imports |
Import from appropriate provider package |
SequentialExecutor & DebugExecutor |
Use LocalExecutor for testing |
.airflowignore regex |
Uses glob syntax by default |
Airflow 3 was designed with migration in mind. Many Airflow 2 DAGs will work without changes, especially if deprecation warnings were addressed in earlier releases. To support the upgrade, Airflow 3 includes validation tools such as ruff and airflow config update, as well as a simplified startup model.
For a step-by-step upgrade process, see the Upgrade Guide.
To upgrade to Airflow 3.0, you must be running Airflow 2.7 or later.
Airflow 3.0 supports the following Python versions:
Python 3.9
Python 3.10
Python 3.11
Python 3.12
Earlier versions of Airflow or Python are not supported due to architectural changes and updated dependency requirements.
Airflow now includes a Ruff-based linter with custom rules to detect DAG patterns and interfaces that are no longer compatible with Airflow 3.0. These checks are packaged under the AIR30x rule series. Example usage:
ruff check dags/ --select AIR301 --preview
ruff check dags/ --select AIR301 --fix --preview
These checks can automatically fix many common issues such as renamed arguments, removed imports, or legacy context variable usage.
Airflow 3.0 introduces a new utility to validate and upgrade your Airflow configuration file:
airflow config update
airflow config update --fix
This utility detects removed or deprecated configuration options and, if desired, updates them in-place.
Additional validation is available via:
airflow config lint
This command surfaces obsolete configuration keys and helps align your environment with Airflow 3.0 requirements.
As with previous major releases, the Airflow 3.0 upgrade includes schema changes to the metadata database. Before upgrading, it is strongly recommended that you back up your database and optionally run:
airflow db clean
to remove old task instance, log, or XCom data. To apply the new schema:
airflow db migrate
Airflow components are now started explicitly. For example:
airflow api-server # Replaces airflow webserver
airflow dag-processor # Required in all environments
These changes reflect Airflow's new service-oriented architecture.
Upgrade Guide
Airflow 3.0 represents more than a year of collaboration across hundreds of contributors and dozens of organizations. We thank everyone who helped shape this release through design discussions, code contributions, testing, documentation, and community feedback. For full details, migration guidance, and upgrade best practices, refer to the official Upgrade Guide and join the conversation on the Airflow dev and user mailing lists.
Release Date: 2026-04-26
The SMTP STARTTLS upgrade performed by SmtpHook.get_conn and SmtpHook.aget_conn 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 SmtpHook at an SMTP server with a self-signed or otherwise non-validating certificate and need to preserve the previous behaviour must set the ssl_context field in the SMTP connection extras to "none" . Leaving the field unset (or setting it to "default" ) now applies ssl.create_default_context() to the STARTTLS upgrade as well as to the existing SMTP_SSL path.
Validate SMTP server certificate on STARTTLS upgrade (#65346)
The SMTP STARTTLS upgrade performed by SmtpHook.get_conn and SmtpHook.aget_conn 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 SmtpHook at an SMTP server with a self-signed or otherwise non-validating certificate and need to preserve the previous behaviour must set the ssl_context field in the SMTP connection extras to "none". Leaving the field unset (or setting it to "default") now applies ssl.create_default_context() to the STARTTLS upgrade as well as to the existing SMTP_SSL path.
Validate SMTP server certificate on STARTTLS upgrade (#65346)
Nothing published for this version
- Load hook metadata from YAML without importing Hook class
Release Date: 2026-04-12
Load hook metadata from YAML without importing Hook class (#63826)
Load hook metadata from YAML without importing Hook class (#63826)
Nothing published for this version
Release Date: 2026-03-28 ### Misc - Add Python 3.14 Support
Release Date: 2026-03-28
Add Python 3.14 Support (#63520)
Nothing published for this version
Fix double logging with some task logging handler
SLAMiss is nullable and not always given back when pulling task instances (#27423)_ when searching for DAGs (#27448)dag/task ids from BaseExecutor (#27550)RotatingFilehandler used in DagProcessor non-caching (#27223)executor.job_id to BackfillJob.id for backfills (#27020)1.4.0 to 1.4.1 in /airflow/www (#27552)TCP_KEEPALIVE etc warnings (#26981)KubernetesExecutor overwrites container args (#27450)BaseOperator links (#27441)Dag Run start. (#27111)kerberos environment variables to the docs (#27028)Release Date: 2026-03-13
Fix OAuth2 XOAUTH2 auth and EHLO after STARTTLS in SmtpHook (#62879)
Fix OAuth2 XOAUTH2 auth and EHLO after STARTTLS in SmtpHook (#62879)
Nothing published for this version
Add missing AUTOINC/SERIAL for FAB tables
airflow dags reserialize (#27030)state_color_mapping jinja global (#26822)airflow tasks test (#26806)sphinx and sphinx-autoapi (#26743)RTIF.delete_old_records() (#26667)4.1.4 (#26393)docker-compose.yaml (#26726)Release Date: 2026-01-17
New year means updated Copyright notices (#60344)
Nothing published for this version
Resolve deprecation warning re Table.exists()
Table.exists() (#26616)templates_dict to task decorator (#26390)scheduled during backfill (#26205)json_provider_class on Flask app so it uses our encoder (#26554)cacheable (#26498)base_template (#26439)non-sensitive-only option for expose_config (#26507)example_datasets dag names (#26495)Release Date: 2025-12-13
Add backcompat for exceptions in providers (#58727)
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-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 >_.
Include all init params in template_fields for consistency with other operators (#58278)
Bump minimum Airflow version in providers to Airflow 2.11.0 (#58612)
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>_.
Include all __init__ params in template_fields for consistency with other operators (#58278)
Bump minimum Airflow version in providers to Airflow 2.11.0 (#58612)
Nothing published for this version
Run the check_migration loop at least once
check_migration loop at least onceis_mapped field to Task response. (#23319)dag_tag to dag foreign key (#23444)--subdir argument value for standalone dag processor. (#23864)dag-processor command (#23886)__wrapped__ property to _TaskDecorator (#23830)sql is empty list in DbApiHook (#23816)_airflow_moved tables (#23635)Release Date: 2025-11-17
Convert all airflow distributions to be compliant with ASF requirements (#58138)
Migrate smtp provider to 'common.compat' (#57105)
Convert all airflow distributions to be compliant with ASF requirements (#58138)
Migrate smtp provider to 'common.compat' (#57105)
Nothing published for this version
Fix retrieval of deprecated non-config values
CeleryExecutor (#23690)dag-processor fetch metadata database config (#23575)reschedule to the serialized fields for the BaseSensorOperator (#23674)execution_timeout as timedelta (#23655)send_callback method for CeleryKubernetesExecutor and LocalKubernetesExecutor (#23617)PythonVirtualenvOperator templated_fields (#23559)root_dag_id too (#23536)KubernetesJobWatcher getting stuck on resource too old (#23521)moved table exists (#23491)core__sql_alchemy_conn__cmd (#23441)airflow dags show for mapped operator (#23339)ti.mark_success_url (#23330)<Time /> in Mapped Instance table (#23313)dag_processing.processor_timeouts to counters section (#23393)expand() and partial() (#23373)Release Date: 2025-09-28
Fix import for SMTP provider (#56053)
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-09-22
Add Async support for SMTP Notifier (#55308)
Nothing published for this version
Fix Unexpected commit error in schedulerjob
Swagger2Specification._set_defaults classmethod (#19065)None (#19112)catchup=False behaviour (#19130, #19145)max_active_runs (#18897)ds, ts, etc. back to use logical date (#19088)None (#19034)backfill command before loading DAGs if missing args (#18994)task_fail violating NOT NULL (#18979)SchedulerJob._process_executor_events (#18975)XCom.delete error in Airflow 2.2.0 (#18956)Release Date: 2025-09-09
Fix SMTP email template when mark_success_url is undefined for RuntimeTaskInstance objects (#54680)
Make term Dag consistent in providers docs (#55101)
Fix SMTP email template when mark_success_url is undefined for RuntimeTaskInstance objects (#54680)
Make term Dag consistent in providers docs (#55101)
Nothing published for this version
Add deprecation notice for SubDagOperator
cwd for BashOperator (#17751)RESTARTING state (#16681)insert_args for support transfer replace (#15825)default_args for TaskGroup (#16557)kinit options [-f|-F] and [-a|-A] (#17816)DaskExecutor using Dask Worker Resources (#16829, #18720)processor_poll_interval to scheduler_idle_sleep_time (#18704)dagrun_conf (#18655)TaskInstanceModelView (#18438)Variable.update method and improving detection of variable key collisions (#18159)TaskInstance and TaskReschedule PK from execution_date to run_id (#17719)TaskGroup support in BaseOperator.chain() (#17456)template_ext attribute to show it in UI (#17985)robots.txt and X-Robots-Tag header (#17946)BranchDayOfWeekOperator, DayOfWeekSensor (#17940)none_failed_or_skipped by none_failed_min_one_success trigger rule (#17683)[core] store_dag_code & use DB to get Dag Code (#16342)task_concurrency to max_active_tis_per_dag (#17708)execution_date with run_id in airflow tasks run command (#16666)worker_log_server_port option to the logging section (#17621)SubDagOperator (#17488)template_fields_renderers (#17321)airflow celery stop to accept the pid file. (#17278)airflow_local_settings (#17195)AirflowException str when BashOperator fails. (#17151)SQLite or SequentialExecutor (#17133)init_containers defined in pod_override (#17537)airflow db init/upgrade migrations and setup in parallel. (#17078)chain() and cross_downstream() to support XComArgs (#16732)serve-logs and LocalExecutor (#16644)test_cycle to check_cycle (#16617)LocalExecutor (#16623)DbApiHook instance attribute (#16521, #17423)dag.sub_dag with dag.partial_subset (#16179)AirflowSensorTimeout as immediate failure without retrying (#12058)action_clear view (#15980)[core] dag_concurrency) settings for easier understanding (#16267, #18730)SKIPPED should not be logged again as SUCCESS (#14822)start_date for cleared tasks (#18708)AirflowDateTimePickerWidget a required field (#18602)retry_exponential_backoff divide by zero error when retry delay is zero (#17003){{ task.x }} attributes from within templates (#18516)sys.path (#18384)dag_tag rows that are now unused (#8231)wait_for_downstream dep (#18338)run_finished_callback for Debug Executor (#17983)XCom.get_one return full, not abbreviated values (#18274)XCom.set (#18240)_check_for_stalled_adopted_tasks method (#18208)StandardTaskRunner (#17967)self._error_file (#15947)DateTimeSensor (#17959)traceback.html (#17942)DagRunState enum query for MySQLdb driver (#17886)utf8mb3_general_ci collation for MySQL (#17729)TaskInstance does not work #17535 (#17548)DAG.cli() (#17105)None comparison in model_list template (#16893)cached_property module (#16710)Decimal (#16383)dag_id and empty subdir (#16513)dag.fileloc when using the @dag decorator (#16384)airflow/www/views.py (#15940)reschedule state (#17305, #18806)dagbag_size documentation (#18824)search_path set up instructions (#17600)AIRFLOW_GID from Docker images (#18747)sla_miss_callback section to the documentation (#18305)closer.lua script for downloading sources (#18179)DAG.is_active read-only in API (#17667)XCom.clear for data lifecycle management (#17589)pod_template_file (#16861)Jed and TP (#16671)flask-ouathlib to flask-oauthlib in Upgrading docs (#16320)Elasticsearch (#16275)dag_concurrency (#16177)default_pool slots (#15997)KubernetesExecutor git-sync pod template file (#15904)render_template_as_native_obj (#16534)POST to PATCH (#16511)BranchPythonOperator (#18623)boto3 to <1.19 (#18389)airflow.security.kerberos module (#18258)range(len()) to enumerate (#18174)main builds (#18035)tenacity (#17593)numpy dependency (#17594)mysql-connector-python to latest version (#17596)pandas an optional core dependency (#17575)airflow/utils/db.py (#17090)click to 8.x (#16779)dag.clear method (#16086)DAG_ACTIONS constant (#16232)_get_all_non_dag_permissions method (#16317)docutils to <0.17 until breaking behaviour is fixed (#16133)TaskInstance.log_filepath attribute (#15217)airflow/www/app.py (#15956)plyvel to google provider extra (#15812)find_permission_view_menu for get_permission wrapper (#16377)fab_logging_level to WARNING (#18783)CeleryKubernetesExecutor (#18441)Release Date: 2025-08-11
Add OAuth 2 / XOAUTH2 support via 'auth_type' & token/credential extras (#53554)
Add OAuth 2 / XOAUTH2 support via 'auth_type' & token/credential extras (#53554)
Nothing published for this version
Only allow the webserver to request from the worker log server
CeleryKubernetesExecutor (#16700)token (#16474)LocalTaskJob (#16852)Release Date: 2025-08-02
Fix: enter SmtpHook before trying to read properties (#53418)
Add Python 3.13 support for Airflow. (#46891)
Cleanup type ignores in smtp provider where possible (#53260)
Remove type ignore across codebase after mypy upgrade (#53243)
Remove upper-binding for "python-requires" (#52980)
Temporarily switch to use >=,< pattern instead of '~=' (#52967)
Moving BaseHook usages to version_compat for smtp (#52950)
Fix: enter SmtpHook before trying to read properties (#53418)
Add Python 3.13 support for Airflow. (#46891)
Cleanup type ignores in smtp provider where possible (#53260)
Remove type ignore across codebase after mypy upgrade (#53243)
Remove upper-binding for "python-requires" (#52980)
Temporarily switch to use >=,< pattern instead of '~=' (#52967)
Moving BaseHook usages to version_compat for smtp (#52950)
Nothing published for this version
Fix normalize-url vulnerability
PyPI (#16594)dag_run.conf is a dict (#15057)only_active parameter to /dags endpoint (#14306)filebeat 7 (#14625)passphrase and private_key to default sensitive field names (#16392)airflow task run without --local/--raw for KubeExecutor (#16108)log.exception when there is no exception (#16047)/ (#16018)Release Date: 2025-07-06
Move 'BaseHook' implementation to task SDK (#51873)
Provider Migration: Replace 'models.BaseOperator' to Task SDK for 'smtp' (#52596)
Drop support for Python 3.9 (#52072)
Move 'BaseHook' implementation to task SDK (#51873)
Provider Migration: Replace 'models.BaseOperator' to Task SDK for 'smtp' (#52596)
Drop support for Python 3.9 (#52072)
Nothing published for this version
This release of provider is only available for Airflow 2.10+ as explained in the Apache Airflow providers support policy < https://github.com/apache/a
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 >_.
Remove AIRFLOW_2_10_PLUS conditions (#49877)
Bump min Airflow version in providers to 2.10 (#49843)
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>_.
Remove AIRFLOW_2_10_PLUS conditions (#49877)
Bump min Airflow version in providers to 2.10 (#49843)
Bump stylelint to remove vulnerable sub-dependency
New Features """"""""""""
PythonVirtualenvDecorator to Taskflow API (#14761)Taskgroup decorator (#15034)SubprocessHook for running commands from operators (#13423)WeekDayBranchOperator (#13997)worker_pod_pending_timeout support (#15263)template_fields_renderers additions (#15130)AirflowSkipException on exit code 99 (by default, configurable) (#13421) (#14963)airflow jobs check CLI command to check health of jobs (Scheduler etc) (#14519)DateTimeBranchOperator to BranchDateTimeOperator (#14720)Improvements """"""""""""
DbApiHook (#15581)apply_default to subclasses of BaseOperator (#15667)KubernetesExecutor pod templates to allow access to IAM permissions (#15669)airflow db check-migrations (#15662)secret_key when Webserver > 1 (#15546)JSONFormatter (#15414)on_failure_callback when SIGTERM is received (#15172)worker_refresh_interval to 6000 seconds (#14970)[celery] default_queue config to [operators] default_queue to re-use between executors (#14699)Bug Fixes """""""""
updateTaskInstancesState API endpoint when dry_run not passed (#15889)drawDagStatsForDag in dags.html (#13884)NotPreviouslySkippedDep (#13933)KubernetesExecutor (#14795)KubernetesPodOperator (#15388)dag.partial_subset (#13700) (#15308)pod_id for KubernetesPodOperator (#15445)pod_id ends with hyphen in KubernetesPodOperator (#15443)pool_slots > 1 (#15426)sync-perm to work correctly when update_fab_perms = False (#14847)GCSObjectsWtihPrefixExistenceSensor (#14179)CeleryKubernetesExecutor bug (#13247)StackdriverTaskHandler (#13784)func.sum may return Decimal that break rest APIs (#15585)AlreadyExists exception when the execution_date is same (#15174)sync_metadata inside DagFileProcessorManager (#15121)docker-py update to resolve docker op issues (#15731)user_id from API schema (#15117)airflow info work with pipes (#14528)CollectionInfo in all Collections that have total_entries (#14366)task_instance_mutation_hook when importing airflow.models.dagrun (#15851)Doc only changes """"""""""""""""
markdownlint and yamllint config files (#15682)git_sync_template.yaml (#13197)Misc/Internal """""""""""""
logging.exception redundancy (#14823)stylelint to remove vulnerable sub-dependency (#15784)ssri from 6.0.1 to 6.0.2 in /airflow/www (#15437)datepicker for task instance detail view (#15284)tableau extra (#13595)cached_property on Python 3.8 where possible (#14606)flynt. (#13732)jquery ready instead of vanilla js (#15258)Webpack entries (#14551)- remove superfluous else block
Release Date: 2025-04-19
remove superfluous else block (#49199)
Nothing published for this version
Remove extra/needless deprecation warnings from airflow.contrib module
TypeError when Serializing & sorting iterable properties of DAGs (#15395)on_load trigger for folder-based plugins (#15208)kubernetes cleanup-pods subcommand will only clean up Airflow-created Pods (#15204)pod_template_file in KubernetesExecutor (#15197)executor_config breaks Graph View in UI (#15199)dagrun.schedule_delay metric (#15105)executor_config is passed (#14323)Lax for cookie_samesite when empty string is passed (#14183)dag.cli() KeyError (#13647)[kubernetes] enable_tcp_keepalive for new installs to True (#15338)libyaml C library when available. (#14577)airflow dags show command display TaskGroups (#14269)extra connection field. (#12944)Nothing published for this version
Fix Deprecation for configuration.getsection
sql_alchemy_conn_secret (#13260)DROP CONSTRAINT in MySQL during airflow db upgrade (#13239)sync-perm (#13377)datatables.net from 1.10.21 to 1.10.22 in /airflow/www (#13143)datatables.net JS to 1.10.23 (#13253)dompurify from 2.0.12 to 2.2.6 in /airflow/www (#13164)cattrs version (#13223)python-daemon limit for python 3.8+ to fix daemon crash (#13540)worker_concurrency to 16 (#13612)dag_id is None (#13619)continue_token for cleanup list pods (#13563)max_tis_per_query to 0 now correctly removes the limit (#13512)BaseBranchOperator will push to xcom by default (#13704) (#13763)configuration.getsection (#13804)Website.can_read access to default roles. (#13923)FileTaskHandler (#14001)v1/config endpoint respect webserver expose_config setting (#14020)min_file_process_interval to decrease CPU Usage (#13664)os.fork & CeleryExecutor (#13265)example_kubernetes_executor example dag (#13216)flask-swagger, funcsigs (#13178)queued_by_job_id & external_executor_id Columns to TI View (#13266)json-merge-patch an optional library and unpin it (#13175)setup.py to better reflect changes in providers (#13314)pyjwt and Add integration tests for Apache Pinot (#13195)setup.cfg (#13409)__eq__ methods in models Dag and BaseOperator (#13449)contextdecorator (#13455)mysql-connector-python to allow 8.0.22 (#13370)NotFound response for DELETE methods in OpenAPI YAML (#13550)[core] lazy_load_plugins is False (#13578)colorlog dependency (#13176)python3-openid dependency (#13714)__repr__ for Executors (#13753)conn_type is missing (#13778)get_connnection REST endpoint (#13885)airflow_local_settings.py to fix an error message (#13927)TriggerDagRunOperator (#13964)start_date (REST API) (#13959)OperationalError (#14032)rbac UI (#13569)Nothing published for this version
We’ve tried to make as few breaking changes as possible and to provide deprecation path in the code, especially in the case of anything called in the…
The full changelog is about 3,000 lines long (already excluding everything backported to 1.10), so for now I’ll simply share some of the major features in 2.0.0 compared to 1.10.14:
(Known in 2.0.0alphas as Functional DAGs.)
DAGs are now much much nicer to author especially when using PythonOperator. Dependencies are handled more clearly and XCom is nicer to use
A quick teaser of what DAGs can now look like:
from airflow.decorators import dag, task
from airflow.utils.dates import days_ago
@dag(default_args={'owner': 'airflow'}, schedule_interval=None, start_date=days_ago(2))
def tutorial_taskflow_api_etl():
@task
def extract():
return {"1001": 301.27, "1002": 433.21, "1003": 502.22}
@task
def transform(order_data_dict: dict) -> dict:
total_order_value = 0
for value in order_data_dict.values():
total_order_value += value
return {"total_order_value": total_order_value}
@task()
def load(total_order_value: float):
print("Total order value is: %.2f" % total_order_value)
order_data = extract()
order_summary = transform(order_data)
load(order_summary["total_order_value"])
tutorial_etl_dag = tutorial_taskflow_api_etl()
We now have a fully supported, no-longer-experimental API with a comprehensive OpenAPI specification
Read more here:
REST API Documentation.
As part of AIP-15 (Scheduler HA+performance) and other work Kamil did, we significantly improved the performance of the Airflow Scheduler. It now starts tasks much, MUCH quicker.
Over at Astronomer.io we’ve benchmarked the scheduler—it’s fast (we had to triple check the numbers as we don’t quite believe them at first!)
It’s now possible and supported to run more than a single scheduler instance. This is super useful for both resiliency (in case a scheduler goes down) and scheduling performance.
To fully use this feature you need Postgres 9.6+ or MySQL 8+ (MySQL 5, and MariaDB won’t work with more than one scheduler I’m afraid).
There’s no config or other set up required to run more than one scheduler—just start up a scheduler somewhere else (ensuring it has access to the DAG files) and it will cooperate with your existing schedulers through the database.
For more information, read the Scheduler HA documentation.
SubDAGs were commonly used for grouping tasks in the UI, but they had many drawbacks in their execution behaviour (primarirly that they only executed a single task in parallel!) To improve this experience, we’ve introduced “Task Groups”: a method for organizing tasks which provides the same grouping behaviour as a subdag without any of the execution-time drawbacks.
SubDAGs will still work for now, but we think that any previous use of SubDAGs can now be replaced with task groups. If you find an example where this isn’t the case, please let us know by opening an issue on GitHub
For more information, check out the Task Group documentation.
We’ve given the Airflow UI a visual refresh and updated some of the styling. Check out the UI section of the docs for screenshots.
We have also added an option to auto-refresh task states in Graph View so you no longer need to continuously press the refresh button :).
If you make heavy use of sensors in your Airflow cluster, you might find that sensor execution takes up a significant proportion of your cluster even with “reschedule” mode. To improve this, we’ve added a new mode called “Smart Sensors”.
This feature is in “early-access”: it’s been well-tested by AirBnB and is “stable”/usable, but we reserve the right to make backwards-incompatible changes to it in a future release (if we have to. We’ll try very hard not to!)
For Airflow 2.0, we have re-architected the KubernetesExecutor in a fashion that is simultaneously faster, easier to understand, and more flexible for Airflow users. Users will now be able to access the full Kubernetes API to create a .yaml pod_template_file instead of specifying parameters in their airflow.cfg.
We have also replaced the executor_config dictionary with the pod_override parameter, which takes a Kubernetes V1Pod object for a 1:1 setting override. These changes have removed over three thousand lines of code from the KubernetesExecutor, which makes it run faster and creates fewer potential errors.
Airflow 2.0 is not a monolithic “one to rule them all” package. We’ve split Airflow into core and 61 (for now) provider packages. Each provider package is for either a particular external service (Google, Amazon, Microsoft, Snowflake), a database (Postgres, MySQL), or a protocol (HTTP/FTP). Now you can create a custom Airflow installation from “building” blocks and choose only what you need, plus add whatever other requirements you might have. Some of the common providers are installed automatically (ftp, http, imap, sqlite) as they are commonly used. Other providers are automatically installed when you choose appropriate extras when installing Airflow.
The provider architecture should make it much easier to get a fully customized, yet consistent runtime with the right set of Python dependencies.
But that’s not all: you can write your own custom providers and add things like custom connection types, customizations of the Connection Forms, and extra links to your operators in a manageable way. You can build your own provider and install it as a Python package and have your customizations visible right in the Airflow UI.
Security
As part of Airflow 2.0 effort, there has been a conscious focus on Security and reducing areas of exposure. This is represented across different functional areas in different forms. For example, in the new REST API, all operations now require authorization. Similarly, in the configuration settings, the Fernet key is now required to be specified.
Configuration in the form of the airflow.cfg file has been rationalized further in distinct sections, specifically around “core”. Additionally, a significant amount of configuration options have been deprecated or moved to individual component-specific configuration files, such as the pod-template-file for Kubernetes execution-related configuration.
We’ve tried to make as few breaking changes as possible and to provide deprecation path in the code, especially in the case of anything called in the DAG. That said, please read through UPDATING.md to check what might affect you. For example: We re-organized the layout of operators (they now all live under airflow.providers.*) but the old names should continue to work - you’ll just notice a lot of DeprecationWarnings that need to be fixed up.
Release Date: 2025-02-26
Warning
The argument from_email is now an optional kwarg in SmtpNotifier , and the argument to became the first positional argument.
Configuring the SmtpNotifier and SmtpHook default values via Airflow SMTP configurations is not supported anymore. You can instead use the SMTP connection configuration to set the default values, where you can use:
the connection extra field ssl_context instead of the configuration smtp_provider.ssl_context or email.ssl_context in the SMTP hook.
the connection extra field from_email instead of the configuration smtp.smtp_mail_from in SmtpNotifier .
the connection extra field subject_template instead of the configuration smtp.templated_email_subject_path in SmtpNotifier .
the connection extra field html_content_template instead of the configuration smtp.templated_html_content_path in SmtpNotifier .
Replace Airflow email config by connection extras in SMTP provider (#46219)
feat(smtp): support html_content and subject templates from SMTP connection (#46212)
AIP-72: Support better type-hinting for Context dict in SDK (#45583)
Warning
The argument from_email is now an optional kwarg in SmtpNotifier, and the argument to became the first positional argument.
Configuring the SmtpNotifier and SmtpHook default values via Airflow SMTP configurations is not supported anymore. You can instead use the SMTP connection configuration to set the default values, where you can use:
the connection extra field ssl_context instead of the configuration smtp_provider.ssl_context or email.ssl_context in the SMTP hook.
the connection extra field from_email instead of the configuration smtp.smtp_mail_from in SmtpNotifier.
the connection extra field subject_template instead of the configuration smtp.templated_email_subject_path in SmtpNotifier.
the connection extra field html_content_template instead of the configuration smtp.templated_html_content_path in SmtpNotifier.
Replace Airflow email config by connection extras in SMTP provider (#46219)
feat(smtp): support html_content and subject templates from SMTP connection (#46212)
AIP-72: Support better type-hinting for Context dict in SDK (#45583)
Nothing published for this version
This release of provider is only available for Airflow 2.9+ as explained in the Apache Airflow providers support policy .
Release Date: 2024-12-26
Note
This release of provider is only available for Airflow 2.9+ as explained in the Apache Airflow providers support policy .
Bump minimum Airflow version in providers to Airflow 2.9.0 (#44956)
Note
This release of provider is only available for Airflow 2.9+ as explained in the Apache Airflow providers support policy.
Bump minimum Airflow version in providers to Airflow 2.9.0 (#44956)
Nothing published for this version
Nothing published for this version
- Move bash operator to Standard provider
Release Date: 2024-11-18
Move bash operator to Standard provider (#42252)
Purge existing SLA implementation (#42285)
Unify DAG schedule args and change default to None (#41453)
Move bash operator to Standard provider (#42252)
Purge existing SLA implementation (#42285)
Unify DAG schedule args and change default to None (#41453)
Nothing published for this version
This release of provider is only available for Airflow 2.8+ as explained in the Apache Airflow providers support policy .
Release Date: 2024-08-22
Note
This release of provider is only available for Airflow 2.8+ as explained in the Apache Airflow providers support policy .
Bump minimum Airflow version in providers to Airflow 2.8.0 (#41396)
Note
This release of provider is only available for Airflow 2.8+ as explained in the Apache Airflow providers support policy.
Bump minimum Airflow version in providers to Airflow 2.8.0 (#41396)
Nothing published for this version
- Faster 'airflow_version' imports
Release Date: 2024-05-30
Faster 'airflow_version' imports (#39552)
Simplify 'airflow_version' imports (#39497)
Faster 'airflow_version' imports (#39552)
Simplify 'airflow_version' imports (#39497)
Nothing published for this version
for the record, generated with: ~/node_modules/github-changes/bin/index.js -o airbnb -r airflow --only-pulls --use-commit-body --between-tags 1.6.2...
Raw changelog
for the record, generated with:
~/node_modules/github-changes/bin/index.js -o airbnb -r airflow --only-pulls --use-commit-body --between-tags 1.6.2...1.7.0rc1 --token {your_gh_token_here}
Session.remove after each run, to survive DB restart (@KMK-ONLINE)Release Date: 2024-05-06
Note
This release of provider is only available for Airflow 2.7+ as explained in the Apache Airflow providers support policy .
Bump minimum Airflow version in providers to Airflow 2.7.0 (#39240)
Note
This release of provider is only available for Airflow 2.7+ as explained in the Apache Airflow providers support policy.
Bump minimum Airflow version in providers to Airflow 2.7.0 (#39240)
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →