<!--

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.

-->

{% extends "layout.html" %}
{% set title = _('Overview') %}
{% block body %}
  <h1>Apache CouchDB<sup>&reg;</sup> {{ release|e }} Documentation</h1>
  <p>
    {{ _('Welcome! This is') }}
    {% block description %}{{ _('the documentation for') }} Apache CouchDB<sup>&reg;</sup>
    {{ release|e }}{% if last_updated %}, {{ _('last updated') }} {{ last_updated|e }}{% endif %}{% endblock %}.
</p>
{% block tables %}
<h2>Meet CouchDB</h2>
<table class="contentstable" align="center">
  <tr>
    <td width="50%">
      <p class="biglink">
        <a class="biglink" href="{{ pathto("whatsnew/" + version) }}">
          What's new in CouchDB {{ version }}?
        </a>
        <br />
        <span class="linkdescr">
          or browse <a href="{{ pathto("whatsnew/index") }}">all "What's new" documents</a>
        </span>
      </p>
      <p class="biglink">
        <a class="biglink" href="{{ pathto("intro/why") }}">
          Why CouchDB?
        </a>
        <br />
        <span class="linkdescr">why you might want to use CouchDB</span>
      </p>
    <td width="50%">
      <p class="biglink">
        <a class="biglink" href="{{ pathto("intro/overview") }}">
          Technical Overview
        </a>
        <br />
        <span class="linkdescr">a quick overview of technology used</span>
      </p>
      <p class="biglink">
        <a class="biglink" href="{{ pathto("intro/consistency") }}">
          Eventual Consistency
        </a>
        <br />
        <span class="linkdescr">how CouchDB handles synchronization</span>
      </p>
    </td>
  </tr>
</table>

<h2>Getting started</h2>
<table class="contentstable" align="center">
  <tr>
    <td width="50%">
      <p class="biglink">
        <a class="biglink" href="{{ pathto("install/index") }}">
          Installation guides
        </a>
        <br />
        <span class="linkdescr">
          install CouchDB on <a href="{{ pathto("install/windows") }}">Windows</a>,
          <a href="{{ pathto("install/mac") }}">OS X</a> or
          <a href="{{ pathto("install/unix") }}">Linux</a>
        </span>
      </p>
      <p class="biglink">
        <a class="biglink" href="{{ pathto("intro/tour") }}">
          Tutorial
        </a>
        <br />
        <span class="linkdescr">start using CouchDB with <a href="{{ pathto("fauxton/index") }}">Fauxton</a> and
          <a href="{{ pathto("intro/curl") }}">cURL</a></span>
      </p>
      <p class="biglink">
        <a class="biglink" href="{{ pathto("intro/api") }}">
          HTTP API overview
        </a>
        <br />
        <span class="linkdescr">a short walk though the API</span>
      </p>
      <p class="biglink">
        <a class="biglink" href="{{ pathto("cluster/index") }}">
          Clustering
        </a>
        <br />
        <span class="linkdescr">setup and manage a cluster of nodes</span>
      </p>
    <td width="50%">
      <p class="biglink">
        <a class="biglink" href="{{ pathto("ddocs/views/intro") }}">
          Guide to Views
        </a>
        <br />
        <span class="linkdescr">how to query documents with MapReduce</span>
      </p>
      <p class="biglink">
        <a class="biglink" href="{{ pathto("api/database/find") }}">
          Mango Query Server
        </a>
        <br />
        <span class="linkdescr">
          simple JSON CouchDB queries without MapReduce
        </span>
      </p>
      <p class="biglink">
        <a class="biglink" href="{{ pathto("replication/intro") }}">
          Replication
        </a>
        <br />
        <span class="linkdescr">
          painless master-master data synchronization
        </span>
      </p>
      <p class="biglink">
        <a class="biglink" href="{{ pathto("ddocs/ddocs") }}">
          Design Documents
        </a>
        <br />
        <span class="linkdescr">
          transform, update or validate your documents
        </span>
      </p>
    </td>
  </tr>
</table>

<h2>Reference Documentation &amp; Advanced Topics</h2>
<table class="contentstable" align="center"><tr>
  <tr>
    <td width="50%">
      <p class="biglink">
        <a class="biglink" href="{{ pathto("api/index") }}">
          Complete HTTP API Reference
        </a>
        <br />
        <span class="linkdescr">
          something to come back to
        </span>
      </p>
      <p class="biglink">
        <a class="biglink" href="{{ pathto("config/index") }}">
          Configuration Reference
        </a>
        <br />
        <span class="linkdescr">tweak CouchDB to your liking</span>
      </p>
    </td>
    <td width="50%" style="vertical-align: top;">
      <p class="biglink">
        <a class="biglink" href="{{ pathto("maintenance/index") }}">
          Maintenance
        </a>
        <br />
        <span class="linkdescr">
          how to take care of your CouchDB
        </span>
      </p>
      <p class="biglink">
        <a class="biglink" href="{{ pathto("partitioned-dbs/index") }}">
          Partitioned Databases
        </a>
        <br />
        <span class="linkdescr">
          how to use Partitioned Databases in CouchDB
        </span>
      </p>
    </td>
  </tr>
</table>


<h2>Links</h2>
<table class="contentstable" align="center"><tr>
  <td>
    <p class="biglink"><a class="biglink" href="https://couchdb.apache.org/#download">Download CouchDB</a></p>
    <p class="biglink"><a class="biglink" href="{{ pathto("http-routingtable") }}">HTTP API Quick Reference</a></p>
    <p class="biglink"><a class="biglink" href="{{ pathto("config-ref") }}">Configuration Quick Reference</a></p>
  </td></tr>
</table>
{% endblock %}
{% endblock %}
