Kolibri entirely in the web browser

Earlier this month, I participated in Endless Orange Week, a program where the entire Endless team engages in projects designed to grow our collective learning related to our skills, work and mission, while our ordinary work responsibilities and projects were put on pause.

I used the opportunity to do some experimentation around Kolibri, Endless’s chosen solution to provide offline access to educational content.

Especially with the proliferation of Chromebooks distributed by schools during the pandemic, there’s a clear opportunity for Kolibri to increase its impact by becoming available as a ChromeOS app. Kolibri can already be used on ChromeOS when there is a Kolibri server available over the network, however we are now focusing more on the independent learner case, providing access to educational content in limited-connectivity settings. We would like to make the entire Kolibri solution available to run on ChromeOS directly.

However, Kolibri has an advanced architecture due to its position as a highly featured learning environment, and that makes it challenging to bundle in a way that is compatible with constraints under which ChromeOS apps must operate. On a technical basis, Kolibri uses web technologies for the frontend, but relies on a Python backend.

I chose to experiment with one possible approach towards running Kolibri on ChromeOS: using modern web technologies to run the existing architecture largely as-is.

This experiment appealed to me as a way of gaining some hands-on experience with WebAssembly as part of the solution, an interesting technology that can vastly expand the capabilities of websites. In this case, I used Pyodide, a technology that lets you run Python code directly within the web browser.

Within the allocated week, I managed to get Kolibri up and running in this shape, at least to the point of the setup wizard. It was rewarding to see all this fit together. However, I did not have enough time to make it into a usable app, and there are some key challenges left largely unaddressed such as how we handle the storage of educational content.

I was also able to uncover some technical considerations that question the overall feasibility of this idea. Ultimately, while WebAssembly & Pyodide have truly achieved something magical in that Python code can be run in the web browser, there are fundamental challenges in bringing the web and Python worlds together and making them interoperate smoothly. To support complex apps like this without requiring rearchitecting Kolibri, Pyodide needs to bring these worlds together seamlessly and there are numerous complications in making that happen.

Code & technical notes
Click to see the experiment in action

I really enjoyed being able to focus some time on this experimental project and it was fun observing my peers also learning new things via their own Endless Orange Week projects at the same time.