Skip to content

Welcome to Planet KDE

This is a feed aggregator that collects what the contributors to the KDE community are writing on their respective blogs, in different languages

Tuesday, 16 December 2025

This study applies business intelligence to Automotive Grade Linux, offering a data-driven view of its software production system. By analyzing activity, code review, and delivery performance, it shows how descriptive analytics can guide improvement in complex open source ecosystems.

Monday, 15 December 2025

Qt Group is pleased to announce the latest Long Term Supported release of Qt for MCUs 2.12 LTS. As communicated earlier this would be the final release of 2.x series, before we welcome 3.0 in 2026! This release concentrates more on performance and stability so that users and customers can base current projects on this release for a long term before migrating to 3.x.

This blog highlights some of the standout features from the 2.12 release and provides a sneak peak at 3.0 and other exciting stuff we are working on. 

Welcome to the November 2025 development and community update.

Development Report

5.2.14 Released

One last bugfix release in the 5.2 series, 5.2.14 is out. This version once again features many fixes for Android and touch input, but that's not all! The Color Sampler's preview has a new round default look, and macOS users can now view .kra thumbnails in Finder again. Read more in the dedicated blogpost and stay up up-to-date.

Text Rework Progress

Development of 5.3.0 is now in feature freeze, meaning no more features will be added before release. This includes the Text Tool, marking the end of a long phase of development for Wolthera, code reviewer Dmitry, and everyone else who contributed.

Texts can now be created to fit within a shape or along a path, just by clicking the vector with the Text Tool. (MR!2432)

Animated image of creating text that fits itself within a speech balloon shape.
Animated image of creating text that fits itself within a speech balloon shape. cc-by D.Revoy

Text properties have been split into into Paragraph and Character tabs, making it clearer which level the properties are taking effect at. (MR!2470)

Carsten has also made sure the Text Tool works properly with touch input. (MR!2563)

But this journey's not over; if you use 5.3 pre-release builds, make sure to report bugs and leave feedback in the Text Tool Thread!

New Comic Panel Editing Tool

There's a new tool in the Toolbox: the Comic Panel Editing Tool. Agata designed this for creating comic panel gutters by cutting gaps in vector shapes. (MR!2331)

It can be set to cut different gap widths depending on whether the cut is horizontal, vertical, or diagonal past a certain angle. A second mode in Tool Options removes the gaps for easy re-adjustment.

Screenshot showing the Comics Panel Editing Tool in the toolbox, its tool options, and an example panel layout.

Liquify Transform Speedup

The Transform Tool's Liquify mode has had some optimizations done by Agata. It's especially faster on large canvases, because it now avoids calculating outside the affected area. (MR!4261)

Before:

Video of using Liquify to make adjustments on a 3520x1978px canvas on Krita 5.2.9. It's not very responsive. cc-by D.Revoy

After:

Video of using Liquify to make adjustments on the same canvas on Krita 5.3.0-pre-alpha. It's smooth and easy to use. cc-by D.Revoy

Python Updated to 3.13

Krita's unstable builds have been updated from Python 3.10 to Python 3.13 (MR!2466). This has the potential to break plugins and scripts, so users of Krita Next should report any such issues to the developers of those plugins before 5.3.0's release.

If you're a plugin developer, check out the release notes for Python 3.11, Python 3.12, and Python 3.13 for information on the changes.

Community Report

Plans for 5.3.0's Upcoming Release

Krita's developers have put out a call for banner and icon artwork to promote the upcoming 5.3 release. This artwork must fit certain sizes and be licensed appropriately, so please read the rules before contributing!

November 2025 Monthly Art Challenge Results

17 forum members took on the challenge of the "Civilization Engulfed by Nature" theme. And the winner is… @Elixiah's two entries:

Time Keeper by @Elixiah

