Skip to content

Monday, 23 June 2025

This is a recipe post. For an event I needed to make brownies for 100 people, so this time I decided to write down what I was doing, so that they would be sort-of-consistent. I even weighed things.

Melt (e.g. in the microwave):

  • 200g pure chocolate (Jumbo store brand is acceptable in the Netherlands)
  • 130g margarine (Blue Band)

Stir in:

  • 150g sugar (e.g. brown basterd sugar for extra flavor)
  • pinch of salt (this is one I often forget)

Mix in:

  • 4 eggs (one by one, and use an electric mixer; run it long, so that the batter becomes glossy)
  • 70g cocoa powder
  • 60g flour

In the oven at 180℃ for 35 minutes or so. Optionally, add pecans.

This recipe is based on my interpretation of “Jamie Oliver Brownies”, which are all over the net – the original version is kind of picky, and what I do here works repeatedly in my kitchen.

You might have noticed that Plasma keyboard shortcuts have been changing recently with the aim to have everything KWin/Plasma be Meta+Something.

Now, I tend to redefine most of the default shortcuts, so this didn’t affect my workspace directly, but I liked the idea to have different modifiers used depending on the category of /thing/ for which I’m creating a shortcut.

An additional aim I had is to have a common shortcut ‘body’ for equivalent actions in different categories, in order to more easily build muscle memory with my new shortcuts.

Categories that I have are:

  1. system (Plasma and such)
  2. terminal application (Konsole, Kitty)
  3. terminal multiplexer (TMux)
  4. specific application (Firefox, Vim, …)

And these are the modifiers I’m trying out:

  1. system: Meta+Anything and Alt+Special keys
  2. terminal application: Ctrl+Shift+Anything
  3. terminal multiplexer: nothing special yet, just the Ctrl+d as the leader
  4. specific application:
    • working with tabs: Ctrl+Anything
    • other shortcuts: Alt+Normal keys

So, for example, the ; and ' as the shared shortcut /bodies/ mean the following in different categories:

  1. Meta+; and Meta+' – switch to next and previous window (I’m using Krohnkite for tiling, so this is not like Alt+Tab, but moving through the visible tiled windows);
  2. Ctrl+Shift+; and Ctrl+Shift+' – would mean switch to next and previous panes in the terminal application (I’m not using this yet, as I don’t tend to use split views in terminal except in TMux);
  3. Ctrl+d ; and Ctrl+d ' – move to next and previous panes in TMux;
  4. Alt+; and Alt+' – move to next and previous panes in an application (currently only in Vim and Neovim).

So far, the approach seems to work Ok. I’ve quickly got accustomed to the new window/pane navigation shortcuts.

The main problem are the programs that don’t allow changing shortcuts (Firefox for example) or don’t allow creating shortcuts with some key combinations (using Ctrl+; in Vim or Neovim does not work, while it works with Alt).

Because of those limitations, the modifiers are not as clear cut as they ideally would be. Ideally, each category would have its own single modifier, instead of, for example, having a mix of Alt and Ctrl in the /specific application/ category, and using a modifier combination like Ctrl+Shift for the /terminal application/.

I’ve also redefined all my Plasma and KWin shortcuts to be location-on-keyboard-based, but more on that later.

Pitfalls in PySide6

PySide6 is easy to use and powerful but there’s a few pitfalls to look out for. We’ll investigate a performance issue in a large data model, find out that function calls are expensive, and that some of Qt’s C++ APIs had to be adapted to work in a Python environment.

Continue reading Pitfalls in PySide6 at basysKom GmbH.

Sunday, 22 June 2025

A very long awaited milestone has been reached: Today the KMyMoney team announces the availability of the latest stable version of its Personal Finance Manager together with its companion library Alkimia..

Since the last stable release almost 3 years ago, the developers made 3440 changes to the main code base and 800+ changes to the Alkimia library.

Here’s an overview of some major functionality changes and improvements made among all the little bug fixes along the way (with more details on a separate page):

Multi account ledger view

KMyMoney now allows to open the ledger of multiple accounts in tabs side by side in the ledger view.

New and improved transaction editors

The transaction editors have completely rewritten. They now open a widget directly in the ledger area and there is no distinction between form based and register based method anymore. The sometimes confusing tabs showing Deposit/Transfer/Withdrawal have been removed and the amount entry now provides two mutually exclusive widgets for debit and credit. These changes also found their way into the split editor.

