---
title: Community
---
<!-- 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 id="map-canvas" style="width: 100%;"></div> -->

<section class="bf-tagline">
    <div class="container">
    	<div class="row">
        <br/>
	    	<h2>Join Our Community of Contributors!</h2>
        <p>The Apache Geode team welcomes contributors who want to support the Geode technology. Our community builds everything from this website, from the Geode code to documentation and best practices information.</p>

        <p>We especially welcome additions and corrections to the documentation, wiki, and website to improve the user experience. Bug reports and fixes and additions to the Apache Geode code are welcome. Helping users learn best practices also earns good karma in our community.</p>
		</div>
	</div>
</section>

<section class="bf-community">
    <div class="container">
    	<div class="row">
    	    <div class="col-md-12">
    	    	<h2 class="icns-envelope" id="mailing-lists"><span>Mailing-lists</span></h2>
			</div>
		</div>
		<div class="row">
	    	<div class="col-md-4">
	    		<h3>Users</h3>
	    		<p><em>Perfect if you build apps against Apache Geode or deploy Apache Geode, and a great place to start if you have a question.</em></p>
	    		<p>To subscribe, send a blank email to<br/><a href="mailto:user-subscribe@geode.apache.org">user-subscribe@geode.apache.org</a>.</p>
	    		<p>You can also <a href="http://markmail.org/search/?q=list%3Aorg.apache.geode.user+order%3Adate-backward">read the archives</a>.</p>
			</div>
	    	<div class="col-md-4">
	    		<h3>Dev</h3>
	    		<p><em>If you are building contributions and modifications to Apache Geode, this is the list for you.</em><p>
	    		<p>To subscribe, send a blank email to<br/><a href="mailto:dev-subscribe@geode.apache.org">dev-subscribe@geode.apache.org</a>.</p>
	    		<p>You can also <a href="http://markmail.org/search/?q=list%3Aorg.apache.geode.dev+order%3Adate-backward">read the archives</a>.</p>
			</div>
	    	<div class="col-md-4">
	    		<h3>Commits</h3>
	    		<p><em>This list receives an email whenever new code is contributed to Apache Geode.</em><p>
	    		<p>To subscribe, send a blank email to<br/><a href="mailto:commits-subscribe@geode.apache.org">commits-subscribe@geode.apache.org</a>.</p>
	    		<p>You can also <a href="http://markmail.org/search/?q=list%3Aorg.apache.geode.commits+order%3Adate-backward">read the archives</a>.</p>
			</div>
		</div>
	</div>
</section>

<section class="bf-community">
    <div class="container">
    	<div class="row">
    	    <div class="col-md-12" id="events">
    	    	<h2 class="icns-calendar"><span>Events</span></h2>
			</div>
		</div>
    <div class="row">
      <div class="col-md-4">
        <a  href="https://www.apache.org/events/current-event.html">
          <img src="https://www.apache.org/events/current-event-234x60.png"/>
        </a>
      </div>
    	<div class="col-md-4">
    	    	<h3>Watch this space for upcoming Apache Geode events!</h3>
              <p><i>Want to organize an event? Subscribe to the Apache Geode Users list by sending a blank email to<br/><a href="mailto:user-subscribe@geode.apache.org">user-subscribe@geode.apache.org</a>, then email the list with your event idea!</i>
              </p>
      </div>

    </div>
	</div>
</section>

<section class="bf-community">
    <div class="container">
    	<div class="row">
    	    <div class="col-md-12" id="live">
    	    	<h2 class="icns-chat"><span>Live Chat and Geode Presentations</span></h2>
			</div>
		</div>
		<div class="row">
      <div class="col-md-4">
        	<h3><a target="_blank" href="http://stackoverflow.com/search?q=Apache%20Geode">StackOverflow</a></h3>
        	<p>The Geode team is always ready to answer questions on <a href="http://stackoverflow.com/search?q=Apache%20Geode">StackOverflow</a><p>
      </div>
      <div class="col-md-4">
        	<h3><a target="_blank" href="https://www.youtube.com/user/PivotalOpenSourceHub">Pivotal Open Source Hub</a></h3>
        	<p>A YouTube channel with <a target="_blank" href="https://www.youtube.com/user/PivotalOpenSourceHub">Apache Geode videos and presentations</a>, including:<p>
                <ul>
                <li><a target="_blank" href="https://www.youtube.com/playlist?list=PL62pIycqXx-SrrC-iIYJmIEojOo3V27ho">Apache Geode By Example</a></li>
                <li><a target="_blank" href="https://www.youtube.com/playlist?list=PL62pIycqXx-ShuJ1YpV2wlmNZodnqzY8T">Geode Summit 2018 at SpringOne</a></li>
                <li><a target="_blank" href="https://www.youtube.com/playlist?list=PL62pIycqXx-RbKoMA9_QQ_0Wh64AwMdLK">Geode How-to Series</a></li>
                <li><a target="_blank" href="https://www.youtube.com/playlist?list=PL62pIycqXx-R6IxZBlFyD_gq1EwT5CGE-">Geode Clubhouse</a></li>
                </ul>
      </div>
	  </div>
</section>

<section class="bf-community committers">
    <div class="container">
    	<div class="row">
            <div class="col-md-12">
    	    	<h2 class="icns-group" id="committers"><span>Committers</span></h2>
                <a target="_blank" href="https://projects.apache.org/committee.html?geode">Lists of PMC members and Committers</a>
            </div>
        </div>
        <div class="row">
      <br/>
      <div class="col-md-3">
        <h3>&nbsp;</h3>
            <p><i>Want to be added to this list? Join the community, contribute and <a href="mailto:dev@geode.apache.org">contact us!</a></i><p>
      </div>
		</div>
	</div>
</section>

