Beautiful, Secure, Privacy-Respecting Laptops, Tablets, PCs, and Phones

Hi Everyone! The Librem 5 team has been hard at work again, and we want to update you all on our software progress.

We are preparing everything for the Librem 5 to be delivered soon, and its software will focus on the most critical applications a phone needs: calls, messages and web browsing. There are supporting projects that will be delivered too, like GNOME Settings, the shell, GNOME Initial Setup, and GNOME Contacts. So without further ado, let’s take a tour through the software we will deliver–as well as some other applications that have seen some major changes.



We have made some adaptive dialog improvements to HdyHeaderBar’s back button. There is a really nice new pagination widget for the app drawer. A general overhaul of the app drawer is almost finished–thanks so much, Alexander Mikhaylenko, for all of your hard work on this!

Also, be sure to check out the newly packaged demo app.

hdy demo

And Libhandy 0.0.10 has been uploaded to Debian and to PureOS.


We have worked on a few recent main efforts on Calls: adding a calls history, allowing the Contacts app to dial numbers, and enabling the system to receive calls when the shell is locked.

To lay the foundation for the calls history, the records have to be recorded in an SQLite database. Then, to complete the work, the database was connected to the UI.

Calls history

In order to allow Contacts–or any other application–to dial calls, a tel url handler was added to Calls.

Calls now starts up in a new daemon mode when GNOME starts, so that incoming calls can always be received.


The team fixed several crashes, and the welcome screen was reworked; there is also an ongoing effort to integrate with libfolks, which is used by Contacts.

We continue to improve the SMS plugin, too, and fixed an issue with multipart SMS reception: all SMS fields are initialized as soon as the first part is received (thanks a lot, Aleksander Morgado, for the patch). There is also handling for SMS messages that were received by the modem when Chatty isn’t running, support for delivery reports, and phone number formatting according to E164.

The conversation view was improved by introducing lazy loading for pulling the chat history patch, which gradually loads the chat log into the conversation view as the user scrolls up. Thanks, Leland Carlye, for the awesome patch!


The team added many mobile tweaks: from file chooser dialogs to about dialogs, message dialogs, adaptive presentation dialogs, dialog maximization, and info bars.

Web Browsing

We have backported many mobile improvements, which we also included on the devkit image. The Epiphany “new tab” page and several other in-viewport pages have been made adaptive, and there is a continued effort to push for Epiphany to adopt HdyPreferencesWindow.


Soon, you will be able to edit CSS from Epiphany’s preferences; and the search engine management dialog has been ported.

In order to address the application manager overflow issue, the about: applications now has improved CSS for responsiveness.

Initial Setup

We have refactored adaptive changes for some long-needed cleanups, which will be submitted upstream eventually.



We have some brand new functionalities, such as new buttons, added for making a call and sending sms.

In preparation for Contacts integration with Calls and Chatty, we have been doing some investigation into libfolks, gnome-contacts-search-provider, and evolution-data-server. This led us to a major refactoring of GNOME Contacts, so as to reduce complexity.

We have added some fixes to avoid crashing when taking a webcam picture, using GNOME 3.32 avatar styles for fallback–and the avatar is no longer cut off. A long press for selecting contacts was also implemented.

We are still working on fake persona.



We are working hard to redesign GNOME Clocks for mobile/adaptiveness–and to get the Alarm UI to use new list patterns.


We did it–GNOME Help now works on the devkit!

GNOME help


We are focusing a lot of effort on the WWAN panel, where locked SIM cards are now handled (and there’s a dialog to enter a PIN to unlock the SIM), data can be enabled and APN can be set, and auto-connect for default APN is also enabled so that it is persistent across device restarts. The UX has been improved too, by using HdyColumn to center align the panel and porting to HdyDialog. Finally, the WWAN panel now also detects multiple modems!

But that’s not everything: other areas of GNOME Settings have seen adaptive changes too, such as the background panel, search locations dialog, and notifications dialog, which have been made adaptive; the GNOME Online Accounts has also been made adaptive, by reducing the account widget margins and setting a minimum and natural size–which required the account dialog to be adapted. Plus, we are currently updating the format dialog for the Region panel (in GNOME Online Accounts).


There’s a new design for the WiFi panel being discussed upstream, which will need to be implemented once consensus is reached.

Additional adaptive fixes are still under review upstream, and include fixing HiDPi scaling issue of background images, region panel, and privacy panel dialogs.


We have a shiny, new, user-friendly terminal for mobile screens called Kings Cross, which is now default on the Librem 5. Thank you so much, Zander Brown, for all of your hard work on this!

We have also set a default background image. In order to help debugging efforts, debug symbol packages have been added by default. We’re now shipping a patched UPower that detects the devkit’s charger and power supply.

Support for the Librem 5 has been upstreamed in Debian’s flash-kernel.


Our team fixed several keyboard crashes, too: keyboard visibility on DBus is properly toggled now, for example, and a text-input issue preventing the OSK from showing up automatically in the correct windows is fixed. We also made lots of cleanups across the code base (see some cleanups and imservice cleanups for more detail) as well as getting tests added, error-checking made stricter, and many other fixes.

