Skip to content

Monday, 31 March 2025

Many people are, understandably, confused about brightness levels in content creation and consumption - both for SDR and for HDR content. Even people that do content creation as their job sometimes get it really wrong.

Why is there so much bad information about it out there?

Before jumping into the actual topic, I want to emphasize that most people that have gaps in their knowledge about HDR and SDR are not to blame for it. The standards that define colorspaces are usually confusingly written, many don’t paint the full picture, finding the one you actually need can be difficult, some you need to pay for to even read, and generally there is not a lot of well organized and free information about this out there.

When you have basically no information, you just go with what you do know - you see how Microsoft Windows does HDR for example, maybe you take a look at a draft for the sRGB specification or simply the Wikipedia pages, and do the best with what you have. The result is often less than ideal.

Having worked on this stuff for a while now, and having read lots about it from people that actually know what they’re doing, I think I know the topic well enough to clear up some misconceptions, but do keep in mind that my knowledge is limited too, and I may still make mistakes. If you’re sure I got anything wrong, tell me about it!

If you want an entry point for way more information than this blog post provides, check out color-and-hdr.

How brightness works with sRGB

sRGB is the colorspace most content uses today. Despite that, very annoyingly, its specification is not openly available… but there’s a draft version that you can download freely here, which is good enough for this topic.

The (draft) specification defines two things that are important when it comes to brightness:

  • a set of reference display conditions
  • a set of reference viewing conditions (I’ll call that “viewing environment” from here on)

The reference display conditions are seemingly quite straight forward. The display luminance is 80cd/m², we have a whitepoint of D65, and a transfer function. Transfer functions describe how to calculate the output luminance from the encoded values of an image, and with sRGB that’s

Y = X ^ 2.2

where Y is the relative luminance on the display, and X is the relative luminance on the input.

The viewing environment has a few more parameters, but it’s conceptually not difficult to understand: It describes how bright your environment is, what color temperature the lights in your room have, and how much your display reflects the environment at you.

sRGB viewing environment

How to create sRGB content “correctly”?

The assumption that many people take from the specification is that you should calibrate your display to 80cd/m². On its own, that information is completely wrong!

It’s obvious when you think about how end users actually view content: They set the brightness level of the display to what they’re comfortable with in the current environment. You make the display really bright when you’re outside, less bright when in a normally lit room, and even darker than that when the lights are off.

The part that’s missing with just calibrating the display to some luminance level is that you must take the viewing environment into account. Either you set up the sRGB reference viewing environment (with measurements!)… or you just don’t. When you create content, in most cases you should do exactly the same thing as the person that will consume the content does: Just set the brightness to what’s comfortable in the environment you’re in. It still helps to keep your viewing environment mostly fixed of course, lots of brightness changes mean you’re constantly readjusting and that’s not good.

There’s another big thing to take into account for sRGB, which is its confusing transfer function.

The sRGB transfer function

The sRGB specification doesn’t just define a transfer function for the display, but it also defines a second transfer function. This sRGB piece-wise transfer function is

if X < 0.04045: Y = X / 12.92
else: Y = ((X + 0.055) / 1.055)^2.4

and it’s slightly different from gamma 2.2 in that it has that linear bit for the very dark area.

The purpose of this transfer function is to optimize encoding of dark parts of the image - with 8 bits per color, gamma 2.2 becomes really small in the lowest few values. 1/255 for example results in roughly 0.0000051 with gamma 2.2, and 0.0003035 with the sRGB piece-wise transfer function.

This difference might sound insignificant, but it is noticeable. The most well known place of where the wrong transfer function is used is Microsoft Windows: When you enable HDR in Windows, it uses the piece-wise transfer function for sRGB content, instead of the gamma 2.2 transfer function that which your display uses in SDR mode. The result is that dark areas of SDR games and videos are brighter than they should be, and look “washed out”.

So when should you use the sRGB piece-wise transfer function? So far, I don’t know of any case where you should, outside of working around that Windows problem in your application… I’m also only concerned with displaying images though, and not editing or creating them, so take that with a grain of salt.

How brightness works with HDR

Most HDR content uses the SMPTE ST 2084 transfer function. The specification for this is freely available here.

SMPTE ST 2084 is a bit different from the sRGB spec, in that it only defines a transfer function but no complete colorspace or viewing environment. That transfer function is the Perceptual Quantizer (PQ): It tries to compress luminance levels in a way that matches how sensitive human eyes are in specific luminance ranges, and it’s defined in absolute luminance - a PQ value of 0.0 means <= 0.005cd/m², and 1.0 maps to 10000 cd/m².