Time Keeper by @Elixiah
And [Sunlit Silence](https://krita-artists.org/t/sunlit-silence-november-2025-challenge-winner/151084)

The December Art Challenge is Open Now

For this month's theme, winner @Elixiah has chosen Chiaroscuro, the strong contrast of light and dark, with runner-up @edgarej adding the optional challenge of a Christmas/holiday theme. Check out the topic for more details, and make some art that stands out like holiday lights on a dark night!

Best of Krita-Artists - October/November 2025

This month's Best of Krita-Artists Nominations thread received 17 nominations of forum members' artwork. When the poll closed, these five wonderful works made their way onto the Krita-Artists featured artwork banner:

Weird meeting by @Sad_Tea

Weird meeting by @Sad_Tea

Melon Soda city by @800000000W

Melon Soda city by @800000000W

Winter in the village by @Yarikart

Winter in the village by @Yarikart

Flower by @yuheng_zhang

Flower by @yuheng_zhang

Female head study by @netizenses

Female head study by @netizenses

Best of Krita-Artists - November/December 2025

Take a look at the nominations for next month.

Ways to Help Krita

Krita is Free and Open Source Software developed by an international team of sponsored developers and volunteer contributors. That means anyone can help make Krita better!

Support Krita financially by making a one-time or monthly monetary donation. Or donate your time and Get Involved with testing, development, translation, documentation, and more. Last but not least, you can spread the word! Share your Krita artworks, resources, and tips with others, and show the world what Krita can do.

Other Notable Changes

Other notable changes in Krita's development builds from November 11, 2025 - December 14, 2025.

Stable branch (5.2.14):

  • Canvas Input: Add a One Finger Hold gesture and set it by default to Sample Foreground Color From Merged Image. (Change, by Carsten Hartenfels)
  • Color Sampler: The Color Sampler preview now defaults to a circle to be more visible when using touch input. The size of the circle can be adjusted under Settings->General->Cursor, or changed back to rectangles. (bug report) (Change, by Carsten Hartenfels)
  • Layers Docker: Dragging-and-dropping a layer onto its own canvas now pastes a copy only if Ctrl is held, to prevent duplicating it by accident. Dropping a layer onto a different canvas still copy-pastes it as before, without holding Ctrl. (bug report Change, by Carsten Hartenfels)
  • Filter Layers: Fix empty histogram when adding a new Levels, Threshold, Color Adjustment, or Cross-channel Filter Layer. (bug report) (Change, by Stuffins)
  • Scripting: Fix Node.setChildNodes function to remove existing child nodes. (Change, by Stuffins)
  • Android: Lessen the chance for saving corrupt files, by using a temporary file. (bug report Change, by Carsten Hartenfels)
  • Android: Fix modifier keys getting stuck when inputting new custom shortcuts with a hardware keyboard. (bug report Change, by Carsten Hartenfels)
  • macOS: Add support for QuickLook and Preview thumbnails for .kra, .krz, and .ora files on macOS Sequoia and later. (bug report (Change, by Ivan Yossi)
  • macOS: Update app icon to support macOS Tahoe appearance settings. (Change, by Ivan Yossi)

Unstable branch (5.3.0-prealpha):

  • Export: Don't show an error when cancelling an export. (bug report) Change, by Joshua Goins)

Nightly Builds

Pre-release versions of Krita are built every day for testing new changes.

Get the latest bugfixes in Stable "Krita Plus" (5.2.15-prealpha): Linux - Windows - macOS (unsigned) - Android arm64-v8a - Android arm32-v7a - Android x86_64

Or test out the latest Experimental features in "Krita Next" (5.3.0-prealpha). Feedback and bug reports are appreciated!: Linux - Windows - macOS - Android arm64-v8a - Android arm32-v7a - Android x86_64

Sunday, 14 December 2025

This weekend, I attended the KDE PIM 2025 Sprint (AKA meeting) in Paris.

First, what does PIM mean? Personal information management.

Second, what does Personal information management mean? It's the software for managing email, calendar, address book, etc.

Third, this is going to be long, so let me thank https://haute-couture.enioka.com/en/ for hosting us (their office  is in Rue du Mail which seems very fitting for a meeting improving e-mail software) and thanks to KDE e.V. for sponsoring travel and hotel for the meeting. If you can, please donate so that more meetings like this can happen. 

This was my first time attending a PIM sprint even though I have been a KDE developer for a long time and a KMail/KOrganizer user for possibly even longer. 

It is true that these softwares are not in the most polished state, but honestly I would not know how to handle my email without KMail.

Anyhow here's a list of things I did: 

We talked a bit about bugs handling and it turns out not a lot of people are having a look at bugs, so I volunteered to watch the pim-bugs-null@kde.org address in Bugzilla (where most/all related bugs are assigned to) so I can help a bit. Note that I only committed to quickly read over them to try to make sure "really bad things" don't get overlooked. "Normal" bugs will always exist in every software and those will be fixed when they are fixed :)

If you also want to help you can set yourself to watch that pim-bugs-null@kde.org address in https://bugs.kde.org/userprefs.cgi?tab=email

On the topic of bugs, I managed to fix "left-click does not work on links with target="_blank" in HTML e-mails" with an impressive 1-liner change. It should be available with KDE Gear 25.12.1.

On Friday night, I experienced "sending emails does not work". After a few hours of debugging and thanks to our sysadmins, we found out it was due to "Your SMTP configuration was wrong". It seems older KMail versions were a bit more gracious when your configuration was wrong, but now it fails (fair enoug, although ideally it could give a better error). Incidentally I was not the only one with this problem since a few hours later we got this bug https://bugs.kde.org/show_bug.cgi?id=513284 that was basically the same. (My watching of pim-bugs-null@kde.org was already fruitful!)

On Saturday morning, I continued scratching my own itch and fixed a rather obscure bug where some context menu actions when right clicking on emails in KMail were not properly updated when expanding/collapsing threads.

KMime is undergoing API modernization and is slated to become a KDE Framework soon (TM). I helped a bit adapting code that uses KMime to the new API. 

On Sunday, I worked a bit on polishing address suggestion blacklisting on KMail (i.e. when I search for Foo, I don't want to get a suggestion to send an email to their old employer's email address). You can do that right now by right clicking on the "To" text field and selecting Completion Configuration and then going to the third tab. But that is a bit cumbersome (to the degree I had no idea that feature existed until the very same day). To make it a bit easier to discover, i have proposed adding a right click menu on the suggestions themselves that let's you blacklist that particular email address.

And now, a short list of things we did: (many more were done and will be explained in detail by other folks)

  • Talk about switching the default backend to SQLite instead of mysql MariaDB. In general dropping servers (MariaDB/postgres) support would help making the code more maintainable. There are some people using it without problems, but Nico volunteered to do a test run during the sprint and he ended up with some problems, so there's still some things to debug there.
  • Talk about doing a survey/adding more KUserFeedback data. We kind of agreed that first we need to know what question we really want to know the answer to and what would be the consequences of a given answer before spending time in designing a survey. But anyway if you use the KDE PIM software, please enable User Feedback in the settings, we promise we won't spy on you.
  • New online accounts system. It should replace the not very useful accounts system that we now have (that also has a quite complicated dependency chain). It showed quite some promise in making things much more user friendly.

All in all it was a very productive meeting and I am happy to have attended.

On a closing note, one day we will have to speak about potentially sponsoring food for sprint attendees. We got travel and hotel sponsored, but I spent around 100 € on breakfast/lunch/dinner for that sprint (not going to any fancy place at all). Yes, I can spare that amount of money, but maybe some others in the community can not, and for sure we want them to also attend. One could even argue that having to spend money on top of spending a weekend and 2 work-holidays for the travel is a bit too much, it won't be me because I ❤️ KDE but someone could argue it 😁

Saturday, 13 December 2025

KDE Gear 25.12 got just released.

This includes my fixes (or workarounds) for Konsole & Kate window activation on Wayland.

If you now start Kate or Konsole inside Konsole, the new processes will properly activate their windows to come on top of Konsole.

This works both for just starting new instances and for re-using already running ones.

For more details, see my older post about the implementation.

At the moment that only works for Konsole & Kate.

If that works nicely for our users, perhaps somebody will come up with a more generic way for that or we can move that workaround to some lower level of the stack.

:) For me that is already a nice Christmas present, I disliked that this was broken for years :)

