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

Required guidelines for all podlings relating to publicity in general.

== 1) Prior to Entering the Apache Incubator

Under no circumstances are any individuals or organizations permitted to seek publicity during this process. Per the Incubator Branding Guidelines, a podling is not allowed to be referred to as  "Apache _Podling Name_" until the project has officially been accepted into the Apache Incubator, with public mailing lists announced, and code submitted into Apache repositories. 

No announcements or statements can be made by any party announcing 1) their intention to submit a named project to the Apache Incubator, or 2) that a specific project has been submitted to the Apache Incubator.

No formal press releases or announcements of any kind are allowed to be disseminated on any newswire service during the entire Incubation process. 


== 2) During the Incubation Process

Apache podlings and their communities are encouraged to actively build awareness of their project through emails, blog posts, tweets, and other means of outreach. Educational opportunities include MeetUps, videos, podcasts, articles, conferences, and related community events.

Whilst speaking with members of the media and analyst community, podlings must be referred to as "Apache _Podling Name_" as per the Branding Guidelines, along with explaining the requisite podling disclaimer(s). Be prepared to answer "who uses you?": as a podling’s known user base grows, PMCs (Project Management Committees) are welcome to promote their users in a "Powered By" page such as  https://cwiki.apache.org/hadoop/PoweredBy[Apache Hadoop's Powered By page]. Create and promote podling users to https://incubator.apache.org/guides/press-kit.html[utilize the "Powered By" logo]. Also, ensure that the podling maintains http://apache.org/press/media.html#interviews[*vendor neutrality*], particularly when referring to project users.

Podlings are advised to prepare news announcements and hone their messaging _privately_ within their PMCs (keeping the content confidential to the PMC, and not on dev@, user@ or any other public list or forum) to ensure that the public or press don’t scoop your story before it’s out or publish inaccurate information. At times messaging changes, features are unable to be delivered as intended, testimonials need adjusting, and so on, and it’s best to minimize the chances of your story to get out with incorrect information, or for nobody to recognize your news story because it was covered earlier and is therefore no longer considered newsworthy.

We strenuously recommend that podlings refrain from issuing announcements under embargo. Pre-announcing project features or release dates to members of the media is risky, as not all journalists or outlets honor confidentiality requests in general, or adhere to embargo dates/requirements. Furthermore, many journalists are unable or unwilling to fulfill requests for retractions or corrections. Be aware, be careful.

As all Apache PMCs (and Incubator PPMCs) are responsible for the "care and feeding" of a project’s code, community, and communications on a day-to-day basis, we recommend that Podlings:

- Ensure your [project listing and DOAP (Description Of A Project) file](https://projects.apache.org/) accurately reflect what the podling is about --be succinct, particularly with the short description (note that the project may fall under one category): this helps those unfamiliar with your project be able to find you. The longer project description should be used as the official project boilerplate ("About Apache _Project Name_") and, for consistency, be included in official news announcements, media briefings, and other applications (the ASF Boilerplate is for Foundation-originating press releases and is **not** to be used in any project announcements);
- Upload a high-resolution version of your project’s logo at [apache.org/logos/](http://www.apache.org/logos/);
- Contact ASF Infrastructure to establish a https://blogs.apache.org/_PROJECTNAME_ project blog directory (and admin/publishing credentials);
- Request a project interview on [Feathercast, the voice of the ASF](https://feathercast.apache.org/);
- Gain additional exposure by posting newsworthy podling updates and milestones to [announce(at)apache(dot)org](http://apache.org/foundation/mailinglists.html#foundation-announce); these will be added to the Apache Weekly News Round-Ups which is also sent to members of the media and analyst community;
- Establish a Twitter (and/or other social media) account(s) with a handle that includes "Apache" or "ASF" with the project name and description (example at [https://twitter.com/ApacheAccumulo](https://twitter.com/ApacheAccumulo) ) --share information often, and point to your podling Website and mailing list archives where possible; 
- Participate in Media & Analyst Training (held during ApacheCon; complimentary for Apache Committers and Members); and
- Comply with guidelines for "founding" individuals, organizations, and communities of Apache podlings as applicable (detailed below).

No formal press releases or announcements of any kind are allowed to be disseminated on any newswire service during the Incubation process. Furthermore, no announcement can be made by a third party on behalf of a podling undergoing development in the Apache Incubator, however, interested parties may issue supporting announcements with pointers to official podling-originating news providing that a link to the corresponding mailing list(s) and/or blog post is included.


== 3) Preparing to Graduate

Those podlings wishing to issue a press release announcing their graduation as an Apache Top-Level Project (TLP) must contact ASF Marketing & Publicity at least two weeks before submitting the graduation resolution to the ASF Board in order to provide sufficient preparation time.

Podling Project Management Committees (PPMCs) will work together with ASF Marketing & Publicity to issue a formal ASF press release, which is also a great opportunity to solicit quotes/testimonials from the Podling’s community to demonstrate the project's robustness and breadth of deployment.

TLP announcements have ranged from having single quotes (VP of the project/PMC chair) to several perspectives from the PMC to multiple endorsements from the community. A great example press release is: https://blogs.apache.org/foundation/date/20180110[The Apache Software Foundation Announces Apache® Trafodion™ as a Top-Level Project].

Organizations supporting/using the Podling are welcome to issue their own, standalone "hurrah, Apache _Podling Name_!" press release (or blog post) to support the podling's graduation. All third parties need to coordinate messaging and timing with both the Podling PMC as well as ASF Marketing & Publicity. Third party releases must not use Apache boilerplate.

=== PPMC Responsibilities For Announcements

- determine the primary point-of-contact during the drafting/editing process;

- help draft the announcement (primarily "what is Podling Name"/features+functionality);

- determine whether to include supporting testimonials from the community (and solicit them); and

- work with ASF Marketing & Publicity to ensure the announcement timing is in synch (preferable to roll out announcements within a 24-48 hour timeframe, rather than announce the project's graduation on the project’s dev@/user@ lists or on announce@apache.org, followed by a press release several weeks later).

Note that some organizations require legal clearance in order to participate in any media activities, and may require several weeks in order to obtain sign off on proposed participation in the form of testimonials or being listed as a corporate user.

Before anything is announced across media/analyst/news channels, ensure that references to "incubating/incubation" on podlingname.apache.org and related properties are removed to ensure that pointers are active and accurate.

Podlings should contact ASF Marketing & Publicity at press(at)apache(dot)org for assistance.
