# Melange, the Spice of Creation

## What is Melange?

Melange is the combination of a [framework](SoCOverview.md) and multiple web
applications (including [GSoC](GSoC.md) and [GHOP](GHOP.md)) implemented to be
[deployed on Google App Engine](AppEngine.md).

### Replacing the GSoC web application

Originally, Melange was envisioned as an effort to produce an
open-source implementation of the [Google Summer of Code](GSoC.md)<sup>TM</sup> web
application.  At first, the GSoC web application appears to be part
[content management system](http://en.wikipedia.org/wiki/Content_management_system),
part
[issue tracking system](http://en.wikipedia.org/wiki/Ticketing_system),
and part
[customer relationship manager](http://en.wikipedia.org/wiki/Customer_relationship_management).

But, while the GSoC web application shares some features in common with
those systems, it is quite different in its purpose.  The purpose of GSoC
(which is facilitiated by the web application) is to serve as a catalyst
for introducing college students to open source and free software
communities, in the hopes that these students would find a homes in those
communities and thrive.  To that end, the GSoC web application tends to
be more specific and less general than existing systems like those
mentioned previously.

As much as GSoC attempts to inspire new open source developers, it has not
previously been able to actually embrace them in the development of the
GSoC web application itself.  Initially, with the launch of the enabling
[Google App Engine](http://code.google.com/appengine/), the plan was to create
an open-sourced GSoC web application.  It would have to be created from
scratch, because the existing code is (unfortunately) wired directly to
Google infrastructure interfaces, which are old enough to be quite
unlike AppEngine.

The [Open Source Programs Office (OSPO)](http://code.google.com/opensource/)
at Google believes in promoting the release of Google source code under
open source licenses.  [Google Summer of Code](GSoC.md)<sup>TM</sup> is a major
program for the OSPO team.  So, it makes sense for the OSPO team to
develop the GSoC web application as open source and in the open.  And,
now that hosting infrastructure with Google scalability is available
via AppEngine, we intend to do just that.

### Moving beyond the GSoC web application

It seems there are other real-world programs and sponsors that are
interested in a workflow similar to that found in the GSoC web
application.  In order to take advantage of hosting on AppEngine,
the existing GSoC web application needs to be rewritten from scratch.
Given that necessity, _now_ seems like the ideal time involve the
community of users (mentors, students, and organization administrators)
of the existing web application in the creation of something that can
be used not just by Google, but by anyone, to host programs like the
[GSoC](GSoC.md) and [GHOP](GHOP.md), to the continued benefit of open source
and free software.

So, the goal of this project is not merely to open-source the GSoC web
application, but to create a framework for representing open source and
free software contribution workflows. Using this framework, and copying
and modifying the Melange web applications built upon it, it should be
possible for anyone to host future programs similar to
[GSoC](GSoC.md) and the
[Google Highly Open Participation](GHOP.md)<sup>TM</sup> Contest) on the
[Google App Engine](http://code.google.com/appengine/).

This project will be a success if these real-world programs continue
to bring students and other open source and free software contributors
together with existing open source and free software organizations.
As previous years of _Google Summer of Code_ have shown, the open source
and free software communities benefit greatly from the catalyst for
development that these programs provide.

### Building a community to help open source and free software build theirs

This project is not just about code.  It is about forming a thriving
community. The results of the Melange project will not be
[thrown over the wall or worked on in secret](http://www.youtube.com/watch?v=ZtYJoatnHb8),
with only occasional releases and annual sponsorship of
_Google Summer of Code_ programs. Instead, we will actively engage the
open source and free software community to continue to make these
programs, and the web applications that make them possible, better and
more effective at welcoming new contributors to the community.

### Contributing

To expand the usefulness of the fruits of this development effort, we
seek suggestions, guidance, and contributions (in the form of source
code, of course!) from the open source and free software community.
Please see the [guidelines for contributors](ContributionTerms.md) if you are
interested in contributing to the design and development of Melange and
the [SoC framework](SoCOverview.md).

### Concept Diagram

[![](http://soc.googlecode.com/svn/wiki/images/MelangeOverview.dot.png)](http://soc.googlecode.com/svn/wiki/images/MelangeOverview.dot)

## Legend

| **-------** | direct dependency (inheritance, method call, etc.) |
|:------------|:---------------------------------------------------|
| **- - - -** | indirect dependency (call-back, etc.)              |


---

_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/)