Skip to content

Sunday, 5 October 2025

We are back!

"This Week in KDE Apps" is back! It's been a long time since the last issue, but every week, we cover as much as possible of what's happening in the world of KDE apps.

Getting back to all that's new in the KDE App scene, let's dig in!

KDE PIM

Merkuro Mail Read and write emails

Yuki Joou improved the handling of sender information in the mail viewer header (25.12.0 - link). She also fixed the mail composer not showing the right sender address (25.12.0 - link).

Merkuro Calendar Manage your tasks and events with speed and ease

Yuki also worked on Merkuro Calendar and fixed adding sub-items to tasks (25.12.0 - link), added a menu button to show/hide all calendars from an account (25.12.0 - link), and made sure we are only showing one refresh button in the account context menu (25.12.0 - link)

Supporting PIM libraries

Volker Krause made some more parts of the KMime API const correct and adapted various parts of the PIM codebase to that.

Allen Winter made Akonadi prefer MariaDB to MySQL when both are available (25.12.0 - link).

Multimedia Applications

Okular View and annotate documents

Volker Krause added some of the missing icons on Android (25.12.0 - link).

Photos Image Gallery

Marco Martin optimized starting Photos when opening it with a specific image (25.12.0 - link).

Games Applications

KRetro Libretro emulation frontend for Plasma

Seshan Ravikumar released a first alpha release for KRetro, a new game emulator based on libretro. You can read his announcement here

Chat Applications

NeoChat Chat on Matrix

Joshua Goins fixed room succession not actually working (25.08.4 - link).

Arno Rehn fixed the handling of encrypted polls and pinned messages (25.12.0 - link).

Browsers

Falkon Web Browser

Juraj Oravec added a "Dis/Enable Adblock" button to the adblock context menu (25.12.0 - link).

Konqueror KDE File Manager & Web Browser

Stefano Crocco fixed some issues with the searchbar (25.12.0 - link)

System Applications

Dolphin Manage your files

Kostiantyn Korchuhanov added the ability to hide files and folders from the Dolphin content menu. (25.12.0 - link)

Akseli Lahtinen added a separator to the navigator when it's used outside of the menubar. (25.12.0 - link)

Jean-Baptiste Mardelle fixed a bug where the video preview panel was crashing Dolphin when a video file was selected in some cases. (25.08.3 - link)

Journald Browser Browser for journald databases

Andreas Cord-Landwehr fixed case-sensitive search not being applied when navigating between highlighted matches. (link)

Help Center Browse and search documentation

Carl Schwan (me) changed the name used in Discover and apps.kde.org to Help Center instead of the old internal name: KHelpCenter. (25.12.0 - link)

Travel Applications

KDE Itinerary Digital travel assistant

Jonah Brüchert fixed some performance issues when showing the search results for a train/bus connection. (link 1, link 2 and link 3)

Carl Schwan (me) moved the licensing information about the components used in Itinerary to use standard KAboutComponent infrastructure. (link)

Saturday, 4 October 2025

In 2016, after being a Mac guy for 23 years, I took the plunge and made a full-time switch to Linux. I did my research, and over and over again encountered the idea that GNOME was good for MacOS refugees like myself. So I gave it a try!

But my experience didn’t support the meme. I think a lot of people make this assertion without really having a deep understanding of the MacOS user experience, or the actual positive qualities of the software, because I don’t think GNOME offers a particularly Mac-like experience at all.

Don’t get me wrong, I think GNOME shell is pretty good, and largely succeeds at doing what it sets out to do. But that thing does not appear to be “offer an experience that’s a lot like MacOS.”

I still see this mentioned on forums and YouTube videos today. I don’t think it’s helpful, and today I want to provide a bit of context from my perspective.

So let’s compare MacOS and GNOME! Right away we see some obvious differences:

MacOS image from https://betawiki.net/wiki/File:25A354-Desktop.png; GNOME 49 image screenshotted by me

Dock

