Skip to content

Instantly share code, notes, and snippets.

@franzwong
Created April 12, 2026 05:02
Show Gist options
  • Select an option

  • Save franzwong/b56b21317c7a2e29f6f6440836f11cd4 to your computer and use it in GitHub Desktop.

Select an option

Save franzwong/b56b21317c7a2e29f6f6440836f11cd4 to your computer and use it in GitHub Desktop.
Set up Airflow 3 standalone mode

Install Airflow

export AIRFLOW_HOME=$(pwd)/airflow
mkdir -p ${AIRFLOW_HOME}
mkdir -p ${AIRFLOW_HOME}/dags

cat << EOF > requirements.txt
--constraint https://raw.githubusercontent.com/apache/airflow/constraints-3.2.0/constraints-3.13.txt
apache-airflow==3.2.0
graphviz==0.21
EOF

echo "3.13" > .python-version

python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

Initialize Airflow

airflow db migrate

Disable loading examples

sed -i 's/load_examples = True/load_examples = False/g' ${AIRFLOW_HOME}/airflow.cfg

Start Airflow

airflow standalone

Add dag

Create a file my_example_dag.py in ${AIRFLOW_HOME}/dags with following content.

from airflow.sdk import DAG
from airflow.providers.standard.operators.python import PythonOperator

from datetime import datetime


def greeting():
    print("Hello world!")

with DAG(
    "my_example_dag",
    start_date=datetime(2000, 1, 1),
    schedule="*/1 * * * *",
    catchup=False
) as dag:
    task = PythonOperator(
        task_id="greet_task",
        python_callable=greeting
    )

Check whether dag is loaded

(By default, Airflow looks for new DAG every 5 minutes.)

airflow dags list

Enable dag

airflow dags unpaused my_example_dag

Check dag status

Login to web console (htttp://localhost:8080). Default user name and password are stored in ${AIRFLOW_HOME}/simple_auth_manager_passwords.json.generated.

Clean up

rm -rf airflow
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment