Skip to content

Saturday, 9 August 2025

Welcome to a new issue of This Week in Plasma!

Every week we cover the highlights of what’s happening in the world of KDE Plasma and its associated apps like Discover, System Monitor, and more.

This week some cool features and UI improvements landed. We’re in the middle of the Plasma 6.5 development cycle, so now’s the time to get your features merged, folks!

Notable New Features

Plasma 6.5.0

Pages in System Settings have gained the ability to communicate with the parent app a little bit. Now they can mark themselves as “not relevant”, for example when you don’t have the necessary hardware to use them. They can also export actions that will appear in the sidebar, allowing quick toggles for things like Bluetooth and Wi-Fi. This has already been implemented for Bluetooth, and expect pages to start adopting these features soon where it makes sense! (Kai Uwe Broulik, link 1, link 2, and link 3)

System Settings showing quick toggle for Bluetooth in sidebar

Discover has gained support for flatpak+https:// URLs, which allows the Install buttons on Flathub to automatically open Discover. (Timothée Ravier)

Notable UI Improvements

Plasma 6.5.0

Muting microphones with a dedicated "Mute Microphone" button/shortcut or else using the very cool secret Meta+Mute Microphone shortcut now mutes all microphones, rather than just the active one. This matches the behavior of muting speakers and other sound output devices. (Arnav Rawat, link)

Made a whole bunch of improvements to the cross-app window raising system throughout Plasma. You can read more about it in Kai Uwe’s blog post on the topic. (Kai Uwe Broulik and Xaver Hugl, link 1, link 2, link 3, link 4, link 5, link 6, link 7)

The Plasma Browser Integration plugin for Firefox now blocks the system from going to sleep while a file is downloading, since Firefox doesn’t provide this feature itself. (Kai Uwe Broulik, link)

Detected wireless networks are now shown on the relevant System Settings page, not just the System Tray applet anymore. You can connect to them there, too. (Arnav Rawat, link)

Almost all KRunner plugins now start to provide results after the first character typed. (Nate Graham, link)

Shortcuts for moving a window directly to another virtual desktop are now shown in the window titlebar context menu for that window. (Kai Uwe Broulik, link)

It’s now easier to see which screens are replicas of which other ones, because their serial numbers and connector names are now shown visibly. (Evgeniy Harchenko, link)

Notable Bug Fixes

Plasma 6.4.4

System Settings’ Tablet page is now scrollable so you can see everything if you have a fancy pen with a lot of features. (Joshua Goins, link)

Fixed a visual glitch affecting Kicker Application Menu widget’ search field. (Christopher Wolk, link)

Plasma 6.4.5

Fixed the top crash in Plasma right now that could sometimes cause it to crash when you opened the Notifications history with any notifications in it. We thought we had fixed this before, but it came back, and now we have a better fix. (Arjen Hiemstra, link)

Fixed a really bad bug that would cause the .desktop file for a Flatpak app installed in your home folder to get moved when you dragged it from the Kickoff Application Launcher or Task Manager to somewhere else. (Marco Martin, link)

Fixed another bug related to dragging Flatpak apps to the desktop; now selecting “Copy” no longer produces a broken copy of the app’s .desktop file. (Marco Martin, link)

Fixed some more bugs that could cause desktop icons to shift around especially with multiple screens, and also for newly created files close to a vertical panel to be mis-positioned. (Akseli Lahtinen, link)

Task Manager theme previews now use the correct color scheme. (Nicolas Fella, link)

Frameworks 6.18

Fixed a bug that caused System Monitor Sensor widgets to be sized incorrectly on fit-content panels and make them resize themselves. (Leia Uwu, link)

Other bug information of note:

Notable in Performance & Technical

Plasma 6.5.0

Made Discover’s firmware updating (“Fwupd”) backend much faster, after it was discovered to be a bottleneck in launching Discover. (Aleix Pol Gonzalez, link)

Frameworks 6.18

You can now use the dumb Copilot key on the keyboards of many modern laptops as the trigger for launching apps or any other action in places where you can set up keyboard shortcuts. We don’t yet have a way for you to re-bind it to emulate another key (like the Ctrl key you probably wanted all along), but hopefully that will eventually happen as well. (Kai Uwe Broulik, link)

Improved the speed of thumbnail generation throughout KDE apps and Plasma. (Akseli Lahtinen, link 1 and link 2)

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.

You can help KDE by becoming an active community member and getting involved somehow. 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 us by making a donation! A monetary contribution of any size 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 a new Plasma feature or a bugfix mentioned here, feel free to push a commit to the relevant merge request on invent.kde.org.

Friday, 8 August 2025

As of a couple days ago Filelight on Windows is performing its search many times faster than before. Go check it out!

https://apps.kde.org/filelight/

It’s shocking that it was slow to begin with… A few years ago I rewrote the Filelight file walking logic to use native API for Linux and Windows. I thought I did a pretty good job of it and speed wasn’t too shabby. You can imagine my surprise when a friend recently pointed out that a similar piece of software performed maybe even better. Obviously this couldn’t stand. I immediately went to profile the situation and indeed Filelight wasn’t as fast as expected.

It turns out there are multiple competing APIs for querying file information on Windows and depending on which gets used performance may not be what you would expect. There’s a good write-up at https://www.cppstories.com/2024/cpp-query-file-attribs-faster/ in case you care to read more.

Long story short: by not calling slow API, Filelight is now heaps faster than before. Scans that took multiple seconds before now finish in the blink of an eye.

In case you are wondering just how much faster it is:

New

Old

Enjoy!

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


Big Tech’s “Sovereign Cloud” promises just collapsed — in their own words

Tags: tech, cloud, privacy, law