And for transfers you now simply type/select the account name in the category widget.

Customize tab order for transaction editors

Another feature of the transaction entry is to customize the tab order for data entry. Pressing Ctrl+Alt+T opens the tab order editor and the user can select the order of the widgets that are visited when pressing the TAB key.

Open categories in ledger view

With the new version, it is now possible to open categories in the ledger and enter transactions. This has been a long standing user request.

Customize order of columns in tabular views via drag and drop

The order of the columns of e.g. the ledger, accounts or categories view can now be modified by the user by simply dragging the header column to its new location.

Move accounts in hierarchy via drag and drop

Moving accounts in the hierarchy is now possible using drag and drop.

Load passwords from gpg encrypted password store

Passwords for e.g. the KBanking backend can now be loaded from the standard Unix password store pass with a simple mouse click. Pass uses strong GPG based encryption to store its information. A Qt based GUI frontend for pass is also available.

Improved handling of tags

The support for tags has been overhauled. Especially the reporting section for tags received many improvements.

Link documents to transactions

KMyMoney now provides a feature to link documents stored in the filesystem to transactions. This can be automated to support recurring transactions (e.g. your phone bill) by simple configuration using regular expressions per payee.

Online exchange rate download available for other finance apps

Online currency exchange rate and stock price download has been moved over to the Alkimia library and then re-integrated into KMyMoney. This makes it available for other applications by simply linking to Alkimia.

Updated handbook

The KMyMoney handbook has received many changes to reflect the new functionality.

A big thank you goes out to those who supported us by reporting problems and helping to identify their root cause. In case you have a question about the usage of some new features or even old ones, please post your question on the KDE user forum. If you are sure you found real problem or want to ask for a new feature, please do so on our bugtracker.

Tackling the Migration Agent

For week three, I finished resolving the configuration window issue for the EteSync resource by hiding the default configuration window and programmatically linking the wizard’s “Accepted” and “Rejected” states to the configuration window’s accept() and reject() methods. This ensured that the wizard cleanly replaced the built-in dialog without leaving a “zombie” window behind. I’ve submitted a merge request for these changes so it can be reviewed and integrated upstream.

With that resolved, I moved on to a new and intriguing component: the PIM Migration Agent. This agent is responsible for managing data migrations between different Akonadi versions or formats — a critical part of ensuring smooth transitions when updating KDE PIM components.

And like the other agents and resources, it was time for it to shed its QtWidgets dependency.


Decoupling the UI

Following the established pattern, I began by:

  • Creating a dedicated UI plugin for the migration agent’s configuration dialog

  • Removing the old configure() method from the agent’s core logic

  • Updating the relevant CMakeLists.txt files to support the plugin and cleanly separate UI code from the core agent

However, while this transition was relatively smooth, the plugin-agent communication needed more work to function correctly in this new structure.


Creating a D-Bus Interface for Plugin-Agent Communication

To enable proper communication between the configuration plugin and the migration agent, I created a new D-Bus interface:
org.kde.Akonadi.MigrationAgent

This interface allows the plugin to:

  • Receive status or configuration information from the agent

  • Send information back if needed (e.g., configuration changes)

To support this, I also:

  • Modified the CMakeLists.txt to include the interface and generate the corresponding D-Bus adaptor

  • Updated both the migrationagent and migrationstatuswidget files to use the new D-Bus interface for interaction

This ensures the plugin can communicate cleanly with the agent without relying on any hard-coded QtWidgets calls or tightly coupled logic.


The KUiServerJobTracker Problem (Still Pending)

While working on the migration agent, I encountered a significant QtWidget dependency:
KUiServerJobTracker, which handles job progress display by showing dialogs and notifications automatically.

Removing it is straightforward — but it leaves a gap:

How should the migration agent report progress to the user once KUiServerJobTracker is gone?

I’m currently exploring options for replacing it, possibly using a D-Bus-based mechanism where the agent broadcasts progress updates and a separate component (e.g., the plugin or a tray app) displays them. This would decouple the presentation layer from the agent’s logic, but I haven’t yet finalized the design.


What’s Next?

My immediate priority is to test the new plugin and the communication logic to ensure everything works correctly. In parallel, I’ll continue thinking through a robust replacement for KUiServerJobTracker, aiming for a modular, widget-free solution.

This week introduced new architectural challenges, but also laid the groundwork for cleaner, more maintainable agents. I’m excited to keep building on this momentum next week!

