Skip to content

Wednesday, 13 May 2026

I just realized it has been a full year since I blogged last. Time flies and I will try to do (much much) better this year.

My last entry was about foss-north 2025 and now foss-north 2026 has just passed. It was a successful event and Tobias really helps bringing new energy to the event – including a whole crew of volunteers.

During the foss-north events all talks are recorded. These are then made available on YouTube and on a peertube instance. Historically this has been conf.tube which was provided by a kind supporter to the cause. However, now the costs has exceeded what is reasonable, so it was migration time.

We’ve looked at taking over the full peertube instance, but quickly realized the costs were too high for us as well. Instead we took over the domain (thank you!) and one of our speakers offered to host us on his instance. Thus, all past foss-north videos, and the new ones for 2026, have been migrated to https://peertube.anduin.net/c/fossnorth/videos .

So, what about migration? The intra peertube transfer failed – much because the aging conf.tube setup did not want to produce the 360GB export. So we had to take another path.

What path you ask? Python scripts! (of course)

So first, we created a Python script storing all URLs from conf.tube. Both for playlists and videos. Then we created a script collecting the corresponding links from YouTube.

Since the new peertube instance does not have direct import from YouTube enabled, the script downloads the video file, metadata and cover picture from YouTube, and then uploads the video to the peertube instance with the metadata and cover picture. As this is a fully automated flow, it is very convenient.

(for 2026 I adapted the script to sync a YouTube playlist, which is very convenient)

The final output from the migration scripts was a set of redirection statements for nginx which is now deployed to the conf.tube server. This means that all old links to foss-north material at conf.tube should redirect to the corresponding video at peertube.anduin.net, so hopefully no links are dead.

Monday, 11 May 2026

Recently I went on the Linux User Space show to talk about KDE Linux, business, and everyone’s favorite topic: AI. It was a pretty interesting conversation; check it out:

So... while doing some work on Oxygen I noticed there was no camera-video icon.

No Oxygen one.
Wille there was already a recently done symbolic one.

Which honestly felt a bit odd considering cameras are one of those objects designers historically cant resist over designing heee... (but then again i got a bit 2 distracted about the future and forgot to look behind me at what was still pretty good)

So I ended up making both versions almost back to back.

Now... I already knew exactly what was going to happen.

I have been doing Oxygen style icons for long enough to know the amount of work involved. Big reflections, materials, shadows, details nobody consciously notices just to change how the icon feels. And to hide my incompetence as a simple designer

It was not just "camera" and realy not a video one but..... It was trying to be a camera. A object. Somthing with texture and personality. Still .... Probably 3 days of work.

The symbolic one on the other hand took minutes.

And honestly... I like symbolic icons. This is not one of those "flat design killed civilization" posts

But it did make me think again about something I keep repeating over and over:
"Less is a bore." as Robert Venturi said.

People usually read that as a attack on minimalism. But I don't.

Reduction is useful. Clarity is useful. Symbolic icons are useful. You also cant hide your design failures as easily, and they can work really well.

The problem for me starts when simplification becomes emotionally neutral. Copy of a copy of a copy of a nothing.

Because thats the thing I care about the most when designing anything. Not beauty exactly... beauty is subjective and honestly kinda impossible to define in any meaningful way.

What interests me more is emotional impact.

How does it make you feel?

Not stricly rationally. But mostly Emotionally.

The Oxygen/old\new/skeo\etc icon is probably excessive and maybe even a little ridiculous. Tiny fake reflections, fake materials, dramatic shadows... but then again thats also what gives it character I think??. It tries to create an "atmosphere" instead of just identifying a function.

And to me atmosphere matters.

Humans are not rationalist grid systems no matter how much "modern" design sometimes pretends we are. We remember things emotionally first. Movies, music, old game menus, interfaces...

Nowdays many interfaces and design languages just feel efficient. Functional. Fast. But also weirdly interchangeable.

And I think thats why so many modern interfaces evaporate from memory so quickly. Perfectly boring floating in UI space. Visually correct but emotionally silent.

Which to me always felt ironic because modernism originally was full of emotion. Optimism. Utopianism. The future as a aesthetic project. Somewhere along the way people kept the reduction but forgot the passion behind it.

