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

Contact us
==========

You can get in touch with the Cassandra community either via the mailing lists or the freenode IRC channels.

.. _mailing-lists:

Mailing lists
-------------

The following mailing lists are available:

- `Users <http://www.mail-archive.com/user@cassandra.apache.org/>`__ – General discussion list for users - `Subscribe
  <user-subscribe@cassandra.apache.org>`__
- `Developers <http://www.mail-archive.com/dev@cassandra.apache.org/>`__ – Development related discussion - `Subscribe
  <dev-subscribe@cassandra.apache.org>`__
- `Commits <http://www.mail-archive.com/commits@cassandra.apache.org/>`__ – Commit notification source repository -
  `Subscribe <commits-subscribe@cassandra.apache.org>`__
- `Client Libraries <http://www.mail-archive.com/client-dev@cassandra.apache.org/>`__ – Discussion related to the
  development of idiomatic client APIs - `Subscribe <client-dev-subscribe@cassandra.apache.org>`__

Subscribe by sending an email to the email address in the Subscribe links above. Follow the instructions in the welcome
email to confirm your subscription. Make sure to keep the welcome email as it contains instructions on how to
unsubscribe.

.. _irc-channels:

IRC
---

To chat with developers or users in real-time, join our channels on `IRC freenode <http://webchat.freenode.net/>`__. The
following channels are available:

- ``#cassandra`` - for user questions and general discussions.
- ``#cassandra-dev`` - strictly for questions or discussions related to Cassandra development.
- ``#cassandra-builds`` - results of automated test builds.