The missing parts are defined by different specifications, rec.2100 and BT.2408. More specifically, rec.2100 uses the BT.2020 primaries with the PQ transfer function (or the HLG transfer function, but we’ll ignore that here) and a recommended viewing environment for such HDR content:

rec.2100 viewing environment

BT.2408 expands on that with an HDR reference white and graphics white, at 203cd/m². This is mostly meant for the context of broadcasts, referring with “graphics” to logos or subtitles in the video stream.

Despite the transfer function being “absolute”, just like with sRGB, the luminance numbers don’t mean anything in isolation. When displaying HDR content, just like with SDR, we need to take the viewing environment into account, and adjust luminance levels accordingly.

How is this handled in Wayland?

Every transfer function in the color management protocol has reference display conditions and a viewing environment attached to it, defined by a few parameters. Most relevant for this topic are

  • a reference luminance, also known as HDR reference white, graphics white or SDR white
  • minimum and maximum mastering luminances, basically how dark and bright the display the content was made for can go

When content is displayed on the screen, the compositor translates between the viewing environment of the content, and the viewing environment of the user. While we don’t usually have full knowledge of what exactly that viewing environment is like, the brightness slider in KDE Plasma provides a very good approximation by configuring the reference luminance to be used for content on the display. The calculation for this brightness adjustment is rather simple, in linear space you just do

output = input * output_reference / input_reference

You can configure the maximum reference luminance (brightness slider at 100%) with the “Maximum SDR Brightness” in the display settings of Plasma 6.3. The minimum and maximum luminance your display can achieve can only be configured with the kscreen-doctor command line tool right now, but an easy to use calibration utility for this is nearly finished (and the default values are usually fine too).

In general, this system is working really well… with one rather big exception.

HDR in Windows games

As mentioned before, Windows in HDR mode does sRGB wrong, but the story with HDR content is kind of worse.

When you use Windows 11 on a desktop monitor and enable HDR, you get an “SDR content brightness” slider in the settings - treating HDR content as something completely separate that’s somehow independent of the viewing environment, and that you cannot adjust the brightness of. With laptop displays however, you get a normal brightness slider, which applies to both SDR and HDR content.

The vast majority of Windows games expect the desktop monitor case: Static, never changing luminance levels, which are displayed on the screen without any adjustments whatsoever. Windows also didn’t have a built-in HDR calibration tool until Windows 11, so nearly every Windows game ships with its own HDR calibration settings and completely ignores system settings. This doesn’t just cause issues for Windows 11 laptops of course, but also for playing these same games with HDR on Linux.

Until Plasma 6.2, we worked around that, also mostly not doing brightness adjustments, and the result was that those HDR calibration settings in games worked basically like on Windows. However, these workarounds broke Linux native applications that want to mix HDR and SDR in their own windows, made tone mapping worse, and blocked features like HDR on “SDR” laptop displays, so in Plasma 6.3 we had to drop them.

This doesn’t mean you can’t play Windows games with HDR in 6.3 anymore, you just have to adjust their configuration to match the changed brightness levels. In most cases, this means you set the HDR paper white in games to 203cd/m², and then set the maximum luminance with the game’s configuration screen, like this one from Baldur’s Gate 3:

Baldur's Gate 3 HDR calibration

How to implement good HDR

After ranting about how Windows games do it wrong, I should end this blog post by also explaining how to do it right. I will skip most of the implementation details, but on a high level if you’re implementing HDR in a Wayland native application or toolkit, you should

  • use the Wayland color management protocol
  • get the capabilities of the compositor and/or graphics driver, specifically the transfer functions they support
  • get the preferred image description from the compositor, and the luminances you’re supposed to target from that. When using these luminance values, keep in mind that reference luminance adjustment the compositor will do!
  • every time the preferred image description changes, get the new one and adjust your application to it
  • now render for these parameters, and set the image description you actually ended up targeting on the surface, either through Vulkan or with the Wayland protocol (not both at the same time!)
  • SDR things, like user interfaces in games, should use the reference luminance too
  • if your application has some need to differentiate between “SDR” and “HDR” displays (to change the buffer format for example), you can do so by checking if the maximum mastering luminance is greater than the reference luminance
  • now you can, and really should drop all HDR settings from your application. If HDR has a performance penalty in your application, a toggle to limit the app to SDR could still be useful, but everything else should be completely automatic and the user should not be bothered with calibration screens or similar annoyances

Saturday, 29 March 2025

Kaidan 0.12.2 fixes some bugs. Have a look at the changelog for more details.

Changelog

Bugfixes:

  • Fix removing corrected message (melvo)
  • Fix showing message bubble tail only for first message of sender (melvo)

