Kiwix is an open source organization that aims to make internet contents accessible to those without internet access. My work for GSOC 2024 focuses on Kiwix Desktop, the desktop application for organizing and viewing the compressed archives on GNU/Linux and Windows machines. The primary focus of this 16-week, large-sized project is to improve the UI/UX of Kiwix-Desktop, an area where demands were made but progress has been stale for a long time.
The request for a table of contents has been left untouched for a long time. The main difficulty with introducing these features comes with HTML manipulation with the Qt C++ Web APIs. The list items are generated from HTML header tags in the documents and resemble an older style of Wikipedia table of contents.
| Screenshot |
|---|
![]() |
As you can see in the comparison, the original search is very generic and crowded. With this revision, appropriate spacing, sizes, and decorations are introduced to make it more visually appealing. Functionally, I introduced the feature to search "endlessly": automatically adding results in batches to the suggestion list when the user scrolls to the end.
| Before | After |
|---|---|
![]() |
![]() |
In addition to this improvement, I introduce the ability to search different ZIMs without having to open them or switch between tabs. All ZIM files in your Kiwix Desktop library are displayed in the drop-down on clicking on the MultiZim Search button. The user can select any ZIM, and the search suggestions will fetch results with respect to it.
| Screenshot |
|---|
![]() |
For Kiwix to be more accessible, we want to allow the app to read text out-load. We thus provide a way to allow users to read selected or the entirety of a page in different languages and voices.
| Screenshot |
|---|
![]() |
It is a common browser feature to have the ability to save a web page into a file. I implemented the feature, similar to browsers, to save the web page to PDFs using Qt's Web APIs. On the other hand, if the content on the tab is not in HTML, it will be saved directly in that tab's content format.
| In App | Saved Page File |
|---|---|
![]() |
![]() |
Kiwix Desktop is portable and cross-platform, meaning people might migrate between different machines or operating systems. Thus, we wanted a feature to export bookmarks to improve portability. Utilizing libkiwix, I export and import bookmarks in the form of XML documents.
| Screenshot |
|---|
![]() |
An open tab's underlying ZIM file can be removed, and information about the whereabouts of that ZIM file is seen to be no longer present. With the introduction of tab re-opening on start-up, this has a much higher possibility. I modified the error page with more informative messaging that helps the user know what the ZIM is and where it is located.
This is the first piece of work that introduced me to the idea of HTML injection, which helped me immensely in completing the PR for introducing the table of contents.
| Before | After |
|---|---|
![]() |
![]() |
Due to Qt's limitation, the scroller buttons are almost uncustomizable, look disproportionate, and overlap with the contents. I replaced the faulty buttons with custom scroller buttons.
Unfortunately, due to Qt making the scroller buttons and scroll behavior private, we cannot fully recover the scrolling behavior. We resort to scrolling by switching to the next or previous tab toward the respective direction of the buttons.
| Before | After |
|---|---|
![]() |
![]() |
These are minor bug fixes and UI/UX tweaks that are done to familiarize the code base before I move on to something larger. Many are functional and present no/minor visual differences. Thus, I include them in a collection here.
Re-open Previously Opened Tabs on Start-up: #1048
Remember Window Geometry between Sessions: #1126
Block External Network Requests from ZIM files: #1116
Fixes Book Description White Outs: #1115
One of the biggest challenges I had in this journey was navigating through the Qt library's immense arsenal of toolings while being bound by its limitations. Having a large ecosystem like Qt means there are a lot of ways to achieve the same thing, but some are easier than others. Take the Table of Content PR, for example: I had to record user actions in the web page and have thought of no way other than explicitly sending a URL request from the page to Kiwix Desktop to achieve it. However, after discussing this with my mentor, I was made aware of a built-in solution from Qt that was niche and wasn't readily apparent to my usecase. On the other hand, there are limitations to Qt that make the development difficult. The Scroll Button and Search Display PRs are prime examples, where seemingly simple styling to buttons and lists is made impossible or very difficult due to the available architecture.
Another is to learn from my mentor bit by bit on how to develop great code, git history, and UI. For each PR, there can be multiple review rounds in the mentioned aspects, and I am learning something new every time. It was challenging as a small change request can cause cascading effects to the following commits or the entire design. You might have thought you spent a long time to make your code and UI perfect, but later realized a better way or a UI mismatch that you have to start writing from scratch. However, the effort wasn't in vain, as I have been seeing myself incorporating more and more of what my mentors have taught me.
The work done here is set to be released for Kiwix Desktop v2.4.0. Undoubtedly, I plan on finalizing the code portion of the pending PRs following the end of GSOC. In the future, though I wouldn't be able to be involved in intense development scenarios like GSOC due to graduate school, I would love to be an active member of the Kiwix Desktop open source community and continue my contribution by providing quick fixes and knowledge to issues within my specialty.
I want to thank Kelson and Veloman Yunkan for being great mentors who are patient and supportive. I have received many meaningful feedbacks that will help immensely in my coding journey. I would also need to thank Stephane and Matthieu Gautier for their help during the application phase of the GSOC. Finally, thank Kiwix and Google for this great opportunity to make an impact in the world with open source!














