# How to Contribute to Google Home UI Automator

We'd love to accept your patches and contributions to Google Home UI Automator.

## Table of contents

*   [General information](#general-information)
    *   [Contributor License Agreement](#contributor-license-agreement)
    *   [Code reviews](#code-reviews)
    *   [Community guidelines](#community-guidelines)
*   [Contributor workflow](#contributor-workflow)

## General information

### Contributor License Agreement

Contributions to this project must be accompanied by a Contributor License
Agreement. You (or your employer) retain the copyright to your contribution;
this simply gives us permission to use and redistribute your contributions as
part of the project. Head over to <https://cla.developers.google.com/> to see
your current agreements on file or to sign a new one.

You generally only need to submit a CLA once, so if you've already submitted one
(even if it was for a different project), you probably don't need to submit
another one.

### Code reviews

All submissions, including submissions by project members, require review.

### Community guidelines

This project follows [Google's Open Source Community Guidelines](https://opensource.google/conduct/).

## Contributor workflow

We are happy to accept contributions and guide you through the process. \
The contributor workflow has not been fully ironed out yet, so make sure to
start by sending an email to google-home-testsuite+ui-automator@google.com
with an outline of your planned change. \
We will review your proposal and advise on the next steps you will need to take.

