---
title:  Prerequisites and Installation Instructions
---

<!--
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.
-->

Each host of Apache Geode 1.0.0-incubating that meets a small set of prerequisites may follow the provided installation instructions.

-   **[Host Machine Requirements](getting_started/system_requirements/host_machine.html)**

    Host machines must meet a set of requirements for Apache Geode.

-   **[How to Install](getting_started/installation/install_standalone.html)**

    Build from source or use the ZIP or TAR distribution to install Apache Geode on every physical and virtual machine that will run Apache Geode.

-   **[Setting Up the CLASSPATH](getting_started/setup_classpath.html)**

    This topic describes how Geode processes set their CLASSPATH.

-   **[How to Uninstall](getting_started/uninstall_gemfire.html)**

    This section describes how to remove Geode.


