Ideas
For information about Haiku's participation in GSoC this year, please see this page.
Qualifying students can apply for a Haiku project (see the list of suggested projects below). For details about how to apply, please check out Students: How to Apply for a Haiku Idea.
The most successful Google Summer of Code projects are often those proposed by the students themselves. The following list represents some of our ideas and wishes for the project. However, suggesting your own idea is always encouraged!
Be aware: API design and kernel-related work requires a higher level of skill, and user interface design usually involves a lot more thought than other work. A significantly more convincing proposal is required for tasks involving those. Getting started with the design early (before the application period ends) is recommended, to maximize your chances of being selected, and allow a larger part of the coding period dedicated to coding tasks.
If you find one of the "big" ideas interesting, but feel that you cannot complete it within the allotted coding time, feel free to suggest splitting it into smaller parts for your proposal.
Students that intend to submit applications on ideas which are also part of other accepted mentoring organizations must coordinate with both Haiku and the other mentoring organization beforehand.
Project Areas
Applications
Extending and improving the Services Kit network backend
The Haiku API includes a framework for performing requests to websites using HTTP and other protocols. This is similar to curl or soup which are often used for that purpose on other systems.
This library is used by many Haiku applications, including the WebPositive web browser, package manager, e-mail client, etc.
The goal of this task is to rework the implementation to improve performance and fix design issues. As a result, the code would be cleaner, safer, and faster.
- Reworking the Service Kit to avoid spawning one thread for each network request. The requests should be allowed to run in an existing thread, or to be grouped together (by use of select() or poll() to wait for activity on their sockets, then dispatching events to the BNetworkRequest objects). This would remove some of the overhead of creating a request and solve some design issues in the Services Kit API.
- Implementing HTTP 1.1 support, allowing the reuse of the connection to an HTTP server to perform multiple requests. BHttpRequest objects should be reworked to be able to use an existing HTTP 1.1 connection, and a way to store existing connections should be added.
- A caching layer for HTTP requests. There currently is no cache which means some requests are made again and again to the same server. The cache should keep the result of these requests on disk and/or in memory, making it possible to reuse them and load web pages faster.
- Complete support for HTTP proxies. While there is currently limited support, it is not possible to do HTTPS requests through a proxy. This should be added, as well as a system-wide user interface to configure and manage proxies.
- Implementing FTP support. The services kit is designed to support multiple protocols, but currently only HTTP and Gopher are supported (as well as the local "file" and "data" protocols). FTP support in the web browser would be helpful.
- Skill set: userland development, network programming, threads.
- Possible mentors/knowledgeable people: PulkoMandy, jessicah, waddlesplash
- Sourcecode
Improving Haiku's WebKit2 port
Haiku has a native WebKit port which uses the WebKit1 API. This port is not complete and there are several bugs and minor problems which needs to be fixed. The plan is to replace this with a more up to date port based on the WebKit2 API. Based on the work completed in GSoC 2019, WebKit2 on Haiku is now able to render some web pages. The goal of this project is to continue this work, making the WebKit2 port more reliable, render all pages, handle input events, etc, and make it usable for the WebPositive browser.
- Skill set: userland development, exploring a large code-base (WebCore)
- Possible mentors/knowledgeable people: PulkoMandy
- Sourcecode (see the webkit2 branch)
- GSoC 2019 blog
- Opened tickets
Better XMPP instant messaging client for Haiku
Most of Haiku communication channels are hosted on IRC servers. IRC is a simple protocol, but it lacks modern features. As a result, people are migrating to other chat services such as keybase, Telegram, and many others.
We would prefer to use an open source solution, and XMPP is a good candidate. However, there exists no good native client on Haiku, so its use is limited.
The goal of this project is to take the existing XMPP client and improve it.
Features could include automated file transfers, user avatars and moods, rich messages (colors, pictures, ...), whiteboard collaboration, history searching, …
- Skill set: userland development, user interface design
- Possible mentors/knowledgeable people: PulkoMandy, waddlesplash
VirtualBox port to Haiku
VirtualBox is a virtual machine allowing to run an operating system inside of another. Porting it to Haiku would allow Haiku user to run another system, such as Windows or Linux, when they need to run an application that is not yet available for Haiku. This would make using Haiku as their primary operating system a viable approach for more people.
Starting from this preliminary work, continue and complete the port. This includes writing a native GUI for VirtualBox, getting it to run, and more importantly, work on the virtualization driver which will allow virtualbox to run the emulated machine using the native CPU. This makes the emulated system run at close-to-native speed, whereas a software emulation would be unbearably slow.
- Skill set: userland development, kernel development, possibly x86 assembly
- Possible mentors/knowledgeable people: mmu_man
Hardware acceleration for Haiku's QEMU port
QEMU is a virtual machine which allows running an operating system inside of another. While there already is a Haiku port, it currently does not support any acceleration system through native virtualization (through Intel VT-x and AMD SVM.) This makes it too slow for many uses. Fixing this would allow Haiku users to run another system, such as Windows or Linux, when they need to run an application that is not yet available for Haiku. This would make using Haiku as their primary operating system a viable approach for more people.
Various systems exist on other operating systems for this, such as KVM on Linux, bhyve on FreeBSD and recently (in 2019) NVMM was added to NetBSD. Intel also has a cross-platform framework called HAXM which only works on their CPUs. All of these work with QEMU, while only some work with other virtual machine technologies like VirtualBox. Of all these NVMM seems to be the easiest to port to Haiku. Bhyve might also be viable, and has been ported to MacOS and Illumos (a Solaris derivative.) A student interested in this project should research NVMM, bhyve and some of the other virtualization systems and describe how they would approach a port to Haiku. Many times these systems make use of kernel technologies that Haiku lacks and so much of this project might involve adding those to Haiku's kernel.
- Work on a virtualization driver which will allow QEMU to run the emulated machine using the native CPU.
- Skill set: kernel development, userland development, possibly x86 assembly
- Possible mentors/knowledgeable people: mmu_man, waddlesplash
- Sourcecode (QEMU for Haiku)
- NVMM Sourcecode
Devices preferences/Hardware manager
Haiku is meant to be an easy to use graphical operating system. It should provide a GUI to manage devices and drivers. This is currently implemented in the "Devices" preferences, however it does little more than listing devices found on the machine.
The goal of this project is to extend the functionality of Devices preferences to make it a more complete and useful tool. This includes working on the following features:
- Telling wether a driver is loaded for a given device and where the matching /dev entry is
- Giving user readable information on the device type and subtype
- Allowing to blacklist/disable the driver for a given device
- Support for USB and bluetooth devices (currently not listed at all)
- Generation of a "compatibility report" to help populate an hardware compatibility database for Haiku
Note that a lot of the work may be in making the required information available from the drivers and existing device management infrastructure, and not just in building the GUI itself.
- Skill set: user interface, kernel and drivers interfacing (ioctl, devfs...)
- Possible mentors: PulkoMandy, waddlesplash
- Existing code: "Devices"
Other applications
There are many open source 3rd party applications for Haiku that could use improvements. Whether it is resolving bugs, adding features, updating the coding style, updating them to use the Locale and Layout Kits, or anything else imaginable! Writing applications from scratch is also possible.
- Caya (IM client)
- Torrentor!
- Calendar
- Many applications at HaikuArchives
- Lots of abandonned projects for BeOS looking for a maintainer
- Skill set: userland development, user interface design, exploring an existing code base, others depending on the application retained.
- Possible mentors/knowledgeable people (depends on chosen application): PulkoMandy, Sean Healy, waddlesplash
Drivers
Improving intel video driver
Haiku comes with a video driver for intel chipsets. However, on many supposedly supported devices, the driver will only produce a black screen with no output, confusing users and forcing them to fallback to VESA video modes.
The goal of this project is to improve the driver and fix the different problems, making sure we get video output working on all supported devices. This includes support for HDMI, DisplayPort and VGA outputs.
Intel provides documentation for each generation of device, a lot of the work is figuring out what the differences between generations are, and which part the driver is currently not properly implementing.
- Skill set: drivers development
- Possible mentors/knowledgeable people: PulkoMandy, waddlesplash
USB Support for FreeBSD network compatibility layer
Haiku uses a FreeBSD network compatibility layer to support many network devices (ethernet and wireless) using drivers written for the FreeBSD project. This allows reusing network drivers with very little changes, considerably decreasing the effort needed to get good hardware support in Haiku.
However, this layer only supports PCI devices, and doesn't work with USB ones. Adding support for USB to the compatibility layer would bring us support for a range of devices like so-called USB tethering, as well as USB to Ethernet and WiFi dongles.
This project consists in importing one or more USB network drivers from FreeBSD into Haiku sources. The compatibility layer should then be extended to expose the FreeBSD USB APIs to the drivers, and forwarding the calls to Haiku's USB stack. Other parts of the compatibility layers may need to be extended as well.
This should be tested either with real hardware or an emulated device in a virtual machine.
- Skill set: kernel and driver development, USB, general C and C++ development
- Possible mentors: waddlesplash, korli
GPU acceleration support
Haiku does not currently support GPU acceleration, for 3D or otherwise. Reusing most of the DRM drivers from Linux, and Mesa's Gallium userspace components, the goal of this project is to enable the use of GPU-accelerated OpenGL, and eventually also OpenCL and Vulkan.
Haiku's current video drivers are mostly modesetting-only, and split in two parts: the driver itself, which is quite minimal and only provides low level access to the video card, and the "accelerant", which runs inside app_server and communicates with the driver in order to configure the card and use its features.
Porting the DRM drivers from Linux will be a rather daunting task, as they use a large subset of the Linux kernel APIs. It may be possible to reuse OpenBSD's or DragonFlyBSD's work rather than writing our own Linux API compatibilty layer; more investigation is needed here.
- Skill set: kernel and driver development, Mesa graphics stack
- Possible mentors/knowledgeable people: waddlesplash, PulkoMandy
Kernel
Power Management
Haiku already has some power management support in the form of a CPU idling driver. This is however clearly not sufficient, and there is room for improvements in several areas in order to make Haiku use less power and make laptops running Haiku last longer on battery.
Some investigation is required to identify the main issues in Haiku leading to suboptimal performance. There are however a few already known problems:
- Some subsystems such as the network and wireless stack wake up the system at regular intervals (10 or 100 times per second) to perform some tasks. Whenever possible they should be modified to trigger these tasks in anevent-driven way (triggering them from hardware interrupts for example).
- Some applications (such as the always-running DeskBar) are polling for events in a similar way. The APIs should be adjusted where possible to make those applications wait on notifications instead.
- None of the device drivers in Haiku include powersaving modes. When a device is idle, it should be put to sleep and powered off until it is needed again.
- Skill set: kernel development, general C/C++, userland development, debugging, power management / measurement
Improving the btrfs filesystem
Haiku has great support for its own file system, but most others are only available read-only. It is way better for interoperability with other systems to be able to write to these disks from Haiku.
The goal of this project is to complete the btrfs filesystem, to allow it to write btrfs volumes (reading works already). During GSoC 2017 and 2018, students got as far as creating directories, but it is not possible yet to write files. The first part of the work is to review the existing code, and report on the current status and the work needed to get everything in place.
After completion of this project, it should be possible to read and write files to btrfs volumes, making sure they are interoperable with Linux (mount without errors, file data is accessible, fsck detects no problems). Stress-testing should also be performed using bonnie++, and other test suites may also be used.
- Skill set: kernel, and driver development
- Possible mentors/knowledgeable people: PulkoMandy, Sean Healy, Hy Che
- Sourcecode
- GSoC 2017 log
- GSoC 2018 log
- Existing btrfs patches to start from
Porting Apple NTFS driver to Haiku
Haiku currently supports NTFS using code from the NTFS-3G project, which is distributed under the GPL license. We would prefer to use Apple implementation, which is under 3 clause BSD, more suitable for us.
Investigate the code in Apple NTFS driver and see how to map it to Haiku filesystem APIs, either by adding a compatibility wrapper (preferred, it makes updates easier), or by adjusting the NTFS code.
- Skill set: filesystems, C, C++
- Possible mentors: waddlesplash, PulkoMandy
- Apple NTFS sourcecode
Adding a new filesystem to Haiku
Haiku has great support for its own file system, but is completely missing support for some other filesystems. It is way better for interoperability with other systems to be able to read and write to these disks.
The goal of this project is to port one of the following filesystems to Haiku:
- XFS: Development community, homepage (existing code in Linux is under the GPL, a rewrite under the MIT license is preferred)
- JFS: existing code in Linux is under the GPL, a rewrite under the MIT license is preferred. The filesystem design and disk structures are well documented.
- UFS2 (as used in *BSD): FreeBSD implementation, u2fstools for windows (BSD licensed, source can be reused)
- HAMMER FS: homepage, sourcecode (3-clause BSD, a port of the existing code is ok)
- ZFS: main page, existing code (Existing code is under the CDDL, a rewrite is preferred)
It's okay to port over the code from other systems, although we prefer code that can be distributed under the MIT license.
It is recommended to start the work by getting an "fs_shell" building for the chosen filesystem. This is an userland tool that runs the filesystem code in a sandbox and provides a simple command prompt allowing to perform single, well controlled operations. Once the filesystem is usable in this mode, it can be integrated, first still running in userland with userland_fs, then later on running as a native kernel filesystem.
- Skill set: kernel, and driver development
- Possible mentors/knowledgeable people: PulkoMandy, waddlesplash, Hy Che
Filesystems benchmarking and stress-test
Some of the filesystems (or specific features of them) in Haiku are relatively new, and not considered perfectly tested and stable yet. The goal of this project is to define a procedure for testing the filesystems and identifying bugs (especially leading to on-disk data corruption) and performance bottlenecks.
Tools like bonnie++, xfstests, and the existing tests in src/tests/add-ons/kernel/file_systems in Haiku sources should be explored to determine their respective usefulness. Then, an automated way to run the tests should be defined (unit tests, integration tests on a running system, etc.)
Then, the filesystems should be modified to fix the performance problems and/or bugs that were found in the process.
- Skill set: C++ development, testing
- Possible mentors/knowledgeable people: PulkoMandy
x86-64: Implement support for Process Context Identifiers (PCID)
on Intel CPUs. The feature tags TLB entries with the Id of the address space and allows to avoid TLB invalidation on the context switch, it is available only on x86-64.
The goal of this task is to propose possible designs, implement the feature, extend the performance logs to measure impacts when the feature is enabled, and potentially also to mitigate the "Meltdown" vulnerability.
- Skill set: kernel development, x86 architecture/assembly language
- Possible mentors/knowledgeable people: korli
ARM port / device tree support
Unlike x86 systems which have a PCI bus, most ARM devices have peripherals at hardcoded addresses. This means automatic hardware discovery is not possible. The Linux kernel developers designed a solution called "flattened device tree". It is a static description of the hardware, telling the kernel where devices are located and which driver to use.
Haiku plans to use device trees to support several ARM devices with the same kernel. This requires updating our drivers and driver infrastructure to not rely so much on the PCI bus. This work should start with the USB EHCI driver, in order to provide at least one mass storage solution to the ARM port of Haiku.
The ARM port of Haiku is currently in an early state. This project may involve debugging of other issues in the port to get it running further, so the device tree part can be tested. Several parts of the early boot code should be reviewed to make use of the device tree and remove hardcoded addresses (RAM mapping, framebuffer, serial port, etc).
- Skill set: kernel development, ARM architecture/assembly
- Possible mentors/knowledgeable people: PulkoMandy, kallisti5
Network
Bluetooth Stack Improvements
Haiku's Bluetooth stack implements a basic subset of general Bluetooth functionality. This functionality needs to be completed and Bluetooth 2.X and later possibilities explored. This task involves investigating the current state of the Bluetooth code, improving the existing code on newer devices (pairing, etc), and improving the stack to make it more useful by implementing driver(s) for Bluetooth device(s) of your choice (file transfers, audio, HID, networking, etc).
- Requirements: Bluetooth-enabled Haiku system
- Skill set: C++, kernel development, userland development, global bluetooth stack knowledge (optional)
- Possible mentors/knowledgeable people: waddlesplash
VPN Support
With the decline of internet freedoms (Government IP Blocks, Net Neutrality reductions), the usage of encrypted virtual networks is increasing across all platforms. Haiku's VPN implementation is severly lacking. To improve global access to Haiku as a desktop platform of choice, our VPN support needs a lot of work. OpenVPN or Wireguard are both great options.
- Requirements: Internet connected Haiku system
- Skill set: C++, kernel development, userland development, TCP/IP stack understanding
- Possible mentors/knowledgeable people: kallisti5
Integrate our PPP implementation
Finish porting the PPP implementation to our new network stack. Add phone-line modem support, including HDLC framing and VJC compression (porting both algorithms is sufficient, but make sure the license is compatible to MIT). Implement CHAP authentication, and add support for configuring these to the new network preflet GUI. Find and fix bugs.
- Tickets: #812, #869, #873, #922, #923, #1059, maybe: #1057, #1058
- Skill set: multi-threading basics, maybe network protocols and some kernel/drivers development, maybe UI development
IPv6 finalization
The base framework for IPv6 support was implemented as a Google Summer of Code 2010 project. Even so, there remains a lot of smaller cleanup/finalization tasks that can be done as a project.
- Tickets:
- #8293 -- BNetworkAddress needs to check if there is an available IPv6 connection.
- #7228 -- RFC: BNetworkInterfaceAddress needs to store auto-configuration flags
- #6489 -- ifconfig needs to validate availability of ipv6 module prior to utilization
- #2632 -- Possible redefinition for struct sockaddr_in, related to IPv6
- #8319 -- Haiku needs IPv6 duplicate address detection during link scope ip configuration.
- #8317 -- Haiku needs IPv6 global scope Auto Configuration (router advertisement + DHCPv6)
- #11862 -- Net server multi-protocol rework
- Skill set: IPv4 and IPv6 protocols, kernel and network stack development
- Possible mentors: jua
User Interface
Modular edit view (BIG)
The current solution for text editing in Haiku is the BTextView. It is a rather simple view providing basic text editing features and limited styling. This is, however, not powerful enough for most serious uses. The goal of this project is to design a complete replacement for BTexView, which should be designed to cover more use cases.
The edit view design should be modular and extensible to make it easy to implement e.g. following features:
- spell checker
- line numbers, ruler, 80 character limit line, hyper links
- working on an input stream rather than on a input file e.g. to be able to open files ~100Mb without loading them into memory in one go
- Including pictures in the text flow
- Sourcecode editor: syntax highlighting, code completion
- Ability to load and save data in different formats (using the Translation Kit)
Existing work
The HaikuDepot application includes preliminary work on a rich text view, which it uses to provide the description of packages. This could be used as a starting point for this work.
- Skill set: C++, API design, UI development
- Possible mentors: waddlesplash, Sean Healy, scottmc
Media
Complete and Finalize the MediaPlayer Plugin API
The MediaPlayer app included in Haiku is able to play most of the media formats around. To be able to do that it includes a monolithic framework that uses most of the important features of the media_kit. To improve maintainability and flexibility we are looking forward to include a plugin API and export or implement as plugins certain functionalities.
Some examples :
- Playlist
- Attributes editor
- Cover Art
- Web Remote Control
Some efforts have been already put and can be found here.
Other Links:
- Skill set: general C++, userland development, software design
- Possible mentors: Barrett
Ports
Porting the Go Programming Language to Haiku
Go (or Golang) is a popular cross-platform general-purpose programming language which is known for its direct compilation to static executables, concurrency model used in its goroutines and its enforced standard style of programming. It has been used by many developers to create command-line tools, static site generators, high-performance servers and many other applications requiring Go.
Existing work
There was a previous GSoC student who originally ported Go 1.3 to Haiku, but unfortunately it was unmaintained and was broken over the years. In 2018, the port was later updated to Go 1.4.3 but only for 64 bit. Work has been attempted in bootstrapping higher versions like 1.5 and 1.11 but the bootstrap process have produced binaries that are broken and don't work. The goal of this project is to identify the issue preventing the bootstrap process from completing and then attempt to fully build either a recent version (Go 1.11) or the latest version of Go only using Go 1.4.3 for 64 bit. Please note that this port may require diving into the low-level components of the compiler and Haiku internals rather than primarily programming in Go.Links:
- Skill set: C, Go, Go assembly, low-level programming, ELF-internals
- Possible mentors: return0e, BGA
Other
Jam (build system) replacement/rewrite
Haiku uses Jam as its main build system. Unfortunately, Perforce is not actively maintaining the tool anymore and the codebase is not very clean. Ingo Weinhold started work on a complete rewrite of the tool in C++, with the aim of being compatible with the existing build files, but provide a cleaner codebase to build upon and do away with most of the legacy stuff.
The goal of this project is to continue this work and make ham usable to build Haiku, as well as other projects currently using Jam as a buildtool.
- Skill set: C++, threading, build systems
- Possible mentors: waddlesplash
Coding style checker bot for Gerrit
Haiku has its own coding guidelines which describe how the code should be formatted. There is a tool for reformatting or checking if code follows these guidelines, but it has to be compiled on the developer machine and then run manually.
The goal of this project is to integrate this tool with Gerrit, the web app we use for code reviews. It could then give quick feedback on the coding style as soon as a patch is submitted, making the review process smoother and easier.
Ideally, the changes could be run through a specific concourse configuration, which would run haiku-format, and then post the result as comments in Gerrit pointing out the lines that need to be fixed, and give a review score to the change.
- Skill set: REST APIs, code formatting tools
- Possible mentors: PulkoMandy
Add Haiku support to Allegro 5.0
Allegro is a gaming library. Older version (4.4) did support Haiku, but this support was dropped from the newer versions (starting from 5.0). The library should be ported to Haiku, allowing to run the bundled examples and possibly port some other software using it.
- Skill set: C++, userland development
- Possible mentors: scottmc
- Alternative projects: porting SFML or another similar library
Multiple monitors output in app_server
app_server is Haiku's graphics server and the equivalent of X11 or Wayland on other UNIX systems. It currently supports only one video output, but should be able to do more.
While the API already allows this for the most part (with the BScreen class), there is no actual implementation behind it and parts of the code assume only a single screen.
Some drivers implement minimal support for multiple displays, but not all of them. This task may involve updating the video drivers to handle multiple monitors correctly.
- Skill set: C++, graphics development
- Possible mentors/knowledgeable people: jua, PulkoMandy
Complex font rendering in app_server
app_server is the graphics server in Haiku. It handles the rendering and display of application windows, desktop, and everything that is shown on screen.
Freetype (in combination with agg) is used to render text. While it provides good results on its own for latin and cyrillic alphabets, Freetype is not enough on its own to properly render other scripts with more complex rules, such as Devanagari or Arabic.
The goal of this task is to integrate Harfbuzz into app_server, so that the complex rules for text rendering are properly applied. This would allow rendering of complex languages as mentioned above, as well as mixing different languages (picking appropriate fonts automatically).
This task can be further extended with investigations of API changes required in the interface kit (and in particular BView and BFont) to properly handle left to right text.
- Skill set: C++
- Possible mentors: stippi, PulkoMandy