 .. Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

 ..   http://www.apache.org/licenses/LICENSE-2.0

 .. Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.


Setup and develop using GitHub Codespaces
#########################################

1. Goto |airflow_github| and fork the project.

   .. |airflow_github| raw:: html

     <a href="https://github.com/apache/airflow/" target="_blank">https://github.com/apache/airflow/</a>

   .. raw:: html

     <div align="center" style="padding-bottom:10px">
       <img src="images/quick_start/airflow_fork.png"
            alt="Forking Apache Airflow project">
     </div>

2. Follow `Codespaces Quickstart <https://docs.github.com/en/codespaces/getting-started/quickstart>`_ to start
   a new codespace.

3. Once the codespace starts your terminal should be already in ``Breeze`` environment and you should
   be able to edit and run the tests in VS Code interface.

4. You can use `Quick start quide for Visual Studio Code <CONTRIBUTORS_QUICK_START_VSCODE.rst>`_ for details
   as Codespaces use Visual Studio Code as interface.


Follow the `Quick start <CONTRIBUTORS_QUICK_START.rst>`_ for typical development tasks.
