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

# Communication Channels

Apache IoTDB engages with users and developers through multiple channels, ensuring open communication and community participation. Below are the ways you can interact with us, get support, and contribute to the project.

## 1. Mailing Lists

The mailing list is Apache's designated channel for communication among open-source contributors. It serves as the primary platform for discussing community plans, roadmaps, and announcements.

- Guide to Subscribing：

  - To Subscribe: Send an email to <dev-subscribe@iotdb.apache.org>. The subject of the email does not matter.

  - To Confirm Subscription: After the initial subscription email, you will receive a confirmation email from an address ending in `iotdb.apache.org`. Simply reply to this email without changing the subject to complete your subscription.

- Other Mailing Lists:

  - JIRA Notifications: <notifications@iotdb.apache.org> (receives all JIRA notifications. You don't need to subscribe if you're only interested in specific JIRA issues; just follow or comment on the issue directly.)
  - Code Commit Notifications: <commits@iotdb.apache.org> (notifies all code changes. This list receives a high volume of emails.)
  - Code Review Notifications: <reviews@iotdb.apache.org> (notifies all code review comments. This list also receives a high volume of emails.)

## 2. GitHub

For reporting issues, suggesting improvements, or discussing code changes: [GitHub Issues](https://github.com/apache/iotdb/issues)

## 3. JIRA

For task management such as new feature improvements and bug fixes: [JIRA Issues](https://issues.apache.org/jira/projects/IOTDB/issues)

To participate, create a JIRA account for task management and a Confluence account for collaborative document creation. Once your accounts are set up, introduce yourself via the mailing list including your JIRA and Confluence IDs. The community PMC will grant the necessary permissions.

## 4. Slack

For real-time communication with the international community: [Join Apache IoTDB Slack Workspace](https://apacheiotdb.slack.com/)

## 5. X (Twitter)

Follow us for updates and community news: @apacheiotdb

## 6. LinkedIn

Follow us for updates and community news: [Apache IoTDB LinkedIn](https://www.linkedin.com/company/apache-iotdb)

## 7. Chinese Local Channels

Since there are a number of Chinese developers in the Apache IoTDB community, they have several local channels for communication:

- Wechat Official Pages: subscribe to "Apache IoTDB"
- Wechat Chat Group: contact "apache_iotdb"
- QQ Chat Group: join chat group 659990460