Download

Or install Kaidan for your distribution:

Packaging status

OSPP banner with text in English and Mandarin.

The KDE community will again participate in the Open Source Promotion Plan (OSPP), a program in which students can contribute to open source projects. Burgess Chang, is the KDE community contact.

As part of OSPP 2024, Hànyáng Zhāng (张汉阳) added Android support to Blinken. The work done is described in a series of blog posts, available in both English and Mandarin. The Android version is available from the KDE F-Droid nightly repository.

Unlike the Google Summer of Code, where stipends are funded by a company, stipends are primarily funded by the Chinese government with options for open source communities to contribute additional stipends if they wish to have more students participate in their projects than they get allocated. It is good that there is recognition that contributing to open source software is a skill that students should acquire.

The range of contributions that can be made in OSPP is not just limited to programming, contributions to other aspects that improve the open source software ecosystem such as translation and documentation are welcome. As it is a government funded program, there is a little more oversight to ensure tax payer funds are well spent. In particular, for most projects, contributions should be made to a publicly available repository associated with the project and that student participants are selected primarily based on their project application.

The plan aims to increase the programming and software engineering skills of students by encouraging them to participate in real world projects during their vacation period. While it is funded by the Chinese people, open source projects with contributors from all over the world apply to participate, and students from any part of the world can also apply to participate.

Mandarin and English are the official communication languages for the program, knowledge of one of these is sufficient to participate in the program.

The OSPP website lists the dates for each phase of the program. Important dates for this year are:

  • 04 April - 04 May: Project submission period for approved open source communities
  • 09 May - 09 June: Student project application period
  • 01 July - 30 September: Coding and development period for accepted projects

Friday, 28 March 2025

Kaidan 0.12.1 fixes some bugs. Have a look at the changelog for more details.

Changelog

Bugfixes:

  • Do not highlight unpinned chats when pinned chat is moved (melvo)
  • Fix deleting/sending voice messages (melvo)
  • Fix crash during login (melvo)
  • Fix opening chat again after going back to chat list on narrow window (melvo)
  • Increase tool bar height to fix avatar not being recognizable (melvo)
  • Fix width of search bar above chat list to take available space while showing all buttons (melvo)
  • Fix storing changed password (melvo)
  • Fix setting custom host/port for account registration (melvo)
  • Fix crash on chat removal (fazevedo)
  • Move device switching options into account details to fix long credentials not being shown and login QR code being temporarily visible on opening dialog (melvo)
  • Allow setting new password on error to fix not being able to log in after changing password via other device (melvo)

Download

Or install Kaidan for your distribution:

Packaging status

Thursday, 27 March 2025

Twinimation Studios have released a new Krita workshop, and we wanted to give them a chance to introduce their new offering to Krita's users:

Greetings everyone! Entering the art world is sometimes seen as an expensive endeavor. From art schools to subscription based software, artists across different fields tend to have notable expenses. But have you ever wondered if you can become an artist without spending a fortune? Twinimtion Studios is back to answer the question with our very first full workshop! Becoming an Artist on a Budget is a specialty made guide guide to help aspiring artists begin their artistic journey WITHOUT breaking the bank. This workshop consists of 9 main videos bundled into one easy to digest package, along with some special bonus showcase videos as well. Included is also a bonus freebie list of numerous artistic products ideas to begin a paid art hobby or career.

Within this workshop, we provide tips and tricks on how one can begin their art journey for completely free. After reviewing a list of affordable resources to learn art skills, we recommend numerous free art programs with a special spotlight on Krita! We explain how versatile Krita is, and how it can be used across numerous different art fields, such as animation, comics, and painting! Following some other drawing tutorials, the workshop concludes with a special lesson on entrepreneurship, where we explain how aspiring artists can create a paid hobby or full business through their artwork while remaining on a budget.

With so many people wanting to enter the art scene and build a career from it, we hope this workshop will be a helpful guide for all of those who wish to create their own artistic brand. Additionally, we have many other Krita focused animation courses on our website!

Twinimation Studios was founded by instructors Andria and Arneisha Jackson; MFA graduates who've studied animation for 9 years and want to share their professional knowledge with the world. We provide tutorials on different styles of animation, character design, illustration, film creation and so much more! Look forward to our future tutorials and workshops where we will continue to expand our repertoire to fit several different art fields.

Here is a link to the workshop:

Become an Artist on a Budget

Wednesday, 26 March 2025

Plasma's login experience is an area that we know requires some improvement — it works OK in the basic case, but it's very barebones and doesn't handle anything beyond that.

