 .. 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.



Project
=======

History
-------

Airflow was started in October 2014 by Maxime Beauchemin at Airbnb.
It was open source from the very first commit and officially brought under
the Airbnb GitHub and announced in June 2015.

The project joined the Apache Software Foundation's Incubator program in March 2016 and the
Foundation `announced Apache Airflow as a Top-Level Project
<https://blogs.apache.org/foundation/entry/the-apache-software-foundation-announces44>`_
in January 2019.


Committers
----------

- Aizhamal Nurmamat kyzy (@aijamalnk)
- Alex Guziel (@saguziel)
- Alex Van Boxel (@alexvanboxel)
- Aneesh Joseph (@aneesh-joseph)
- Arthur Wiedmer (@artwr)
- Ash Berlin-Taylor (@ashb)
- Bas Harenslak (@basph)
- Bolke de Bruin (@bolkedebruin)
- Brent Bovenzi (@bbovenzi)
- Chao-Han Tsai (@milton0825)
- Chris Riccomini (@criccomini)
- Dan Davydov (@aoen)
- Daniel Imberman (@dimberman)
- Daniel Standish (@dstandish)
- Elad Kalif (@eladkal)
- Ephraim Anierobi (@ephraimbuddy)
- Felix Uellendall (@feluelle)
- Fokko Driesprong (@fokko)
- Hitesh Shah (@hiteshs)
- Jakob Homan (@jghoman)
- James Timmins (@jhtimmins)
- Jarek Potiuk (@potiuk)
- Jed Cunningham (@jedcunningham)
- Jiajie Zhong (@zhongjiajie)
- Joshua Carp (@jmcarp)
- Joy Gao (@joygao)
- Kamil Breguła (@mik-laj)
- Kaxil Naik (@kaxil)
- Kengo Seki (@sekikn)
- Kevin Yang (@KevinYang21)
- Leah Cole (@leahecole)
- Maxime "Max" Beauchemin (@mistercrunch)
- Qian Yu (@yuqian90)
- Qingping Hou (@houqp)
- Ry Walker (@ryw)
- Ryan Hamilton (@ryanahamilton)
- Siddharth "Sid" Anand (@r39132)
- Sumit Maheshwari (@msumit)
- Tao Feng (@feng-tao)
- Tomasz Urbaszek (@turbaszek)
- Tzu-ping Chung (@uranusjr)
- Vikram Koka (@vikramkoka)
- Xiaodong Deng (@XD-DENG)
- Xinbin Huang (@xinbinhuang)

For the full list of contributors, take a look at `Airflow's GitHub
Contributor page:
<https://github.com/apache/airflow/graphs/contributors>`_


Resources & links
-----------------

* `Airflow's official documentation <https://airflow.apache.org/docs/>`_
* Mailing lists:

  * Developer's mailing list: dev-subscribe@airflow.apache.org
  * All commits mailing list: commits-subscribe@airflow.apache.org
  * Airflow users mailing list: users-subscribe@airflow.apache.org

* `Issues on GitHub <https://github.com/apache/airflow/issues>`_
* `Slack (chat) Channel <https://s.apache.org/airflow-slack>`_
* `Airflow Improvement Proposals <https://cwiki.apache.org/confluence/display/AIRFLOW/Airflow+Improvements+Proposals>`_