Oscar Niemeyer

Anyway... making these two icons back to back ended up being more interesting than I expected.

They will both be available in PlasmaShell near you....

P.S. welcome to my new home, I'm still alive 🙂

I'm probably gona make a video with some crazy ideas for a over the top theme in QML, kinda as a exercise on the sort of things that should be possible in theme engines. Because even with QML giving us allot more creative freedom people still somehow end up making mostly the same thing over and over again.

Sunday, 10 May 2026

Hey everyone! This is my first post and Week 1 status report.

I started this week by setting up:

  • The project and configuring jj, a local version control system that has been a lifesaver for testing, simulating, and keeping my commits organized.

  • The first step was to build and refactor Plasma NM in parallel while setting up a bare-bones folder structure. Here is the Commit I made.

  • After creating the initial folder structure, I started refactoring the main backend service for WifiSecurities, which includes creating separate components for the Enterprise section, authentication, and Wi-Fi security options.

This week, I learned a lot of new things about local version control, architecture for Qt Widgets, and QML.

Image by: Nuno Pinheiro Following posts on specific work being done on Oxygen, this post is going to try to go beyond the manifest work and look at the bigger picture driving it. The motivation for writing it came when I was listening to a music artist who had completely rebranded himself by appending "Frutiger"...... Continue Reading →

Saturday, 9 May 2026

Last weekend I joined parts of the FOSSGIS Community Meeting at Linuxhotel in Essen, Germany, focusing on topics related to organizing this year’s edition of the Open Transport Community Conference.

FOSSGIS Community Meeting

Group photo of (most of) the attendees of the FOSSGIS community meeting.

Twice a year FOSSGIS e.V. (the German local chapter of OpenStreetMap) hosts a multi-day meeting at Linuxhotel, for people to work on primarily non-technical topics, such as organizing conferences, presence at events, public communication and outreach, lobbying and political activities around FOSS/Open Data, finances and fundraising, and operations of the FOSSGIS e.V.

I had been at Linuxhotel for a KDE sprint before, but only after looking up the group photo from back then I realized that this was already 18 years ago…

Open Transport Community Conference

While the first edition of the Open Transport Community Conference last year was very successful and ran very smoothly overall, one important thing that had to change to make this long-term sustainable was moving this under the umbrella of some form of legal entity. We are looking at doubling the length, doubling the number of attendees and a 40x increase in budget this year, way beyond something you’d want to have individuals carry the legal and financial risks for.

I’m therefore very happy that with the FOSSGIS e.V. we have found a suitable organization for this. Besides the obvious overlap in domain and partially also in people, FOSSGIS e.V. has extensive experience in organizing conferences we can tap into, as well as infrastructure we can use.

This should allow us for example to handle sponsors this year, as well as offering (optional) paid tickets for people attending for their employers. And with that we could then (given enough income) provide some kind of travel support program for community attendees to soften the impact of the rather expensive location in Switzerland.

The weekend provided an opportunity to work out a number of legal, financial, organizational and operational implementation details for that. Some aspects have still to be resolved with the tax advisor though, given Switzerland isn’t in the EU, which should then unlock finally opening the registration for the conference.

Transitous

Transitous is in a somewhat similar situation, although with less time pressure for now. To improve long-term sustainability we’d also need a legal entity to hold assets (such as the domain), handle money and sign contracts.

We are extremely lucky so far that the “big” servers doing the heavy lifting are provided to us for free, including all hosting cost. While there’s no indication that might change anytime soon, we at least want to have options ready should this change, or in case we need additional capacity.

Our current yearly budget is around 60€, if we’d have to pay market prices for our entire infrastructure we’d need to increase that significantly, 50x before the global madness in recent months, more like 100x now. Obviously not something we can do overnight, so starting to explore and ramping up fundraising options sooner rather than later makes sense.

And that’s just the direct cost for server operations, it would also be great to be able to support community members with travel costs for example.

Just as with the conference, the plan is to attach Transitous to the FOSSGIS e.V.. FOSSGIS e.V. is “gemeinnützig” in Germany, which allows receiving tax-deductable donations, something we’d be unlikely to achieve with a separate organization on our own.

