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

Podlings are, by definition, not yet fully accepted as part of the
Apache Software Foundation. Therefore, they are subject to additional
branding constraints, on top of the
link:http://www.apache.org/foundation/marks/responsibility[branding guidelines for top-level projects]

== Publicity throughout the Incubation Process

There are three stages in a podling's life-cycle that have an impact
on the types of publicity seeking that are permitted.  We refer to
"publicity seeking" as issuing press releases or otherwise affirmatively
seeking publicity (seeding news stories, etc.).

*Podling is in proposal/or pre-code-drop process*: No publicity
seeking is permitted.  A podling is not allowed to be called Apache
_Podling-Name_ name until the podling is officially in
Incubation, public mailing lists are announced, and code has been
submitted into our repositories.

*Podling has been approved for incubation, podling has launched
public mailing lists, and podling has dropped code into
repository*: A podling *MUST* now be called Apache
_Podling-Name_ (see link:#Naming[Naming] below).
A podling and affiliated persons can issue press releases that
reference the podling, but cannot issue press releases with the
specific intent of announcing the Podling.  Podling can conduct
informal pr activities, such as media outreach, blog publicity, etc.
The ASF will not issue any press releases for any podling at this
stage.  However, the
link:http://www.apache.org/press/index.html#whoweare[Apache Press Team]
*MUST* review any releases by affiliated
organizations or groups to ensure they comply with these branding
guidelines.

*Podling has graduated from the Incubator*: The Apache Public
Relations Committee is willing to issue formal press releases for all
podlings who successfully graduate from the Incubator and are
interested in issuing a press release.  Or, the ASF may enter into a
joint press release with any other affiliated organizations or groups.

== Naming

After a podling has been approved, the lists are created, and the initial
 code drop has commenced, the podling *MUST* be referred to as Apache
 _Podling-Name_ *AND* mention that the project is
 under Incubation.  Suitable mentions include:

- Inclusion of the http://_podling-name_.incubator.apache.org/ URL
- Apache _Podling-Name_ is currently undergoing Incubation at the Apache Software Foundation.

Other references may only be used upon prior approval by the Incubator PMC.  These statements only need to be disclosed upon the first reference in a document.

== Disclaimers

Podling web sites MUST include a clear disclaimer on their
website and in all documentation (including releases) stating that
they are in incubation. Podlings SHOULD use the following text for
all disclaimers (replace the underlined phrases as appropriate):

[quote]
____
Apache [.underline]#Podling-Name# is an effort
undergoing incubation at The Apache Software Foundation (ASF),
sponsored by the [.underline]#name of Apache TLP sponsor#. Incubation is required of all
newly accepted projects until a further review indicates that the
infrastructure, communications, and decision making process have
stabilized in a manner consistent with other successful ASF projects.
While incubation status is not necessarily a reflection of the
completeness or stability of the code, it does indicate that the
project has yet to be fully endorsed by the ASF.
____

Podlings wishing to use a different disclaimer message MUST have the
disclaimer approved by the Incubator PMC prior to use.

For releases, the text SHOULD be included in a separate DISCLAIMER file
stored alongside the NOTICE and LICENSE files.

== Incubator Logo
Podlings websites should follow the logo description from link:press-kit.html[Press Kit for Podlings].

== Publicity activities
Podlings *MUST* coordinate with the Apache Public Relations Committee on
all publicity activities by a podling.

Media activities in the Open Source space can be difficult to negotiate even for experienced professionals. The ASF’s Marketing & Publicity team understands this space and it is in the best interests of all that they are consulted prior to embarking on formal outreach or related publicity. Please refer to the https://incubator.apache.org/guides/publicity.html[Apache Podling Publicity/Media Guidelines] or contact ASF Marketing & Publicity at press(at)apache(dot)org for more information.


== Response to Unapproved Statements
The Apache Public Relations Committee SHALL affirmatively and publicly
respond to any unapproved statements surrounding podlings which are factually
incorrect.
