#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, Python, HTML and CSS

*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.