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

Saturday, 21 March 2026

During FOSDEM this year, I met a group of very cool people that put together events about Open Source Design. They invited me to participate this year.

The topic was similar to my talk during FOSDEM, but with a twist on the soft skills needed to complete the creation of a new design system for Plasma.

The conference is only one day. Something really cool they did was to have something like BoF (Birds of a Feather) sessions during the afternoon slot before my talk. We had the opportunity to discuss important aspects proposed by the attendees around design and making your way into the field.

Germany, Berlin. FOSS Backstage Design 2026 – Community, Management and Compliance. 18.03.2026 Photo Jan Michalko

Since I was representing KDE in this project, I brought my newly-acquired tshirt from FOSDEM!

The experience was great. Everyone was awesome and even met up with new contributors to the VDG. Comments from after my talk were very positive and I look forward to participating in even more events of this nature.

Design System Update

At this time, the design system keeps evolving. I have gone back to rework some application icons. After reviewing the current designs and consulting with team members, the consensus is that they should be simpler, more approachable. I have made some concepts that I will keep exploring going forward.

Additional to that, new tokens have been created. We now have shadow tokens, and I have applied them to all the components that I can think of. They have replaced manually-created shadows from the previous time.

Radius and spacing tokens now need to also make their way into the components. Unfortunately, Penpot is struggling today on creating new tokens. I will wait for an update. However, the work involves going through out component buttons and applying foundational spacing tokens to the sides and inner spaces for the components.

While this might be long, it is easy. The spacing numbers are already in the component. My part is to create all the spacing components, locate the margin or padding number I see today in buttons, find the base component, and apply the spacing tokens.

I am also closely following up on Penpot’s new beta, hopefully coming out soon, with their new rendering engine.

I have also connected the Penpot team with our LAS (Linux App Summit) event and hopefully they can attend.

More to come!

If you’re interested in participating in this effort and have some awesome design and integration skills, join us!

https://matrix.to/#/#visualdesigngroup:kde.org

Welcome to a new issue of This Week in Plasma!

This week several new features landed, in addition to a number of user interface improvements and some nice performance improvements and bug fixes. Check ‘em out:

Notable new features

Plasma 6.7