Saturday, 21 June 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 we released Plasma 6.4! And so far it’s been getting a really positive reception. The bug reports bear this out; most of the real actual bugs reported against 6.4.0 are either pre-existing issues or minor regressions, many of which we’ve already fixed in time for 6.4.1 coming next Tuesday.

Notable UI Improvements

Plasma 6.4.1

Discover’s list views are now properly navigable with the keyboard. (Christoph Wolk, link)

Improved the text readability in some of the list items in KRunner and Discover when the list items are pressed or clicked. (Nate Graham, link 1 and link 2)

KRunner showing list item with proper selected state with inverted text

Hovering over list items on System Settings’ User Feedback page no longer makes inscrutable icons appear. (Nate Graham, link)

Improved the readability of graph axis labels throughout Plasma so they meet the WCAG AA standard. (Nate Graham, link)

CPU bar chart with more readable Y axis labels

Plasma 6.5.0

Plasma’s Activity manager service now only stores the last 4 months’ worth of history by default, rather than storing all history ever and never pruning it. Setting a limit here makes the data more relevant and prevents performance problems caused by endlessly-growing databases. (Nate Graham, link)

Made further UI improvements to the Emoji Selector app: now the window is never so small that the sidebar list becomes scrollable, and the button to expand and collapse the sidebar is located on the header, rather than inline. (Oliver Beard, link)

Nicer, more compact emoji picker window

Removed the vertical line between the date and time on horizontal arrangements of the Digital Clock widget, since it proved unpopular, and people who want it can get it themselves by using a custom date format anyway. (Owen Ross, link)

On System Settings’ Shortcuts page, the “Add New” button is now located on the top toolbar rather than taking up unnecessary space above the list view. (Jakob Petsovits, link)

“Add New” button on toolbar

Reduced the minimum size of Custom Tiling tiles, so that you can have smaller ones on particularly large screens like ultra-wides. (Tyler Slabinski, link)

The Networks widget’s captive portal banner now uses the inline/header styling, reducing the frames-within-frames effect. (Kai Uwe Broulik, link)

Removed the NOAA Weather Picture Of The Day wallpaper plugin, because unfortunately the source data changed in a way that makes it no longer consistently suitable for being displayed on the desktop. (Kat Pavlů, link)

Notable Bug Fixes

Plasma 6.3.6

Fixed a bug that could sometimes cause keyboard shortcuts to get lost on certain distros when performing system upgrades. (Vlad Zahorodnii, link)

Fixed a regression that caused KRunner’s faded completion text to sometimes overflow from the window. (Nate Graham, link)

Fixed a small visual regression in KWin’s “Slide Back” effect. (Blazer Silving, link)

Plasma 6.4.1

Fixed several issues in the Folder View widget that caused selecting or opening items to not work when using certain non-default view settings, or when the view was scrollable, or when using a touchscreen. (Christoph Wolk, link)

Fixed a bug in the Meta+V clipboard popup that made it sometimes fail to pre-select the top-most item. (Akseli Lahtinen, link)

The Clipboard settings window’s shortcuts page no longer shows columns for local shortcuts that you can confusingly set and have them do nothing, because the clipboard is global in scope. (Akseli Lahtinen, link)

Fixed the Earth Science Picture of The Day wallpaper plugin after the source data changed its formatting again. (Kat Pavlů, link)

Made a few fixes to the “Missing Backends” section of Discover’s settings window that prevented it from working quite right. (Carl Schwan, link)

Fixed a bug that prevented direct scan-out (and its attendant performance benefits) from activating on rotated screens. (Vlad Zahorodnii, link)

Fixed a bug that could cause the system to lock or suspend more quickly than intended after an app that was blocking those activities stops doing so. (Akseli Lahtinen. link)

Installing a new wallpaper plugin no longer causes the plugin list combobox to become blank. (Nate Graham, link)

Frameworks 6.16

Fixed a regression that caused System Settings’ sidebar list items to display hover tooltips when they weren’t needed. (Nate Graham, link)

Other bug information of note:

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! 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 a new Plasma feature or a bugfix mentioned here, feel free to push a commit to the relevant merge request on invent.kde.org.

It took a year for me to actually make a release, but KTimeTracker 6.0.0 is now out!