Some scaling improvements were made by calculating the scale factor instead of pre-scaling; honoring the widget scale factor, and setting a constant font size.

Additional rendering upgrades included avoiding infinitely redrawing the keyboard (since this was making the keyboard blurry, as well as eating up battery and CPU cycles), fixing the blurry text and icons and making the widget easier to style. We also added frame rendering, in order to make the keyboard match the design.

To avoid hiding content behind the keyboard, LayerSurface improvements were made–and newer layer shell code from phosh implemented–to hide/show the window, instead of destroying and redrawing it every time. This helped us make squeekboard our default keyboard.

Sound support is being added in the keyboard.

And, thanks to Piotr Tworek, we fixed an out-of-bounds memory-read bug!

XKB keymaps are being generated from XML instead of using premade ones, to allow for more keymap flexibility, so we have also decided to make some keyboard geometry adjustments to make the XML simpler.

The navigation between keyboard views was significantly improved, and landscape orientation was added so the keyboard no longer takes up the full screen, being centered instead. Similarly, the keyboard is now centered horizontally. We have also started working on improving symbol input, and adding support for non-ASCII languages.

The text-input protocol has been updated; it now supports notifying when no OSK is needed.

Compositor + Shell

The compositor has seen many fixes by now–although at first you may hardly notice them. Stack handling works better now, and unmapped surfaces won’t be raised in the stack. In order to mitigate any accidental rendering bugs when, for instance, focus rules cause the function to return early, the view damage in set_focus, to where the drawing list is handled, has been moved. Additional work has been done to move the focus back to first shell surface when unfocusing layer surface. To make recent GTK dialog fixes behave properly, maximize/fullscreen state is now taken into account on view init.

The team has also made a few layer surface changes: a layer shell crash was fixed and unused protocols were removed.The system modal dialogs now match the design much better; the ability to unmaximize auto-maximized layers was removed to avoid a broken state; we fixed the layer shell show/hide, and now have the ability to use enums as types. Some protection was put in place to guard against negative exclusive zone when surfaces set negative margins.

Other noticeable changes are that you can now close an app from the overview, and the keyboard button is hidden when the keyboard is unfolded.

App overview

We have also added touch support in X11 backend!

We were worried about a few compositor crashes, which led us to make some input grab fixes for xdg_popups and remove input method’s resource from the list on destroy.

Other changes we made include dropping the pointer emulation on touch and auto-maximizing before mapping the surface, to avoid flicker for example when starting new applications.

Phosh has seen the addition of PhoshToplevelManager and PhoshToplevel classes for managing and representing toplevel surfaces; this switches from a private protocol to wlr-foreign-toplevel-management, which is more complete than our previous private protocol and makes phosh usable with other compositors that implements the new protocol. Reporting the surface’s parent is still pending upstream review.

As you boot your devkit now you’ll notice that you see your list of favorite apps immediately. This is the result of our recent effort to move the favorites to home screen–once again, thanks to Alexander Mikhaylenko, in this case for fixing the sizing of the activities! You’ll also notice our new animated arrows when folding/unfolding the home screen, and fix favorites changing via gsettings.


If you haven’t already, take a moment to read our blog post that details the Librem 5 team’s contributions to the 5.2 kernel.

But a few things have happened since: support has been added for our accelerometer and gyroscope, and it’s been submitted upstream. In order to make IIO-sensor-proxy work correctly, we mainlined an accelerometer driver bugfix–meaning we will soon be able to use IIO-sensor-proxy by default and auto-rotate so that we can remove the “Rotation” switch in the top bar.. and rely on the sensors to decide the orientation that should be displayed!

We have been working very hard to improve the graphics stack too. MXSFB support has been added into mesa, and several patches are in review upstream: v1 and v2 of the NWL MIPI DSI driver, v2 of the LCD panel patches to make it work embedded in a panel_bridge(which is used by the NWL driver), v1 of the MXSFB patch to handle NWL timing requirements. Some tests with MXSFB were fixed.

A couple of minor patches were made to fix a typo in i.MX8MQ reset names and IPUV3 kconfig.

Power Management

The team is trying very hard to better manage the power consumption of the phone and reduce the overall temperature: to make sure we don’t lose basic kernel support, we now check for cpuidle sysfs nodes and DRM render node. We are also working on helping NXP to mainline thermal-idle to cool the CPU by idle-injection; to ease kernel updates, we improved kernel tests–and the CPUs now slow down when hot, instead of overheating and shutting down.

Also, thermal management investigations have led us to a focused effort on S3 suspend/resume.


The mailing list now receives build status mails–if you’re interested, you can sign up for librem5-builds@lists.community.puri.sm and receive them.

And the images will soon include our patched version of gnome-settings-daemon.


We have made several updates to the existing documentation: the low-level touchscreen reading hints, GNOME platform section, and application settings have all been updated, for example. We have also made many one-line updates to be able to use recent links, a more recent version of GNOME, etc.

As always, a big “Thanks!” to everyone that has helped review and merge changes into upstream projects; your time and contribution are much appreciated. That’s all for now, folks–stay tuned for more exciting updates to come!

Recent Posts

Related Content