Indeed, you can’t trust claims of the big cloud players. If asked by they will hand out your data, wherever it is hosted.

https://nextcloud.com/blog/big-techs-sovereign-cloud-promises-just-collapsed-in-their-own-words/


Does Free Software Restore Dignity?

Tags: tech, foss, education, ethics

This is an old one, but I think that even without DVDs in the mix the core of the stories are still valid.

https://www.pcworld.com/article/491934/does_free_software_restory_dignity.html


New Method Is the Fastest Way To Find the Best Routes

Tags: tech, algorithm, graph, routing

Looks like we’ll be able to leave Dijkstra’s algorithm behind at some point.

https://www.quantamagazine.org/new-method-is-the-fastest-way-to-find-the-best-routes-20250806/


Digital hygiene: Emails

Tags: tech, email

This is a good way to deal with email. My approach is fairly similar and I confirm it works nicely for me.

https://herman.bearblog.dev/digital-hygiene-emails/


When Flatpak’s Sandbox Cracks: Real‑Life Security Issues Beyond the Ideal

Tags: tech, flatpak, security

Still some work to have proper confinement in practice for apps in the Flatpak ecosystem.

https://www.linuxjournal.com/content/when-flatpaks-sandbox-cracks-real-life-security-issues-beyond-ideal


Everything you wanted to know about SQL injection (but were afraid to ask)

Tags: tech, databases, sql, security

An oldie but a goodie about SQL injection. Does a good job getting the overall picture of this particular security plague.

https://www.troyhunt.com/everything-you-wanted-to-know-about-sql/


Python performance myths and fairy tales

Tags: tech, python, performance

It’s just hard to make Python fast. It can be improved yes, but it’ll stay cache un-friendly without a redesign. Nobody wants a Python 4. :-)

https://lwn.net/SubscriberLink/1031707/73cb0cf917307a93/


Litestar is worth a look

Tags: tech, python, django, fastapi, framework, web, backend

Looks like an interesting alternative to the bigger Django and FastAPI which get all the attention.

https://www.b-list.org/weblog/2025/aug/06/litestar/


How we made JSON.stringify more than twice as fast

Tags: tech, javascript, performance, optimization

Interesting tricks to optimize this function in V8.

https://v8.dev/blog/json-stringify


The Generativity Pattern in Rust

Tags: tech, rust, type-systems, language

Very interesting pattern. The article is really in-depth and gets all the way to language lawyer level. It’s not for everyone I guess.

https://arhan.sh/blog/the-generativity-pattern-in-rust/


Single Responsibility Principle: Why Does it Matter?

Tags: tech, programming, design

The example is maybe a bit on the simplistic side. Still it helps understand why you need to pay attention to the SRP.

https://8thlight.com/insights/single-responsibility-principle-why-does-it-matter


Domain-Oriented Observability

Tags: tech, architecture, observability, logging

Observability is indeed not necessarily easy to fit into a code base. Here is a potential approach to make it easier. I wouldn’t use it on a project where we’re only logging, but once you add metrics to the mix, this kind of probes can be worthwhile.

https://martinfowler.com/articles/domain-oriented-observability.html


New project, new tech stack?

Tags: tech, architecture, motivation

Or why you should know why you’re picking a new tech stack… or not. Don’t just blindly follow fashions.

https://avdi.codes/new-project-new-tech-stack/


The Twelve-Factor App

Tags: tech, web, services, architecture, devops, developer-experience

This is a good list of guidelines to produce a service which is less of a pain to test locally, deploy and operate. Of course, don’t take everything at face value (not all of it aged well) but it’s a good source for inspiration.

https://12factor.net/


Microservice Premium

Tags: tech, architecture, microservices, complexity

Or why the microservice cargo cult which has been going on for a while now infuriates me. It totally ignores the complexity it brings.

https://martinfowler.com/bliki/MicroservicePremium.html


What Is Quality?

Tags: tech, quality, agile

The question is always valid. I like this particular answer.

https://www.mountaingoatsoftware.com/blog/what-is-quality


Common Code Smells

Tags: tech, craftsmanship, quality, smells

A short list of common code smells that people need to know.

https://8thlight.com/insights/common-code-smells


The Domain Discontinuity

Tags: tech, tdd, design, architecture, ux

When you realize TDD is about units of behavior… then you can see what can be iterative and what can’t in your process. In other word, what is dictated by the problem domain is iterative, what is dictated by system architecture is not. Luckily, the latter is often related to the user experience you’re aiming for.

https://blog.cleancoder.com/uncle-bob/2014/01/27/TheChickenOrTheRoad.html


Unit Testing Principles

Tags: tech, tests, tdd

The design proposed is a bit too clear cut for my case. Other than that it’s fairly aligned with what I preach.

https://olano.dev/blog/unit-testing-principles/


Test Coverage

Tags: tech, tests, coverage

Or why meeting targets is not what you want. It’s still a good guide though.

https://martinfowler.com/bliki/TestCoverage.html


It’s Not Just Standing Up: Patterns for Daily Standup Meetings

Tags: tech, agile, organization, team, project-management

A good reminder that there’s a lot of things going on in something as mundane as a stand up meeting. It needs to be organized properly for the needs of the teams.

https://martinfowler.com/articles/itsNotJustStandingUp.html


Anti-Management? No, Different Management

Tags: tech, agile, product-management, project-management, management

There’s often confusion as to where the management responsibilities are in agile teams. This little rambling does a good job pointing it out and giving an idea of how management happens inside and around teams.

https://ronjeffries.com/articles/019-01ff/management/


A user manual for me

Tags: organization, communication, management

Interesting idea. Didn’t make one but maybe I should sit and take some time to do that.