Major changes

  • The major thing about it is that KTimeTracker has been ported to Qt6. For end users this means up-to-date Linux distributions that had orphaned KTimeTracker will get the package back once a package maintainer steps up.

  • KTimeTracker has long had a (currently) X11-exclusive feature where it detects the virtual desktop you’re in and uses that to start/stop tracking a task. This does not work on Wayland and Windows, and now it won’t show up on either platform so you don’t attempt to use something that doesn’t work!

Wednesday, 18 June 2025

Updates in the project in 2024 and the first half of 2025

The Plasma Mobile team is happy to announce the developments in the project over the past few months!

Housekeeping

This blog post was completed much later than originally planned. In the meantime, several releases have taken place:

This blog post is already quite long, so it will omit changes merged for Plasma 6.5 (releasing in October, to be announced in a future post).

With the Plasma 6.2 release, we moved Plasma Dialer and Spacebar to the Plasma release cycle, allowing us to have consistent releases of the two apps. This completes our year long move to having all Plasma Mobile related projects released as part of wider KDE releases, streamlining the work for distributions and taking a load off us on having to maintain a separate release cycle!

In other news, a Fedora spin for Plasma Mobile was released! It will only be targeting devices that can currently boot Fedora (i.e. not ARM phones), but is very exciting nonetheless! Read more about it here, and get it here.

Plasma Sprint

In May, we attended the Plasma developers' sprint in Graz, Austria! Read more about what we did from the blogs below:

Hacking at TU Graz
Hackerspace

NGI0 Core (NLnet) funding

Bhushan recently received funding through the NGI0 Core Fund to work on the power management stack on Plasma Mobile (and Plasma as a whole)!

You can read more about this on his blog. The project details are described here.

CI

Bart added an Alpine CI to KDE infrastructure, allowing for KDE projects to ensure they build correctly for Alpine before release!

Plasma

Work continues on from the Plasma 6 release! Only major features and improvements are described below, see the Plasma release notes for the full list of changes.

Task Switcher

Luis worked on bringing back gestures to the task switcher! The implementation now uses KWin's gesture API, and has several new features over the Plasma 5 implementation:

  • Swiping up fast from the bottom of the screen minimizes the app and goes to the homescreen.
  • Swiping up and holding from the bottom of the screen keeps the task switcher open.
  • Swiping left and right on on the bottom of the screen allows for scrubbing through the currently opened apps.
  • Haptic feedback occurs during the opening gesture if releasing will open the task switcher.

(Luis Büchi, Plasma 6.2, Link 1, Link 2, Link 3, Link 4, Link 5, Link 6)

Micah further improved and refined the task switcher and gesture tracking, polishing the flow of animations and activation thresholds. (Micah Stanley, Plasma 6.2.1, Link)

Devin added support for the tasks to be sorted by last activation. (Devin Lin, Plasma 6.2, Link)

Luis added support for double tapping on the task switcher button to switch between the two most recently used apps. (Luis Büchi, Plasma 6.3, Link)

Screenshot of <nil>
Screenshot of <nil>

Lockscreen

The lockscreen keypad design was overhauled to use a more traditional PIN layout. It is much simpler to render and is also easier to use with one hand. (Devin Lin, Plasma 6.2, Link)

Various issues with input unresponsiveness were also fixed, as well as support for passwordless login. (Devin Lin, Plasma 6.2, Link 1, Link 2, Link 3)

The clock design was also overhauled to be larger and blend better with the wallpaper. (Micah Stanley, Plasma 6.2, Link)

Quick action buttons were also added, which are configurable to allow actions (ex. flashlight toggle) be easily accessed while the device is locked. (User8395 & Micah Stanley, Plasma 6.4, Link 1, Link 2)

Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>

Notifications

Popup notifications were fully implemented, with a refreshed look and the capability to show multiple notifications in a "stack". (Micah Stanley, Plasma 6.3, Link)

Scrolling through an overflowing notifications list was fixed. (Micah Stanley, Plasma 6.4, Link)

Various issues with the notification widget were also fixed:

  • Job notifications now show up properly and are dismissable.
  • Notification contents are now properly clipped as they are being dismissed.

(Devin Lin, Plasma 6.2, Link)

Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>

Homescreen (Folio)

