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



Privacy Notice
==============

Website Usage Privacy Policy
----------------------------

Information about your use of this website is collected using server access logs and a tracking cookie. The collected information consists of the following:

- The type of browser and operating system you use to access our site;
- The date and time you access our site;
- The pages you visit; and
- The addresses of pages from where you followed a link to our site.

Part of this information is gathered using a tracking cookie set by the Google Analytics service and handled by Google as described in their privacy policy. See your browser documentation for instructions on how to disable the cookie if you prefer not to share this data with Google.

We use the gathered information to help us make our site more useful to visitors and to better understand how and when our site is used. We do not track or collect personally identifiable information or associate gathered data with any personally identifying information from other sources.

By using this website, you consent to the collection of this data in the manner and for the purpose described above.

Privacy FAQ
-----------

**What is Google Analytics?**

Google Analytics is a simple, easy-to-use tool that helps website owners measure how users interact with website content. As a user navigates between web pages, Google Analytics provides website owners JavaScript tags (libraries) to record information about the page a user has seen, for example the URL of the page. The Google Analytics JavaScript libraries use HTTP Cookies to "remember" what a user has done on previous pages / interactions with the website. It makes it easy for website owners to understand how their site and app users are engaging with the content, e.g: which documentation page is mostly viewed and valuable.

**Why do we use GA?**

We use GA solely to gather the information that helps to make the site more useful to visitors and contributors, as well as to better understand how and when our site is used. We DO NOT track or collect personally identifiable information or associate gathered data with any personally identifying information from other sources.

**What information is being collected?**

GA provides us with information on the following 3 categories:

- Audience reports: includes information about active users (interactions with the site in the last 1, 7, 14, or 30 days), where users come from (geographical location) and what language they speak (language of the bowser), as well as the insight on the percentages of new and returning visitors.
- Acquisition reports: includes information about how users are finding the website with detailed understanding of traffic and bounce rate. Website owners are able to see their main traffic categories, such as organic search, referral and direct, as well as the information about how many pages users view and how much time they spend on the website.
- Behaviour reports: includes information on granulated metrics such as the average time a user spends on a webpage, total number of pageviews and the site’s  bounce rate, site’s most visited pages, and the most popular pages through which a user enters and exits your site (landing pages and exit pages), as well as insight on how quickly the website loads.

Information collected has to do with your browser, time spent on each page, pages visited, and location (down to a granularity of city, not further). We do not track or collect personally identifiable information or associate gathered data with any personally identifying information from other sources.

**Who has access to the data?**

Project Management Committee (PMC) of the project, in this case Apache Airflow, has access to the data. However, if any of the committers have a strong case that requires the access, they can send an email to the private@ requesting the permission to have access for a limited period of time, and PMC has the right to decide whether to grant the access or not.

**Resources**

- `Google Analytics Cookie Usage <https://developers.google.com/analytics/devguides/collection/analyticsjs/cookie-usage>`__
- `Google - Safeguarding your data <https://support.google.com/analytics/answer/6004245>`__
- `ASF Privacy Policy <https://www.apache.org/foundation/policies/privacy.html>`__
