Title: The Apache Velocity Project

## What is Velocity?

Velocity is a Java-based template engine. It permits anyone to use a simple yet powerful template language to reference objects defined in Java code.

When Velocity is used for web development, Web designers can work in parallel with Java programmers to develop web sites according to the Model-View-Controller (MVC) model, meaning that web page designers can focus solely on creating a site that looks good, and programmers can focus solely on writing top-notch code. Velocity separates Java code from the web pages, making the web site more maintainable over its lifespan and providing a viable alternative to [Java Server Pages](http://java.sun.com/products/jsp/) (JSPs) or [PHP](http://www.php.net/).

Velocity's capabilities reach well beyond the realm of the web; for example, it can be used to generate SQL, PostScript and XML from templates. It can be used either as a standalone utility for generating source code and reports, or as an integrated component of other systems. For instance, Velocity provides template services for [various web frameworks](http://wiki.apache.org/velocity/PoweredByVelocity), enabling them with a view engine facilitating development of web applications according to a true MVC model.

## The Apache Velocity Project

Velocity is a project of the [Apache Software Foundation](http://www.apache.org/), charged with the creation and maintenance of open-source software related to the [Apache Velocity Engine](http://velocity.apache.org/engine/index.html). All software created at the Velocity project is available under the [Apache Software License](http://www.apache.org/licenses/LICENSE-2.0.txt) and free of charge for the public.

## Recent News

{{recent_news}}

[See all news...](/news.html)
{.right}

## Apache Software Foundation

The Apache Software Foundation provides support for the Apache community of open-source software projects. The [Apache projects](http://projects.apache.org) are characterized by a collaborative, consensus based development process, an open and pragmatic software license, and a desire to create high quality software that leads the way in its field.

## Apache Velocity Projects

Apache Velocity offers the following projects:

[Velocity Engine](/engine/index.html) &dash; This is the actual templating engine which does all the work. If you came here because you heard about Velocity somewhere on the web, this is probably the right place to start.
{.frame}

[Velocity Tools](/tools/index.html) &dash; This project contains tools and other useful infrastructure to build web and non-web application using the Velocity engine. You will find e.g. code for [Struts](http://struts.apache.org) integration or the standalone VelocityViewServlet here.
{.frame}

## Release Status

Project | Release Version | Alpha/Beta/RC Release Version
--------|-----------------|------------------------------
Velocity Engine | 2.2 | (currently none available)
Velocity Tools | 3.0 | (currently none available)

The release distribution is available as a combined source/binary distribution in tar.gz and zip formats, and can be downloaded from [our download page](/download/cgi).

## More Information

For more information about the Apache Velocity Project, see

+ [How the Apache Velocity project works](/how-it-works.html)
+ [Who are the people behind the Apache Velocity project](who-we-are.html)
+ [Find out how to get involved with the Apache Velocity project](get-involved.html)
+ [Contact the Apache Velocity project](/contact.html)

For more information about the Apache Software Foundation, see

+ [Foundation Home Page](http://www.apache.org/)
+ [Apache License and Distribution FAQ](http://www.apache.org/foundation/licence-FAQ.html)
