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) | [Archive](https://lists.apache.org/list.html?general@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) | [Archive](https://lists.apache.org/list.html?user@velocity.apache.org) | [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) | [Archive](https://lists.apache.org/list.html?dev@velocity.apache.org) | [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) | [Archive](https://lists.apache.org/list.html?commits@velocity.apache.org) | [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)

## 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](https://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).

