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

Rather than build yet another forge, we decided to do something new.   We wanted to build a new kind of extensible forge, and a new set of highly integrated forge tools. 

Allura is an **open** platform for **open** processes
----------------------------------------------------------------------

It's easy to get frustrated with existing development tools.   Too often they are overbearing, complex, and make assumptions that get in your way.  And even if they are open source, it's often difficult to get them to work the way you need them too. 

Which is why we created Allura.   It's designed to be truly **open**, in many different senses of the word. 

It's open in bunch of ways:
 
* It's a combination of tools available under *Free* or *Open Source* licenses. 
* It's designed around a plugin architecture, and anybody willing to contribute a tool can play.
* It's being hosted publicly, and is built through contributions of individuals and companies who want to promote Open Source development.
* It's designed to provide a structure around which welcoming (open) communities can grow. 
* Its core tools are designed around inclusive development processes.

We looked at existing forges, but to achieve all those goals, we decided we needed to build something new.

Allura is designed to support an **ecosystem**
------------------------------------------------------------------------

Allura is at once a **set of tools** to help people collaboratively develop software, and an **open platform** on which innovative new tools be built. 

