Maemo Leste - 2025 Daedalus release

daedalus forgejo | 2025-11-08

It's been way too long since our last update, but many things have changed in the meantime. We've:

  • released Maemo Leste for Devuan Daedalus (Debian Bookworm);
  • received funding from NLnet (through the NGI0 Commons Fund)
  • added support for Qt6;
  • added more extras packages;
  • improved the chat and browser application significantly;
  • added a CI/CD to our Forgejo instance;
  • improved the Nokia N900 support;
  • improved ofono (modem) support for the mapphones (Motorola Droids) and Nokia N900

and much more...

Daedalus

We ported Maemo Leste to Devuan Daedalus (Debian bookworm) some time ago (see issue #571) and silently switched our images over to this release. At the time we were caught up on Debian stable, but as of writing of this post, Debian bookworm is now old stable again. One of our priorities is to switch to Devuan Excalibur (Debian Trixie) soon, so that we are on Debian stable.

It has taken us while but we are slowly catching up to the Debian release cycles - these things take time because we have to port our packages to newer libraries and code, and when we started Maemo Leste we were targetting a distribution that was then already olstable.

As part of the upgrade to Daedalus, we:

  • ported our media application framework to use Tracker 3
  • rebased our Xorg patches on the debian xorg
  • wrote a piece of software to figure out in what order to build our packages in Jenkins, as this historically has been somewhat of a challenge
  • Decreased the number of upstream software that we had to fork, as our patches made it upstream in some cases
  • migrate away from python2 in icd2 module management.
  • Switched to a newer upstream upower version which contains most of our patches;

The actual set of changes is much larger and can be seen in issue #571.

Jenkins and Versioning

When we first made the chimaera release, we made a mistake in how we version the packages, normally our packages end in something like: +4m7 - which means "distribution release 4, Maemo 7". In the chimaera case, the 4 felloff. Unfortunately in Debian packaging versioning this means that the chimaera versions without this one-digit prefix always take precendence over the packages with this additional prefix. In an attempt to make dist-upgrading possible, we added a file to apt.preferences.d that gives the packages daedalus release repository a higher priority than the chimaera ones. We also fixed the problem in Jenkins although this doesn't really matter at this point, as the chimaera versions are already problematic.

This commit to jenkins-integration adds the proper versioning for Daedalus and we also fixed some IRC integration script for packages that are only built for one architecture in commit b00ad4d9.

dist-upgrading

As always, installing a daedalus image is the easiest way to get up to date, but it is possible to dist-upgrade from chimaera to daedalus, but one has to ensure that the repositories in /etc/apt/sources.list and /etc/apt/sources.list.d/* have their chimaera references removed. Make sure you're fully up to date on chimaera first.

Core

Various core applications and daemons have seen improvements and fixes.

Browser (jib)

Jib now has full-support for the virtual keyboard, so that this browser is also usable from devices with no hardware keyboard. In addition, we've improved the built-in adblocker, so it does not block benign resources.

Calendar

We've fixed the vertical alignment in the month display for the calendar, see qalendar/pulls/1.

ntp

sicelo made it such that we when we fetch the time over NTP, we also synchronise it to our hardware clock, see leste-config/pulls/61

Conversations

Conversations has received a lot of attention - bringing you new, and exciting features for our Daedalus release.

Maemo-fi-cation

Conversations now uses more UI components (and paradigms) from Fremantle.

The settings and about page were moved to a popup.

We are now also using a dialog for the contact picker (Compose new message).

The maemo-fi-cation of our UI is still on-going, and will be expanded with more Maemo components in the future.

Improved tableview

We have various places where messages are listed: the overview (the first screen), search window, and the groupchat memberlist window. Code-wise, we are now using the same table everywhere.

In addition, we improved this table's sorting, avatar/presence visualization, , and made table updates more performant.

UX improvements

When writing a long message, the input box now dynamically grows according to input.

The QML interface has been reworked to be more responsive. This was already the case, but there was still the occasional clipping bug.

In portrait, everything now properly scales, and adjusts:

Some other improvements related to the chat window are:

  • Improved 'bottom pinning' on incoming messages
  • Support key combination shift+enter to introduce a newline whilst 'auto-send on ENTER' is enabled
  • Set focus directly after sending a message
  • Optional shader for chat bubble backgrounds, similar to a well-known chat application
  • Optional shader for the background: matrix falling rain

Slim mode

Conversations is designed to run on low-powered devices, with possibly old(er) hardware. As such, conversations is written in C++, and leverages various tricks to keep memory usage low, and performance fast.

While the regular QML interface is already minimal in terms of resource usage, we have introduced 'slim' mode for a minimalistic, alternative QtWidgets based interface. This can be enabled in the settings.

Since Conversation's core logic was already separate from presentation, supporting this alternative interface required minimal changes.

Attachments

We now parse incoming and outgoing links, and render these links depending on their content type. In the case of XMPP, when someone sends a picture - this is generally just a link to a .jpg. Conversations now renders them inline.

Additionally there is also an image viewer that supports gestures like panning, and zooming to further inspect incoming media.

By default, this feature is off for privacy reasons (as to prevent auto-visiting weblinks sent by a counterparty), but can be turned on in the settings.

Address book integration

Our initial address book integration introduced features like avatars and display names. We've now expanded this to also support 'master contacts'.

Master contacts unify contacts from multiple sources such as XMPP, Matrix, and SMS into a single contact.

By keeping contact management (osso-abook) and messaging (Conversations) separate, Maemo ensures that the address book integrates across the entire system. This allows applications to share a consistent, unified view of contacts while keeping the messaging layer focused on communication.

Additionally, the code responsible for interacting with the address book has seen major improvements, resulting in better performance.

Channel member list

Groupchats now expose a memberlist, from which you can start a private conversation with a contact.

Since the memberlist could be quite long, it has the ability to filter for specific names.

Qt5

Sander has made it so that the Hildon Input Method (HIM) now works well in Qt, which means that devices without keyboard have access to a usable virtual keyboard. This work can be found in leste/qt-input-maemo and is very exciting.

Additionally, the qt menu is now always shown properly (see issue #563).

Qt6 platform plugins

Leste has various Qt plugins to make Qt applications integrate with the operating system. These change the look, and behavior of Qt applications, and make them more suitable for e.g. touchscreen devices.

Qt6 is the new Qt version, so the various plugins needed a migration to this new version.

  • Each had their qmake converted to CMake, in order for better integration with existing IDEs
  • Each are now separate repositories to make development more focussed, and accessible
  • Each now have a Qt GUI example application - handy for testing any changes made to the plugin in question

We are happy to report Qt6 applications now also integrate into Maemo, just like our Qt5 applications do.

qt6-input-maemo

This the keyboard integration, including the virtual keyboard. Since our Qt5 version was already using modern Qt (having been ported from Qt4 only recently), minimal changes where needed to get this working on Qt6, see qt6-input-maemo.

qt6-qpa-maemo

This plugin is responsible for integrating with xcb/x11, and offers glx (opengl) and egl (opengles) backends for hardware acceleration. It also deals with things like drag & drop, and clipboard. Porting this was somewhat challenging due to Qt plugin infrastructure changes, as well as debugging hardware acceleration on the various devices we support, see qt6-qpa-maemo.

qt6-maemo-widgets

This plugin provides additional Maemo components (widgets) for Qt, like QMaemo5InformationBox, QMaemo5DatePickSelector, see qt6-maemo-widgets.

Previously part of the plugin, this is now a shared library that produces a pkgconfig, and CMake config for other Qt apps to consume.

qt6-style-maemo

This plugin deals with how Qt applications look. For example, when this plugin is active, a QButton is replaced by a GTK button at runtime. It does so by painting GTK widgets off screen and use that to figure out what the Qt widgets should look like. This plugin also handles spacing, size hints, and color palettes. Due to Qt plugin infrastructure changes, this was somewhat time consuming to migrate, see qt6-style-maemo.

sphone

Our dialer software has also seen some improvements:

  • The default ringtones are now ogg files (issue #767)
  • There is a more clear indication when a call has ended (issue #727

osso-xterm

thp contributed a bunch of changes to the terminal application:

osso-xterm/pulls/5 tidies up the preference UI. As mentioned in the pull request:

  • Preview prominently visible at the top
  • Font selection hidden behind a button/dialog
  • Color scheme presets (Black-on-white, White-on-black, ...)
  • Custom color scheme with working preview buttons
  • Use color picker from Hildon Extras
  • Remove "Reverse" option (it just swaps fg/bg color)
  • Make scrollback a picker instead of a text field
  • Make it clearer what the hardware keys option does

osso-xterm/pulls/6 removes some obsolete code and osso-xterm/pulls/7 fixes a typo in the debian control file.

osso-xterm/pulls/8 re-organises the toolbar buttons and moves the fullscreen button all the way to the right, which is more consistent with other Maemo applications.

osso-xterm/pulls/9 fixes behaviour where menu buttons would sometimes move around, by placing the "Copy" and "Paste" buttons after the "Reset" and "Reset and Clear" buttons.

connui-cellular

We have made it such that the icons for 2.5G and 3.5G now show up correctly, see issue 745 and connui-cellular/pulls/3.

hildon input method

User thp has improving the settings for the hildon input method in hildon-input-method-plugins/pulls/5 by making it possible to configure the hardware key long press action: so that one can either have keys repeat or change the key to the special symbol of said key.

Theming for programs started over ssh

In osso-af-startup/issues/3 user thp documented why the theming did not work well when starting programs over ssh, and this has now been fixed.

Hardware & Drivers

Nokia N900

The Nokia N900 has seen a fair number of changes:

Motorola Droid 4

The mapphones (Motorola Droid 4, Motorola Bionic, Motorola Droid RAZR, Motorola Droid 3, Motorola Atrix 2, various xoom/xyboard tablets), received significant improvements. In particular, the cellular stack (in the form of ofono) has seen various improvements, improving the stability of the cellular stack and reducing the amount of custom code by migrating to QMI from custom AT commands and moving to ofono 2.12.

In droid4-linux/pulls/12 and droid4-linux/pulls/13 uvos and sicelo improved the bq2415x charger event reporting from the kernel to userspace.

Pinephone

Display brightness now correctly adjusts according to the user setting. Previously, devices with large ranges of brightness values (like the Pinephone) did not quite work well with our existing brightness adjusting logic.

We're also working on updating our pinephone kernel to a more recent version with better support, performance and power management user norayr has been working on this.

MZ617 tablet

The Motorola MZ617 tablet also saw improvements to its audio in leste-config/pulls/54 and leste-config/pulls/55.

Extras

hamsterfiler

Hamsterfiler, a file browser, now adjusts to varying resolutions, making the interface more responsive.

crazyparking

thp helped us bring crazyparking to Leste - a top-down puzzle game that challenges players to navigate interesting parking scenarios.

Forgejo

We migrated away from Github to Forgejo and now run our own Git forge on git.maemo.org. This in turn has made it easier for us customise our Git forge.

Translations with weblate

Pushing updates from weblate to our l10n repositories was broken after the migration from Forgejo to Github - this has now been resolved with translations being pushed directly to our git.maemo.org/leste-translations repositories.

Continous integration

Historically Maemo Leste has used Jenkins for all its package building, which has been a bit complex to manage permissions on and add packages to. So we have been working on adding a CI system using Forgejo which allows us to automatically. The Forgejo CI system is similar to 'Github Actions', and we currently:

  • build a package for every commit that gets pushed;
  • deploy extras packages to the extras-testing repository on Forgejo. This repository is present on the devices but disabled by default.

As a result, community members can now push out updates of their own software more easily - and even automatically to the extras-testing repository. The extras-testing repository is available in the Hildon Application Manager, but disabled by default.

We have set up runners for amd64, armhf and arm64, so these runners are all available to the CI/CD. Below is an example page of actions ran on the maemo/daedalus branch, which will build packages automatically for the daedalus testing repository.

The screenshot below shows the build status of various packages on the Forgejo extras dashboard.

Workflows

The CI mentioned just above is powered by our newly developed leste-cicd/forgejo-workflows repository, which contains two actions:

  • maemo-entry.yml: a resuable action which builds a package for each architecture and uploads them if they are in leste-extras
  • maemo-build/action.yml: composite action that builds a package

The uploading of the packages into our Forgejo extras debian registry is done using our custom leste-cicd/include-artifact action.

Further details on the extras workflow can be found in issue #798.

Container base images

Forgejo actions typically suggest using a specific runner, which come preinstalled with Node.js and a bunch of other programs. We opted instead to build our own base devuan images with our leste-cicd/devuan-base-containers repository. We've built images for chimaera, daedalus and the freshly released excalibur release.

Certain Forgejo actions normally require Node.js, but we decided not to leverage that and instead using a Forgejo action written in shell, see leste-cicd/checkout-action-nojs (forked from taiki-e/checkout-action.

We created a custom action that uploads artifacts without requiring Node.js in this repository: leste-cicd/upload-artifact-nojs.

Future work

We will continue to develop our CI/CD system to make it easier to contribute to Maemo Leste. In particular, we're looking to:

  • ensure that our CI/CD deals better with packages that are meant only to be built for a specific architecture
  • contribute to Forgejo to make it easier for other projects to set up similar CI/CD setups
  • ensure our CI/CD build-on-commit coverage extends to all our core packages
  • we can build device images in our CI/CD as opposed to in Jenkins by leveraging debos
  • Provide better integration with our Weblate translation setup

Bugtracker / issues

Sander utilised a local LLM to tag all of the issues in our bugtracker.

Website redesign

Our website has a fresh new look. The homepage is now clean, concise, and clearly communicates our mission: provide a FOSS Linux distribution for mobile devices.

We've kept it lightweight, no fancy CMS, no cookies, just statically generated content.

See maemo-leste.github.io/pulls/23

Image building

Debos

We're looking to modernise our image building process to make it easier to port Maemo Leste to other devices. erebion has made a start on utiling the debos recipies as used to Mobian and adopting them for Maemo. We've been building on his work and almost have bootable images for the Droid 4, which would be a great milestone. The current changeset can be found in MerlijnWajer/mobian-recipes

Raspberry Pi images

We're working in getting the Raspberry Pi images to build again. Currently minor manual modifications are required to get the latest raspberry images to boot, as documented in issue #758

What's next

Devuan recently released their version of Debian Trixie coined Excalibur and we are looking to rebase Maemo Leste onto this release soon. Moving to Excalibur will probably mean we will move to Qt6 and towards Pipewire - away from Pulseaudio.

Adding support for more devices is something we're also aiming to do soon - both in terms of developer single board computers (like the Raspberry Pi and Olimex OLinuXino devices) as well as actual phones and tablets. The developer single board computers will make it easier for folks to develop and contribute (phones do not always make for nice development devices)

We're also looking to seriously improve our developer documentation - how to port and/or contribute packages, how to port Maemo Leste to new devices, how to debug problems and so forth.

Interested?

If you have questions, are interested in specifics or helping out, or wish to have a specific package ported, please see our bugtracker.

Please also join our mailing list to stay up to date, ask questions and/or help out. Another great way to get in touch is to join the IRC channel.

If you like our work and want to see it continue, join our effort!

Merlijn Wajer