https://cassierobinson.medium.com/a-user-manual-for-me-d3a851fbc694


If you’re remote, ramble

Tags: tech, remote-working, communication

Interesting trick for remote teams. There are many ways to try to get back the “water cooler talk” in your organization, it’s the first I encounter structured like this.

https://stephango.com/ramblings


Filling a Team Position

Tags: hr, hiring, management

It’s indeed not only about skills but also about roles… and the natural tendencies to cover them.

https://estherderby.com/filling-a-team-position/


Hiring Isn’t Enough by Catt Small

Tags: tech, management, diversity, culture

Indeed, it’s not just about hiring people it’s also about having a safe culture in the workplace.

https://modelviewculture.com/pieces/hiring-isn-t-enough


Yes, you can speak at a conference

Tags: tech, conference, talk

Please go ahead and share what you know! This article gives good tips on how to get started and why you can do it.

https://8thlight.com/insights/yes-you-can-speak-at-a-conference



Bye for now!

Using the Qt Logger in Rust with CXX-Qt

For projects incorporating Rust and Qt, a minor but important problem can arise: too many sources of log messages. In the usual case, one of these is from Rust (and crate dependencies) and another is from Qt. Our Rust and Qt solution, CXX-Qt, exposes a new API to help with this in the upcoming 0.8.0 release.

There are several benefits to ensuring your log messages go through one logger. It makes it easier to redirect said messages into a file, there's less configuration required for end users, and it makes consistent formatting easier.

Qt has its own logging infrastructure, and their suggested way to print messages in Qt applications. It has a category system, rules for filtering which messages you want to see, custom formatting and so on. Applications like GammaRay can also display messages from Qt, and configure which categories are emitted.

One of the more popular logging libraries in Rust is called tracing, and we're going to show how you can redirect messages from it to the Qt logger. The integration can work for any other logging crate too, including your own custom solution.

Getting started

Before we start splicing the two log streams, let's quickly go over sending a Qt log message in Rust. Assuming you already have a CXX-Qt application (and if you don't, you can follow our book, construct a message log context with QMessageLogContext:

let file = CString::new("main.rs").unwrap();  
let function = CString::new("main").unwrap();  
let category = CString::new("lib").unwrap();  
  
let context = QMessageLogContext::new(&file, 0, &function, &category);

You can specify the filename, the line number, the function name and even a category. We have to use CString here because QMessageLogContext in C++ uses const char*, not QString.

Note that there isn't a way to get the name of the currently calling function out of the box in Rust, but there are alternative solutions if you want that information.

Now that we have a context, we can send a message to the Qt logger. We can do this using the unfortunately undocumented qt_message_output function. This sends a message to the currently installed message handler.

Note that CXX-Qt currently doesn't have Rust bindings to install a custom one.

The default message handler goes to the standard output and error streams. This function takes a QtMsgType, the context we just created, and a QString message:

qt_message_output(  
    QtMsgType::QtInfoMsg,  
    &context,  
    &QString::from("This is an informational message..."),  
);

And voilà:

lib: This is an informational message...

But that looks pretty plain, and we can't see any of our context! Most information available in the Qt logger isn't shown by default, but we can modify it by using the QT_MESSAGE_PATTERN environment variable.

I used the comprehensive example given in the linked documentation, but it's useful for showcasing the context:

export QT_MESSAGE_PATTERN="[%{time yyyyMMdd h:mm:ss.zzz ttt} %{if-debug}D%{endif}%{if-info}I%{endif}%{if-warning}W%{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif}] %{file}:%{line} - %{message}"
[20250314 8:56:45.033 EDT I] main.rs:0 - This is an informational message...

Now that we have sent our first Qt log message from Rust, let's up the ante and integrate the tracing crate.

Integrating with Tracing

To redirect events from tracing, we have to add a subscriber that forwards events to Qt. This basically means anything that uses tracing (e.g. your application, another crate) will be picked up.

As a side effect of tracing's flexibility, we also have to create our own Visitor. This is necessary because tracing records structured data, and we need to flatten said data to a string.

use std::fmt::Write; // needed for write_fmt

struct StringVisitor<'a> {
    string: &'a mut String,
}

impl tracing::field::Visit for StringVisitor<'_> {
    fn record_debug(&mut self, field: &tracing::field::Field, value: &dyn std::fmt::Debug) {
        write!(self.string, "{} = {:?} ", field.name(), value).unwrap();
    }
}

And now for the custom layer that will catch the events, and send them to Qt:

pub struct QtSubscriber {}

impl<S> tracing_subscriber::Layer<S> for QtSubscriber
    where
        S: tracing::Subscriber,
{
    fn on_event(
        &self,
        event: &tracing::Event<'_>,
        _ctx: tracing_subscriber::layer::Context<'_, S>,
    ) {
        let mut buffer: String = String::new();
        let mut visitor = StringVisitor {
            string: &mut buffer
        };
        event.record(&mut visitor);

        let msg_type = match *event.metadata().level() {
            tracing::Level::ERROR => QtMsgType::QtCriticalMsg,
            tracing::Level::WARN => QtMsgType::QtWarningMsg,
            tracing::Level::INFO => QtMsgType::QtInfoMsg,
            tracing::Level::DEBUG => QtMsgType::QtDebugMsg,
            tracing::Level::TRACE => QtMsgType::QtDebugMsg
        };

        let file = if let Some(file) = event.metadata().file() {
            CString::new(file).unwrap()
        } else {
            CString::default()
        };

        let line = if let Some(line) = event.metadata().line() {
            line as i32
        } else {
            0
        };
        
        let function = CString::default();  
        let category = CString::new("lib").unwrap();  

        let context = QMessageLogContext::new(&file, line, &function, &category);  

        qt_message_output(msg_type, &context, &QString::from(buffer));
    }
}

