// 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].