Work continued on fixing and polishing issues in the default homescreen introduced in Plasma 6, here are some highlights:

  • A search bar was added to the applications list. (Devin Lin, Plasma 6.2, Link)
  • Support for touchpad interaction was added. (Devin Lin, Plasma 6.2, Link)
  • An option was added to be able to lock the homescreen layout from editing. (Micah Stanley, Plasma 6.4, Link)
  • State being shared between multiple displays was fixed. (Devin Lin, Plasma 6.1.3, Link 1, Link 2)
  • The settings view is now closed when the home button is pressed. (Devin Lin, Plasma 6.1.5, Link)
  • A button was added in the wallpaper selector to see the full wallpaper config window. (Devin Lin, Plasma 6.1.2, Link)
  • A dialog was added to ask the user to confirm when deleting a folder. (Devin Lin, Plasma 6.2, Link)
  • Application icons resizing to only predefined sizes was fixed. (Devin Lin, Plasma 6.2, Link)
  • When an application gets deleted, user placed icons of it are also removed. (Devin Lin, Plasma 6.4, Link)
  • Haptics were added to various actions on the homescreen. (Micah Stanley, Plasma 6.4, Link)
  • Widgets no longer activate a popup when being held to be edited. (Florian Richer, Plasma 6.4.1, Link)
Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>

Homescreen (Halcyon)

Devin fixed situations where the favourited applications may not activate when tapped. (Devin Lin, Plasma 6.1.4, Link)

Action Drawer

An expanded mode to the music widget when tapped was added, that allows for the song position to be changed. (Florian Richer & Micah Stanley, Plasma 6.2, Link 1, Link 2, Link 3)

The action drawer can now be opened even when an application is fullscreen. (Micah Stanley, Plasma 6.3, Link)

An "overscroll" animation when the panel is fully open and the finger overshoots was added. (Micah Stanley, Plasma 6.2, Link)

A marquee for quick setting titles was added, fixing eliding with certain languages. (Athozus, Plasma 6.2, Link)

Quick settings are now hidden when they are not applicable, such as for mobile data when there is no modem. (User3895, Plasma 6.3, Link)

The order of quick settings after being adjusted from the settings is now fixed. (Florian Richer, Plasma 6.4.1, Link 1, Link 2, Link 3)

The action drawer panel now hides when screen brightness is adjusted, making it easier for the user to gauge the brightness they would like. (Micah Stanley, Plasma 6.3, Link)

A quick setting was added to be toggle whether all applications are shown in fullscreen (panels can be shown when swiping from the top/bottom). (Micah Stanley, Plasma 6.4, Link)

The screen recording quick setting is now properly ported to Plasma 6 and has been brought back. (Florian Richer, Plasma 6.2, Link)

Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>

Status Bar

The status bar height can now be resized in the settings. (Sebastian Kugler, Plasma 6.3, Link)

The status bar can now be swiped down to be shown when in a fullscreen application. (Micah Stanley, Plasma 6.3, Link)

A config option was added to toggle showing the battery percentage label. (Micah Stanley, Plasma 6.4, Link)

An optional setting to also show the date in the status bar along with the time was added. (Athozus, Plasma 6.2, Link)

Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>

Volume Popup

The design of the volume popup was overhauled, and now made to not take away focus from the currently shown application window. (Micah Stanley, Plasma 6.3, Link)

Screenshot of <nil>

Manual Rotation Button

A button was added to the navigation panel to manually rotate the screen to the current orientation when auto-screen rotation is disabled. (Devin Lin, Plasma 6.3, Link)

A floating button with the same functionality was added to gesture mode. (Micah Stanley, Plasma 6.4, Link)

Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>

Startup Feedback

Devin overhauled the startup feedback implementation, which is the animation that shows when an application is opening:

  • Windows states are now being tracked to determine when to close it, fixing issues where it would close prematurely due to losing focus.
  • Startup feedback now shows up in the task switcher as a window.
  • A spinner was added which is shown when applications take longer to load.
  • Multiple displays are now properly supported.
  • The background color algorithm was improved to tint colors darker in dark modes, avoiding a blinding flash when application icons are bright.

(Devin Lin, Plasma 6.2, Link 1, Link 2, Link 3)

Screenshot of <nil>
Screenshot of <nil>

Settings

The settings application is now organized into categories. (Devin Lin, Plasma Settings v25.02, Link)

A toggle was added to force showing all settings modules, even ones that are not for mobile. (Devin Lin, Plasma Settings v25.06, Link)

A traffic monitor was added to the Wi-Fi settings module for the current network connection. (Sebastian Kugler, Plasma 6.3, Link)

A vendor information card was added to the Information settings module. (Sebastian Kugler, Plasma 6.3, Link)

