This is an old revision of the document!


GSoC 2016 Ideas

See also: Information about GSoC, for our student expectations, proposals guidelines and more.

List of mentors:

Email address
benwaffle
dvor
grayhatter grayhatter@tox.chat
iphy iphydf@gmail.com
irungentoo
JX7P
mannol mannol@tox.chat
wiiaam
stal
zero-one
zetok

Idea template

Use the following template for adding your own ideas.

Create a project header if there isn't one already and add your ideas under the corresponding project.

The project header should be followed by link(s) to pages related to the project. If your project has its own wiki page describing it, it would make a link. From the link(s) you provide, at the very least, the student should be able to get information on general description of the project, maintainer's IRC nick or email and the location of code repository and bug tracker.

Before suggesting an idea, take into consideration that students will be working for 3 months on it, so please refrain from suggesting ideas that are likely to be finished too early or too late.

When writing an idea, make sure that you don't use any Tox-specific jargon that a student won't understand. Write in simple terms, so that college students unfamiliar with Tox could understand.

It's suggested to always include your (mentor's) email into the Mentor field, because we found that it's a lot easier to follow which student is which through emails, rather than having hundreds of students joining IRC, asking you questions while you are AFK, and leaving afterwards. It also helps when you need to find your previous conversation with a student.

You are encouraged to look into Ideas pages for the previous GSoC years: 2014, 2015.

Project name

Idea name

Brief explanation: explanation of your idea. Don't put explanation of what Project name is, that should be taken care of by the links or a description below the project header

Expected results: a list of what you expect students to complete by the end of 3 months

References: links to related bug tracker tickets, discussions and so on

Knowledge Prerequisite: languages, libraries, fields of knowledge (networking, parallel processing, etc) and similar

Difficulty: Easy, Medium or Hard

Mentor: email and IRC nick

Infrastructure

This project is collection of all Tox Project infrastructure.

Website improvements

Brief explanation: Improve the project website at https://tox.chat to include more information and to become more maintainable.

  • Prefer static content generation.
  • All dynamic information provided in HTML should have machine-readable (e.g. JSON) alternatives.
  • Build and test the website (render-tests) on a continuous integration platform (e.g. Travis CI).
  • Ensure that the website is fully accessible without JavaScript. Use of JavaScript to improve the user experience is permitted, but not at the cost of NoScript users.

Expected results:

  • The website should become a useful information source for average users, power users, and developers, without confusing the first group or annoying the last group.
  • Automatic browser tests should avoid render bugs.
  • Integrate various information sources, e.g. https://nodes.tox.chat.
  • Implement and integrate additional information sources.
    • DHT map with geolocation to show approximate Tox user locations.
    • Traffic statistics from bootstrap nodes.
    • Any other ideas you may come up with.

Knowledge Prerequisite: HTML, CSS, any server-side web framework

Difficulty: Easy

Mentor: zero-one

Tox Core

Language-independent Tox Core implementation tests

Brief explanation: Design and implement a testing interface for Tox Protocol implementations.

The testing interface will be specific to each component of Tox Core but independent of the language used. In the simplest case (recommended), this means that the language boundary is at the process level. The test runner will invoke interface functions in the process running the implementation. The implementation will process the test input and produce an output that is then validated against a model or a reference implementation.

All Tox Core implementations will need to implement the interface.

Expected results:

  • Design document and interface specification.
  • A complete set of functional tests for every component of Tox Core as specified in its documentation.
  • Optionally, but highly recommended as a means for self-validation: implementation of the provider-side in libtoxcore.
  • Optionally: a testing interface for multiple nodes with different (or the same) implementations to run in a simulated environment.

Knowledge Prerequisite: $language

Difficulty: Medium

Mentor: irungentoo for the libtoxcore side + see language/mentor table below.

Implement Tox protocol in another language

Brief explanation: Using only the Tox Core documentation, write a complete implementation in a memory-safe language.

Language choices are currently:

Language Mentor Link
C# iphy
Coq iphy
Cyclone iphy
F# iphy
Go iphy https://github.com/vikstrous/gotox
Haskell iphy
JX-Objective C JX7P
MISRA-C/C++ grayhatter
OCaml iphy
Rust zetok https://github.com/zetok/tox
Safe-D JX7P
Scala iphy https://github.com/iphydf/tox4j/tree/master/projects/tox4j/src/main/java/im/tox/core
SML iphy
Swift dvor, stal
Vala benwaffle

Safe-D is D where all public entry points are @safe and no internal functions are @trusted. Bold languages are ones that have a beginning of an implementation.

Expected results:

  • At least all DHT (including Onion Routing) behaviour.
  • For all components, tests must be written. Ideally using property based tests in combination with example based tests.
  • For all larger components, an external interface common to all implementations of that component. This will be used for the common test infrastructure to validate each implementation.
  • Improvements of the documentation.

Knowledge Prerequisite: $language, Networking, Security

Difficulty: Medium

Mentor: See table above.

Implement multimedia group chats

Brief explanation: Based on Jfreegman's work on DHT-powered group chats, this project will implement group audio/video chats.

Expected results: Audio/video group chats implemented in one client implementation (e.g. qTox, uTox, Antox).

Knowledge Prerequisite: C, Networking

Difficulty: Medium

Mentor: mannol

Multi-Device Support

Brief explanation: This project will add multi-device support to toxcore. You can start with the project proposal here or propose your own implementation.

Expected results: By the end of the summer, Toxcore will need to be able to: 1) group devices together, 2) send messages to multiple devices, and 3) the groups must be able to keep histories and contact lists in sync. Additionally at least one of client will need to implement basic multi-device support. (uTox STRONGLY suggested, other clients may require the student to find a mentor better acquainted with that client.)

References: https://docs.google.com/document/d/1op6zGR0KYdF7tTWSSX79KQieJu30vLZ6XG327kIBhxQ/edit

Knowledge Prerequisite: C, some knowledge of networking, data syncing, security/crypto.

Difficulty: Medium to Hard

Mentor: grayhatter on irc.freenode.net

Mobile-friendliness improvements

Brief explanation: Improve data and battery usage for mobile Tox clients.

Toxcore currently uses a large amount of network traffic to keep the DHT connections alive. For mobile applications, this is not acceptable, and for “Doze” on Android or vanilla iOS it's entirely infeasible, because background processing is very limited. This project involves using GCM or equivalents to wake up the mobile Tox client and build connections. To make it usable, some changes to libtoxcore are required to speed up building DHT connections. Endpoint hints can be encoded in GCM data packets. Further investigation could be done in making TCP relays or a similar concept use less traffic.

Expected results: Antox uses no traffic and battery while idle and uses traffic proportional to the message volume when active.

Knowledge Prerequisite: C, Scala

Difficulty: Medium

Mentor: irungentoo for libtoxcore, iphy/wiiaam for Antox

qTox

Multimedia Streaming

Brief Explanation: A student will enable users to stream their webcams, an area of their screen, or any media file, composited and arranged as the user wishes.

Expected Results:

  • qTox allows selecting arbitrary combinations of media files, webcams, and desktop, as video sources to composite and stream into one-to-one- and group- calls
  • qTox provides a graphical interface to arrange the feeds spatially
  • qTox provides an in-call interface for managing the playback of media files selected as sources

Note that there is at least one open source/libre software project that provides similar features, namely OBS MultiPlatform. It may well be possible to borrow code from or collaborate with that project.

Knowledge Prerequisite: Qt, multimedia framework

Difficulty: Hard

Mentor: TBA

Tox4j

Project link.

Important: if you want to work on a Tox4j project, please register on the Tox4j mailing list and send your questions to the GSoC address.

Also, please read the following section before submitting a proposal.

General expectations for Tox4j projects

Since every mentor for different projects may have different expectations, this section describes some of the expectations the Tox4j team has regarding applications directed at it. These are mostly guidelines, and not following them is not a death sentence to your proposal. We are open to discussion. If you feel any of these guidelines are unreasonable, please let us know on the mailing list or in a private email to the mentor.

We want to give every proposal a fair amount of thought, so please try and make our life easier; it can only benefit you.

