Title:     About the Community
Notice:    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.

Apache Taverna is a [incubator project](http://incubator.apache.org/) within the
[The Apache Software Foundation (ASF)](http://www.apache.org/).

Taverna is an open source community that's organized by its
[members](/about), including you!
Whether you're running or
[writing workflows](#contribute),
[developing plugins](#contribute),
[hosting a Taverna server](#contribute),
[hosting a service](#contribute),
[hacking the core](#contribute),
[citing us](#citing-taverna), or just want to
[edit](#contribute) these pages
there are opportunities for you to
[get in touch and ask questions](#contact),
[contribute](#contribute) or
[report a bug](#reportbugs).



<a name="mailinglists"></a>
## How to Communicate
### Mailing Lists

You are highly encouraged to participate on the Apache Taverna [mailing lists](/community/lists):

<table class="table table-condensed">
<tr>
  <th> Users </th>
  <td> Build/run workflows; analytical science; services</td>
  <td>
    <a class="btn btn-primary" href="mailto:users-subscribe@taverna.incubator.apache.org" role="button">Subscribe</a>
    <a class="btn btn-default" href="mailto:users-unsubscribe@taverna.incubator.apache.org" role="button">Unsubscribe</a>
    <a class="btn btn-default" href="https://lists.apache.org/list.html?users@taverna.apache.org" role="button">Archives</a>
    <a class="btn btn-link" href="/community/lists#users" role="button">More info</a>
  </td>
</tr>
<tr>
  <th> Developers &nbsp;</th>
  <td> Coding on/with Taverna; workflow/provenance science  &nbsp;</td>
  <td>
    <a class="btn btn-primary" href="mailto:dev-subscribe@taverna.incubator.apache.org" role="button">Subscribe</a>
    <a class="btn btn-default" href="mailto:dev-unsubscribe@taverna.incubator.apache.org" role="button">Unsubscribe</a>
    <a class="btn btn-default" href="https://lists.apache.org/list.html?dev@taverna.apache.org" role="button">Archives</a>
    <a class="btn btn-link" href="/community/lists#dev" role="button">More info</a>
  </td>

</tr>
<tr>
  <th> Commits  &nbsp;</th>
  <td> Code changes; automated build reports  &nbsp;</td>
  <td>
    <a class="btn btn-primary" href="mailto:commits-subscribe@taverna.incubator.apache.org" role="button">Subscribe</a>
    <a class="btn btn-default" href="mailto:commits-unsubscribe@taverna.incubator.apache.org" role="button">Unsubscribe</a>
    <a class="btn btn-default" href="https://lists.apache.org/list.html?commits@taverna.apache.org" role="button">Archives</a>
    <a class="btn btn-link" href="/community/lists#commits" role="button">More info</a>
  </td>
</tr>
</table>


To receive messages from a list, and to be able to post to it, you need to be *subscribed*:

 - Send an empty message to the **Subscribe** address from above (any message text will be ignored)
 - Wait for the **response** email with a subject like *Confirm subscribe to users@taverna*
 - To **confirm subscription**, reply with an empty message
 - You should now be subscribed to the list

Unsubscribing is done in the same way, using the *Unsubscribe* address instead.

See the [mailing list](/community/lists) page for more details.

### Web chat

Some of the Apache Taverna users and developers occasionally hang out on the
[Gitter chat apache/taverna](/community/chat).


<a name="reportbugs"></a>
### Report or track a bug

Use the Apache Taverna JIRA [issue tracker](/community/issue-tracker) to report or track a bug.


## Citing Taverna

If you use Taverna in your academic work, you can [cite](/community/cite) one of the
[publications about Taverna](/community/publications).
We also track papers that
[reference Taverna](/community/references), so feel free to
[raise an issue](issue-tracker) or
[suggest a webpage edit](/community/edit) to add
your own publications to these lists.  

<a name="contribute"></a>
## How to Contribute

 - **Workflows.** The best place to contribute Taverna workflows is on
     [myExperiment](http://www.myexperiment.org).

 - **Code.** We welcome any contributions for the [source code](/download/code/) of Apache Taverna. See how to [contribute code](/download/code/#contribute-to-apache-taverna).

 - **Plugins.** The mechanism for writing *Apache Taverna 3 plugins* is still under development. Please contact the [dev@taverna](/community/lists#devtaverna) mailing list for details. (For *Taverna 2* (pre-Apache), see the [Creating plugins for Taverna 2](http://dev.mygrid.org.uk/wiki/display/developer/Creating+plugins+for+Taverna+2) tutorial.)

- **Host a Taverna Server.** For information on hosting a Taverna Server to run Taverna workflows, see the [Server](/documentation/server) Section.

- **Host a Service.** For information on writing web services to be used in Taverna, see our [Web Service Developers](/documentation/web-service-developers) Section. We recommend that your services are registered in Registries such as: [BioCatalogue](http://www.biocatalogue.org)

- **Edit the website.** This website is always under development. Please help make it better by [editing](/community/edit) or adding pages.


## Incubator status

* [Taverna incubator status](http://incubator.apache.org/projects/taverna.html).
* [Graduation Maturity Assessment](https://cwiki.apache.org/confluence/display/TAVERNADEV/2016-03+Taverna+Graduation+Maturity+Assessment)

Apache Taverna is an effort undergoing incubation at
[The Apache Software Foundation (ASF)](http://apache.org/)
sponsored by the [Apache Incubator PMC](http://incubator.apache.org/).
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](http://incubator.apache.org/projects/taverna.html)
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.