As a complete desktop experience, it's our job to provide support for the edge cases too.

What we want

  • Great out-of-box experience in multi-monitor and high DPI and HDR
  • Keyboard layout switching
  • Virtual keyboards
  • Easy Chinese/Japanese/Korean/Vietnamese (CJK) input
  • Display and keyboard brightness control
  • Full power management
  • Screen readers for blind people (which then means volume control)
  • Pairing trusted bluetooth devices
  • Login to known Wi-Fi for remote LDAP
  • Remote (VNC/RDP) support from startup

A brief history

In Plasma 5, we retired our own bespoke display manager KDM, in favour of SDDM. A display manager started for multiple lightweight Qt Desktops. It was modern at the time making use of new QML for the front and as a big selling point at a time when Plasma was also making use of it.

SDDM's Big Architecture Problem

We ran into a problem, though. SDDM is designed to show a single greeter window, loading arbitrary QML from the specified theme.

Whilst this all sounded great for Plasma, the abstraction is at the wrong level — for our wishlist we need a lot more tight integration from our login screen than just a window showing sessions and users.

With SDDM, power management is reinvented from scratch with bespoke configuration. We can't integrate with Plasma's network management, power management, volume controls, or brightness controls without reinventing them in the desktop-agnostic backend.

SDDM was already having to duplicate too much functionality we have in KDE, which was very frustrating when we're left maintaining it.

The Competition

GNOME's GDM is the gold-standard of display managers, and it achieves this higher level of quality by running half of a Gnome session.

Gnome's GDM

SDDM got closer when it added Wayland support — it had to use a compositor such as KWin. But because the project tries to be agnostic between desktops, it has to support any compositor. There aren't compositor-agnostic ways to do even simple things like set the keyboard layout, so in the end this compositor agnosticism goal simply didn't work.

Theme Problems

A major mistake we made throughout Plasma 5 was conflating "writing UI in a high level scripting language" with "it's themable" as the same thing — they are not. QML does make it easy to modify and iterate without programming skills, but it still contains business logic. It should not be the primary method of customisation that we expose to users.

Ultimately, this was poor for end users. We pushed back on adding support for configurable theme options, because building a theme engine within a theme was wasteful! But often people want to just change a few things. Choosing a theme meant finding a combination that had everything. The store filled up with themes that are 99.9% identical code-wise; most are just wallpaper mods.

It was also poor for theme developers. Not only do they have to modify the visuals, but also re-implement focus handling, accessibility, and the same boring logic again. They can't benefit from widespread testing so regressing these functionalities is common. Reddit is full of screenshots of broken SDDM themes.

Finally, it's poor for us Plasma developers: theme support holds us back from adding new features or tidying code; if we want to add a new feature that in any way affects existing UIs, the situation get very messy very fast. The end result is that features just don't land, and the end user is the one that misses out.

So, what's the plan?

It's worth stressing nothing is official or set in stone yet, whilst it has come up in previous Plasma online meetings and in the 2023 Akademy. I'm posting this whilst starting a more official discussion on the plasma-devel mailing list.

Oliver Beard and I have made a new mutli-process greeter, that uses the same startup mechanism as the desktop session. It doesn't have all the features that we propose at the start of the blog, but an architecture where features and services can be slowly and safely added.

For customisation we intend to expose the same familiar settings that exist in Plasma and bring the design more in-line with the existing screenlocker where we also dropped arbitrary QML years ago. We'll make the wallpaper configurable with any existing wallpaper plugins, and expose the existing plasma theme and colour settings. Syncing will be a case of copying files, not re-inventing things.

The backend

When starting work on this, I tried to explore all alternative backends out there even with fully working implementations, however in practice nothing was maintained that matched our requirements. SDDM has been proven in the real world, so we have taken that and stripped it down to cover what we want moving forwards. I also aim to incubate it into the KDE ecosystem to have full autonomy over the project and merging stuck patches.

Current State

All of this has been implemented as two new repositories. Plasma Login Manager a continuation of SDDM and Plasma Login for front end and KCM (settings) code. These might be merged at some point.

The new code all works, and is at roughly feature parity with what we're replacing. A screenshot looks roughly the same as a stock Plasma SDDM setup. Whilst this is at a state where developers can opt-in, I would not want distros to be packaging things at this point.

Plasma Login, looks the same

Please do reach out if this sounds interesting, either directly or in the Plasma Matrix room - or with merge requests!

KdeGuiTest (previously called KdeEcoTest) is an automation and testing tool which allows one to record and simulate user interactions with the GUI of an application. It is being developed as part of the KDE Eco initiative to create usage scenario scripts for measuring the energy consumption of software. The main goals in Season of KDE 2025 are (i) to debug remaining issues, and (ii) to make KdeGuiTest more user-friendly by creating a Graphical User Interface so it is easier to create, edit, and run emulation scripts.

