Skip to content

dagshift

Upgrade Apache Airflow DAGs to any newer version, right inside VS Code.

2.x → 2.y  ·  2 → 3  ·  3.x → 3.y  ·  a diff before anything is written

Install from the Marketplace Get started

dagshift in VS Code: findings, status bar and a diff

What it does

  • Finds the version you run today


    Reads requirements, constraints URLs, Dockerfiles, compose, Helm, Cloud Composer image_version, MWAA and Astro Runtime. Infrastructure in a separate Terraform repository? Point at it.

    Current and target version

  • Upgrades to the version you pick


    Any target from 2.7 to 3.3. Each target has its own rule set, measured on a real install of that Airflow release.

    Rules

  • Fixes what is safe to fix


    Import paths, days_ago, schedule_interval, removed context variables, Datasets to Assets, operator arguments, templates inside strings and YAML.

    Preview and upgrade

  • Explains the rest


    Metadata database access, SubDAGs, Flask plugins and cron semantics come with a concrete recipe instead of a guess.

    Review findings

  • Diff first, always


    Edit in place through VS Code's refactor preview, or write an upgraded copy next to the project and leave the originals untouched.

    Preview and upgrade

  • Proves the result loads


    Loads your DAG folder with Airflow's own DagBag in an environment you choose, and reports import errors and deprecation warnings.

    Validate on real Airflow

On real DAGs

The eight Cloud Composer DAGs in orchestration-reference, rendered and parsed with Airflow 3.3.1:

DAGs that load Import errors
Original 0 / 8 8
After ruff --select AIR3 --fix --unsafe-fixes 0 / 8 8, then 4 once days_ago is fixed by hand
After dagshift 8 / 8 0

More numbers, including Airflow's own example DAGs, are in How it works.

Works with every shape of Airflow project

Plain DAG files, TaskFlow, dynamic DAG generators, custom operators and plugins, Jinja-templated DAG factories, dag-factory and homegrown YAML/JSON pipelines, code generators that emit DAGs as strings, and the requirements, images and infrastructure files that pin Airflow.

Everything runs on your machine

The extension sends nothing anywhere. The only network access is a one-time pip install of the engine's single dependency (libcst) from your configured package index.