30 Jun 2026
Planet KDE | English
The Steam Machine is here!
For a while now, my colleagues and I over in Techpaladin Software have been working on software support for the Steam Machine, so it's so awesome to see the product released!
Like everyone else, I was surprised by the pricing… until I went out and looked at what other hardware costs these days. It seems like in the past 6 months, everything with RAM got 50-100% more expensive. It's kinda nuts. In light of, shall we say, industry trends (ahem), the price seems reasonable to me.
…especially if you see it less as a single-purpose gaming console and more as a desktop computer that offers a 10-foot UI living room gaming experience. Its horsepower is competitive for the price, and it offers the flexibility of a well-integrated desktop PC user experience. But don't take it from me; ask Linus Sebastian, who's rapidly becoming one of the biggest KDE boosters on YouTube:
Some choice quotes from the video:
And from the moment I fired it up and said "goodbye Steam Big Picture Mode", and started using it as a desktop, I went… "This is what I've been waiting for the whole time."
- Linus Sebastian
Plasma's great.
- Linus Sebastian
"Plasma on retail hardware" has been my long-term goal for KDE since I first got involved a decade ago. This product is another example that not only can it work, but it can be as good or better than competing offerings.
So congratulations to everyone in KDE and outside of it who helped make this a reality! I'm unbelievably happy at how well KDE software is working for this use case these days, and I see even greater things in the future.
30 Jun 2026 6:48pm GMT
C++ Library Headers & CMake Config Files: Are We Serviceable?
When working on a software library which is targeting 3rd-party consumers, it is rather of self-interest to make the library uncomplicated to use. Unless perhaps there is opportunity seen in having to help out in the process 
And to know if it is uncomplicated to use, best before learning otherwise the hard way, one has to take the position of the consumers. Even better if this can be automated, after all that is why people developed machines, like computers, to pass on the dull part.
Many things of a library can be tested during the build, based on the sources and build artifacts. Like functionality of methods, proper export/visibility of their public entry points or the code any special pre-processor macros are resolved to. Here CMake's VERIFY_INTERFACE_HEADER_SETS also offers a solution to verify that headers can be included on their own, though being bound to the build interface of the library.
Now, the consumer will only see the installed files, and there are for one things that can go wrong when installing even already tested files, as are there files which only work in the installation location or might work differently there, so can be only properly tested there.
Public Header Fails
When about to use a feature of a library, one would see to apply the documented needed include statement. E.g. when writing code dealing with the class KContacts::Picture of the KDE Frameworks module KContacts, the docs hint to use the following include to have any needed declarations available:
<KContacts/Picture>So what could go wrong with such header file (e.g. Picture in the example above):
- the header file is not installed
- the header file is not placed in the relative location as by the documented include statement and the official include search directories
- the header file includes another header from the same library that is not installed (e.g. for test utils)
- the header file includes another header from the same library which is placed in a relative location not resolvable by the official include search directories
- the header file includes another header from a private dependency, so not resolvable by the inherited official include search directories
- the header file uses language features unconditionally of a standard not enforced in the public build flags
- the header file relies on macro definitions not provided correctly, either missing or with wrong value
- the header file is not self-contained with the variants of the headers part of the installation (violating C++ Core Guidelines, SF.11: Header files should be self-contained)
- (… possibly more, please mention in comments)
All these can be mainly checked by simply creating a C++ source file which only includes the very header file, by the documented include statement, and testing for its successful compilation/code parsing, applying the official include search directories and build flags (and the inherited ones of public dependencies).
CMake Config Fails
When about to use a library at all, one would see to use the meta data blobs which also integrate with one's (meta) build system. E.g. in case of using CMake and as in the example above KF module KContacts, one would for setting up building against the library do as documented, relying on the CMake config files provided:
find_package(KF6 REQUIRED COMPONENTS Contacts)target_link_libraries(MySoftwareProject PRIVATE KF6::Contacts)So what could go wrong with those CMake config files:
the CMake config files are not installedthe CMake config files are not installed by the correct name and in the correct locationthe library target is not provided by the CMake config files at allthe library target is not provided by the documented name and the optional namespacethe library target does not have the correct include search directories setthe library target does not have the correct build flags setthe library target misses some documented propertiesthe library target misses a dependency in the public link interface, to inherit as needed include search directories and build flagsthe library target has an item in the public link interface not checked for by the CMake config filesother documented utility targets or variables are not defined or have wrong values(… possibly more, please mention in comments)
Most of these issues can be simply checked by creating a CMake project which searches for the library and links some dummy software to it, and testing for its successful configuration and build.
Other Fails
There are further library-related artifacts which should see checks after installation.
Any resources used from a library which are installed as separate files, like translation catalogs, images, sounds, or domain-specific data, could again be missed to be installed, installed by a wrong name or into the wrong location, or otherwise be badly processed before or during the installation process. Those are not specific to libraries though, thus not looked at more here.
Other artifacts are some which themselves are to be built against the library, such as project templates (like the KAppTemplate ones, e.g. for plugins) or examples for using the library. Those are not critical to the direct usage of a library though, thus also not looked at more here.
Continuous Integration As Limited Safe Guard
Software libraries are usually not developed in a void, but based on needs by other software. Changes in the public interface are made together with the respective changes in at least one consumer. So many issues would be detected in the process.
Then the library and many of its consumers, not just the ones a changes was made for, might be part of the same CI setup, where all these consumers would see at least some regular rebuild against the latest version of a library and thus would catch further regressions before the next release of the library.
But not all API of a library might be used by those known consumers, instead only by 3rd-party without any integration into the library development. And some issues of API while used can be shadowed by the usage pattern. So for a more complete check some generic own solution is needed.
Some Automation: ECMInstalledLibraryCheck
Combining the simple check ideas for headers and CMake config files above, some addition to KDE's Extra CMake Modules is proposed in this merge request: ECMInstalledLibraryCheck. That module provides a macro to add checks for the installed library artifacts, from consumer POV. Currently it covers the public headers (includability) & CMake config files (proper data delivery needed for compiling). It adds one global target all_installed_library_check, to run the checks for all libraries, and a target per library, <library_target>_installed_library_check. Those targets would be used after installation only, obviously.
For the example used above, KF's KContacts library, the check would be deployed like this:
# use the module from ECMinclude(ECMInstalledLibraryCheck)# for the library target KF6Contacts set up the checkecm_add_installed_library_check(KF6ContactsPACKAGE_NAME "KF6Contacts"PACKAGE_VERSION ${KCONTACTS_VERSION}PACKAGE_TARGET_NAMESPACE "KF6::")# register the official include statements for the checkecm_installed_library_check_include_strings(KF6ContactsHEADERS ${KContacts_CamelCase_HEADERS}PREFIX KContacts)Given the library target KF6Contacts thus this adds the target named KF6Contacts_installed_library_check. This target generates and builds a separate CMake-based project for a dummy library linking against the installed library, whose sources are one source file per passed include string, with a single code line #include <include_string>. The check is considered passed if the builds completes without an error.
Additionally the checks can be extended to also cover CMake variables or preprocessor defines, by functions like ecm_installed_library_check_cmake_variable(), ecm_installed_library_check_compile_definition() and ecm_installed_library_check_preprocessor_macro(). The last also has some convenience variant ecm_installed_library_check_version_preprocessor_macros(), in our example deployed like this:
# check all includes also have the usual version macros defined afterwards, only report errorsecm_installed_library_check_version_preprocessor_macros(KF6ContactsPREFIX KCONTACTSVERSION ${KCONTACTS_VERSION}SILENT)The current state of the prototype has already found a number of existing issues in a number of libraries, which so far had not yet been uncovered by consumers' usage pattern, and first fixes have been rolled out to prevent consumers hitting them in the future.
It also has exposed a principal issues with projects like some KF modules that provide multiple libraries, yet only a single CMake config file for their module. Such file would need to ensure the combined dependencies of all libraries, which then adds unneeded burden to consumers of just one library. Currently the dependency checks in KF CMake config files are rather pragmatically added, when existing consumers stumble over something missing.
Hurdles To Adopting The Check Automation
Checks can only return value for the cost of integrating them if they are also routinely applied and their results considered. Worse, if not used they run chance of bit-rot and actually clutter a project.
Typically a library has a suite of auto-tests, covering all the features. While developers are encouraged to use them on their local system during development, they are at least used on the central CI system, against as many platforms and configurations as possible.
A first challenge with merging post-installation checks to the other checks and tests is that auto-tests are usually designed or at least prepared to be run pre-installation. KDE has had some "Running apps uninstalled" initiative, which resulted at least for auto-tests of KDE Frameworks to be also run on CI before installation. CMake only has the concept of one suite of tests, without an idea of pre-installation and post-installation test times. So one would have e.g. to create some custom system on top, e.g. by using CMake/CTest test labels. And for CI do extra work to run and process the two sets of tests separately.
Another challenge is that like all tests the ECMInstalledLibraryCheck checks come at a cost. While their creation is quickly done (generating a buildsystem file), the execution is taking some time. Because it mainly consists of a full compilation per each tested include statement, which despite just being a simple include line still results in lot of processing due to all the implicit overhead, even more when transitively including many template-ridden headers. And being a new system with some people the cost will scale the normal "don't need this, never done that, no changes wanted" reaction.
Collaboration Wanted
The author is currently done when it comes to own immediate desires for the features of ECMInstalledLibraryCheck and uses it in personal projects as is. It has been though developed in the (KDE) public with the intent to share it, to have it be useful to others like KDE projects and gain from common usage and feedback.
Not being a CI system person, the author now is mainly looking for someone who can work on integrating the execution of ECMInstalledLibraryCheck checks with KDE CI (or also their own projects' CI). The idea would be that the check of the installed library artifacts is as useful as any unit test, to catch issues with new code and regressions immediately, so should be run along the normal unit tests, just in its own post-installation stage. This stage could also later see the addition of post-install checks for templates and examples as well as other things which are found useful to test post-install. Ideally the check result would be integrated into the test result display, but for a start just successfully completing the build target should be already useful as indication. Possibly projects would opt in to the test using some configuration flag, or in case of KF could default to it. Perhaps CI integration will also require certain things from the macros, so ideally the CI deployment can be sorted out before ECMInstalledLibraryCheck gets merged and released. So if you find this kind of check useful and are experienced with (KDE) CI setup, please get in contact.
Then post-installation check of library artifacts might have further constraints or desires with some. Would people need doing parallel test of the installed library with different configurations or usage flags? Would people like to use this in cross-compilation (so far no generated code is executed, so in theory should be usable) and does that need further support? Are there other aspects of the installed artifacts you would like to see covered? Please give the current state of the check module a try for your own library projects and get in contact.
Try ECMInstalledLibraryCheck: Does Your Library Pass?
The file ECMInstalledLibraryCheck.cmake should only depend on CMake, so can be just copied into your own project:
- download the raw file from https://invent.kde.org/frameworks/extra-cmake-modules/-/blob/work/kossebau/ECMInstalledLibraryCheck/modules/ECMInstalledLibraryCheck.cmake
- create subdir
cmake/ecmcopyin your project, placeECMInstalledLibraryCheck.cmakeinside - make subdir known to CMake:
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/ecmcopy) - include module:
include(ECMInstalledLibraryCheck) - setup check for your library targets, see docs at begin of module file how to do that
- run the installation target, then the target
all_installed_library_check - see how per library a project "InstalledLibraryCheck" is generated and build, the build log serves as success report
- if the check build fails, try to fix it, install (easy to forget
) and run the check target again - if curious, peek into the build directory and look at the generated file
${library_target}_ECMInstalledLibraryCheck/CMakeLists.txt, it holds the complete check and can be also played directly with
The author has done this with many projects already, in KDE for all of KF modules as well as some graphics, games, multimedia, utility and education software libraries.
Now go and check your own library, and report back how useful ECMInstalledLibraryCheck is for you, what issues it discovered and what your further needs are here 
30 Jun 2026 5:33pm GMT
GSoC - Working on Marknote
Overview
I'm working on Marknote to introduce a block-editor inspired by popular note taking apps such as Notion. A block editor is a modern text editor that allows you to insert elements such as paragraphs, lists, tables, code, block quotes, etc. into separate blocks. Each block can be reordered, edited, and deleted. Such editors also give you the ability to insert elements by pressing "/" followed by the name of the element. This block based design of these editors make them very fun and intuitive to use.
A problem that most of these editors have in common is incomplete markdown support. They do not support the full commonmark spec. This means many things like nested blockquotes are not possible to use. Other problems include privacy concerns due to their closed sourced nature. They also are mostly web-based applications so they're slow. This is where Marknote comes in. Marknote already is a popular note taking app by KDE. By introducing a robust block editor, users will be able to have a similar experience in an app that integrates beautifully with the KDE ecosystem, is offline, and most importantly respects privacy.
Current Status
GSoC's coding period began on 25th May 2026. Unfortunately, my university exams began at the same time and ended on 11th June 2026. So I was not available for the first few weeks. I was still able to implement a big portion of the project.
Integrating md4qt
I spent the first few days making md4qt a dependency of Marknote. It involved adding it into CI images, creating a KDE Craft blueprint, updating the flatpak config as well, and finally making sure it builds correctly using CMake.
Building Markdown Model
After md4qt was finally usable in Marknote, I started working on developing the AsyncDocBuilder. This class allows Marknote to read a markdown file asynchronously (without blocking the UI), and emit a signal with an Abstract Syntax Tree (AST) which represents the parsed markdown document.
After that, I had to implement a tree model that represents the AST. The tree model inherits from QAbstractItemModel. It uses a wrapper class called the TreeItem that wraps around the AST. This represents a simple tree data structure where each node can have more than 1 children nodes. I was able to implement a working model succesfully, although it required a lot of brainstorming.
Getting Data to QML
The tree model represented elements in the parsed markdown document. Each element may have different properties. For example, headings have a level, lists have a listType, etc. Since this model will be used in QML, the data must be accessible in QML. For that, I wrote multiple helper functions that would extract data from each node and insert them into a QVariantMap. This map would be accessible from the blockData role of the tree model, allowing me to easily access properties about these nodes in QML.
Implementing Delegates
Now that the model is ready to use, we need QML delegates that will actually be rendered on screen. The biggest challenge here is that this model represents a tree. This means some elements can be present inside other elements. The standard built-in TreeView would not work here. The reason is that, instead of truly nesting QML elements, it uses indents to show a tree like structure. This is fine for things like file trees, but not for a block editor. In a markdown compliant block editor, the QML elements must truly be nested. To tackle this problem, I had to brainstorm for a week. I tried multiple techniques. One was using a Repeater where the Delegates call themselves, recursively. While this worked, it wasn't compatible with the tree model that we have created. After a bunch of research, I found out about DelegateModel. It acts as a filter for models in QML. So I could just define a root index for the current view without modifying the actual model. So recursion was finally compatible with the existing tree model.
This step is still under progress. You can see in the attached video that basic markdown elements can be rendered. These are not editable yet, but markdown parsing and rendering works flawlessly.
Conclusion
Working on the block editor this month has been very exciting and challenging. There were some totally new problems that I had to solve that I didn't foresee submitting my proposal. As always, this blog post does not involve the use of AI. All words are my own so it may contain grammatical errors :P
30 Jun 2026 5:00pm GMT
Ocean Updates – June 2026
Ocean Icons in Penpot
I began the process of moving icons from Figma to Penpot. The icons are locate in the Icons page inside Penpot. This page contains some placeholder icon components created by our contributors. This was done so that we could use generic icons for UI as we complete more parts of Ocean design.
Including new icons from Figma into Penpot is not easy. There are a couple of drawbacks we see. Penpot does not have the same shape control that Figma does. Because of that, Penpot does not recognize shapes like circles, squares, lines, etc. Another issue is the importing erases the naming schemes that the icons have. This is a known bug at Penpot and they are working to resolve it.
Penpot also seems to do something pretty interesting on import. It creates a folder where the graphics are contained, it adds an invisible background image, and in some cases, a bitmap in the same structure. I believe these are just import issues that Penpot resolves in different ways. I hope their parsing on import gets better overtime.
However, with the new rendering engine in Penpot, the icon collection, though slow at times, is able to keep up with the rendering and I am able to load up thousands of svg icons in Penpot. Under the previous set up, this would not be possible without crashing.
Because of these two drawbacks, I had to flatten all the images before exporting. Otherwise, Penpot could run into rendering issues as svg code from Figma has its own quirks. Still, with these compromises, I was still able to copy all the monochrome icons built for Ocean into Penpot. Now, I have to take the time to rename all the icons to their proper names. There are also some icons that don't render properly, or at all. For those icons, I will have to take them case by case and fix them.
After renaming all these icons and getting them to their proper organization, I will create components from them that can be used in UI throughout the file.
Ocean + Union June Meeting
Earlier this month, we also connected with the Union team to discuss the implementation support of reference tokens and semantic tokens from Penpot into Plasma. We also discussed the creation of Ocean assets.
Providing support in Plasma for Ocean design tokens is no small feat. It requires careful preparation. This is one of those elements that Ocean Design provides. The goal here is that Plasma and applications are able to support the tokens/variables provided by the Ocean design system.
In a distant future, our goal would be to give the Ocean system to anyone willing to create their own version. They would export their tokens and Plasma would support them without the need for additional code. This achieves a couple of great things, one is that designers work in an environment that is ready for editing with all the graphical sources needed, no need for coding skills. On the other hand, this should push interested users into designing and testing their designs first, without the need to push code first, which requires the mobilization of our teams to review, adapt and provide feedback. It's a "cheaper" effort to work with graphics first and see how they would look after export.
There are more benefits to this approach, but these are two that I always go back to.
From this meeting, our determination is that I should provide a series of spec files containing all the technical details from the foundational components in Penpot. These components are the smallest bit of interaction in graphical systems. Buttons, shadows, typography, etc. These are akin to the bricks on a wall.
With this idea in mind, I was able to create and provide the specs to the Union team.
New Components in Penpot
Continuing with the process of creating sample components in Penpot, we now feature:
- Application Navigation: This page contains sidebars for desktop and mobile.
- Section Footers: This page contains footers used in application footers or even websites, for desktop and mobile sizes.
- Inline CTAs (Calls to action): These CTAs help users make quick decisions on a piece of information without the need for taking over the screen using Modals, for example.
- Section Headers (Received an expansion): Section headers used to be just one version of the component. This was expanded to add more versions.



