# Fuchsia Code of Conduct

Google and the Fuchsia team are committed to preserving and fostering a diverse,
welcoming community. Below is our community code of conduct, which applies to
our repos and organizations, mailing lists, blog content, IRC channel and any
other Fuchsia-supported communication group, as well as any private
communication initiated in the context of these spaces.
Simply put, community discussions should be the following:

 * Respectful and kind
 * About Fuchsia
 * About features and code, not the individuals involved

## Be respectful and constructive

Treat everyone with respect. Build on each other's ideas. Each of us has the
right to enjoy our experience and participate without fear of harassment,
discrimination, or condescension, whether blatant or subtle. Remember that
Fuchsia is a geographically distributed team and that you may not be
communicating with someone in their primary language. We all get frustrated
when working on hard problems, but we cannot allow that frustration to turn
into personal attacks.

## Speak up if you see or hear something

You are empowered to politely engage when you feel that you or others are
disrespected. The person making you feel uncomfortable may not be aware of what
they are doing. Politely bringing their behavior to their attention is
encouraged.

If you are uncomfortable speaking up, or feel that your concerns are not being
duly considered, you can email <community-managers@fuchsia.dev>  to request
involvement from a community manager. All concerns shared with community
managers will be kept confidential, but you may also submit an anonymous report
[here](https://goo.gl/forms/xgisUdowrEWrYgui2). Please note that without a way
to contact you, an anonymous report may be difficult to act on. You may also
create a throwaway account to report. In cases where a public response is deemed
necessary, the identities of victims and reporters will remain confidential
unless those individuals instruct us otherwise.

While all reports will be taken seriously, the Fuchsia community managers may
not act on complaints that they feel are not violations of this code of
conduct.

## Harassment is not tolerated

Harassment is not tolerated, including, but not limited to the
following:

 * Harassing comments
 * Intimidation
 * Encouraging a person to engage in self-harm
 * Sustained disruption or derailing of threads, channels, lists, and similar
   forums
 * Offensive or violent comments, jokes, or otherwise
 * Inappropriate sexual content
 * Unwelcome sexual or otherwise aggressive attention
 * Continued one-on-one communication after requests to cease
 * Distribution or threat of distribution of people's personally identifying
   information, also known as “doxing”

## Consequences for failing to comply with this policy

Consequences for failing to comply with this policy may include any of the
following, at the sole discretion of the Fuchsia community managers:

 * A request for an apology
 * A private or public warning or reprimand
 * A temporary ban from the mailing list, blog, Fuchsia repository or
   organization, or other Fuchsia-supported communication group, including
   loss of committer status
 * A permanent ban from any of the above, or from all current and future
   Fuchsia-supported or Google-supported communities, including loss of
   committer status.

Participants warned to stop any harassing behavior are expected to comply
immediately. Failure to do so will result in an escalation of consequences.
The decisions of the Fuchsia community managers may be appealed at
<community-managers@fuchsia.dev>.

## Acknowledgements

This Code of Conduct is adapted from the
[Chromium Code of Conduct](https://chromium.googlesource.com/chromium/src/+/HEAD/CODE_OF_CONDUCT.md),
based on the Geek Feminism Code of Conduct,
the Django Code of Conduct,
and the Geek Feminism Wiki,
["Effective codes of conduct" guide](https://geekfeminism.wikia.org/wiki/Code_of_conduct_evaluations).

## License

This Code of Conduct is available for reuse under the Creative Commons Zero
(CC0) license.
