Skip to content

Saturday, 4 April 2026

Welcome to a new issue of This Week in Plasma!

This was a somewhat quiet week mostly full of UI and stability improvements, perhaps because many KDE contributors are gearing up for next week’s mega-sprint in Graz! For the same reason, expect next week’s post to be short or non-existent.

Notable UI improvements

Plasma 6.7

Breeze-themed menu items throughout KDE’s software ecosystem now visually change when clicked. (Akseli Lahtinen, breeze MR #605)

A variety of tooltips throughout Plasma now follow the styling of the active Plasma theme as expected. (Nicolas Fella, libplasma MR #1435)

Improved the Mouse Mark effect’s support for touchscreens: now you can draw multiple lines at a time if you have a multi-touch-capable screen. (Tin Dao, kwin MR #8951)

Synchronizing settings to the Plasma Login Manager now includes the current set of keyboard layouts. (Oliver Beard, KDE Bugzilla #516778)

Simplified the UI for the Clipboard widget’s QR code page: now the copy button is in the header, rather than all alone on its own row. (Tobias Fella, plasma-workspace MR #6451)

Removed the feature to force the Task Manager and System Tray widgets to use a large spacing and icon size while in touch/tablet mode; it just didn’t work out, and caused un-resolvable sizing bugs. (Nate Graham, KDE Bugzilla #511439)

Improved the accuracy of widget positioning on the desktop: dragging a widget somewhere it won’t fit will now show its preview rectangle in the nearest place where it will fit, which is where it will end up. (Tobias Fella, plasma-workspace MR #6452)

Discover now uses consistent terminology when it asks you to restart. (Nate Graham, KDE Bugzilla #517630)

Frameworks 6.25

Trying to paste when your clipboard is empty now fails silently rather than showing a notification about it. (Tobias Fella, kio MR #2168)

Notable bug fixes

Plasma 6.6.4

Hardened Plasma against crashing while trying to load a broken widget. (Harald Sitter, libplasma MR #1456)

Fixed a case where the KDED background daemon could die with a Wayland protocol error when changing the screen resolution. (Xaver Hugl, KDE Bugzilla #516217)

Fixed a bizarre issue that mangled certain text formatted with Markdown styling while Plasma’s on-screen keyboard was enabled but not visible. (Devin Lin, KDE Bugzilla #516511)

Fixed a case where System Settings’ Plasma Style page could crash on certain distros shipping Qt 6.11 with asserts turned on. (Ismael Asensio, plasma-workspace MR #6458)

Fixed usage graphs for certain NVIDIA GPUs being broken in the System Monitor app and widgets. (Bernhard Friedreich, libksysguard MR #465)

Popups for editing widgets while in Plasmas’s edit mode now work with a touchscreen. (Marco Martin, KDE Bugzilla #509880)

Hardened KWin against XWayland apps being sized incorrectly on systems with config files containing inappropriate scale values. (Xaver Hugl, kwin MR #9049)

Rolled out a more complete fix for context menus of System Tray icons sometimes having ugly square black corners. (Nate Graham, KDE Bugzilla #513307)

Plasma 6.7

Made two technical fixes to the process of configuring OpenConnect VPNs (Aviral Singh and Alexander Becker, KDE Bugzilla #385395 and KDE Bugzilla #518289)

Notable in performance & technical

Plasma 6.7

Implemented support for the xx-fractional-scale-v2 Wayland protocol, which improves visual fidelity by reducing gaps between adjacent items. (Vlad Zahorodnii, kwin MR #9023)

Continued with the work to add Vulkan support. (Diego Gomez, kwin MR #9027)

How you can help

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

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

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

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

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

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

Friday, 3 April 2026

Falkon Connect: The Roadmap Ahead (WebXDC, XSLT, and Daily Puzzles) In my previous post, I broke down the architecture of building Falkon Connect from scratch—turning the KDE Falkon browser into a decentralized XMPP client.
A look at what went into the Kubuntu 26.04 LTS Resolute Raccoon release — bug fixes, new contributors, KFocus teamwork, and a call for beta testers ahead of the April 16 RC.

Tuesday, 31 March 2026

pURL and SWHID are both software identifiers with similarities, but they are fundamentally different. pURL is assigned by a registry. SWHID is derived from the code itself. They are not competitors — they complement each other.

Today we're releasing Krita 5.3.1 and 6.0.1.

This release mainly fixes an issue for Windows users: some applications, like Microsoft Windows Powertoys' Fancy Zones or the Google Drive plugin cause problems for Krita. These applications query all running applications for their accessibility abilities.

Until Qt6, Qt's QML module, which is used extensively in the new text tool, would then recursively query all active screen objects, like comboboxes or buttons, and up and down the entire class hierarchy for accessibility features. This slowed down Krita to the point where even menus would be slow to open.

It was extremely tricky to figure this out, since none of the Krita developers actually use these external applications... But it should be fixed now!

There are more fixes in this release:

  • The mutator shortcut is now Ctrl-alt-shift-m instead of Z in accordance with the plugin's manual.
  • On Android, the canvas will not pan up when you use the text tool
  • On Android, the OnePlus stylus middle click button works
  • Animation Key Frame copy pasting now works in Krita 6
  • On Wayland, drag and drop is fixed (Wayland clears the clipboard when a new window is opened, so now we have to cache the data.)
  • The canvas resize dialog now works correctly when changing units (bug: 517857)
  • The Incremental Backup/Version saving function now works in Krita 6.
  • On Android, text fields should no longer block stylus movements, pressing spacebar should work as a shortcut and the view should no longer turn blue when pressing a keyboard key. These issues only occurred on some devices.

Check out the release notes for a full overview of all the new features in Krita 5.3 and 6.0.

⚠️ Warning

One again, we consider Krita 5.3.1 suitable for productive work; 6.0.1 is, because of the many changes from Qt5 to Qt6 more experimental.

5.3.1 Download

Windows

If you're using the portable zip files, just open the zip file in Explorer and drag the folder somewhere convenient, then double-click on the Krita icon in the folder. This will not impact an installed version of Krita, though it will share your settings and custom resources with your regular installed version of Krita. For reporting crashes, also get the debug symbols folder.

ⓘ Note

We are no longer making 32-bit Windows builds.

Linux

Note: starting with recent releases, the minimum supported distro versions may change.

⚠️ Warning

Starting with recent AppImage runtime updates, some AppImageLauncher versions may be incompatible. See AppImage runtime docs for troubleshooting.

MacOS

Note: minimum supported MacOS may change between releases.

Android

Krita on Android is still beta; and is meant to run on chromebooks and tablets only.

Source code

For source archives, please download one of the 6.0.1 archives and build with Qt5.

md5sum

For all downloads, visit https://download.kde.org/stable/krita/5.3.1/ and click on "Details" to get the hashes.

Key

The Linux AppImage and the source tarballs are signed. You can retrieve the public key here. The signatures are here (filenames ending in .sig).

6.0.1 Download

Windows

If you're using the portable zip files, just open the zip file in Explorer and drag the folder somewhere convenient, then double-click on the Krita icon in the folder. This will not impact an installed version of Krita, though it will share your settings and custom resources with your regular installed version of Krita. For reporting crashes, also get the debug symbols folder.

ⓘ Note

We are no longer making 32-bit Windows builds.

Linux

Note: starting with recent releases, the minimum supported distro versions may change.

⚠️ Warning

Starting with recent AppImage runtime updates, some AppImageLauncher versions may be incompatible. See AppImage runtime docs for troubleshooting.

MacOS

Note: minimum supported MacOS may change between releases.

Android

Krita 6.0.1 is not yet functional on Android, so we are not making APK's available for sideloading.

Source code

ⓘ Note

Note for distributions: if you package both PyQt5 and PyQt6, you will want to patch our source code with this patch: Disallow importing conflicting version of PyQt

md5sum

For all downloads, visit https://download.kde.org/stable/krita/6.0.1/ and click on "Details" to get the hashes.

Key

The Linux AppImage and the source tarballs are signed. You can retrieve the public key here. The signatures are here (filenames ending in .sig).

Sunday, 29 March 2026

Strand is a PWA runtime for running web applications in a more integrated manner for KDE Plasma.

Right now Strand has two parallel development tracks; an AI-driven prototyping track to test the feasibility of features, and a second human-driven track where I’m building the final product.

I’ll mostly cover the events of the AI track in this post, which I’ve been dogfooding as I slowly get the human track on-rails. The usual caveats of code quality and security are in full effect.

Performance & Structure

The first version of the runtime used one WebEngine per application process. Part of this was me receiving incorrect information from the AI. After understanding the WebEngine and WebEngineProfile structure more thoroughly, I decided a system of dynamically determining the host process would lead to better resource efficiency.

Now, instead of one process per app, when a webapp starts it generates a “Process hash” based on the configuration and flags being applied to WebEngine. It will then see if there’s a Strand process running with that hash, using it if available. This immediately lead to hundreds of megabytes in savings when running multiple instances, while still allowing apps to potentially use alternative settings if required.

One major pain point is hardware acceleration. I’m having significant of trouble getting it to work as it really requires the stars to align quite precisely. Right now there’s just no acceleration for reasons ranging from my specific hardware, to Wayland, to a witches brew of flags – and if anything is wrong there’s just no acceleration. I checked to see if I could run another KDE QtWebEngine-oriented app at full speed – Falkon – but it also suffered. Commentary online is underwhelming.

My new benchmark. I’ll score the hardware acceleration based on how long I get before the lag kills me. Right now it’s “202”.
New Features Tested

The most significant new feature is header integration, which is the culmination of 3 smaller features.

The most visually obvious is the addition of custom CSS with system color support. Strand injects CSS variables into applications with system colors, and when used by the custom CSS, can easily give web apps much more cohesive headers. Strand pays special attention to header-oriented colors, guaranteeing their availability along with the accent color. These apps are also smart enough to update their colors when changed on a system level. Of course, custom CSS can be disabled. The only caveat is that some apps still have the scrollbar peeking in, which could potentially be fixed case-by-case with CSS.

The next addition is the ability to list “Drag Region Selectors” in the manifest files. These are simple DOM selectors which trigger native window dragging when an element matches the selection criteria. This system accounts for interactive child elements, so things like buttons and fields in drag areas work as-expected.

Toolbars and menubars are no longer mandatory. In the manifest file you can specify “Safe Toolbar Removal” selectors paired with URLs. If the selector criteria is met and “Allow Smart Hiding of Toolbar” enabled for the app, Strand will auto-hide the toolbar. This works very well! The toolbar will re-appear if the app navigates away from a “Safe Situation”, allowing users to access browser-like navigation. A good example of this is an SSO flow; if SSO is occurring, the toolbar re-appears, and the user can navigate back to the app if the sign-in process is interrupted. Even then a user holding the alt key will re-show the toolbar, and if Strand blocked an outgoing link, the toolbar will resurface so the user may interact with that event.

These 3 features together make headers in web apps feel shockingly native at times. I’m particularly impressed by how integrated Teams feels. Placed between Dolphin and Kate it looks great, and the dragging behavior of the header areas are spot-on.

The header-centric features are also designed to degrade gracefully. We are connecting to ever-changing websites and I didn’t want to introduce injections libel to break entire applications. In the event a web app changes significantly, only the integrations should be lost, so at worst you’ll still have a functional web app. This is also one reason why I won’t be introducing app-specific Javascript injection.

Stand applications can now be added to menus via the welcome screen, and applications are appropriately categorized when added. The next step will be to have a complete installation flow.

Strand doesn’t yet have an installation flow, but launching Discover from FlatHub worked as expected.
Conclusion / Future / The Human Track

Right now the AI track is getting very, very close to what I’d like in terms of functionality and main-window presentation. As the AI churns overall code quality goes down, but it does continue to feed me methodologies which would have easily cost me weeks of research, letting me research on the actually important topics. It also continues to show me what’s possible in general, and when it starts to fail I know I’m probably moving in a bad direction.

Next steps for the AI track are likely going to be in the permissions system, and ensuring advanced functionality like streaming and various portals work. After that there will only be minor additions to the prototype software.

I’ll end with an update on the human track; progress is going intentionally slowly. I wanted to flesh out the process management in the AI track first before over-committing to what will ultimately be the final structure. The human track has the first steps of the startup sequence, and a much better organized set of utilities and data-management classes. I’m also re-assessing the use of Kirigami/QML for building the GUI, as it just leads to nicer interfaces and I do have some experience with it.

Anyway, that’s the updates so far!

If anyone knows the secrets of WebEngine + Wayland + Nvidia, I’d love to hear. I might assemble some memory benchmarks in the next week or two as well, too. There’s also a .deb package I can produce of the AI track; I wholly would NOT recommend installing it, but if people want to see where this idea is going, or even the AI slop source, I can put it up. But I’ll literally name it the “eatYourCat” deb and put it in the “shootYourDog” repo, and it will be with the express understanding that it’s not fit for use and will not be maintained.

Saturday, 28 March 2026

In the past two months since the previous report we added a new welcome screen, warnings about some potentially expensive mistakes and support for more data sources in Switzerland to KDE Itinerary, among many other improvements.

New Features

Improved welcome screen

The welcome screen shown on the first start of Itinerary has been reworked and now contains the most relevant settings instead of a wall of text:

  • Confirming or correcting your home country if it hasn’t been correctly detected based on the system locale. This is needed for country-dependent warnings to work correctly, such as the features in the next section.
  • Enable online services. Those are all off by default for privacy reasons and the settings page offers very finegrained control over what exactly to use. All that remains the case, but the welcome page now has a quick shortcut to enable all of this in one go.
  • Request permissions for showing popup notifications, on systems where that is necessary, such as newer Android versions.
KDE Itinerary's new welcome page shown on first start with settings for the home country and online services, and confirming notification permissions are correctly set up.
Welcome page

EU roaming regulation warning

When living in the EU roaming regulation area you’ll now get notified when leaving that, as depending on your mobile data plan this can be rather costly when not paying attention.

KDE Itinerary's timeline warning about leaving the EU roaming regulation area when traveling from Germany to Switzerland.
EU roaming regulation area warning

Misleading airport/port name warning

A similarly unpleasant surpise can be ending up at a port or airport in the middle of nowhere rather than close to the city you intended to travel to. Marketing names particularly popular with certain low-cost carriers can be especially misleading, see the naming controversy around (Frankfurt-)Hahn Airport as one such example.

Itinerary can now warn about such locations, with the option to silence the warning per trip or indefinitely.

KDE Itinerary warning about a possibly misleading airport name for an arrival at (Frankfurt-)Hahn Airport.
Misleading airport name warning

The list of warned about locations is currently still manually maintained, and is totally not based on traveling mishaps of community members.

Infrastructure Work

Swiss Open Transport Data APIs

There’s now support for version 2.0 of the OpenJourneyPlanner (OJP) API from opentransportdata.swiss as well as their train formation API.

KDE Itinerary showing a list of upcoming train departures at Bern central station, including delays, occupancy and vehicle amenities.
Upcoming departures at Bern central station

This gives us a couple of additional features and information:

  • Earlier/later paging of journey search results.
  • Transport modes served at stops.
  • Occupancy information.
  • Service alerts.
  • Pickup and dropoff constraints for stops.
  • Coach layouts for trains.
  • Vehicle attributes such as the availability of accessibility or comfort features.
  • Emission information.
KDE Itinerary showing the coach layout and per-coach amenities for a SBB IC1 train.
Layout of a SBB Intercity train

All of this also benefits KTrip.

Kirigami Addons date/time picker localization

The date and time entry controls used in Itinerary received a number of fixes for languages using a right-to-left layout and/or non-ASCII numerals.

Screenshots of the date picker header in two left-to-right and two right-to-left locales.
Kirigami Addons date picker in French, Korean, Arabic and Hebrew.

This benefits all applications using the Kirigami Addons.

Events

In February we had another OSM Hack Weekend in Karlsruhe, with a few features for Transitous being worked on that will eventually also benefit Itinerary.

FOSSGIS-Konferenz in Göttingen is ending today, and included a talk about our OSM indoor router.

And in two weeks I’ll be speaking about Transitous at Grazer Linux Tage.

Fixes & Improvements

Travel document extractor

  • Added or improved travel document extractors for Booking.com, DRK, Entur, European Sleeper, Eurostar, Eventyay, FCM, FRS, Get Your Guide, Hostelworld, MÁV and Thai railways.
  • Improved generic boarding time extractor for Apple Wallet passes.
  • Improved street address matching.

All of this has been made possible thanks to your travel document donations!

Public transport data

  • Trip queries (ie. efficient updates of an existing public transport connection) are now also available with Entur’s OpenTripPlanner instance in Norway.
  • Improved and extended vehicle attribute mappings for a number of Hafas-based backends.
  • Support for Hafas location remarks, providing e.g. stop map links with some Hafas backends.
  • Support for Hafas pickup/dropoff constraints of on-demand services.
  • Fixed coordinate-based journey queries with Deutsche Bahn.
  • Added support for server-side mode filters for stopover queries with MOTIS backends.
  • Made Deutsche Bahn vehicle layout parser more robust against unknown UIC coach numbers.
  • Fixed INVG mode mapping for bus lines showing up as ferries.
  • Fixed elevators being shown on null island on the map.
  • Made path spike filtering less aggressive on low-resolution paths. Fixes e.g. the path of a Barcelona <-> Paris train connection incrementally deteriorating on the map.
  • Expanded Transitous coverage to Greenland, Japan, Morocco and Oman.

All of this also directly benefits KTrip.

Itinerary app

  • More consistent display of delays, by always showing the actual time in full. Avoids having to compute this from delay offsets in your head.
  • Fixed manual flight number entry (bug 516999).
  • Correctly account for the platform label width when eliding stop name in public transport departures view.
  • Word wrap vehicle feature descriptions.
  • Fixed platform section end separator positioning.
  • Fixed doubled lines for flights on the map when using MapLibre.
  • Default to creating a new trip group when importing a named trip group.
  • Set a better default for event entrance times without a start time yet.
  • Also detect osm.org short URLs for importing OSM elements.
  • Retain attached documents from event templates.
  • Handle nested events correctly when computing trip group end times.

How you can help

Feedback and travel document samples are very much welcome, as are all other forms of contributions. Feel free to join us in the KDE Itinerary Matrix channel.

Welcome to a new issue of This Week in Plasma!

This week saw a large variety of improvements in fields as diverse as better support for multi-screen and multi-GPU setups, support for new portals, performance improvements, UI improvements, crash fixes, and more! Lots to get excited about this week:

Notable new features

Plasma 6.7

Implemented a feature that lets you record yourself with your microphone and play it back, making it easy to tell when the recording level is too high or too low. Then you can adjust the level until it’s just right. (Ramil Nurmanov, KDE Bugzilla #435256)

Reworked how the notifications portal is implemented, which, among other things, allows configuring the notifications sent by Flatpak and other portal-using sandboxed apps in the same way that you can configure notifications for traditionally-packaged apps. (Kai Uwe Broulik, plasma-workspace MR #6312)

Frameworks 6.25

KRunner-powered searches can now convert to and from the “momme” unit, which measures weight for silk textiles. (Nate Graham, kunitconversion MR #82)

KRunner converting from 22 momme to 2.816 ounces per square yard and 95.48 grams per square meter

Notable UI improvements

Plasma 6.6.4

The bouncy app launch feedback animation by the pointer now looks better when using a fractional scale factor. (Vlad Zahorodnii, KDE Bugzilla #489403)

Sped up the process for selecting a weather station for the Weather Report widget using the keyboard. (Nate Graham, kdeplasma-addons MR #1016)

You can now drag recent items in launcher menus onto the desktop. (Christoph Wolk, plasma-workspace MR #6431)

The Networks widget now instantly reports the last-used network, rather than only after restarting Plasma. (Aviral Singh, KDE Bugzilla #512951

The Task Manager widget now instantly updates the icon of a pinned or running app whose icon you’ve changed, rather than only after restarting Plasma. (Kai Uwe Broulik, plasma-workspace MR #6443)

Plasma 6.7

The screen chooser UI (e.g. for screen sharing/casting) now features fancier visualizations for screens, showing their wallpapers in the background. (Harald Sitter, xdg-desktop-portal-kde MR #532 and plasma-workspace MR #6409)

Fancier screen chooser dialog

The super-custom folder chooser dialog, seen throughout KDE software, has been removed; now choosing a folder uses the standard “Open” dialog, and it only shows folders. (Akseli Lahtinen, KDE Bugzilla #197938)

Locked Plasma Vaults now have their mountpoints made read-only and badged with a lock icon, so it’s clearer what they are, and you or your apps can’t accidentally save files in there, which would block mounting the vault. (Matthias Pleschinger plasma-vault MR #72)

You can now limit the Wi-Fi band for networks in infrastructure mode. (Piotr Balwierz, plasma-nm MR #536)

Frameworks 6.25

Various message dialogs throughout KDE software now wrap their text at around 70 characters instead of at a point based on the screen width. (Thomas Friedrichsmeier, kwidgetsaddons MR #339)

Notable bug fixes

Plasma 6.6.4

Fixed a case where Plasma could crash when connecting another screen. (Harald Sitter, KDE Bugzilla #477941)

Fixed a case where Plasma could crash when the underlying services for apps with System Tray icons went away. (Nicolas Fella, KDE Bugzilla #518128)

Fixed a case where Spectacle could crash under certain circumstances when using multiple screens. (Vlad Zahorodnii, layer-shell-qt MR #95)

Fixed an issue that could make OBS crash on quit under certain circumstances. (Nicolas Fella, KDE Bugzilla #517599)

The Digital Clock widget’s feature to copy the current date and time to the clipboard in various formats now uses the correct time from your local time zone, not the UTC time. (David Edmundson, KDE Bugzilla #517692)

Fixed some cases of missing transparency in certain apps’ System Tray icons. (Qiancheng Sun, plasma-workspace MR #6427)

Fixed an issue uncovered by the upgrade to Qt 6.11 that applied the wrong color to the window snapping overlay. (Nicolas Fella, KDE Bugzilla #518178)

Plasma 6.7

Fixed an issue that made the System Monitor app and widgets show the wrong names for CPU cores on systems where there’s more than one physical CPU. (Kevin Tipping, KDE Bugzilla #515435)

Notable in performance & technical

Plasma 6.6.4

Blur in Konsole now plays nicely with the Wobbly Windows effect. (Jérôme Lécuyer, KDE Bugzilla #474196)

Plasma 6.7

Screen recordings made using Spectacle and other KPipeWire-using software now use the correct render device with multi-GPU systems, so the resulting recordings are always correct and valid. (Marsh Land, KDE Bugzilla #518008)

Implemented a “multi-GPU swapchain” for KWin, which unlocks future performance gains with multi-GPU use cases and Vulkan support. (Xaver Hugl, kwin MR #8926)

Improved the System Monitor app and widgets’ ability to detect multiple GPUs. (Michael Bauer, ksystemstats MR #130 and #132)

Made the System Monitor app and widgets no longer ignore fully-encrypted disks and RAID elements for the purposes of gathering disk I/O statistics. (Christoph Cullmann, ksystemstats MR #86)

Improved performance for the Alt+Tab switcher while the “Highlight Window” effect is on (as it is by default) and there are a lot of minimized windows. (Sushi Trash, kwin MR #8997)

Wayland 1.48

After over 6 years in development, the Wayland session restore protocol is complete and merged! KWin already has a draft implementation, so we should start to see some serious movement on this long-standing topic soon. (Jonas Ådahl and many others, wayland-protocols MR #18)

How you can help

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

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

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

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

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

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

Friday, 27 March 2026

Hi all! Just finished up the last bit of work for my Season of KDE task of automating data collection for the KDE promotional team.

Since the midterm blogpost I've been assigned no new tasks. That means my final deliverables are a follower/post count scraping script for specific social media websites, a Reddit Insights page scraper that totals weekly insight data for a given subreddit, and an article evaluation script that reads articles found by the Google Alerts system and evaluates their sentiment on KDE and its software.

Follower and post counts scraper

Nothing much has changed here outside of some better error handling, consistency in argument help strings, and improved readability of log messages. The script has run well on its weekly timer and seems to show no signs of giving up. I do think I can improve it by making it more extensible to accommodate the scrubbing of new websites and accounts, but as of now it functions well for the links we're most worried about.

Reddit Insights page scraper

In the prior blogpost I mentioned worries about getting the script to run on a headless server. The script has since been made capable of running headlessly through use of a Docker image which wraps the program run with an Xvfb display server. Xvfb enables this by running display requirements in virtual memory, allowing for the use of headful software in a headless environment.

Shoutouts to Sean Pianka's repo containing dockerfiles used to run Xvfb-wrapped Selenium scripts and Selenium's own Docker images used for Selenium Grid server project. Without those resources it would have taken me a lot longer to hack together the requirements for a Docker image that could run Selenium headfully.

Along with the headless runs being solved, I also implemented plenty of bug fixes and improvements to user-facing messages. Many of the bugs came from not properly exiting Selenium during handled errors which I found out from the server having hundreds of open Firefox instances. Hopefully I've cleaned all those up.

Google Alerts evaluator

This task was a fairly large undertaking involving plenty of research and implementation steps. There were three major requirements:

  • Develop a pipeline to take in Google Alerts emails and pre-process them into articles the model can read.
  • Evaluate lightweight sentiment analysis models that can run on a server for their ability to analyze articles on KDE products.
  • Parse model output into a human-readable and easy to work with data format.

The final result is a pipeline that

  1. Reads Google Alerts emails
  2. Pre-processes the articles into Markdown files for model reading
  3. Feeds them to a local LLM configured to provide sentiment analysis output
  4. Takes the LLM output and sends it into a CSV file (if possible)

You can see how this task could take a lot of time out of people, so hopefully this pipeline can significantly alleviate that time spent.

Google Alerts email reading and processing

This was no issue as Google Alerts are all sent through Gmail and Google itself provides a very useable Gmail API for extracting emails from Gmail accounts. After generating the required credentials, fetching emails was as easy as using tools built specifically for this job in a Python package that contained bindings for the Gmail API in Python. The emails were all formatted in XML, so past experience with webscraping from the last two tasks played a part in making fetching article links from the emails painless to implement. After the article links were extracted from the emails, their contents were then fetched in Markdown format for use with the decided model.

Model evaluation

We very quickly looked towards some local large-language models (LLMs) to serve the sentiment analysis task. There were more than a few sentiment analysis fields that would be difficult for more basic models and it simplified implementation greatly. After the evaluation of some small-footprint models, by far the best at both conforming to the desired output format and performing sentiment analysis on the articles was Qwen3 with 4 billion parameters. It is lightweight enough to run on an older CPU in decent time, and while it doesn't agree amazingly with human judgement it more often errs on the side of caution, such as deciding more articles are related to KDE than aren't which wastes time but doesn't exclude relevant articles.

Designing model output and post-processing

It turns out that LLMs come in different flavors, and some, specifically instruct models, are much better at conforming to instructions than others. Many attempts were made to make other types of models provide output in a strict format and, if you need specific output, it's a headache you should definitely consider avoiding by choosing instruct models from the start.

An instruct model coupled with a well-constructed system prompt (the meta prompt that sets initial instructions for the model) and grammar file written in GBNF format can cause model output to be very predictable. The system prompt written for this task is specifically constructed to bound model output by asking it to output sentiment analysis features in a Python formatted array of strings. Even with the above methods, instruct models still do botch output occasionally, so the script contains plenty of post-processing and error handling steps before model output is processed into the output CSV file.

Experience and lessons learned

I've learned a significant amount about web scraping and how to navigate data troubles. I'm definitely a lot more confident about using developer webtools, HTML processing, and browser automation frameworks as a result of my SoK experience. Also after working on the Google Alerts sentiment analysis task, and I certainly feel more educated on AI topics and how they are used and deployed.

My project was a little unusual in that I wasn't working on an existing KDE software but utility scripts that were built from ground-up for KDE community members. This made things fun through the freedom I had with implementing solutions, but I feel the scripts are not fully developed or as problem-free as possible. I'd hate to just leave them as is while feeling that way, so I'll continue working on the already made scripts as well as new ones so long as I can help out.

Huge thanks to Paul Brown for mentoring me through this project and being a pleasure to work with, as well as the KDE community for hosting this great event. I had a lot of fun working on these scripts and am glad I could help out by contributing something to this awesome community.

Framework machine with logo

Framework supports free open-source software and becomes KDE's latest patron!

Framework manufactures and sells modular computers that are easy to maintain, repair and upgrade. By sponsoring FLOSS projects like KDE, Framework further confirms their commitment to to putting users in control of their machines.

"KDE is extremely popular in the Framework community, and we're excited to help support KDE's efforts to make the best possible Linux desktop." says Nirav Patel, Founder of Framework.

"I am excited to see Framework become a KDE Patron," says Aleix Pol, President of KDE e.V.. "It's a good continuation to our collaboration with different hardware manufacturers and distributors to ensure we can deliver systems to our users with an experience up to our expectations. Furthermore, Framework’s commitment to repairability strongly aligns with our values and is vital for building a more sustainable industry."

Framework joins KDE e.V.'s other patrons: Blue Systems, Canonical, g10 Code, Google, Kubuntu Focus, Mbition, Rocky Linux, Slimbook, SUSE, Techpaladin, The Qt Company and TUXEDO Computers, who generously support FOSS and KDE's development through KDE e.V.