#summary Ideas List for GSoC 2013
#labels Importance-Useful,Featured

*Melange* is the software that powers Google Summer of Code. If improving the way that Google Summer of Code is run as your Google Summer of Code project sounds attractively recursive, please read on!

= Ideas! =

We welcome your ideas, whatever they might be for Melange - but here are a few of our own for what we think might be good student summer projects:

== Developer Workflow Improvements ==

In the last year Melange has gotten serious about mature software development practices, but our work in this area is far from complete. A project oriented around developer workflow would involve removing derived assets from source control, making derivation of those derived assets part of our build process, and running static analysis tools such as lint and documentation extraction over our source code.

*Relevant Skills:* Python, <a href="http://www.buildout.org/">Buildout</a>

*Probable Mentor:* Nathaniel Manista

== Integration of Summer of Code's "Connections" subsystem with Code-in. ==

Melange recently gained a "Connections" subsystem for building relationships between participants, but Connections is only integrated with Summer of Code, one of the two programs that Melange powers. Empowering Code-in with Connections would be a suitable student effort.

*Relevant Skills:* Python, HTML

*Probable Mentor:* _undecided_

== Javascript Tests == 

Melange has a great deal of Javascript code that needs to be extracted from templates and other hiding holes, refined, and tested.
We already have a testing architecture in place (using Testem, Jasmine, PhantomJS) but we need to start writing tests.

*Relevant Skills:* Javascript

*Probable Mentor:* Mario Ferraro (Merio on #melange)

== Javascript List Enhancements ==

Our current lists are always asynchronous and load some time after the page on which they are displayed is loaded. They should be enhanced to be able to be included in the page and viewed statically when as the server deems appropriate. This work would cover both client and server domains and would make use of Javascript, Python, HTML and CSS.

*Relevant Skills:* Javascript

*Probable Mentor:* Mario Ferraro (Merio on #melange)

== Functional Tests ==

Functional tests verify the complete and fully integrated functioning of the entire Melange system and are phrased in approachable language stated in terms of user experience. Melange has far too few.

*Relevant Skills:* Python, HTML, Bash

*Probable Mentor:* Chong Liu

== Enhanced Registration Workflow ==

Registering for Melange is too hard and requires too much developer and administrator intervention. This user experience can be greatly smoothed!

*Relevant Skills:* Python, HTML, CSS

*Probable Mentor:* _undecided_

== Messaging System ==

Melange has a need to proxy messages between participants (because Code-in participants are minors who may not be able to reveal their email addresses). Melange should be able to mediate communication between all program participants regardless of constraints about physical location and email availability.

*Relevant Skills:* Python, App Engine

*Probable Mentor:* Daniel Hans

= Orientation =

We would like our prospective students to propose new project ideas and discuss with Melange developers either here (in comments), #melange on freenode.net, or via our mailing list melange-soc-dev@googlegroups.com. 

Every student is encouraged to clone our <a href="http://code.google.com/p/soc/source/checkout>git repository</a>, solve <a href="http://code.google.com/p/soc/issues/list">issues</a> and submit patches as part of the application process. <a href="http://code.google.com/p/soc/wiki/GettingStarted">Here</a> is our getting started guide.