<!--

    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.

-->

## Powered By

### Project and Product names using "IoTDB"

Organizations creating products and projects using Apache IoTDB, along with associated marketing materials, should take care to respect the trademark in “Apache IoTDB” and its logo. Please refer to [ASF Trademarks Guidance](https://www.apache.org/foundation/marks/) and associated [FAQ](https://www.apache.org/foundation/marks/faq/) for comprehensive and authoritative guidance on proper usage of ASF trademarks.
It is recommended to not include “IoTDB” in any names to prevent potential trademark issue with the IoTDB project.
As an example, names like “IoTDB BigDataProduct” should not be used, as the name include “IoTDB” in general. The above links, however, describe some exceptions, like for names such as “BigDataProduct, powered by Apache IoTDB” or “BigDataProduct for Apache IoTDB”. In summary, any names contain "Apache IoTDB" as a whole are acceptable.  
A common practice you can take is to create software identifiers (Maven coordinates, module names, etc.) like “iotdb-tool”. These are permitted. Nominative use of trademarks in descriptions is also allowed, as in “BigDataProduct is a subproduct for Apache IoTDB”.

### Companies and Organizations
To add yourself to the list, please email dev@iotdb.apache.org with your organization name, URL, a list of IoTDB components you are using, and a short description of your use case.

You can also leave the info on [Github](https://github.com/apache/iotdb/discussions/4040).

- School of Software (Tsinghua University), and National Engineering Laboratery for Big Data Software  that initially launched IoTDB  
  - We have both graduate students and a team of professional software engineers working on the stack
  - We use Apache IoTDB in Shanghai Metro and two other cities in China to replace KairosDB.
  - We use Apache IoTDB in CMA (China Meteorological Administration) for storing 10-years station data. There are about 100 thousand stations.

- Lenovo developed 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 uses Apache IoTDB to manage the wind turbine data. They consume the SCADA data from Kafka, write to IoTDB and use IoTDB to support queries.

- DaTangXianYi deployed IoTDB in many power stations in China.
 
- Beijing ZhiChuangXinKe uses IoTDB to store the battery data of signal towers for China Tower company. There are about 3 million towers.

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

- JianLongGangTie is testing IoTDB for using it in their applications.
 