Please note that these components are "not" Plasma components and is not indicative of Plasma's future state. These are here for inspiration for the future, and for users looking to test their design edits and results. Eventually, these could serve as starting points for layout design, component creation, etc.
In addition to these component samples, I am now working on building a calendar view component. I am taking inspiration from Merkuro Calendar and also including some ideas from Ocean. The idea is that a calendar view could be available for others to use and test designs against. More to come on this.
Fixes in Ocean Design System
- Fixed layout and design for dropdown items. They were previously just text in a layout. They are supposed to behave differently inside dropdown menus. They need to have inner margins and separation from other items in a list. The shortcut component also received updates and looks more legit than before. This should make it easier to use dropdown components in Penpot.
- Created a dot component that is used in Calendars to show activity or reminders inside monthly views.
- Inputs components received updates so they behave better when manipulating sizing. There were some issues with containers and components inside containers so I tried fixing those. There is an existing Penpot bug that when components are updated at the source, the component copies tend to go back to use fixed sizing instead of dynamic sizing. This makes me cycle through fixing not just sources but copies of the components. It seems the issue is in nested components where the parent takes over some of the sizing properties. Penpot is working on this.
- Created the checkmark inside a circle component. This component is meant to be used when running through selections that need to indicate success in their interaction. For example, completing a survey, or a multi-step installation procedure. A checkbox is not appropriate there but a circle with a checkmark inside. So now that's available. It's not using a monochrome Ocean icon checkmark yet, but that can be changed in the future.
- Avatars are now using an image with color all inside. Previously I had an avatar image that was white and it made it difficult to see the white border around the avatar image.