FOSS and Open Data

With my KDE hat on, there were also a number of other relevant and interesting topics:

  • Rules and criteria for “recommended service providers” lists by FOSS projects, and countering misuse (e.g. KDE e.V. Trusted IT Consulting Firms, FOSSGIS e.V. Dienstleisterliste, Transitous supplier list).
  • Participation and presence at the Digital Independence Day events.
  • Lobbying for recognizing FOSS/Open Data work as charitable (“gemeinnützig”) in Germany, to receive all the legal, tax and PR benefits associated with that, and without the current workarounds and uncertainties (see also the ongoing petition for that).
  • Lobbying for FOSS use in public administration, in particular in the context of the current interest in “digital sovereignty” there.

I think for all this we could benefit from building more bridges between the various communities and organizations affected by or interesting in those topics.

You can help!

It’s foundations like FOSSGIS e.V. or KDE e.V. that provide all the boring legal, financial and operational infrastructure for Free Software and Open Data communities and initiatives to do their work, and keep doing that independently. Your donations enable this.

The first maintenance release of the 26.04 series is now available, with the usual batch of stability fixes and workflow improvements.

Thanks to an NLnet/NGI0 grant, we had a security audit provided by Radically Open Security. The audit found one serious vulnerability that can happen when opening a malicious project file, allowing remote code execution. This is fixed with Kdenlive 26.04.1. Thanks to Edoardo Geraci and Radically Open Security for helping us make our software safer!

We are not aware of the vulnerability being exploited so far. It is important to understand that this security issue is about a manipulated .kdenlive project file containing potentially malicious code. Therefore, it is only relevant if you open a .kdenlive project file that you received from someone else or downloaded from the internet. If you are working only with your own projects or with shared projects in collaboration with fully trusted partners, there is no security risk.

If you cannot upgrade, do not open a project file that was not created by you.

Although the vulnerability is fixed in 26.04.1, we have also implemented another layer of security checks for the upcoming 26.08.0 to warn the user if some other unexpected input is detected in a project file.

Head to our download section to get the latest binaries, or check the updates from your package manager. Please note that for Linux only AppImage and Flatpak are supported by the Kdenlive team.

For the full changelog continue reading on kdenlive.org.

Welcome to a new issue of This Week in Plasma!

This week saw a lot of lower-level technical improvements made throughout Plasma’s software stack. Not super flashy, but super important.

Nevertheless, two color-related features did manage to sneak in! And as Plasma 6.7’s feature period comes to a close, expect more polishing and bug-fixing for the next month or so.

Without further ado:

Notable new features

Plasma 6.7

