Planet KDE
planet.kde.org.web.brid.gy
Planet KDE
@planet.kde.org.web.brid.gy
Planet KDE site providing newest news from the KDE Project

[bridged from https://planet.kde.org/ on the web: https://fed.brid.gy/web/planet.kde.org ]
This Week in KDE Apps
#### A week full of fixes Welcome to a new issue of "This Week in KDE Apps"! Every week (or so) we cover as much as possible of what's happening in the world of KDE apps. Our End of the Year fundraiser is still going on and we’ve raised more than €140,000 so far this month. Thanks to everyone who donated! Getting back to all that's new in the KDE App scene, let's dig in! ## PIM Applications ### Akonadi Background service for KDE PIM apps Tobias Leupold fixed a compatibility issue with MariaDB 12.1 (25.12.0 - pim/akonadi MR #310) Carl Schwan optimized some maintenance routines from Akonadi; this also fixes an issue when running on SQLite (25.12.0 - pim/akonadi MR #299). ### KMail A feature-rich email application Andreas Hartmetz fixed a bug where mail filters would be deleted in some situations (25.12.1 - pim/kmail MR #164). ## Graphics Applications ### Photos Image Gallery Noah Davis added a setting that allows enlarging small images. Without this option the minimum zoom level is 100% (26.04.0 - graphics/koko MR #251). ## Creative Applications ### Krita Digital Painting, Creative Freedom Luna Lovecraft fixed a crash that occurred when the window was too small to fit a selection actions panel (graphics/krita MR #2548) and also fixed the selection panel blinking when making a new selection (graphics/krita MR #2551). Wolthera van Hövell split the character and paragraph properties, making it more intuitive to apply text transformations to just one character or to a whole paragraph (graphics/krita MR #2470). Joshua Goins fixed a crash in the Krita plugin manager when using Python 3.14 (graphics/krita MR #2451). ## Utilities Applications ### Calculator A feature rich calculator Devin Lin cleaned up the sidebar and removed some custom code. Mobile | Desktop ---|--- | ### Recorder Audio recorder Tobias Burnus made his first contribution to KDE and fixed an issue where the list of audio input sources contained duplicated entries (25.12.0 - utilities/krecorder MR #62). ### Kate Advanced text editor Leia uwu fixed a crash in the project tree view (25.12.0 - utilities/kate MR #1950). ### Keysmith Two-factor code generator for Plasma Mobile and Desktop Shubham Arora fixed an issue where the account name could overflow when it was too long (25.12.1 - utilities/keysmith MR #171). Before | After ---|--- | ## …And Everything Else This blog only covers the tip of the iceberg! If you’re hungry for more, check out Nate's blog about Plasma and be sure not to miss his This Week in Plasma series, where every Saturday he covers all the work being put into KDE's Plasma desktop environment. For a complete overview of what's going on, visit KDE's Planet, where you can find all KDE news unfiltered directly from our contributors. ## Get Involved The KDE organization has become important in the world, and your time and contributions have helped us get there. As we grow, we're going to need your support for KDE to become sustainable. You can help KDE by becoming an active community member and getting involved. Each contributor makes a huge difference in KDE — you are not a number or a cog in a machine! You don’t have to be a programmer either. There are many things you can do: you can help hunt and confirm bugs, even maybe solve them; contribute designs for wallpapers, web pages, icons and app interfaces; translate messages and menu items into your own language; promote KDE in your local community; and a ton more things. You can also help us by donating. Any monetary contribution, however small, will help us cover operational costs, salaries, travel expenses for contributors and in general just keep KDE bringing Free Software to the world. To get your application mentioned here, please ping us in invent or in Matrix.
blogs.kde.org
December 7, 2025 at 7:53 PM
This Week in Plasma: Better hardware support
Welcome to a new issue of _This Week in Plasma!_ This week saw a bunch of user interface improvements and bug fixing, especially for the drawing tablets, printers, and monitors. Hardware is quirky! But of course that’s not all; check out the rest, too: ## Notable UI Improvements ### Plasma 6.6.0 You can now Alt+click/double-click on desktop items to see their properties, just like you can in Dolphin. (Méven Car, plasma-desktop MR #3349) When a printer runs low on ink for multiple cartridges simultaneously, all the messages about this are now condensed into a single notification, instead of showing a separate notification for each low ink cartridge. (Mike Noe, print-manager MR #291) System Settings’ Drawing Tablet page now makes it more obvious when the lack of configurable pad buttons is due to a missing driver. (Joshua Goins, plasma-desktop MR #3234) Spectacle now offers a Cancel button in the rectangular region overlay, so you can get out of it without having to press the `Esc` key. (Taras Oleksyn, bug #490980) Locking the screen from the Application Launcher widget now closes it before locking so it’s not somewhat awkwardly left open after you unlock. (Christoph Wolk, bug #508725) On distros that make you authenticate to toggle the feature to set the date and time automatically, closing the authentication window without authenticating no longer makes the page complain about an error. (David Edmundson, bug #501966) Apps launched from the Favorites view of the Kickoff, Kicker, and Dashboard widgets are now added to the “Recent Apps” section. (Christoph Wolk, bug # 449834 and bug #435356) Did a pass over several pages in System Settings to make sure they follow the KDE Human Interface Guidelines more closely. (Nate Graham, plasma-desktop MR #3309) You’re no longer allowed to try to change the usernames of logged-in users, since this doesn’t work anyway. (Nate Graham bug #469665) You’re now warned about the potential consequences if you try to disable the System Tray’s built-in Notifications widget, since those consequences may not be obvious. (Nate Graham, plasma-workspace MR #6044) ## Notable Bug Fixes ### Plasma 6.5.4 Fixed an issue that made the Orca screen reader’s “learn” mode speak too much and send extraneous keystrokes to apps. (Nicolas Fella, bug #512189) Fixed an issue that could occasionally cause a crash when charging your system after the critical battery level notification appeared. (Anthony Fieroni, powerdevil MR #594) Fixed an issue that made the screen turn black with certain older monitors directly connected via an analog VGA cable. (Xaver Hugl, bug #512146) Fixed another source of the issue that made desktop icons move to the wrong screen of a multi-screen arrangement on login. (bug #512381) Fixed an issue that made it impossible to configure certain buttons of the Wacom Pen Pro 3D stylus. (Joshua Goins, bug #511488) System Settings’ Drawing Tablet page now does a better job of handling weird tablets that say they have two stylii when they really only have one. (Joshua Goins, bug #508084) Fixed an issue that made Plasma inaccurately warn that your printer was low on ink when it sent an unexpected ink level code but wasn't actually low on ink. (Mike Noe, bug #512602) Fixed an issue that made the Task Manager widget’s “Forget recent thing]” menu items unreliable for certain apps. (Méven Car, [bug #480276) Fixed a visual glitch in the Track Mouse effect when using a high DPI scale factor. (Xaver Hugl, bug #510029) ### Plasma 6.6.0 Fixed an issue that made the Task Manager widget’s “Forget” action for specific files only take effect after Plasma was restarted. (Christoph Wolk, bug #503840) ### Frameworks 6.21 Fixed an issue that could crash the open/save dialogs when you double-clicked on a column header while in Details mode. (David Edmundson, frameworks-kio MR #2070) Fixed an issue that could make popups invoked from folders on the desktop misbehave when created from symlinks. (Lluc Simó Margalef, bug #479350) ## Frameworks 6.22 Fixed an issue in the Quick Launch widget that made icons start dragging after right-clicking them. (Jonathan Marten, bug #384009) ### Other bug information of note: * 5 very high priority Plasma bugs (same as last week). Current list of bugs * 37 15-minute Plasma bugs (up from 36 last week). Current list of bugs ## Notable in Performance & Technical ### Plasma 6.6.0 Implemented support for for per-DRM-plane color pipelines. (Xaver Hugl, kwin MR #6600) Plasma now re-checks the battery level after waking from sleep, which handles the case of the battery draining (or charging) while asleep in such a manner that it would be appropriate to show or hide a notification about the battery level. (Ramil Nurmanov, powerdevil MR #592) ## How You Can Help Donate to KDE’s 2025 fundraiser! It really makes a big difference. Believe it or not, the fundraiser has topped €100,000! And that’s just for the fundraiser itself; the yearly donation pop-up has also raised another €100k in just the past five days (!!!). It’s kind of amazing. This money will help keep KDE strong and independent for years to come, and I’m just in awe of the generosity of the KDE community and userbase. Thank you all for helping KDE to grow and prosper! If money is tight, you can help KDE by directly getting involved. 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. 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.
blogs.kde.org
December 6, 2025 at 7:51 AM
KStars v3.8.0 is Released
KStars v3.8.0 is released on 2025.12.03 for Windows & Linux. MacOS release is expected in one week due to build issue on KDE CI infrastructure. For Linux users, it's highly recommended to use the official KStars Flatpak hosted at Flathub. You can install the stable flatpak or try out new features by downloading the KStars Nightly Flatpak for x86_64 and arm64 architectures. ### Live Stacker: LRGB Stacking **John Evans** implemented generation of RGB and LRGB images from individual mono subframes. Watch R, G, B and optionally L directories and combine the individual stacks into RGB or LRGB images. Add directories for R, G, B and optionally L subs. These are monitored and a single color image is displayed. RGB images are combined with a Linear Fit type algorithm.  LRGB images are combined with a LRGB Combination type algorithm. SNR algorithm has been rewritten. Appears to work better but is more resource intensive. ### Live Stacker: ImageMM Stacking Method **John Evans** added an implementation of the ImageMM stacking method. This implementation strikes a balance between speed (it needs to be a Live Stacker) and fidelity. To use: select ImageMM as the stacking method and play with the available controls. This method is considerably more resource intensive than "regular" stacking because it uses an iterative approach. ### Live Stacker: Live Stacker Monitor **John Evans**  implemented the Live Stacker monitor. Live Stacking Monitor window is a popup from Live Stacker that shows a table of subs that match the chosen directory in Live Stacker. The purpose is to allow analysis of Live Stacker, for example to allow investigation of bottlenecks in the stacking process. When a sub is added to the watched directory, the sub is added to the Monitor's table. As the sub is processed by each step of the process information is updated in the table: * Waiting to load. The sub is in the queue to be processed but Live Stacker is busy with other subs. * Loading. The sub is loaded into memory. * Plate solving. The sub is undergoing plate solving (if appropriate). * Waiting to stack. The sub is waiting to be stacked (e.g. currently there are insufficient subs loaded to start a stack). * Calibration. Dark / Flat calibration. * Alignment. * Stacking. Table columns and sort order are configurable. Changing cells can be highlighted (or not) ### Task Queue system Observatory startup and shutdown steps are now replaced by the new highly configurable Task Queue system. The Task Queue System is a modern, flexible automation framework that replaces traditional startup and shutdown scripts with a template-based, configurable task execution system. It provides a visual interface for building sequences of automated operations that can control your observatory equipment through INDI. It is accessible from Ekos Scheduler. **Why use it?  **The Task Queue system offers several advantages over traditional scripting: * **Visual Management** : Build and monitor task sequences through an intuitive graphical interface * **Reusability** : Use pre-built templates for common operations without writing code * **Error Handling** : Built-in retry logic and configurable failure responses * **Device Compatibility** : Automatic matching of templates to available devices * **Progress Monitoring** : Real-time status updates and detailed execution logs * **Collections** : Pre-defined task sets for startup, shutdown, and other common scenarios * **Flexibility** : Combine templates or create custom variations without programming ### Safety Monitor KStars scheduler now fully supports INDI **Safety Monitor** driver released part of INDI v2.1.7. A standalone driver may be used (independent of the equipment profile) that is running on a different INDI server to provide 24/7 safety monitor updates to the scheduler. No observatory operations shall take place unless it is deemed safe by the safety monitor. The INDI Safety Monitor can listen to any number of sources including weather stations, UPS (uninterruptible power supply) monitors, and any auxiliary device that support the INDI's standard SAFETY_STATUS property. ### Push-To Assistant **Wolfgang Reissenberger** added an incredibly useful tool for users with manual mounts: Push-To Assistant. Just attached a camera to your dobsonian and use this tool to center the target in the eyepiece. This tool assumes that both the camera center and eyepiece center are already aligned. The new push-to assistant is intended as plate solving support for mechanical mounts in combination with a digital camera on a finder scope. **Setup** : Create an optical train with the Telescope Simulator as mount and configure your combination of finder scope and digital camera. **Usage** * Start Ekos * open the Push-to Assistant located in the Tools menu * move your scope as good as possible to the target you want to find * select the target from the catalog or enter its coordinates manually and press "Select target" * press "Solve position" to determine the position your scope is currently pointing at * as soon as the position has been solved, the assistant displays hints in which direction you should move your mount to be closer to the target * correct your mount position and press "Solve position" again if you want to automatically repeat plate solving, configure the delay and press the "Repeat" button. ### Bug Fixes * Fix crash when connecting to remote host because the clientManager was not set. * When restarting capture, update job captured frame map from module state. * Fix issue with J2000 getting set by default in Mount Control Panel. * Fix regression where capture format and encoding are reset whenever they are changed in INDI. * Use the offline HIPS path since it can be a custom location * Prevent premature alignment run if there are no more light frames in the job * Do not cover dust cap when capturing sky flats. * Fix setFrame when loaded from XML as DARK was incorrectly decoded as BIAS frame. * Remove parents from constructors of objects pointed to by QSharedPointer * Fix issue in FITS Solver, need to disconnect signals in callbacks * Fix bug in one-pulse-dither, update logging * Fix issue in analyze stats font size * Placeholder %cam removed
knro.blogspot.com
December 4, 2025 at 12:26 AM
Last Two Weeks in KDE Apps
#### Performance improvement in Krita, Trust and Safety in NeoChat and files actions in Photos Welcome to a new issue of "This Week in KDE Apps"! Every week (or so) we cover as much as possible of what's happening in the world of KDE apps. We are still doing our fundraisers and in the past 48 hours, thanks to the crazy support from our users we managed to raise more than €90,000. Keep it going and if you can afford it, donate at kde.org/donate! Any amount helps. Getting back to all that's new in the KDE App scene, let's dig in! ## Travel Applications Volker Krause published a blog post about the current progress of KDE Itinerary in October and November. This includes an improved journey search page, fine-grained deletion control of tickets, altitude information in the live status view, and more! You can read all of that on his blog. ## Grapics Applications ### Okular View and annotate documents Mohammad Kazemi added a “Copy Without Line Breaks” action to remove line breaks when copying text (26.04.0 - link). Quinten Kock added native pinch gestures with a touchpad in Okular (26.04.0 - link). ### Photos Image Gallery Noah Davis added more standard file actions in Photos when viewing a picture (26.04.0 - link). ### KPhotoAlbum KDE image management software Randall Rude made the metadata extractor also extract the creation date and time for videos (link). ## Creative Applications ### Krita Digital Painting, Creative Freedom Agata Cacko improved the performance of the Liquify Transform tool making it a lot more smooth to use (link). Agata also added a knife tool prototype to Krita (link). Joshua Goins removed the error dialog when cancelling an export (link). ## Utilities Applications ### Konsole Use the command line interface Matan Ziv-Av added two keyboard actions in Konsole for focusing on the next/previous view in split view mode (26.04.0 - link). Sune Vuorela added an option to enable or disable whether Konsole listens to zmodem terminal codes, which might happen accidentally when outputting a binary file. (26.04.0 - link) ### Kate Advanced text editor Héctor Mesa Jiménez added some default configuration for netcoredbg, a standalone debug server for .NET Core. (26.04.0 - link) ### Alligator RSS feed reader Oula V improved the feed group feature of Alligator. Now when creating a feed group, you will get an error if another one exists with the same name. They also cleaned up the list of feed groups (26.04.0 - link). Oula also fixed some crashes in Alligator after editing a feed (25.12.0 - link) and Stephan Seitz fixed some conformance issues with the OPML export feature (25.12.0 - link). Salvo Tomaselli reordered the buttons in the menu, and now opening the current article in an external browser is the first button (25.12.0 - link). ## System Applications ### Dolphin Manage your files Alex Hermann made KIO-powered applications like Dolphin keep the permissions of files copied from an SFTP server (link 1, link 2, link 3). ## Social Applications ### NeoChat Chat on Matrix Joshua Goins continued efforts to improve Trust and Safety in NeoChat and added support for reporting rooms and users (26.04.0 - link). "renner 03" fixed the KRunner integration of NeoChat when running the application in Flatpak (25.12.0 - link) ## Browsers ### Konqueror KDE File Manager & Web Browser Stefano Crocco added a configuration page to configure Speed Dials in Konqueror. These speed dials are buttons that allow you to quickly open pre-configured links (26.04.0 - link). ### Falkon Web Browser Juraj Oravec added support to add items in the sidebar menu to the Falkon plugin API (link). ### Angelfish Webbrowser for mobile devices Rinigus Saar fixed an issue with retrieving the last visited entries (25.12.0 - link) ## PIM Applications ### Trojitá IMAP E-mail Client Sandøy Hustad started pushing some work to make Trojita support Qt 6 (link). ## Third-party Applications ### Deskflow - Keyboard and mouse sharing app Chris Rizzitello released Deskflow 1.25.0! The main changes are support for a symbolic tray icon which is recolored correctly even when using Plasma's Twilight theme; support for changing the application's language without restarting it; and initial support for the wl-clipboard Wayland protocol. ### EasyEffect Giusy Digital continued working on unifying the wording of the various physical units (e.g. dB, Hz, ...) all over the application (link). Wellington Wallace ported some overlay sheets to Kirigami dialogs (link). ## …And Everything Else This blog only covers the tip of the iceberg! If you’re hungry for more, check out Nate's blog about Plasma and be sure not to miss his This Week in Plasma series, where every Saturday he covers all the work being put into KDE's Plasma desktop environment. For a complete overview of what's going on, visit KDE's Planet, where you can find all KDE news unfiltered directly from our contributors. ## Get Involved The KDE organization has become important in the world, and your time and contributions have helped us get there. As we grow, we're going to need your support for KDE to become sustainable. You can help KDE by becoming an active community member and getting involved. Each contributor makes a huge difference in KDE — you are not a number or a cog in a machine! You don’t have to be a programmer either. There are many things you can do: you can help hunt and confirm bugs, even maybe solve them; contribute designs for wallpapers, web pages, icons and app interfaces; translate messages and menu items into your own language; promote KDE in your local community; and a ton more things. You can also help us by donating. Any monetary contribution, however small, will help us cover operational costs, salaries, travel expenses for contributors and in general just keep KDE bringing Free Software to the world. To get your application mentioned here, please ping us in invent or in Matrix.
blogs.kde.org
December 3, 2025 at 4:48 AM
October/November in KDE Itinerary
In the past two months since the last post, KDE Itinerary’s journey search UI got simplified, you got more control over deleting individual entries and altitude information is shown on the live status page when available, among many other things. ### New Features #### Improved journey search page The interface for manual public transport searches as been simplified. Filters for specific modes of transportation are now on a secondary page, and you don’t have to specify a trip to add the results to in the first step anymore. Instead, that’s now queried when actually saving a result. Simplified journey search page. #### Fine-grained deletion control For multi-ticket or multi-traveler reservations, it’s now possible to delete just individual tickets or travelers rather than the entire entry. Multi-ticket deletion dialog. #### Altitude information in live status view The live map on services with the corresponding onboard API now also shows the current altitude information when available. Live train position with altitude. ### Infrastructure Work #### Automatic geocoding for reservation data For many of Itinerary’s features to work properly we need to know geo locations of the involved places, such as departure and arrival stops of a train trip. In many cases we get those from being able to recognize stop identifiers found in e.g. ticket barcodes. There’s a bunch of heuristics as fallback (such as knowing in which areas a train company operates), but that’s also not covering all cases. To address this properly, Itinerary can now resolve those remaining locations by using OSM’s geocoder Nominatim. As this involves querying an online service, this is conditional on having online data sources enabled in the settings, same as for querying for delay information. #### Transitous upgrade to MOTIS v2.7 Upgrading MOTIS, the software behind Transitous brought us a number of new features, with the following ones particularly relevant for Itinerary: * State and positions of currently available rental vehicles such as bikes and scooters can now be queried. * Support for GBFS station booking URLs. * Support for multiple language preferences. That means that secondary languages are now also considered when picking the best option for multi-lingual content such as disruption notes. * Location searches include the modes of transportation served at stops now. Itinerary's station map showing a car rental station and two free-floating rental bikes. #### Android platform support KDE’s Android build infrastructure (which Itinerary relies on) has been updated to Android’s NDK r28, which enabled compliance with the 16kB page size requirement enforced by the Google Play Store since November 1st. While this is something that went mostly unnoticed by users, the next required update (to Qt 6.10) is unfortunately going to have some more side-effects. For the first time in many years this will require a higher minimum Android version, going from currently 21 (Android 5, from 2014, 99.8% cumulative use) to then 28 (Android 9, from 2018, 91.7% cumulative use). This means any newer build of any KDE Android app would no longer run on anything older than Android 9. It’s unclear how many of our users would be affected by this, but it unfortunately does look like we have very little choice here beyond delaying this a bit. If you have thoughts or feedback on this, feel free to join the KDE Android Matrix channel. ### Events There also were several events with Itinerary-adjacent topics in the past two months: * The Open Transport Community Conference in Vienna. * Two OSM Hack Weekends in Berlin and Karlsruhe. Itinerary also got mentioned in the whirlwind tour through the land of Wikidata-powered_apps at Wikimania in Nairobi. And more is coming up, members of the Itinerary and Transitous teams will be at 39C3 end of December in Hamburg, Germany as well as FOSDEM at the beginning of February in Brussels, Belgium. ### Fixes & Improvements #### Travel document extractor * Added or improved travel document extractors for Booking.com, CFR, citycity.se, Comboios de Portugal, Eurostar, Flixbus, FooEvents, GlobalTicket, Inviton, MÁV, NH Hotels, Predpredaj, Prioticket, Ryanair, TicketCounter, United, Ventra, Wiener Linien and ZSSK. * Consider bus stations and try harder to discard freight terminals when locating airport entrances. * Ignore seat qualifiers (“window”, “aisle”, etc) when comparing seat numbers. * Merge common parts of all elements of the same incidence such as a multi-ticket booking. * Consider names with swapped given/family name as equivalent as well All of this has been made possible thanks to your travel document donations! #### Public transport data * Add a vehicle feature flag for night trains (supported with MOTIS and Hafas backends). * Add support for agency/operator URLs (supported with MOTIS and OTP backends). This can be useful as this is the most widely available way towards actually booking something at this point. * Improved onboard API support for Frecciarossa and RailJet trains. * Improved performance of the location search page. All of this also directly benefits KTrip. #### Itinerary app * Editing now affects the currently selected reservation in a multi-ticket or multi-traveler batch. * Only load reservation data for the current trip group. * Re-add the top-level import action. * Fix performance issues and hangs when displaying journey search results. * Fix online updates for standalone Apple Wallet pass tickets such as Zügli D-Tickets. * Fix timer overflow in transfer monitoring with Qt 6.10. * Adding a journey search result when there’s no existing trip will now directly ask to create a new trip. * Fix updating platform information from scheduled online data in case the platform in the original ticket was wrong. ### 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.
www.volkerkrause.eu
November 30, 2025 at 10:14 AM
KDE @ IndiaFOSS 25
Its been quite a while since I attended the IndiaFOSS 25 event late September. I have been meaning to write the blog post for a while but didn’t get time. A lot has happened since then, I have moved continents and am now in Germany pursuing my masters at Philipps University of Marburg. I’ll write lot more about my new experiences in Germany in upcoming blog posts but for now back to IndiaFOSS 25. This was a very exciting event for me since this was the first time I was representing KDE booth at a conference. This event occurs yearly in the city of Bangalore which is also known as the Silicon Valley of India. I discovered IndiaFOSS after watching a talk by Kovid Goyal, creator of Calibre and Kitty - two programs I have used heavily in my day to day life so regardless to say I was excited about the conference. ## Day 0 Nearby area of bangalore airport as seen from the sky I arrived a day before the conference in Bangalore and met with Bhushan at the airport as we continued our journey towards the city. The Kempegowda International Airport is located outside the city about 40km north of Bangalore’s city center. It took us around 2 hours to reach the airbnb I was sharing with the my friends who were also attending the event. After encountering the much dreaded city traffic jam I took a much needed rest and spent my rest of the day exploring the area of Jayanagar and Indiranagar. ## Day 1 I spent most of my time at the booth and met a lot of people who were already using KDE software, specifically from the state of Kerala. It was made popular through the ICT initiative. I have to be honest here, I did hear about this initiative from Subin earlier this year at cki25 but didn’t know it was this widespread. Booth photo with Bhusan and Advaith with Raspberry Pi running KDE Plasma powering the TV screen behind them. There was general amazement among the booth visitors when we showed them KDE powered Laptops, mobile phones, steamdeck and even a rasberry pi powering the giant tv screen at our booth. The steamdeck was the most popular device at the booth since its still not officially available in India. Some people already knew about the steamdeck while others who didn’t were amazed to find out that gaming on handheld that too on a linux powered device had come such a long way. Booth photo with me and Advaith Some of the people who we met at the booth were also interested in helping us spread the word and gave us testomonials which I have forwarded to Aniqa. Additionally we were able to help few people with creating their invent profiles and there were others who showed interest in helping out with code contributions and translation support. Few also asked about India specific KDE events and we were happy to tell them about Conf KDE India (cki 25). Booth attendee doodling with Krita We also connected with James Reilly from AlmaLinux (can be reached on Matrix), who is looking for a KDE Community member to create a KDE bootc-image built on CentOS base and has also offered to mentor a new contributor in tackling this project. KDE x Inkscape Our booth was also located right next to Inkscape’s booth and seeing Rishi make Konqi on Krita led them to battle it out to see who can make a Konqi faster. It was a friendly battle ofcourse and all of us enjoyed the drawing contest complete with cheer and laughter. It was a pretty eventful day and we met a lot of users of KDE software at our booth. ## Day 2 The second day of the conference saw the attendance dwindle a bit but this also gave me a chance to checkout the other booths. Some of the most interesting ones that I found were (in no particular order):- ### Mecha Comet Mecha Comet Internals Breakdown It is a handheld modular Linux computer. It has a magnetic snap interface powered by a standard GPIO serial port which allows hardware extensibility. Additionally Its made up of repairable and recyclable parts. The particular distro that it runs is called Mechanix OS, which is based on Debian. It packs in a PCIe 3.0 M.2 B-Key, Wifi 6, a dedicated Secure Element (CC EAL 6+) for security with a 3.92 inch screen. The project is still in Kickstarter phase but its definitely one of the most exciting projects I found at the conference. You can find more about the project here. ### SFLC India SFLC Logo Software Freedom Law Center, India is a donor supported legal services organization that promotes Open access to knowledge, Free Speech, Online Privacy, Innovation and Equality. It was because of them, I became aware of the dubious practices surrounding DigiYatra’s mandatory biometric data collection in India. Unfortunately, at the time I had already surrendered my data as I was forced to comply, otherwise the airport staff denied me entry. SFLC India at the time had started a huge social media campaign against this and had even gathered huge media attention to bring a change against this. Sadly, the DigiYatra gates still exist but are atleast no longer mandatory. If you wanna know more about them, you can visit them here. ### Absurd Shop CoryDora DIY keeb assembled by my friend Manik Rana I found their CoryDora DIY Kit to be an interesting project, a fully opensourced 3x3 macropad with hotswappable switches. You can use it to control media, set-up scripts and write macros. A nice project if your just starting with soldering and still getting the hang of things. You can find the CoryDora DIY kit here. ### PCB CUPID They provide opensource pcb and sensors at affordable prices and also have guides and tools for you to test and play with. Growing up I always wanted to tinker with pcb boards and build with them but always found the boards out of budget so seeing them change this, is definitely for the positive. ### OpenstreetMap India OpenStreetMap India logo I was happy to see a thriving presence of openstreetmap indian community, I have volunteered in two of their Delhi meetups previously where I got to know how to map data and mapped areas around lesser known of parts of Delhi so it was nice to see some familiar faces. and there were many more… unfortunately I can’t cover all the interesting booths that were there at the conference but regardless to say there were plenty! ## Final Thoughts KDE India users, contributors and booth volunteers together All in all, I enjoyed my stay at Bangalore and was happy to meet the oss enthusiasts from all over India. I was lucky to get a chance to represent KDE at IndiaFOSS and meet with its diverse users and hopefully future contributors. I would also like to thank KDE for making this possible by sponsoring my travel for the event.
chucklesdroid.xyz
November 27, 2025 at 8:50 PM
How do we keep apps maintained on Flathub? (or building a more respectful App Store)
There have been a few discussions about what Flathub should do to push developers to maintain their apps on the latest versions of the published runtimes. But most of those lack important details around how this would actually happen. I will not discuss in this post the technical means that are already in place to help developers keep their dependencies up to date. See the Flathub Safety: A Layered Approach from Source to User blog post instead. The main thing to have in mind is that Flathub is not a commercial entity like other app stores. Right now, developers that put their apps on Flathub are (in the vast majority) not paid to do so and most apps are under an open source license. So any discussion that starts with “developers should update to the latest runtime or have their apps removed” directly contradicts the social contract here (which is also in the terms of most open source licenses): You get something for free so don’t go around making demands unless you want to look like a jerk. We are not going to persuade overworked and generally volunteer developers to update their apps by putting pressure on them to do more work. It’s counter productive. With that out of the way, how do we gently push developers to keep their apps up to date and using the latest runtime? Well, we can pay them. Flathub wants to setup a way to offer payments for applications but unfortunately it’s not ready yet. So in the meantime, the best option is to donate to the projects or developers working on those applications. And make it very easy for users to do so. Now we are in luck, this is exactly what some folks have been working on recently. Bazaar is a Flathub first app store that makes it really easy to donate to the apps that you have installed. But we also need to make sure that the developers actually have something set up to get donations. And this is were the flatpak-tracker project comes in. This project looks for the donation links in a collection of Flatpaks and checks if there is one and if the website is still up. If it’s not, it opens issues in the repo for tracking and fixing. It also checks if those apps are using the latest runtimes and open issues for that as well (FreeDesktop, GNOME, KDE). If you want to help, you can take a look at this repo for apps that you use and see if things needs to be fixed. Then engage and suggest fixes upstream. Some of this work does not require complex technical skills so it’s a really good way to start contributing. This is probably one of the most direct way to enable developers to receive money from their users, via donations. Updating the runtime used by an app usually requires more work and more testing, but it’s a great way to get started and to contribute to your favorite apps. And this is not just about Flathub: updating a Qt5 app to run with Qt6, or a GNOME 48 app to 49, will help everyone using the app. We want to build an App Store that is respectful of the time developers put into developing, submitting, publishing, testing and maintaining their apps. We don’t want to replicate the predatory model of other app stores. Will some apps be out of date sometimes? Probably, but I would rather have a sustainable community than an exploiting one.
tim.siosm.fr
November 24, 2025 at 12:11 PM
Text Tool Phase 3
When I started work on the text tool, I had planned it in three phases. The first phase was going to be the on canvas editor. And I handled inserting and removing text, moving the cursor around, and creating simple wrapping areas. IME support and simple copy-paste was also handled during this phase. The second phase was about rich text editing. I created a text properties docker, implemented a font database, style presets, a glyph palette and went over each property individually to make 100% sure it worked. I wrote a bunch of blogposts about this in the past (text layout, fonts, OpenType, metrics, and more). Which brings us to phase three… ## Removing the old Rich Text editor and shortcuts. Previously, Krita used a dialog to allow rich text editing. The dialog happened because after several years of working on Calligra (which Krita was part of for a good while), none of the core devs were confident in their ability to conjure a full-featured on canvas rich text editor in a short amount of time. Then, the plan became to have a SVG source editor as the main way to interact with text… But then we realized that SVG text is very verbose, even compared to the pretty verbose HTML. Furthermore, we only had a few weeks left, so we had to quickly put something together that could produce SVG output without being too alienating. The old rich text editor window, next to the preview on-canvas. In a dark mode, the theming issues become especially prevalent, here the text is black both in the editor as in the preview, but the background is dark grey. This was one of the core headaches with this editor. It’s interesting to reflect back on this, we had assumed at the time that the artists using our program would be quite technically competent. Over the past few years however Krita has picked up so much steam that it frequently ends up being the program to teach people that there’s such a thing as “working memory” and that one can run out of said memory when they, for example, try to make a 60 fps animation at 4K resolution. The rich text editor also didn’t help matters here because the conversion to and from SVG text wasn’t optimal: SVG 1.1 doesn’t have a concept of lines or line wrapping, being more a graphical description format like PDF than say, a rich text document. Furthermore, there were endless issues with theming, font size handling, differences between Qt’s rich text implementation and HTML overall, fonts, you name it. So, given that the first two phases left us with a functional on-canvas text editor that can style text, it felt good to remove the rich text editor. The source editor remains, because it can still do some advanced tricks if you know SVG very well, but for the vast majority of text tasks it is unnecessary. That left the shortcuts. Because the rich text editor was implemented with KXmlGui, each of the entries in the toolbars was a QAction that could be configured. I went and implemented the majority of those as shortcuts in the text tool. Because the majority of these shortcuts just changed a single property value, I took inspiration here from how the old artistic text tool was implemented, which is to say, using the setData() function on QAction. The setData takes a struct that contains simple instructions on which property to edit, and how to edit it (increase it, or set a specific value, for example), and this is then used to test the toggledness on the action or generate the appropriate property setting command. The shortcuts are a little interesting in that the text tool needs to do its own shortcut matching, instead of using the global system. This is because the text tool needs to be able to discern text input from shortcuts, as well, all QKeySequence::StandardShortcuts for text navigation and selection have been implemented directly into the text tool. The latter needed to be handled directly because if you are working with vertical text you will want to have the up/down keys be for navigating forward/backwards in the text. In practice, this means that the tool first tests non-modifier arrow keys and basic input. Then it checks the direction and writing mode of the text, and ensures that any directional keys get replaced by their expected variants for said direction and writing mode. It then checks the shortcuts and finally the standard sequences. This latter order is because some standard sequences use the same shortcuts that are typically reserved for property changes (for example, deleting a line and setting underline can both have the `Ctrl + U` shortcut). Only a few pre-existing shortcuts are supported right now, because I was feeling the end of the project looming. It is also a very good starting point for people who are interested in hacking on the text tool, as it makes you think about how the text properties function, so I have left it alone for now. ## Replacing the tool options. Next up was replacing the tool options. Tool options within Krita are specifically for changing the behaviour of the current tool, as well as accessing extra functionality, and Krita’s text tool had one that allowed you to set some properties for _new_  text creation, as well as accessing the separate editing dialog. The old tool options with a “create new text with” group of widgets and an “Edit Text” button. This was a QWidgets based UI element, and one of the things I’ve been doing with the text tool is that every UI element would be written in primarily QML, using QWidgets only as a fallback. Beyond that, we’ve been trying to use Lager to keep track of data-editing, and tool configuration is a good candidate for a lager model. The new options are both longer, because there’s more toggles, but at the same time also simpler to use… As for the options themselves. Like the old options, they allow selecting the default text that new texts are being created with. However, instead of replicating the text properties docker in its entirety, it now provides a drop down to select a style preset. Beyond that, there’s a toggle to use the current presets in the text properties docker. The text properties docker itself also has a button to open it inside the tool options. This is because I observed multiple people trying to use the “new texts are created with” options (that _were_  labelled as such) in the old widget to manipulate the selected text. Hopefully this’ll guide people to the text properties docker. Then, there’s the two options for the text tool itself: “Paste Rich Text By Default” and “Use Visual Cursor”. The former is about whether `Ctrl + V` should paste the rich text or the plain text, while there’s separate actions for pasting plain or rich text explicitly. For some reason the majority of word processors always paste rich text by default and never allow you to configure this, even though this is not how anyone wants to use a word processor. It therefore made sense to make this a toggle. The other is for bidirectional text. The default is the “logical” order of the bidirectional text, that is, the order in which you read it. This has always been a little bit of a headache to programmers, because you end up with a cursor that skips positions and will in some cases go into the opposite direction of the key you’re pressing. This is why a lot of programs offer a “visual” cursor, which will try to follow the direction the keys are pressed in. This too is configurable, as it depends per person which of the two is more intuitive. Finally, there’s several buttons, some for opening the dialogs like the Glyph Palette or the Source Editor, others for toggling Type Setting Mode and finally a set of buttons for the converter actions. More on these latter two in a bit. Annoyingly, QML cannot handle popups properly while used together with a QQuickWidget: the popup is clipped by the QQuickWidget bounds (specifically, it’s internal QML scene). In Qt6 there’s a toggle to not have Pop ups clipped to the scene, but that crashes in QApplication when used inside a QQuickWidget. This is a problem because it makes it hard to provide the style preset dropdown (or the font dropdown for that matter). I am trying to find a solution, but in the meantime I’ve made the delegates much smaller. The CSS style presets now have much more compact delegates to handle being inside a dropdown. I hope I’ll be able to fix the pop-up problem in the coming weeks though, as this is kinda annoying. ## PSD text and vector support. This was a somewhat tangential project, and I had written most of it even before I had written the on canvas text editor. PSD vectors are stored as a vector mask on a fill. Because I had previously already written support for the fills, supporting vector masks meant supporting vector shapes. Then, figuring out which layer data describes the stroke, and which describes ‘meta shapes’ like rectangles, ellipses and stars was the rest. The vector masks, in particular PSD’s path format, are interesting in that they have a particular floating point format. Luckily, Scribus already supported loading those paths, so I was able to reference their parsing code and concoct writing code based on it. Most of the work by far was making sure the transforms were 100% correct. I was helped here by Deif Lou, who provided me with a ton of test files to check against. Text was not as simple. Text in PSD is stored as a PDF structure, which, if you are unfamiliar with PDF, is format not dissimilar to JSON. You can see the way text is stored by opening up a PSD with text as a text file in a given simple text editor. Unlike most PSD data, which is stored in binary (and is best inspected with a hex-editor), the text data is largely stored as ascii text (with actual strings being stored in 16bit BE). Some inspection reveals that the text itself is stored in a range based manner. The whole plain text is written at the start, and then a list of character “sheets” is presented. After all those, a list of numbers of equal size, each presenting what range is occupied by the sheet with the same index. Idem for paragraph properties (PS, unlike SVG 2, can have multiple paragraphs. SVG 1.2 did have multiple paragraphs, but there’s only one real implementation of SVG 1.2 (Inkscape) due its complexity). PSD text is also, notably, stored and sized in pixels, regardless whether the format is saying points (this is because within the Apple ecosystem the two units are the same, while outside it, a digital point is always 1/72th of an inch). But there were still a number of mysteries. Like, where were the text paths stored? And how about the advanced OpenType features? After I asked on Krita-Artists for sample files, I found the answer: There’s another chunk of advanced text data at the end of the document. This second chunk is far more complex, and, worryingly, it uses numbers for the keys for more recent versions of the Adobe products. Thankfully, it turns out that this second chunk is in fact shared between the Adobe suite, and the Inkscape project had already done a lot of reverse engineering. While I am now able to read this data and load text from it, there’s still some missing information. It seems there’s like, Line and Cluster-specific positioning and glyph info present in this extra data, and if you write it without said data, Photoshop will complain it is missing. I haven’t had the time to look into this properly, so we can’t write advanced text objects as of now. Another wrinkle is that text and vectors are per-layer in PSD, while in Krita each vector layer is its own SVG document. So I also had to write some code to explode the Krita vector layers so each shape is written as a separate PSD layer. Similarly, despite being able to load a lot, Krita’s SVG+CSS based text layout is fundamentally different from Adobe’s, so text loading isn’t perfect. None the less, it should provide valuable for people’s archive. Because of these differences, Krita will ask whether you want to load the text layers as text shapes or whether you want to load them as raster data. I do want to eventually return as figure out that final missing data. As well, because PSD doesn’t do inheritance, I need to fiddle a bit with selecting which properties to set on the paragraph, as the paragraph metrics are important for Krita’s baseline aligment. ## Text on Path/Text in Shape. Text on path and text in shape were actually going to be tackled in the first phase. But then when Alvin, who was helping me, tried to take a stab at it, he was blocked because Dmitry was extremely unsure about the design. This was a bit frustrating, because I had already made sure that the layout algorithms for both worked fine. I myself decided to focus on getting rich text editing to work, and it wasn’t until I was nearly done with rich text editing that we returned to the discussion about text on path and text in shape. I never talked about text in shape previously, as it was implemented after I wrote the big text-layout blog post back in 2022. So lets do that now: The current look and feel for a complex text-in-shape while editing the text. Yellow ellipse, pink triangle and blue polygon are “Inside” shapes. The green rotated rectangle is a “subtract” shape. Both shape padding and margin are applied. The arrows indicate the order of the flow shapes. Icon on the top right is a button for contour mode. SVG 2 allows wrapping text in shapes, and has some sophisticated toggles to configure how the text is flown into shapes. The simplest is a single text in a single shape with a single subpath. However, those single shapes can handle multiple subpaths (in which case the line is broken up), and there can be multiple shapes that text can flow into, one-by-one (much like CSS columns). These flow areas can in turn have other shapes subtracted from them. Finally, shape padding and margin can be used to modify the distance of the text to the related shapes. Most text-in-shape layout algorithms will do so by taking the shape, drawing line boxes from top to bottom, and fitting the text in the first reasonable line box. This is what SVG 1.2 specified for it’s text in shape. For SVG 2 however, the first line needs to sit snugly against the border of the text wrapping area. For this I implemented an algorithm described by Hans Muller, originally devised for CSS shapes. Once we have the first position, we want to create a line box. One problem here is the question “how tall is the line box?”, especially in rich text: Text can have different font sizes, and different font sizes can lead to different line widths, depending on whether those differently sized sections get onto the line or are wrapped to the next. The solution here is to estimate the line height: We check all glyphs that might fit in the next shape-bounding-box width (or height for vertical), and get the max line height from this. Then, the line box is determined, with a single line being able to hold multiple line fragments if the shape boundaries cut through the line. Text is then laid out onto these lines (logically if we take bidirectional algorithm into account), breaking where it is allowed. Finally, text is reordered so it lays out visually, text alignment and justification takes place, and the final line height is calculated. The whole text is then shifted (block wise) upwards by the difference between the estimated line height and the actual line height. I was able to figure out this solution because I kept trying to figure out what Inkscape was doing here, and was able to induce a bug that suggested it does something similar. Said bug got reported. Some oddities are present in the SVG 2 spec here. For one, it doesn’t ever say whether to include the local transform of the shapes that is being flowed into. Text on path _does_  require this, and usage would become incredibly annoying without it (if you want to flow text into two rectangles, you will need to apply a transform to one of them), which means it _is_  expected, but its absence is very odd. Inkscape _does_  do this, so I implemented this as well. Another thing that can be odd is that because the shapes get _linked_  to the text shape, it is possible for the text to be rotated and be out-of-sync with the linked shape. The only way to have both rotate together is when they are in the same group. In the context of SVG this linking behaviour makes sense. You can easily imagine a magazine layout where a few rectangles provide columns, and a pull-out quote is laid out into a circle. Said circle then overlaps these rectangles, without overlapping the text. However, while that makes sense in a magazine context, there was a worry that it might be too complex to interact with. Especially because Krita doesn’t have an object outliner like Inkscape or other specialized vector applications have, so going in and out of groups can be frustrating. Eventually we decided to make it so that Shapes that text flows into is always a child of said text. The text is then stored as a group with shapes and text inside SVG, making it 100% compatible with Inkscape, while within Krita we could simplify the interaction, while keeping all the powerful transformation features. There’s a downside to this method though: When we resize text in shape, we resize the child shapes. However, the child shapes affect the slow text layout (in particular, the shape-offset operations, which are quite slow), but because the child shapes are children of the text, it becomes next to impossible to update this text independently from the resized shapes. Very frustrating because I did pay a lot of mind to keeping the text layout thread-safe, so had we stayed with a linking model, the text shapes could’ve just been sent to another thread to sort themselves. Thankfully Dmitry decided to take responsibility for taking care of this slowdown. We now block text layout during resizing and update it after the fact. Because of the way bounding rects are calculated however, this does mean we cannot afford to have any text drawn outside the text shapes, which means we’re forced to have our overflow to be always clipped (and truthfully, there’s no clear answer to what overflowed text should look like with SVG 2 anyway, so maybe it’s for the best…). UI wise, the simplest way to set text in shape is by clicking a shape. Clicking on a border will instead set the text on path, and set the click location as the starting point. This is necessary because right-to-left text needs to be aligned with the end of the path due the way text on path interacts with text anchor in SVG. The less simple but advanced manner is to use the context menu in the Shape Selection tool to flow texts in Shape. This method allows for setting up a complex flow structure. Similarly, the default tool allows changing the flow shape order, and setting subtract shapes. Both this and the previous method are ways in which such shapes are set up in other programs, so people should be able to find either without consulting the manual. When a text-in-shape or text-on-path is created, a new button appears that can be clicked to go into contour mode. There, each contour shape can be manipulated as needed. Within the text tool, text on path gains a handle to move the start offset, while text in shape allows dragging the text area to set the shape padding and margin. Text-on-path doesn’t have an advanced mode like text-in-shape, right now artists will only be able to create texts with a single text path. However, Krita’s text layout _can_ handle multiple text paths in a single text, and even a mix of text and positioned paths. That kind of thing is currently limited to the SVG source editor, as I ran out of time to ensure that the interaction would be nice. Something for the future. ## Type Setting Mode Type setting mode is a separate mode in the text tool that allows for on-canvas fine tuning and interaction with font metrics. It differs from regular editing mode in that it will show editable font metrics when activated. When the text doesn’t auto wrap, it even shows handles so that the SVG character transforms can be modified over the selection. Type Setting Mode is kinda interesting in that at first glance it seems like an unnecessary toy mode. After all, if you want to edit the font size, the text properties docker is much more suited, right? Yet, when gathering input about what artists needed from the text tool, some expressed that they wanted to be able to edit things like font size and line height by on canvas widgets. Others protested: it would interfere with text editing, which seemed a reasonable concern. So it was clear that if such a thing would be introduced, it needed to be optional. Then there was the issue of the Baseline features. Krita is currently one of the rare text layout implementations that implements alternate baseline alignment. But the baselines are kind of abstract, especially as font makers rarely fill out the OpenType BASE table from which these baselines are derived, meaning they frequently have to be synthesized. So there was also a need to allow people to see the available baselines on canvas. But there was one final issue. Let’s talk about kerning. If we conceive of text as being comprised of glyphs, and each glyph can fit onto a little rectangle, like in (movable type) print, and we imagine printing with this. Then it’s very likely that there will be huge gaps between the glyphs while printed. Therefore, font makers would make the base rectangle smaller and let parts of the letter overhang, a so-called “kern”, so the glyphs would interlock a bit more elegantly. Movable type was never the only text printing technology. For posters for example, lithography was widely used, and the text printed with lithography was typically hand drawn by the artists. This meant that artists would be able to manually decide the best spacing for a given piece of text. Then, there’s a number of in-between technologies. There was a particular one where designers would work with letter sheets than could be transferred onto a given piece of paper, and I seem to recall there’s a similar technique that relied on clever use of photocopiers. The precise technologies aren’t very important here, but rather I want to impress that there’s a western practice of spacing glyphs in a text just right, and that the underlying technology greatly affects what is possible. As such, this practice is taught to students of design, and seen as one of the important details that distinguishes a well done piece of typography from a rush job. For the western typographer, to get the kerning just right is to say _you care_. Now, in the digital era, font makers are able to very quickly define kerns for any pair of glyphs, and while doing text layout the shaper will apply these kerns. This is generally good enough for the majority of use cases… However there’s a technological limitation. See, if you do rich text layout, you first need to itemize the text into ranges where the font, direction, and script is the same before you hand it over to the shaper to shape. In the above example, you can see that the first letter is much larger than the rest, and there’s no kerning. This is because the font size is different, and thus, during itemization, it’s a different font, and a different glyph run. The shaper cannot apply kerning between these two different runs. Typically, this is worked around by adjusting the tracking or kerning. CSS however, only has letter-spacing, which is meant to be applied to ranges of text. Meant. In practice, the majority of implementations make it so that letter-spacing modifies the spacing to the right of clusters of glyphs. But not all: some implementations do it to the left when text is right-to-left! If that weren’t enough of a headache, right now, the CSS working group is changing the way letter-spacing works all together. Using letter-spacing for this is not much of an option then. The CSS-WG suggests that if you really want to do manual kerning, you need to create a special span with reduced margins, as this will give the most control. SVG doesn’t have margins though, as SVG doesn’t have the CSS box-model. But we _do_  have character transforms in SVG. Character transforms in SVG have been there since the beginning. There’s 5 parts to character transforms: absolute x and y, relative dx and dy, and rotate. Absolute X and Y set the current text position in absolute coordinates to the text origin, and, these break shaping, much in the way line fragments do with auto wrapped text. When the SVG text specifications talk about text chunks, it means ranges of text that have been positioned this way (and since SVG 2.0, also other forms of line fragments). Dx and dy conversely, accumulate, starting from each text chunk start. They don’t break shaping, nor does rotate, which means these three are very suited for this need for manual adjustment. They just needed to be editable. So when I was looking at these three issues (on canvas adjustments, baseline selection and character transforms) and was deciding on my design, it became clear we needed this separate mode to handle these three things, and also that it wasn’t all that optional: spacing and kerning are a pretty important practice after all. I then spend 10~ days to get the character transforms right. This was because I decide it would be more useful to calculate the relative positioning from absolute positions rather than to set the relative positions directly. This way, I would only need to calculate where I want the glyph to be, and let the function itself sort what kind of delta positioning that requires. This required me to kind of backtrack from the final position to calculate the point at which the delta x and y are added. This was quite tricky as there’s a lot of modifiers on where a particular transform ends (ligatures, utf32 vs utf16 codepoints, and of course, white space collapse), as well as going backwards, as that involves removing the text-path adjustment, text anchor calculation, absolute offset and finally the textLength offset. The actual editing of this is provided by two handles at either side of the active selection. Dragging the square handle offsets the whole selection, while dragging the round handle scales and rotates the selection, using the square one as the hinge/origin. I am not fully sold on how this is handled, especially in RTL, and I want to see if I can handle the offsetting better. With type setting mode, you can transform each glyph individually, allowing for some pretty advanced looking typography. The lines are the metric lines. Hovered line is the Descender, hence it saying “Font Size”. Next up was changing on canvas properties. This is right now, limited to Font Size, Baseline Shift and Line Height. The baseline shift is modified by dragging the baseline, the font size is modified by dragging either the ascender or descender, and the line height by moving the line height markers, which are ascender and descender + the line-height on either side. Artists will be able to tell which they’re modifying by the hovering name. Krita slogan in Hindi. Here, we use type setting mode to adjust the size of the second word, and then select the “hanging” baseline to align the text to the head stroke. Setting the dominant/adjustment baseline can be done by pressing `Shift`, which switches the visible lines to the baselines. Clicking them will set that as the dominant baseline. There’s still an issue here with overlapping lines, and I need to sit down and think about which lines should have priority. This is pretty useful already, but there’s still a number of unanswered questions: * Right now, I add a counter transform at the end, this is because when using it, the counter transform felt more intuitive. However, it can also make sense to not have that. Maybe it needs a toggle? * Similarly, the scaling/rotating code can easily only do scaling OR rotating, and it makes sense to use either. But I am unsure how to provide that in the UI. * Thirdly, there’s right now no way to set the Absolute transform. I got some functioning unittests for it, but some edge cases look weird and it needs more work before I can expose it to the UI. * Right now, the Font Size, Baseline Shift and Line Height are all adjusted in Points. I was unsure whether to have them in relative font size, and we’ll need to see if that’s something people prefer. * I can imagine that some people would like to see a line over the x-height, but the thing is that there’s no real related metric for that. There’s font-size adjust, of course, but newer versions of font-size-adjust are also possible against the capital height, or even the ideographic height. So I just left it out for now. * The metrics that can be adjusted are all of a certain type, what western Typographers call “vertical metrics”. There’s no controls yet for Tab size, text indent, word spacing and letter spacing, though they could be easily imagined. * In a similar vein, one could imagine handles for italic/slant, weight or width. These I have been avoiding because of these, only slant can be predicted, the other two are unique to the type face. * Finally, there’s of course associated shortcuts. I’ve implemented four for moving the offset in any of the four directions, but none for scaling/rotating. This is because I assumed people would definitely want to offset with the keyboard, but was unsure about the others. Part of these are because Type Setting Mode came in very late. It was always going to be added as last, because, from a surface level it sounds like a frivolous toy mode. When I expressed my intent to create it, some artists even told me they were never going to use it. Not strange: There has been over 30~ years of digital type setting that didn’t need a separate type setting mode. But once you see the whole picture, and more specifically, realize that not all text layout systems are the same, the purpose starts to make a little bit more sense. Whats more, because SVG character transforms have been there since the beginning of the SVG spec, they’re pretty widely supported, so it’ll be very interesting to see what people will come up with. There’s still a snag though: SVG relative character transforms don’t apply on auto-wrapped text. There’s a little note in the SVG 2.0 spec that these were considered, but ultimately seen as unnecessary. Little bit annoying, but not the end of the world, as someone who aims to wrap in shape, but then fine tune, can do just that. Wrap in shape, convert to pre-positioned text, and fine tune the spacing… Let’s now finally talk about the converters. ## Conversion actions for text types. Because previous versions of Krita only supported SVG 1.1 text, it was important that there would be a way for people to convert away from that format. Similarly, if someone had put text-in-shape, or created an Inline wrapping area without intending to, there needed to be a quick way to convert. Converting away from “Pre-Positioned Text” (SVG 1.1 text with white space collapse), required first removing all collapsed white spaces. Then, inserting new lines for each SVG text chunk with absolute positioning. All of this needed to be done in reverse because insertion and deletion changes the indices. By going in reverse the indices that still needed to be modified were kept the same until modification. For inline size, the inline-width of the text is tested before conversion, and set after conversion. Converting towards Pre-Positioned text on the other hand was much easier, as it was a case of figuring out the current position and making sure it was being set as an absolute transform. Because we are just working with the layout results, we can convert from text-in-shape to pre-positioned and keep the lines positioned the same. The leftmost polygon here is a text in shape, while at the right, the text has been converted to pre positioned SVG 1.1 text. The difference is only visible because of the different selection rectangles. These actions were implemented in the text tool for single shapes and in the shape select tool for multiple ones. ## Wrap up And that was all of Phase 3, which means I am done for Krita 5.3. As of writing, we’re in feature freeze. This means I will be focusing on fixing bugs in the coming few months. But also writing documentation, and release notes. I am slightly worried, as I didn’t get a lot of feedback near the end, and am left wondering what kind of bugs I will see in the coming months. Some things didn’t get in from the original plan. Most notably: color and stroke setting. Krita _can_  set these things, the controls for it need to be ported to QML, and I was told to avoid it, as it would be too big. Due these missing controls, stroke can only be set for the whole text, while the fill can only be a color for a selection, or gradient set on the full text. Beyond that, a visibility mode for formatting marks (that show where the spaces are and what type of spaces they are) didn’t get in either. It’s by itself not complex to implement, but it needs good design of the marks, and I just didn’t feel like I could give it the attention it deserves because of the amount of work that went into text in shape. It is also not yet a full implementation of SVG 2. Text-orientation is the biggest missing element here, but I told myself I wasn’t going to work on that until there was a decent enough text editor. There’s also things like better justification, hyphenation and color font support, but those were never going to be in 5.3. It’s going to be interesting to see how the usability is going to be tweaked over the coming years. A good number of properties can be found directly on the canvas and the main dockers, so I do feel everything is pretty discoverable. However, I did have to put the advanced text-in-shape actions into a right click menu, and generally people don’t find those. It will also be interesting to see what people will do with the type setting mode and how that’ll evolve. I know people want an on canvas property editor, but I had been holding off on that because the design would be tricky to get right, as well, in Qt5 Android platform integration doesn’t yet obey the enum value that asks for the copy-paste menu to be hidden. So that menu would probably float over any on-canvas property menu. Qt6 fixes this, but I don’t know if it does for Apple products as well. Overall, this was a pretty ambitious project. One thing that probably didn’t bleed through in all these blog posts is that probably at a least a third of the work was communication. I myself understood that when I started it, but I think it has a tendency to get lost when you read tech blogs, so I’ll expand a little about it. Basically, every step I took, I spend some time talking with the other Krita developers (primarily Dmitry, who reviewed all my work) what I wanted to do, and how I was going to approach it. This isn’t just to get the design sorted, but also to avoid blind-siding people. I also wrote these blog posts, and wrote little feature introductions for the people on Krita artists. The purpose of the latter was to get people to understand with what I am trying to do, I am unsure how successful I was there. The technical blogposts did appear to be pretty helpful, and I got a lot of feedback from other FOSS people that these blog posts were useful. While text layout is not a rare programming topic, advanced text layout is only really done by a handful of people, and I imagine a lot of them are too exhausted after they got the thing to work to write a blog post about it. Anyway, when I first started, my colleague Agatha had described text layout like a “Hydra” and that every update I made felt like I was chopping those heads off one-by-one. I declare the Hydra dead: Krita has a decent text tool now. ## Appendix ### SVG Character Transforms. Just checking how widely supported the SVG character transforms are… Inkscape and Chromium do pretty well. Firefox does a little bit odd. SVG Tiny 1.2 _does_  include the character transforms, but QtSvg doesn’t support them (or Gwenview isn’t using QtSVG). Then there’s a lot of epub readers that have varying degrees of support. The sample SVG-based epub3 files do _use_  multiple character transforms, but that by itself doesn’t mean much. KoReader for example only supports the first transform, even with text-on-path, which is interesting given that LunaSVG, which it uses, _does seem_  to have support for it if you look at the code. KoReader _does_  apply textLength, which is useful, but then other epub readers I’ve tried don’t apply textLength, but only transforms. It’s a bit of a mixed bag, but the wide browser support is heartening (good enough if you just want to tweak spacing while maintaining an accessible SVG text element). Our “The Two Towers” sample in Firefox 145. Firefox doesn’t support baseline shift (but does support white-space, so we can preserve the line break… but then doesn’t support SVG units, so all units need to be suffixed with px) Chromium 142, it supports SVG 1.1 fully, but no white space, so I had to convert to pre-positioned text for this to work. Neither browser supports optical size in SVG, so the large capitals are less delicate than in Krita. The sample in Inkscape 1.2, I had to convert the font from Amstelvar to DejaVu Serif, as it didn’t seem to like Amstelvar (probably because it is a variable font). It’s by far more widely supported than SVG 2 text wrapping though, of which the only known (to me) implementations are Inkscape and Krita. Ideally, Krita, like Inkscape, would ensure there’s fallback positioning written. The absolute transforms are 100% intended to provide a fallback when the auto wrapping is not yet supported. The reason Krita isn’t doing this is because it needs a separate code path so it only saves this to exported SVG layers, and as well, I am not 100% confident in my conversion code. When that time comes it might also prove useful to save the textLength, but I’m still mulling over this. A final note is that Krita, like Inkscape, has a “convert text to paths” function. When converted to paths, text can be modified as desired, but then it loses the accessibility of being text that can be selected, which you’d want to avoid in an interactive environment.
wolthera.info
November 20, 2025 at 2:07 PM
Design System Progress – November 2025
For the past few weeks, we have been working on a few areas around the design system for Plasma. Keep in mind that I am only speaking of the graphic side, not code. Work is ongoing with the Union engine and the team is focused on replicating our current Breeze style using Union. There have been talks about creating the first components based on the design system, but that is more in the future. Meeting with PenPot We held a meeting with the PenPot team and Pablo Ruiz, their CEO, met with us to discuss new changes in the PenPot app. This was a follow up to their recent conference PenPot Fest. Their team announced a few things that should make it much easier for the Plasma Design team to adopt PenPot. For example: * New composite token: Typography Taiga #10200 * Show current Penpot version Taiga #11603 * Switch several variant copies at the same time Taiga #11411 * Invitations management improvements Taiga #3479 * Alternative ways of creating variants – Button Viewport Taiga #11931 * Reorder properties for a component Taiga #10225 * File Data storage layout refactor Github #7345 * Make several queries optimization on comment threads Github #7506 With these additions, it was much easier to move assets into PenPot than before. There was less work we needed to do. We begun a migration to PenPot for the second layer of basic components and also started building more complex components. Here are some screenshots: ## Buttons ## Button Groups ## Badges ## Inputs ## Dropdowns ## Toggles ## Checkboxes ## Checkbox Groups ## Avatars ## Tooltips ## Progress Indicators ## Sliders These components are shared components. Then we moved into application components and this is what we have so far. Application Components ## Modals ## Pagination ## Tables ## Video screen (Miscellaneous) ## Breadcrumb ## Tabs ## Alerts and Notifications ## Date Pickers ## File Upload ## Section Headers ## Content Dividers In this list, you see a lot of graphics. Each of these is supposed to represent a different state of the graphic. Users wouldn’t work with these variant sets very much, instead, they would simply search in the component catalog for what works in their design and only edit organization and labels. However, to get to that level, the designers need to create interpretations of each of these states graphically. This leads to a lot of work and a lot of graphic memory usage. There are a few more components that can be created. However, given PenPot’s reliance on the browser DOM, the more complex the components, the more lag the application runs into. Because of this issue, we have contacted PenPot to become beta testers of their new rendering engine when it comes out. They are almost at the point where they can put this out. We are eager to try and see how much faster we can go. The issue is not on PenPot but the engine that powers the editing screen. Still, we have to wait a little bit to continue. In the mean time, we can dedicate ourselves to making more application icons and completing the work there. ## FOSDEM Additionally, we are setting up a workshop with the PenPot team during FOSDEM 2026. This workshop will focus on brainstorming ideas on how to more easily distribute and contribute to a design system using PenPot. For example, there is a list of ideas we proposed: * Exclusions and inclusions into the design system library. This way, the original copy of the design system remains consistent with the base components unalterable. This should make it easier for casual designers looking to build a quick mockup without getting bogged down by sub components that don’t need edits. This can also ensure that the many users taking the components are using a consistent copy to the original. * Automatic sharing and updating to users not in the immediate instance team. * Generate a review system for components as external users to the main instance propose changes. * An easy way to re-publish the design system after applying suggested changes. * …and a few other ideas. Hopefully, there are good ways to get this done. We are still waiting to move our icons into PenPot. Likely, this is more of a reality once the new rendering engine is in place. The team let us know that there are a number of shape manipulation improvements app In addition to all of these changes, we keep submitting bug reports and feature requests to the PenPot team to make the app even stronger.
anditosan.wordpress.com
November 18, 2025 at 12:55 AM
This Week in KDE Apps
#### Crop tool in Photos, Sudoku in Kirigami and sprinting Welcome to a new issue of "This Week in KDE Apps"! Every week (or so), we cover as much as possible of what's happening in the world of KDE apps. Last Saturday a bunch of KDE devs (and a guest) met in my kitchen for a "Kitchen sprint". As always, we discussed and worked on quite some exciting stuff, mostly around Itinerary and public transport infrastructure in KDE, but not only. Here is a short overview of what some of us worked on: Jonah experimented with integrating maplibre in our apps, Nico demoed his new online account integration for applications, and, outside of cooking some Käsespätzle for the whole group, I spent some time packaging Merkuro as a flatpak! Outside of that, and as part of our end-of-the-year fundraiser, you can adopt one of KDE's apps and we can share with the whole world how awesome you are and how much you're doing to support us. Thanks to everyone who already donated, this is super helpful! Getting back to all that's new in the KDE app scene, let's dig in! ## Multimedia/Graphics Applications ### Photos Image Gallery Noah Davis added a crop tool to the image editor of Photos. (25.12.0 - link). Joshua Goins improved the performance a bit in the main view (25.12.0 - link). ## Sytem Applications ### Dolphin Manage your files Nate Graham reverted a change which impacted keyboard-driven folder manipulation (25.12.0 - link). Oliver Schramm fixed trashing files from temporary folders. Now they no longer end up in your home trash bin. (KDE Frameworks 6.22 - link) ## PIM Applications ### Merkuro Calendar Manage your tasks and events with speed and ease Tobias Fella fixed setting the calendar name (25.12.0 - link). He also disabled the calendar editor when we don't have permission for it (25.12.0 - link). ## Social Applications ### NeoChat Chat on Matrix Tobias Fella simplified the process to unlock the key backup by providing only one text field (26.04.0 - link) and it is no longer behind a feature flag (link). ### Tokodon Browse the Fediverse Loïs Rioul fixed login with GoToSocial (25.12.0 - link). ## Games ### Pumoku Anders Lund pushed the first early alpha version of his Kirigami based sudoku application called Pumoku. It is still a bit basic but very promising. ## Third-Party Applications ### Easy Effects - Audio Effects for PipeWire Applications Wellington Wallace released Easy Effects 8.0.3 containing a bunch of fixes for regression from the major 8.0.0 release. Giusy Digital fixed some translations issues in the spinboxes (link) and the number validator (link) Carl Schwan ported the settings to KirigamiAddons ConfigurationView (link) Carl also fixed various spacing issues in the effect pages (link), ported the navigation menus to normal tool buttons (link), ported the application metadata to `KAboutData` and `FormCard.AboutPage` (link) and various other small graphical changes. ## …And Everything Else This blog only covers the tip of the iceberg! If you’re hungry for more, check out Nate's blog about Plasma and be sure not to miss his This Week in Plasma series, where every Saturday he covers all the work being put into KDE's Plasma desktop environment. For a complete overview of what's going on, visit KDE's Planet, where you can find all KDE news unfiltered directly from our contributors. ## Get Involved The KDE organization has become important in the world, and your time and contributions have helped us get there. As we grow, we're going to need your support for KDE to become sustainable. You can help KDE by becoming an active community member and getting involved. Each contributor makes a huge difference in KDE — you are not a number or a cog in a machine! You don’t have to be a programmer either. There are many things you can do: you can help hunt and confirm bugs, even maybe solve them; contribute designs for wallpapers, web pages, icons and app interfaces; translate messages and menu items into your own language; promote KDE in your local community; and a ton more things. You can also help us by donating. Any monetary contribution, however small, will help us cover operational costs, salaries, travel expenses for contributors and in general just keep KDE bringing Free Software to the world. To get your application mentioned here, please ping us in invent or in Matrix.
blogs.kde.org
November 18, 2025 at 12:55 AM
A new online accounts system?
For many years Plasma comes with its own system online accounts system, known as KAccounts. The idea is simple: In Systemsettings you log into a given online service once, and then several applications can use that login, instead of loggin in inside each application separately. The number of services available and applications making use of them changed a bit over recent years. As of right now the following services are supported: * Nextcloud: This is used by Dolphin to add a shortcut for file access via webdav to the `Network` section, as well as the Purpose framework to allow uploading files to Nextcloud. * Owncloud: Used for the same things as Nextcloud. * Google: Used by Purpose for uploading to YouTube. In theory also used by `kio-gdrive` for browsing Google Drive, but access to this is currently blocked by Google. * OpenDesktop: Used for reviewing store.kde.org content in Discover This isn’t all that much. Notably absent here is KDE PIM, which could greatly benefit from integrating with the Nextcloud and Google accounts. This is something many users have asked for over time. Plus, there’s more services that are used across applications and could benefit from a systemwide online accounts system, like Mastodon or Matrix. Overall the situation with online accounts support in KDE is unsatisfactory, and it’s not for a lack of trying. Over the last few years there have been several smaller improvements to the system. However there have been no changes to the overall architecture. At this point I am convinced that the architecture is what’s holding us back, and we need to do something about that. The current system is based on the Accounts SSO framework. It consists of several libraries and processes, split across about a dozen different repositories. This makes for a rather complex system for what is effectively reading and writing to a sqlite database and some OAuth handling. It also receives very little development activity, to the point where it was hard to get the required patches for Qt6 support in. Using an external accounts system as based for KAccounts only makes it harder to iterate on our system, while providing no meaningful interoperability with other parties. The system also isn’t designed for a sandboxed world. Apps have direct access to the accounts database and keychain, so there is no ability to restrict which apps can use which accounts. While per-application access control wasn’t really feasible for traditional Linux packaging, with sandboxed formats like Flatpak we can and want to restrict apps to only be able to access select accounts. Having pondered the problem for a while I came to the conclusion that we need a fresh start for our online accounts story, a new system that fullfils the following goals: * It’s actually used by relevant KDE and third-party software * Easy to hack on and extend * Easy to be integrated into consumer software, with minimal dependencies * Can be extended with third-party providers * Account data is stored reasonably securely, with per-application access control (for sandboxed applications at least) Based on these goals I have developed a prototype for how such a system could look like. At its core there is a daemon process that manages the accounts, and exposes them via a DBus interface. Applications uses this DBus interface to list availble accounts as well as their parameters and credentials. Only accounts the app has been granted access to are visible that way. Application authentication works in a way that’s inspired by how xdg-desktop-portal works. An application can trigger a request for accessing a new account. The dameon will then handle the whole login flow and, if successful, will return a handle to the new account. Alternatively the user can log into a given service in the systemsettings module and give access to relevant apps though that. Currently the following services/apps are supported: * Nextcloud: Used by Purpose and KDE PIM * Mastodon: Used by Tokodon * Google: Used by KDE PIM and Purpose You can find the code at https://invent.kde.org/nicolasfella/konlineaccounts. It is still very much a prototype, which is by no means ready for production, but it shows the basic concept. If you have input on this please get in touch, for example by filing an issue.
nicolasfella.de
November 15, 2025 at 1:38 PM
OSM Hack Weekends October and November 2025
Last weekend I once again attended the bi-annual OSM Hack Weekend in Karlsruhe hosted by Geofabrik. I’ve also been at the OSM Hack Weekend in Berlin hosted at Wikimedia Deutschland a couple of weeks ago and haven’t written about that yet, so this is the combined report for both events. ### Transitous Transitous, our community-run public transport routing service, has been the topic of several discussions: * Ways to deal with GTFS static feed rotation happening out of sync with corresponding realtime feeds. This results in time periods where available realtime information cannot be matched to base schedule data and thus gets needlessly discarded. * How to best configure GBFS provider groups as supported by MOTIS v2.7. * Integrating GBFS data from Citybikes, which would substantially increase the amount of available rental vehicle data. * Assessing what it would take to add Transitous as an additional routing option to the OpenStreetMap website. * Investigating how far along the OSM Road Closures GSoC project is, as that kind of data is obviously very interesting to integrate eventually. * Exploring whether FOSSGIS e.V. would be a suitable organisational home for Transitous. Available rental vehicles shown on Transitous' map view. ### KPublicTransport KPublicTransport, KDE’s client library for accessing different journey planning services used by Itinerary and KTrip, got a few improvements to catch up with Transitous and MOTIS v2.6 and v2.7 changes: * Access to agency/operator URLs. * Querying available station-bound and free-floating rental vehicles from MOTIS. * Support for direct booking URLs for station-based rental vehicles. Station-bound rental vehicles other than bikes are now also displayed with the correct vehicle icon on the map. Itinerary's station map showing a car rental station and two free-floating rental bikes. ### Indoor mapping Indoor mapping was of course also on the agenda: * I got to try Tobias’s JOSM patches improving level filtering. Especially the option to filter on elements without a level tag is helpful for fixing level tagging in existing buildings for me. * We talked about ongoing tagging discussions from TU Munich’s BIM import, in preparation for the next quarterly OSM Indoor Meetup. * We discussed whether we should have another in-person Indoor tagging workshop following the one from 2022, in order to have some time to work on finalizing tagging proposals and updating the current indoor tagging documentation. ### Emergency and weather alerts At the CAP Implementation Workshop two weeks ago a WFS/OGC feature layer for CAP alerts was mentioned, and presented as something so far only offered by a commercial entity. With my almost non-existent GIS knowledge this looked like something that shouldn’t be too hard to provide by our CAP alert aggregation service as well. And thanks to the input from the right people I got a basic prototype set up in less than an hour. All the magic is provided by pg_featureserv, which can expose a PostGIS database (which we already have) in a way it can be consumed by e.g. QGIS. QGIS with a CAP alert message layer. One important difference here is that unlike its proprietary counter-part this doesn’t expose many CAP fields yet, as we hold only the bare minimum as dedicated database columns right now. However, should anyone actually need this, adding more columns isn’t a big deal. ### Event planning We also looked at upcoming events in 2026 and how we could have Transitous specifically and the Open Transport community more generally represented there: * 39C3, 27-30 Dec in Hamburg Germany. We’ll try to have some kind of Transitous meetup there. * FOSDEM, 31 Jan-1 Feb in Brussels, Belgium. The CfP for the Railways & Open Transport track is still open and we have poked a few people to submit talks. * FOSSGIS-Konferenz, 25-28 Mar in Göttingen, Germany. The CfP is already closed, a few proposals have been submitted. Still further out is next year’s State of the Map which will be end of August in Paris, France. That’s obviously something where Transitous should be present as well, and where we might have the option of a travel-optimized adjacent Transitous sprint along the way. Ideas for a 2026 edition of the Open Transport Community Conference are also floating around already, volunteers to drive this still very much needed though. ### You can help! Hack weekends how this is called in the OSM community or sprints as this is known in the KDE community are immensely valuable and productive. There’s a great deal of knowledge transfer happening, and they are a big motivational boost. However, physical meetings incur costs, and that’s where your donations help! KDE e.V. and local OSM chapters like the FOSSGIS e.V. support these activities.
www.volkerkrause.eu
November 15, 2025 at 1:39 PM
This Week in Plasma: OCR in Spectacle and many UI improvements
Welcome to a new issue of _This Week in Plasma!_ This week Spectacle gained OCR (optical character recognition) functionality, allowing you to turn words in images into selectable text! (and yes, this is Spectacle recording itself performing OCR) Right now the functionality is limited to Spectacle, but the code is in the process of being moved to a library so more apps can benefit, too. Thanks a lot to Jhair Paris, who implemented this feature that will appear in Plasma 6.6! In addition, many UI improvements landed, as well as some high-priority bug fixes and performance improvements. A good week, I’d say! Have a look: ## Notable UI Improvements ### Plasma 6.5.3 You can now drag a tab out of a Chromium/Chrome window and immediately tile it to a screen edge or corner. (David Redondo, link) Implemented some improvements to the Breeze theming for GTK 4 apps, including making the rounded corners consistent and fixing invisible expander arrows for expandable group boxes. (Kevin Duan, link 1 and link 2) Made the favorites column in the Kicker Application Menu widget compatible with more kinds of icons in non-default icon themes. (Christoph Wolk, link) ### Plasma 6.6.0 Overhauled a bunch of the portal-based permission dialogs to just look way nicer in general. (Harald Sitter, link 1, link 2, link 3, link 4, link 5, link 6, link 7, link 8, link 9, link 10, link 11, link 12) Renaming a file or folder on the desktop now lets it keep its existing position. (Błażej Szczygieł, link) Plasma’s Timer widget now has a nicer and more straightforward configuration page, with two old pages merged into one new one. (Tobias Fella, link) For similar reasons, the system Tray’s only two main configuration pages have also been merged into a single new one. (Nate Graham, link 1 and link 2) When an app asks to register keyboard shortcuts on launch and you don’t let it, this preference is now remembered, instead of the annoying app just asking again the next time it launches. (David Redondo, link) The GTK theme chooser now lets you preview the dark version of the theme, too. (Luan Oliveira, link) ### Frameworks 6.21 File transfer notifications now fall back to file-based progress display in situations when size-based progress display isn’t available. (Pan Zhang, link) The Breeze icon theme now includes icons for Nim code files. (Sophie Ahumada, link) ## Notable Bug Fixes ### Plasma 6.4.6 Fixed a seemingly random Plasma crash. (David Redondo, link) ### Plasma 6.5.3 Fixed a regression that made KRunner crash when searching on operating systems that use Musl as their C standard library instead of Glibc. (John Zimmermann, link) Fixed a case where Discover could crash while updating software if Flatpak itself throws a malformed error. (Aleix Pol Gonzalez, link) Fixed a regression that broke Spectacle’s “exclude shadows” option. (Vlad Zahorodnii, link) Fixed a regression that made desktop icons not get visually hovered when approaching them from the left side at certain speeds and locations. (Błażej Szczygieł, link) Fixed an issue that made the context menu for apps or processes being monitored in System Monitor open in the wrong place when using certain multi-screen setups. (Oliver Schramm, link) Worked around a Qt regression that broke hiding columns in System Monitor’s table views using the column header context menu. (Alexey Rochev, link) Worked around a kernel bug that that made some systems fail to go to sleep the first time it was initiated. (Bhushan Shah, link) Worked around some driver bugs that caused mangled cursor styling with certain GPUs. (Xaver Hugl, link 1 and link 2) ### Other bug information of note: * 4 very high priority Plasma bugs (same as last week). Current list of bugs * 31 15-minute Plasma bugs (down from 35 last week). Current list of bugs ## Notable in Performance & Technical ### Plasma 6.5.3 Fixed a case where KWin could get blocked due to heavy disk I/O operations. (Vlad Zahorodnii, link) The clipboard portal now supports being used in remote desktop sessions and with middle-click primary selection. (David Redondo, link 1 and link 2) Increased the level of visual fidelity when using a fractional scale factor. (Xaver Hugl, link) ### Plasma 6.6.0 Increased the level of visual fidelity when using a fractional scale factor even more, this time when using software rendering. (Vlad Zahorodnii, link) A process that’s crashing in a loop can no longer make the system run out of memory and freeze as a result of the crash tracer trying to debug all the crashes. (Harald Sitter, link) ## How You Can Help Donate to KDE’s 2025 fundraiser! It really makes a big difference. Believe it or not, we’ve already hit out our €75k stretch goal! I’ve been informed that a _second_ stretch goal is available now, too! I’m just in awe of the generosity of the KDE community and userbase. Thank you all for helping KDE to grow and prosper. If money is tight, you can help KDE by directly getting involved. 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. 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.
blogs.kde.org
November 15, 2025 at 3:00 AM
KDE Ships Frameworks 6.20.0
Friday, 14 November 2025 KDE today announces the release of KDE Frameworks 6.20.0. This release is part of a series of planned monthly releases making improvements available to developers in a quick and predictable manner. ## New in this version Attica * Use QCOMPARE vs QVERIFY. Commit. Baloo * Use better way to disable session management. Commit. * Use QCOMPARE vs QVERIFY. Commit. * app] Skip application/mbox files greater then 10MB. Commit. See bug #443547. See bug #447681. See bug [#460882 * balooctl] Writeback config changes before enabling or disabling indexing. Commit. See bug [#419708 Bluez Qt * Rfkill: Write to rfkill in a thread. Commit. Breeze Icons * Fix up "starred-*" icons. Commit. Fixes bug #511152 * Add RTL versions of open-link icon. Commit. Fixes bug #506268 * Provide external-link-symbolic as an alias to open-link-symbolic. Commit. * Try to avoid to depend on stuff generated by CMake. Commit. * Add 16px version of the RTL document-send icon. Commit. See bug #509254 * Add document-send RTL version. Commit. Fixes bug #509254 * Make only 24 px generation a parameter. Commit. * Try to avoid that we have targets that run always. Commit. Extra CMake Modules * Generate-fastlane-metadata.py use https://kde.org/donate. Commit. * Strip username and password from Fastlane source URLs. Commit. * KDEClangFormat: Avoid error w/ CMP0175 enabled. Commit. * FindFFmpeg] Skip version check on Windows. [Commit. * KDE*CompilerSettings: add note why no cmake_policy is set. Commit. * Public KDE-specific modules: set module cmake_policy. Commit. * Module templates: set module cmake_policy. Commit. * Public general modules: set module cmake_policy. Commit. * Public find modules: set module cmake_policy. Commit. * ECMGenerateExportHeader: set module cmake_policy, not just one policy. Commit. * ECMGenerateExportHeader: do not push/pop module policy explicitly. Commit. * ECMQmlLoader: generic languages should have lower precedence. Commit. Fixes bug #509902 * FindFFmpeg: add AVFILTER and SWRESAMPLE components. Commit. * Add FindFFmpeg.cmake used by many KDE project. Commit. * Fix QML modules to be rebuilt all the time with Qt5. Commit. * Ecm_generate_headers: support headers in clang vs. deduplicated header files. Commit. * CMakeLists.txt - remove trailing '/' to fix CMP0177 warning. Commit. * ECMSetupQtPluginMacroNames: fix setting up names for own build. Commit. Framework Integration * Kpackage-install-handlers: check file.open result. Commit. KArchive * Use CamelCase Qt include. Commit. * 7z: Change for{if{}} to if{for{}}. Commit. * Autotests/kcompressiondevicetest.cpp spell check. Commit. * 7z: Fix infinite loop in malformed file. Commit. * Ktar: Fix/Tweak the skip error condition. Commit. * Add nodiscard attribute to open(...) declarations. Commit. * Ktar: Optimize memory allocations. Commit. * KTar: Use skip instead of seek for skipping. Commit. * TestTarReadWrite: Also test with KCompressionDevice. Commit. * Add some const. Commit. * 7z: Fix assert/crash in malformed file. Commit. * Explicitly convert enum to int for QString::arg. Commit. * 7z: Break early on failure in K7ZipPrivate::folderItem. Commit. KBookmarks * KBookmarkGroupTraverser: Fix typo in API documentation. Commit. * KBookmark::updateAccessMetadata: Utilize QDateTime method that is significantly faster. Commit. KCMUtils * Added name sorting to kcmshell6 --list output. Commit. Fixes bug #509050 * KCModuleQml: Also force height in addition to width. Commit. * GridDelegate & GridViewInternal: Drop mobile tweaks. Commit. KCodecs * Allow to also RFC 2047-encode reserved characters. Commit. KColorScheme * Fix colors in kdeglobals not being respected when platformtheme is not kde. Commit. * KColorScheme: Add FrameContrast API. Commit. KCompletion * Use QCOMPARE vs QVERIFY. Commit. KConfig * Kconfig_compiler: prevent empty private: section in headers. Commit. * Use QLockFile.tryLock with timeout rather then lock forever. Commit. Fixes bug #508253 * Add 59ca348606 to .git-blame-ignore-revs. Commit. * Kdesktopfileaction: Improve docs strings. Commit. * Use QCOMPARE vs QVERIFY. Commit. * Typo--. Commit. KConfigWidgets * Use QCOMPARE vs QVERIFY. Commit. KContacts * Use default. Commit. * Add deathdate in vcardtool. Commit. * Add Q_PROPERTY. Commit. * Add DeathDate vcard4 support. Commit. See bug #337759 * Minor optimization. Commit. * Add missing [nodiscard]]. [Commit. * Add [nodiscard]] ignore commit. [Commit. * Modernize use "[nodiscard]]". [Commit. * Allow to translate resource type. Commit. * Fix use QVERIFY/QCOMPARE. Commit. * Prepare to implement sound type support. Commit. * Version is used here. Commit. * We need to implement vcard4 sound support. Commit. * This check was already done some line ago. Commit. * Type can be lower case. Fix import emails. Commit. * Remove namespace. Commit. * Fix some cppcheck warnings. Commit. * Fix autotest. Commit. * Fix ANNIVERSARY/BDAY support in vcard 4.0. Commit. See bug #337759 * Add support for importing image vcard 4. Commit. See bug #337759 * Load vcard4 photo uri. Commit. * Const'ify. Commit. * Add debug operator. Commit. * Add LOGO vcard4 support. Commit. See bug #337759 * Allow to export photo as uri. Commit. * Store photo support. Commit. * Add photo vcard4 support. Commit. See bug #337759 * Const'ify variable. Commit. * Extract code. Commit. * Add photo v4 support. Commit. * Add missing Q_REQUIRED_RESULT. Commit. * Remove unused include. Commit. KCoreAddons * Add missing include moc. Commit. * Typo--. Commit. * Use QCOMPARE vs QVERIFY. Commit. * Update test expectation. Qt time formatting has changed. Commit. * Fix the non-local license text. Commit. * Switch to std::enable_if_t (API consumers now required to use >= C++17). Commit. * Fix duplicate license text for known but externally linked licenses. Commit. KDBusAddons * Remove unnused enum. Commit. KDeclarative * Kquickcontrols: install kquickcontrolsprivate to KF_INSTALL_TARGETS_DEFAULT_ARGS. Commit. Fixes bug #510081 KDE Daemon * Use newer version of session management enablement. Commit. KFileMetaData * ExtractorCoverageTest] Fix typo in clang-format processing directive. [Commit. KGuiAddons * Add StartupNotify=true to geo handlers. Commit. Fixes bug #510547 * WaylandClipboard: Avoid overriding original UTF-8 text. Commit. * Fix docs. Commit. KHolidays * Use QCOMPARE vs QVERIFY. Commit. * Italy: San Francesco will be a public holiday from 2026. Commit. * Fixes and add days to Puerto Rico. Commit. KIconThemes * kiconcolors] Drop ActiveText. [Commit. * kiconcolors] Drop Complement and Contrast. [Commit. * InvalidateFilter is marked deprecated in qt6.10. Commit. * Use QCOMPARE vs QVERIFY. Commit. * Remove version checks for Qt 6.8.0 that is now the minimum required. Commit. * Avoid saving state between multiple usages of IconDialog. Commit. Fixes bug #460451 KImageformats * PSD: limit memory usage on corrupted files. Commit. * Fix assert on broken data. Commit. * PSD: minor fixes while reading Image resource Section. Commit. * IFF: fix crash on malformed files. Commit. * Iff: Fix crash on malformed files. Commit. * PSD: improve sections size checks. Commit. * TGA: ignoring large metadata on dev area. Commit. * Check device before read. Commit. * Fix possible infinite loop when reading a broken jp2. Commit. * On demand buffer allocation on PCHG decompression. Commit. * Fix possible read overflow with malformed data. Commit. * Fix wrong palette check. Commit. * Use internal FP32 conversion instead of FP16. Commit. * Fix read test failing on aarch64. Commit. * Remove Qt version checks now that 6.8.0 is the minimum required. Commit. * Fix assert on broken data. Commit. * CI: Try newer libjxl for ossfuzz. Commit. * Tga: Reduce Warning to Debug. Commit. * Fix crash on malformed files. Commit. * Fix crash on malformed files. Commit. KIO * Add missing since documentation. Commit. * Kfileitemactions: use actionsKey instead of name to check KAuth. Commit. * ktelnetservice] Disable session management. [Commit. * kioexec] Disable session management. [Commit. * kiod] Use better way to disable session management. [Commit. * Trashimpl: better determine trashForMountPoint for network file systems. Commit. Fixes bug #506755 * KNewFileMenu: prevent emiting rejected signals when not rejected. Commit. * Knewfilemenu: when in mkdir -p mode don't append a / for last dir. Commit. * Kioworkers/file: check QFile::open return and early return. Commit. * KCoreDirLister: Enable using mime globs. Commit. Fixes bug #450612 * Reenable kdirlister test on non-Windows. Commit. * KIO::MetaData::toVariant(): document internal type of returned variant. Commit. * Autotests: enable connectionbackendtest. Commit. * Apply 1 suggestion(s) to 1 file(s). Commit. * Autotests: favicontest make a test more fault tolerant in Win. Commit. * http] Emit WorkerResult::pass() and return when a redirection is received during webdav directory listing. [Commit. * http] Remember that we're doing webdav while handling redirects. Commit. Fixes bug [#486790 * Kifileitemactions: Remove unused QMimeDatabase instance creation. Commit. * KIO::MetaData: port inline methods away from deprecated QMapIterator. Commit. * Previewjob: expose standardthumbnailer fileName property. Commit. * File_unix: print errnum in rename when failing. Commit. See bug #510810 * Kpasswdserver: Set cancel button on dialog. Commit. * JobTest: add renameFileWithNoUDSACCESS test. Commit. See bug #510567 * Kfileitems: Use internal name again for sorting. Commit. Fixes bug #510470 * Add typo fix commit to .git-blame-ignore-revs. Commit. * Fix various typos. Commit. * Use QCOMPARE vs QVERIFY. Commit. * RenameDialog: wrap the question text. Commit. * Ensure QNetworkReplies are always deleted with a scope guard. Commit. * Fix HTTP network error propagation. Commit. * Forward all KIO error codes, not just ERR_ACCESS_DENIED. Commit. * Delete network reply also when handling a redirection. Commit. * Autotest/jobtest: make sure to check error return when a job fails. Commit. * CopyJob: Skip permission check if there is no UDS_ACCESS entry. Commit. Fixes bug #510567 * KFileWidgets: Allow saving to currentfolder with empty input field in special cases. Commit. See bug #507193 * KFilePlaces: add a link to systemsettings recent config. Commit. Fixes bug #507966 * ftp] Claim that dir is writable during stat. Commit. Fixes bug [#510456 * KNewFileMenu: move the messageWidget below the input. Commit. Kirigami * Fix documentation for AlignedSize. Commit. * Add missing FrameContrast enum documentation. Commit. * Fix documentation for closeDialog. Commit. * Keep passive notifications inside the SafeArea. Commit. * ActionTextField: don't let inline buttons accept focus on click. Commit. * ActionTextField: use display property to control icons-only-ness. Commit. * OverlayDrawer: Fix handle positioning on RTL layouts. Commit. * Fix accessibile properties on ActionTextField properties. Commit. * Support menus in bottom ActionToolbars. Commit. * Feat: Expose closeDialog as a signal to the PageStack attached property. Commit. * ActionTextField: adopt some good ideas from the PlasmaExtras version. Commit. * ActionTextField: use standard implementation for inline action buttons. Commit. Fixes bug #484301 * Use reversed open-link when needed and present. Commit. See bug #506268 * PageRow: Fix dialogs not being closable via Escape. Commit. * PlatformTheme: setFrameContrast value. Commit. * CardsListView: Make sure it never will have horizontal scrolling. Commit. Fixes bug #477493 * Cmake: Add missing icon for android. Commit. * ActionsMenu: Restore the icon for submenus. Commit. * PageRow: Different style for the push/pop animation/gesture. Commit. * Make Separator always perfectly pixel-aligned. Commit. Fixes bug #510353 * Fix up overlay sheet header content width w.r.t close button. Commit. * Fix up overlay sheet's close button location. Commit. * Platform: Include child Quick items when updating child PlatformTheme instances. Commit. Fixes bug #510480 * Remove outdated comment. Commit. * Typo fix. Commit. * SelectableLabel: Only enable shortcuts if the label has focus. Commit. * Platform: Skip update() in PlatformTheme if we don't have a window. Commit. Fixes bug #493921 KItemModels * Remove Qt version checks now that 6.8.0 is the minimum required. Commit. KJobWidgets * Keep old test code around. Commit. * Disable kuiserver2jobtrackertest if HAVE_QTDBUS is false. Commit. * Make the test compile + do the basic thing. Commit. * Rewrite JobView code to be safer. Commit. KNewStuff * Installationtest: Fix test failure on non english hosts. Commit. * Don't make KNSWidgets::Button the parent of KNSWidgets::Dialog. Commit. Fixes bug #501267 * Port deprecated invalidateFilter in qt6.10. Commit. KNotifications * Look up notifications again after hitting application code. Commit. Fixes bug #511645 * Notifybyaudio: Don't show error on CA_ERROR_DESTROYED. Commit. KPackage * Use QCOMPARE vs QVERIFY. Commit. KQuickCharts * Limit item count in ItemBuilder to basically uint16_t. Commit. KRunner * Manager,context: remove launchcount adjustment. Commit. KService * Kservice: Remove legacy X-KDE-Keywords and fix X-KDE-FormFactors. Commit. * Don't warn for empty layout without merge tag. Commit. * Kbuildsycoca: debug++. Commit. See bug #510287 KSVG * KSvg: Add ColorScheme-Frame. Commit. KTextEditor * Remove unnecessary toEdge function. Commit. * Use KateViewInternal::Bias in move() signature. Commit. * Use void return type. Commit. * Remove the loops in the cursors. Commit. * Remove unnecessary methods and const overloads. Commit. * Remove operator overloading. Commit. * Remove unnecessary constructors. Commit. * Remove Bias::none enumerator. Commit. * Make function internal to the class. Commit. * Remove useless getter function. Commit. * Improve the test, use higher level api. Commit. * Move findMatchingFoldingMarker to KateBuffer. Commit. * Cleanup includes in kateviewinternal.h. Commit. * Include kateviewinternal.h less. Commit. * Move include to source file. Commit. * Move spellcheck function from DocumentPrivate. Commit. * Remove useless function. Commit. * Remove unused function. Commit. * Add QJsonObject. Commit. * Cleanup headers, deinline and remove unnecessary includes. Commit. * Use normal function pointer, std::function is not needed here. Commit. * Dont use std::pair/QPair, use named structs. Commit. * Add API to obtain the editor widget from View and vice versa. Commit. * Clear modeline matches if the model is irrelevant. Commit. * Add new config entries to public api docs. Commit. * Add "hide-cursor-if-inactive". Commit. * Add disable-current-line-highlight-if-inactive view option. Commit. * Simplify kateprinter, remove unnecessary KatePrinterPrivate class. Commit. * Make KateVariableExpansionManager a non QObject. Commit. * Move expandText to the file where its used. Commit. * Optionally return invalid cursor for coordinates outside text. Commit. * Kateview_test: extract lambda coordinatesToCursor(). Commit. * Explicitly convert enum to int for QString::arg. Commit. KTextTemplate * Use QCOMPARE vs QVERIFY. Commit. * Update test expectation. Qt time formatting has changed. Commit. KUserFeedback * Properly handling large timeouts for encouragement timer. Commit. Fixes bug #511102 * Use const pointer. Commit. * Add missing explicit keyword. Commit. * Port deprecated invalidateFilter method (qt6.10). Use beginFilterChange/endFilterChange. Commit. * Use QCOMPARE vs QVERIFY. Commit. * Remove old qt check. Commit. KWallet * Use QCoreApplication for kwallet-query. Commit. * Remove unused QtWidgets dep from API. Commit. * Enable KCrash for kwalletd6. Commit. * KSecretd: Use modern way of disabling session management. Commit. * Kwalletd: Disable session management. Commit. * Fix dismissing prompt for Unlock. Commit. * Use securelySeeded like in KWalletPortalSecrets::generateSecret. Commit. * Backend: Simplify random gathering to QRandomGenerator. Commit. KWindowSystem * Platforms/wayland: Prevent reinstalling window effects with the same parameters again. Commit. * Kwaylandextrastest: Port to UI file. Commit. * Remove Qt version checks now that 6.8.0 is the minimum required. Commit. * Fix creating empty future. Commit. * Fix KWaylandExtras::xdgActivationToken when KWindowSystemPrivateV3 isn't available. Commit. KXMLGUI * Use CamelCase Qt include. Commit. * Use QCOMPARE vs QVERIFY. Commit. * Switchlanguage: remove duplicates from languageList. Commit. Network Manager Qt * Add missing documentation comments for WifiP2P. Commit. * Fix since documentation for WifiP2P. Commit. * Fix enum value for WifiP2P. Commit. * Deprecate unused, Java-style iterator NMStringMapIterator typedef. Commit. * Add WifiP2P device. Commit. Implements feature #502159 Prison * Videoscanner: Remove Qt5 note. Commit. QQC2 Desktop Style * PlasmaDesktopTheme: Set frameContrast on change. Commit. * Harmonize delegate tooltip code. Commit. * SpinBox: Make paddings integer to avoid potential polish loops. Commit. Fixes bug #510758 * Remove Qt version checks now that 6.8.0 is the minimum required. Commit. Solid * Udisks: Port to DBus Object Manager. Commit. Sonnet * Remove double margins around groupbox. Commit. * Fix load default ignore list when we call slotDefault method. Commit. * Add missing [nodiscard]]. [Commit. * Use [nodiscard]]. [Commit. * Show headers in qtc. Commit. * Ensure parent is alive when removing eventfilters. Commit. Fixes bug #492444 * Add SpellCheckDecorator destruction autotests. Commit. Fixes bug #492444 Syndication * Show headers in qtc. Commit. Syntax Highlighting * QFace: Change type highlighting and add fully qualified cases. Commit. * Implement D2 syntax highlighting. Commit. * Cpp: Update classes for Qt 6.10. Commit. * Add Starlark syntax highlighting. Commit. * Add new features to QFace highlighting. Commit. Threadweaver * Use QCOMPARE vs QVERIFY. Commit.
kde.org
November 15, 2025 at 3:00 AM