# How to Contribute

We'd love to accept your patches and contributions to this project. There are
just a few small guidelines you need to follow.

## New Features/Libraries

Before contributing large new features and/or libraries please start a discussion 
with us first via GitHub Issues and check that we can support it.
We are unable to support all new features, even though we wish we could! If we 
are unable to support adding your feature, we always encourage you to open source it 
in your own repository to help the Compose community grow.

## 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 do it
again.

## Code Reviews

All submissions, including submissions by project members, require review. We
use GitHub pull requests for this purpose. Consult
[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
information on using pull requests.

## API Changes

If you are changing any public APIs, you need to run `./gradlew metalavaGenerateSignatureRelease` which will 
update the API signatures.

## Formatting 

To apply formatting, we use spotless. Run `./gradlew :pager:spotlessApply` to format the code according 
to the spec.
