Title: Apache Velocity Engine

## Velocity Engine

If you're new to Velocity, you can read the [Overview](overview.html) to understand its principles. Then, you can go through the [User Guide](user-guide.html) for more details.

You can check the [Velocity Template Language (VTL) reference](vtl-reference.html) to write templates, and the [Developer Guide](developer-guide.html) to guide you in the process of configuring and integrating Velocity.

## Where do I get releases?

The current stable release version is version 2.2.

The release distribution is available as a combined source/binary distribution in `tar.gz` and `zip` formats, and can be downloaded through the [Apache Mirror system](/download.cgi)..

The Velocity jars are also available through the [central Maven repository](http://repo1.maven.org/maven2/org/apache/velocity/).

Older releases are archived at the [Apache Velocity archives](http://archive.apache.org/dist/velocity/engine/).

## Where do I get nightly snapshots?

<!--
Nightly snapshots of the Velocity subversion source code tree can be found on our [nightly snapshot site(http://vc.apache.org/snapshots/velocity/).

If you are willing to risk getting dirty, we invite you to try the nightly snapshot to see the current state of affairs. (and help out!) [Public subversion access](http://www.apache.org/dev/version-control.html) is also available.
-->

Nightly snapshots aren't currently activated, but you can build the latest version using the [Public subversion access](http://www.apache.org/dev/version-control.html).

**Caveat!** These snapshots are generated automatically from the project source code repository. As this is our live development workspace, there are no guarantees as to what you will find there, although we do our best to maintain a buildable source tree. If you are looking for the stable supported release, please use the current release of Velocity.

**Please be aware that these snapshots are not official releases of Apache Velocity software. They are provided for developer convenience only!**

## How do I contribute, give feedback, fix bugs and so on?

The Velocity project appreciates any contributions, including documentation help, source code and feedback. Suggested changes should come in the form of source code and/or feedback.

+ Report bugs, ask questions, and help new users on the [Velocity mailing lists](http://velocity.apache.org/contact.html).
+ There's a list of issues waiting to be addressed in [our bug tracker](https://issues.apache.org/jira/browse/VELOCITY).
+ [Our wiki](http://wiki.apache.org/velocity/velocity) has a large collection of community written content. Add your own article or contribute to the FAQ!
+ Read-only access to the Subversion repository is available both [online](http://svn.apache.org/repos/asf/velocity/engine/trunk/) and with a [Subversion client](http://www.apache.org/dev/version-control.html).