And finally, we have to register our new layer with the registry:

use tracing_subscriber::layer::SubscriberExt; // needed for with
use tracing_subscriber::util::SubscriberInitExt; // needed for init

tracing_subscriber::registry().with(QtSubscriber{}).init();

Afterwards, try sending a message using tracing::info! and see if it works:

tracing::info!("This is an informational message... from tracing!")

Using a more comprehensive QT_MESSAGE_PATTERN, you should get a log message from Qt. Note that "message" is written here, as that's the default field in tracing:

[20250320 10:41:40.617 EDT I] examples/cargo_without_cmake/src/main.rs:104 - message = This is an informational message...

These new bindings in CXX-Qt should be useful to application developers who want to adopt the best logging crates in Rust, while ensuring their messages are forwarded to Qt. If you want to redirect Qt log messages to Rust, CXX-Qt doesn't have a way to install custom message handlers yet.

See our KDABLabs repository for complete examples of the snippets shown here.

The post Using the Qt Logger in Rust with CXX-Qt appeared first on KDAB.

The other day I finally replaced my trusty Thinkpad T480s I bought 6½ years ago. Overall, I was still pretty happy with it and even gave it a little refresh early last year (RAM upgrade, bigger SSD, new keyboard) but the CPU was really starting to show its age when compiling. I’m almost as picky as Nate when it comes to laptops but the P14s Gen 5 AMD (what a mouthful) checked more boxes than most laptops I looked at in recent years.

Plasma 6.5 Dev desktop, black panel and analog clock, wallpaper dark variant (darker hues of purple than the default). KInfoCenter window with light theme ontop, showing information about the device (e.g. KDE neon unstable edition, Qt 6.9.1, 64 GB of RAM, etc)
Breeze Twilight, for the OLED’s sake

The device shipped with Windows 11 and whenever I touch a Windows machine I’m baffled that people put up with this. I connected it to Wifi (beginner’s mistake apparently) since I wanted to install all firmware updates and salvage a couple of things from it before formatting the SSD (ICC profiles, Dolby audio presets, etc). The first run wizard asked me for my choice of locale, then went looking for updates. Once done, the system rebooted. After that it asked me to give the computer a name. Guess what? Another reboot, and more updates. And then the dreaded compulsory Microsoft account I had no intention of creating. You can open a terminal by pressing Shift+F10 but the old bypassnro trick just led to a reboot and it asking the same questions again. Just when I was about to give up, Bhushan showed me another trick how to create a local account. Indeed, after yet another reboot and clicking away like 10 individual nag screens about privacy and cloud stuff, I was able to log into the system.

This is the sort of usability nightmare and command line tinkering bullshit that people were mocking Linux users for back in the days! Compare that to my KDE neon “unstable” installation where I plugged in a USB stick (Secure Boot of course rejected “3rd party keys” by default), booted into the live system, had the entire drive formatted, and within 10 minutes or so ended up with a working sexy KDE Plasma setup. I’m still sometimes amazed how beautiful our default setup looks nowadays with the floating panel, frosted glass, and all. I don’t like dark mode but since that laptop has an OLED screen I opted for “Breeze Twilight” which combines light applications with a dark panel and wallpaper.

Screen configuration options:
Resolution: 2880 x 1800 (16:10)
Scale: 200%
Orientation: upright
Refresh rate: 120 Hz
Overscan: 0%
Color profile: ICC profile TPLCD_414B_Default.icm
I salvaged the color profiles from the factory Windows install

As with any new device, there’s a few surprises waiting for you. Like most recent laptops it has a stupid Copilot (“AI”) key. Unfortunately, rather than inventing a new key code, it emulates an actual key combination of Meta+Shift+Touchpad Off (F23 I heard, yes, there can be more than just F12). This makes it difficult to just remap the key to something useful (like a right Meta key). However, at least you should be able to use it as a global shortcut, right? Unfortunately, you weren’t able to assign it from GUI. I now fixed the Copilot key by allowing Shift be used in a shortcut in conjunction with “Touchpad Off”. It’s a kludge but at least you can now make it bring up KRunner or something.

Speaking of proprietary keys, it also has a “Phone Link” function key. It is recognized as such starting from Linux kernel 6.14 but there’s no support in Xkb or Qt yet. I just sent a pull request to libxkbcommon to add it and once that lands, I’ll look into adding it to Qt. How cool would it be if under Plasma the Phone Link button would instead open KDE Connect?!

The suspend-to-idle stuff is both a great opportunity and a little scary. Modern laptops don’t do “proper” S3 suspend anymore but only S2 which works more like on a smartphone where it can wake up anytime and fast. Right now even plugging in the charger or touching the touchpad causes the machine to wake up. Luckily, if KWin detects the lid is shut and no monitor is connected, it sleeps again after a short time to prevent a hot backpack situation. Work is ongoing to make better use of this capability, to detect what caused the system to wake up. For example, when plugging in the charger, we might want to wake up, play a short animation and the “plugged in” sound and go back to sleep.

I can still return the device within the 14 day period if something major crops up but I already fell in love with its 120 Hz OLED 16:10 display (I luckily don’t seem to be sensitive to the 240 Hz PWM it uses), so I don’t think I’ll be returning it :-)

Friday, 8 August 2025

KDE today announces the release of KDE Frameworks 6.17.0.

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

New in this version

Attica
  • It compiles fine without qt 6.10 deprecated methods. Commit.