Progress of the KDE season so far:

  • Creation of a 4-cross PDF to be used for testing shift coordination.
  • Detection of the issues affecting shift coordination.
  • Fixed “Platform supported” error due to pynput.
  • Integration of KdeGuiTest with its own newly-built Graphical User Interface.

SHIFT COORDINATION ERROR

There is a difference between what is recorded when creating a script and what is played when running the script.

How I planned to fix this:

  • Identify the root of the shift error by creating a script to click on four target crosses, and then running the script to locate and solve differences.
  • Develop and implement a correction mechanism to accurately map recorded coordinates to playback positions.

My progress so far on the shift error:

  1. Creation of the 4-crosses PDF to test shift error: A target PDF is created with 4 crosses horizontally and vertically opposite each other.
This is the target PDF used to detect the shift error (image from Oreoluwa Oluwasina published under a <a href=\CC-BY-SA-4.0 license.)" src="https://eco.kde.org/blog/images/Target_pdf.png" style="max-width: 100%; height: auto" />
  1. Created a test script on the target PDF to detect shift error: I created a test script that clicks on the four crosses. I tested the KdeGuiTest tool on the target PDF and identified the issues affecting the shift error, namely:

    • Difference in mouse coordinates when scripts are created and playback
    • Screen position
    • Screen resolution

I am still working on a fix for this. See my comments at the end of this post for more.

FIXED “PLATFORM NOT SUPPORTED” ERROR DUE TO PYNPUT

While creating a script with KdeGuiTest we encountered the error “Platform not supported”. It was not recognizing the pynput backend in the code, which is the main technology used in KdeGuiTest to simulate user interactions in software applications. pynput is a Python library that allows you to control and monitor input devices. It is used for interacting with your keyboard and mouse through Python code. Read more from Mohamed Ibrahim in SoK23 here, Athul Raj K in SoK24 here, and Amartya Chakraborty in SoK24 here.

The error was fixed by installing the pynput package from https://github.com/krathul/pynput and other packages like Rust.

GRAPHICAL USER INTERFACE FOR KDEGUITEST USING PyQt5

One of the main goals in Season of KDE 2025 is to make KdeGuiTest more user-friendly and have it be easier to create, edit, and run final scripts using a Graphical User Interface.

To better understand the idea of the interface Emmanuel had in mind, I presented a prototype in one of our weekly meetings. Fortunately, it fit the proposed idea! To implement the prototype, I built the GUI from scratch with some feedback from my mentor Emmanuel. PyQt5 is used for creating graphical user interfaces with Python. It's a powerful and versatile toolkit that allows developers to build desktop applications that look and feel native on various operating systems, including Windows, macOS, and GNU/Linux.

The GUI has the following features:

  • Create script interface
  • Buttons for the following commands:
    • dw - define window
    • ac - add clicks
    • sc - stop add clicks
    • ws - write to the screen
    • wtl - write test timestamp to log
    • wmtl - write message to log
  • Action buffer widget
  • Final script widget
  • A run script interface
  • File dialog

You can see the current version of the scripting interface below.

This is the create script interface (image from Oreoluwa Oluwasina published under a <a href=\CC-BY-SA-4.0 license.)" src="https://eco.kde.org/blog/images/Create_script.png" style="max-width: 100%; height: auto" />

LOOKING TO THE FUTURE OF KDEGUITEST

First, fixing the shift error: The main shift error identified is due to differences in mouse coordinates. The mouse coordinates are recorded in the GUI in order to track them. I will then develop and implement a correction mechanism to accurately map recorded coordinates to playback positions. Second (time-permitting), developing three test scripts in collaboration with KEcoLab to compare energy consumption of PDF readers:

  1. GNU/Linux + Okular Script:
  • Open PDF document
  • Simulate typical reading patterns (scrolling, page turns)
  • Test PDF search functionality
  • Change to different view modes (single page, continuous)
  • Measure annotation and highlighting features
  • Document energy consumption metrics
  1. Windows + Okular script:
  • Replicate testing scenarios from GNU/Linux + Okular script
  • Adapt window management code for Windows environment
  • Collect equivalent energy consumption data points
  1. Windows + Adobe Acrobat Script:
  • Mirror the same testing scenarios as Okular script for a direct comparison
  • Account for Adobe Acrobat's specific UI elements and behaviors
  • Test comparable features (navigation, search, annotations)
  • Measure energy consumption patterns

