// 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 horizontally scalable, fault-tolerant distributed in-memory computing platform for building real-time
applications that can process terabytes of data with in-memory speed.

Ignite documentation introduces you to the project's main 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 the
link:docs/latest/quick-start/java[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!

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

== Ignite Examples

The Apache Ignite github repository contains a number of runnable examples that illustrate various Ignite functionality.
Refer to the link:{githubUrl}/examples[Examples^] folder in the Ignite code base.
The examples are also available in the binary distribution.
