
from airflow.sdk import dag, task
from datetime import datetime
@dag(
start_date=datetime(2024, 1, 1),
schedule=[MY_JOB_ASSET]
)
def downstream_dag():
@task
def consume_data():
pass
consume_data()
downstream_dag()Why this migration matters
Beyond individual features, migrating to Airflow 3 felt less like an optional upgrade and more like a necessary step forward. Airflow 3 represents a clear architectural direction for the project: API-driven execution, better isolation, data-aware scheduling and a platform designed for modern scale.
While Airflow 2.x is still widely used, it is clearly moving toward long-term maintenance (end-of-life April 2026) with most innovation and architectural investment happening in the 3.x line. Delaying migration only widens the gap:
- More breaking changes accumulate
- Provider compatibility becomes harder to manage
- Teams miss out on improvements that simplify debugging and orchestration
For me, moving from 2.10.3 to 3.0.6 wasn’t just about staying current; it was about aligning with where Airflow is headed. Even with a few rough edges, Airflow 3 feels like the foundation the project needed for its next phase.