Interested In Contributing?

KdeGuiTest is hosted here. If you are interested in contributing, you can join the Matrix channels KdeGuiTest, KDE Eco, and Measurement Lab Development and introduce yourself. Thank you to the Season of KDE 2025 admin and mentorship team, the KDE e.V., and the incredible KDE community for supporting this project.

Please feel free to contact me here: <@oree_x:matrix.org>


Monday, 24 March 2025

Stability improvements in KDE PIM-land, and polls in NeoChat

Welcome to a new issue of "This Week in KDE Apps"! Every week we cover as much as possible of what's happening in the world of KDE apps.

We had a busy week in PIM land with various stability improvements. We also did a small mini sprint on Saturday in Carl's kitchen where we worked and discussed about online accounts, KDE PIM, Itinerary, and Transitous, among others.

A bunch of Thinkpads on a table
(Only photo we made during the sprint)

Due to a personal vacation, during which I will enjoy a three-week break from computers, this is my last "This Week in KDE Apps" blog post until April 20.

General

Stefan fixed several memory issues in the KDE mobipocket support library, which is used in Baloo and Okular. (Stefan Brüns, 25.04.0. Link)

Personal Information Management Apps

Akonadi Background service for KDE PIM apps

Krzysztof fixed a crash when opening an email with a calendar invitation. (Krzysztof Nowicki, 25.04.0, Link)

Krzysztof also fixed the reauthentication and OAuth credentials storage of the EWS support in Akonadi. (Krzysztof Nowicki, 25.04.0. Link)

Carl hid the mail-specific caching options from calendar and contact folder options. (Carl Schwan, 25.04.0. Link)

Merkuro Calendar Manage your tasks and events with speed and ease

A new contributor, Pablo Ariño, fixed a bug in which double-tapping in the calendar failed to open the event creation dialog. Pablo also fixed a bug that occurred when clicking on the "New Event" button on mobile. (Pablo Ariño, 25.04.0. Link 1 and link 2)

Tobias ported the dialog that lets you see and edit the calendar settings from QWidgets to QML, redesigning the whole dialog at the same time. This is currently only available in the Calendar app, but also expected to be added to the Contact and Mail app soon. (Tobias Fella, 25.04.0. Link)

Tobias improved the text of various UI elements, for example when addings tags, todos or using proper American English spelling when using the app in American English.

We also fixed numerous recent and less recent regressions to Merkuro Calendar. (Carl Schwan and Tobias Fella, 25.04.0. Link, link 2, link 3)

Merkuro Mail Read and write emails

Tobias and Carl worked on preventing the user from removing the "local folder" resources, which Merkuro Mail requires to work correctly. (Tobias Fella & Carl Schwan, 25.04.0. Link 1, link 2 and link 3).

Tobias also fixed a crash when trying to open some folders. (Tobias Fella, 25.04.0. Link)

Merkuro Contact Manage your contacts with speed and ease

Carl reworked the list of contacts; similar to the email list in Merkuro Mail, the contact list now supports multiple selection as well as applying actions to all selected contacts. The code was also cleaned up a bit, and the avatar of the icon is now displayed at higher resolution. (Carl Schwan, 25.04.0. Link)

KOrganizer KOrganizer is a calendar and scheduling application

Allen added a new date picker that allows navigating faster to a selected date. (Allen Winter, 25.08.0. Link)

Allen also improved the tooltip of the search fields. (Allen Winter, 25.08.0. Link)

KDE Itinerary Digital travel assistant

Volker fixed the display of coach/seat numbers when having a separate seat reservation or multiple travelers with different seat reservations. (Volker Krause, 25.04.0).

Carl added support for events' ticket emails from Universe (e.g. Lollapalooza) in English. (Carl Schwan, 25.04.0. Link)

System Apps

Dolphin Manage your files

The "Open Terminal" and "Open Terminal Here" actions will now use the icon of your default terminal instead of the generic utilities-terminal icon. (Angus McLean, 25.08.0. Link).

Two weeks ago we announced a new style for the location bar. As with most very visible changes, the response to this was mixed. We are currently working on options that will hopefully make everyone happy.

Kup Backup scheduler for KDE's Plasma desktop

Kai excluded the state configuration folder (i.e. $XDG_STATE_HOME) from the set of files to back up, as this only includes machine-specific settings. (Kai Uwe Broulik, 25.08.0. Link)

Social Apps

Kaidan Modern chat app for every device

Melvin fixed deleting and sending voice messages. (Melvin Keskin, Link)

Melvin and Linus also made the QXmpp library used by Kaidan part of KDE. (Melvin Keskin and Linus Jahn, Link)

