Summer of Code projects for GNU

This page has the project suggestions for GNU's participation in Google Summer of Code 2018. (Project proposals for 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, and 2017 are archived.)

STUDENTS - BEFORE YOU SUBMIT YOUR PROJECT PROPOSAL:

Please read the GNU Project's guidelines for Summer of Code projects.

Most importantly, please make sure you include all the information requested. If you have questions, please ask summer-of-code@gnu.org (list info here).

Please note that you are not bound to use these ideas, you can propose a new project. It is a good idea to find a mentor and discuss the idea before submit it.


Project suggestions

GNU is a large and complex project, and thus is subdivided into packages, which are relatively independent projetcts. In Summer of Code, GNU acts as an umbrella organization for its packages. The ideas here are grouped by package. Many packages have more than one suggestion, or even their own ideas page.

Lilypond| Automake| CLISP| wget| Guix| Shepherd| Gnucap| Social| Taler| GNUnet| Kawa| GNUstep|


Links

Lilypond

LilyPond is a music engraving program devoted to producing the highest-quality sheet music possible. Users describe the music in a high-level text input format, which LilyPond processes to produce pdf, png, svg, and/or midi files. LilyPond is written in C++ and Guile (the GNU project’s Scheme interpreter), with Guile also serving as user-level extension language.

LilyPond maintains a list of GSoC project suggestions on http://lilypond.org/google-summer-of-code.html.

GNU Automake

GNU Automake is a Makefile generator for the GNU Build system. The generated Makefiles are portable and compliant with to GNU Makefile standards.

Parse Makefile.am using an Abstract Syntax Tree

When reading its input files automake doesn't clearly separate the parsing, semantic analysis, and code generation phases. This design does not help with the separation of concerns and makes the code hard to test. The objective of this project is to write a parser for Makefile.am files that generates an Abstract Syntax Tree (AST) That can be used independently of the Makefile.in files generation process.

Skills: Understanding of the classical compilation phases. Basic knowledge of Perl
Mentor: Mathieu Lirzin
Contact: automake@gnu.org

Modularize Automake to improve the test-suite performance

Currently automake is implemented as a monolithic Perl script with some modules for code shared with aclocal which is another script distributed with Automake. To ensure its practical correctness Automake provides a huge test-suite and requires every non-trivial bug-fix to be covered by an additional non-regression test. Unfortunately this whole test-suite is quite slow to run (~20-30 min) which makes it hard for maintainers to effectively use it, and is long enough to refrain users to run it. The main reason for this slowness is that almost all tests are integration/validation tests that touch the file system. A more effective approach would be to replace those with unit tests when possible. The objective of this project is to incrementally refactor the current implementation by decomposing it into modules and unit test those with Test::More.

Skills: Good understanding of the different testing strategies, Basic knowledge of Perl
Mentor: Mathieu Lirzin
Contact: automake@gnu.org

GNU CLISP

Common Lisp is a high-level, general-purpose, object-oriented, dynamic, functional programming language.
GNU CLISP is the GNU implementation of Common Lisp.

GNU CLISP maintains their list of ideas for GSOC in an external webpage: http://clisp.org/wanted.html.

GNU Wget

GNU Wget is a free software package for retrieving files using HTTP, HTTPS and FTP, the most widely-used Internet protocols. It is a non-interactive commandline tool, so it may easily be called from scripts, cron jobs, terminals without X-Windows support, etc. We are working on Wget2 as the next generation of Wget, Wget2 is a full rewrite which adds support for multithreading and HTTP/2.0. GNU Wget2 maintains its list of ideas and other GSoC related information on their GitLab Wiki: GNU Wget2 GSoC Information

GNU Guix

GNU Guix is the GNU package manager. GNU Guix provides state-of-the-art package management features such as transactional upgrades and roll-backs, reproducible build environments, unprivileged package management, and per-user profiles. It uses low-level mechanisms from the Nix package manager, but packages are defined as native Guile modules, using extensions to the Scheme language—which makes it nicely hackable.

It maintains their list of ideas for GSOC in an external webpage: https://libreplanet.org/wiki/Group:Guix/GSoC-2018

The GNU Shepherd

The GNU Daemon Shepherd or GNU Shepherd, formerly known as GNU dmd, is a service manager that looks after the herd of system services. It provides a replacement for the service-managing capabilities of SysV-init (or any other init) with a both powerful and beautiful dependency-based system with a convenient interface.

GNU Circuit Analysis Package

Gnucap is the Gnu Circuit Analysis Package. The primary component is a general purpose circuit simulator. It performs nonlinear dc and transient analyses, fourier analysis, and ac analysis. Spice compatible models for the MOSFET (level 1-8), BJT, and diode are included in this release.

Gnucap maintains their list of ideas for GSOC in an external webpage: http://gnucap.org/dokuwiki/doku.php?id=gnucap:projects.

Project ideas for the GNU Shepherd are kept in an external webpage alongside those for GNU Guix: https://libreplanet.org/wiki/Group:Guix/GSoC-2018

GNU Social