Baloo
  • Fix build with clang. Commit.
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • [TermGenerator] Check input text validity. Commit. Fixes bug #506187. See bug #506570
  • Update clang-format CI image to suse-qt610. Commit.
  • [Extractor] Handle parent exit during batch. Commit.
  • [ExtractorProcess] Test extractor exit when parent quits. Commit.
  • [ExtractorProcess] Extend tests, align better with extractor code. Commit.
  • [ExtractorProcess] Fix deprecated implicit capture of this. Commit.
Bluez Qt
  • It compiles fine without qt 6.10 deprecated methods. Commit.
Extra CMake Modules
  • ECMSetupVersion: Adapt to the removal of CMP0048 with cmake 4.0. Commit. Fixes bug #504518
  • KDEGitCommitHooks: Do not ignore clang format return code. Commit.
  • Fix CI. Commit.
  • KDEGitCommitHooks: Allow custom user scripts in pre-commit.d directory. Commit.
Framework Integration
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
KArchive
  • It compiles fine without qt 6.10 deprecated methods. Commit.
  • Autotests/CMakeLists.txt the function is called for multiple extensions. Commit.
KAuth
  • It compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KBookmarks
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KCalendarCore
  • Update recurrenceId when dtStart changes. Commit.
  • Src/icalformat_p.cpp - compile multivalue parameter support in libical4. Commit.
KCMUtils
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
  • Fix documentation syntax. Commit.
KCodecs
  • [KEncodingProberTest] Add more test cases for UTF-16. Commit.
  • [KEncodingProber] Remove bogus global static state from UTF-16 probing. Commit.
  • [KEncodingProberTest] Document UTF-16 BOM probing is broken. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
  • [KEncodingProber] Fix typo from automatic mass edit. Commit.
  • [KEncodingProber] Remove unused member variables. Commit.
  • [KEncodingProber] Remove unused, private SetOp(t)ion method from probers. Commit.
  • [KEncodingProberTest] Make probertest data driven. Commit.
  • [KEncodingProberTest] Embed small binary data test case. Commit.
  • [KEncodingProberTest] Remove unnecessary static variable, setup code. Commit.
  • [KEncodingProberTest] Move class declaration to implementation file. Commit.
KColorScheme
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KCompletion
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KConfigWidgets
  • Draw text between shortcut keys with normal/highlighted text color. Commit.
  • Use highlight text color and omit custom text coloring for selected item. Commit.
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KContacts
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KCoreAddons
  • Require less precise timing in kformattest. Commit.
  • Fix crash/stack overflow on drive removal on Windows. Commit. Fixes bug #499865
  • QStaticPlugin is a struct, no class. Commit.
  • Widen the intervals. Commit.
  • Fix jobtest on Windows. Commit.
  • Fix reading of localized JSON values on Windows (and macOS). Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
  • [kpluginmetadata] Tweak docs. Commit.
  • Fix since version. Commit.
KCrash
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KDav
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KDBusAddons
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KDeclarative
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KDE Daemon
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KDE SU
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KDNSSD
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KDocTools
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KFileMetaData
  • [UserMetaDataWriterTest] Handle filesystem differences in XAttr size limits. Commit.
  • [EPubExtractorTest] Fix unspecified timezone handling. Commit.
  • [EPubExtractorTest] Move test class declaration to implementation file. Commit.
  • [EPubExtractor] Work around an unhandled error case in libepub. Commit.
  • [PpubExtractor] Fix memory leak in error case. Commit.
  • Move poppler include from header file to source file in popplerextractor. Commit.
  • Include qmobipocket_version.h in mobiextractor. Commit.
  • Remove unused HAVE_AVSTREAM_CODECPAR macro and unused includes in ffmpegextractor. Commit.
  • Remove unused includes in embeddedimagedata.cpp. Commit.
  • EPubExtractor: Fix memory leak. Commit.
  • [PlaintextExtractor] Verify decoded text contains printable characters. Commit. Fixes bug #506570
  • [PlaintextExtractor] Only add "Text" type if decoding suceeds. Commit.
  • [PlaintextExtractor] Fix various issues with UTF-16. Commit. See bug #506187
  • [PlaintextExtractor] Add tests for UTF-16 BE and LE with BOM. Commit.
  • [PlainTextExtractor] Lower required confidence for UTF-8. Commit.
KGlobalAccel
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
  • Allow global shortcuts to distinguish between key press and key repeat, and to ignore the latter. Commit.
KGuiAddons
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KHolidays
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KI18n
  • Mention %2 in both of the msgctxt of the "fake frech" translation. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KIconThemes
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KIdletime
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KImageformats
  • IFF: add support for uncompressed ACBM type. Commit.
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • Fix CI. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
  • IFF: add mime types and extensions. Commit.
  • Chunks.cpp - send info and warning messages to the iff logging category. Commit.
  • IFF: support for Ham8, HalfBride, Pbm and ILBM 32-bits modes. Commit.
  • Tga: Be less strict about palette. Commit.
  • Fix unused param in MicroExif::toByteArray(). Commit.
  • IFF: Fix possible stack overflow. Commit.