Next in Component Design
- Calendar view
- Slideout menus
- Progress steps

Thanks
- Thanks to Beryesa for creating the Penpot Design Notes page. This is super helpful when users need to understand what they are looking at and how it is used in the system.



- Thanks to iclone for his work on commenting around UX issues in the VDG channel.
- Thanks to the Union team for all their support for Ocean.
- Thanks to Lorenz for helping me troubleshoot some crashes in Penpot.
Penpot Issues and Features
https://github.com/penpot/penpot/issues: Ocean Updates - June 2026
30 Jun 2026 1:27pm GMT
KDE Plasma 6.7.2, Bugfix Release for June
Today KDE releases a bugfix update to KDE Plasma 6, versioned 6.7.2.
Plasma 6.7 was released in June 2026 with many feature refinements and new modules to complete the desktop experience.
This release adds a week's worth of new translations and fixes from KDE's contributors. The bugfixes are typically small but important and include:
30 Jun 2026 12:00am GMT
29 Jun 2026
Planet KDE | English
Week 5: Curves Merged, Gradient Widget Begins
This is a weekly update from my Google Summer of Code 2026 project with KDE, improving effect widgets in Kdenlive, a free and open source video editor.
MR !887 merged
The Curves widget MR got merged to master this week and will ship in the Kdenlive 26.08 release. Final change before merge was replacing blockSignals(true/false) pairs on the point spinboxes with QSignalBlocker objects, which auto-unblock when they go out of scope cleaner and safer than manual pairs.
Gradient widget skeleton
Started work on the Gradient widget, targeting the gradientmap MLT filter. The filter already supports up to 32 color stops via stop.N parameters (e.g. stop.1="#ff000000 0.0"), but Kdenlive's existing XML only exposed 2 stops with the wrong parameter type.
Built a new GradientEditWidget in src/assets/view/widgets/ with:
- Draggable color stop handles on a live
QLinearGradientpreview bar - Left-click on empty area adds a stop with an interpolated color
- Right-click on a handle removes it (minimum 2 stops enforced, max 32)
- Serializes to/from the MLT
stop.Nformat via a newParamType::GradientEditorwired throughAssetParameterModel - Project save/reload round-trips correctly
Added gradienteditwidgettest.cpp with 8 assertions covering serialization round-trips, add/remove stops, min/max enforcement, and position snapping. All passing.
What's next
Julius Künzel suggested the widget be designed for potential upstreaming to KDE Frameworks, and pointed to Qt-Color-Widgets as a reference; it has a GradientEditor class with a polished UX. Investigating whether to wrap that instead of maintaining a custom implementation. Will update once there's more clarity on the direction.
Both the Gradient widget MR and the Qt-Color-Widgets investigation are in progress; more next week.
29 Jun 2026 7:55pm GMT
Monthly Report - June 2026
Read on for a look at development news and the Krita-Artists forum's featured artwork from last month.
Development Report
Krita 5.3.2.1/6.0.2.1 Released
A 5.3.2.1/6.0.2.1 hotfix release was made to fix two serious regressions.
First, a layer-related problem causing issues like the wrong layer being selected or crashes was fixed. This reverts the behavior of the layer being changed on keyframe selection. (bug 1, bug 2, bug 3; change)
Second, a crash when inserting or removing hold frames was fixed. (bug; change)
Developments in Krita Plus
Android Donations Overhaul
On Krita downloaded from the Android Google Play store, it was possible to purchase a supporter badge as a way of donating to the project.
For the next release, Carsten has overhauled this into the ability to purchase supporter packs (change). These supporter packs will let you download resource bundles with brushes, templates, and more directly inside Krita, as a convenience compared to manually importing them. There is also a subscription, managed through Google Play, which will give access to all of the offered resource bundles.
As with all official store versions of Krita, the money will go towards supporting Krita's development, and none of Krita's features will be locked behind a paywall. Krita on the Google Play store remains free, and offers the same APKs as available on the official website.
Other Features and Fixes
On Android, a prompt to adjust the interface scale will now be shown on first startup, and it can be changed later in Settings → Change Interface Scale. (change by Carsten Hartenfels)
Multiple layers selected with Ctrl+click are no longer deselected when using the Transform Tool (bug; change by Luna Lovecraft). An issue where no layer was selected when deleting the top layer of a document and opening a new view on it was fixed (bug; change by Gregg Jansen van Vuren).
An issue where the buttons of the Selection Actions Bar and Assistant Tool panel could render entirely black, and an issue where Reference Images could cause slowdown, were fixed. (change by Wolthera van Hövell)
Invert Selection no longer selects a larger area than it should. (bug; change by Ricky Ringler)
Crashes went undoing creating a text and then making a new text shape, and when undoing multiple shapes, were fixed. (bug 1, bug 2; change 1, change 2 by Elena Sagalaeva)
A keyboard shortcut assigned to the Rotate or Zoom Canvas canvas inputs no longer crashes when used. (bug; change by Agata Cacko)
Developments in Krita Next
Exporting Recorder Timelapses on Android
Previously, Krita on Android could not render video, as it's not possible to run an external FFmpeg as is done on other platforms.
However, Carsten has found a way to instead use Android's built-in MediaEncoder to render the Recorder's timelapses (change). This is also planned to be implemented for rendering animation in the future.
Other Features and Fixes
Various other features and fixes have made their way into the Unstable builds.
The Wide Gamut Color Selector now has the saved color history feature where the color history is remembered on restart and can be saved into the document. This is part of the effort to make it a replacement for the Advanced Color Selector. (change by Wolthera van Hövell)
The Histogram Docker now scales the histogram based on the maxiumum value, and has a button to show it in logarthimic scale. (change by Wolthera van Hövell)
In the Transform Tool's Free transform mode, holding Ctrl for perspective and then letting go of Ctrl now activates a camera height adjustment mode. (change by Ralek Kolemios)
Future Developments
Testing Needed: Updated Library Dependencies
The team has been working on updating the various libraries Krita depends on for things such as file format support to newer versions. These updated dependencies need testing before they can be merged to the main builds, so check out the library updates forum topic for test packages if you want to help!
Community Report
May 2026 Monthly Art Challenge Results
The winner of the "Animals and Patterns" challenge is…
Join This Month's Art Challenge!
For June's theme, last month's winner has chosen "Something Unexpected", with the optional challenge of using filters.
Featured Artwork
This month's featured forum artwork, as voted in the Best of Krita-Artists - April/May 2026:
Nominate and Vote For Next Month's Featured Artwork!
Participate in next month's nominations and voting to voice your opinion on the Best of Krita-Artists - May/June 2026.
Krita is Free - But You Can Contribute!
Krita is free to use and modify, but it can only exist with the contributions of the community. A small sponsored team alongside volunteer programmers, artists, writers, testers, translators, and more from across the world keep development going.
If this software has value to you, consider donating to the Krita Development Fund. Or Get Involved and put your skills to use making Krita and its community better!

