// 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 of
the current Apache Ignite version.

NOTE: Though this alpha release version does not support most of the Apache Ignite functionality,
it introduces several new features, which are to be accompanied with other improvements from the link:https://cwiki.apache.org/confluence/display/IGNITE/Proposals+for+Ignite+3.0[Ignite Enhancement Proposal,window=_blank] list.

This alpha version of Apache Ignite, incorporating all the best solutions over the past years,
possesses the highest level of usability thanks to the following improvements:

* Schema-first approach: This feature introduces one-to-one mapping between data schemas and caches/tables, which means that the schema is defined for a cache/table before its creation.
* Unified Configuration: This feature is presented by a set of the following improvements:
- Platform-agnostic configuration representation
- Clear separation between configuration and any third-party code
- Predictable configuration lifecycle
- Consistent runtime configuration change support
* Ignite CLI tool: This tool functions as a single sign-on for any operational, management, and development needs.
* See a link:https://cwiki.apache.org/confluence/display/IGNITE/Proposals+for+Ignite+3.0[full list of improvements,window=_blank].


== New in Alpha 5

Apache Ignite Alpha 5 comes with the following new features:

* New CLI tool;
* Distributed computing;
* Java SQL API;
* Data colocation;
* REST API.