KIO
  • KFileItemDelegate: Create regular pixmal already with devicePixelRatio. Commit.
  • Ksambashare: correct path validation logic in isPathValid. Commit.
  • [kfileitemactions] Use SingleShot connection for activation token. Commit.
  • KCoreDirLister: Do not list files again if the new url has same job. Commit. Fixes bug #507278. See bug #451050. See bug #507185
  • Worker: add ability to inject mock workers. Commit.
  • Widgets: Add redo support to FileUndoManager. Commit. See bug #451746
  • Guard #include. Commit.
  • Xdg-activation for opening files in other apps. Commit.
  • Correctly use OpenURI protocol in a sandbox. Commit.
  • Kfilewidgettest_saving_gui: add commandline options. Commit.
  • DnD: support possibleActions() coming from the drop event. Commit. Fixes bug #505247
  • [previewjob] Use KPluginMetaData to list standard thumbnailers directly. Commit.
  • Use QFile::exists, tempFile.exists fails on FreeBSD. Commit.
  • Don't use FICLONE in special slow test path. Commit.
  • Remove FreeBSD workaround in KFileItemTest. Commit.
  • [knewfilemenu] Fix checking for home dir. Commit.
  • Don't use /tmp in KDirListerTest. Commit.
  • [previewjob] Refactor SHM code. Commit.
  • [kurifiltertest] Skip test case when necessary user is missing. Commit.
  • [previewjob] Create SHM buffer with correct size. Commit.
  • [previewjob] Drop unused m_shmSize member. Commit.
  • KUrlNavigator: Set fixed width size policy on badge container. Commit. Fixes bug #501667
  • KFileItemActions: Don't show hidden services on Open With menu. Commit.
  • Kfilewidgettest: reduce wait time. Commit.
  • KNewFileMenu: Add placeholder text. Commit.
  • GUI/KTerminalLauncherJob: additional Public Function for checking avaibility. Commit.
  • [previewjob] Remember standard thumbnailer exec in metadata. Commit.
  • [previewjob] Fix container detaching. Commit.
  • [previewjob] Use list instead of map. Commit.
  • [previewjob] Better set Id in standard plugin metadata. Commit.
  • [previewjob] Use completeBaseName for standard thumbnailer id. Commit.
  • [previewjob] Reduce variable scope. Commit.
  • [previewjob] Add missing const. Commit.
  • [previewjob] Use readXdgListEntry. Commit.
  • [previewjob] Use simpler KConfig for standard thumbnailer files. Commit.
  • Special case for some protocols that we know are local. Commit. Fixes bug #506772
  • Remove reference to KMimeTypeResolver from the doc. Commit.
  • [previewjob] Set image DPR for non-SHM path too. Commit.
  • [previewjob] Always read metadata entries from datastream. Commit.
  • Hide the separator between checksums and feedback if feedback is hidden. Commit.
  • Don't automatically calculate checksums for small files. Commit.
  • Fix overflowing text in checksums feedback label. Commit.
  • Support comparing checksums for multiple files. Commit.
  • Automatically verify checksum found in clipboard. Commit.
  • Automatically calculate checksums for smallish files. Commit.
  • Allow desktop files in checksums plugin. Commit.
  • [previewjob] Simplify if checks. Commit.
  • [previewjob] Read config where it's used. Commit.
  • Kpropertiesdesktopbase: Make string case consistent. Commit.
  • Kpropertiesdesktopbase: Use 'Generic name' instead of 'Description'. Commit.
  • DropJob: Emit popupMenuAboutToShow after setting things up. Commit. Fixes bug #506188
  • Change the previewJob private statemachine into chain of jobs. Commit.
  • KDirOperator: Make "newest first" the default kind of date sorting. Commit. Implements feature #500512
  • KDirOperator: stop blocking treeview signals. Commit.
Kirigami
  • SearchDialog: documentation: use correct KSortFilterProxyModel property. Commit.
  • Fix some warnings. Commit.
  • SelectableLabel: show tooltip when hovering over a web link. Commit.
  • SelectableLabel: remove no-longer-needed workaround for Qt bug. Commit.
  • Move templates in own import. Commit.
  • Make IconPropertiesGroup public. Commit.
  • [formlayout] Set accessible label relationship. Commit.
  • Fix AboutItem using non-existant API from KAboutData. Commit.
  • NavigationTabButton: Use extended border for active focus. Commit.
  • Fix warnings, don't call null objects. Commit.
  • PageRow: remove hardcoded one pixel border. Commit.
  • PageRow: fix visible loop caused by previous commit. Commit.
  • PageRow: proper sidebarControl visibility condition. Commit.
  • Treat elapsed as a positive value and avoid animating instantaneous changes. Commit.
  • Access the proper overlay object. Commit.
  • PageRow: proper width for sidebar background. Commit.
  • FormLayout: fix a couple of warnings. Commit.
  • Fix test. Commit.
  • Immediately relayout after creating FormLayout / adding elements to it. Commit. Fixes bug #410352
  • OverlayDrawer: Supports Mouse resize. Commit.
  • Reapply "Move notifications on top of the Overlay layer". Commit.
  • Fix SoftwareRectangleNode creating QSGImageNode's without texture. Commit. Fixes bug #506991
  • LinkButton/UrlButton: massage docs. Commit.
  • Always show the back button on layer. Commit.
  • Global toolbar: don't resize the toolbar during slide on single column mode. Commit.
  • PageRow: fix gap in the sidebar. Commit.
  • AboutItem/LinkButton/UrlButton: fix mouse area extending beyond visible contents. Commit.
  • ApplicationHeader: fix content sizing. Commit.
  • PageRow: replace layout with anchors. Commit.
  • Don't show just the disabled back button on first page. Commit.
  • Adress comment. Commit.
  • Fix header layout on applicationsHeaders used in drawers. Commit.
  • Reapply "AbstractApplicationHeader: fix show/hide animations". Commit.
  • Fix toolbar spacing for menu mode drawers. Commit.
  • Global toolbar refactor: navigation buttons. Commit.
  • ToolBarLayout: Don't show every delegate as they are being loaded in. Commit.
  • Dialog: hide in-window title component when dialog is Window type. Commit.
  • Dialog: remove corners and border when popup is Window type. Commit.
  • SearchDialog: Remove header injected by style. Commit.
  • ColumnView: correctly hide the separator when touches the border. Commit.
  • ColumnView: fix pinned pages. Commit.
