//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" (issuing press releases, seeding news stories, or otherwise affirmatively
seeking publicity) they can engage in:

*Podling is in proposal/or pre-code-drop process*: No publicity
seeking is permitted.  You cannot refer to the podling as `Apache
_Podling-Name_` until the podling is officially in
Incubation, public mailing lists are active, and committers or contributors have submitted code into our repositories.

*Podling has been approved for incubation, podling has launched
public mailing lists, and podling has dropped code into
repository*: You now *MUST* refer to the podling as '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. The 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. 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 our branding
guidelines.

*Podling has graduated from the Incubator*: The Apache Public
Relations Committee is willing to issue formal press releases for all
podlings that successfully graduate from the Incubator and are
interested in issuing a press release. The ASF may also 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, you *MUST* refer to the podling 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`.

The Incubator PMC (IPMC) must approve other references before you publish them. You only need to make these statements upon the first reference to the podling 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 their publicity activities.

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 you consult with them prior to embarking on formal outreach or related publicity. 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.