Btw., thanks again for the amazing end of the year fundraiser results! €280k and counting :)

Feedback

You can provide feedback on the matching Reddit post.

Welcome to a new issue of This Week in Plasma!

This week the team made significant progress on KWin’s Wayland screen support. Specifically, better mirroring and custom modes — both items on the “Known Significant Issues” page — have been implemented for Plasma 6.6! The remaining items on that page are areas of active focus, too, as we race towards the Wayland finish line.

…But wait, there’s more!

Notable New Features

Plasma 6.6.0

The Window List widget lets you filter out windows not on the current screen, virtual desktop, or activity — just like the Task Manager widgets do. (Shubham Arora, plasma-desktop MR #3341)

Discover now lets you install and remove fonts on distros with package managers that use the PackageKit library. (Joey Riches, discover MR #1113)

Notable UI Improvements

Plasma 6.6.0

The “Minimize All” KWin script (which is included by default but not enabled) now also lets you minimize all windows besides the active one using the Meta+Shift+O keyboard shortcut. (Luis Bocanegra, bug #197952)

KWin now sets reasonable default scale factors for newly-connected TVs. (Xaver Hugl, kwin MR #8537)

Several related menu items in the context menus of the Kicker/Kickoff/Application Dashboard widgets have been grouped together. (Kisaragi Hiu, plasma-desktop MR #3381)

Logically grouped menu items in context menu

The kscreen-doctor tool now lets you know that it’s possible to mirror your screens. (Nicolas Fella, libkscreen MR #267)

Notable Bug Fixes

Plasma 6.5.4

Fixed a recent regression with desktop icons not staying on the right screen with some multi-screen arrangements. (Błażej Szczygieł, plasma-desktop MR #3330)

The Meta+P shortcut to open the screen chooser OSD now works on immutable-style distros. (Nate Graham, kscreen MR #440)

Plasma 6.5.5

Fixed a recent regression that caused screen freezes on some hardware right before power management kicked in. We’ve asked distros to backport the fix as ASAP as possible so everyone gets it as quickly. (Xaver Hugl, bug #513151)

Fixed a case where KWin could crash in the X11 session when using an older Valve Index headset. (David Edmundson, bug #507677)

Fixed an issue that could make stray modifier key events get sent to XWayland-using apps, especially when switching to them using keyboard shortcuts involving modifier keys. (Vlad Zahorodnii, link)

Fixed a case where KWin was handling drag-and-dropped text incorrectly, which could make drops fail in some apps. (Vlad Zahorodnii, bug #512235)

Fixed two screen locker issues that could make it slower to unlock via KDE Connect, and make it erroneously flash some text about a fingerprint or smart card reader when they’re not relevant. (Fushan Wen, kscreenlocker MR #296)

Fixed the back button in Folder View widgets’ list view display style. (Christoph Wolk, plasma-desktop MR #3387)

Fixed an issue in System Monitor that made it possible to end processes using the keyboard that had already blocked the mouse-based method of doing this. (Oliver Schramm, bug #510464)

Other bug information of note:

You might note a large increase in the number of HI priority bugs this week. This is because we’re beginning a quality initiative and using the HI priority level to track bugs to fix quickly. We want to make sure Plasma is getting extra large amounts of polish and stability work these days!

Other Notable Things in Performance & Technical

Plasma 6.5.4

Plugged a GPU memory leak in KDE’s portal implementation. (David Edmundson, bug #494138)

Plasma 6.5.5

Fixed a case where .desktop files with spec-violating names could cause massive amounts of log spam. (David Redondo, bug #512562)

Plasma 6.6.0

Massively improved support for screen mirroring in the Wayland session. Now it works really well! (Xaver Hugl, bug #481222 and kscreen MR #439)

You can now use the kscreen-doctor tool to add custom screen modes, useful for supporting exotic or misbehaving screens in the Wayland session. (Xaver Hugl, bug #456697)

Made the KWin rule to force a titlebar and frame also work for windows of native-Wayland apps. (Xaver Hugl, bug #452240)

You can now move windows with Meta+drag when using a drawing tablet stylus. (Vlad Zahorodnii, bug #509949)

How You Can Help

Donate to KDE’s 2025 fundraiser! It really makes a big difference. In total, KDE has raised over €280,000 during this fundraiser! The average donation is about €25. KDE truly is funded by you!

This money will help keep KDE strong and independent for years to come, and I’m just in awe of the generosity of the KDE community and userbase. Thank you all for helping KDE to grow and prosper!

If money is tight, you can help KDE by directly getting involved. 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.

To get a new Plasma feature or a bugfix mentioned here, feel free to push a commit to the relevant merge request on invent.kde.org.

Friday, 12 December 2025

Let’s go for my web review for the week 2025-50.


Commoning open-source versus growth-hacking open-source

Tags: tech, foss, licensing, community, commons

Nice little post, indeed the license is not enough to base a decision on. You need to look at the business, presence of CLA or not, etc.

https://garagehq.deuxfleurs.fr/blog/2025-commoning-opensource/


choosing friction

Tags: tech, ai, gpt, politics, philosophy, life, knowledge

I think I prefer friction as well. It’s not about choosing discomfort all the time, but there’s clearly a threshold not to cross. If things get too convenient there’s a point where we get disconnected from the human condition indeed. I prefer a fuller and imperfect life.

https://phirephoenix.com/blog/2025-10-11/friction


The Web Runs On Tolerance

Tags: tech, web, politics

Remember, the web is for everyone. It’s meant to weird and diverse.

https://werd.io/the-web-runs-on-tolerance/


Discovering the indieweb with calm tech

Tags: tech, web, browser, social-media, fediverse, blog, rss, tools

These extensions look really neat for discovering Mastodon and RSS feed. I think I’ll check them out.

https://alexsci.com/blog/calm-tech-discover/


Bruce Sterling - Fantasy prototypes and real disruption

Tags: tech, design, economics, politics

Very powerful talk from Bruce Sterling about design and the startup culture. The most impactful part starts somewhere in the middle (where the URL leads you).

https://www.youtube.com/watch?v=M7KErICTSHU&t=418s


Why is the Internet Becoming TV?

Tags: tech, social-media, attention-economy

I think the title should say “social media” rather than “the Internet”. That said, the trend is indeed clear… those big tech companies look more and more like TV broadcaster. So remember you turned off the TV for a reason.

https://calnewport.com/why-is-the-internet-becoming-tv/


Valve: HDMI Forum Continues to Block HDMI 2.1 for Linux

Tags: tech, hdmi, standard, vendor-lockin, foss

The HDMI Forum is still a bad actor for Free Software… They just don’t want open source drivers to exist.

https://www.heise.de/en/news/Valve-HDMI-Forum-Continues-to-Block-HDMI-2-1-for-Linux-11107440.html


The Reverse-Centaur’s Guide to Criticizing AI

Tags: tech, ai, machine-learning, gpt, copilot, business, politics, economics, criticism

Long but excellent opinion piece about everything which is wrong with the current AI-mania.

https://pluralistic.net/2025/12/05/pop-that-bubble/#u-washington


Over 10,000 Docker Hub images found leaking credentials, auth keys

Tags: tech, containers, security, docker

I keep being surprised at how common this kind of mistakes are. I probably shouldn’t, it’s actually kind of easy to fall into such traps.

https://www.bleepingcomputer.com/news/security/over-10-000-docker-hub-images-found-leaking-credentials-auth-keys/


10 Years of Let’s Encrypt Certificates

Tags: tech, security, infrastructure

This is now critical infrastructure in my opinion. It’s nice to see how much progress was made.

https://letsencrypt.org/2025/12/09/10-years


Stop Breaking TLS

Tags: tech, security, criticism

TLS inspection software is indeed a very bad idea. You’d better not have them in your organisation.

https://www.markround.com/blog/2025/12/09/stop-breaking-tls/


Do Not Optimize Away

Tags: tech, benchmarking

Care must be taken while benchmarking indeed. Compilers are sometimes too smart and that can skew the numbers.

https://matklad.github.io/2025/12/09/do-not-optimize-away.html


One of C++ most underrated features: Namespace aliases

Tags: tech, c++, library

It’s indeed fairly underrated but very useful, especially if you’re making libraries.

https://www.foonathan.net/2016/01/namespace-alias/


Fighting the Client Spaghetti Monster with Rust Traits

Tags: tech, architecture, rust, pattern

There are indeed options for managing dependencies in more complex Rust codebases. It needs to be planned properly when doing the software architecture of your components though.

https://gnunicorn.org/writings/spaghetti-monster-clients-rust-traits-final-boss/


Is It Worth It To Optimize Images For Your Site?

Tags: tech, self-hosting, graphics, optimization, web

This can go a long way without much changes. It’s definitely worth it.

https://brainbaking.com/post/2025/10/is-it-worth-it-to-optimize-images-for-your-site/


Notes on Gamma

Tags: tech, graphics, colors

Wondering why gamma correction is needed? Here is a good explanation of gamma and sRGB.

https://poniesandlight.co.uk/reflect/gamma/


Test Desiderata 2.0

Tags: tech, tdd, tests

This is a nice update on the criteria you want to have in mind for good test suites.

https://coding-is-like-cooking.info/2025/12/test-desiderata-2-0/


Build it right to build the right thing

Tags: tech, xp, agile, quality, product-management

There’s a balance to strike on quality. Too much or too little and you won’t be able to progress towards the user needs.

https://ronjeffries.com/xprog/articles/build-it-right-to-build-the-right-thing/


Why Waterfall was a big misunderstanding from the beginning – reading the original paper

Tags: tech, agile, project-management

A good reminder than the supposedly seminal paper about waterfall process was likely identifying it as an anti-pattern.

https://pragtob.wordpress.com/2012/03/02/why-waterfall-was-a-big-misunderstanding-from-the-beginning-reading-the-original-paper/


Practices, Principles, Values

Tags: tech, agile, values, organisation, culture

Or why focusing on the practices will likely lead to cargo cult and you might never reach the real benefits. Don’t mimic other organisations, think about the underlying philosophy.

https://brodzinski.com/2014/08/practices-principles-values.html


Most Technical Problems Are Really People Problems

Tags: tech, technical-debt, organization, culture

Definitely this! All systems are produced in a given context. The organisation and the people producing it are what matters most to get something of quality (or not).

https://blog.joeschrag.com/2023/11/most-technical-problems-are-really.html?m=1


Transparent Leadership Beats Servant Leadership

Tags: tech, leadership, management

In other words, remember you’re a manager and not a nanny. Of course, it doesn’t mean you can freely ignore the human factor or empathy. Just don’t get overwhelmed by this.

https://entropicthoughts.com/transparent-leadership-beats-servant-leadership


Speaking Up

Tags: management, problem-solving

It’s important to get to the bottom of problems indeed. The context in your organisation will matter for this.

https://estherderby.com/speaking-up-2/


Revisiting Manager READMEs

Tags: tech, management, organisation, processes

Indeed, I think I prefer what’s proposed here rather than READMEs. Having lightweight templates and processes to collect the information you need or steer the direction puts the burden of designing those in the right place (on the manager end). You should also know when things have to be more free form.

https://skamille.medium.com/revisiting-manager-readmes-b9a59167c226


11 Best Practices for Working Remotely

Tags: tech, remote-working

I wouldn’t apply everything in there, but there’s good ideas as well. I guess YMMV, so if you’re remote working, I’d say pick and choose what works best for you.

https://nira.com/remote-work-best-practices/


Video conferencing at scale - A practical guide

Tags: tech, remote-working

Simple tips to make calls more enjoyable for everyone.

https://www.creative-destruction.org/post/2020-03-15-how-to-video-conference/



Bye for now!

Friday, 12 December 2025

KDE today announces the release of KDE Frameworks 6.21.0.

This release is part of a series of planned monthly releases making improvements available to developers in a quick and predictable manner.

New in this version

Baloo
  • [FileContentIndexer] Minor cleanups. Commit.
  • [FileContentIndexer] Some cleanup for DBus related private slots. Commit.
Breeze Icons
  • Fix installation of dark icons with WITH_ICON_GENERATION=OFF. Commit.
  • Add fifteenpuzzle and fifteenpuzzle-symbolic icons. Commit. Implements feature #504973
  • Add .nim mimetype icons. Commit.
Extra CMake Modules
  • ECMAddTests: add functions and variables to preset test name prefix. Commit.
  • Typo--. Commit.
  • FindInotify: Fix behavior on the CMake reconfiguration. Commit.
  • FindInotify: Teach to locate the native inotify impl on systems. Commit.
  • Ecm_add_test: make TARGET_NAME_VAR & TEST_NAME_VAR official. Commit.
KArchive
  • 7z: Fix infinite loop in malformed file. Commit.
KCMUtils
KCodecs
  • [KEncodingProber] Some more tests for UTF-8. Commit.
  • [KEncodingProber] Make UTF-8 state machine RFC3629 compliant. Commit.
  • [KEncodingProber] Add unit tests for UTF-8/UTF-16. Commit.
  • [KEncodingProber] Remove DEBUG_PROBE from public header file. Commit.
KColorScheme
  • Use Qt API instead of KColorSchemeWatcher. Commit.
  • Include QVariant instead of relying on transitive include. Commit.
  • Run clang-format. Commit.
  • Fix clang-format directive. Commit.
  • Simplify KColorSchemeManager code. Commit.
KConfig
  • KConfigIniBackend::parseConfig: reuse allocated buffer to read group name. Commit.
  • Use ECM_TEST_NAME_PREFIX. Commit.
  • Fix FindNext shortcut on macos. Commit.
  • Fix documentation of KSharedConfig::openStateConfig. Commit.
  • Kconfig_target_kcfg_file docs: add "since" note. Commit.
  • Kconfig_target_kcfg_file: avoid recreating same kcfgc file each cmake run. Commit.
  • KF6ConfigMacros: No longer explicitly include CMakeParseArguments. Commit.
  • Kconfig_benchmark: add testParsing benchmark. Commit.
  • KconfigIni: stream parse ini files. Commit. Fixes bug #48702
  • [kwindowconfig] Remove weird note from documentation. Commit.
KContacts
KCoreAddons
  • Update fuzzy matching logic changes from Kate. Commit. Fixes bug #511664
KDav
KDeclarative
  • DeclarativeDragArea: Filter mouse events according to acceptedButtons(). Commit. Fixes bug #384009
KDE Daemon
KDocTools
  • Update user.entities for pt-BR. Commit.
  • Included missing entities at user.entities (pt-BR). Commit.
KGlobalAccel
  • Call unregister() and setInactive() asynchronously. Commit.
KGuiAddons
  • Deprecate KColorSchemeWatcher. Commit.
  • WaylandClipboard: Avoid overriding original UTF-8 text. Commit.
  • SystemClipboard: Destroy old data source after set_selection or set_primary_selection. Commit.
  • Systemclipboard: Dont offer utf8 text again if it's already in the data. Commit.
KHolidays
  • DE-BY: Buß- und Bettag is a school holiday since 1995. Commit. Fixes bug #512302
KI18n
  • Qml: expose a LocalizedContext singleton as KI18n. Commit.
KImageformats
  • Add allocation limit test (0/256 MiB). Commit.
  • AllocationLimit = 0 means no limit. Commit.
  • Fix various typos in the codebase. Commit.
  • XCF: initialize tiles and buffers. Commit.
  • HDR: fix uninitialized buffer. Commit.
  • PSD: add support for GrayA (8/16/32 bit) and Gray 32 bit. Commit.
  • PSD: fix use of uninitialized tmp image. Commit.
  • EXR: fix of uninitialized RGB read buffer. Commit.
  • RGB: fix Use-of-uninitialized-value. Commit.
  • HDR: readHeader() sanity checks. Commit.
  • PSD: return error if a complete line is read/decompressed. Commit.
KIO
  • Kfileplacesview: remove DropAction::MoveAction from the list of supportedActions. Commit. Fixes bug #509231
  • RenameDialog: Add "Compare Files" button. Commit.
  • Use ECM_TEST_NAME_PREFIX. Commit.
  • Add braces around single-line if statements. Commit.
  • KFileItem: Remove or shorten timezone in timeString. Commit.
  • KFileWidget: Guard empty selection when double clicking. Commit.
  • Remove unneeded Q_Q. Commit.
  • Fix creating links to subdirectories of desktop links. Commit. Fixes bug #479350
  • RenameDialog: Set devicePixelRatio on PreviewJob. Commit.
  • RenameDialog: Use KContextualHelpButton. Commit.
  • KPropertiesDialog: Use KFileItem::timeString. Commit.
  • FilePreviewJob: Abort preview if no plugin is found. Commit. Fixes bug #511305
  • Http: Use operation with known verb, if applicable. Commit. Fixes bug #492178
  • FilePreviewJob: After stat'ing the file, report the data back. Commit.
  • Pastejob: Emit ERR_USER_CANCELED when closing paste filename prompt. Commit. Fixes bug #493075
  • Revert "KFileItemActions: Don't show hidden services on Open With menu". Commit. Fixes bug #508607
  • Kurlnavigator: show focus indicator. Commit. See bug #150718. See bug #428440
  • KCoreDirLister: stop looking back at mount points. Commit.
  • KProcessRunner: Avoid setting bogus working directory. Commit.
  • Kfilefilter: workaround to crash in Qt 6.11. Commit.
  • Systemd: prevent passing invalid env vars starting with digit. Commit. Fixes bug #510968
  • Kmountpoint: do not follow symlink before getting realpath. Commit.
  • Trash: don't fallback to home trash if trash is unavailable. Commit. Fixes bug #502315. Fixes bug #481532
  • Trash: force confirmation for ERR_TRASH_FILE_TOO_LARGE. Commit. Fixes bug #475235
  • Escape /* inside comment. Commit.
  • Copyjob: Fallback to file-based progress when byte size is unavailable. Commit. Fixes bug #511241
Kirigami
  • SwipeListItem: Add back checking for parent width and implicitWidth. Commit.
  • Add extra margin only for default title. Commit.
  • Documentation fixes. Commit.
  • Document requirements for new components. Commit.
  • Add TitleSubtitleWithActions. Commit.
  • ListItemDragHandle: Drop outdated comment about DelegateRecycler. Commit.
  • ColumnView: fix re-pushing pages still in pop animation. Commit.
  • Ensure _BREEZEICONS_DIR contains a REAL_PATH. Commit.
  • Update the PageRow.interactive docs for current reality. Commit.
  • HandleButton: fix visibility. Commit.
  • PageRow: fix sidebar open/close animation. Commit.
  • SwipeListItem: Make layout work well after ItemDelegate changes. Commit.
  • Temporarily drop test case that is broken with Qt 6.11. Commit.
  • Chip: change remove button label to avoid assuming what the chip represents. Commit.
  • Chip: make close button work when not interactive. Commit.
  • Make Chip behave more like common Qt Quick Controls. Commit.
  • Add a missing icon to kirigami_package_breeze_icons. Commit.
  • BannerImage: Add property to control heading icon size. Commit.
  • Fix link to api.kde.org. Commit.
  • Controls/AboutItem: align author buttons in fixed column. Commit.
  • SearchDialog: Properly disable search field shortcut. Commit.
  • PrivateActionToolButton: Do not show tooltip if it's identical to text. Commit.
  • OverlayDrawer: fix handle icons. Commit.
  • ApplicationHeader: Make top toolbars the same height/spacing as QWidget ones. Commit.
  • Controls/AboutItem: adjust heading stylings. Commit.
  • ApplicationHeader: Make top toolbars height more consistent. Commit.
  • KF6KirigamiMacros: remove unnecessary CMakeParseArguments. Commit.
  • Globaltoolbar/NavigationButtons: fix Back button in RtL. Commit. Fixes bug #511295
  • DrawerHandle: don't show the handle if is not handleVisible. Commit.
  • Address memory leaks in PagePool. Commit.
  • OverlayDrawer: Move handles in the toolbar. Commit.
  • Documentation typo in DefaultCardBackground component. Commit.
  • AbstractCard: Use default command in documentation. Commit.
  • Card: Remove default value documentation for actions. Commit.
  • IconPropertiesGroup: Fix a few documentation mistakes. Commit.
  • Include qtqml tags in our documentation build. Commit.
  • Abstractapplicationwindow: clarify when to use it. Commit.
  • Page: Fix undefined error when using a Page in a ColumnView outside of a PageRow. Commit.
  • Add cppcheck to CI. Commit.
KJobWidgets
  • Fix double free of JobView in KUIServerV2JobTracker. Commit.
KNotifications
  • Fix build with Qt 6.10 on Android. Commit.
KPackage
KRunner
  • ResultsModel: Include QMimeData. Commit. Fixes bug #511228
  • Emit historyChanged() when history changed. Commit. See bug #507588
  • KF6KRunnerMacros: remove unnecessary CMakeParseArguments. Commit.
KService
KSVG
  • Remove unused signal. Commit.
  • Simplify ImageSet config file handling. Commit.
  • Remove FallbackImageSet config handling. Commit.
  • Wrap useGlobal handling in deprecation macro. Commit.
  • Wrap ImageSet metadata handling in deprecation macro. Commit.
  • Drop unused variable. Commit.
  • Add test for ImageSet::filePath. Commit.
  • Add test for currentImageSetHasImage. Commit.
  • Rename imageSetChanged parameter. Commit.
  • Test ImageSet file selectors. Commit.
  • Drop iconImageSetMetadataPath. Commit.
  • Reduce scope of themeMetadataPath variable. Commit.
  • Remove KDirWatch leftovers. Commit.
  • Run clang-format. Commit.
  • [imageset] Preserve basePath when calling setImageName. Commit.
  • Add Alpine CI build. Commit.
  • Correct some typos in FrameSvg docs. Commit.
  • Clarify what FrameSvg insets are. Commit.
  • Clarify what FrameSvg margins are. Commit.
  • Add FrameSvg::insets(). Commit.
  • Add QMargins getters for margins in FrameSvg. Commit.
  • Fix deprecation syntax. Commit.
  • [imageset] Deprecate metadata. Commit.
  • [imageset] Deprecate setCacheLimit. Commit.
  • [imageset] Deprecate setUseGlobalSettings. Commit.
  • [imageset] Remove unused isDefault. Commit.
  • [imageset] Remove Plasma theme version handling. Commit.
  • Don't use QDir::separator. Commit.
KTextEditor
KTextTemplate
  • Examples: Align cmake_minimum_required versions in examples/ w/ root file. Commit.
KUserFeedback
  • CI - Flatpak - Update Runtime to 6.10. Commit.
KWallet
  • Always reload collections prior to secret_service_get_collections. Commit. Fixes bug #512135
KWindowSystem
  • Use ECM_TEST_NAME_PREFIX. Commit.
  • Use XDG_ACTIVATION_TOKEN env variable for setCurrentXdgActivationToken(). Commit. See bug #509990
KXMLGUI
  • Ktooltiphelper.cpp: fix hint text color. Commit.
QQC2 Desktop Style
  • *Delegate: Update the paddings of all other delegates. Commit.
  • ComboBox: fix paddings. Commit. Fixes bug #512914
  • ItemDelegate: support custom paddings. Commit.
  • DefaultListItemBackground: make alternating background touch the edges. Commit.
  • SwipeDelegate: same behavior between SwipeDelegate and ItemDelegate. Commit.
  • ItemDelegate: More padding/inset to ItemDelegate to match ToolBar paddings. Commit. Fixes bug #487653
  • Consistent toolbar heights with QWidget applications. Commit.
  • DefaultListItemBackground: hide hover effect when control is disabled. Commit.
Solid
  • Fix some missing overrides in win backend. Commit.
  • Backends/udisks2: register "AvailableAnswer" before use. Commit.
  • Upower: expose WearableBattery battery type. Commit.
  • Predicate_parser: prevent an unused warning. Commit.
Sonnet
  • Use ECM_TEST_NAME_PREFIX. Commit.
  • Hunspell: load flatpak sources as well. Commit.
  • Adapt CMake version 4.1 or later. Commit.
Syntax Highlighting
  • Add new QML keywords. Commit.
  • Spdx-comments.xml: update SPDX licenses. Commit.
  • Add support for new wayland interface delimiter. Commit.
  • Fix(cmake.xml): CACHE{name} also can be in if, elseif, and while. Commit.
  • Misc: update comment in cmake.xml generator. Commit.
  • Update cmake refs to new hl state. Commit.
  • Replace regex where possible with plain string matching. Commit.
  • Cmake.xml: update syntax for CMake 4.2. Commit.
  • Highlight Kaitai Struct (.ksy) files as YAML. Commit.
  • Add tool for generating Jinja highlighting and use it on some languages. Commit.
  • CSV: tolerate spaces before double quotes (#38). Commit.
  • Fix import context rule order and update test reference files. Commit.
  • Fix backslash in symbolops entity for proper /\ operator matching. Commit.
  • Merge operator rules to satisfy CI indexer. Commit. Fixes bug #512318
  • Haskell: fix backslash operator tokenization. Commit. Fixes bug #512318
  • Syntax: Add blueprint-compiler syntax highlighting. Commit.

Thursday, 11 December 2025

At this year’s Akademy (the yearly conference and gathering of KDE), there were several talks about immutable Linux distributions born inside KDE. The first, and more covered in the news was KDE Linux, the distro with an officially sounding name. And the second one was KDE Neon Core, which sounds like a continuation of KDE Neon, but is quite independent of it.

Things shouldn’t come in twos. There needs to be another immutable KDE distro, so I’m announcing the …

KDE Ni! OS
KDE Ni! OS

Now, this is a bit of a joke.

This is not really going to be a new distribution (for real, not like KDE Neon claimed not to be a distribution back in the day :) ). I don’t have the expertise nor the time to make a distribution from scratch.

But, while listening to the presentations about KDE Linux and KDE Neon Core, I had the idea to see how many of the planned features for those distributions I could implement based on an already existing and quite popular distribution called … if you have a keen eye, you might have guessed based on the image above … NixOS.

Step 1: Immutability

At the crux of it, immutability (along with other related buzzwords) means that you can not have an update break your system. There are no half-updates, no mixing incompatible versions of packages, etc. And if something gets broken with the new version, you can always roll back your system to a previous version.

This comes out of the box with NixOS. It just does it in a different way to other distributions. Its package manager allows installation of as many versions of a single package as needed, and the user or a running application “sees” only the versions they are compatible with.

When you update your system, the old packages are still installed, and you can reboot the computer into the pre-update state (previous versions are called generations).

System generations
System generations

Booting into an old state doesn’t really do anything special, it just makes you “see” the versions of the packages that were active in that version of your system. You don’t even need to reboot most of the time – if you see that a new version of LibreOffice doesn’t open your file correctly, and you want to try with the previous version, just ask Nix to launch the old version for you. The old version of LibreOffice is still on your system even if you’ve not booted into the system version (generation) it was installed on.

Steps 2..n

My main computer is (and always will be) Debian, but I’ve been using NixOS on my laptop for months now. And it works quite well.

As NixOS can be installed or replicated from a single configuration file, I plan to create a repository that will hold the definition of the system on my laptop (aka, the reference installation of KDE Ni! OS :) ) and to keep it updated while I go through each of the steps of simulating other distributions’ features.

This way, anyone who wants to have KDE Ni! OS on their computer will be able to install it by installing NixOS and using this file for system definition.

The next step will mainly be for developers – it will be about replacing a system package with a version you (or somebody else) developed. For example, if you want the Plasma Vault to behave a bit differently, or to test a fix for a bug you found, any sane distribution should allow you to do that easily, and without endangering the system integrity (no sudo make install). So, KDE Ni! OS will have to be able to do it as well.

I hate waiting for compilations. For day-to-day it may only be a minute or two, but once you start doing another task, the context switching distracts from what you were doing before and breaks everything up. Life is too short to be waiting for computers.

Obviously the first answer is to have a faster machine, but having a super fast laptop and a super fast PC all the time contributes to e-waste which I also hate. Some of my test devices for touch and tablet work are 5 year old Intel atom devices that I still sometimes need to compile on to fix things.

The solution is distributed compiling, using multiple computers to share the work.

Icecream or distcc used to be the tools back in the day, but they're both quite dated and have other issues.

There's a relatively new kid on the block, sccache. sccache primarily serves as a way of keeping your cached compiled assets around (think ccache), but also sharing them across users. Sharing cached assets requires exactly matching paths and dependencies and compilers so it's not that great for my needs; but it seems it would be perfect for flatpak and immutable cases.

But sccache also has another trick up it's sleeve; distributed compilation.

The documentation for sccache is a bit overwhelming packed with enterprise level features https://github.com/mozilla/sccache/blob/main/docs/Distributed.md.
It wasn't that clear how to do something simple, so I thought it might be useful to share how I got things working nicely for me.

Installation

Sccache is probably available in your distribution, note that not all distros include the shared compiler part.

If not you can download a version from https://github.com/mozilla/sccache/releases/download

The nice part is it's statically linked with no external dependencies so you can throw it on anything, even if it's immutable like KDE Linux or even a Steamdeck or two.

The parts

Scheduler

The scheduler is the key part of the operation; the client sends requests to the scheduler which in return replies with a list of schedulers that can recieve payloads distributing them accordingly.

Simple

Create a file as follows:

scheduler.conf

public_addr = "0.0.0.0:10600"
client_auth = { type = "token", token = "dave_is_great" }
server_auth = { type = "token", token = "dave_is_great" }

sccache-dist scheduler --config scheduler.conf

Docker

As I want the scheduler always on, I run it on a small home-server, where I prefer to docker-ise everything.

docker-compose:

version: '3.8'

services:
  sccache-scheduler:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        VERSION: "v0.10.0"
        SHASUM: bbf2e67d5e030967f31283236ea57f68892f0c7b56681ae7bfe80cd7f47e1acc
    image: sccache:latest
    container_name: sccache-scheduler
    ports:
      - "10600:10600"
    volumes:
      - ./scheduler.conf:/scheduler.conf:ro
    entrypoint: ["/usr/local/bin/sccache-dist", "scheduler", "--config", "/scheduler.conf"]
    restart: unless-stopped
    environment:
      - SCCACHE_NO_DAEMON=1

Dockerfile

FROM alpine:3.9.2

ARG VERSION
ARG SHASUM

RUN apk add clang
RUN apk add curl
RUN apk add --no-cache bubblewrap

RUN curl -L https://github.com/mozilla/sccache/releases/download/$VERSION/sccache-dist-$VERSION-x86_64-unknown-linux-musl.tar.gz > sccache-dist.tar.gz \
    && tar xf sccache-dist.tar.gz \
    && mv sccache-dist-$VERSION-x86_64-unknown-linux-musl/sccache-dist /usr/local/bin/sccache-dist \
    && rm -r sccache-dist.tar.gz sccache-dist-$VERSION-x86_64-unknown-linux-musl

RUN apk del curl

ENTRYPOINT ["/usr/local/bin/sccache"]

and the scheduler.conf as above.

Servers (build machines)

This is the part that does the building.
The config takes the address of the scheduler, but also the server's own IP address as a sort of "callback" address.

It needs to run as root in order to have capabilities to set up sandboxing and restrict it back down to something lower than where we started. The sitaution is a bit silly, but it is what it is.

server.conf

public_addr = "192.168.1.YOURIPADDRESS:10501"
scheduler_url = "http://192.168.1.SCHEDULERIPADDRESS:10600"
cache_dir = "/tmp/toolchains"
scheduler_auth = { type = "DANGEROUSLY_INSECURE" }

[builder]
type = "overlay"
# The directory under which a sandboxed filesystem will be created for builds.
build_dir = "/tmp/build"
# The path to the bubblewrap version 0.3.0+ `bwrap` binary.
bwrap_path = "/usr/bin/bwrap"

Then you can run sudo sccache-dist server --config server.conf

Systemd

As I want this running constantly on my desktop and laptop I use a systemd service.

/etc/systemd/system/sccache.service
[Unit]
Description=sccache scheduler
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/sccache-dist server --config /etc/sccache/server.conf
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

Clients

The final part is relatively simple, making local builds use the other build servers.

First we need to set up a config as follows:

.config/sccache/config

[dist]
scheduler_url = "http://192.168.1.SCHEDULERIPADDRESS:10600"
toolchains = []
toolchain_cache_size = 5368709120
auth = { type = "token", token = "dave_is_great" }

Cmake

Enabling requires just telling cmake to use the relevant wrapper with -DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache

kde-builder

And/or it to your kde-builder as follows:

.config/kde-builder.yaml

global:
  cmake-options: -GNinja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON  -DCMAKE_CXX_COMPILER=clang++ \
    -DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache 

and reconfigure the project(s)

Quirks and workarounds

The most annoying quirk is servers need a consistent IP address within your network. Servers register to the scheduler with a fixed IP address. When clients queue jobs they are given the IP addresses back from the scheduler and are expected to then talk to the build server(s) directly. Using hostnames doesn't work.

Note also if you change your local .config/sccache you may need to run sccache --stop-server on the client to relaunch. Confusingly in this case 'server' refers to a process on the client that compile jobs are thrown at.

Debugging

sccache --dist-status will show the connected schedulers and how many total active jobs

Managing job count

By default ninja schedules the same number of jobs as you have local cores for. It's unaware of the many other cores you have.
I have this in my zshrc to set the number of jobs to the total number on the scheduler at that time.

function getSccacheCPUs() {
        sccache --dist-status  | jq '."SchedulerStatus"[1].num_cpus'
}
alias ks='MAKEFLAGS=-j${getSccacheCPUs} kde-builder'

Comparison to icecream

Cons:

  • The setup process is a lot more laborious than icecream's magic turn-up-and-compile structure
  • No cool UI to see how many tasks are being compiled.

Pros:

  • It's very robust to network issues. If the scheduler is down or no servers are available things build locally extremely transparently
  • It also has it's own equivalent of a local 'ccache' which means you don't need to worry about daisy-chaing compilers wrappers to still have cached output.
  • It's actively maintained, the last meaningful commit in icecream is years ago