//Licensed 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.
= Podling Press Kit
Apache Incubator PMC
2002-10-16
:jbake-type: guide
:jbake-status: published
:idprefix:
:toc:
:imagesdir: ../images/

== Apache Incubator Graphics

This page contains various graphical assets that Apache Incubator podlings and their communities can use.
The Apache Software Foundation owns all Apache-related trademarks, service marks, and graphic logos. Our link:http://www.apache.org/foundation/marks/[formal Trademark Policy] addresses allowable uses and how to contact us for permissions.

The Apache Incubator provides two main types of graphic:

- Incubator Graphics - the official Apache Incubator logo
- “Powered By” Apache Incubator Logos - to be used by Apache Incubator podlings

Please note that each Apache podling provides and maintains their own official project logo on their home page. The best place to ask for a copy of a project logo is on the podling's dev@ mailing list.

== Downloadable Graphics

This section contains downloadable graphics of the Apache Incubator logo.

REMINDER: all graphics/images/logos are trademarks of the ASF. You must not use them without appropriate attribution and permission from the ASF. See our formal Trademark Policy for more details. We are a vendor-neutral public charity that provides independent governance to all Apache projects, so you must use care when displaying the feather, and ensure it's clear that it's referring to the ASF as an independent organization.

=== Official Incubator Logo

This is the latest version of the Apache Incubator logo, as launched in March 2017. Use this logo on ALL podling website pages during the incubation process.

image:/images/incubator_feather_egg_logo.png[]

link:/images/SVG/apache_incubator.svg[SVG] | link:/images/PDF/apache_incubator.pdf[PDF] | link:/images/EPS/apache_incubator_RGB.eps[EPS - RGB] | link:/images/EPS/apache_incubator_CMYK.eps[EPS - CMYK]

=== Red-On-White Version of Logo

The red-on-white version of the Apache Incubator Logo is

image:/images/incubator_feather_egg_logo_red_crop.png[]

link:/images/SVG/apache_incubator_red.svg[SVG] | link:/images/PDF/apache_incubator_red.pdf[PDF] | link:/images/EPS/apache_incubator_red_RGB.eps[EPS - RGB] | link:/images/EPS/apache_incubator_red_CMYK.eps[EPS - CMYK]

=== Black-On-White Version of Logo

The black-on-white version of the Apache Incubator Logo is

image:/images/incubator_feather_egg_logo_wb_crop.png[]

link:/images/SVG/apache_incubator_black.svg[SVG] | link:/images/PDF/apache_incubator_black.pdf[PDF] | link:/images/EPS/apache_incubator_black_RGB.eps[EPS - RGB] | link:/images/EPS/apache_incubator_black_CMYK.eps[EPS - CMYK]

=== White-On-Black Version of Logo

The white-on-black version of the Apache Incubator Logo is

image:/images/incubator_feather_egg_logo_bw_crop.png[]

link:/images/SVG/apache_incubator_white.svg[SVG] | link:/images/PDF/apache_incubator_white.pdf[PDF] | link:/images/EPS/apache_incubator_white_RGB.eps[EPS - RGB] | link:/images/EPS/apache_incubator_white_CMYK.eps[EPS - CMYK]

== "Powered By" Apache Incubator Podling Logos

Inspired by the ASF’s “Powered by Apache” logo [LINK], the “Apache Incubator Podling” logo helps maintain the unique identity of each Apache podling while it undergoes development in the Apache Incubator. We encourage all Apache podlings and their communities to proudly display “Apache Incubator Podling” assets on their websites, documentation, marketing materials, etc.

Guidelines for the appropriate use of the “Powered By Apache” logos include:

- You may use the standalone “Powered By” Apache Incubator and “Apache Incubator Podling” circular banded logos standalone, with just the Apache Incubator logomark (denoting general use of an Apache Incubator podling), or in combination with an official Apache podling logo.
- You may not alter the official podling logo in any way other than removing/separating the name(s) where applicable, as approved by the associated Podling Project Management Committee (PPMC).
- You must associate the appropriate trademark symbol(s), such as ® or ™, with the podling's logo, if applicable.
- You must not alter the “Powered By” logo's circular band format, font, or color in any way.
- You must not rotate, animate, distorte, or otherwise alter the logo and/or its contents, nor use it as a graphic element, background, or pattern.
- You must not translate or localize the logo and/or its contents, nor add versioning numbers or other unauthorized words to it.
- The preferred background color for the logo is white; however, the logo may appear on colored, black, or image/photographic backgrounds providing this does not compromise the logo's legibility.
- You may resizeb the logo and produced it in multiple file formats as required by the Podling Project Management Committee, with a preferred minimum size of 80 pixels high in web/online applications (where possible) to ensure legibility.
- You may not under any circumstances, incorporate the logo with a third party's company name, product name, or logo(s), or adopt marks and/or logos that are confusingly similar to or imply improper association with The Apache Software Foundation.
- Third parties and programs may not use official Apache project or podling logos and/or create alternate logos or identifying marks relating to any Apache project, without written permission from the associated Podling Project Management Committee and/or ASF Brand Management.

We have a link:https://www.apache.org/foundation/marks/faq/#poweredby[trademark use policy for the "Powered By" phrase].

In addition, official Apache Project pages and documentation on apache.org must use the appropriate trademark symbols on the respective Project logo, along with the following footnote: "Apache, Apache [PODLING NAME], and the Apache [PODLING NAME] logo are registered trademarks or trademarks of The Apache Software Foundation in the U.S. and/or other countries."

=== Template and Usage

==== Standalone "Powered By" Apache Incubator Logo
image:/images/incubator_ring_logo.png[height=200]

==== Per-Project Powered By Logos

Logos for individual podlings, such as the ones below, are available in jpg, psd, and eps format. You can retrieve them by requesting:

image:/images/incubator_power_ring.jpg[height=200]
image:/images/incubator_ring_airflow.jpg[height=200]

For example, you can create the “Apache Incubator Podling” logo for Apache Airflow by retrieving the Airflow logo from link:http://airflow.incubator.apache.org/_images/pin_large.png[http://airflow.incubator.apache.org/_images/pin_large.png].
If you are unable to find the logo you are looking for, contact the podling’s mailing list.

==== Template For the Creation of Powered By Logos
image:/images/template_airflow.jpg[height=200]
image:/images/template_hawq.jpg[height=200]
image:/images/template_spot.jpg[height=200]