Some issues with setting up mobile data connections with iPv6 were fixed. (Florian Richer, Plasma 6.2, Link)

Other

Windows will not longer be able to be unmaximized outside of docked mode, especially applicable to GTK applications. (Devin Lin, Plasma 6.3, Link)

There is now an option for distributions to manually disable the logout button from the shutdown screen. (Sebastian Kügler, Plasma 6.3, Link)

Applications

Most major announcements for applications are now covered in the This Week in KDE Apps series on the main blog.

However, some mobile specific updates will still be shared here!

Angelfish (Web Browser)

Micah greatly overhauled the tab list and search bar UI/UX on mobile! New features include:

  • Swiping up on the search bar now opens the tab list.
  • Swiping up again closes the tab list.
  • The tab list is now a fullscreen grid, with improved opening and closing animations.
  • The search bar now gives a URL preview when minimized during scrolling, and touching it maximizes it.

(Micah Stanley, KDE Gear 24.08, Link 1, Link 2)

Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>

Dialer

Bhushan investigated and worked with KWin maintainers to fix a major issue where a ghost dialer window would sometimes be on top of the lockscreen. (Vlad Zahorodnii & Bhushan Shah, Plasma 6.3.5, Link)

Bhushan and Luis investigated and fixed an issue where a single incoming call may be treated as multiple calls on dual-SIM devices. (Bhushan Shah, Plasma 6.3.5, Link)

Spacebar (SMS Messenger)

Various lockup and sending/receiving issues were fixed by having the client communicate to the database solely through the server, rather than having the server and client simultaneously access it. (Devin Lin, Plasma 6.2.1, Link)

Outgoing messages sending a notification to the user was fixed. (Devin Lin, Plasma 6.3, Link)

A message in the UI now shows up if the Spacebar daemon is not running. (Devin Lin, Plasma 6.2.1, Link)

A ModemManager mocking program for SMS was created to more easily develop Spacebar without a working modem setup (as Devin encountered). (Devin Lin, Plasma 6.3, Link)

The "new chat" page UX was redesigned to be easier to understand. (Devin Lin, Plasma 6.3, Link)

SMS chat conversations can no longer be started with contacts that have no phone numbers. (Florian Richer, Plasma 6.2, Link)

Discover (Application Store)

The apk backend (for Alpine/postmarketOS) was integrated into the project, which was previously carried as a large patch downstream. This allows it to be more easily iterated on and to be improved in the future. (Devin Lin, Plasma 6.2, Link)

An Alpine CI was added to KDE infrastructure, and hooked up the apk backend to be tested. (Bart Ribbers, Plasma 6.2, Link)

QMLKonsole (Terminal)

The modifier panel can now be manually enabled/disabled by the user, regardless of whether they are on mobile or desktop. (Om Mehta, KDE Gear 25.08, Link)

The warning for closing a tab with a running task was fixed for window closing events. (Mason Jiao, KDE Gear 24.08, Link)

The keyboard not popping up when tapping the terminal area, and the keyboard button were both fixed. (Devin Lin, KDE Gear 24.08, Link)

Clock

Kai took a deep dive into the app, adding new features and polishing the UX! Here are some highlights:

  • Timers now have a persistent notification to indicate status when the app isn't open. (Kai Uwe Broulik, KDE Gear 25.08, Link)
  • Timers can now be edited directly without having to be recreated. (Kai Uwe Broulik, KDE Gear 25.08, Link)
  • Timers can now be started, paused and reset from KRunner. (Kai Uwe Broulik, KDE Gear 25.08, Link)
  • The time page now has an analog clock. (Kai Uwe Broulik, KDE Gear 25.08, Link)
Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>

Contributing

Do you want to help with the development of Plasma Mobile? We are a group of volunteers doing this in our free time, and are desperately looking for new contributors, beginners are always welcome!

See our community page to get in touch!

We are always happy to get more helping hands, no matter what you want to do, but we especially need support in these areas:

  • Telephony (Calling and SMS)
  • Camera
  • App development (Photo Viewer, Browser, Audio Recorder, Games, etc.)
  • Shell work
  • You can also check out our Plasma Mobile issue tracker for more details.

Even if you do not have a compatible phone or tablet, you can also help us out with application development, as you can easily do that from a desktop!

Take Plasma Mobile for a spin! Check out the device support for each distribution and find the version which will work for your device.

If you have any further questions, view our documentation, and consider joining our Matrix channel. Let us know what you would like to work on or where you need support to get going!