NeoChat Chat on Matrix

James fixed a few issues related to viewing polls in Neochat, and, more notably, made it possible to create them! (James Graham, 25.08.0. Link)

Educational Apps

WordQuiz Flash card trainer

Andreas fixed a crash when trying to open a broken or missing document. (Andreas Cord-Landwehr, 25.08.0 but a backport request was created for 25.04.0. Link)

Artikulate Artikulate Pronunciation Trainer

Andreas also finished porting Artikulate to Qt 6, building on earlier work started by Grigoris Pavlakis. (Andreas Cord-Landwehr and Grigoris Pavlakis, 25.08.0. Link)

KHangMan Hangman Game

Dimitrios Los added support for the Greek alphabet. (Dimitrios Los, 25.08.0. Link)

Utilities

Gwenview Image Viewer

Gwenview now uses the standard Qt-provided QtMultimedia library instead of the older Phonon library. (Lukas Kahnert, 25.08.0. Link)

Kate Advanced text editor

Arnd added the configuration that makes fish-lsp work out of the box in Kate. (Arnd Diestelhorst, 25.08.0. Link)

KTrip Public transport navigator

Carl adapted the query page from Itinerary to be used in KTrip, significantly improving the UI while also exposing the mode of transportation. More UI sharing between Itinerary and KTrip is also planned. (Carl Schwan, 25.04.0. Link)

…And Everything Else

This blog only covers the tip of the iceberg! If you’re hungry for more, check out Nate's blog about Plasma and be sure not to miss his This Week in Plasma series, where every Saturday he covers all the work being put into KDE's Plasma desktop environment.

For a complete overview of what's going on, visit KDE's Planet, where you can find all KDE news unfiltered directly from our contributors.

Get Involved

The KDE organization has become important in the world, and your time and contributions have helped us get there. As we grow, we're going to need your support for KDE to become sustainable.

You can help KDE by becoming an active community member and getting involved. 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. There are many things you can do: you can help hunt and confirm bugs, even maybe solve them; contribute designs for wallpapers, web pages, icons and app interfaces; translate messages and menu items into your own language; promote KDE in your local community; and a ton more things.

You can also help us by donating. Any monetary contribution, however small, will help us cover operational costs, salaries, travel expenses for contributors and in general just keep KDE bringing Free Software to the world.

To get your application mentioned here, please ping us in invent or in Matrix.

Saturday, 22 March 2025

I made a change to the KURLNavBar according to old mockup, since we hoped it would be easier to use.

This was a bad idea and made many people angry, at least on Reddit.

Seems to be a recurring theme with my visual changes, though this time wasn't nearly as bad as that was.

Anyway, I wanted to go over the process around it. Maybe someone else than me can learn something from this.

So, what happened

When implementing this mockup, I was expecting this was something people had been waiting for. It looked good to me, and since we've been wanting to freshen up Dolphin a bit, it felt like a good way to start. (This change wasn't to Dolphin, but our framework, so any apps that would use this navbar would get the changes.)

Another reasoning for changes was that there has been many many instances where people didn't even know this field could be clicked! They didn't know these items are buttons, for example on touch devices. That's where the background idea came from. And then make the folders look like clickable items, so people know that, well, they're not there just to look pretty.

The work started well enough, though I spent tons of time refactoring and trying to understand the old codebase. On top of that, we wanted to make sure it was as close to perfect as possible.

So I added a background first, which was relatively easy, then started modifying the buttons.

I wanted to use chevron > style separators between the folders, but there was no easy way to create a button with this shape. Sure, we could do it well for Breeze but any other Qt theme might render it weird and wrong, and that will just cause people report more bugs. So I settled with regular separators. It was a compromise, but I admit it was a rather bad one in the end.

I worked so much on this part, trying to figure out a good way to make the new buttons work, following the mockup as close as possible, and I couldn't see the usability issues. This was because I was so entrenched in the work I couldn't practically "see the forest for the trees."

I had tons of good feedback, from visual designers and the like. I wanted to follow everyones advice, but had to make compromises at some places.

Eventually I got somewhere where we all just liked it enough to push it out to the world.

And yeah, the whole process took ~1 month. You would think this is a simple change, but it never is that simple.

The feedback

I was expecting some pushback, as it always happens with visual changes, but I didn't expect it to be this.. energetic?

Sadly, most of the feedback was "it ugly" which gives me nothing actionable to work on!

Saying "it looks bad" doesn't help me work on it. It doesn't help me fix anything. I think that frustrated me the most: I wanted to help to fix the situation, but this kind of feedback just makes me wonder endlessly how to fix it.

