---
title: Apache Pulsar
layout: default
---

<!--

    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.

-->

<div class="index-container">
  <div class="container">
    <div class="jumbotron-fluid text-center">
      <!-- <h2 class="display-4">{{ site.title }}</h2> -->
      <img class="img-fluid" src="/img/pulsar.png" />

      <p class="lead"><a href="">Apache Pulsar</a> is an open-source distributed pub-sub messaging system originally<br />
          created at <a href="https://developer.yahoo.com/open-source/">Yahoo</a> and now part of the <a href="https://apache.org">Apache Software Foundation</a>.</p>

      <p class="button-group lead">
        <a class="btn btn-pulsar btn-lg" href="/docs/latest/getting-started/LocalCluster/" role="button">Read the docs</a>
        <a class="btn btn-github btn-lg" href="https://github.com/apache/incubator-pulsar" role="button">GitHub <i class="fa fa-github fa-lg"></i></a>
      </p>
    </div>
  </div>
</div>

<div class="main-page-features">
  <div class="container">
    <h2 class="text-center">Key features</h2>
    <div class="row">
      {% for feature in site.data.features %}
      <div class="col-sm-4 card">
          <div class="card-block">
            <a href="/docs/latest/{{ feature.endpoint }}" >
                  <h3 class="card-title">{{ feature.title }}</h3>
            </a>
          <p>{{ feature.content | markdownify }}</p>
        </div>
      </div>
      {% endfor %}
    </div>
  </div>
</div>


<div class="asf-incubator-container">
  <div class="container">
    <div class="text-center">
      <p>
        <a href="https://incubator.apache.org/"><img src="img/apache_incubator.png" title="Apache Incubator" /></a>
      </p>
      <p>
        Apache Pulsar is an effort undergoing incubation at <a href="http://www.apache.org">The Apache Software Foundation (ASF)</a> sponsored by the Apache Incubator PMC. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
      </p>
      <p>
        Apache Pulsar (incubating) is available under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, version 2.0</a>.
      </p>
    </div>
  </div>
</div>