Additional Changes
Krita Plus (Stable, 5.3.3/6.0.3-prealpha):
- File Formats: Fix loading XMP Exif metadata where a rational number field has spaces. When attempting to save XMP Exif with invalid values, omit the invalid values and log a warning instead of failing to save. (bug 1, bug 2; change by Agata Cacko)
- General: Add icons for the Getting Started, User Community, Krita Website, Source Code, and Switch Application Language actions (change 1, change 2 by Arkady Flury)
- HDR: Animation: Use non-constant luminance coefficients so FFmpeg >=7 will render HDR animations. (bug; change by Wolthera van Hövell)
- Android: Support stylus barrel rotation. (change by Carsten Hartenfels)
Krita Next (Unstable, 5.4.0/6.1.0-prealpha):
- Comic Panel Editing Tool: Close all shapes cut with the tool. (change by Agata Cacko)
- Selections: Fix moving a vector selection to not convert it to a pixel selection. (change by Luna Lovecraft)
- Filters: Fix Wavelet Noise Reducer only applying to the first 512 rows of the image. (change by Sergey Kleimenychev)
- General: Fix Image Split with guides being off by one pixel. (bug; change by Aditya Rout)
- General: Fix the backup file suffix setting in General->File Handling to be editable. (bug; change by Carsten Hartenfels)
- Selection Tools: The option to Move Selected Content was reverted due to bugs, such as making a selection showing the move cursor. (bug; change)
Nightly Builds
These pre-release versions of Krita are built every day.
Note that there are currently no Qt6 builds for Android.
Get the latest bugfixes in Stable Krita Plus (5.3.3/6.0.3 prealpha): Linux Qt6 Qt5 - Windows Qt6 Qt5 - macOS Qt6 Qt5 - Android arm64 Qt5 - Android arm32 Qt5 - Android x86_64 Qt5
Or test out the latest Experimental features in Krita Next (5.4.0/6.1.0-prealpha). Feedback and bug reports are appreciated!: Linux Qt6 Qt5 - Windows Qt6 Qt5 - macOS Qt6 Qt5 - Android arm64 Qt5 - Android arm32 Qt5 - Android x86_64 Qt5
29 Jun 2026 12:00am GMT
28 Jun 2026
Planet KDE | English
Teaching digiKam to Understand You: Natural Language Search with Local LLMs
GSoC 2026 • digiKam • Post 1: Design and Progress
I've been hanging around KDE apps since I was a teenager :), so getting to spend another summer inside one feels a bit like coming home. This time it's digiKam!
Here's what I want digiKam to do: Let me type "photos of mountains from last summer that I rated highly" into a search box, and have it just… find them. No complex filters, no guessing where to click, just plain English, the way you'd ask a friend who'd been on the trip with you.
That, in one sentence, is my GSoC project: interfacing digiKam's search engine with an AI-based LLM so you can search your photo collection in natural language. For many users, digiKam's Advanced Search is a hidden gem, powerful but a little intimidating. By adding natural language support, we're making it accessible to everyone, from beginners to experts who want to save time. And as someone who's used KDE apps for years, I loved the idea of bridging the gap between digiKam's powerful features and the simplicity of just asking for what you want.
I'd recently been deep-diving into transformers, and this project stood out to me as a near-perfect blend: real software development and having to actually understand LLMs, which architectures fit where, when you want an encoder versus a decoder, and how a model behaves once it's wired into an actual application.
This first post is about the overall design and the progress so far. The more interesting bits about the actual language model: which one, how fast, how accurate, are coming in a second post, so consider this the scene-setting.
(Mild Technical Content Ahead, but I promise to keep the scary parts optional. ;) )
The one idea the whole project rests on
DigiKam already has a powerful Advanced Search feature: a dialog packed with dropdowns for tags, dates, ratings, albums, color labels, and more. It can handle complex queries, but it requires users to know how to navigate it.
So the LLM in my project does NOT search your photos. Let me say that again, because it's the most important design decision: the model never touches your database, never decides what matches, never invents results. All it does is translate your sentence into the exact same structured query you could have built by clicking the dialog yourself. The model produces an "intent"; digiKam's existing, trusted search engine does the actual searching.
I like this framing because it keeps the AI firmly in its lane. The LLM is a translator sitting in front of a door that already exists: it's not a new door, and it definitely isn't allowed to wander off and make things up. Anything it produces is something a human could have produced by clicking. That's the safety guarantee, and everything in the pipeline is built to enforce it.
The Pipeline in Action
Here's the journey your query takes:
Your sentence
|
v
[ Prompt Builder ] : wraps it with format instructions
|
v
[ Language Backend ] : runs the model, returns raw output
|
v
[ Intent Parser ] : validates strictly; rejects anything malformed
|
v
[ Capability Dictionary ] : maps human words to digiKam's real fields
|
v
[ Intent Resolver ] : builds concrete search criteria
|
v
Advanced Search widgets populated -> digiKam runs the search
Walking through it:
- You type a sentence.
- A prompt builder wraps it in instructions that tell the model exactly what format to answer in.
- A language backend runs the model and gets back its answer.
- An intent parser reads that answer and crucially validates it strictly. The model's output is never trusted directly. If it isn't well-formed and doesn't match the known fields and operators, it's rejected outright. No partial guessing.
- A capability dictionary maps fuzzy human words to digiKam's real fields: "best" might mean a high rating or an "Accepted" pick label, "colour label" maps to the actual colour-label field, and so on.
- An intent resolver turns the validated, mapped intent into concrete search criteria.
- Those criteria populate the Advanced Search widgets, and digiKam runs the search exactly as if you'd filled them in by hand.
The nice consequence of splitting it up this way is that the model can be as small and dumb as we like, every layer after it is busy double-checking its homework. If the model says something nonsensical, the parser catches it. If it names a field that doesn't exist, the dictionary won't map it. By the time anything reaches your database, it's been laundered through several layers of "is this actually a thing digiKam can do?"
Why Local Models?
A quick but important detour. The model runs locally on your own machine, not in some company's cloud. Running the model locally isn't just about performance - it's about privacy.
And privacy matters more here than it might first appear. Think about what's actually in a photo library: where you live, who your family and friends are, where you travelled and when, the inside of your home, your children, the events that matter to you. A photo collection is one of the most personal things a person keeps on a computer. And the searches you run over it are revealing in their own right, the words you'd type to find a photo say something about what you're looking for and why.
If any of that were sent off to a remote server to be processed, you'd be trusting a third party with exactly the information most people would least want to hand over. Running everything on-device sidesteps that entirely: your photos never leave your machine, your queries never leave your machine, and there's no account, no API key, and no internet connection required. The feature works the same on a plane as it does at home.
The catch is that a local model is a big file you have to get onto people's computers somehow which brings me to the part I spent most of this period actually building.
Plugging into digiKam's Infrastructure
C++ has been my favourite language since my teens, and one of the quiet pleasures of this project has been getting to brush up on it properly. Qt, though, is a different story and a familiar one if you've read my Krita posts. Every term I spend with Qt I learn a little more, and every term I'm reminded that it's one of the harder frameworks to get comfortable in, precisely because it leans so heavily on design patterns. You don't really "learn Qt" so much as slowly stop being surprised by it.
When I first thought about "the model needs to be downloaded onto the user's computer," my instinct was to just write something that downloads a file. Simple enough. But that instinct was wrong. digiKam already knows how to download large model files. It's been doing it for years, for face recognition, object detection, auto-rotation, aesthetics scoring. There's a whole system for it: a central DNNModelManager that reads a config file describing each model, and a FilesDownloader that fetches the files from KDE's servers and verifies them. My mentor's guidance was clear and correct: don't build a parallel download mechanism, plug into this one.
The wrinkle is that this entire system was built for OpenCV vision models - models that look at images. My model is a language model run by a completely different library (llama.cpp). It's a different kind of beast that doesn't fit the OpenCV machinery at all.
The solution turned out to be pleasingly modular. By creating a lightweight DNNModelNaturalLanguage class, I was able to plug into digiKam's existing model download system without modifying its core logic. This means the GGUF file is downloaded, verified, and managed just like digiKam's other AI models (e.g., for face recognition). There's an existing model type in digiKam (DNNModelConfig) that registers and verifies a file but does no OpenCV loading and that was almost exactly the shape I needed, so my wrapper mirrors it. The actual loading and running of the model happens separately, in a SearchLlamaBackend that talks to llama.cpp.
So the division of labour is clean: digiKam's existing system handles getting the file onto your computer (download, checksum, the works), and my llama.cpp backend handles running it. No duplication, and my model gets to ride the same well-tested rails as every other model in digiKam.
Why Qwen2.5-1.5B-Instruct
A word on the model itself (much more in post two). I went with Qwen2.5-1.5B-Instruct, in a quantized GGUF form, for a few reasons:
- Size vs. capability. At ~1.12 GB (Q4_K_M quantization) it's small enough to download and run on a normal laptop, but the 1.5B-Instruct variant is genuinely good at following instructions and producing structured JSON, which is exactly what I need it to do.
- It's good at the specific job. This project lives or dies on the model reliably emitting clean, parseable, schema-shaped output. Qwen2.5 is notably solid at structured outputs.
- The licence. It's Apache 2.0, so it's freely redistributable, which means KDE can actually host the file on its own infrastructure. Why a decoder-only model (and not BERT)
Before picking a specific model, I had to pick a kind of model and this is one of the places my transformers reading actually paid off, so indulge me for a paragraph.
The obvious-seeming choice for "understand a sentence and classify it" is an encoder model like BERT. Encoders are efficient, deterministic, and great at fixed-label tasks. But they assume a finite, predefined output space and that's exactly what search queries don't have. A query can express any number of constraints ("landscape photos with red labels near Paris last summer" is four constraints at once), and I'll keep adding new searchable dimensions over time. To force that into an encoder, I'd need a pile of auxiliary pieces: intent classifiers, entity extractors, rule-based combiners and that scaffolding gets more brittle every time digiKam gains a new search field.
A decoder-only model sidesteps all of that. It generates a sequence, so it can emit a variable number of structured constraints directly as JSON, following a schema I define in the prompt. New search field? Update the schema and no retraining. And it handles ambiguity gracefully: instead of being forced to pick one interpretation of "best photos," it can emit a clarification request inside the same constrained output. (Encoder-decoder models like T5 could generate structured output too, but they carry extra architectural and latency overhead that's wasteful for a local, on-demand desktop feature.)
So the short version: a small decoder-only model gives me compositional, schema-shaped generation with built-in ambiguity handling, at a size that runs on a laptop. That's the whole wishlist.
All assuming 4-bit (Q4) quantization in GGUF form, which is the standard for CPU inference with llama.cpp:
| Model | Params | Size (Q4) | Licence | Notes |
|---|---|---|---|---|
| Qwen2.5-1.5B-Instruct | 1.5B | ~0.9-1.2 GB | Apache 2.0 | Balanced quality/efficiency, good structured output, long context - my primary |
| TinyLlama 1.1B | 1.1B | ~0.7-0.9 GB | Apache 2.0 | Lightest, fast CPU inference - fallback for low-RAM machines |
| Gemma 2B Instruct | 2B | ~1.3-1.6 GB | (Gemma terms) | Strong general language understanding |
| Phi-2 | 2.7B | ~1.5-1.8 GB | MIT | Better reasoning than 1B models, heavier CPU load |
| Qwen2.5-3B-Instruct | 3B | ~1.8-2.2 GB | Apache 2.0 | More capable than 1.5B, but higher RAM |
| Phi-3 Mini | 3.8B | ~2.2-2.6 GB | MIT | Best comprehension here, but slowest and largest |
The pattern is a straightforward size-vs-capability trade-off. The bigger models (Phi-3 Mini, Qwen2.5-3B) reason better but want more RAM and run slower on a CPU-only laptop and since this feature has to stay usable on ordinary hardware without a dedicated GPU, "runs comfortably in ~1 GB of RAM" is a hard constraint, not a preference. That rules the heavier models out for the default.
Among the lightweight options, Qwen2.5-1.5B-Instruct hits the sweet spot: small enough for a CPU laptop, but notably reliable at the one thing this project actually needs: emitting clean, schema-shaped structured output. TinyLlama 1.1B stays in the picture as a fallback for lower-end machines where even 1.5B is too much. Both are Apache 2.0, which (as above) is what makes KDE hosting possible, a point that quietly eliminated some otherwise-tempting models with restrictive licences.

Where things stand
The pipeline already works end-to-end using a mock backend (standing in for the real model). So, prompt > parse > resolve > populate-the-search-and-run is all functioning and unit-tested. And the download integration I described above is in place: the model is registered with digiKam's central manager, and I've verified it gets picked up correctly and its file path resolves to the shared model directory.
What's Next?
- Host the GGUF model on KDE's infrastructure (in progress).
- Wire up llama.cpp for local inference.
- Benchmark Qwen2.5 vs. TinyLlama on digiKam-specific queries (e.g., "5-star photos", "pick label accepted").
- Dive into model performance, fine-tuning, and caching!
Found an excuse to start drawing again :)