Important:

  • If you do not understand the idea, but think that you might be interested, please come and talk to us (iphy, sonOfRa, subliun) on IRC (#tox-dev) or send an email to the mailing list (don't say “can you explain more?”, but ask specific questions about things you want to know).
  • We want to see that you put some thought into the project, you have a rough idea of what it entails, and that you understand the project idea written on this page. We have put a lot of thought into the idea, so we would like to see you spend some time thinking about it, as well. We do not want to see something that is essentially a copy of the idea, reworded a little.
  • Don't write large amounts of text saying nothing with a lot of words. We're not a university, so we don't grade you based on word count. Be precise and to the point.
  • Structure your text with headings in bold. Preferably copy the wording from the GSoC page. This makes it easier for us to compare the proposals. Use bullet lists if appropriate.
  • Run a spelling checker. We don't mind if your English is not grammatically perfect, but running it through a spelling checker is the least you can do.

Furthermore:

  • We are very interested in relevant skills. These include functional programming, security, mobile systems, and many others. Do list the ones you feel are relevant, but don't go on and on about them. We are more interested in your ideas about the project itself. One or two paragraphs about your background is enough.
  • We are not very interested in your ability to cough up buzzwords, so filling your proposal with Enterprise Service Bus, JavaBeans and other corporate transportation or coffee-related words will not help.
  • If you can, try to come up with an approximate timeline for your project.

Criteria:

What we are (ideally) looking for in students.

  • Technical skills
    • Having adequate technical background to complete the project.
    • Being able to quickly acquire new skills, learn new programming concepts, familiarise oneself with a foreign code base.
  • Communication skills
    • Able to express your ideas and questions clearly and precisely.
    • Comfortable discussing your ideas with other developers.
  • Vision
    • Having ideas that go beyond the ones listed on this page.
    • Having ideas that go beyond GSoC.
    • Be realistic in your proposal. There is room for a “future work” section at the end in which you talk a bit about your vision.
  • Ownership
    • You feel that the project is yours, you stand behind it, you own it.
    • Consequently, you won't let it go after GSoC. We hope you love your project as much as we love ours.

Come talk to us early. As part of the vetting procedure, we will require you to either improve our code in a specific place or write a small sample application using our APIs. This shows whether you are capable of quickly getting around new code, which is important in the type of work we expect.

Last but not least:

Stay tuned for changes to this wiki page. We regularly add new information here if we feel that it could benefit all students. We want to give everybody equal chances, so we do our best to share information widely.

Merging Antox and TokTok Android clients

Brief explanation: Merge the two Android clients Antox and TokTok. The TokTok was designed with separation of UI and logic in mind, while in Antox, it is still largely a mix of Android and pure JVM code. We would like to focus on a single Android client, so the goal here is to either change Antox to use design ideas from TokTok, or reuse Antox code in TokTok to reach feature parity, so we can drop support for one of the clients.

Expected results:

Required:

  • Strict separation of presentation and business logic.
  • A set of use cases the client must support.
  • Behaviour based unit tests for the business logic and instrumentation tests for every use case from the above set.
  • Written in Scala, as both Antox and TokTok are currently in Scala.

Optional:

  • Separation from the low level ToxCore.
  • Support one alternative protocol, e.g. IRC or XMPP, as the backend.

Recommended reading:

Knowledge Prerequisite: Scala, Java (these are both easy to learn if you know other languages)

Difficulty: Medium

Mentor: iphy, wiiaam

JVM implementation of the Tox protocol

Brief explanation: Create a full implementation of the Tox core protocol running on the JVM.

Alternatively: use a different safe language not targetting the JVM, such as OCaml, Haskell, Rust, Coq, to implement the protocol. In this case, Scala and Java knowledge is not required.

There is a beginning of an implementation in progress, but so far only a small part of the DHT specification was implemented. This specification has also since changed.

This project is large and can be split among multiple students. Depending on the number of applicants and their skills, a sensible split could be:

  • DHT and Onion Routing
  • Network backends: TCP and lossless UDP, including congestion control
  • Friend connections: the crypto handshake and basic packets
  • Messenger functionality: higher level protocols such as file transfers

No design document is required for this project, as all the information should be in the protocol specification. If any information is missing, it must be added to that specification after discussing with irungentoo.

Design/implementation guidelines (exceptions will be made for certain components that can't comply, but the majority of the code should follow them):

  • Referential transparency for all functions: calling a function with the same argument twice needs to yield the same result, i.e. foo(bar).equals(foo(bar)) must always be true.
  • Every function must be total; the use of the Java throw statement or the Scala throw expression is not permitted.
  • The use of null is not permitted, except when interfacing with external libraries, which must be properly wrapped as not to expose nullability to the rest of the code.
  • If a function is partial (i.e. it cannot return a valid output for every input), it can return an Option, a Try, an \/, or a custom error handling type.
  • For every data structure (type), there must be a generator function that creates a random valid instance of that data structure. This will be used in property-based testing.
  • Correct by construction: creating a new object must guarantee that its state is consistent and correct. In particular, this disallows a common Java idiom: creating an empty invalid object and making it valid by calling setters. If object creation can fail, the constructor function needs to be partial.
  • “No raw ints”: The use of int or other primitive data types is highly discouraged. Prefer to wrap them in a value class with appropriate operations explicitly defined and checked on them (e.g. class FriendNumber)
  • “No raw loops”: The use of raw for-loops is highly discouraged. Prefer to use generic library functions.
  • “No raw getters”: Getters are often a sign of poor encapsulation. Expose operations rather than data.
  • “No string-typing”: Provide concrete types and functions for specific functionality. Prefer specialising to generalising. String-typing includes the use of the Object (or scala.Any) type, which is highly discouraged.
  • Small specific functions: Write small, independent functions that perform a single small task. If a function is larger than a single screen (~50 lines), it's probably doing too much work.

Expected results:

  • Fully tested Tox protocol implementation compatible with the reference implementation in libtoxcore.
  • A ToxCore interface implementation using the above work as backend.

Knowledge Prerequisite: Scala, Java

Difficulty: Medium

Mentor: iphy

High level network protocol

Brief explanation: Create a formal specification and JVM implementation of a higher level protocol on top of Tox network packets.

The idea here is to build an abstraction on top of (limited size) Tox packet protocol for applications such as:

  • Arbitrary length text messages.
  • Streaming protocols (e.g. file transfers (lossless) and audio/video (lossy)).
  • Games (e.g. Tic-tac-toe).
  • Remote UI elements.
  • Distributed file systems.

The protocol should be specified in a machine-readable format that can easily be used to generate parsers and generators for various languages, so that it can be implemented in every client. A reasonable backwards-compatibility policy is part of the design to be created by the student. Existing RPC technology can and should be leveraged if possible.

Design/implementation guidelines from the above project apply.

Expected results:

  • Design document and protocol specification.
  • Fully tested implementation in a language targetting Java byte code.

Knowledge Prerequisite: Any JVM language (preferably Scala), Networking

Difficulty: Medium

Mentor: iphy

Multi-device support

Brief explanation: Create a network protocol, possibly based on the above abstraction, for multi-device support.

One idea here could be to use distributed consensus with eventual consistency to synchronise information between Tox clients. The same mechanism can be used for messaging (sending a message equals synchronising logs) and profile information synchronisation.

This idea requires a formal protocol specification and a design document.

Design/implementation guidelines from the above project apply.

Expected results:

  • Design document and protocol specification.
  • Fully tested implementation in a language targetting Java byte code.

Knowledge Prerequisite: Any JVM language (preferably Scala), Distributed systems

Difficulty: Hard

Mentor: iphy

Antidote

Antidote for Mac

Brief explanation: Create a Tox client for OS X using objcTox wrapper.

Expected results:

Using existing Objective C wrapper for toxcore create a fully functional client for OS X. Client should be written in Swift and should have following features:

Required:

  • 1-to-1 messages
  • audio calls
  • video calls
  • file transfer

Optional:

  • group chats

Knowledge Prerequisite: Swift, Objective C

Difficulty: Medium

Mentor: dvor

Print/export