<!--
    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 from scratch](https://forge-allura.apache.org/docs/getting_started/installation.html#step-by-step-install)
- [Install using Docker](https://forge-allura.apache.org/docs/getting_started/installation.html#docker-install)

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/)
