// 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.
= Apache Ignite Documentation

Apache Ignite is a distributed database for high-performance computing with in-memory speed.

The technical documentation introduces you to the key capabilities, shows how to use certain features, or how to
approach cluster optimizations and issues troubleshooting. If you are new to Ignite, then start with our
quick start guides, and build the first application in a matter of 5-10 minutes.
Otherwise, select the topic of your interest and have your problems solved, and questions answered.
Good luck with your Ignite journey!

== Quick Start Guides

Build the first application in a matter of minutes.

* link:quick-start/java[Java]
* link:quick-start/sql[SQL]
* link:quick-start/restapi[REST API]
* link:quick-start/dotnet[C#/.NET]
* link:quick-start/cpp[C++]
* link:quick-start/python[Python]
* link:quick-start/nodejs[Node.JS]
* link:quick-start/php[PHP]

== APIs

API reference for various programming languages.

*Latest Stable Version*

* link:/releases/latest/javadoc/[JavaDoc]
* link:/releases/latest/dotnetdoc/api/[C#/.NET]
* link:/releases/latest/cppdoc/[C++]

*Older Versions*

* With the top-level navigation menu, change an Ignite version and select a version-specific API from the APIs drop-down list.
* Or, go to the link:/download.cgi[downloads page] for a full archive of the versions.

== Examples

The Apache Ignite github repository contains a number of runnable examples that illustrate various Ignite functionality.

* link:{githubUrl}/examples[Java^]
* link:{githubUrl}/modules/platforms/dotnet/examples[C#/.NET^]
* link:{githubUrl}/modules/platforms/cpp/examples[C++^]
* link:{githubUrl}/modules/platforms/python/examples[Python^]
* link:{githubUrl}/modules/platforms/nodejs/examples[Node.JS^]
* link:{githubUrl}/modules/platforms/php/examples[PHP^]

== Programming Languages
include::includes/intro-languages.adoc[]