One of the the two major anchoring user interface (UI) elements on MacOS is the dock. It’s an app launcher and switcher, an unread count notifier, a place for minimized windows to go, a quick shortcut to the trash, downloads folder, and any other files or folders you put on it.

GNOME doesn’t have this. Its anchoring UI element is the Activities Overview screen, which contains a small program launcher, but the whole thing is hidden by default, meaning it can’t be easily used for monitoring unread counts or switching between apps. It’s also not customizable at all, while the MacOS dock is extensively customizable. It’s just a very different experience.

Global menubar and app functionality

The other major anchoring UI element is the global menu. Every Mac app exports a global menu structure, including the desktop itself. This allows Mac apps to be visually simple, because all the powerful features are hidden away in the menu structure.

GNOME has a top bar, but there’s no global menu on it. And while GNOME apps do generally have a level of visual simplicity that’s similar to Mac apps, they’re usually more limited in functionality, and they don’t export menu structures full of extra features.

Desktop icons

On MacOS, you can put files and folders on the desktop, and use it for managing frequently or recently used files. Internal and removable drives appear there, too.

GNOME doesn’t have this. The desktop is just a picture; you can’t use it for anything functional.

Window minimize/maximize buttons

On MacOS, if you need to get a window out of your way, you minimize it, just like you do on Windows, Plasma, etc. It flies into the dock and it’s clear how you get it back. You can also maximize a window from another button on the titlebar, and it goes into another.

GNOME apps have neither of these buttons. As a result, it’s not clear how to get a window out of the way or make it bigger without a lot of manual work. You can add those buttons later using the separate Tweaks app, but it’s clear that the system was not designed for it.

At-a-glance app status monitoring

MacOS includes a classic “System Tray” style UI on the top bar holding the global menu. Here apps can put little icons that communicate their state while running but without any visible windows. The MacOS dock also displays unread counts and progress information for running apps.

GNOME doesn’t have these features, either at all, or in a way that’s always visible. Instead, it relies on apps sending notifications about changes to their status.

Configurability

Contrary to popular belief, MacOS is surprisingly rich in personalization options. You can customize the widgets on the desktop or notification center, the text size, highlight colors, sidebar icon sizes, places panel items, screensaver, scrollbar appearance and behavior, lock screen message, menubar positioning, UI alert sound, almost everything about the dock, and so on.

GNOME’s approach to configuration is much more minimal, and the officially-supported options are pretty sparse. Instead, mostly the way you personalize the system is by using Extensions, which can do much more than you can in MacOS, but also offer no long-term compatibility guarantee, so there’s a chance any of the extensions will break with every new release.

So where does the bridge from MacOS lead?

Again, I think GNOME is pretty good… it just doesn’t offer a MacOS-like experience. What it does offer is a near-zero distraction experience. That’s the design goal, and it succeeds. But it’s not MacOS’s design goal.

So if not GNOME, where’s the more MacOS-like experience for refugees? Honestly, KDE Plasma is what I would recommend. It’s where this MacOS refugee ended up, at least. Let’s compare again, but this time with KDE Plasma:

MacOS image from https://betawiki.net/wiki/File:25A354-Desktop.png; Plasma 6.4 image screenshotted by me

Like MacOS, Plasma has a dock-style panel. Despite a few visual differences, it handles the same things: launching apps, switching between apps, seeing apps’ unread counts, and holding minimized windows. This panel also contains the System Tray UI. It’s here rather than on a top panel, but it’s a small difference.

Though neither screenshot shows files on the desktop, both support it. Similarly, both support desktop widgets for building highly personalized workflows.

You can also minimize and maximize windows in Plasma just like you can on MacOS.

And finally, you can personalize a Plasma system in a wide variety of ways — as much or more than you can can on MacOS, in most cases — and all in a 1st-party supported way. There are also GNOME-style extensions available for people who want even more, but these make use of a stable API that only changes about once every 10 years, so compatibility issues are much rarer.

There are still differences, of course: major ones are Plasma’s Windows-start-menu-style Kickoff Application Launcher and the lack of a global menu. But Kickoff can be swapped out for something else or removed, and the Global Menu is actually a fully-supported 1st-party feature, simply being off by default. If this is a part of MacOS that you really like, turning it on is very easy:

Other smaller differences include disks not appearing on the desktop, and maximized windows not going into new virtual desktops.

But in my opinion and experience, these differences are relatively minor, and I don’t think it’s worth chasing the dream of a 100% pixel-for-pixel clone of MacOS on Linux. Rather, I think it’s best to take the most successful parts and ditch the sources of awkwardness. And in my opinion, KDE Plasma fits the bill.

So if you’re leaving MacOS because you found it too distracting, then I think GNOME may be a good option. But if you’re leaving for other reasons, give Plasma a try!

I’m delighted to announce the new 6.1.0 release of KPhotoAlbum, the photo management software for KDE/Linux!

This is the first new release of our new KF6/Qt6 port, and it brings some fine-tuning, but we could also bring forward the code apart from bugfixes. here's the ChangeLog:

Added
  • Add command line option --config
  • Add command line option --save-and-quit
  • Add home and end key shortcuts to date bar
  • Add option to append description text when changing multiple image descriptions (#470433)
  • Show visual feedback when setting a rating in the viewer (#509964)
Changed
  • index.xml file format version bumped to “11”: The new file format version improves the “compressed” file format and handles arbitrary category names correctly. Positionable tags are also now stored natively in the “compressed” file format with far less overhead.
  • Disable “View” actions when not appropriate (#505185)
Fixed
  • Fix purpose plugin support (#501885)
  • Fix database corruption when using category names starting with numbers (#477533)
  • Improve responsiveness of date bar
  • Fix spurious entries in “Search for images and videos with incomplete dates” (#505023)
  • Fix crash when interacting with a category after deleting it (#478015)

Thanks everbody!

According to git log, the following individuals contributed commits to the new version (in alphabetical order):

  • Albert Astals Cid
  • Yuri Chornoivan
  • Carlos De Maine
  • Nicolas Fella
  • Balló György
  • Willem Hobers
  • Tobias Leupold
  • Randall Rude
  • Yaron Shahrabani
  • Johannes Zarl-Zierl
  • Justin Zobel

Thank you very much for putting your time and energy in our beloved project :-)

— Tobias

Friday, 3 October 2025

KWin GameController Plugin: Weeks 5-6

It's been another few weeks of progress on the KWin GameController Plugin and I've got a lot to share! After spending the previous weeks setting up the foundation, I've progressed things forward by improving the logic a bit more, creating a few integration tests, integrating it into System Settings, and making sure it runs well on real hardware like the steamdeck.

The primary change was splitting up GameController into two classes. The new one being GenericInputDevice which lives in emulatedInputDevice.{cpp/h}. This allowed me to separate the GameController logic responsible for emulating keyboard and mouse into it's own separate class. Now GameController wrapper class is just responsible for monitoring controller input, resetting idle timer on user activity, and logging.

GenericInputDevice

GenericInputDevice is a class that inherits from InputDevice and is used to emulated Keyboard/Mouse in order to send those inputs through KWins input pipeline. The input_events come from GameController and get processed exactly like they were previously. Each GameController has access to an instance of GenericInputDevice to make its own calls. In the near future I plan on creating a static instance of this class for all GameController to access.

// Inside Gamecontroller construct
 m_inputdevice = std::make_unique<EmulatedInputDevice>();
 KWin::input()->addInputDevice(m_inputdevice.get());

..

// GameController Event Handling Function
void GameController::handleEvdevEvent()
{
 input_event ev;
 for (;;) {
 const int rc = libevdev_next_event(m_evdev.get(), LIBEVDEV_READ_FLAG_NORMAL, &ev);
 if (rc == 0) {
 logEvent(&ev);

 input()->simulateUserActivity();

 if (m_usageCount == 0 || isTestEnvironment)
 m_inputdevice->emulateInputDevice(ev);

.. 

// EmulatedInputDevice
void EmulatedInputDevice::emulateInputDevice(const input_event &ev)
{
 m_ev = ev;
 if (ev.type == EV_KEY) {
 qCDebug(KWIN_GAMECONTROLLER) << "Face button pressed: Simulating User Activity";
 evkeyMapping();
 } else if (m_ev.type == EV_ABS) {
 qCDebug(KWIN_GAMECONTROLLER) << "Analog buttons pressed: Simulating User Activity";
 evabsMapping();
 }
}

void EmulatedInputDevice::evkeyMapping()
{
 bool state = m_ev.value ? true : false;
 std::chrono::microseconds time = std::chrono::seconds(m_ev.time.tv_sec) + std::chrono::microseconds(m_ev.time.tv_usec);

 switch (m_ev.code) {
 case BTN_SOUTH: // A button → Enter
 sendKeySequence(QKeySequence(Qt::Key_Return), state, time);
 break;
 case BTN_EAST: // B button → Escape
 sendKeySequence(QKeySequence(Qt::Key_Escape), state, time);
 break;
 case BTN_NORTH: // X button → Virtual Keyboard
 // TO-DO toggle Virtual Keyboard not working on my distro ( Kubuntu )
 EmulatedInputDevice::toggleVirtualKeyboard(QStringLiteral("forceActivate"));
 case BTN_WEST: // Y button → Space
 sendKeySequence(QKeySequence(Qt::Key_Space), state, time);
 break;
 case BTN_TL: // L button → Ctrl
 sendKeySequence(QKeySequence(Qt::Key_Control), state, time);
 break;
 case BTN_TR: // R button → Alt
 sendKeySequence(QKeySequence(Qt::Key_Alt), state, time);
 break;
 case BTN_START: // START button → Meta
 sendKeySequence(QKeySequence(Qt::Key_Meta), state, time);
 break;
 case BTN_SELECT: // SELECT
 break;
 // Add more button mappings here as needed
 default:
 break;
 }
}

..

Integration Test: Qt Test

Part of the requirements for proposing significant contributions to KWin is creating integration test. This provides some assurance that things, like core functionality of the plugin, won't break so easily in the future as new code gets added. For testing KWin, uses the Qt Test Framework. Learning how to use the framework to create my own tests has been fairly simple and straightforward. Still, what exactly to test, and how to test it, was not so straightforward.

I learned along the way that I'd be creating integration tests, instead of unit tests. The tests don't reference the plugins directly; instead, they test the effect of the plugins on the system overall. That meant that things which required an instance of the plugin to test were not possible in this case. That included testing hotplug capability, or the number of applications that the plugin thinks have opened an input device. Thankfully there were few very important functionalities that could be tested!

Those include:

// Test system idle time reset. Prevents suspend
void testResetIdleTime();

// Test Controller To Keyboard Input Emulation
void testKeyboardMapping();

// Test Controller To Pointer/Mouse Input Emulation
void testPointerMapping();

I took a lot of inspiration from the buttonrebind_test.cpp.

System Settings KCM

It was agreed upon early on that this plugin would be opt-in, giving the user to enable and disable it when they choose. For that I created a KDE Control Module or KCM. Or better put, I built on the existing Game Controller KCM :) I added a new UI element, a toggle, for users to enable and disable the plugin. On the backend, I added a Q_PROPERTY, pluginEnabled, which is responsible for checking the kwinrc Plugin configs, and writing to them, in order to manage the state of this plugin. This is what it currently looks like (subject to change):

game_controller_kcm

Handling Lizard Mode

This was probably one of the most daunting parts of the project for me when I first started. I knew that steamOS had its own way of handling input coming from the Steam Deck controller which has nothing to do with KDE or Steam app. This is what allows the controller to work for navigating the device in game and desktop mode. It's what is refered to as "Lizard Mode". The controller -> keyboard/pointer rebinds that I implemented was based off of the rebinds of this Lizard mode. Ideally using a controller to navigate desktop feels/works the same across all devices on KDE.

It's important that this new plugin not disrupt the current input system for the steamdeck. Originally I was warned that opening the fd for this device would cause Lizard mode to be disabled, which would mean I would have to either:

A: Find a way to disable Lizard mode and implement it from scratch...

B: Figure out what disabled Lizard mode on FD open and how to prevent / enable it as needed.

or C: Just change the flag for opening the controller fd and everything works just fine :)

Yup. After some testing and the smallest change I've had to make all project the Steam Deck controller was able to be detected by the plugin as well as its input detected! Even better than that, and not sure why I did not put this together before, Steam Deck already maps its input to keyboard/mouse. Duh. So this gamepad plugin doesn't need to worry about mapping and of Steam Deck input to just use it prevent system sleep when activity from that controller is detected.

During my testing, I discovered that Steam Deck shows up on the system as 5 different controllers. Each having their own purpose, one to handle analog input (triggers, trackpads, sticks) another to handle face buttons & D-pad, another for keyboard, etc.. These are used by the system depending on the users needs. Again, this made life a lot easier. This are logs from evtest and gamecontroller plugin:

game_controller_steamdeck_testing_0
game_controller_steamdeck_testing_1
game_controller_steamdeck_testing_2

At the start of this project I had adopted a child. Some of you reading this post might have met my child. It's named

Bug328987
. It had been drifting inside the KDE community some time, looking for someone to take care of it. But it never happened, and thus time just went on, and on.

As some put it:

timonoj
Wow this is an ELEVEN (!) year old bug.

WS
This issue is so old it can go to middle school.

and my favorite

Holmes
Is there any hope that this bug will be fixed before the heat death of the universe?

By the time I met Bug328987, it had been around for ≈12 years. But still! In the eyes of KDE, it was a young, bright eyed, workflow-breaking bug, like all the bugs out there, and it had potential to be fixed! After months of back and forth with mentors, living in KDE matrix server like it were my personal Discord server, and learning how to not do things in the code base - I'm proud to say gamecontroller plugin properly addresses Bug328987. Bringing to an end its more than a decade long journey. They grow up so fast.

What’s next from here

  • Integration into Kwin Proper: "Draft" label has been removed from MR and is ready for review.
  • Final Fixes and Touch-up: Get Virtual Keyboard working, KCM toggle hot-plug, improve analog -> pointer emulation.

Reference documentation

KWin Gamepad Plugin: https://invent.kde.org/yorisoft/kwin/-/tree/work/yorisoft/gamepad-plugin/src/plugins/gamepad

Thursday, 2 October 2025

Beyond Keywords: How I Built a Semantic Search Engine for Any Video Ever tried to find a specific moment in a long video? You might remember the scene vividly—a character gives a crucial speech, or there’s a beautiful, silent shot of a landscape—but you can’t remember the exact timestamp. You end up scrubbing back and forth, wasting minutes, or even hours, trying to pinpoint that one moment. Traditional video search relies on titles, descriptions, and manual tags.

Wednesday, 1 October 2025

Design Systems is a relatively new concept that aims to organize the way design happens in structured systems such as applications, websites, organizations, etc.

Historically, working with graphics for the digital age has been unorganized, lives in personal computers, is not collaborative and leads to uncoordinated design.

When the world of graphic design meets development, designers were often confused about why mockups are not followed, why colors are not the same, not the same shapes, etc. All the while, developers ask designers why they can’t provide something that more closely resembles the system they aim to change. It’s uncoordinated work entering a highly-systemized world.

Often, both sides are confused and system changes become much more difficult to achieve.

Meet UI-design applications. The first wave of these started with Sketch (for Mac). Sketch is a fast and powerful vector graphics application that introduced a number of advantages over traditional SVG editors meant for artistic work. For example:

  • Infinite canvas
  • Area bounding
  • CSS-based design
  • CSS-based organization
  • Easy exports into various sizes
  • Asset library management
  • Collaborative design

Through their efforts, a sleuth of similar applications appeared in the scene, one building upon what the previous one lacked. Until we arrived at Figma, yes, Figma.

Figma did a few things right at the start of their development. They provided stronger asset library management, easier online collaboration, web-based editor with near-native speeds (If not faster now with the use of Web Assembly and other technologies), and variable and token management.

Through these enhancements Figma became the de-facto application to use for UI-oriented graphic development.

But what do they all do?

Put simply, these applications develop color, typography, spacings, shadows, icons, etc sets of organized assets. The assets have properties borrowed from development, such as, components, variables and tokens.

Designers can set up entire color libraries in a graphical way and then apply those colors to SVG graphics. Upon export, these graphics contain enough information for developers to more easily implement the design.

All the while, designers only have to spend time at the beginning of a project to set up all the assets required for designing. Additionally, Figma and other applications have been keenly focused on building graphical ways to deal with code-oriented complexities.

For example, Figma and PenPot detect variants creation and can express their values in dropdown menus that get created on the fly by the designers. If you create a button and your variants are size oriented, you can have a dropdown in the application’s UI that shows SM, MD, LG, XL, etc. These are huge time savers. Traditionally, designers would have to do a lot of copy/paste in their designs. With integrations like these, designers simply switch the variant for another and the design updates itself.

A similar idea happens with graphical components in these applications. Users are able to create a master version of an asset, let’s say a button, set up all of their locked and open parameters, colors, typography, margins, gutters, etc. When you make copies of this component, any changes made at the component level will be updated anywhere copies were placed. For very large design documents containing a company’s brand strategy, for example, these types of changes save countless hours of tedious copy/paste work.

Tokens

In recent times, and through various changes in the app-making industry, UI design applications have created the concept of tokens. Tokens are essentially named attributes for graphical components. They are often used as correlated language between design applications and systems.

For example, for Ocean Design, the team created tokens named thus:

pd.ref.color.primary50
  • PD: Plasma Design
  • REF: Reference color (Raw color value as opposed to applied color, which is called “sys”)
  • PRIMARY50: Color role and its named color value in a line from light to dark values of the same color family.

This value can be replicated in Plasma. Through the storing of a master list of token values, Plasma can stay coordinated with graphic primary50, the system would have to do the same and just change the raw color value of that token without having to create new tokens, break coordination with the design system, or have to interpret information coming from designers.

Tokens are becoming more common use and reflect the desire of developers and designers to have even tighter integration between design and development.

Independence

Design Systems also allow for great independence between design and development. Having laid the groundwork to create coordinated design, applications like Figma and PenPot allow users to download asset libraries, reuse, and create UI. All without redefining the source library. It democratizes graphic design while keeping designers coordinated in their designs.

Developers looking to execute an application idea can much more easily create coordinate UI that supports their efforts. Developers would have much less design-oriented work to do and dedicate more into the features they want to deliver.

Ocean Design

Ocean Design aims not only to become a new UI design for Plasma but also plug in these powerful design applications into our development ecosystem and deliver UI to users faster, more coordinated, and more often.

If you’re interested in learning more about this effort, connect with our teams here:

  • Plasma Visual Design Team (General chat about all things designs for the Plasma Desktop)
  • Ocean Design Team (Focused discussion on Ocean Design)

Tuesday, 30 September 2025

Haruna version 1.5.0 is released.

haruna-pl-drag.webp

The highlight of this release is the playlist, which got a lot of features:

  • multiple playlists through tabs (Muhammet Sadık Uğursoy)
  • drag and drop reordering (Muhammet Sadık Uğursoy)
  • add files and folders through drag and drop (Muhammet Sadık Uğursoy)
  • filtering (Muhammet Sadık Uğursoy)
  • option to control playback behavior when a file ends: repeat playlist, repeat file, stop after last file in playlist, stop after current fille and play a random item

Another big change is to the Mouse settings, now you can use a mouse button + modifier key combo (ctrl + left click, shift + scroll up/down etc.).


flathub logo

Windows version:

Availability of other package formats depends on your distro and the people who package Haruna.

If you like Haruna then support its development: GitHub Sponsors | Liberapay | PayPal

Feature requests and bugs should be posted on bugs.kde.org, ignoring the bug report template can result in your report being ignored.


Changelog

1.5.0

Known issues

On Windows the Shortcuts and Custom Commands settings pages don't work.

Features

Settings

  • General
    • added single instance setting to play new file when appending to the playlist
    • removed the "File dialog location setting"
  • Playlist: added settings to control playback behavior
  • Mouse
    • changed to allow modifier keys
    • added support for Mouse Forward and Back buttons
  • Subtitles: if a relative folder name in the Load subtitle from list starts with an * (asterisk) then subtitles will be searched in all folders contaning the folder name. Example: If the Load subtitle from list contains an entry *sub and you have the following folders next to the video file subs, more subs and subtitles all of these folders will be searched.
  • the settings window now has a minimum width and height

PlayList

  • added support for multiple playlists
  • items can be reordered manually through drag and dropdown
  • items can be selected, ctrl+click to select multiple items, shift+click to select a range
  • items can be filtered
  • added setings to control playback behavior when a file ends
  • when saving the playlist the file extension is set to m3u
  • can add files and folders through drag and drop
  • multiple files can be added through the option in the header
  • hide playlist when mouse leaves window while maximized, prevents opening the playlist when moving mouse to another monitor

Playback

  • if a file can't be played now an error is shown and playback stops instead of trying to play the next file (prevents a potential infinite loop when no file in the playlist can be played)
  • can play files starting with a dot (hidden files)
  • an error is shown when failing to get youtube playlist

Other

  • mpris: add support for Shuffle and LoopStatus
  • changed the action selection popup to use Kirigami.SearchDialog
  • replaced the spinning icon with a progress bar and label
  • the drop area of the video is split in 2 parts now
    • top part always appends to the default playlist
    • bottom part clears the default playlist and adds the dropped files and folders, when only one file is dropped it behaves as the open file action (clears the playlist and loads sibling files if enabled in settings)
  • recent files are now stored in a sqlite database
  • time positions used to restore videos are also stored in the database
  • sleep is blocked on Windows too
  • all strings should be translatable now

Bugfixes

  • fixed the loop action, osd was not showing and progress bar was not highlighting the loop range
  • before loading check that the file exists
  • fixed loading wrong subtitles when using recursive subs
  • fixed the progress bar getting taller when the chapters menu becomes visible
  • fixed a bug where the video would pause after clicking the progress/seek bar
10 Years of Qt OPC UA

Beginning of 2025 I was searching through the version history of Qt OPC UA - trying to find out when a certain issue got introduced. At some point I was curious: How long does this thing go back?! Turns out that the first git commit is dated 25th of September 2015. Which means we have been doing this for over 10 years now!

Continue reading 10 Years of Qt OPC UA at basysKom GmbH.

Saturday, 27 September 2025

Whether you missed it the first time or simply want to relive the excitement, the entire Akademy 2025 experience is now available to rewatch online! From insightful keynotes and engaging panel discussions to technical talks, every moment of the event has been recorded and uploaded for the community to enjoy.

This year Akademy was packed with ideas, innovation, and collaboration that will shape the future of KDE and open source.

Watch now on your favorite platform:

Enjoy!

At Akademy 2025 this year, I had the privilege of giving a talk about a big picture topic close to my heart, and you can watch it here:

For those who prefer reading over watching and listening, I’ll give a quick summary:

I believe that the challenges facing the world today present an opportunity for KDE to grow in importance and reach due to a variety of favorable trends embedded in the chaos and conflict, including:

  • Increasing skepticism of traditional proprietary American big tech
  • Increasing EU public funding opportunities
  • Windows 11 sucking and losing its edge for gaming
  • *Postscript: MacOS Tahoe stumbling and being publicly mocked as well

But this is a window of opportunity that I think will close. So I encouraged everyone to think about how we can make KDE software ready for adoption from the following perspectives:

  • Being known about in the first place
  • Looking good enough to be taken seriously
  • Being easy to download or otherwise acquire
  • Working properly and having enough features
  • Having enough support resources and an articulable “lower total cost of ownership” story

Because if we’ve got all five, our offerings will start to look irresistible, and I think we’ll gain market share very quickly!