28 Jun 2026 4:33am GMT
27 Jun 2026
Planet KDE | English
This Week in Plasma: Post-6.7 Bug-fixing
Welcome to a new issue of This Week in Plasma!
This week members of the core Plasma team spent almost all of their time in bug-fixing mode! As usual, people unleashed their real-world setups on the new Plasma release and found some issues we missed during the development process, and that nobody reported during the two beta releases. So we made it a priority to fix those issues!
Plasma 6.7.1 was released earlier this week with the first round of fixes, and 6.7.2 is scheduled for early next week with more.
A few new features and UI improvements started landing, too.
Check it out here:
Notable new features
Plasma 6.8
You can now set up wallpaper slideshows that don't change automatically. Instead you can manually switch the wallpaper via the item in the desktop context menu or its global keyboard shortcut. (Fushan Wen, KDE Bugzilla #518669)
Added an Esperanto keyboard layout to Plasma's virtual keyboard. (Daniel O'Neill, plasma-keyboard MR #148)
Notable UI improvements
Plasma 6.7.2
Improved text alignment in System Monitor's Processes page while using the tree view. (Arjen Hiemstra, KDE Bugzilla #442095)
Plasma 6.8
Reduced the number of visual frames in the Menu Editor app. (Levi Leal, kmenuedit MR #59)
Notable bug fixes
Plasma 6.6.6
Fixed an issue that could make KWin crash when some apps opened dialogs and popups in non-standard ways. (Vlad Zahorodnii, kwin MR #9444)
Fixed a regression introduced by Qt 6.11 that made the word "Undefined" appear next to Places entries in the Kickoff Application Launcher widget. (Christoph Wolk, KDE Bugzilla #521799)
Fixed a visual glitch affecting users of Deskflow that could make a clone of the pointer inappropriately remain visible on the client machine. (David Redondo, KDE Bugzilla #521486)
Plasma 6.7.1
Fixed a somewhat common case where KWin could crash on the lock screen when using an NVIDIA GPU. (Xaver Hugl, KDE Bugzilla #520842)
Fixed a recent regression that made KWin crash when using a DisplayLink monitor. (Xaver Hugl, KDE Bugzilla #520361)
Fixed an issue that could make screens plugged into a laptop with both an NVIDIA and an AMD GPU freeze. (Xaver Hugl and SungHwan Jung, KDE Bugzilla #521727)
Fixed a recent regression that broke certain shader-based KWin effects, including the popular "Burn My Windows" effects. (Xaver Hugl, KDE Bugzilla #521774)
Fixed a recent regression that broke color-related KWin effects like color blindness correction and screen color inversion. (Xaver Hugl, KDE Bugzilla #521737)
Plasma 6.7.2
Fixed the currently most common KWin crash, related to variable refresh rates with multi-monitor setups. (Vlad Zahorodnii, KDE Bugzilla #521909)
Fixed a case where Info Center could crash when trying to display information about certain NVIDIA GPUs. (Harald Sitter, KDE Bugzilla #521295)
Fixed a recent regression that broke the RDP server when run using systemd. Sorry about that! (David Edmundson, KDE Bugzilla #521776)
Fixed a recent regression that could sometimes make Chromium-based apps freeze if another window was forced into "Keep Above Others" mode. (Xaver Hugl, KDE Bugzilla #521687)
Plasma 6.8
Fixed a case where Plasma could crash after you ejected an audio CD from Dolphin or Audex. (Kai Uwe Broulik, KDE Bugzilla #522051)
Flatpak 1.18.1
Fixed an issue that made a background service for Flatpak crash if you used the KDE desktop portal dialog to allow an app to update itself while the app was still running. (Sebastian Wick, flatpak issue #6686)
GTK 4.23.2
Made the process of selecting text to later paste it by middle-clicking more reliable in GTK 4 apps. (Vlad Zahorodnii, gtk MR #10006)
Notable in performance & technical
Plasma 6.7.2
Improved full-screen video playback performance in Chromium-based apps. (Xaver Hugl, KDE Bugzilla #521960)
Plasma 6.8
Turned on triple buffering by default for NVIDIA GPUs, because the bugs blocking this from working properly in the past have since been fixed. (Xaver Hugl, kwin MR #9472)
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.
27 Jun 2026 12:00am GMT
26 Jun 2026
Planet KDE | English
Techpaladin is hiring again
Time to put on my Techpaladin Software had again: we're hiring! David Edmundson has already posted it, so I'm here to boost the signal: we need you! Especially if you've got experience with Qt/KDE development.
We're looking for someone with that plus an eye for UX & design, and another person with that plus deep tech skills, particularly around I/O and other "system plumbing" topics.
Check it out: https://techpaladinsoftware.com/joinus.html
26 Jun 2026 2:30pm GMT
Submit a KDE goal!
KDE has now started its fifth round of "goal-setting" - a process that began in 2017.
These goals are big, high-level goals. Think "focus on large strategic topic X" more so than "fix my pet bugs A, B, and C".
And it's up to the KDE community to choose the goals! Up to you, up to me, up to all of us. They will then be voted on, with the top three informing KDE's overall direction for the next two years.
KDE needs you! Your fresh ideas, your contributions, your budding leadership talent. But not your imposter-syndrome-driven fear of coming out of your shell.
Overcome that!
I've now been the champion for two goals: "Usability & Productivity" and "Automate & Systematize Internal Processes". I'd count the first as pretty successful; the second, less so. So at this point I feel like I have a pretty good idea of what works and what doesn't, and I'd like to use that knowledge to help others submit their own high-quality actionable goals.
Here's what works, in my experience:
- Articulate an immediately obvious large problem or aspiration. If you've spent any time in KDE or using KDE software, you'll have encountered stuff that could be better. Big stuff. That's the topic to write a goal around! Not "Discover is too slow to refresh when I launch it" but rather "First-class software delivery UX" (you can steal that).
- Have a technical lead and a communications lead. They can be different people, but you need both. Only have a tech lead? Not enough communication, people forget about it, don't join, and the tech lead burns out. Only have a comms lead? Not enough work happens and the goal limps embarrassingly towards the finish line.
- If you propose a goal, be the tech lead. You can be the comms lead too. But you should be prepared to be the tech lead. It's much easier to recruit people to do other things than it is to recruit a tech lead to do a ton of work on your behalf that you can't to yourself.
- Don't bite off more than you can chew. If you can't be the tech lead on your idea, scale it back or change its scope so that you can be the tech lead. This doesn't mean you have to know how to do everything. It just means you can do a big chunk of the technical work, and at least understand the concepts of the things you can't personally do.
It's really fun, and you end up having a huge impact on how awesome KDE is.
I've submitted a goal proposal about improving KDE's documentation. Credible choices make voting useful, but right now we have as many submissions as goal slots, and that's no fun. So get yours in too!
26 Jun 2026 2:13pm GMT
Techpaladin are hiring!
If you've been around KDE, you've probably heard of Techpaladin Software

We're a consultancy that works almost exclusively on KDE, improving KDE upstream while delivering the features and functionality our clients need.
We're growing and looking for more developers to join the team. We're after experienced developers who are already familiar with KDE, C++, and Qt.
We currently have two positions available:
- Someone with a keen eye for design to work on high-level features and help shape the user experience.
- Someone with a more technical background to work on lower-level system integration and platform work.
In return, you'll get to work with some of the most talented and welcoming developers in this space... and also me!
If that sounds interesting, you can find more information and apply here:
https://techpaladinsoftware.com/joinus.html
26 Jun 2026 11:33am GMT
Web Review, Week 2026-26
Let's go for my web review for the week 2026-26.
Look, just fucking use Mastodon already
Tags: tech, social-media, fediverse, bluesky, decentralized
Aren't the signs clear enough yet? Don't get misled by Bluesky.
https://giants-club.net/articles/just-use-mastodon/
W Social, Fictional Metrics and the Beauty of Open Data
Tags: tech, social-media, europe, politics
I wish people will stay clear of this newer social media… It already smells really bad in its practice.
https://blog.elenarossini.com/w-social-fictional-metrics-and-the-beauty-of-open-data/
Apertus LLM Family Expansion via Distillation and Quantization
Tags: tech, ai, machine-learning, gpt, foss
Some news from the Apertus project, they released smaller models. Interesting work.
https://apertvs.ai/articles/2026-06-apertus-mini/
Yale researchers propose 'copyleft' rules for generative AI
Tags: tech, foss, licensing, ai, machine-learning, gpt, copilot
This is an interesting proposal, let's hope it gets picked up and appear in more licenses.
https://news.yale.edu/2026/06/15/yale-researchers-propose-copyleft-rules-generative-ai
Anthropic accuses Chinese rival Alibaba of illicitly extracting AI capabilities
Tags: tech, ai, machine-learning, gpt, copyright, politics
Remind me how your built your models in the first place? Yeah right…
https://www.bbc.com/news/articles/cwyklykn5dwo
The Shared Feeling of Being Harvested by the Future
Tags: tech, ai, machine-learning, gpt, copilot, surveillance, attention-economy, politics, economics
Very sobering opinion piece. For all the talks about a China / USA race, it feels more like two flavors of the same dystopia. The race is just here to justify acting against their own population interest. The result is then the increase in illiberal fixations and nihilistic world views. This can't end well.
Echoes of the AI Winter
Tags: tech, ai, history
When you ignore history, you're bound to repeat the same mistakes. There's clearly a trend of overpromising and then failing to deliver.
https://netzhansa.com/echoes-of-the-ai-winter/
Show your hands honor for the strange power they bring you
Tags: tech, input, performance, design, history, apple
A long but very interesting piece starting all the way from early typing on machines to more modern input systems. It's very focused on Apple machines towards the end, but there are good design lessons to draw from the long perspective.
https://aresluna.org/show-your-hands-honor/
It's Only When You Look Back
Tags: tech, history
Interesting look back at how our industry evolved. Quite a few events over the years.
https://www.markround.com/blog/2026/06/17/25-its-only-when-you-look-back/
Emacs 31 Is Around the Corner: The Changes I'm Already Daily Driving
Tags: tech, editor, emacs
Not CE features coming out of the box in the next Emacs release.
https://www.rahuljuliato.com/posts/emacs-31-around-the-corner
RFC 10008: The HTTP QUERY Method
Tags: tech, http, standard
Looks like we're getting a new HTTP method. This should help remove ambiguous POST calls when really what you want is to query. This is long overdue, let's hope this new QUERY method sees quick adoption in servers, frameworks and services.
https://www.rfc-editor.org/info/rfc10008/
What can wonky APIs tell us about the web?
Tags: tech, web, api, maintenance
Designing APIs for the Web platform is hard and error-prone. This is why it carries baggage, here is a good example.
https://alexwlchan.net/2026/wonky-web-apis/
Configuration is a liability, just like code
Tags: tech, system, config, complexity, maintenance
Indeed, we try to limit the amount of code we need to maintain. But configuration can bring its own complexity and maintenance burden as well.
https://utcc.utoronto.ca/~cks/space/blog/sysadmin/ConfigurationIsALiability
Improvements to std::format in C++26
Tags: tech, c++
Those improvements are welcome. I wish we'd see more std::format uses.
https://mariusbancila.ro/blog/2026/06/19/improvements-to-stdformat-in-c26/
Rewriting the world in Rust
Tags: tech, rust, architecture
Friendly reminder that the answer is "no". You don't want to just rewrite everything, it's not just a syntactical translation, it's a long project and at best you tackle critical components.
https://bitfieldconsulting.com/posts/rewrite-in-rust
Project Valhalla, Explained: How a Decade of Work Arrives in JDK 28
Tags: tech, java, type-systems, memory, performance
This is just the beginning in a way, but it'll be a game changer for Java. The value classes will allow for better memory density.
https://www.jvm-weekly.com/p/project-valhalla-explained-how-a
Stop Naming Your Variables "Flag": The Art of Boolean Prefixes
Tags: tech, programming, maintenance
Good advice on naming booleans. It's worth repeating.
https://thatamazingprogrammer.com/posts/stop-naming-your-variables-flag-the-art-of-boolean-prefixes/
How to Write an Effective Software Design Document
Tags: tech, design, architecture, documentation, engineering
This is a good reference on how to write design documents. It's not as easy as it sounds sometimes, and this guide contains good tips.
https://refactoringenglish.com/excerpts/write-an-effective-design-doc/
How to stand against high temperatures
Tags: life, climate
Obviously good advice and things we need to internalize now. Structural change is needed of course, but when the heat is here, better act properly.
https://www.whateverthewindbrings.com/how-to-stand-against-high-temperatures/
Bye for now!
26 Jun 2026 9:18am GMT
24 Jun 2026
Planet KDE | English
Just fixing a bug!
Or at least that was the plan...
The original intent was simply to fix an issue in the Oxygen cursor theme. Some cursor sizes were missing and i thought this would be one of those quick fixes. You know... the kind that takes 10 minutes. Several days later I was redoing most of the animated cursors.
One of the things I care a lot about is how much movement contributes to personality. Not just in interfaces, but in general. Animation is a bit like music. Two notes can contain the same information and still communicate completely different emotions. A lot of modern interfaces IMO tend to treat animation as "decoration". I tend to believe that movement is communication. The way something moves tells you what it is, and if not, at least makes it interesting to look at. I think it also comes across to users that if an animation has personality, then the developer or designer actually cares about the experience.
One of the things that fascinates me about animation is that humans are absurdly good at detecting natural motion. We can forgive low resolution graphics, simplistic shapes and even questionable artwork. But if movement feels wrong people notice, even if they dont know why.
Anyway, while revisiting the Oxygen cursors I wanted to stay close to what Ruphy originally created all those years ago while making them a bit more expressive. The busy animation is probably the best example. The old animation revolved around circular motion and the new one still does, but now its inspired by one of those old physics toys with pendulums and metal balls transferring momentum from one side to the other. Tension, release, acceleration, deceleration... tiny little things most people will never consciously notice, but i think they feal them.
What started as fixing a few missing cursor sizes somehow ended with redoing most of the animations. Classic scope creep. The good kind :).
side note i still managed to not fully fix the original bug i was trying to fix... but you can try it here
The new Oxygen cursors, together with all the other improvements we've been making over the last few weeks, should be arriving with KDE Plasma 6.8. There is also a ton more that I'll mention in another blog post soon, and that Filip already hinted at in his own post.

In the meantime 6.7 is out, and I hope you are enjoying what we have done so far. Its been fun seeing this old project slowly finding its place again, and I hope you'll have as much fun using it as we've had bringing it back to life.
24 Jun 2026 6:31pm GMT
Display Next Hackfest 2026
This year, there was another display next hackfest, this time in Nice, France. This was a very productive hackfest, so I'll focus just on my personal highlights here.
KMS backlight property
As mentioned in the blog post about the last hackfest, the current backlight API on Linux is a total mess. To remind you, the kernel exposes backlight devices through sysfs, which has several problems:
- this API doesn't tell you which display the backlight is for. Effectively, only one backlight is supported
- some of the backlight devices don't actually work, it's up to userspace to figure out which one to use
- you need root privileges to change the backlight brightness
- there's no proper minimum. On some displays, backlight level zero turns the backlight off, on others that's the minimum brightness. In some cases, non-zero but very low levels result in wrong colors
- there's no information on how long it takes to apply brightness changes
The new KMS API adds a backlight property to connectors of built-in panels (external monitors may be supported later), so the compositor knows exactly which display it's for, and it can change the backlight without needing more permissions than it already has for driving the display.
We talked about the requirements to merge the API, concluded that it's okay to leave it at one unit-less value for now (it can be trivially extended later), wrote and tested implementations and it's pretty much ready to be merged.
KMS colorops
KMS colorops allow the compositor to offload some color operations to the scanout hardware, which can save a lot of power. We discussed how to best extend it to support YCbCr buffers, which are required for efficient video playback, and tested an implementation of the addition in amdgpu.
The implementation had some bugs with interesting visual results, but we debugged that and could find the source of the problem. The API for this should be merged sooner than later as well.
Scheduling Atomic Commits
As another follow-up to last year's hackfest, we now had an implementation for what we agreed on last year:
- a callback that gives us a timestamp for when the hardware finished programming the last commit
- information on when the deadline is, relative to the start of vblank
We also talked about how all of this should work with ultra high refresh rate monitors, since CPU schedulers are quite bad at timing things precisely. To put things into perspective: KWin currently sets the target commit time to 1ms before vblank, since schedulers sometimes wake up KWin's thread hundreds of microseconds later than planned.
With a 1000Hz display, the compositor would only have 1ms to commit each frame, so that doesn't exactly work out well. Worst case, the compositor may need to immediately commit the next frame once the last one is finished, but in an ideal world, the kernel would 'just' be able to schedule the compositor's threads more accurately.
VRR and QMS
Variable refresh rate has a few annoying problems right now:
- when the refresh rate changes too quickly, many displays change in brightness, which is visible as flickering
- HDMI doesn't require displays to make switching between VRR on and off seamless, so many TVs go blank for a second when doing this
- compositors currently don't have any (good) way to set an exact refresh rate without turning VRR off
All of these issues can be solved by allowing the compositor to set a minimum and maximum refresh rate that the display needs to stay between. We had two proposals for this:
- allow compositors to set a minimum and maximum refresh duration in nanoseconds
- allow compositors to set a minimum and maximum refresh rate with a numerator and denominator for both rates
For compositors, the first one is generally simpler, but the second one is needed for HDMI's QMS feature. The "Quick Media Switching" functionality makes TVs switch to exact video refresh rates, which are specified as a numerator and denominator rather than a duration.
We still need more implementations for this to move ahead, but the direction to go in seemed pretty clear.
Color formats and BPC
Currently on Linux, if you want to configure how the image is sent to your display, you're out of luck. Both the bit depth (how many bits per color are used) and the color format (RGB vs. YCbCr, chroma subsampling) can't be configured, the driver chooses both automatically.
The new color format KMS property will solve this problem for the color format side, and we discussed how to do the same for bit depth. We concluded that a "min bpc" to match the already existing "max bpc" would likely be the best way to do this, since compositors can either choose a specific bpc that way, or leave it up to the driver to pick the best possible value.
FreeSync HDR, HDR10+, HDMI SBTM
Anyone that's used HDR for some time knows that displays basically never do it right. Their tonemapping behavior can be unpredictable, and especially TVs often do a lot of "interesting" things in an attempt to improve the image, which can have very bad effects on PCs and video games.
For example, my TV by default makes images brighter than they are. If I use the brightness slider in Plasma, the TV literally compensates the reduced brightness away!
FreeSync HDR is one way to solve this problem: Instead of sending a signal to the screen that's way larger than required (BT.2020 + PQ), just give the display an image in its native colorspace (native primaries + gamma 2.2 with 1.0 being the maximum luminance), and ensure it does the absolute minimum amount of tonemapping possible.
While TVs sadly don't usually support this mode, a lot of higher end gaming monitors do, and as it turns out, supporting it on Linux wasn't actually all that difficult - I already have a kernel patchset to enable the functionality that happened to be mostly there in amdgpu already, and on the compositor side it was entirely trivial. The only part that's still missing is parsing the relevant bits from the monitor's EDID to figure out if it actually supports that mode.
Specifications for the FreeSync information in the EDID are unfortunately not public (yet?), so we'll have to reverse-engineer it. Luckily, some people have already gotten most of the way there, we just need to implement it in libdisplay-info and verify its correctness with a bunch of screens.
HDR10+ and HDMI Source-Based Tone Mapping are other standards intended to solve similar problems, and we'd really like drivers to implement them as well.
Atomic commit feedback
There was some discussion on how compositors can get feedback on why a particular atomic commit failed. There are two big cases where this is important:
- when trying to change the display configuration, especially enabling displays for the first time
- when trying to find the optimal setup for overlay planes1
Currently, graphics drivers effectively just say "no" when something doesn't work, and both compositors and users are left to try random things until hopefully some configuration is usable.
There's an existing patchset to provide such information, which is very useful for display configuration, but less useful for overlay planes. We talked a bit about how this could possibly be improved, how the API might be extended in the future, and whether or not a userspace library that's more aware of vendor-specific hardware (and driver) limitations might be a better approach for improving overlay plane usage.
linux-dmabuf version 6
This latest version of the linux-dmabuf protocol allows the compositor to advertise that it supports multiple GPUs, and allows applications to set which GPUs they're using. I'll make a separate blog post about this, but the important bit is that it allows for performance improvements in many systems with multiple graphics cards. This is quite the extreme case, but on my setup with an external GPU, using this protocol in Mesa and KWin literally improves performance in Cyberpunk 2077 by 100%!
After some explanation of how it works and minor adjustments to the protocol text, we merged it. There's even a wayland-protocol release for it now!
Non-blocking modeset commits
The KMS API has some annoying quirks, and one of them is how you request an event for images being presented. You can request these page-flip events with a flag on each atomic commit, but if you try to present to multiple CRTCs (usually one per screen) at the same time, you get one event per CRTC.
That part by itself is fine, but what's more problematic is that the kernel has a pretty old workaround for some old and buggy compositor: It doesn't allow you to request page-flip events if any of the CRTCs in an atomic commit are actually turned off.
Because of this, for changing the display configuration, KWin currently uses a blocking commit, which can take up to 90ms in my testing (with a single screen) and blocks KWin's main thread for that time. At the hackfest, Simon put together a kernel patch for allowing compositors to request a page-flip event per CRTC instead of globally, which solves this problem very nicely.
Switching between compositors
When you switch between compositors, currently the compositor you switch to gets all the KMS state from the compositor you switched away from. This can be very convenient for smooth transitions, for example when logging in from the Plasma login manager to the Plasma Wayland session, but it can also go wrong, for example when logging in from the Plasma login manager with HDR enabled into an Xorg session that doesn't understand HDR at all.
This problem has existed since the day KMS was created, and there was never a good solution for it. Some compositors "clean up" after themselves before you switch virtual terminals, but that workaround prevents those smooth transitions and it's not a fully robust way of fixing this.
We looked into finally fixing this properly, and concluded that we want a flag in an atomic commit that makes the kernel reset everything to some sane default state before applying it. This way, we can get more reliable switching between compositors without having to compromise on smooth transitions where possible.
Driver bugs
When doing bug triage for KWin, I usually spend a significant amount of time telling our users that their problems are caused by bugs in graphics drivers and where to report them. So I'm especially happy to hear about important problems being solved:
- the likely by far biggest source of page-flip timeouts on AMD GPUs is finally getting fixed. This was especially bad on AMD laptops, where leaving PSR2 enabled could trigger such a freeze multiple times each week
- a Nvidia driver bug causing freezes when using overlay planes is getting fixed
- slow atomic commits on AMD are getting improved. I wrote a KWin autotest that consistently triggers the issue at the hackfest, and Harry made a fix for the most severe cases since then. On my laptop the stutter caused by it isn't usually noticeable, but on dedicated GPUs it was pretty bad
More than just being very annoying, these specific issues are also the blockers for enabling overlay planes by default in KWin on the respective hardware. I have high hopes that we can finally enable overlay planes by default on all hardware this year!
Conclusion
I'm really glad to see so much progress on these topics. My nearly infinite wishlist for driver changes is actually shrinking for once!
Thank you to Collabora for organizing and sponsoring the event, and thanks to all the awesome people for being there and making things happen :)

-
see my earlier post about overlay plane usage ↩
-
PSR stands for "panel self-refresh" and can save a decent amount of power while the screen isn't changing ↩
24 Jun 2026 1:00pm GMT
Qt Canvas Painter: Accelerated performance using paths
For those who are not yet familiar with the new Qt Canvas Painter, please check the previous blog posts: Introduction, new features, and performance measurements. This blog post introduces paths and path groups to further improve the performance.
![]()
24 Jun 2026 5:54am GMT


