<!--

    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.

-->

## Where to Find Us

As an Apache project, we are using mailing list, JIRA, and Github Issues to obtain the feedback of users. We also have a Twitter account.

* Mailing list: dev@iotdb.apache.org.

    * The mailing list is used for both user feedback and developer discussion.
    * Follow method: Send an email to dev-subscribe@iotdb.apache.org with the email you want to 
    receive the email, the subject content is not limited, after receiving the reply, send a 
    confirmation email to the confirmation address again (the confirmation address is longer, 
    it is recommended  gmail mailbox).

* JIRA issue: https://issues.apache.org/jira/projects/IOTDB/issues

* Github issue: https://github.com/apache/iotdb/issues

* Twitter: https://twitter.com/apacheiotdb

* For Chinese users, we have a QQ Group: 659990460.
  
* We look forward to you sharing the experience of using IoTDB: [Survey](https://github.com/apache/iotdb/issues/748)

* For Chinese users, we have a Wechat Public Account. For more details, read [交流](../zh/Community/Feedback.md)

* For Chinese users，we have a DingTalk Group. For more details, read [交流](../zh/Community/Feedback.md)



IoTDB community will host Meetups aperiodically, the information can be found in our mailing list and [Meetup List](Materials.md)