<!--
 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" -->
<body class="page-project ">
<!--#include virtual="includes/_top.htm" -->
<div class="content">
	<!--#include virtual="includes/_nav.htm" -->
	<div class="right">
		<h1 class="content-title">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">Books &amp; Academic Papers</h3>
		<a class="pb-10" href="/books-and-papers" target="_blank">View our papers and talks</a>
		<h3 class="bullet">Videos &amp; Talks</h3>
		<a class="pb-10" href="/videos" 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>