You can now use an ICC profile while HDR mode is active! (Xaver Hugl, KDE Bugzilla #514239)

You can now disable or control the intensity of the “adaptive backlight modulation” feature of many AMD laptops, which changes screen colors at low brightness levels to try to improve visibility. If you don’t like it, you can now turn it off! (Xaver Hugl, KDE Bugzilla #511801)

Notable UI improvements

Plasma 6.7

Improved Discover’s ability to de-duplicate apps present in both system and user Flatpak installations. (Tobias Fella, Discover MR #1316)

The temperature values on Info Center’s Sensors page now reflect the units you have configured system-wide, rather than always using Celcius. (Chandradeep Dey, kinfocenter MR #294)

You can now remove apps from the Kickoff Application Launcher’s Favorites view by dragging them out of the view and over any part of the rest of the widget. (Christoph Wolk, plasma-desktop MR #3662)

The Printers widget now shows badges indicating the number of active and queued print jobs on each printer. Useful for large institutional environments with a lot of printers! (Mike Noe, print-manager MR #324)

Printers widget showing “2” badge on a printer, indicating two queued or active jobs

Notable bug fixes

Plasma 6.6.5

Fixed an issue that made the power buttons vanish from launcher menus for some people with version 260 of systemd, which changed around some things we were relying on. (Nicolas Fella, KDE Bugzilla #518174)

Fixed an issue that caused periodic freezes and stutters on some systems with multiple discrete GPUs. (Xaver Hugl, KDE Bugzilla #519461)

Fixed an issue that could make Discover crash on some distros while changing the priorities of Flatpak repos. (Tobias Fella, discover MR #1318)

The portal-based dialog to add launchers now actually works. (Nate Graham, KDE Bugzilla #519631)

Using window rules to move a window partially off-screen using a negative position property no longer makes the window disappear and become unreachable. (Xaver Hugl, KDE Bugzilla #466119)

Fixed one source of a tricky issue that could make secondary screens inappropriately remain dimmed after waking from sleep. (Patryk Ludwikowski, KDE Bugzilla #513809)

Fixed a recent visual regression in the hover highlighting effects applied to the Printers widget. (Nicolas Fella, KDE Bugzilla #518705)

Plasma 6.7

Fixed an issue that could sometimes cause custom non-default global shortcuts to be reset during software updates on specific distros that uninstall and re-install apps as part of their upgrade processes. (Vlad Zahorodnii, KDE Bugzilla #484597)

Notable in performance & technical

Plasma 6.7

Improved performance and power efficiency for software that uses CPU rendering, such as most QtWidgets-based Qt and KDE apps. Read more about this on Xaver’s blog! (Xaver Hugl, kwin MR #9178)

Improved KWin’s heuristics for when it can use the “direct scan-out” feature to improve performance and save power for full-screen windows. (Xaver Hugl, KDE Bugzilla #515784)

How you can help

KDE has become important in the world, and your time and contributions have helped us get there. As we grow, we need your support to keep KDE sustainable.

Would you like to help put together this weekly report? Introduce yourself in the Matrix room and join the team!

Beyond that, you can help KDE by directly getting involved in any other projects. Donating time is actually more impactful than donating money. Each contributor makes a huge difference in KDE — you are not a number or a cog in a machine! You don’t have to be a programmer, either; many other opportunities exist.

You can also help out by making a donation! This helps cover operational costs, salaries, travel expenses for contributors, and in general just keeps KDE bringing Free Software to the world.

To get a new Plasma feature or a bug fix mentioned here

Push a commit to the relevant merge request on invent.kde.org.

Thursday, 7 May 2026

Akademy 2026 (the annual world summit for KDE) is happening in Graz. Austria, Saturday 19th – Thursday 24th September. 


First of all, if you're reading this and thinking, "Should i go to Akademy?" 


The answer is [most probably] YES! Akademy has something for everyone, be it coders, translators, promoters, designers, enthusiasts, etc.


Now, with this out of the way, go and register at https://akademy.kde.org/2026/register/

 

After you have registered, you think which interesting talks will we have on the weekend?

 

And you know who has something to say? *YOU*


Yes, *YOU*. I'm sure you've been working on something interesting, or have a great idea to share.


*YOU* may think that your idea is not that great or the things you work on are not interesting, but that's seldomly the case when someone explains me their "boring" thing they've been working on, i always think "Wow that's great".


Ok, so now that I've convinced you to send a talk proposal, when better than *TODAY* to send it?


Yes I know the Call for Participation is open until the 17 of May, but by sending it today you make sure you don't forget sending it later and also [more important for me] you help those of us in the Program Committee not to worry when the final date starts approaching and we don't have lots of talks yet because you all prefer sending talks on the very last minute.


So stop reading and send your talk today ;-) 

Singleton Controllers in Times of Declarative QML

Controller objects have been the main way to glue your QML UI to your application's actual implementation of the I/O and business logic. However, over the years, the way to actually expose that controller object has changed. And now, we contributed a change in QQmlEngine that allows you to change it once again, and we believe: for the better.

What are "controllers" anyway?

Conceptually, controllers are a thin glue layer between your business logic and your QML, exposing the data that the GUI needs in a format it can easily use. They are implemented as QObject-derived instances, usually with properties exposing values that may or may not be writable, as well as potentially some Q_INVOKABLE methods that can be triggered by the QML and maybe some signals.

Usually, these controllers are specific to a single logical group of values and functions within the wider application. An application may have a hand-full to dozens of them for a big system. Models exposing collections of data are usually made available as read-only properties returning a QAbstractItemModel-derived data model on these controllers.

Often, these controllers need to be instantiated with some initialization, as they need references to the business-logic objects they expose to the GUI, listen for signals to get notifications of changes, etc. And that's where the trouble starts...

Pre-Qt 6

Context properties

In the early days of QML, one would often use controller instances exposed to QML as context properties. Doing that allowed one to instantiate the controllers under control of C++, giving it all the references the objects needed at that time. We would often expose them to QML using a naming pattern like starting the name with a double underscore __someController so that it was easy to recognize in the QML code. Using context properties however is no longer recommended. Their lookup is slow, and the QML compilers cannot reason about them, so code using them cannot be optimized. Nor is tooling available to help the QML programmer, as code completion and the likes are not possible.

Singleton Instances

Then came the qmlRegisterSingletonInstance method. This method allowed one to register a QML singleton, but it would return the instance that you passed it as an argument and that you could instantiate however you needed. That was a good solution, but it didn't have a long useful life as it didn't mesh well with the declarative registration and it had issues with the one instance being the instance for every QML engine in your application (if you had more than one).

Post-Qt 6

Since Qt 6, the recommended way to write QML is to create QML modules using declarative registration for C++-based objects. That has many benefits in terms of tooling and optimization, so it's good practice to do this. But it also meant that since Qt 6, one could no longer mix-and match imperative registration with declarative: you either used the one, or the other; which rendered the qmlRegisterSingletonInstance method above useless.

There are many possible approaches that I have seen being applied to still control the creation of controller objects, usually by registering a singleton that has a static create factory function and returning some C++ singletons there or something along those lines. That works, but isn't very elegant. An alternative approach is using initial properties on the root object, but that either requires accessessing the root id from other QML files or propagating the controllers all the way down the stack of items. Neither is a great solution for different reasons. My colleague Javier Cordero Pérez is making a couple of videos about ways to do this, so I won't go into detail here. These videos will be added here once they have been released.

New approach

That building this connection between C++ and QML was so inelegant - despite being so important - inspired me to finally take matters into my own hands and write a patch.

The result is available starting with Qt 6.12 onward and it combines the good things of qmlRegisterSingletonInstance and the declarative registration: you still register your controller type as a QML singleton so that the type is fully known by the tooling and access to it can be optimized. But we gain back the ability to provide a ready-made instance to the QML engine.

setExternalSingletonInstance

The API on QQmlEngine gained a single new method: QQmlEngine::setExternalSingletonInstance. It allows you to provide an instance of a type declared as a singleton as the instance to use in any QML running in that engine, just like you could with qmlRegisterSingletonInstance. In contrast to that old registration function, however, you call this method on your specific QQmlEngine instance. Note that the type has to be (declaratively) registered as a singleton type for this call to work. If you are using more than one engine, it is up to you to decide if you want to provide the same instance to these different engines, or have separate instances.

This simple method gives you back an elegant, supported way to fully control the instantiation of the QML singleton, and thus easily connect it to your business logic or whatever else you need to with it. However, it is up to you make sure that you do this call before any QML code actually tries to access the singleton. Otherwise, the engine will (try to) create it's own instance as it used to. You cannot replace an already existing singleton instance, so once there is one, it is the one.

It’s up to you to make sure that the provided singleton instance outlives the QML that depends on it. You can do that in any way that works in your context, but you could consider parenting the instance to the QQmlEngine instance, ordering the variables containing them on the stack correctly, or using QQmlEngine::setObjectOwnership to hand ownership of the singleton to the QML engine.

QML_UNCREATABLE for singletons

If you are providing your QML singleton instance yourself anyway, you logically also don't need it to be creatable by the engine either - although, it still can be, of course. If your controller type has a non-default constructor - perhaps to take in some references to your business logic instances - you can now mark your singleton with QML_UNCREATABLE, just like you can with other QML types. If you do that, you no longer need to supply a factory function (and even if you do, it won't be used).

Of course, if you mark a singleton as uncreatable, it is up to you to make sure you actually supply an instance via QQmlEngine::setExternalSingletonInstance before the singleton is needed from QML.

The post Singleton Controllers in Times of Declarative QML appeared first on KDAB.