GNU Social is a social communication software for both public and private communications. It is widely supported and has a large userbase. It is already used by the Free Software Foundation.

Get (at least basic) ActivityPub support via a plugin into GNU Social

There are some architectural ideas/philosophies that make parts of AP hard to implement - the private message bits primarily. Supporting AP would be greatly benificial to the fediverse - especially when it comes to simplifying app/client development, since that's part of the spec and something OStatus does not cover.

Skills: Good understanding of PHP, being able to read someone else's code, being able to follow a comprehensive spec.
Mentor: None

Migrate GNU Social's database

Much desired large and tedious task.

Skills: Good understanding of PHP and SQL, being able to read someone else's code.
Mentor: None

GNU Taler

Store integration for Taler merchants

Implement Taler payment support for a free software web store, such as Magento(.com), oscommerce(.com), opencart(.com), spreecommerce(.com), prestashop(.com), virtuemart(.net), ubercart(.org) zeuscart(.com), afcommerce(.com), zen-cart(.com), simplecartjs(.com), or tomatocard(.com).

Difficulty: Easy
Required Skills: Depends on the web store used, likely PHP or Python
Mentors: Marcello Stanisci

User-centric improvements to the Taler wallet

Richard Stallman started a discussion on integrating subtle forms of financial management advice into the Taler wallet (http://taler.net) to help users manage their spending: http://lists.gnu.org/archive/html/taler/2017-01/msg00004.html http://lists.gnu.org/archive/html/taler/2017-01/msg00005.html We believe this would be a good introduction to the Taler wallet code base, at least the parts written in TypeScript and WebExtensions.

Difficulty: Easy
Required Skills: TypeScript, CSS
Mentors: Florian Dold, Christian Grothoff

GNU Taler Wallet for Android and/or iOS

The current wallet only supports integration with browsers that have the WebExtension API. The biggest part of the wallet's code base is plaform-agnostic and written in TypeScript.

The goal of this project is to add support for new platforms. Instead of starting from scratch, the existing code should be ported by using a framework such as React Native or Apache Cordova, which allows JS/HTML5 applications to run nearly like a native app. New code must be written for platform-specific integration.

Difficulty: Medium
Mentors: Florian Dold
Skills: Familiarity with JavaScript and the web platform are required, TypeScript and React Native / Apache Cordova are a plus.

Payment/Donation Buttons and Code-less Payments with GNU Taler

To accept payments with GNU Taler currently some custom (though simple!) code must be written to integrate with an existing web shop or frontend. The goal of this project is to create a component that sits between the seller's frontend and the GNU Taler merchant backend. This component should have a web interface, where payment buttons or payment forms can be configured that can by copy-pasted into the seller's frontend as static HTML/JS. Bonus goals are inventory management, where the seller can configure the available stock for an item, and will get notified when their stock runs low.

Difficulty: Easy
Mentors: Florian Dold
Skills: Familiarity with the web platform and at least one frontend language / framework (such as Python+Flask, Python+Django, nodejs, etc.) are required.

GNUnet

GNUnet is an alternative network stack for building secure, decentralized and privacy-preserving distributed applications. Our goal is to replace the old insecure Internet protocol stack. Starting from an application for secure publication of files, it has grown to include all kinds of basic protocol components and applications towards the creation of a GNU internet.

GNUnet maintains a list of ideas here: https://gnunet.org/gsoc.

Kawa

Kawa is best known as a fast Scheme implementation for the Java platform. It compiles Scheme to optimized Java bytecodes. It is also a general framework for implementing dynamic languages, and includes a full implementation of XQuery 1.0 and incomplete implementations of Common Lisp and Emacs Lisp (JEmacs).

Kawa maintains a list of ideas here: http://www.gnu.org/software/kawa/Ideas-and-tasks.html.
The following seem most suitable for GSoC:

Run interactive process in separate Java Virtual Machine:

When developing and testing it is useful for the REPL to support hot-swapping (replacing functions on-the-fly) and debugging. The main goal being able to smoothly reload changed modules (files or functions), and have other modules not break. Debugging (such as setting breakpoints) would not be a priority for this project, but could be a follow-on project.

Skills: Should be experienced with Java, and interested in learning about JVM TI and similar low-level parts of the platform.
Difficulty: Challenging, but you can study how Java-9's new jshell uses the JVM TI.
Mentors: Per Bothner and Jamison Hope

Typed/optimized arithmetic with units:

Kawa support units (such as cm^2 for square centimeters) and quantities (such as 4cm^2). The idea is define a syntax for type for a quantity with a specific unit, for example quantity[cm^2]. The compiler would type-check use of such types, and use them to generate primitive arithmetic.

Skills: Need good Java experience, and somewhat familiar with the Java Virtual Machine. You will need to become comfortable reading javap output.
Difficulty: Modest.
Mentors: Per Bothner and Jamison Hope

Easier access to native code using JNA/JNR:

The traditional way to access native (C/C++) functions is using JNI, but it's very awkward. JNA and JNR are much easier to use. This project would design and implement an easy-to-use Kawa wrapper for for JNR. You should study existing JNR wrappers, such as that for JRuby.

Difficulty: Medium. Need to study existing wrappers and "foreign function interfaces" (in multiple languages) and design one suitable for Kawa. Some Scheme (Kawa) experience would be helpful.
Mentors: Per Bothner and Jamison Hope

Improve IDE support:

There is some IDE support for Kawa, but it is old, incomplete, and/or poorly documented. One possible project would focus on research and documentation: evaluating options (using NetBeans, Eclipse, IntelliJ, or an Emacs package); seeing what if anything works (or can be made to work with modest effort); and documenting it. Alternatively, if you have a favorite IDE/Editor and want to learn how to extend it, you can focus on that.

Skills: Solid experience with Java and at least one IDE for the Java platform.
Difficulty: Modest. This can be very variable.
Mentors: Per Bothner and Jamison Hope

Update XQuery implementation:

Kawa includes a mostly complete implementation of the 1.0 version of XQuery, a functional language for working with XML and similar data. However, XQuery has added major feature since then, including grouping and updates. Adding some of these features to the Kawa-XQuery implementation would be desirable.

Skills: Comfortable with both Java and XML technologies. Interested in learning more about the latter.
Difficulty: Depends on what features you want to tackle.
Mentors: Per Bothner and Jamison Hope

Use MethodHandles and invokedynamic

Java-7's invokedynamic and MethodHandles were intended to improve the performance of dynamic languages. See JSR 292 and the Da Vinci Machine Project. Kawa makes very limited use of these, focusing on compile-time optimizations, but could do more. For example we can start by optimizing arithmetic when the types are unknown at compile-time. They could make implementing generic functions (multimethods) more efficient.

Skills: Very solid Java knowledge, and willing to learn and use complex APIs.
Difficulty: High.
Mentors: Per Bothner and Jamison Hope

Contact: kawa@sourceware.org

GNUstep

GNUstep is a console, desktop and web application development framework for development using Objective-C. It is based on OPENSTEP specification, and is today interested in achieving compatibility with Apple's Cocoa set of frameworks. GNUstep consists of gnustep-base (classes for strings, arrays, dictionaries, timers, sockets, et al), gnustep-gui (classes for windows, buttons, textboxes, et al), gnustep-make (a build system) as well as an assortment of development utilities and bonus libraries.

In addition you can find more ideas on this page: http://wiki.gnustep.org/index.php/Summer_Of_Code_Ideas

There is also a wishlist for new apps on GNUstep's wiki.

Note that the GNUstep project is open to other ideas from students. Please contact them if you have any to discuss the idea and find a mentor.

Contact: discuss-gnustep@gnu.org, gnustep-dev@gnu.org

Improve Core Animation implementation and integrate it into AppKit

During summer of code 2012, Core Animation has been implemented for GNUstep. During summer of code 2013, Core Graphics backend has been implemented for GNUstep using our library Opal. In order to improve compatibility with Cocoa, as well as make it easier to implement modern-looking applications for GNUstep, a student should integrate CALayer with NSView and improve Core Animation where required.

This would also make it possible to use Chameleon, an implementation of UIKit, with GNUstep.

Required Skills:Good understanding of Objective-C (language syntax and behavior), especially pre-Automatic Reference Counting. Excellent understanding of Foundation and its concepts such as key-value coding. Decent understanding of and some experience with OpenGL. Decent understanding of AppKit.
Preferred Skills: Some experience with building and installing GNUstep
Difficulty: Medium
Mentor: Ivan Vučica

Improve Core Animation implementation and implement UIKit

During summer of code 2012, Core Animation has been implemented for GNUstep. During summer of code 2013, Core Graphics backend has been implemented for GNUstep using our library Opal. In order to attract more developers to free platforms, as well as expand availability of touch-enabled applications, a student should create a UIKit-compatible user interface library and improve Core Animation implementation where necessary.

Required Skills:Good understanding of Objective-C (language syntax and behavior), especially pre-Automatic Reference Counting. Excellent understanding of Foundation and its concepts such as key-value coding. Decent understanding of and some experience with OpenGL. Excellent understanding of UIKit and the underlying architecture.
Difficulty:Hard
Mentor:Ivan Vučica

Port WebKit

Running WebKit on top of GNUstep will solve a lack of a modern web view on the framework's stack as well as contribute to parity with macOS within the project.

As of 2018, a recent revision of WebKit has been successfully built with GNUstep libraries on Arch Linux + clang + libobjc2. JavaScriptCore (WebKit's JavaScript engine) is mostly functional; WebCore and WebKitLegacy.framework are built but a sample browser still crashes. This has been possible through a series of additions to GNUstep as well as some patches to WebKit. For more details, see 2017's project.

The work ahead involves a *lot* of debugging and implementation of Foundation/CoreFoundation/CoreGraphics/QuartzCore functions to support this.

Difficulty: Very High
Experience needed: Expert at C/C++/Objective-C, Runtime and Core* Apple libraries. Debugging skills (e.g. gdb usage) are also highly recommended.
Mentor: Daniel Ferreira

Other links:

Google SoC Page.