# Melange, the Spice of Creation

## Melange has been retired

Melange has been retired.  See
[this blog post](http://google-opensource.blogspot.com/2016/03/goodnight-melange.html)
for details.

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