#summary Ideas List for GSoC 2014
#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:

== Parameterized Layout ==

Isn't it a bummer that the homepage for Google Summer of Code 2014 looks almost exactly the same as the homepage for GSoC 2013? And 2012, and 2011? We'd like to afford programs greater freedom in their graphic presentation on Melange. To do that, we'll need to support multiple program presentations, and support programs choosing one presentation over another. We'll also need to make decisions about how much a program's graphic presentation can be made customizable versus how much must be programmatically fixed.

*Captured Issues: <a href="https://code.google.com/p/soc/issues/detail?id=1615">1615</a>, <a href="https://code.google.com/p/soc/issues/detail?id=1616">1616</a>.

*Relevant Skills:* Python, App Engine, HTML, CSS, Javascript, LESS

*Probable Mentor:* Nathaniel Manista, Mario Ferraro

== Responsive Layout  ==

Isn't it a bummer that Melange's pages don't fit on your phone's screen? Modern web sites are written with the entire ecosystem of web-enabled devices in mind and cooperate with the user's device toward the goal of best displaying themselves on the screen available to them. Melange should too.

*Captured Issues: <a href="https://code.google.com/p/soc/issues/detail?id=1516">1516</a>.

*Relevant Skills:* HTML, CSS, Javascript, LESS

*Probable Mentor:* Nathaniel Manista, Mario Ferraro

== Javascript Tests == 

Melange has a great deal of Javascript code that needs to be 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

== Resource Hosting ==

Running a program on Melange involves distributing a lot of documents and serving a lot of content - from user images to translated contest rules and everything in between. Melange doesn't yet have a subsystem that makes resource ingestion, hosting, and distribution easy for both users and feature developers. It should.

*Captured Issues: <a href="https://code.google.com/p/soc/issues/detail?id=1672">1672</a>, <a href="https://code.google.com/p/soc/issues/detail?id=1874">1874</a>.

*Relevant Skills:* App Engine, Python

*Probable Mentor:* Nathaniel Manista, Daniel Hans

== Student Flow ==

On Melange, signing up as a student and applying for summer projects is harder than it should be. We would love to see a student project focused on making the whole process easier.

*Captured Issues: <a href="https://code.google.com/p/soc/issues/detail?id=1530">1530</a>, <a href="https://code.google.com/p/soc/issues/detail?id=1759">1759</a>, <a href="https://code.google.com/p/soc/issues/detail?id=1816">1816</a>.

*Relevant Skills:* Javascript, Python, HTML and CSS

*Probable Mentor:* Nathaniel Manista, Madhusudan C.S., Daniel Hans

== Mentor Flow ==

On Melange, participating as a mentor is harder than it should be. We would love to see a student project focused on making the mentor experience better.

*Captured Issues: <a href="https://code.google.com/p/soc/issues/detail?id=515">515</a>, <a href="https://code.google.com/p/soc/issues/detail?id=1216">1216</a>, <a href="https://code.google.com/p/soc/issues/detail?id=1240">1240</a>, <a href="https://code.google.com/p/soc/issues/detail?id=1306">1306</a>, <a href="https://code.google.com/p/soc/issues/detail?id=1496">1496</a>, <a href="https://code.google.com/p/soc/issues/detail?id=1524">1524</a>, <a href="https://code.google.com/p/soc/issues/detail?id=1525">1525</a>, <a href="https://code.google.com/p/soc/issues/detail?id=1541">1541</a>, <a href="https://code.google.com/p/soc/issues/detail?id=1701">1701</a>, <a href="https://code.google.com/p/soc/issues/detail?id=1788">1788</a>, <a href="https://code.google.com/p/soc/issues/detail?id=1850">1850</a>.

*Relevant Skills:* Python, HTML, Javascript, CSS

*Probable Mentor:* Nathaniel Manista, Daniel Hans, Madhusudan C.S.

== Renovate Our Test Data Seeder ==

Melange uses a test data seeder to generate fake program data for both its test suite and for use during development. Our old test data seeder has proven somewhat hard to work with and has broken several times during recent changes because it itself is not covered by our tests. Our long-term goal is to run several Melange programs inside our test suite, and we would be excited to receive student proposals that would move us toward that objective by affording us an updated, more usable, and more maintainable data seeder.

*Relevant Skills:* Python, App Engine

*Probable Mentor:* Nathaniel Manista, Daniel Hans, Chong Liu (Leo), Madhusudan C.S.

== Port Melange to AMD == 

Currently Melange is using <a href="http://labjs.com/">LABjs</a> to asynchronously load all JS files, using an home-made <a href="https://code.google.com/p/soc/source/browse/app/soc/content/js/melange.dependency.js">dependency system</a>. LABjs, however, is now deprecated. We would like to port our JS loading to use AMD and, specifically, <a href="http://requirejs.org/">RequireJS</a>. That would also give an easier way to automatically scrape dependencies and, eventually, using <a href="http://gruntjs.com/">grunt</a> (which we have already integrated into the code base), compile and concatenate all our JS at runtime.

*Captured Issue: <a href="https://code.google.com/p/soc/issues/detail?id=1748">1748</a>

*Relevant Skills:* Javascript

*Probable Mentor:* Mario Ferraro

= 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> and work through our GettingStarted guide. We've created a special <a href="https://code.google.com/p/soc/issues/list?q=label:Bienvenue">"Bienvenue" label in our issue tracker</a> for issues that we think are particularly good places for new contributors to Melange to make a small, independent change as a first contribution.