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

About
=====

Documents in Development
------------------------

    The development effort is in the process of developing multiple documents to separate the aspects of Apache Wave
    into reasonable size. This includes the development of:

        * This document; a setup and overview of the documentation system.
        * User Manual; provided to help users with the wave client.
        * Developer Doc; a resource with technical information needed to contribute to the Apache Wave development.
        * Api Doc; reference for the api's provided to 3rd party developers.
        * Protocol Specification; technical resource to explain and design the protocols in use by Apache Wave.