For each additional time zone you add to the Digital Clock widget, it now also shows how far forward or behind that time zone is compared to yours. (Nate Graham, plasma-workspace MR #6417)

If you disable the feature to invoke KRunner by typing on the desktop, instead typing on the desktop invokes “type-ahead”, which allows selecting files by typing the first letter or two of their names. (Guillermo Steren, KDE Bugzilla #427961)

You can now reverse the ordering of items in the System Tray widget. (Nathaniel Krebs, KDE Bugzilla #517016)

Notable UI improvements

Plasma 6.7

Discover now sorts app lists by number of reviews by default, resulting in vastly more relevant results while browsing rather than searching. The old rating-based sorting method is still available, of course. (Nate Graham, discover MR #1274)

Discover now filters out non-apps from its home page, preventing death spirals of negativity where people would leave 1-star reviews saying they were broken (not being launchable apps, the “Launch” button wouldn’t work), causing them to move up higher in the list. (Nate Graham, discover MR #1287)

System Settings and KWin now consistently use the word “pointer” to refer to the mouse/touchpad pointer. (Philipp Kiemle, plasma-workspace MR #6425 and kwin MR #8982)

Screen un-dimming is now faster than dimming, since un-dimming would mean you’re ready to use the system again. (Kai Uwe Broulik, kwin MR #8963)

The currently-active task in a grouped task tooltip now has bold text, to help you pick it out. (Christoph Wolk, KDE Bugzilla #516278)

Labels for Bluetooth devices in the System Tray widget have been re-arranged so that you can always see the battery level no matter how long the device name is. (Kai Uwe Broulik, KDE Bugzilla #515090)

The Global Menu widget’s menu highlights are now rounded consistently with the highlights for other menus. (Akseli Lahtinen, libplasma MR #1459)

Darth Vader says “I have rounded the corners! Pray I don’t round them any further.”

You can now set a modifier key all on its own to focus a Plasma panel. (Christoph Wolk, plasma-desktop MR #3547)

Plasma’s panel configuration window now only offers opacity settings if the active Plasma style supports it. (Filip Fila, KDE Bugzilla #516042)

Notable bug fixes

Plasma 6.5.6

Fixed a bug that distorted the image on certain vertically-oriented monitors while displaying the Plasma Login Manager. (Anton Gobulev, KDE Bugzilla #517409)

Plasma 6.6.3

Fixed a case where KWin could crash after changing the Zoom effect’s settings in certain specific ways. (Ritchie Frodomar, KDE Bugzilla #517073)

Fixed two cases where KWin could crash when misconfigured or given broken content. (Nicolas Fella, KDE Bugzilla #517137 and KDE Bugzilla #517711)

Fixed a few cases where KDE’s printing management system could crash due to faulty information from printers about their ink levels. (Mike Noe, print-manager MR #311)

The tooltip for the Refresh button in Discover’s Updates section no longer says “F5 (QQuickShortcut(gobbledygook))”, fixing an unexpected side-effect of a recent KDE Frameworks update. (Akseli Lahtinen, KDE Bugzilla #516392)

Plasma 6.6.4

Fixed an issue that made the “bounce keys” accessibility feature break key repeat in the Brave browser. (Ritchie Frodomar, KDE Bugzilla #513268)

In the shortcut conflict dialog opened by System Settings’ Shortcuts page, the “Re-assign” action now works. (Dávid Bácskay-Nagy, KDE Bugzilla #471370)

Made the update count in Discover’s notifications more accurate. (Akseli Lahtinen, discover MR #1284)

Frameworks 6.25

Reverted an innocent-looking change that broke icons for some apps like OBS and Ungoogled Chromium due to an underlying deficiency in the Qt toolkit’s SVG renderer. (Nate Graham, KDE Bugzilla #516007)

Notable in performance & technical

Plasma 6.6.4

Reduced CPU and GPU load for full-screen windows (also known as “direct scan-out”) on screens without the pointer on them. (Xaver Hugl, KDE Bugzilla #516808)

Plasma 6.7

Added support for “3D LUTs” in KWin, which reduces resource usage on GPUs that support color pipelines in hardware. (Xaver Hugl, kwin MR #8475)

The Networks widget now only fetches network speed information while that information is visible. (Ser Freedman, plasma-nm MR #544)

Stopped creating unnecessary OpenGL contexts for apps that don’t use OpenGL, which reduces their memory usage by 10-15 MB or more per app and also speeds up launch times. (Vlad Zahorodnii, plasma-integration MR #209)

Qt 6.10.3

Fixed an issue that broke HDR support while using the Vulkan renderer on certain hardware. (Joshua Goins, Qt patch #711621)

How you can help

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

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

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

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

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

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

Friday, 20 March 2026

Let’s go for my web review for the week 2026-12.


The “small web” is bigger than you might think

Tags: tech, web, self-hosting, blog

Also, it’s likely a pessimistic estimate… Indeed, it’s mostly based on a list from Kagi, which likely doesn’t list many sites which would qualify.

https://kevinboone.me/small_web_is_big.html


Have a Fucking Website

Tags: tech, web, social-media, self-hosting

So much this… I’m sick of all those little businesses having only an Instagram or Facebook account or whatever. I wish we’d have proper websites for all of those instead.

https://www.otherstrangeness.com/2026/03/14/have-a-fucking-website/


RIP Metaverse, an $80 Billion Dumpster Fire Nobody Wanted

Tags: tech, facebook, vr, hype

This was stupid hype… Why do we have regularly this kind of fever in our industry?

https://www.404media.co/rip-metaverse-an-80-billion-dumpster-fire-nobody-wanted/


Bluesky announces $100M Series B after CEO transition

Tags: tech, social-media, bluesky, business

The writing is on the wall I think… the real question is not if but when will the enshittification begins? It’s been data harvesting for a while now.

https://techcrunch.com/2026/03/19/bluesky-announces-100m-series-b-after-ceo-transition/


Open Source Gave Me Everything Until I Had Nothing Left to Give

Tags: tech, foss, psychology, productivity, life

This is an account of how dark things can become when you align your identity with your contributions. Stay healthy, stay safe!

https://kennethreitz.org/essays/2026-03-18-open_source_gave_me_everything_until_i_had_nothing_left_to_give


How Can Governments Pay Open Source Maintainers?

Tags: tech, foss, business, fundraising

Let’s help them help us. There are a few things to have in place for governments to be able to pay maintainers.

https://shkspr.mobi/blog/2026/03/how-can-governments-pay-open-source-maintainers/


The price of accountability: corruption erodes social trust more in democracies than in autocracies

Tags: politics, democracy

This is definitely a disturbing result. It indeed makes democracies more fragile, all the more reason to build more democratic resilience.

https://www.frontiersin.org/journals/political-science/articles/10.3389/fpos.2026.1779810/full


Age Verification Lobbying: Dark Money, Model Legislation & Institutional Capture

Tags: tech, gafam, facebook, law, lobbying, surveillance

It looks more and more likely that the current age verification fever has dark origins…

https://tboteproject.com/


Rep. Finke Was Right: Age-Gating Isn’t About Kids, It’s About Control

Tags: tech, politics, law, surveillance

The commentaries and analysis of those unjust laws continues. The motives behind the people pushing for them are getting clearer and it isn’t pretty.

https://www.eff.org/deeplinks/2026/03/rep-finke-was-right-age-gating-isnt-about-kids-its-about-control


Ageless Linux — Software for Humans of Indeterminate Age

Tags: tech, law, surveillance

Good initiative to push these unjust laws to their limits. Hopefully it’ll show how absurd they are.

https://agelesslinux.org/


Lotus Notes

Tags: tech, history, email

On the little known history of Lotus Notes. Crossed its path as a teenager during an internship at a bank. Can’t say I remember it fondly though.

https://computer.rip/2026-03-14-lotusnotes.html


The Most Important Software Innovations

Tags: tech, innovation, history

Interesting list and way to frame the problem. It’s important to maintain this resource, an update is likely needed.

https://dwheeler.com/innovation/innovation.html


Wayland has good reasons to put the window manager in the display server

Tags: tech, wayland, x11, history, complexity, input

Let’s not forget where we’re coming from and why window managers tend to be merged with display server. It removes some complexity and some latency.

https://utcc.utoronto.ca/~cks/space/blog/unix/WaylandAndBuiltinWindowManagers


Containers Are Not Automatically Secure

Tags: tech, containers, security

Kind of obvious I think, but this likely bears repeating. Containers are not a magical recipe for security. There are many attack vectors to keep in mind and evaluate.

https://www.lucavall.in/blog/containers-are-not-a-security-boundary


Why WebAssembly components

Tags: tech, webassembly, rust

Good explanation of where WebAssembly is going and why the current initiatives are important to its success.

https://blog.yoshuawuyts.com/why-webassembly-components/


How many branches can your CPU predict?

Tags: tech, cpu, hardware, performance

Not all CPUs are born equal in term of branch prediction. Interesting little benchmark.

https://lemire.me/blog/2026/03/18/how-many-branches-can-your-cpu-predict/


C++26: Span improvements

Tags: tech, c++, standard

Nice little quality of life improvements coming to std::span in C++26.

https://www.sandordargo.com/blog/2026/03/18/cpp26-span-improvements


More Speed & Simplicity: Practical Data-Oriented Design in C++

Tags: tech, data-oriented, object-oriented, design, architecture, c++, performance

A very good talk which walks you through how to move from object-oriented design to data-oriented design. Shows quite well how you must shift your thinking and the difficulties you might encounter with data-oriented designs. I appreciate a lot that it’s not just throwing object-oriented design out of the window, indeed you have to pick and choose depending on the problem space. Also it’s interesting to see how C++26 reflection might make some of this easier.

https://www.youtube.com/watch?v=SzjJfKHygaQ


Minecraft Source Code is Interesting!

Tags: tech, 3d, graphics, game, portability, refactoring

Lots of interesting tricks in this code base. Gives also a good idea of the shape and tradeoffs of such ports.

https://www.karanjanthe.me/posts/minecraft-source/


Oxyde ORM

Tags: tech, python, rust, orm

Looks like an interesting ORM which brings advantages of the Django one without all the bagage. It’s still young, let’s see how it evolves.

https://oxyde.fatalyst.dev/latest/


Python 3.15’s JIT is now back on track

Tags: tech, python, performance, jit

Interesting read on how the CPython JIT effort has been saved.

https://fidget-spinner.github.io/posts/jit-on-track.html


The Optimization Ladder

Tags: tech, python, performance, optimisation

Here are the main levers to make Python code faster. Tries also to distinguish the effort level of each approach.

https://cemrehancavdar.com/2026/03/10/optimization-ladder/


XML is a Cheap DSL

Tags: tech, data, declarative, xml, portability

Interesting lesson here. It looks like XML still has its place in our modern tool belts. We should stop dismissing it too quickly.

https://unplannedobsolescence.com/blog/xml-cheap-dsl/


JPEG compression

Tags: tech, graphics, compression

Wondering how JPEG works? Here is a primer.

https://www.sophielwang.com/blog/jpeg


A Decade of Slug

Tags: tech, graphics, fonts, shader, patents

Nice algorithm for rendering fonts. Turns out it’s not patent encumbered anymore, this is good news.

https://terathon.com/blog/decade-slug.html


Video Encoding and Decoding with Vulkan Compute Shaders in FFmpeg

Tags: tech, video, codec, vulkan, computation

Vulkan compute shaders are very much capable nowadays. Exemplified by its use in FFmpeg.

https://www.khronos.org/blog/video-encoding-and-decoding-with-vulkan-compute-shaders-in-ffmpeg


The Best Darn Grid Shader (Yet)

Tags: tech, 3d, graphics, shader, mathematics

Good exploration on how to make grid shaders. It’s definitely not a simple problem.

https://bgolus.medium.com/the-best-darn-grid-shader-yet-727f9278b9d8


A sufficiently detailed spec is code

Tags: tech, ai, machine-learning, copilot

Or why this latest trend in genAI hype is a fool’s errand.

https://haskellforall.com/2026/03/a-sufficiently-detailed-spec-is-code


Rob Pike’s 5 Rules of Programming

Tags: tech, programming, optimisation, performance, complexity

These are good rules. Take inspiration from them.

https://www.cs.unc.edu/~stotts/COMP590-059-f24/robsrules.html


Invest Your Political Capital

Tags: tech, architecture, organisation, politics

Interesting model for bringing architectural and organisational changes. This is indeed at least in part political games… so you need some political capital to spend.

https://architectelevator.com/transformation/political-capital/



Bye for now!

Last week we released version 1.5 of Marknote, a fast and free alternative to existing slow and pay-walled note-taking apps. Today we announce a release that fixes some issues and improves a few things across the app.

Marknote v1.5.1

So here is a list of the most notable changes and improvements:

  • Pasting text in Source mode no longer clears document content.
  • Pasting images from clipboard works really well too.
  • Find and replace text shortcuts are brought back.
  • Note names are now properly elided.
  • Markdown syntax highlighter is added to the Source mode.
  • Code blocks now have their own background.
  • Items in the Table of Contents will follow active paragraphs.
  • Edit button is shown in compact mode (for when the format bar is hidden).
  • Fullscreen mode is brought back for those who need full immersion (Ctrl+Shift+F on Linux or Alt+Enter on Windows).
  • The KRunner plugin now works pretty well inside Flatpak.
  • Single note loading is much faster now.
  • We optimized image loading and reduced video memory usage by almost 50%.

The future is bright

To address some of the questions since the last release:

  • Yes, code blocks will have proper highlighting in upcoming versions (please keep in mind that we don't have the staff of a large enterprise company, and we probably don't need one either ;)).
  • Yes again, quotes and some embedded content types are planned to be added too.
  • Yes once more, cross-platform support is set to be improved. We will release stable versions for all the major platforms once they get through proper testing.
  • And one more thing: the all-new and shiny block editor is a work in progress, and it will be done when it's done™.

Thank you all

Thanks to everyone for making Marknote your software of choice. We will make sure to keep Marknote up and running at lightning speed for everyone. As always, you can get the latest version of the app via Flatpak, Snapcraft or your favorite package manager. Stay tuned!

The second and third betas for Krita 5.3.0/6.0.0 have been released, with the final release drawing near. There was also a hotfix stable release, 5.2.16, to fix a regression causing problems with HEIF files.

Read on for a look at development news and the Krita-Artists forum's featured artwork from last month.

Development Report

5.2.16 Hotfix Release

This release contains exactly two regression fixes: some HEIF files not loading properly (bug), and the Move Tool movement shortcuts not working until clicking the canvas (bug).

If you're encountering either issue, update to 5.2.16.

Manual Updated Ahead of Release

The Krita Manual has been updated with all the new features in 5.3.0, thanks to the efforts of manual writer Wolthera and others.

Having trouble figuring something out? The friendly documentation is there to guide you in multiple languages, thanks to the ongoing work of all the translators!

Second and Third Betas for 5.3.0/6.0.0 Released

The second beta and third beta for 5.3.0/6.0.0 were released, with many bug-fixes and a look at the new splash screen artwork by Tyson Tan.

Thanks to everyone who tested! The beta period is at an end with the final release right around the corner, but you can keep testing the latest nightly builds (found at the bottom of this post), and keep reporting bugs!

Kiki repairing bugs. CC-BY David Revoy

Fixes in Beta 2

Zoom In/Out to Cursor is the default canvas input zoom again, and Zoom In/Out to Center is the alternatively configurable action. (bug; change by Carsten)

Qt6 Fixes

Some Krita 6 bugs were caused using an outdated version of Qt6. As updating Qt would cause too many issues before the final release, Dmitry backported the fixes to our version.

On Windows, Krita won't crash when news is enabled (bug; change) and menus won't instantly close when using a stylus with WinTab (bug 1, bug 2; change).

On Linux with Wayland, issues with incorrect stylus cursor position (bug 1, bug 2; change 1, change 2), wrong cursor shape (change), and shortcut keys being auto-repeated (bug; change) are fixed.

The Help menu's Report Bug item is back, so don't be shy to report bugs! (bug; change by Luna)

Fixes in Beta 3

File Layers now allow Inherit Alpha and Layer Styles (change), .kra files used as File Layers now use their color profiles (bug; change), and renaming File, Filter, and Generator Layers is now undoable (bug; change), all thanks to Dmitry.

Agata fixed some regressions. Tools that auto-scroll when dragged to the edge of the canvas, such as the Selection tools, no longer scroll too much when zoomed in (bug change); Liquify Transform Masks no longer appear different than before (bug; change), plus the new Comics Panel Editing Tool no longer affects text (rather than turning characters into blocks) (bug; change)

On Android, a saving issue where the file is claimed to be unwritable was fixed by Carsten (change).

On Linux with X11/XWayland, there have been reports of Krita 6 running at a low framerate. The fix for this is to switch the OpenGL interface from GLX to EGL. This switch needs testing, so please read the EGL backend testing thread on how to do that and leave some feedback on whether it works or not.

Fixes in the Upcoming Final Release

Crashes were fixed when making a new vector layer after switching to a session (bug; change by Wolthera), converting the only layer of a group into a selection mask (bug; change by Dmitry), or on startup after removing a bundle containing tags. (change by Carsten)

More issues loading and saving HEIF images were fixed (bug; change 1, change 2 by Dmitry).

The Selection Actions Bar was fixed by Luna and Carsten to work with stylus or touch again, and have the right colors. (change 1, change 2; change 3)

More fixes to the Comic Panel Editing Tool by Agata (change): Only cut shapes the cut goes all the way through. Remove shapes that are small enough to be inside the cut gap. Work properly when using Shift for a straight line and putting the cursor on the end of the line. Don't add to the undo stack when nothing happened. The buttons and options have explanatory tooltips now (CCbug; change 1, change 2).

Krita 6 no longer crashes when loading window layouts. (bug; change by Gregg Jansen van Vuren)

On Linux with Wayland, pasting images with multiple sources in the clipboard no longer crashes. (bug; change by Luna)

Krita 6 on Windows no longer crashes when trying to open the background color selector. (bug; change by Dmitry)

A regression in beta 3 that broke translations on Android and Krita 6 has been fixed by Carsten and Freya (bug; change 1, change 2). Missing translations in Krita 6 were fixed by Dmitry and Ivan (change 1, change 2). Translations for some standard menu items such as 'New File' or 'About Krita' were also fixed for all versions. (bug; change by Dmitry)

The G'MIC plugin has been updated by Ivan to version 3.7.2 (change) and a crash when using the 'Layers Blend [Seamless]' filter was also fixed by Carsten (bug, change).

Text

The usual plethora of text fixes by Wolthera:

In the Text Properties Docker, Line Height property is now visible by default (change) and the dropdowns are touch-scrollable (change by Carsten). The Style Presets preview now shows properly in paragraph mode (bug; change).

The Text Tool won't modify hidden or locked layers (bug; change). Rendering issues when undoing/redoing text modifications have been fixed (bug; change 1, change 2).

Text-on-path now works properly with RTL and end-anchors (change). Gradients are properly positioned on text-in-shape (change), and flow-text-in-shape only happens for filled shapes (change). Text-on-path can't also be inside a shape (bug; change).

Instead of crashing when loading a font on startup fails, a fallback font is loaded (bug; change). Try harder to load some fonts (CCbug; change 1, change 2).

And Even More!

If that wasn't enough bugfixes for you, there's even more listed in the "Additional Changes" section near the bottom of this post.

Roadmap Revealed

The next major release is almost here! But the work to improve Krita never ends, so the development team got together to decide their next priorities.

Read the 2026 Krita Roadmap post to find out what problems the team wants to address after 5.3/6.0.

Community Report

February 2026 Monthly Art Challenge Results

The winner of the "Alien World Building" challenge is…

Birth in the Depths by Rhea_Asma

Birth in the Depths by Rhea_Asma

Join This Month's Art Challenge!

For March's theme, last month's winner has chosen "An unforgettable scene – 5 seconds before". Maybe you've got an artwork just waiting to happen?

This month's featured forum artwork, as voted in the Best of Krita-Artists - January/February 2026:

Skeleton and Cat by ShangZhou0

Skeleton and Cat by ShangZhou0

Pennywise Fan-art by Devin_Lopez

Pennywise Fan-art by Devin_Lopez

We are going to have to defend it with machete by Joseiby_Tapia

We are going to have to defend it with machete by Joseiby_Tapia

Why.. So.. Serious? by TBs_thename

Why.. So.. Serious? by TBs_thename

Bad opal by Sineater

Bad opal by Sineater

Participate in next month's nominations and voting to voice your opinion on the Best of Krita-Artists - February/March 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!

Krita's mascot Kiki putting money in a piggy bank

Additional Changes

5.3.0/6.0.0 Beta 2 (Stable pre-release):

  • Freehand Brush Tool: Properly remember Stabilizer sample count values. (bug; change by Dmitry Kazakov)
  • Dockers: Palette: Don't scroll the palette view when the foreground color changes with select nearest palette color on. (change by Carsten Hartenfels)
  • Android: Fix the UI font being too big with the Enable HiDPI setting disabled. (bug; change by Carsten Hartenfels)
  • Android: Fix the Add Style Preset dialog being a white box. (bug; change by Carsten Hartenfels)
  • Android: Go back to the previous way of working around the window not updating when first opening an image. (bug; change by Carsten Hartenfels)
  • Linux Wayland: Fix a crash when running with --nosplash. (change by Dmitry Kazakov)
  • Python Plugins: Batch Exporter: Fix script error when exporting. (bug; change by Freya Lupen)
  • Qt6: Fix line-edits having an unreadable placeholder text color. (bug; change by Freya Lupen)
  • Qt6 macOS: Fix the SVG Text Editor's background always using macOS style. (change by Freya Lupen)

5.3.0/6.0.0 Beta 3 (Stable pre-release):

  • Selection Tools: Improve Selection Actions Bar. Switch between light and dark icons. Show the cursor when hovering over it. (change by Luna Lovecraft)
  • Text Tool: Make sure text selection highlight is synced to changes. (bug; change by Wolthera van Hövell)
  • Text Tool: Fix double ends being drawn in type setting mode. (change by Wolthera van Hövell)
  • Text: Avoid crash by testing bounds for cursor pos. (change by Wolthera van Hövell)
  • Type Setting Mode: Don't maintain pos when there's no selection. (change by Wolthera van Hövell)
  • File Formats: PNG: Fix the 'Assume sRGB' setting to actually use sRGB for PNG images without a color profile. (bug; change by Dmitry Kazakov)
  • Input Profiles: Bind mouse button 6 to Eraser Mode in the Krita Default input profile and Eraser Preset in the other default profiles. Bind middle-click on Android to mouse button 6. (change 1 change 2 by Carsten Hartenfels)
  • Bundle Creator: Fix thumbnails of selected resources to not be blank in thumbnails view mode. (bug; change by Dmitry Kazakov)
  • Plugins: Workflow Buttons: Fix settings button not being visible. (bug; change by Timothée Giet)
  • Scripting: Avoid crashing if another version of PyQt is on Python's search path, by removing its containing folder (which may contain other modules) from the search path. This also adds a new script function, 'pykrita.qt_major_version()'. (bug; change by Freya Lupen)
  • Qt6 Dockers: Specific Color Selector: Fix saturation and value/lightness not updating in HSV/HSL mode. (bug; change by Freya Lupen)
  • Linux Wayland: Fix deploying Wayland client-side-decoration (change by Dmitry Kazakov)
  • Linux Wayland: Fix error when opening Settings on compositors without the 'wp_color_manager_v1' extension. (change by Luna Lovecraft)
  • Linux: Make sure Dr.Konqi has a bugreport address (bug; change by Dmitry Kazakov)
  • Linux Wayland: Fix the Pop-up Palette's docker config dialog not appearing. (bug; change by Luna Lovecraft)

Krita Plus (Stable, 5.3.0/6.0.0):

  • Tools: Make non-mouse multi-clicks in tools such as Crop and Polyline work. (bug 1, bug 2; change by Carsten Hartenfels)
  • Freehand Brush Tool: Improve Pixel Smoothing mode and fix it to work with sensor dynamics. (change by Carsten Hartenfels)
  • Brush Engines: Fix brush speed lurching. (bug; change by Carsten Hartenfels)
  • Crop Tool: Show negative coordinates in grow mode, snap to the canvas bounds when not in grow mode. (change by Luna Lovecraft)
  • Comics Panel Editing Tool: Fix the last edge being missing when merging shapes by removing a gutter. (change, by Agata Cacko)
  • Pasting: Fix missing colorspace with Paste into New Image with a selection. (bug; change by Luna Lovecraft)
  • Layer Stack: When switching to a mask with a shortcut, show its name in the floating message instead of its parent layer's. (bug; change by Dmitry Kazakov)
  • Resources: Fix being able to save resources that are inside a subfolder into a document. (bug; change by Dmitry Kazakov)
  • Palettes: Save modifications to palettes saved in documents. (change by Mike Will)
  • Palettes: Make the 'Default' palette the default in the FG/BG color selector. (bug; change by Dmitry Kazakov)
  • Touch Input: Don't touch paint when multiple fingers were down. (bug; change by Carsten Hartenfels)
  • Touch Input: Disable pointless long-press on the FG/BG color selector. (change by Carsten Hartenfels)
  • Text Properties Docker: Fix right-clicking slider-spinboxes selecting the text label instead of only the value. (bug; change by Luna Lovecraft)
  • General: Speed up start-up by making the Text Properties Docker load color theme faster. (change by Carsten Hartenfels)

Krita Next (Unstable, 5.4.0/6.1.0-prealpha):

  • Pop-up Palette: Add option to not rotate the triangular color selector; 'Settings->Pop-up Palette->Fix sRGB Triangle Selector Rotation'. (change by Dat Le)
  • Scripting: Add brushFade get/set to the View class. (change by Aqaao Aqaao)
  • Toolbox Docker: Add horizontal layout and compact mode (remove separators) options to the context menu. (change by Mike Will)

Nightly Builds

These pre-release versions of Krita are built every day.

Note that there are currently no Qt6 builds for Android.

Test out the upcoming Stable release in Krita Plus (5.3.0/6.0.0-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

Thursday, 19 March 2026

Bind QML Values across an Arbitrary Number of Elements

A while back I was writing a program that could instantiate an arbitrary number of windows containing controls synchronized across them. How a control would be synchronized would depend on a condition that determined which window instances would be linked to other instances. There are a few ways this could be implemented. In this entry I'll share my approach, in which I used a singleton C++ class serving as a message broker to bind properties across window instances.

Properties bound across multiple instances of a window_1_QML_Blog_Javier

Properties bound across multiple instances of a window

The App: Display to Light Panels

The software I wrote this for is a small app that allows you to have many windows open, all synchronized to display a single color on a per-monitor basis. The idea behind this is for users to adjust the light that comes off their monitors and use it to illuminate their faces when recording a video or taking pictures. By having individual windows be synchronized, users can continue to interact with the computer through their displays (rather inconveniently), while simultaneously using them to illuminate themselves.

This is, by no means, a replacement for a proper recording setup. Some of you will know that a light source placed in front of the subject can serve as either a nice "fill light" or a "scary spotlight", depending on the height and size of the source. Therefore, this should be complemented with other sources of light; ideally ambient light and a top light, to achieve a nice look. If the app seems useful to you, there's a link to it at the end of this article. That's enough gaffer speak for today. Let's talk about the code.

The Code

When writing code, one of my main concerns is always long-term maintainability. For that reason, I prefer to connect different parts of code in explicit, and easy to follow ways. One of such ways is passing values through a hierarchy of components; that is generally easy to track and produces well performing code. However, that approach can become unviable when connecting dynamically instantiated items to other dynamically instantiated items. A better solution in this instance is to use signals and slots to interconnect the items via a message broker class, done in C++. Each item would have a model or backend class in C++ and those classes would have the message broker in common. Lastly, the properties would be exposed to QML through Q_PROPERTY and updated via your control's signal handlers.

Message Broker Singleton

The message broker needs to be a singleton. That way there's only one instance of the broker in memory and all instantiated objects interface with the same broker. Our message broker only needs to provide the signals that will be used for routing properties. The actual connections that the routing involves are to be done from the outside. As such, a broker class would look like this:

// internalmessagebroker.hpp
// Singleton broker class contains signals that serve as pipes
// for different parts of a program to communicate with each other.

#pragma once

#include <QObject>

class InternalMessageBroker : public QObject
{
    Q_OBJECT

// Hide regular constructor
private:
    InternalMessageBroker() = default;

public:
    // Disable copy constructor
    InternalMessageBroker(const InternalMessageBroker& obj) = delete;
    InternalMessageBroker& operator=(InternalMessageBroker const&) = delete;
    static std::shared_ptr<InternalMessageBroker> instance()
    {
        static std::shared_ptr<InternalMessageBroker> sharedPtr{new InternalMessageBroker};
        return sharedPtr;
    }

// This is where all the signals would go
signals:
    void broadcastAPropertyChange(int value, bool broadcast);
};

Connecting Properties

Then we have the class or classes that would connect the properties together. On my Display Panels app, all controls and visual features come from QML, meaning I only have to concern myself with interconnecting the properties. To that end, I've created a class based on QObject and instantiated it within the delegate of a QML Instantiator. This class is only for managing property data, so I refer to it as a model class, called PropertiesModel:

// Main.qml
// Here are 3 windows, each with a PropertiesModel,
// that allows them all to share a binding to aProperty
// across all window instantiatons.

import QtQuick
import QtQuick.Window
import QtQuick.Layouts
import QtQuick.Controls

import com.kdab.example

Item {
    Instantiator {
        model: 3
        delegate: Window {
            PropertiesModel {
                id: propertiesModel
                aProperty: 1
            }
            ColumnLayout {
                anchors.fill: parent
                Text {
                    text: propertiesModel.aProperty
                }
                Slider {
                    id: hueSlider
                    value: propertiesModel.aProperty
                    Layout.fillWidth: true
                    onMoved: {
                        propertiesModel.aProperty = value;
                    }
                }
            }
        }
    }
}

Each property of our class is to be declared using a Q_PROPERTY macro with a getter, a setter, and a notifier. The getter and the notifier have nothing out of the ordinary...

// An ordinary getter
int PropertiesModel::aProperty()
{
    return m_aProperty;
}
// An ordinary notifier, form propertiesmodel.h
signals:
    void aPropertyChanged();

However, the setter must be able to distinguish between when its call is the product of a user interaction and when it comes from the message broker. We accomplish this by having the setter accept a boolean argument (broadcast) that will be used to determine whether the value being set should be sent through the message broker or notified back to QML for the UI to be updated. When a setter is first called, the value being set should be broadcasted and only on its way back should the UI be updated.

There are a few ways we could make sure that the value is always broadcasted first. We could set broadcast to true by default, or have two setter functions: a private one taking in both the value and broadcast arguments and a public one that only takes-in the value and calls the private function with broadcast set to true. Another option is to have broadcast be an enum with only two possible values. That would produce more readable code, however, I didn't worry about that in my code because broadcast is only to be used on calls to the private setter.

Upon the private setter being called by the public setter, it will emit the broker's broadcast signal and that signal will in turn call the calling private setter for a second time (as well as the private setters of all other instances of PropertiesModel; those being called for the first time). When the private setter calls the broker that calls back to the private setter, it also passes broadcast set to false. All other instances will then evaluate the value of broadcast to be false determining that the UIs should be updated and preventing an infinite loop.

// Private setter implementation for a property that's being broadcasted
void PropertiesModel::setAProperty(const int value, const bool broadcast)
{
    if (broadcast)
        emit m_broker.get()->broadcastAPropertyChange(value, false);
    else if (m_currentScreen == screenName) {
        m_aProperty = value;
        emit screenSaturationChanged();
    }
}

// Publicly exposed setter prevents the broadcast argument from being
// specified by other callers
void PropertiesModel::setAProperty(const int value)
{
    // Always broadcast properties not being set by the message broker
    setAProperty(value, true);
}

To complete this loop as described, we need to connect the signal from the broker to the private setter of the PropertiesModel class whenever a new copy is instantiated. The best place to accomplish that is from the class' constructor, like so:

// The constructor is used to connect signals from the broker to setter properties
PropertiesModel::PropertiesModel(QObject* parent)
    : QObject { parent }
{
    m_mb = InternalMessageBroker::instance();
    // Connections take place after the class has been instantiated
    // and its QML properties parsed.
    QTimer::singleShot(0, this, [this] () {
        connect(m_mb.get(), &InternalMessageBroker::aPropertyChange,
        this, &ScreenModel::setAProperty);
    });
}

QTimer to Delay Initialization

If you've been reading the blocks of code that accompany this article, you may be wondering "Why is there a singleShot QTimer there?" When the PropertiesModel class is instantiated via QML, any connected properties that have values assigned from QML code will trigger the Q_PROPERTY's setter function. This will happen once per instantiation. If the broker were connected, it would broadcast the value set to all currently instantiated instances every single time that a new instance is added. To prevent that, we must not make the connection to the broker until after a class has been fully initialized. A single shot timer can be used to accomplish that; setting its delay to 0 will ensure that it is run immediately after all properties have been evaluated.

In the end, this is what the PropertyModel header would look like:

// propertiesmodel.h
#pragma once

#include "internalmessagebroker.hpp"

#include <QQmlEngine>

class PropertiesModel : public QObject {
    Q_OBJECT
    QML_ELEMENT

    Q_PROPERTY(int aProperty READ aProperty WRITE setAProperty NOTIFY aPropertyChanged FINAL)
public:
    explicit PropertiesModel(QObject* parent = nullptr);

    int aProperty();
    void setAProperty(const int value);

signals:
    void aPropertyChanged();

private: 
    void setAProperty(const int value, const bool broadcast);

    std::shared_ptr<InternalMessageBroker> m_mb;
    int m_aProperty;
};

Conditional propagation

If a condition must be met for the propagated value to result in an update, then, in addition to value and broadcast, you should also broadcast any other values that are required to for such condition to be met. Pass those as arguments to the setter's and the broker's signal. Condition validation would then take place within the base case of the private setter. Here's a commented snippet of what that looks like on the Display to Light Panels app that this article was based on:

// In the original code what here I named broadcast used to be named spread.
void ScreenModel::setScreenHue(const int hue, const bool spread=true, const QString &screenName="s")
{
    if (spread)
        emit m_mb.get()->spreadHueChange(hue, false, m_currentScreen);
    // The incoming value is only accepted if screenName matches the screen
    // that the window is at and discarded otherwise.
    else if (m_currentScreen == screenName) {
        m_screens[m_currentScreen].hue = hue;
        emit screenHueChanged();
    }
}
Properties bound across instances of a window_2_QML_Blog_Javier

Properties bound across instances of a window

Real World Example

For a real world application, you can read the code for Display to Light Panels, the app that inspired this article, at: https://github.com/Cuperino/Display-to-Light-Panels

If you need help solving architecture problems, such as this one, reach out to us and we will gladly find ways in which we can help.

The post Bind QML Values across an Arbitrary Number of Elements appeared first on KDAB.

Embedded World 2026 in Nuremberg showcased the growing dominance of open source technologies and ecosystems. Various stacks, tools, and frameworks saw increased adoption in embedded systems. Discussions heavily focused on two emerging topics: cybersecurity regulations and artificial intelligence, pointing to major future investments despite some hype.

Tuesday, 17 March 2026

This article explains the syntax of SWHIDs, describing how the core identifier and optional qualifiers are structured. It shows how SWHIDs can reference software artifacts such as files, directories, revisions, and releases, and how their design enables precise comparison of software

An amazing journey of 8 weeks full of code, new experiences, and interactions.

I had an amazing time at the Season of KDE 2026. All the guidance from my mentors, Benson Muite and Srisharan VS, really helped me work on Mankala and also helped me learn new skills.

So, lets summarize things a bit, what I was able to achieve during the span of these two months at KDE.

Complete GUI redesign

  • I have made major changes in the MankalaNextGen GUI, introducing Kirigami to have different light and dark themes. Improved the design for different pages, MainMenu, Rules, About, Profile, and much more, where I worked to introduced better colors and geometry to the shapes, like buttons or display boxes.
  • For the main Game interface, we made new boards and shells. I worked on integrating the logic for displaying the shells and fixing the Board based on the exact numbers shown from Mankala.
  • I tried generating a board using Perlin noise, which can be later integrated into MankalaNextGen to design the boards more efficiently based on variants. Added new code to generate a calm background music and a wooden click sound to make it look more authentic.

Home

Game

Translations and Localization

I started learning about Lokalize, KDE’s own translation software. I had successfully made translations for Mankala Engine and MankalaNextGen in Tamil and Hindi using Lokalize.

Artworks and KDE review

  • I have started working on the KDE review tasks and started with the fix to correct GitLab CI Build pipelines.
  • In the last few weeks, I started learning about Krita and made cover images for the three variants Bohnenspiel, Oware, and Pallanguzhi using their cultural Mankala boards and traditional motifs.

Krita

The journey doesn’t end here. Season of KDE has been a much-needed experience to improve my commitment towards projects and open-source. I plan to work with Mankala Engine and the KDE Community much more and make many other contributions.

Thanks to my mentors, my fellow contributors, and to the entire community for helping me so far. 🚀

Tuesday, 17 March 2026. Today KDE releases a bugfix update to KDE Plasma 6, versioned 6.6.3.

Plasma 6.6 was released in February 2026 with many feature refinements and new modules to complete the desktop experience.

This release adds two weeks’ worth of new translations and fixes from KDE’s contributors. The bugfixes are typically small but important and include:

View full changelog