---
# 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.

title: Contributing
in_menu: false
--- name:overview

# How to contribute to ${project_name}
We love contributions!

--- name:content

We really want you to get involved in the ${project_name} project, to
[join the community](index.html) and help make it a better piece of
software - please do dive in and help!

Try surf the [documentation](../documentation/index.html) and website in
general - if something is confusing or not clear, [let us
know](index.html) or raise a [support request](support.html).

[Download](../download.html) the code and try it out and see what you think.
Browse the [source code](source.html). Got an itch to scratch, want to
tune some operation or add some feature?

Want to do some hacking on the ${project_name} code? Try surfing the our
[Issue Tracker](${project_issue_url}) for open issues or features.  If something
tickles your fancy, take ownership of the issue and start working on it!  Attach
a patch once you fix it.

## Improving the documentation

Documentation is massively important to help users make the most of
${project_name} and its probably the area that needs the most help!

So if you are interested in helping the documentation effort; whether its
just to fix a page here or there, correct a link or even write a tutorial
or improve what documentation is already there please do dive in and
help\!

All of the documentation is stored in project source repository, see [How
the Site works](site.html)

## If you find a bug or problem

Please raise a new issue in our [Issue Tracker](${project_issue_url}). If
you can create a JUnit test case then your issue is more likely to be
resolved quicker. Then we can add your issue to our [source control
system](source.html) and then we'll know when its really fixed and we can
ensure that the problem stays fixed in future releases.

## Working on the code and creating patches

We gladly accept patches if you can find ways to improve, tune or fix
${project_name} in some way.

${include("/community/_creating_patches.ssp.md")}

## Becoming a committer

Once you have made some good contributions you may be invited to become a
committer by the project team. We'll chat to you offline about it.