KItemModels
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KItemViews
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KJobWidgets
  • Deprecated KUiServerJobTracker in favor of KUiServerV2JobTracker. Commit.
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KNewStuff
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KNotifications
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KNotifyConfig
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KPackage
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
  • Follow symlinks for distros like NixOS. Commit.
KParts
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KPeople
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
KPlotting
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KPTY
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KQuickCharts
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KRunner
  • Add support for XDG Activation in DBusRunner. Commit.
  • Save LaunchCounts immediately on launch if there were any matches. Commit. Fixes bug #500972
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KService
  • Add mode to dump all services to findservice. Commit.
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
  • Follow symlinks for distros like NixOS. Commit.
KStatusNotifieritem
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KSVG
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KTextEditor
  • Correct redo cursor position for UTF-8 text recovery. Commit.
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • Draw all text background ourselves instead of just selection. Commit. Fixes bug #507053
  • Allow skipping selection when layouting the line. Commit.
  • Properly center the screenshot pixmap. Commit. Fixes bug #506909
KTextTemplate
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KTextWidgets
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KUnitConversion
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KWallet
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KWidgetsAddons
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KWindowSystem
  • It compiles fine without qt 6.10 deprecated methods. Commit.
KXMLGUI
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
Modem Manager Qt
  • It compiles fine without qt 6.10 deprecated methods. Commit.
Network Manager Qt
  • It compiles fine without qt 6.10 deprecated methods. Commit.
  • Correct IpTunnelSetting Vti6 enum value. Commit.
Prison
  • It compiles fine without qt 6.10 deprecated methods. Commit.
Purpose
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
QQC2 Desktop Style
  • DialogButtonBox comes from QQC2 so it needs to be qualified. Commit.
  • Label: remove workaround for Qt bug. Commit.
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
  • PlasmaDesktopTheme performance: Avoid an unique connection. Commit.
  • Reduce event listeners in KQuickStyleItem. Commit.
Solid
  • Search mount and Co. in the normal user environment PATH. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
  • Add a IS_NOT predicate operator. Commit.
  • Revert "handle ZFS in fstab backend as udisk2 has no support". Commit.
Sonnet
  • It compiles fine without qt 6.10 deprecated methods. Commit.
Syndication
  • Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
Syntax Highlighting
  • Add Expect syntax highlighting. Commit. Implements feature #474323
  • Tcl: fix variable and escaping char ; add new highlighting for symbols and control flow keyword. Commit.
  • Breeze Dark theme: changes the color of BuiltIn to be distinguishable from Comment. Commit. Fixes bug #458498
  • Bash: add new substitution commands from version 5.3: ${|cmd;} and ${ cmd;}. Commit.
  • Add WebVTT syntax highlighting. Commit.
  • Agda: add opaque and unfolding keywords. Commit.
  • It compiles fine without qt 6.10 deprecated methods. Commit.
  • Avoid compile warning. Commit.
  • Lua: when strings are not closed, mark only the start of the following line as an error. Commit.
  • Lua: add new function and keyword of version 5.5. Commit.
  • PERL: bracket pattern allows any character as a replacement separator. Commit.
  • PERL: add regex modifier: p, a, d, l, u and n. Commit.
  • Add JSON5 highlighting. Commit. Implements feature #481038
  • JSON: add Number, String and Constant as top level value. Commit.
  • Add JSONC (JSON with Comments) highlighting. Commit. Implements feature #481038
  • Add NDJSON files and GeoJSON mimetype to JSON highlighting. Commit.
  • Add NFTables syntax. Commit. Implements feature #415671
  • Indexer: remove check for duplicated keywords, but generate a compressed file without duplication. Commit.
  • Add a dispatcher syntax for .log file. Commit.
  • Add LaTeX Log File syntax. Commit. Implements feature #248930
  • Document SyntaxHighlighter. Commit.
  • Add XHTML. Commit.
  • HTML generator: do not insert FindPHP and Twig/Twig rules when the context name starts with 'Find'. Commit.
  • HTML: fix comment format, Escapable raw text elements and others. Commit.
  • XML: add test for CDATA and invalid attribute in closing tag. Commit.
Threadweaver
  • It compiles fine without qt 6.10 deprecated methods. Commit.

Thursday, 7 August 2025

During all my time with KDE projects, I've never made an app from scratch.. Except now.

Today my first KDE app ever, KomoDo, was released on Flathub!

Screenshot of the KomoDo todo.txt application

It's a simple todo application for todo.txt format and parses todo.txt files into a list of cards. One task is one card.

The application has help sections for any of the rules todo.txt format follows, but you can use as many or as little of them as you want.

I wanted to go through in this blogpost about the process, or what I remember of it anyway. I've always just fixed bugs in Plasma or Frameworks or even in apps like Dolphin, but never made anything from scratch. So I thought that writing this down might be helpful for someone in similar position.

As with any KDE project, it's open source and the repository can be explored right here: utilities/komodo.

Starting up

Starting a Qt project using KDE libraries, especially QtQuick, is not that difficult in the end. KDE has really good documentation for starting up. I mostly followed this guide to get started: https://develop.kde.org/docs/getting-started/kirigami/setup-cpp/

There is also guides for Python and Rust if you wish to use those instead of C++.

I also highly recommend using kde-builder for building and running the applications. It makes things so much easier.

Other than that, there's not much to tell about the setup.

The project itself

Working on the application was not that bad either. I've worked on various C++ and QML files during my work on KDE software, so I had easy time getting into the flow.

I think the most difficult part for me was the CMake files: I couldn't really understand them or what they do, I mostly followed what other projects did and replicated them.

