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

# Community Partners

## Usage of the term "IoTDB" in projects and product names:

Apache IoTDB, Apache, the Apache feather logo, and the Apache IoTDB project logo are trademarks of The Apache Software Foundation.

Organizations developing products and projects with Apache IoTDB and creating associated marketing materials should adhere to the trademark guidelines for "Apache IoTDB" and its logo. For comprehensive and authoritative guidance on correct trademark usage, please refer to the [ASF Trademarks Guidance](https://www.apache.org/foundation/marks/) and associated [FAQ](https://www.apache.org/foundation/marks/faq/).
It is recommended not to include “IoTDB” in any name to prevent potential trademark issues with the IoTDB project.

To avoid potential trademark issues, it is advised not to include "IoTDB" directly in any product names. For instance, "IoTDB BigDataProduct" is inappropriate because it contains "IoTDB." However, exceptions such as "BigDataProduct, powered by Apache IoTDB" or "BigDataProduct for Apache IoTDB" are acceptable, as they incorporate the full "Apache IoTDB" name. For software identifiers like Maven coordinates or module names, using formats like "iotdb-tool" is permissible. Nominative use of trademarks in descriptions is also allowed, e.g., "BigDataProduct is a submodule for Apache IoTDB".

## Companies and Organizations

To join the list, please send an email to dev@iotdb.apache.org with your organization's name, URL, a list of IoTDB components you are using, and a brief description of your use case.

Alternatively, you may leave your information on [Github](https://github.com/apache/iotdb/discussions/4040).

- School of Software (Tsinghua University), and National Engineering Laboratory for Big Data Software originally launched IoTDB

  - Their team, comprising both graduate students and professional software engineers, actively develops IoTDB.
  - They utilize Apache IoTDB in the metro systems in 3 Chinese cities (e.g. Shanghai Metro), replacing KairosDB.
  - Apache IoTDB stores decade-long data from over 100,000 stations for the China Meteorological Administration (CMA).

- Lenovo developed the TsFile Go version, and uses it in YOFC (Yangtze Optical Fiber and Cable Company). The system collects data from more than 90 thousand data points, stores them to the TsFile (with Go) as the edge storage and then reads them later to send to the cloud.

- Goldwind Science & Technology manages wind turbine data with Apache IoTDB, processing SCADA data from Kafka, storing it in IoTDB, and supporting various queries.

- DaTangXianYi Technology has deployed IoTDB across numerous power stations in China.

- China Tower Corporation Limited uses IoTDB to store the battery data of about 2 million signal towers.

- Beijing Qingzhi IoT Technology uses IoTDB for electric generator's monitoring. Currently they look forward to the cluster mode of IoTDB.

- JianLong Steel is testing IoTDB for using it in their applications.

## Commercial Support

As with other Apache projects, Apache IoTDB is freely available. While community support is also free, there are no service-level-agreements, guaranteed reaction times or guarantee that an issue will be addressed.

For organizations needing higher levels of availability and technical support, the following entities have commercial support offerings:

### Partners

| <div style="width:100px;">Cooperative Partners </div> |            Link             | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| :---------------------------------------------------: | :-------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|        School of Software, Tsinghua University        |  https://github.com/thulab  | School of Software at Tsinghua University has initiated IoTDB and contributed it to the Apache Software Foundation. The professionals and software engineers continue to contribute significantly to the project through ongoing development and community support.                                                                                                                                                                                                                          |
|                        Timecho                        |  https://www.timecho.com/   | Timecho is one of the principal contributors to Apache IoTDB, with several IoTDB PMC members and Apache board members on its team. The company is dedicated to providing time-series data solutions that maximize the value of time-series data while maintaining manageable costs. Timecho offers TimechoDB, an enterprise-level product based on Apache IoTDB, along with a suite of enterprise tools, technical support, deployment, training, data integration, and customized services. |
|                          IGS                          | https://www.igsl-group.com/ | Exclusive reseller of TimechoDB, the enterprise edition of Apache IoTDB, in Hong Kong.                                                                                                                                                                                                                                                                                                                                                                                                       |

### Product Inquiries

For more information on the commercial support offerings, visit [Products](https://www.timecho-global.com/product) .
