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

<!--#include virtual="includes/_header.htm" -->
<!--#include virtual="includes/_top.htm" -->
<div class="content">
	<!--#include virtual="includes/_nav.htm" -->
	<div class="right">
		<h1>Project information</h1>
		<h3 class="bullet">Wiki</h3>
		<a class="pb-10" href="https://cwiki.apache.org/confluence/display/KAFKA/Index" target="_blank">Check out the project wiki</a>
		<h3 class="bullet">Bugs</h3>
		<a class="pb-10" href="https://issues.apache.org/jira/browse/KAFKA" target="_blank">Follow current development and issues</a>
		<h3 class="bullet">Committers</h3>
		<a class="pb-10" href="/committers">See the project committers</a>
		<h3 class="bullet">Security</h3>
		<a class="pb-10" href="/project-security">Learn about Kafka&reg; security</a>
		<h3 class="bullet">Papers &amp; talks</h3>
		<a class="pb-10" href="https://cwiki.apache.org/confluence/display/KAFKA/Kafka+papers+and+presentations" target="_blank">View our papers and talks</a>
		<h3 class="bullet">Developer info</h3>
		<ul>
			<li>
				<a href="/code">Getting the code</a>
			</li>
			<li>
				<a href="http://cwiki.apache.org/confluence/display/KAFKA/Projects" target="_blank">Projects</a>
			</li>
			<li>
				<a href="/contributing">How to contribute</a>
			</li>
			<li>
				<a href="/coding-guide">Code guidelines</a>
			</li>
			<li>
				<a href="/protocol">Protocol guide</a>
			</li>
			<li>
				<a href="https://builds.apache.org/" target="_blank">Unit tests</a>
			</li>
		</ul>
		<h3 class="bullet">Twitter</h3>
		<a href="https://twitter.com/apachekafka" target="_blank">@apachekafka</a>

<!--#include virtual="includes/_footer.htm" -->

<script>
// Show selected style on nav item
$(function() { $('.b-nav__project').addClass('selected'); });
</script>