This of course caused me to do unnecessary things, like installing libraries I made for the app: TodoModel which the QML code uses to parse the todo.txt file and generate the view was accidentally installed among the system libraries, which was not ideal, since I'm not building a framework.

Luckily with tons of help and reviews from my friends in the KDE fam, we got CMake to build things nicely. Then with kde-builder the feedback loop of code->build->test was fast enough, especially in small app like this, that I could iterate on the application in a good pace.

I also had a lot of help from a friend with the CI and sysadmin stuff. That side of development is very confusing to me so I'm glad with the help. I dunno if you want to be named so I didn't, but you know who you are: Big thanks. :)

TodoModel

Since Qt is reliant on the model-view system, I had to make a "model" that parses the todo.txt file and spits out Todo objects, which can then be parsed by the QML code, which is the frontend code.

If you have never worked on model-view systems, it can take some time to understand. To me, the model-view as words was always a bit confusing: I would have understood it better if it was worded something like data-ui. But tech jargon has always been my weakest point.

The parsing is done by a RegExp nightmare I concocted with help of stack-overflow and tears.

Here it is, in its nightmarish glory, enjoy the nightmare fuel:

QStringLiteral("(?:^[ "
	"\\t]*(?P<Completion>x))|(?P<Priority>\\([A-Z]\\))|(?:(?P<FirstDate>"
	"\\d{4}-\\d\\d-\\d\\d)[ "
	"\\t]*(?P<SecondDate>\\d{4}-\\d\\d-\\d\\d)?)|(?P<Projects>\\B\\+[\\w\\d\\S]+)|(?P<"
	"Contexts>(?<=\\s)@[^\\s]+)|(?P<KeyValuePairs>[a-zA-Z]+:[\\S]*)");

Yyyeah. It's.. Something.

Testing

Due to the nightmare fuel that RegExp can be, I decided that unit testing would be great addition. So I fought with CMake a bit and then made myself a proper parser testing file.

Thankfully Qt has nice QTest library that can be used to create tests. They can be hard to parse at first, but when you understand how they work, they're really quick and easy to work with.

Testing saved my rear a few times during this project, especially when modifying anything parser related.

Look and feel

When the model worked fine, I started concentrating more on the look and feel of the app.

The application went through various phases: At first, everything was done through a dialog, except viewing the cards. It was kind of distracting that every time you wanted to modify or make new task, the application would pop things up.

Over time though, I think I got it into a good spot: Most actions can be done in the task list, but when user wants to delete a task, the app asks the user first if they are sure about it.

Then there is help menu and quick info for syntax related things.

Otherwise there's really no settings: I did not want to add any settings if I could avoid it. The only setting the app saves to config file is the file you opened last time.

I also consulted the KDE Human Interface Guidelines (HIG) few times, but it was never "in the way." It just helped me to make decisions sometimes when I wasn't sure what to do with the design.

Also my lovely wife @tecsiederp made the application the most adorable icon ever.

Cute green lizard holding a todo sign

Look at it. Just a lil guy.

Also, if you don't get your tasks done, he will get sad. So you better do those tasks!

It just makes me so happy and motivated to work on my tasks when I see this lil guy in my taskbar. :D

The icons however have to follow our guidelines, also mentioned in the HIG. Luckily my wife is good with SVG files, and if she wasn't I already had two people wanting to help me with it, which I very much appreciated. If I had to make an icon myself, it would.. Not be good. :P

Something I mostly struggled with though was getting a nice syntax highlighting for the task text. I wanted to use our KSyntaxHighlighting library, but it would not match all colorschemes: Users may use their own or third party colorscheme for the app, but the syntax highlighter does not have a colorscheme that matches it.. So it would look bit odd.

So I made my own simple one that appends some color tags to the string, and the QML engine does the rest. The text can have HTML tags like <span> in it which QML can parse automagically.

I think the app turned out to look pretty good. It also supports keyboard navigation for getting around the app. (Though there might be some bugs with it still.)

Releasing the app

KDE has documentation for the release process, so I just followed it to the letter. During the release process, I have to wait for at least 2 weeks for people to give me reviews, and so they did. And then I fixed things. And some more.

Eventually the app was good to go (though it was never directly told me, it was just implicitly agreed), and I followed the last bits of relese process, setting up signing keys and such.

And now it exists as a tarball here, so any interested distros can go grab it: https://download.kde.org/stable/komodo/1.0.0/

I also recommend this patch to go with it, to make sure it doesn't install the static libraries in the system: https://invent.kde.org/utilities/komodo/-/commit/57c6fa82719155bd32cb35b4c64cddae956c53e0

With Flathub, the submission process was rather painless in my opinion. I followed their requirements and submission documentation and it all just clicked together. Eventually someone was reviewing my PR and then.. The app is in Flathub. I had to make a patch for Flathub specifically, but it was also really painless so I didn't mind.

What it all mostly took from me is time. Otherwise it was just nice and easy.

More apps?

So at least in my experience, the whole process was rather easy. I didn't want to go into nitty gritty details too much.. Because I don't remember everything + you can see the source code + the process itself happens in the open.

I'm definitely interested in making more KDE apps, but also I have my game project(s).

And I really want to get back into gamedev. Like spend much more time into it.

At least now I have a todo app which fits my needs to keep track of the gamedev projects. :)

Thanks for reading! And if you're looking for new todo application, give KomoDo a try! :)

We've been steadily improving the vector graphics support in Qt Quick in the past few years, and this continues in Qt 6.10 with several new and useful features. The main focus of this blog will be the support for animated vector graphics, added to the existing components in Qt 6.

Wednesday, 6 August 2025

Qt Tools for Android Studio version 4.1 is out! It can be downloaded from the JetBrains marketplace