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

Introduction
============

|Apache CouchDB(TM)|_ is a document database built for the web.

If you would like to help document the project, please send a note to the
`developer mailing list <http://couchdb.apache.org/#mailing-list>`_.

This is a work in progress.

Contents
========
   
.. toctree::
    :maxdepth: 2
    :numbered:

    intro
    api-basics
    configuring
    replication
    replicator
    ddocs
    query-servers
    changes
    api/reference
    json-structure
    config_reference
    contributing
    changelog

.. This is how you get a TM sign into a link. Haha. Seriously.
.. |Apache CouchDB(TM)| unicode:: Apache U+0020 CouchDB U+2122
.. _Apache CouchDB(TM): http://couchdb.apache.org/
