Title: Apache Velocity - Contact Page

## Contact us

The communication between the developers and the user community in the Apache Velocity project is intended to be as open and accessible as possible. This is why we prefer to have <a href="#Mailing_Lists">public mailing lists</a> to which everyone can subscribe and which are archived.

For bug reporting and issue tracking, Velocity uses the [JIRA bug tracker](#issue-tracking) at the Apache Software Foundation. Please report bugs using the tracker, if you send them to the mailing lists, most of the times a member of the Apache Community will point you there anyway.  Using the bug tracker makes sure that your bug report is recorded and processed in a timely manner.

## Mailing Lists

Please be aware that sending confidential or private data to these lists is strongly discouraged and if this happens, we can not do anything to remove or erase this information from public archives.

We also strongly frown upon disclaimers attached to mails sent to these lists that declare the contents to be confidential, private or only intended for the recipient. But we understand that these disclaimers are often beyond your control. However, by sending mail to a Velocity mailing list, the intended recipient is the general public.

List name | Address | Archives | Subscribe | Unsubscribe | Purpose
----------|---------|----------|-----------|-------------|--------
general{#general} | [Send a message](mailto:general@velocity.apache.org) | [Main&nbsp;archive](http://mail-archives.apache.org/mod_mbox/velocity-general/), [Alternative&nbsp;Archive](http://www.mail-archive.com/general@velocity.apache.org/), [Alternate&nbsp;Archive](http://markmail.org/search/?q=list%3Aorg.apache.velocity.general) | [Subscribe](mailto:user-subscribe@velocity.apache.org) | [Subscribe](mailto:general-subscribe@velocity.apache.org) | [Unsubscribe](mailto:general-unsubscribe@velocity.apache.org) | Keep up-to-date with the Velocity project as a whole.
user{#user} | [Send a message](mailto:user@velocity.apache.org) | [Main&nbsp;archive](http://mail-archives.apache.org/mod_mbox/velocity-user/), [Alternative&nbsp;Archive](http://www.mail-archive.com/user@velocity.apache.org/), [Alternate&nbsp;Archive](http://markmail.org/search/?q=list%3Aorg.apache.velocity.user) | [Subscribe](mailto:user-subscribe@velocity.apache.org) | [Unsubscribe](mailto:user-unsubscribe@velocity.apache.org) | General discussion for developers wanting to use one of the Apache Velocity projects in their own code.
dev{#dev} | [Send a message](mailto:dev@velocity.apache.org) | [Main&nbsp;archive](http://mail-archives.apache.org/mod_mbox/velocity-dev/), [Alternative&nbsp;Archive](http://www.mail-archive.com/dev@velocity.apache.org/), [Alternate&nbsp;Archive](http://markmail.org/search/?q=list%3Aorg.apache.velocity.dev) | [Subscribe](mailto:dev-subscribe@velocity.apache.org) | [Unsubscribe](mailto:dev-unsubscribe@velocity.apache.org) | Watch the Velocity development process. Participate in Velocity development yourself.
commits{#commits} | [Send a message](mailto:commits@velocity.apache.org) | [Main&nbsp;archive](http://mail-archives.apache.org/mod_mbox/velocity-commits/), [Alternative&nbsp;Archive](http://www.mail-archive.com/commits@velocity.apache.org/), [Alternate&nbsp;Archive](http://markmail.org/search/?q=list%3Aorg.apache.velocity.commits) | [Subscribe](mailto:commits-subscribe@velocity.apache.org) | [Unsubscribe](mailto:commits-unsubscribe@velocity.apache.org) | Monitor the changes to the Velocity Source Code repository.

List name | Description
----------|------------
[general](#general) | This list is used for general, Velocity project related, discussion and announcements. This list is not for specific questions on how to do something using Velocity but for questions about Velocity. Usually very low volume.
[user](#user) |  This mailing list is intended for questions around using the Apache Velocity projects in your own code, about writing templates in the Velocity Templating Language and most everything else related to using Velocity. If you are a developer and want to use Velocity, subscribe here. This list has a moderate volume.
[dev](#dev) |  Found a bug, have a patch, want to improve Velocity? Subscribe to this mailing list, this is where all the developers hang out. Please do not ask questions on how to use Velocity in your own code unless it is related to a problem with Velocity itself. This list has low to moderate volume.
[commits](#commits) | This list reflects all the commit messages to the Velocity Subversion source code repository.

## Issue Tracking

These are the issue trackers for the various Velocity sub projects:

Project | Issue tracker | Component
--------|---------------|----------
Engine | [JIRA](https://issues.apache.org/jira/browse/VELOCITY) | (depends on the bug itself)
Tools | [JIRA](https://issues.apache.org/jira/browse/VELTOOLS) | (depends on the bug itself)
Anakia | [JIRA](https://issues.apache.org/jira/browse/VELOCITY) | Anakia
DVSL | [JIRA](https://issues.apache.org/jira/browse/VELOCITY) | DVSL
Texen | [JIRA](https://issues.apache.org/jira/browse/VELOCITY) | Texen

## Contacting the Apache Velocity PMC

The Apache Velocity Project Management Committee (PMC) provides oversight to the project and is legally responsible for all software releases. It reports to the [Board of the Apache Software Foundation](http://www.apache.org/foundation/board) quarterly. The reports are [archived and public](https://whimsy.apache.org/board/minutes/Velocity.html).

The Apache Velocity PMC can be reached at [private@velocity.apache.org](mailto:private@velocity.apache.org).