Our issue tracker documentation also gives information on how and where to report issues.

Tuesday, 17 June 2025

Car Game

This project began as a casual college game I developed in my second year, using Pygame. The idea was simple. You’re driving a car, and your job is to survive enemy attacks, collect energy to stay alive, and shoot down as many opponents as you can. The more you destroy, the higher your score.

The core gameplay loop was designed in Pygame and includes:

  • A player car that moves left and right.
  • Opponent cars that spawn and rush toward the player.
  • Energy pickups that keep your car alive.
  • Bullets using which you take down enemy cars.

Each component is managed by its respective class: MyCar, Opponent, Fire, and Explosion.

The original version used keyboard input for movement and shooting. The objective was to survive as long as possible while scoring points by destroying opponents.

While building the game, I found myself knee-deep in things I hadn’t anticipated—like why a car would randomly vanish mid-frame, or why every collision either did nothing or ended in total chaos. I spent hours tweaking bounding rectangles, trying to get explosions to appear in the right place, and making sure enemy cars didn’t spawn on top of each other. Most of my time went into figuring out how to reset things properly after a crash or making sure the game didn’t freeze when too many things happened at once. It was messy, confusing, and at times exhausting, but weirdly satisfying when everything finally came together.

Recently, I revisited this project with the idea of automating it. I wanted to see if the car could make its own decisions—to dodge, shoot, or stay put—all without human input. That’s where Monte Carlo Tree Search (MCTS) came in. Being a decision-making algorithm, it’s particularly useful in many strategic games when the search space is large and rewards are sparse or delayed—perfect for a chaotic survival game like mine.

Implementation Details

The first step was to abstract the game state into a simplified object. I created a GameState class in mcts_car_shooter.py that captures:

  • My car’s x position.
  • Remaining energy and current score.
  • Positions and energy levels of alive opponents.
  • Fire coordinates (optional) and energy pickup position.

This allowed the MCTS algorithm to run without needing to interact with the actual rendering or physics code.

In the main game loop, every 5 frames, I pass the current game state to the MCTS engine:

if frame_counter % 5 == 0:
    state = get_game_state_from_main(mycar, energy, score, list(opponent))
    action = mcts_search(state, computation_time=0.05)

The result is one of four possible actions: "left", "right", "shoot", or "none".

Once the decision is made, the game responds accordingly:

if action == "left":
    mycar.move("left")
elif action == "right":
    mycar.move("right")
elif action == "shoot":
    fire_sound.play()

So here’s what’s actually going on behind the scenes every time the AI makes a move. The MCTS algorithm starts by traversing the existing tree of game states to find the most promising node to explore—this is the selection step. Once it lands on that node, it simulates one new possible action from there, which is the expansion phase. From that new state, it plays out a few random steps of the game using a basic policy (like “shoot if you see enemies” or “don’t move if energy is low”)—this is the simulation part. And then finally, based on how well or badly that rollout went, it backpropagates the reward back up the tree so that decisions that led to good outcomes get reinforced and are more likely to be chosen in the future. Each loop tries to balance exploration (trying out new stuff) and exploitation (doing what’s already known to work), and this constant balance somehow ends up producing surprisingly smart behavior out of nothing but random simulations and reward math.

After integrating MCTS, the game now plays itself. The car intelligently avoids enemy fire, conserves energy, and shoots at the right moments. It’s not perfect—but it’s good enough to survive for a few minutes and rack up a decent score.

However, one limitation of the current setup is that the AI doesn’t retain any memory of past games—it starts from scratch every time the game restarts. The MCTS algorithm only simulates forward from the current state and doesn’t learn or adapt across episodes. So while it can make fairly smart decisions in the moment, it has no long-term strategy or evolving understanding of what works best over time. There’s no persistence of experience, which means it can’t build on previous runs to improve future performance. This makes it efficient for one-off decisions but not ideal for learning patterns or refining behavior over multiple plays.

Next, I’m planning to take things a bit further. I want to train a policy network on the trajectories generated by MCTS so the model can learn from past simulations and make better long-term decisions without needing to simulate every time. I’m also thinking of adding a simple GUI to visualize how the MCTS tree grows and changes in real time—because watching the AI think would honestly be super fun. And eventually, I’d like to give players the option to toggle between AI-controlled and manual play, so they can either sit back and watch the car do its thing or take control themselves. You can find the full implementation on my GitHub. Thanks for reading!