Then I saw some actually actionable feedback:

  • The arrows showed the hierarchy better than the separators
    • I actually agreed with this afterwards, but I couldn't get the chevron thing working as mentioned above
    • I opted for separators because I wanted to keep the button look.
  • Some thought they were tabs and kept misclicking them instead of tabs
    • This was very good feedback and made me rethink the situation

I am glad I saw those two things in the sea of "it ugly." It helped me to restructure the whole thing in my mind and start fixing.

So yeah I do read your feedback. :P

Out with the new, in with the new but old

Here's the new iteration: KUrlNavigatorButton: Use arrow as separators

I saw the value in the old navbar with the arrows, so I brought them back. I wanted to keep the icons, because I liked the visual flair they added, but they also added clutter. If I could have had the chevron style buttons as shown in the mockups, I would have likely kept the icons.

Instead of reworking the old code, I decided to refactor it to best of my abilities: There was some things we didn't need anymore, and some things were a bit buggy due to miscalculations, so I changed things around and got them into good place.

I wanted to remove some items I thought people wouldn't use, but in fact I was told quickly that these are very good things to have, so I kept them around. And this is also the kind of feedback I like to see!

We're creating custom button components here, so we couldn't utilize more "standard" buttons. That's why there was a lot of math and tinkering with padding involved. I did try to utilize the QStyle methods here though so that it would look okay on any theme, not just Breeze. There will likely be cases where it won't look perfect in custom themes, but utilizing QStyle allows us to at least try.

After the refactoring, it got easier to work on this and I started to wrap it up with rapid pace. Instead of a month, it took me around a week.

It's not merged yet, but hopefully will be soon. I've been daily driving this iteration on my system and haven't had issues so far.

So what's the big deal?

Yeah, so, why the big deal? Why write a blogpost about this?

I didn't expect this change affect so much to my psyche, so I wanted to talk about this. Maybe some other FOSS devs can relate. I think it's something we should discuss more often, than just the raw results.

I like to think I am good at taking feedback. But after working on something for a month, then having to throw it all away even I was told it was ok.. It hurt! It was a lot of time spent on a thing that I hoped would make people happy.

I care about the stuff I do. A lot. So yeah, I'm gonna feel hurt when my work is disliked. And that's okay. Anyone who tells me otherwise can pound sand. Rejecting emotions like these just gets you in worse state over time. I speak from experience here.

It's easy to say "just ignore the negative feedback" but I literally can't. I am so into working on these things, I love working on KDE applications.. So it does hurt when something that has become such an extension of my own creativity and passion gets disliked... Even when I haven't directly worked on it!

Sure, this all is my problem to work on and I don't expect anyone to treat me with silk gloves and pat my head. Just wanted to explain it, that's all. Maybe someone can relate to this and doesn't feel so alone with the problem. I had the same thing when my games got insulted, where I was even more emotionally attached to the things, because I had made them myself completely.

Sadly, I kept dwelling on it a bit longer than I wished.. But working on the new version was a great outlet. I noticed old problems, fixed them and the new version is better in many ways.

I've noticed that I am not annoyed/upset about negative feedback itself, but how it's conveyed. Negative feedback will always be demotivating and bothersome, but when the negative feedback is written politely and has actually actionable items, it can be rather motivating as well. The "it ugly" feedback has stronger demotivating feedback, because it's not actionable.

I think the key takeaway from all of this is that mockups can get stale! If people like some older mockup, then you change to it suddenly, people may get very frustrated about it: They either forgot the old mockup, had never seen it, or they ended up disliking it in actual use.

So it's good idea to freshen the mockup before iterating on it: Ask the visual designers about it one more time, maybe share it with the users and ask their opinion on it. Sure you can't gauge everyone's opinion on it, but at least it shouldn't be that sudden to everyone.

This whole ordeal has been very tiring, but that's my own fault for not really allowing myself to take a break from it. I get hyperfixated easily, but again, that's my own problem.

So yeah, slight burnout by all of this. I'm sure I'll be fine, especially after this is merged so it can stop living rent free in my head.

I'm not blaming anyone for anything. Not even myself. Things happened and we all need to chill.

Hopes for future

There will be many many other times where I or someone else will get it wrong the first time.

So, share your feedback, but don't immediatelly go for the nuclear option of removing it all. With FOSS stuff, we don't have these huge QA teams that go yay/nay for something.. But everyone is welcome to join help in that regard!

Help us help you with actionable, polite feedback.

And thank you so much for everyone who has done so!

Now I'm going to try to just let go of this all. It's weekend anyway and I got bunch of games waiting to be played.

Thanks for reading as always!