.. 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 :ref:`Slack rooms <slack>`.

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

.. _slack:

Slack
-----
To chat with developers or users in real-time, join our rooms on `ASF Slack <https://s.apache.org/slack-invite>`__:

- ``cassandra`` - for user questions and general discussions.
- ``cassandra-dev`` - strictly for questions or discussions related to Cassandra development.

