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

<img src="https://allura.apache.org/theme/img/logo_black.png" alt="Apache Allura Logo" width="64" /> 

# Apache Allura

[![Build Status](https://builds.apache.org/buildStatus/icon?job=Allura)](https://builds.apache.org/job/Allura)

Allura is an open source implementation of a software "forge", a web site that manages source code repositories, bug reports, discussions, mailing lists, wiki pages, blogs and more for any number of individual projects.

Allura is written in Python and leverages a great many existing Python packages (see requirements.txt and friends).  It comes with tests which we run with [nose](https://nose.readthedocs.org/en/latest/).  It is extensible in several ways, most importantly via the notion of "tools" based on `allura.app.Application`; but also with [themes, authentication, and various other pluggable-APIs](https://forge-allura.apache.org/docs/extending.html).

Website: <https://allura.apache.org/>

## Table of Contents

- [Installation](#install)
- [Usage](#usage)
- [Contribute](#contribute)
- [Quick Links](#quick-links)

## Install

Before hacking on Allura, you’ll need to get an Allura instance up and running so you can see and test the changes you make. You can install Allura from scratch, or by using our Docker container images. Instructions for these approaches can be found here:

- [Install using Docker](https://forge-allura.apache.org/docs/getting_started/installation.html)
- [Install from scratch](https://forge-allura.apache.org/docs/getting_started/install_each_step.html)

To install Allura, see `Allura/docs/getting_started/installation.rst` or <https://forge-allura.apache.org/docs/getting_started/installation.html>.



## Usage

You can learn about using Allura, configuring neighborhoods, managing projects and it's tools see `Allura/docs/getting_started/using.rst` or <https://forge-allura.apache.org/docs/getting_started/using.html> 

## Contribute

Apache Allura is an effort _for_ the community: an open source platform for sharing development.  We think it should be _of_ the community as well. We want to encourage community involvement in development, testing and design.  We do that with a public git repo, a bug tracker, a discussion list and an IRC channel.

Developers interested in hacking on Allura or its components should see `Allura/docs/docs/development/contributing.rst` or <https://forge-allura.apache.org/docs/development/contributing.html>.

You can get in touch with other Allura developers on the developer mailing list ([dev@allura.apache.org](https://mail-archives.apache.org/mod_mbox/allura-dev/)) or in the [#allura](https://webchat.freenode.net/?channels=#allura) channel on the Freenode IRC network.

To find more documentation, ask a question, file a bug, or contribute a patch, see the links on our website(<https://allura.apache.org/>).  If you're not sure where to start, join the mailing list and ask.

## Quick Links
- [Forge Allura](https://forge-allura.apache.org/p/allura/)
- [Git Repo](https://forge-allura.apache.org/p/allura/git/)
- [Wiki](https://forge-allura.apache.org/p/allura/wiki/)
- [Tickets](https://forge-allura.apache.org/p/allura/tickets/)
- [Documentation](https://forge-allura.apache.org/docs/)
