The [Melange](MelangeIntro.md) community uses some mailing lists as the
primary method of communication.  Our goal is to use these mailing lists
to support the development of the [SoC framework](SoCOverview.md) and
Melange web applications, and to assist the organizations
and users that rely on that framework to participate in programs such
as [Google Summer of Code](GSoC.md) <sup>TM</sup>.  Our guidelines for using these
mailing lists have been written with this goal in mind.  Like the other
guidelines related to participating in the Melange project, the Melange
contributors, in cooperation with the community at large, will update
these guidelines as needed.

We encourage participation on these mailing lists, but we also ask that
participants treat each other with mutual respect and remember that the
ultimate goal is to promote the development and use of open source and
free software.

These mailing lists are hosted on [Google Groups](http://groups.google.com)
and share some common access settings.

"Project owners" of the [SoC project](http://code.google.com/p/soc/) hosted on
[Google Code](http://code.google.com) are, by default (unless they decline),
made owners of all Google Groups used by the Melange project.  Similarly,
"project members" are, by default (again, unless they decline), made
managers of both of these Google Groups.

Group content (mailing list archives and discussions) can be viewed by
the public at large on all of Melange lists.  To help prevent list spam, only
actual group members can post to the mailing lists and discussions.  To
prevent email spam, only owners and managers can view the corresponding
Google Groups membership lists.

Due to lack of revision control in Google Groups, the Google Code wiki
is preferred for all documentation, and `svn` for files (usually, but
not necessarily, source code).  The Pages and Files sections of the
Google Groups used by the Melange project have been disabled and will not
be used.

## General discussion list

The primary mailing list used by the Melange project is the `melange-soc`
[discussion mailing list](http://groups.google.com/group/melange-soc).

To post to the mailing list, membership is required, but normal group
membership (with the limitations described above) is not restricted and
is open to anyone.  To sign up, visit http://groups.google.com/group/melange-soc

## Developer list

The mailing list used for development discussions (such as
[code reviews](ContributionReviews#Code_reviews.md)) is the `melange-soc-dev`
[developer mailing list](http://groups.google.com/group/melange-soc-dev).

Please keep in mind that this list is intended for current and potential
contributors to the Melange project, not for reporting issues or making
feature requests.  (Issues can be reported and new
features requested using the
[issue tracker](http://code.google.com/p/soc/issues/list) on
[Google Code](http://code.google.com/)).  Participation on this developer
mailing list (and in the
[IRC channel](IrcChannelGuidelines.md)) is the "gateway" to earning commit
access in the SoC project hosted on [Google Code](http://code.google.com/).

## Issues list

The mailing list used by the `soc@googlecode.com` account on
[Google Code](http://code.google.com/)
when comments are made in the
[issue tracker](http://code.google.com/p/soc/issues/list)
and on
[wiki pages](http://code.google.com/p/soc/wiki)
is the `melange-soc-issues`
[issues mailing list](http://groups.google.com/group/melange-soc-issues).

This list should probably be treated mostly as an "announcement" list,
since any discussion carried on using the mailing list, instead of in
the issue tracker or wiki comments systems, will not be recorded back
on Google Code.  This leaves someone reading the issue or wiki comments
via Google Code web interface with an incomplete picture.  That being
said, the community will use this mailing list whichever way works
best, and people can always venture over to the `melange-soc-issues`
[Google Group](http://groups.google.com/group/melange-soc-issues)
to see what they are missing.

Please use the
[Melange project issue tracker](http://code.google.com/p/soc/issues/list) on
[Google Code](http://code.google.com/) to report new issues or make feature
requests, instead of the mailing lists.

## Commits list

The mailing list used for SVN commit messages sent out by the
`soc@googlecode.com` account on
[Google Code](http://code.google.com/) is the `melange-soc-commits`
[svn commits mailing list](http://groups.google.com/group/melange-soc-commits).

Please consider forwarding any replies you might have to a commit
message to the original `melange-soc-dev`
[developer mailing list](MailingListsGuidelines#Developer_list.md)
instead of this list, so that discussions can take place there, in
front of a wider audience. This mailing list exists by request,
merely to make filtering and sorting of `svn commit` noise easier.

Please use the
[Melange project issue tracker](http://code.google.com/p/soc/issues/list) on
[Google Code](http://code.google.com/) to report issues or make feature requests,
instead of the mailing lists.

## Build list

The mailing list used for discussing passing and failing tests and other build health issues is the `melange-soc-build` [build health mailing list](http://groups.google.com/group/melange-soc-build).

## Abuse

List owners and managers reserve the right to decide what constitutes
abuse on the [Google Groups](http://groups.google.com) mailing lists used by
the Melange project.  While spirited debate is encouraged in order to
stimulate creativity and produce web applications of which we can all
be proud, list participants are expected to respect the fellow list
participants and the Melange community guidelines.


---

_Copyright 2008 Google Inc._
_This work is licensed under a_
[Creative Commons Attribution 2.5 License](http://soc.googlecode.com/svn/wiki/html/licenses/cc-by-attribution-2_5.html).
[![](http://soc.googlecode.com/svn/wiki/html/licenses/cc-by-2_5-88x31.png)](http://creativecommons.org/licenses/by/2.5/)