..  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 incubation program in March 2016.


Committers
----------

- @mistercrunch (Maxime "Max" Beauchemin)
- @r39132 (Siddharth "Sid" Anand)
- @criccomini (Chris Riccomini)
- @bolkedebruin (Bolke de Bruin)
- @artwr (Arthur Wiedmer)
- @jlowin (Jeremiah Lowin)
- @patrickleotardif (Patrick Leo Tardif)
- @aoen (Dan Davydov)
- @syvineckruyk (Steven Yvinec-Kruyk)
- @msumit (Sumit Maheshwari)
- @alexvanboxel (Alex Van Boxel)
- @saguziel (Alex Guziel)
- @joygao (Joy Gao)
- @fokko (Fokko Driesprong)
- @ash (Ash Berlin-Taylor)
- @kaxilnaik (Kaxil Naik)

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


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

* `Airflow's official documentation <http://airflow.apache.org/>`_
* Mailing list (send emails to
  ``dev-subscribe@airflow.incubator.apache.org`` and/or
  ``commits-subscribe@airflow.incubator.apache.org``
  to subscribe to each)
* `Issues on Apache's Jira <https://issues.apache.org/jira/browse/AIRFLOW>`_
* `Gitter (chat) Channel <https://gitter.im/airbnb/airflow>`_
* `More resources and links to Airflow related content on the Wiki <https://cwiki.apache.org/confluence/display/AIRFLOW/Airflow+Links>`_



Roadmap
-------

Please refer to the Roadmap on `the wiki <https://cwiki.apache.org/confluence/display/AIRFLOW/Airflow+Home>`_
