<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet href="/html-rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Planet KDE | English</title><link>https://planet.kde.org/</link><description>Planet KDE | English</description><image><link>https://planet.kde.org/</link><title>Planet KDE</title><url>https://planet.kde.org/img/planet.png</url><height>48</height><width>48</width></image><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>2026-07-04T00:00:01+00:00</lastBuildDate><atom:link href="https://planet.kde.org/index.xml" rel="self" type="application/rss+xml"/><item><title>This Week in Plasma: Better Animations</title><link>https://blogs.kde.org/2026/07/04/this-week-in-plasma-better-animations/</link><pubDate>Sat, 04 Jul 2026 00:00:01 +0000</pubDate><guid isPermaLink="true">https://blogs.kde.org/2026/07/04/this-week-in-plasma-better-animations/</guid><description>&lt;!-- Example wording for a change, MR version. (Developer Name, [repo-name MR #xxx](https://invent.kde.org/plasma/repo-name/-/merge_requests/xxx)) --&gt;
&lt;!-- Example wording for a change, Bugzilla version. (Developer Name, [KDE Bugzilla #xxx](https://bugs.kde.org/show_bug.cgi?id=xxx)) --&gt;
&lt;!-- ![](thumbnail.png) --&gt;
&lt;!--
&lt;section class="swiper d-flex mb-5" aria-label="Screenshots" role="list"&gt;
&lt;div class="swiper-wrapper d-flex my-3" role="listitem"&gt;
&lt;/div&gt;
&lt;div class="swiper-pagination" style="bottom: 0"&gt;&lt;/div&gt;
&lt;div class="swiper-button-prev"&gt;&lt;/div&gt;
&lt;div class="swiper-button-next"&gt;&lt;/div&gt;
&lt;/section&gt;
--&gt;
&lt;!--
&lt;figure class="text-center ratio ratio-16x9" style=""&gt;
&lt;video controls&gt;&lt;source src="%25!s%28%3cnil%3e%29something.mp4" type="video/mp4" /&gt;&lt;/video&gt;&lt;/figure&gt;
--&gt;
&lt;p&gt;Welcome to a new issue of &lt;em&gt;This Week in Plasma!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week Plasma 6.7 received a few more stabilization bug-fixes while attention turned towards the upcoming 6.8 release. Some exciting changes are in progress, and a few have already merged, including highly visible improvements to some common animations.&lt;/p&gt;
&lt;p&gt;Check it out!&lt;/p&gt;
&lt;h2 id="notable-new-features"&gt;Notable new features&lt;/h2&gt;
&lt;!-- Can find some with https://invent.kde.org/groups/plasma/-/merge_requests/?sort=merged_at_desc&amp;state=merged&amp;label_name%5B%5D=Feature&amp;first_page_size=20 --&gt;
&lt;h3 id="plasma-68"&gt;Plasma 6.8&lt;/h3&gt;
&lt;p&gt;Updated the Emoji Selector app to version 17 of the Unicode emoji standard, giving you access to derpy new emojis like “🫪️”. (Jens Jerosch, &lt;a target="_blank" href="https://invent.kde.org/plasma/plasma-desktop/-/merge_requests/3849"&gt;plasma-desktop MR #3849&lt;/a&gt;)&lt;/p&gt;
&lt;figure&gt;
&lt;img class="img-fluid" alt="New emojis in Emoji Selector app" src="https://blogs.kde.org/2026/07/04/this-week-in-plasma-better-animations/new-emojis.png"
style="max-width: 100%; height: auto"
/&gt;
&lt;/figure&gt;
&lt;h2 id="notable-ui-improvements"&gt;Notable UI improvements&lt;/h2&gt;
&lt;!-- Can find some with https://invent.kde.org/groups/plasma/-/merge_requests/?sort=merged_at_desc&amp;state=merged&amp;label_name%5B%5D=Enhancement&amp;first_page_size=20 --&gt;
&lt;h3 id="plasma-672"&gt;Plasma 6.7.2&lt;/h3&gt;
&lt;p&gt;Moved the global “Move Mouse to Focus” and “Move Mouse to Center” actions out of the Zoom effect, so they still work even if you’ve globally disabled the Zoom effect. (Vlad Zahorodnii, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=522070"&gt;KDE Bugzilla #522070&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="plasma-673"&gt;Plasma 6.7.3&lt;/h3&gt;
&lt;p&gt;Made KRunner’s Bookmarks search provider return results for 2-character queries (so it will match “Qt”, for example), and use fewer system resources. (Kai Uwe Broulik, &lt;a target="_blank" href="https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/6764"&gt;plasma-workspace MR #6764&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The Clipboard widget’s Actions Configuration page now uses better internal margins for the content. (Levi Leal, &lt;a target="_blank" href="https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/6779"&gt;plasma-workspace MR #6779&lt;/a&gt;)&lt;/p&gt;
&lt;section class="swiper d-flex mb-5" aria-label="Screenshots" role="list"&gt;
&lt;div class="swiper-wrapper d-flex my-3" role="listitem"&gt;
&lt;div class="swiper-slide swiper-slide-active"&gt;
&lt;img src="https://blogs.kde.org/2026/07/04/this-week-in-plasma-better-animations/margins-after.png" alt="After" lazy class="rounded"&gt;
&lt;span class="d-block text-center mt-2"&gt;After&lt;/span&gt;
&lt;/div&gt;
&lt;div class="swiper-slide"&gt;
&lt;img src="https://blogs.kde.org/2026/07/04/this-week-in-plasma-better-animations/margins-before.png" alt="Before" lazy class="rounded"&gt;
&lt;span class="d-block text-center mt-2"&gt;Before&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="swiper-pagination" style="bottom: 0"&gt;&lt;/div&gt;
&lt;div class="swiper-button-prev"&gt;&lt;/div&gt;
&lt;div class="swiper-button-next"&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;h3 id="plasma-68-1"&gt;Plasma 6.8&lt;/h3&gt;
&lt;p&gt;The “Bouncing app icon” launch feedback style now uses a more visually pleasing animation with a better physics model, a more appropriate easing curve, and a higher frame-rate. (The Entropyist, &lt;a target="_blank" href="https://invent.kde.org/plasma/kwin/-/merge_requests/9487"&gt;kwin MR #9487&lt;/a&gt;)&lt;/p&gt;
&lt;figure class="text-center ratio ratio-16x9" style=""&gt;
&lt;video controls&gt;&lt;source src="https://blogs.kde.org/2026/07/04/this-week-in-plasma-better-animations/nicer-bouncing.webm" type="video/mp4" /&gt;&lt;/video&gt;&lt;/figure&gt;
&lt;p&gt;The new sliding animation for notifications now uses a more natural easing curve, so it looks even better than it already did! (Thomas Duckworth, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=522276"&gt;KDE Bugzilla #522276&lt;/a&gt;)&lt;/p&gt;
&lt;figure class="text-center ratio ratio-16x9" style=""&gt;
&lt;video controls&gt;&lt;source src="https://blogs.kde.org/2026/07/04/this-week-in-plasma-better-animations/notification-easing-curve.webm" type="video/mp4" /&gt;&lt;/video&gt;&lt;/figure&gt;
&lt;p&gt;There’s no longer a secret keyboard shortcut (previously &lt;kbd&gt;Meta&lt;/kbd&gt;+&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;x&lt;/kbd&gt;) that turns on clipboard actions. This was easy to press by accident, and would then make weird popups appear when you copied URLs. (Tobias Fella, &lt;a target="_blank" href="https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/6773"&gt;plasma-workspace MR #6773&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The Digital Clock widget now requests “tabular numerals”, which are monospaced digits supported by some fonts. The use of these numerals prevents the clock from changing its width as time passed in a few edge cases where the existing code to prevent that wasn’t good enough. (Christoph Wolk, &lt;a target="_blank" href="https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/6797"&gt;plasma-workspace MR #6797&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Discover’s old “CD and DVD” category is now named “Disc Burning”, because that’s what apps expect it to be, which explains why it only contained disc burning apps. (Nate Graham, &lt;a target="_blank" href="https://invent.kde.org/plasma/discover/-/merge_requests/1350"&gt;discover MR #1350&lt;/a&gt;)&lt;/p&gt;
&lt;section class="swiper d-flex mb-5" aria-label="Screenshots" role="list"&gt;
&lt;div class="swiper-wrapper d-flex my-3" role="listitem"&gt;
&lt;div class="swiper-slide swiper-slide-active"&gt;
&lt;img src="https://blogs.kde.org/2026/07/04/this-week-in-plasma-better-animations/discs-after.png" alt="After" lazy class="rounded"&gt;
&lt;span class="d-block text-center mt-2"&gt;After&lt;/span&gt;
&lt;/div&gt;
&lt;div class="swiper-slide"&gt;
&lt;img src="https://blogs.kde.org/2026/07/04/this-week-in-plasma-better-animations/discs-before.png" alt="Before" lazy class="rounded"&gt;
&lt;span class="d-block text-center mt-2"&gt;Before&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="swiper-pagination" style="bottom: 0"&gt;&lt;/div&gt;
&lt;div class="swiper-button-prev"&gt;&lt;/div&gt;
&lt;div class="swiper-button-next"&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;p&gt;&lt;em&gt;And before you ask: no, we couldn’t instead change the category to include all apps related to CDs and DVDs, because it’s a &lt;a target="_blank" href="https://specifications.freedesktop.org/menu/latest/additional-category-registry.html"&gt;standard category governed by a FreeDesktop spec&lt;/a&gt;, and to do that, &lt;a target="_blank" href="https://gitlab.freedesktop.org/xdg/xdg-specs/-/work_items/256"&gt;we’d need a new one&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Info Center’s Memory page now shows a busy indicator if it takes more than a moment to load. (Kai Uwe Broulik, &lt;a target="_blank" href="https://invent.kde.org/plasma/kinfocenter/-/merge_requests/305"&gt;kinfocenter MR #305&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;You can now find the System Settings page responsible for the “press and hold a key to see alternative characters” popup, so you can more easily turn it on or off or change how the delay before it appears. (Kristen McWilliam, &lt;a target="_blank" href="https://invent.kde.org/plasma/plasma-keyboard/-/merge_requests/154"&gt;plasma-keyboard MR #154&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The DrKonqi crash reporting wizard now tells you when it’s safe to close the window. (Antti Savolainen, &lt;a target="_blank" href="https://invent.kde.org/plasma/drkonqi/-/merge_requests/397"&gt;drkonqi MR #397&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id="notable-bug-fixes"&gt;Notable bug fixes&lt;/h2&gt;
&lt;!--
Can find some with:
- HI and VHI bugs fixed: https://tinyurl.com/bdepnh4v
- All bugs fixed: https://invent.kde.org/groups/plasma/-/merge_requests/?sort=merged_at_desc&amp;state=merged&amp;label_name%5B%5D=Bugfix&amp;first_page_size=20
--&gt;
&lt;h3 id="plasma-666"&gt;Plasma 6.6.6&lt;/h3&gt;
&lt;p&gt;Hardened the Task Manager widget against maliciously-crafted .desktop files for apps (David Edmundson, &lt;a target="_blank" href="https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/6817"&gt;plasma-workspace MR #6817&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Hardened the &lt;code&gt;ksystemstats_intel_helper&lt;/code&gt; process against path traversal attacks. (Matthias Gerstner, &lt;a target="_blank" href="https://invent.kde.org/plasma/ksystemstats/-/merge_requests/141"&gt;ksystemstats MR #141&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="plasma-672-1"&gt;Plasma 6.7.2&lt;/h3&gt;
&lt;p&gt;Fixed a recent regression that made certain screens incorrectly notify about being disconnected and re-connected in a loop after they want to sleep. (Xaver Hugl, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521826"&gt;KDE Bugzilla #521826&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Fixed a recent regression that produced corrupted visuals on some rotated screens and with some older AMD GPUs. (Xaver Hugl, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521878"&gt;KDE Bugzilla #521878&lt;/a&gt; and &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521764"&gt;KDE Bugzilla #521764&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Fixed a recent regression that broke the ability to drag desktop files and folders between screens. (Marco Martin, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521713"&gt;KDE Bugzilla #521713&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Fixed a recent regression that made SDR content look a bit de-saturated for some screens while in HDR mode. (Xaver Hugl, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521759"&gt;KDE Bugzilla #521759&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Fixed a recent regression that made certain ICC profiles show the wrong colors. (Xaver Hugl, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=522301"&gt;KDE Bugzilla #522301&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Fixed a recent regression that made KWin lag and hang when playing certain poorly-optimized games via Proton. (Vlad Zahorodnii, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=522005"&gt;KDE Bugzilla #522005&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The implementation of the new “press and hold for alternative characters” feature now prioritizes compatibility for apps, fixing a massive number of bugs. (Kristen McWilliam, &lt;a target="_blank" href="https://invent.kde.org/plasma/plasma-keyboard/-/merge_requests/152"&gt;plasma-keyboard MR #152&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The new Vietnamese calendar now shows the correct dates. (Trần Nam Tuấn, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=522099"&gt;KDE Bugzilla #522099&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The new feature to show how much earlier or later a time zone is than your current one now correctly calculates the value for time zones with a half-hour offset that are earlier than your local time zone. Time is hard. (Michael Kohl, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=522037"&gt;KDE Bugzilla #522037&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Forcing the use of the software pointer no longer makes it disappear when a window pushes a panel in “Dodge Windows” mode into its hidden state. (Xaver Hugl, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521953"&gt;KDE Bugzilla #521953&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The Mouse page in System Settings no longer shows layout glitches on X11. (Marco Martin, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521992"&gt;KDE Bugzilla #521992&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Text on the Networks widget’s Details tab can no longer visually overflow when it’s really long. (Manuel Alcaraz, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=522333"&gt;KDE Bugzilla #522333&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id="plasma-673-1"&gt;Plasma 6.7.3&lt;/h2&gt;
&lt;p&gt;The “Kameleon” system service is now disabled by default, which prevents it from applying a color to your keyboard’s backlit keys even if the feature to apply colors to RGB keyboard backlighting disabled. The context here is that we added support for the Steam Machine’s LED strip, and this also made it work for many keyboards, but exposed a pre-existing bug. (Oliver Beard, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521793"&gt;KDE Bugzilla #521793&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Spectacle no longer includes the tooltip showing image dimensions in the final screenshot if you accept a rectangular region by double-clicking it. (Noah Davis, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=513715"&gt;KDE Bugzilla #513715&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="plasma-68-2"&gt;Plasma 6.8&lt;/h3&gt;
&lt;p&gt;Fixed the most common crash in Plasma, which could happen once in a while when using multiple screens. (Marco Martin, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=500044"&gt;KDE Bugzilla #500044&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Minimizing the window of an RDP client no longer stops the video stream. (Shouvik Kar, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=497765"&gt;KDE Bugzilla #497765&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="frameworks-628"&gt;Frameworks 6.28&lt;/h3&gt;
&lt;p&gt;XWayland-using apps no longer start to behave in a couple of weird and quirky ways after XWayland itself crashes and restarts. (Vlad Zahorodnii, &lt;a target="_blank" href="https://invent.kde.org/frameworks/kwindowsystem/-/merge_requests/220"&gt;kwindowsystem MR #220&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id="notable-in-performance--technical"&gt;Notable in performance &amp;amp; technical&lt;/h2&gt;
&lt;h3 id="plasma-673-2"&gt;Plasma 6.7.3&lt;/h3&gt;
&lt;p&gt;Fixed a recent performance regression that increased KWin’s CPU usage on some Intel systems using atomic mode-setting. (Xaver Hugl, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=522075"&gt;KDE Bugzilla #522075&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="plasma-68-3"&gt;Plasma 6.8&lt;/h3&gt;
&lt;p&gt;Implemented support for version 1.6 of the Emulated Input system. (David Edmundson, &lt;a target="_blank" href="https://invent.kde.org/plasma/kwin/-/merge_requests/9112"&gt;kwin MR #9112&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;KWin now internally only uses OpenGL ES, which ensures that it will always be working since everyone will be using it — at least until Vulkan support is farther along. OpenGL ES is necessary for some old GPUs and turns out to be sufficient for everything KWin needs anyway, so we don’t anticipate any downsides from this change. (Xaver Hugl, &lt;a target="_blank" href="https://invent.kde.org/plasma/kwin/-/merge_requests/9488"&gt;kwin MR #9488&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id="how-you-can-help"&gt;How you can help&lt;/h2&gt;
&lt;p&gt;KDE has become important in the world, and your time and contributions have helped us get there. As we grow, we need your support to keep KDE sustainable.&lt;/p&gt;
&lt;p&gt;Would you like to help put together this weekly report? Introduce yourself in &lt;a target="_blank" href="https://matrix.to/#/%23this-week-kde-apps:kde.org"&gt;the Matrix room&lt;/a&gt; and &lt;a target="_blank" href="https://community.kde.org/Promotion/This_week_in_KDE"&gt;join the team&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Beyond that, you can help KDE by directly &lt;a target="_blank" href="https://community.kde.org/Get_Involved"&gt;getting involved&lt;/a&gt; in any other projects. Donating time is actually more impactful than donating money. Each contributor makes a huge difference in KDE — you are not a number or a cog in a machine! You don’t have to be a programmer, either; many other opportunities exist.&lt;/p&gt;
&lt;p&gt;You can also help out by &lt;a target="_blank" href="https://kde.org/donate"&gt;making a donation&lt;/a&gt;! This helps cover operational costs, salaries, travel expenses for contributors, and in general just keeps KDE bringing Free Software to the world.&lt;/p&gt;
&lt;h2 id="to-get-a-new-plasma-feature-or-a-bug-fix-mentioned-here"&gt;To get a new Plasma feature or a bug fix mentioned here&lt;/h2&gt;
&lt;p&gt;Push a commit to &lt;a target="_blank" href="https://invent.kde.org/websites/blogs-kde-org/-/merge_requests/?label_name%5B%5D=This%20Week%20in%20Plasma"&gt;the relevant merge request on invent.kde.org&lt;/a&gt;.&lt;/p&gt;</description><author>Nate Graham</author></item><item><title>Tellico 4.2.1 Released</title><link>https://tellico-project.org/tellico-4-2-1-released/</link><pubDate>Fri, 03 Jul 2026 16:55:14 +0000</pubDate><guid isPermaLink="true">https://tellico-project.org/?p=520</guid><description>&lt;p&gt;Tellico 4.2.1 &lt;a href="//tellico-project.org/download"&gt;is available&lt;/a&gt;, with some improvements and bug fixes.&lt;br /&gt;
&lt;span id="more-520"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Improvements:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Added user-defined data fetch argument (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=516055"&gt;Bug 516055&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Updated &lt;a target="_blank" href="https://scholar.google.com"&gt;Google Scholar&lt;/a&gt; and &lt;a target="_blank" href="https://colnect.com"&gt;Colnect&lt;/a&gt; data sources.&lt;/li&gt;
&lt;li&gt;Updated &lt;a target="_blank" href="https://books.google.com"&gt;Google Books&lt;/a&gt; data source (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=522095"&gt;Bug 522095&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Updated external data source to allow termination by user (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=516057"&gt;Bug 516057&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Updated to allow multiple ISBN values (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521157"&gt;Bug 521157&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Updated Album template to hide empty track tables and use loan information.&lt;/li&gt;
&lt;li&gt;Increased minimum image reader memory limit.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Bug Fixes:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fixed bug with exporting linked images (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=522094"&gt;Bug 522094&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Fixed bug with parsing field names with emoji (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521148"&gt;Bug 521148&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;</description><author>Tellico Blog</author></item><item><title>Web Review, Week 2026-27</title><link>https://ervin.ipsquad.net/blog/2026/07/03/web-review-week-2026-27/</link><pubDate>Fri, 03 Jul 2026 10:36:56 +0000</pubDate><guid isPermaLink="true">https://ervin.ipsquad.net/blog/2026/07/03/web-review-week-2026-27/</guid><description>&lt;p&gt;Let&amp;rsquo;s go for my web review for the week 2026-27.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="what-happened-to-the-fight-for-the-internet"&gt;What happened to the fight for the Internet?&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, politics, surveillance&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Excellent piece, where are the netizens who should be fighting back those bills? Looks like we became very complacent and passivity reigns this time around. Didn&amp;rsquo;t think it was related to the pervasive centralisation already in place&amp;hellip; but indeed that might be a strong contributing factor.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://dustycloud.org/blog/what-happened-to-the-fight-for-the-internet/"&gt;https://dustycloud.org/blog/what-happened-to-the-fight-for-the-internet/&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="age-verification-is-just-a-precursor-to-attribution-of-speech"&gt;Age verification is just a precursor to attribution of speech&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, politics, law, surveillance&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Definitely this, we can&amp;rsquo;t trust this kind of mechanism for what they open the door to.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://nonogra.ph/age-verification-is-just-a-precursor-to-attribution-of-speech-06-29-2026"&gt;https://nonogra.ph/age-verification-is-just-a-precursor-to-attribution-of-speech-06-29-2026&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="my-review-of-uruky"&gt;my review of uruky&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, web, search&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Several times I bump into articles praising this one. I&amp;rsquo;ve been test driving it a bit, the experience is still a bit bare but it&amp;rsquo;s clearly maturing. Definitely an option to keep an eye on in my opinion.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://blog.sulimans.space/my-review-of-uruky/"&gt;https://blog.sulimans.space/my-review-of-uruky/&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="zuckerbergs-increasingly-bizarre-war-on-whistleblowers"&gt;Zuckerberg’s increasingly bizarre war on whistleblowers&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, social-media, facebook, ethics&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There might be a method behind the madness of the thin skinned autocrat heading Meta&amp;hellip; Unfortunately it probably works.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://pluralistic.net/2026/06/27/zuckerstreisand-2/"&gt;https://pluralistic.net/2026/06/27/zuckerstreisand-2/&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="chatbots-vs-ozone"&gt;Chatbots vs. Ozone&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, geospatial, ai, machine-learning, gpt, economics, ecology&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;More reasons why the whole &amp;ldquo;data centers in space idea&amp;rdquo; is stupidly dangerous and likely unreachable.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://blog.dshr.org/2026/05/chatbots-vs-ozone.html?m=1"&gt;https://blog.dshr.org/2026/05/chatbots-vs-ozone.html?m=1&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="claude-code-is-steganographically-marking-requests"&gt;Claude Code Is Steganographically Marking Requests&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, ai, machine-learning, gpt, copilot, trust, security, privacy&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You sure you can trust those systems? It&amp;rsquo;s proprietary software and they&amp;rsquo;re clearly on a slippery slop. For something so security sensitive this is concerning.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://thereallo.dev/blog/claude-code-prompt-steganography"&gt;https://thereallo.dev/blog/claude-code-prompt-steganography&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="prompt-injection-as-role-confusion"&gt;Prompt Injection as Role Confusion&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, ai, machine-learning, gpt, cognition, security, safety&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Interesting paper (go to the full one for all the details) which shows that with the current architecture it&amp;rsquo;s really hard if not impossible to make safe systems with LLMs. This gives interesting insights in the weird form of proto-cognition those models exhibit.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://role-confusion.github.io/"&gt;https://role-confusion.github.io/&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="text-editor-data-structures"&gt;Text Editor: Data Structures&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, text, editor, design&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Neat introduction to the right data structures to use when making a text editor.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://www.averylaird.com/programming/the%20text%20editor/2017/09/30/the-piece-table.html"&gt;https://www.averylaird.com/programming/the%20text%20editor/2017/09/30/the-piece-table.html&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="engineering-high-performance-parsers-with-data-oriented-design"&gt;Engineering High-Performance Parsers with Data-Oriented Design&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, data-oriented, architecture, performance, parsing&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Interesting article applying data oriented design to parsing tasks. This is really a good approach for performance.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://www.arshad.fyi/writings/engineering-high-performance-parsers"&gt;https://www.arshad.fyi/writings/engineering-high-performance-parsers&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="data-access-patterns-that-makes-your-cpu-really-angry"&gt;Data Access Patterns That Makes Your CPU Really Angry&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, cpu, memory, hardware, performance&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Interesting experiment on how to totally break the performance of memory accesses. This gives good insights on the whole chain works.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://blog.weineng.me/posts/slowest_add/"&gt;https://blog.weineng.me/posts/slowest_add/&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="the-physics-of-memory"&gt;The Physics of Memory&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, javascript, memory, data-oriented, performance&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Unsurprisingly cache locality is a very important factor. What&amp;rsquo;s interesting here is that it still applies to a language like Javascript where you&amp;rsquo;d expect to not have enough control on the memory layout to reap any benefits.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://www.dmurph.com/posts/2026/06/ecs_vs_oop_benchmark/ecs_vs_oop_benchmark.html"&gt;https://www.dmurph.com/posts/2026/06/ecs_vs_oop_benchmark/ecs_vs_oop_benchmark.html&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="high-performance-rust-understanding-and-eliminating-memory-fragmentation"&gt;High-performance Rust: Understanding and eliminating memory fragmentation&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, rust, memory, embedded, performance&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Interesting Rust options to limit the amount of heap allocations if you&amp;rsquo;re constrained by memory or for performance reasons.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://kerkour.com/rust-high-performance-memory-fragmentation-allocations"&gt;https://kerkour.com/rust-high-performance-memory-fragmentation-allocations&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="hobbys-algorithm-for-aesthetic-bézier-splines"&gt;Hobby’s algorithm for aesthetic Bézier splines&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, graphics, mathematics&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Interested in splines? This is a gentle introduction which points to further resources if you want to implement them.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://www.jakelow.com/blog/hobby-curves#fn-2"&gt;https://www.jakelow.com/blog/hobby-curves#fn-2&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="what-to-learn-to-be-a-real-time-graphics-programmer"&gt;What To Learn To Be A Real Time Graphics Programmer&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, 3d, shader, mathematics, graphics&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Wondering what to learn to get into graphics programming? This is a nice list.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://blog.demofox.org/2026/07/01/what-to-learn-to-be-a-graphics-programmer/"&gt;https://blog.demofox.org/2026/07/01/what-to-learn-to-be-a-graphics-programmer/&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="announcing-box3d"&gt;Announcing Box3D&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, physics, simulation, 3d&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Exciting! This looks like a neat 3D physics engine.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://box2d.org/posts/2026/06/announcing-box3d/"&gt;https://box2d.org/posts/2026/06/announcing-box3d/&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="the-essence-of-architectural-work"&gt;The essence of architectural work&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, architecture, complexity&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is an ongoing series, but there are good insights about software architecture work in the first few articles. Shows quite well the important tradeoffs and the usual traps.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://www.ufried.com/blog/essence_of_architecture_1/"&gt;https://www.ufried.com/blog/essence_of_architecture_1/&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="every-bottlenose-dolphin-invents-a-unique-whistle-that-becomes-its-name"&gt;Every bottlenose dolphin invents a unique whistle that becomes its name&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: biology, nature, cognition&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So using personal names is not an inherently human trait, this is confirmed through research now. Before their were signs and suspicions, but now the trail of evidences is strong.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://spacedaily.com/d-within-the-first-few-months-of-life-every-bottlenose-dolphin-invents-a-unique-whistle-that-becomes-its-name-for-the-rest-of-its-life-and-other-dolphins-learn-that-whistle-remember-it-and/"&gt;https://spacedaily.com/d-within-the-first-few-months-of-life-every-bottlenose-dolphin-invents-a-unique-whistle-that-becomes-its-name-for-the-rest-of-its-life-and-other-dolphins-learn-that-whistle-remember-it-and/&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="notes-from-a-burning-paris"&gt;Notes from a burning Paris&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: climate, ecology&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is what things will look like in the coming years. Only probably worse, and for more and more people.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://sarahwilson.substack.com/p/notes-from-a-burning-paris"&gt;https://sarahwilson.substack.com/p/notes-from-a-burning-paris&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;hr&gt;
&lt;p&gt;Bye for now!&lt;/p&gt;</description><author>Kevin Ottens</author></item><item><title>Attention to Detail</title><link>https://blog.broulik.de/2026/07/attention-to-detail/</link><pubDate>Fri, 03 Jul 2026 10:23:38 +0000</pubDate><guid isPermaLink="true">https://blog.broulik.de/?p=2922</guid><description>&lt;p class="wp-block-paragraph"&gt;A couple of months ago I improved &lt;a target="_blank" href="https://blog.broulik.de/2026/02/nifty-dialogs/" data-type="post" data-id="2765"&gt;some of our dialogs&lt;/a&gt; and this time I worked on some more. Did you know that you can just paste the clipboard’s content into the Dolphin file manager or on the desktop to create a new file from it?&lt;/p&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;a target="_blank" href="https://blog.broulik.de/wp-content/uploads/2026/06/Bildschirmfoto_20260630_103029.png"&gt;&lt;img fetchpriority="high" decoding="async" width="1024" height="606" src="https://blog.broulik.de/wp-content/uploads/2026/06/Bildschirmfoto_20260630_103029-1024x606.png" alt="Dialog box &amp;quot;Paste Clipboard Content&amp;quot; prompt for &amp;quot;Filename for clipboard content:&amp;quot;. Name is &amp;quot;pasted file.html&amp;quot;" class="wp-image-2951" srcset="https://blog.broulik.de/wp-content/uploads/2026/06/Bildschirmfoto_20260630_103029-1024x606.png 1024w, https://blog.broulik.de/wp-content/uploads/2026/06/Bildschirmfoto_20260630_103029-300x178.png 300w, https://blog.broulik.de/wp-content/uploads/2026/06/Bildschirmfoto_20260630_103029-768x455.png 768w, https://blog.broulik.de/wp-content/uploads/2026/06/Bildschirmfoto_20260630_103029.png 1042w" sizes="(max-width: 1024px) 100vw, 1024px" /&gt;&lt;/a&gt;&lt;figcaption class="wp-element-caption"&gt;Just paste your clipboard’s content to create a new file&lt;/figcaption&gt;&lt;/figure&gt;
&lt;span id="more-2922"&gt;&lt;/span&gt;
&lt;p class="wp-block-paragraph"&gt;Tobias Fella added a proper “platform message dialog” for Qt to use. This replaces the hideous Qt Quick message dialogs you could see in some places. With that, we are also finally able to play our message box sounds for Qt-only applications using &lt;em&gt;QMessageBox&lt;/em&gt; (instead of &lt;em&gt;KMessageBox&lt;/em&gt; or &lt;em&gt;KMessageDialog&lt;/em&gt;). To do this, Qt sends an &lt;em&gt;QAccessible::Alert&lt;/em&gt; event that is then handled by the relevant platform accessibility integration. On Windows it for example calls the win32 &lt;em&gt;PlaySound&lt;/em&gt; API. However, I didn’t want to mess with Qt’s AT-SPI&lt;sup data-fn="e9594b60-b64f-4758-9c3b-17eaf3423cac" class="fn"&gt;&lt;a href="#e9594b60-b64f-4758-9c3b-17eaf3423cac" id="e9594b60-b64f-4758-9c3b-17eaf3423cac-link"&gt;1&lt;/a&gt;&lt;/sup&gt; stack just for this. Now that we provide a custom dialog, we might as well play the sound from there.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Just like the “New File” dialog, the paste dialog mentioned above also displays the file icon now. It also tries to guess what kind of file it is and automatically suggests a matching file extension. For example, copying something that looks like HTML will suggest the name “pasted file.html”. You are of course still free to choose a different file name and extension.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;An application can also suggest a name using the custom &lt;em&gt;application/x-kde-suggestedfilename&lt;/em&gt; MIME type. &lt;a target="_blank" href="https://apps.kde.org/spectacle/" data-type="link" data-id="https://apps.kde.org/spectacle/" target="_blank" rel="noreferrer noopener"&gt;Spectacle&lt;/a&gt; does this so a screenshot copied to clipboard and then pasted (rather than saved directly) will nevertheless use a “Screenshot_xyz” file name. The clipboard history now remembers the suggested name when it stores an entry so when you recall it later it will still use that name as expected.&lt;/p&gt;
&lt;figure class="wp-block-image size-full"&gt;&lt;a target="_blank" href="https://blog.broulik.de/wp-content/uploads/2026/06/Bildschirmfoto_20260630_102423.png"&gt;&lt;img decoding="async" width="857" height="934" src="https://blog.broulik.de/wp-content/uploads/2026/06/Bildschirmfoto_20260630_102423.png" alt="Configuration dialog “Color Themes”, select theme drop.down with various themes and each one has a little colored square preview for the colors" class="wp-image-2949" srcset="https://blog.broulik.de/wp-content/uploads/2026/06/Bildschirmfoto_20260630_102423.png 857w, https://blog.broulik.de/wp-content/uploads/2026/06/Bildschirmfoto_20260630_102423-275x300.png 275w, https://blog.broulik.de/wp-content/uploads/2026/06/Bildschirmfoto_20260630_102423-768x837.png 768w" sizes="(max-width: 857px) 100vw, 857px" /&gt;&lt;/a&gt;&lt;figcaption class="wp-element-caption"&gt;Little preview icon when configuring syntax highlighting&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p class="wp-block-paragraph"&gt;When dropping a folder into Kate, all files contained within will be opened. Kate has always been able to open files on remote locations thanks to KIO but the drag and drop code only worked with local folders. This is now fixed and you can drop a folder from a SMB or other share into your Kate the same way as any local one. &lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;A nifty addition to both the menu and settings page for choosing a syntax highlighting color scheme is a little preview icon similar to the application color scheme. This lets you roughly judge the appearance of the theme before selecting it.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Finally, KWin’s debug console (Open KRunner, type “KWin”) received a “Pick Window…” button. This way you can more easily find a particular window in the potentially long list of windows. The &lt;em&gt;kwindowprop&lt;/em&gt; tool (KWin’s equivalent to &lt;em&gt;xprop&lt;/em&gt;) now also includes the PID of the process owning the window.&lt;/p&gt;
&lt;ol class="wp-block-footnotes"&gt;&lt;li id="e9594b60-b64f-4758-9c3b-17eaf3423cac"&gt;Assistive Technology Service Provider Interface, a cross-desktop accessibility framework &lt;a href="#e9594b60-b64f-4758-9c3b-17eaf3423cac-link" aria-label="Jump to footnote reference 1"&gt;&lt;img src="https://s.w.org/images/core/emoji/17.0.2/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" /&gt;︎&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</description><author>Kai Uwe Broulik</author></item><item><title>Week 5: KWallet XML Import &amp; Password Generator</title><link>https://roshani-gsoc.bearblog.dev/week-5-kwallet-xml-import-password-generator/</link><pubDate>Thu, 02 Jul 2026 12:48:00 +0000</pubDate><guid isPermaLink="true">https://roshani-gsoc.bearblog.dev/week-5-kwallet-xml-import-password-generator/</guid><description>&lt;p&gt;This week I shipped two new features for KeepSecret.
KWallet XML Import (&lt;a target="_blank" href='https://invent.kde.org/utilities/keepsecret/-/merge_requests/34'&gt;!34&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The Import menu on the wallet page is now a submenu with two options:&lt;/p&gt;
&lt;p&gt;-KeepSecret…&lt;/p&gt;
&lt;p&gt;-KWallet XML…&lt;/p&gt;
&lt;p&gt;Both import formats are converted into the same internal format, allowing them to use the existing import code. I only implemented import support, since exporting to the old KWallet format wasn't necessary because KWallet is being deprecated.&lt;/p&gt;
&lt;p&gt;Password Generator (&lt;a target="_blank" href='https://invent.kde.org/utilities/keepsecret/-/merge_requests/35'&gt;!35&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;I added a Generate button to the Create New Entry dialog. Clicking it generates a random 16-character password and fills the password field.&lt;/p&gt;
&lt;p&gt;The password is generated in SecretItemProxy::generatePassword() using QRandomGenerator::global(), which uses the operating system's secure random source. A character set is built from the selected options (lowercase letters, uppercase letters, numbers, and symbols), and each character is chosen randomly from that set. This also allows passwords to include symbols like !@#$%^&amp;*.&lt;/p&gt;
&lt;p&gt;The function returns a QByteArray instead of a QString, matching the existing code and avoiding an unnecessary copy of the secret in C++.&lt;/p&gt;
&lt;p&gt;During code review, &lt;a target="_blank" href='https://invent.kde.org/michaelkde'&gt;Michael K83&lt;/a&gt; pointed out that secrets stored in normal QByteArray or QString objects are not automatically erased from memory after use. He suggested looking at how ksecretd and KeePassXC handle secure memory.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href='https://invent.kde.org/mart'&gt;Marco Martin&lt;/a&gt; explained that an even bigger challenge exists once the password reaches QML. The password becomes a QString inside the QML engine, where Qt may create multiple internal copies that cannot be explicitly cleared. It will be addressed separately in issue &lt;a target="_blank" href='https://invent.kde.org/utilities/keepsecret/-/work_items/25#note_1531060'&gt;#25&lt;/a&gt;.&lt;/p&gt;</description><author>Roshani Kumari</author></item><item><title>KDE Gear 26.04.3</title><link>https://kde.org/announcements/gear/26.04.3/</link><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><guid isPermaLink="true">https://kde.org/announcements/gear/26.04.3/</guid><description>&lt;p&gt;Over 180 individual programs plus dozens of programmer libraries and feature plugins are released simultaneously as part of KDE Gear.&lt;/p&gt;
&lt;p&gt;Today they all get new bugfix source releases with updated translations, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;elisa: Change output device when global output is changed (&lt;a target="_blank" href="https://commits.kde.org/elisa/82a243243ec67c267c1e5e68407680e7ec7f5fa3"&gt;Commit&lt;/a&gt;, fixes bug &lt;a target="_blank" href="https://bugs.kde.org/512126"&gt;#512126&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;kdeconnect: Fix file transfers when notification sending is enabled (&lt;a target="_blank" href="https://commits.kde.org/kdeconnect-kde/63f88e89935467dbba8aab38926d9f18e0f9065f"&gt;Commit&lt;/a&gt;, fixes bug &lt;a target="_blank" href="https://bugs.kde.org/516765"&gt;#516765&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;kdenlive: Fix timeline playhead going out of view while playing (&lt;a target="_blank" href="https://commits.kde.org/kdenlive/2f2a35bf4089bb53d8d00b7b5c881cd3bbd97a9f"&gt;Commit&lt;/a&gt;, fixes bug &lt;a target="_blank" href="https://bugs.kde.org/517494"&gt;#517494&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Distro and app store packagers should update their application packages.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="https://community.kde.org/KDE_Gear/26.04_Release_notes"&gt;26.04 release notes&lt;/a&gt; for information on tarballs and known issues.&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="https://community.kde.org/Get_KDE_Software_on_Your_Linux_Distro"&gt;Package download wiki page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="https://kde.org/info/releases-26.04.3/"&gt;26.04.3 source info page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="https://kde.org/announcements/changelogs/gear/26.04.3/"&gt;26.04.3 full changelog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>KDE Community</author></item><item><title>Persistent copyright &amp; licensing information in client-side JavaScript, CSS and similar – feedback and second proposal</title><link>https://matija.suklje.name/persistent-copyright-licensing-information-in-client-side-javascript-css-and-similar-feedback-and-second-proposal</link><pubDate>Wed, 01 Jul 2026 22:00:00 +0000</pubDate><guid isPermaLink="false">tag:matija.suklje.name,2026-07-02:/persistent-copyright-licensing-information-in-client-side-javascript-css-and-similar-feedback-and-second-proposal</guid><description>&lt;p&gt;At &lt;strong&gt;&lt;abbr title="Free &amp;amp; Open Source Software Developers’ European Meeting"&gt;FOSDEM&lt;/abbr&gt; 2025&lt;/strong&gt; I presented my (intentionally controversial) &lt;a target="_blank" href="https://matija.suklje.name/persistent-copyright-licensing-information-in-client-side-javascript-css-and-similar-a-proposal-call-for-help"&gt;proposal how to keep copyright and licensing info in minified &lt;abbr title="JavaScript"&gt;JS&lt;/abbr&gt;/&lt;abbr title="Cascading Style Sheets"&gt;CSS&lt;/abbr&gt;&lt;/a&gt; and asked for feedback, including from &lt;em&gt;front-end developers&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Two months later, I took the feedback from &lt;abbr title="Free &amp;amp; Open Source Software Developers’ European Meeting"&gt;FOSDEM&lt;/abbr&gt; and held a small workshop session with a group consisting of &lt;em&gt;OSPO leaders&lt;/em&gt;, &lt;em&gt;&lt;abbr title="Free &amp;amp; Open Source Software"&gt;FOSS&lt;/abbr&gt; lawyers&lt;/em&gt; and a handful of &lt;abbr title="Free &amp;amp; Open Source Software"&gt;FOSS&lt;/abbr&gt; developers at &lt;strong&gt;&lt;abbr title="(Free Software) Legal &amp;amp; Licensing Workshop"&gt;LLW&lt;/abbr&gt; 2025&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This blog post was finished&lt;sup id="fnref:sorry"&gt;&lt;a class="footnote-ref" href="#fn:sorry"&gt;1&lt;/a&gt;&lt;/sup&gt; more than a year after both, so I will not be summarizing my &lt;a target="_blank" href="https://fosdem.org/2025/schedule/event/fosdem-2025-5313-persistent-copyright-licensing-information-in-client-side-js-css-sim-proposal-/"&gt;&lt;abbr title="Free &amp;amp; Open Source Software Developers’ European Meeting"&gt;FOSDEM&lt;/abbr&gt; talk&lt;/a&gt;, and suggest you listen to it (esp. the &lt;abbr title="Questions &amp;amp; Answers"&gt;Q&amp;amp;A&lt;/abbr&gt; part), if you are interested in the details.&lt;/p&gt;
&lt;p&gt;But I will summarize the results of both sessions below.&lt;/p&gt;
&lt;h1 id="are-sdpx-ids-enough-for-compliance-or-not-given-their-templating"&gt;Are SDPX IDs enough for compliance or not (given their templating)&lt;a class="headerlink" href="#are-sdpx-ids-enough-for-compliance-or-not-given-their-templating" title="Permanent link"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Someone argued that for certain licenses – specifically, e.g. the MIT and BSD family – even the &lt;a target="_blank" href="https://spdx.org/licenses/"&gt;&lt;abbr title="Software Package Data Exchange"&gt;SPDX&lt;/abbr&gt; License List&lt;/a&gt; has a some templating in place, and as such identifying it with just an &lt;abbr title="Software Package Data Exchange"&gt;SPDX&lt;/abbr&gt; ID would not fulfil the license obligations, by strict reading of the license.&lt;/p&gt;
&lt;p&gt;That is a concern that I identified already in my &lt;a target="_blank" href="https://matija.suklje.name/persistent-copyright-licensing-information-in-client-side-javascript-css-and-similar-a-proposal-call-for-help#is-this-really-enough"&gt;original proposal&lt;/a&gt; and I agree that my proposed approach has a certain amount of “handwaving”, which is not 100% risk-proof.&lt;/p&gt;
&lt;p&gt;(Spoiler: we fix this issue in the final proposal. Wait for the next blog post in this series.)&lt;/p&gt;
&lt;h1 id="impact-on-size-of-the-minifed-code"&gt;Impact on size of the minifed code&lt;a class="headerlink" href="#impact-on-size-of-the-minifed-code" title="Permanent link"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A common concern from web developers was how much keeping the &lt;abbr title="Software Package Data Exchange"&gt;SPDX&lt;/abbr&gt;/REUSE tags in the minified code would impact the its size.&lt;/p&gt;
&lt;p&gt;With the help of the wonderful &lt;a target="_blank" href="https://github.com/lukastaegert"&gt;Lukas Taegert-Atkinson&lt;/a&gt; of &lt;a target="_blank" href="https://rollupjs.org/"&gt;Rollup&lt;/a&gt; fame, we managed to get a good idea what the impact adding REUSE/&lt;abbr title="Software Package Data Exchange"&gt;SPDX&lt;/abbr&gt; tags to all the files would have on the size of the minified code.&lt;/p&gt;
&lt;p&gt;As an &lt;abbr title="Proof of Concept"&gt;PoC&lt;/abbr&gt; Lukas made the following change to the build process of &lt;a target="_blank" href="https://www.npmjs.com/package/@rollup/browser"&gt;Rollup Browser&lt;/a&gt;, so we could compare the size of the minified code before and after the diff.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;diff --git a/rollup.config.ts b/rollup.config.ts&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gd"&gt;--- a/rollup.config.ts (revision 384d5333fbc3d8918b41856822376da2a65ccaa3)&lt;/span&gt;
&lt;span class="gi"&gt;+++ b/rollup.config.ts (date 1742569205307)&lt;/span&gt;
&lt;span class="gu"&gt;@@ -152,7 +152,22 @@&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt; collectLicensesBrowser(),
&lt;span class="w"&gt; &lt;/span&gt; writeLicenseBrowser(),
&lt;span class="w"&gt; &lt;/span&gt; cleanBeforeWrite('browser/dist'),
&lt;span class="gd"&gt;- emitWasmFile()&lt;/span&gt;
&lt;span class="gi"&gt;+ emitWasmFile(),&lt;/span&gt;
&lt;span class="gi"&gt;+ &amp;#123;&lt;/span&gt;
&lt;span class="gi"&gt;+ name: 'add-fake-tags',&lt;/span&gt;
&lt;span class="gi"&gt;+ transform(code) &amp;#123;&lt;/span&gt;
&lt;span class="gi"&gt;+ return &amp;#123;&lt;/span&gt;
&lt;span class="gi"&gt;+ code: `/*!&lt;/span&gt;
&lt;span class="gi"&gt;+* SPDX-SnippetBegin&lt;/span&gt;
&lt;span class="gi"&gt;+* SPDX-SnippetCopyrightText: © 2021 Test Dummy &amp;lt;dummy@test.example&amp;gt;&lt;/span&gt;
&lt;span class="gi"&gt;+* SPDX-License-Identifier: BSD-2-Clause&lt;/span&gt;
&lt;span class="gi"&gt;+*/&lt;/span&gt;
&lt;span class="gi"&gt;+$&amp;#123;code}&lt;/span&gt;
&lt;span class="gi"&gt;+/*! SPDX-SnippetEnd */`,&lt;/span&gt;
&lt;span class="gi"&gt;+ map: &amp;#123; mappings: '' }&lt;/span&gt;
&lt;span class="gi"&gt;+ };&lt;/span&gt;
&lt;span class="gi"&gt;+ }&lt;/span&gt;
&lt;span class="gi"&gt;+ }&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt; ],
&lt;span class="w"&gt; &lt;/span&gt; strictDeprecations: true,
&lt;span class="w"&gt; &lt;/span&gt; treeshake
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If Rollup Browser was built as per default, the full minified code resulted in &lt;strong&gt;374 &lt;abbr title="kibibyte (1024 bytes)"&gt;KiB&lt;/abbr&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;After the patch that caused (dummy) snippet-level &lt;abbr title="Software Package Data Exchange"&gt;SPDX&lt;/abbr&gt; tags to be inserted into all the code (Rollup itself and its dependencies), the size grew to &lt;strong&gt;415 &lt;abbr title="kibibyte (1024 bytes)"&gt;KiB&lt;/abbr&gt;&lt;/strong&gt; though.&lt;/p&gt;
&lt;p&gt;That is a &lt;strong&gt;11%&lt;/strong&gt; increase in size. Not exactly negligible, but definitely far from terrible. And if tooling were to be updated, with de-duplication we could possibly take that number down quite a bit too.&lt;/p&gt;
&lt;p&gt;In the previous tiny &lt;a target="_blank" href="https://matija.suklje.name/persistent-copyright-licensing-information-in-client-side-javascript-css-and-similar-a-proposal-call-for-help#svelte-rollup-terser"&gt;Svelte + Rollup + Terser&lt;/a&gt; &lt;abbr title="Proof of Concept"&gt;PoC&lt;/abbr&gt;, both with and without &lt;abbr title="Software Package Data Exchange"&gt;SPDX&lt;/abbr&gt; tags are 12 &lt;abbr title="kibibyte (1024 bytes)"&gt;KiB&lt;/abbr&gt;, so we need take a magnifying glass to compare 12.681 bytes with tags, and 12.324 bytes without them – that is just a &lt;strong&gt;3%&lt;/strong&gt; difference.&lt;/p&gt;
&lt;p&gt;And in the previous &lt;a target="_blank" href="https://matija.suklje.name/persistent-copyright-licensing-information-in-client-side-javascript-css-and-similar-a-proposal-call-for-help#react-scripts-webpack-terser"&gt;React Scripts (+ WebPack + Terser)&lt;/a&gt; &lt;abbr title="Proof of Concept"&gt;PoC&lt;/abbr&gt;, the overall build size is virtually unchanged, but oddly enough while some files become bigger, others become smaller.&lt;/p&gt;
&lt;p&gt;With REUSE tags, the total size of &lt;code&gt;build/static/&lt;/code&gt; is 536 &lt;abbr title="kibibyte (1024 bytes)"&gt;KiB&lt;/abbr&gt; (specifically, 531.070 bytes):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;build/static/css:
.rw-r--r--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.038&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;01&lt;/span&gt;:54&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;main.05c219f8.css
.rw-r--r--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.759&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;01&lt;/span&gt;:54&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;main.05c219f8.css.map
build/static/js:
.rw-r--r--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.534&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;01&lt;/span&gt;:54&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;453&lt;/span&gt;.2a77899f.chunk.js
.rw-r--r--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.597&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;01&lt;/span&gt;:54&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;453&lt;/span&gt;.2a77899f.chunk.js.map
.rw-r--r--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;143&lt;/span&gt;.544&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;01&lt;/span&gt;:54&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;main.608edf8e.js
.rw-r--r--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.205&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;01&lt;/span&gt;:54&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;main.608edf8e.js.LICENSE.txt
.rw-r--r--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;368&lt;/span&gt;.393&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;01&lt;/span&gt;:54&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;main.608edf8e.js.map
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;and without the &lt;abbr title="Software Package Data Exchange"&gt;SPDX&lt;/abbr&gt; tags, the total size of &lt;code&gt;build/static/&lt;/code&gt; is also 536 &lt;abbr title="kibibyte (1024 bytes)"&gt;KiB&lt;/abbr&gt; (specifically, 529.880 bytes):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;build/static/css:
.rw-r--r--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;779&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;01&lt;/span&gt;:53&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;main.f855e6bc.css
.rw-r--r--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.427&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;01&lt;/span&gt;:53&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;main.f855e6bc.css.map
build/static/js:
.rw-r--r--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.534&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;01&lt;/span&gt;:53&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;453&lt;/span&gt;.2a77899f.chunk.js
.rw-r--r--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.597&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;01&lt;/span&gt;:53&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;453&lt;/span&gt;.2a77899f.chunk.js.map
.rw-r--r--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;143&lt;/span&gt;.544&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;01&lt;/span&gt;:53&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;main.608edf8e.js
.rw-r--r--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.070&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;01&lt;/span&gt;:53&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;main.608edf8e.js.LICENSE.txt
.rw-r--r--&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;367&lt;/span&gt;.929&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;apr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;01&lt;/span&gt;:53&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;main.608edf8e.js.map
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Which is a difference of measly &lt;strong&gt;0.2%&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Lukas was also quick to point out that a ballpark estimation of how much extra space this would take is quite easy to calculate, as all it is needed is to count all files that would be included in the final &lt;abbr title="JavaScript"&gt;JS&lt;/abbr&gt; (or &lt;abbr title="Cascading Style Sheets"&gt;CSS&lt;/abbr&gt;) bundle and multiply that with the size of the &lt;abbr title="Software Package Data Exchange"&gt;SPDX&lt;/abbr&gt; tags. As such, the impact would be bigger on projects that have many very short source code files, while smaller on those that have fewer, but longer source code files. Again, this is without taking any de-duplication into account.&lt;/p&gt;
&lt;p&gt;So we can come up with a generic formula:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;size = normal_minified_size + (number_of_files × 4_extra_lines)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1 id="what-was-the-cause-of-the-problem-with-the-snippet-begin-and-snippet-end-tags"&gt;What was the cause of the problem with the Snippet-Begin and Snippet-End tags?&lt;a class="headerlink" href="#what-was-the-cause-of-the-problem-with-the-snippet-begin-and-snippet-end-tags" title="Permanent link"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;You may recall in my &lt;a target="_blank" href="https://matija.suklje.name/persistent-copyright-licensing-information-in-client-side-javascript-css-and-similar-a-proposal-call-for-help#react-scripts-webpack-terser"&gt;original proposal&lt;/a&gt; that there was an issue with the &lt;code&gt;SPDX-Snippet-Begin&lt;/code&gt; and &lt;code&gt;SPDX-Snippet-End&lt;/code&gt; tags being jumbled in the resulting minified code.&lt;/p&gt;
&lt;p&gt;According to Lucas, this is most likely something Terser caused when associating comments to functions and then optimizing the code. He is fairly positive it can be solved though.&lt;/p&gt;
&lt;p&gt;(Again, spoiler: this will be a moot issue in the end. Wait for the next blog post.)&lt;/p&gt;
&lt;h1 id="do-we-need-tags-in-the-minified-code"&gt;Do we need tags in the minified code?&lt;a class="headerlink" href="#do-we-need-tags-in-the-minified-code" title="Permanent link"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Of course, a very good question is &lt;strong&gt;whether we &lt;em&gt;need&lt;/em&gt; the REUSE/&lt;abbr title="Software Package Data Exchange"&gt;SPDX&lt;/abbr&gt; tags in the minified code itself&lt;/strong&gt;. Especially, given that we do not require something as strict for other non-source code (e.g. compiled code).&lt;/p&gt;
&lt;p&gt;I admit, I do not think we actually need to.&lt;/p&gt;
&lt;p&gt;To be honest, why that is in the original proposal, is because I was trying to push just how far we can bring license compliance in client-side &lt;abbr title="JavaScript"&gt;JS&lt;/abbr&gt;/&lt;abbr title="Cascading Style Sheets"&gt;CSS&lt;/abbr&gt; by just leveraging already existing standards and tools. It turns out we can push it &lt;em&gt;very far&lt;/em&gt; – arguably ad absurdum &lt;code&gt;;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;So, no, I do not think we need that, but it was a good thought experiment and I think it was necessary to get discussion going&lt;sup id="fnref:hack"&gt;&lt;a class="footnote-ref" href="#fn:hack"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;h1 id="alternative-proposal-sbom"&gt;Alternative proposal: &lt;abbr title="Software Bill of Material"&gt;SBOM&lt;/abbr&gt;&lt;a class="headerlink" href="#alternative-proposal-sbom" title="Permanent link"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;But if we do not keep it &lt;em&gt;in&lt;/em&gt; the code we ship, &lt;strong&gt;where do we keep the license/copyright info then&lt;/strong&gt;?&lt;/p&gt;
&lt;p&gt;At &lt;abbr title="(Free Software) Legal &amp;amp; Licensing Workshop"&gt;LLW&lt;/abbr&gt; 2025 we had a pretty intense session where ultimately we came up with an alternative proposal to &lt;strong&gt;generate an &lt;abbr title="Software Bill of Material"&gt;SBOM&lt;/abbr&gt; and ship that instead&lt;/strong&gt;. This solves a lot of issues and is something that license compliance officers are already familiar with. It would also bring it closer to how we manage licensing when shipping non-web software.&lt;/p&gt;
&lt;p&gt;The &lt;abbr title="Software Bill of Material"&gt;SBOM&lt;/abbr&gt; approach would require use of tooling and by the end of the day we were left with a bunch of loose threads, but in general, this sounds like a good way forward.&lt;/p&gt;
&lt;h1 id="conclusion-plan-b-in-the-making"&gt;Conclusion: plan B in the making&lt;a class="headerlink" href="#conclusion-plan-b-in-the-making" title="Permanent link"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Was all the effort now wasted?&lt;/p&gt;
&lt;p&gt;Not at all.&lt;/p&gt;
&lt;p&gt;Web pages and (&lt;abbr title="Software as a Service"&gt;SaaS&lt;/abbr&gt;) web applications are still a bit of a different beast, so we learned a lot in the past two years due to this exercise.&lt;/p&gt;
&lt;p&gt;I am pretty confident we now have a way &lt;strong&gt;how to fulfil the license obligations&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;without making the web page too heavy;&lt;/li&gt;
&lt;li&gt;burdening web developers any more than other programmers;&lt;/li&gt;
&lt;li&gt;shipping machine-readable compliance artifacts; as well as&lt;/li&gt;
&lt;li&gt;making the information ready for human consumption too.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the next blog post I will present the final proposal.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;hook out → I think we’re slowly onto something …&lt;/em&gt;&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr/&gt;
&lt;ol&gt;
&lt;li id="fn:sorry"&gt;
&lt;p&gt;I am truly sorry, but there was just way too much going at work and in private, so I neglected my blogging for some time. &lt;a class="footnote-backref" href="#fnref:sorry" title="Jump back to footnote 1 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:hack"&gt;
&lt;p&gt;You know the old adage: The fastest way to get an answer to your question on the internet, is to provide a false anwser and wait for everyone to rush to correct you &lt;code&gt;;)&lt;/code&gt; &lt;a class="footnote-backref" href="#fnref:hack" title="Jump back to footnote 2 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description><author>Matija Šuklje (hook)</author></item><item><title>This month in KDE Linux: June 2026</title><link>https://pointieststick.com/2026/07/01/this-month-in-kde-linux-june-2026/</link><pubDate>Wed, 01 Jul 2026 18:52:57 +0000</pubDate><guid isPermaLink="true">http://pointieststick.com/?p=29573</guid><description>&lt;div class="wp-block-image"&gt;
&lt;figure class="alignright size-full is-resized"&gt;&lt;img data-attachment-id="24549" data-permalink="https://pointieststick.com/2025/10/25/kde-linux-deep-dive-package-management-is-amazing-which-is-why-we-dont-include-it/kde-linux-logo/" data-orig-file="https://pointieststick.com/wp-content/uploads/2025/10/kde-linux-logo.png" data-orig-size="256,256" data-comments-opened="1" data-image-meta="&amp;#123;&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;}" data-image-title="Kde-linux-logo" data-image-description="" data-image-caption="" data-large-file="https://pointieststick.com/wp-content/uploads/2025/10/kde-linux-logo.png?w=256" src="https://pointieststick.com/wp-content/uploads/2025/10/kde-linux-logo.png" alt="" class="wp-image-24549" style="width:217px;height:auto" /&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p class="wp-block-paragraph"&gt;Welcome to another edition of “This month in KDE Linux” — KDE&amp;#8217;s &lt;a target="_blank" href="https://linux.kde.org"&gt;in-progress operating system&lt;/a&gt;.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;This month was pretty smooth; we had no build delivery drama, and all OS images we shipped were of satisfactory quality. The project is maturing, and we&amp;#8217;re 78% of the way towards completing &lt;a target="_blank" href="https://invent.kde.org/groups/kde-linux/-/milestones/2#tab-issues"&gt;the beta milestone&lt;/a&gt;.&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;QA &amp;amp; testing&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;Bhushan Shah and Thomas Duckworth continued working on the project to build a robust and modern automatic QA system. It&amp;#8217;s really really close to being integrated at this point, and will act as a full-stack integration test for all of KDE Plasma in addition to a test system for KDE Linux specifically.&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;More user-friendly installation&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;Hadi Chokr did the huge amount of work necessary to &lt;a target="_blank" href="https://invent.kde.org/kde-linux/kde-linux/-/merge_requests/481"&gt;transform KDE Linux&amp;#8217;s &lt;code&gt;.raw&lt;/code&gt; image file into a hybrid image that&amp;#8217;s also a valid &lt;code&gt;.iso&lt;/code&gt; file&lt;/a&gt;! This allows KDE Linux to be installed more easily using VM software that often expects to be given an &lt;code&gt;.iso&lt;/code&gt; file.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Remember that you&amp;#8217;ll still need to turn on UEFI mode, as KDE Linux still intentionally doesn&amp;#8217;t support the legacy BIOS system!&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;Better audio CD ripping&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;Harald Sitter, Jan Rathmann, and I completed &lt;a target="_blank" href="https://invent.kde.org/kde-linux/kde-linux/-/work_items/649"&gt;a small project&lt;/a&gt; to get KDE&amp;#8217;s &lt;a target="_blank" href="https://apps.kde.org/audex/"&gt;Audex&lt;/a&gt; app up on Flathub as a replacement for the &lt;code&gt;audiocd-kio&lt;/code&gt; software we had previously been pre-installing on the image.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;The problem with &lt;code&gt;audiocd-kio&lt;/code&gt; is that it included two System Settings pages of questionable utility that offered a fairly old-fashioned UX. Now we don&amp;#8217;t include those things, and instead we &lt;a target="_blank" href="https://linux.kde.org/docs/rip-audio-cds/"&gt;document how to download Audex and use it to rip CDs&lt;/a&gt;. And this way, you get automatic metadata lookup, too!&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;Easier log collection&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;Felix Araújo &lt;a target="_blank" href="https://invent.kde.org/kde-linux/kde-linux/-/work_items/547"&gt;built a tool to ease the collection of logs&lt;/a&gt; called &lt;code&gt;collect-logs&lt;/code&gt;. It also does some data sanitization. This will be very useful for bug reporting purposes!&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;Rudimentary &amp;#8220;Developer Mode&amp;#8221;&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;I &lt;a target="_blank" href="https://invent.kde.org/kde-linux/kde-linux/-/work_items/33"&gt;created a very simple system to show and hide developer tools&lt;/a&gt;, and they&amp;#8217;re hidden by default until you run &lt;code&gt;toggle-developer-mode&lt;/code&gt;, which is &lt;a target="_blank" href="https://linux.kde.org/docs/dev/"&gt;documented here&lt;/a&gt;.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;This reduces clutter in the launcher widgets of users who aren&amp;#8217;t software developers. In the future we&amp;#8217;ll add more to this script, and we might consider moving more tools off the base image and into Flatpak apps or even downloadable meta-packages, thereby coming full circle by re-inventing packaging. Go figure.&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;Documentation&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;I wrote &lt;a target="_blank" href="https://linux.kde.org/docs/cjkv-input/"&gt;documentation for how to configure input methods for Chinese, Japanese, Korean, and Vietnamese text input&lt;/a&gt;, in consultation with several speakers of these languages.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;And in the near future, we plan to pre-install some of these tools to make things easier for the world&amp;#8217;s 1.7 billion people who use one of them to communicate on their digital devices.&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;Grab bag&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;Thomas Duckworth made Plasma Browser Integration &lt;a target="_blank" href="https://invent.kde.org/kde-linux/kde-linux/-/merge_requests/567"&gt;continue to be enabled by default&lt;/a&gt; with the latest version of Firefox.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;I &lt;a target="_blank" href="https://invent.kde.org/kde-linux/kde-linux/-/commit/7be0db7845e5a9fe488f964aa4033895958d6f3d"&gt;fixed &lt;code&gt;ydotool&lt;/code&gt;&lt;/a&gt;, which I had previously broken by trying to force to run as a systemd service. Turns out it can&amp;#8217;t do that. So now it&amp;#8217;s at least disabled by default.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Yago Raña Gayoso &lt;a target="_blank" href="https://invent.kde.org/kde-linux/kde-linux/-/merge_requests/543"&gt;enabled shell completions&lt;/a&gt; for &lt;code&gt;kde-builder&lt;/code&gt;.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Aleix Pol Gonzalez &lt;a target="_blank" href="https://invent.kde.org/kde-linux/kde-linux/-/merge_requests/548"&gt;removed a few pre-installed GTK libraries&lt;/a&gt; that it turns out weren&amp;#8217;t used for anything.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Vishal Rao &lt;a target="_blank" href="https://invent.kde.org/kde-linux/kde-linux/-/merge_requests/455"&gt;prevented the live session from writing to the system&amp;#8217;s real-time clock&lt;/a&gt;, which could be a nuisance for people who don&amp;#8217;t end up installing the OS and go back to their already-installed OS.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Clément Villemur made the Calamares installer &lt;a target="_blank" href="https://invent.kde.org/kde-linux/kde-linux/-/work_items/672"&gt;not bug you to connect to the internet&lt;/a&gt;, because it doesn&amp;#8217;t actually need internet access.&lt;/p&gt;
&lt;hr class="wp-block-separator has-alpha-channel-opacity" /&gt;
&lt;p class="wp-block-paragraph"&gt;And that wraps up June! There are a lot of projects in flight right now, from finishing up the new QA system, to building moving the base OS with BuildStream, to hardening the kernel, to improving each image&amp;#8217;s changelogs.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;So there&amp;#8217;s still lots to do! If you&amp;#8217;re a fan of the project, please help out; there are many ways:&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
&lt;li&gt;&lt;strong&gt;User support:&lt;/strong&gt; &lt;a target="_blank" href="https://discuss.kde.org/tag/kde-linux/450"&gt;help support people on discuss.kde.org using KDE Linux&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Issue reporting:&lt;/strong&gt; &lt;a target="_blank" href="https://linux.kde.org/docs/install/"&gt;install KDE Linux&lt;/a&gt; and &lt;a target="_blank" href="https://invent.kde.org/kde-linux/kde-linux/-/issues/"&gt;report issues&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documentation:&lt;/strong&gt; &lt;a target="_blank" href="https://linux.kde.org/docs/"&gt;improve docs&lt;/a&gt;; submit merge requests &lt;a target="_blank" href="https://invent.kde.org/websites/linux-kde-org/-/merge_requests/"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flatpak:&lt;/strong&gt; fix &lt;a target="_blank" href="https://invent.kde.org/kde-linux/kde-linux/-/issues/71"&gt;packaging or code issues in Flatpak-packaged apps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OS development:&lt;/strong&gt; &lt;a target="_blank" href="https://linux.kde.org/docs/kde-linux-dev/"&gt;help build KDE Linux!&lt;/a&gt; There&amp;#8217;s &lt;a target="_blank" href="https://invent.kde.org/kde-linux/kde-linux/-/work_items/?sort=created_date&amp;amp;state=opened&amp;amp;milestone_title=Beta&amp;amp;first_page_size=100"&gt;plenty to do&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>Nate Graham</author></item><item><title>A Cross-Platform Rust UI Framework via Qt’s Bridging Technology</title><link>https://www.qt.io/blog/rust-ui-framework-via-bridging-technology</link><pubDate>Wed, 01 Jul 2026 14:15:22 +0000</pubDate><guid isPermaLink="true">https://www.qt.io/blog/rust-ui-framework-via-bridging-technology</guid><description>&lt;div class="hs-featured-image-wrapper"&gt;
&lt;a target="_blank" href="https://www.qt.io/blog/rust-ui-framework-via-bridging-technology?hsLang=en" title="" class="hs-featured-image-link"&gt; &lt;img src="https://www.qt.io/hubfs/QtBridges-RustUIFramework-FeaturedImage-1200x628.webp" alt="Simple illustration on how Qt Bridges enables QML frontends for Rust backends" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span style="line-height: 25.575px;"&gt;Rust has achieved something extraordinary: it genuinely excites people to write software. But when it comes to building a real user interface, the ecosystem is still finding its footing. There are numerous options to pick your Rust UI framework from, including those gaining traction, like Iced and egui. Most of the available UI frameworks, however, are still establishing themselves in production environments and fall short in feature-richness. Qt Bridges, a bridging technology in public beta for Rust, brings something different to the table: over three decades of real-world use, commercial support, and a framework that already runs in automotive dashboards, medical devices, and industrial systems worldwide. Qt Bridge for Rust makes that maturity available to Rust developers, providing access to a UI framework that lets you keep your Rust codebase while using Qt Quick’s feature-rich UI libraries and APIs, hardware acceleration, and genuine cross-platform support.&lt;/span&gt;&lt;/p&gt;
&lt;img src="https://track-eu1.hubspot.com/__ptq.gif?a=149513&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fwww.qt.io%2Fblog%2Frust-ui-framework-via-bridging-technology&amp;amp;bu=https%253A%252F%252Fwww.qt.io%252Fblog&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</description><author>Qt Dev Loop</author></item><item><title>Qt Bridges: Public Beta for the Rust Bridge Is Out!</title><link>https://www.qt.io/blog/qt-bridges-public-beta-for-rust</link><pubDate>Wed, 01 Jul 2026 14:15:20 +0000</pubDate><guid isPermaLink="true">https://www.qt.io/blog/qt-bridges-public-beta-for-rust</guid><description>&lt;div class="hs-featured-image-wrapper"&gt;
&lt;a target="_blank" href="https://www.qt.io/blog/qt-bridges-public-beta-for-rust?hsLang=en" title="" class="hs-featured-image-link"&gt; &lt;img src="https://www.qt.io/hubfs/QtBridges-Bridging-Technology-tinified.webp" alt="Qt Bridges: Public Beta for the Rust Bridge Is Out!" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a target="_blank" href="https://www.qt.io/development/qt-bridges?hsLang=en"&gt;Qt Bridges&lt;/a&gt; is a project we have been developing since 2025 to bring &lt;a target="_blank" href="https://www.qt.io/development/qt-framework/ui-framework?hsLang=en"&gt;Qt’s UI framework&lt;/a&gt; capabilities to other programming languages, without going through the full set of bindings. The focus is on the interaction with backend data objects, seamlessly integrated as QML components in a Qt Quick interface.&lt;/p&gt;
&lt;img src="https://track-eu1.hubspot.com/__ptq.gif?a=149513&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fwww.qt.io%2Fblog%2Fqt-bridges-public-beta-for-rust&amp;amp;bu=https%253A%252F%252Fwww.qt.io%252Fblog&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</description><author>Qt Dev Loop</author></item><item><title>Steam Deck and Wayland</title><link>https://notmart.org/blog/2026/07/steamdeck-and-wayland/</link><pubDate>Wed, 01 Jul 2026 12:23:26 +0000</pubDate><guid isPermaLink="true">https://notmart.org/blog/?p=6892</guid><description>&lt;p class="wp-block-paragraph"&gt;A while ago, Steam OS 3.8 was released. Among its many improvements, it includes a particularly important one for the Desktop Mode: it finally uses a Wayland session by default.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;There are many reasons why this is important for both us and our users. It is more stable, more feature-rich, and does a better job showcasing what Plasma can do.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;For now, though, I just want to highlight one neat little feature that is especially handy on a touchscreen device like the Steam Deck: touchscreen gestures.&lt;/p&gt;
&lt;figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"&gt;&lt;div class="wp-block-embed__wrapper"&gt;
&lt;iframe title="SteamOS 3.8 Desktop Gestures" width="625" height="352" src="https://www.youtube.com/embed/YkBJnffGpoE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;p class="wp-block-paragraph"&gt;Out of the box, a three-finger vertical swipe enters Overview mode, showing thumbnails of all open windows. This provides a much more touch-friendly way to multitask, and you can also close a window with a downward swipe gesture. Of course this is a feature available on any device with a touchscreen.&lt;/p&gt;</description><author>Marco Martin</author></item><item><title>The Steam Machine is here!</title><link>https://pointieststick.com/2026/06/30/the-steam-machine-is-here/</link><pubDate>Tue, 30 Jun 2026 18:48:11 +0000</pubDate><guid isPermaLink="true">http://pointieststick.com/?p=29653</guid><description>&lt;p class="wp-block-paragraph"&gt;For a while now, my colleagues and I over in &lt;a target="_blank" href="https://techpaladinsoftware.com/"&gt;Techpaladin Software&lt;/a&gt; have been working on software support for the &lt;a target="_blank" href="https://store.steampowered.com/sale/steammachine"&gt;Steam Machine&lt;/a&gt;, so it&amp;#8217;s so awesome to see the product released!&lt;/p&gt;
&lt;figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"&gt;&lt;div class="wp-block-embed__wrapper"&gt;
&lt;iframe class="youtube-player" width="1100" height="619" src="https://www.youtube.com/embed/XPNW3GCIeOM?version=3&amp;#038;rel=1&amp;#038;showsearch=0&amp;#038;showinfo=1&amp;#038;iv_load_policy=1&amp;#038;fs=1&amp;#038;hl=en&amp;#038;autohide=2&amp;#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;p class="wp-block-paragraph"&gt;Like everyone else, I was surprised by the pricing… until I went out and looked at what other hardware costs these days. It seems like in the past 6 months, everything with RAM got 50-100% more expensive. It&amp;#8217;s kinda nuts. In light of, shall we say, &lt;em&gt;industry trends&lt;/em&gt; (ahem), the price seems reasonable to me.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;…especially if you see it less as a single-purpose gaming console and more as a desktop computer that offers a 10-foot UI living room gaming experience. Its horsepower is competitive for the price, and it offers the flexibility of a well-integrated desktop PC user experience. But don&amp;#8217;t take it from me; ask Linus Sebastian, who&amp;#8217;s rapidly becoming one of the biggest KDE boosters on YouTube:&lt;/p&gt;
&lt;figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"&gt;&lt;div class="wp-block-embed__wrapper"&gt;
&lt;iframe class="youtube-player" width="1100" height="619" src="https://www.youtube.com/embed/l7tjgm_6LLk?version=3&amp;#038;rel=1&amp;#038;showsearch=0&amp;#038;showinfo=1&amp;#038;iv_load_policy=1&amp;#038;fs=1&amp;#038;hl=en&amp;#038;autohide=2&amp;#038;start=972&amp;#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;p class="wp-block-paragraph"&gt;Some choice quotes from the video:&lt;/p&gt;
&lt;blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"&gt;
&lt;p class="wp-block-paragraph"&gt;And from the moment I fired it up and said &amp;#8220;goodbye Steam Big Picture Mode&amp;#8221;, and started using it as a desktop, I went… &amp;#8220;This is what I&amp;#8217;ve been waiting for the whole time.&amp;#8221;&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;&amp;#8211; Linus Sebastian&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"&gt;
&lt;p class="wp-block-paragraph"&gt;Plasma&amp;#8217;s great.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;&amp;#8211; Linus Sebastian&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p class="wp-block-paragraph"&gt;&amp;#8220;Plasma on retail hardware&amp;#8221; has been my long-term goal for KDE since I first got involved a decade ago. This product is another example that not only can it work, but it can be as good or better than competing offerings.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;So congratulations to everyone in KDE and outside of it who helped make this a reality! I&amp;#8217;m unbelievably happy at how well KDE software is working for this use case these days, and I see even greater things in the future.&lt;/p&gt;</description><author>Nate Graham</author></item><item><title>C++ Library Headers &amp; CMake Config Files: Are We Serviceable?</title><link>https://frinring.wordpress.com/2026/06/30/c-library-headers-cmake-config-files-are-we-serviceable/</link><pubDate>Tue, 30 Jun 2026 17:33:05 +0000</pubDate><guid isPermaLink="true">http://frinring.wordpress.com/?p=2934</guid><description>&lt;p class="wp-block-paragraph"&gt;When working on a software library which is targeting 3rd-party consumers, it is rather of self-interest to make the library uncomplicated to use. Unless perhaps there is opportunity seen in having to help out in the process &lt;img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /&gt;&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;And to know if it is uncomplicated to use, best before learning otherwise the hard way, one has to take the position of the consumers. Even better if this can be automated, after all that is why people developed machines, like computers, to pass on the dull part.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Many things of a library can be tested during the build, based on the sources and build artifacts. Like functionality of methods, proper export/visibility of their public entry points or the code any special pre-processor macros are resolved to. Here CMake&amp;#8217;s &lt;a target="_blank" href="https://cmake.org/cmake/help/latest/prop_tgt/VERIFY_INTERFACE_HEADER_SETS.html"&gt;VERIFY_INTERFACE_HEADER_SETS&lt;/a&gt; also offers a solution to verify that headers can be included on their own, though being bound to the build interface of the library.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Now, the consumer will only see the installed files, and there are for one things that can go wrong when installing even already tested files, as are there files which only work in the installation location or might work differently there, so can be only properly tested there.&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;Public Header Fails&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;When about to use a feature of a library, one would see to apply the documented needed include statement. E.g. when writing code dealing with the class &lt;code&gt;KContacts::Picture&lt;/code&gt; of the KDE Frameworks module KContacts, the &lt;a target="_blank" href="https://api.kde.org/kcontacts-picture.html"&gt;docs&lt;/a&gt; hint to use the following include to have any needed declarations available:&lt;/p&gt;
&lt;div class="wp-block-code"&gt;
&lt;div class="cm-editor"&gt;
&lt;div class="cm-scroller"&gt;
&lt;pre&gt;
&lt;code class="language-c++"&gt;&lt;div class="cm-line"&gt;&lt;span class="tok-meta"&gt;#include&lt;/span&gt; &lt;span class="tok-string2"&gt;&amp;lt;KContacts/Picture&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p class="wp-block-paragraph"&gt;So what could go wrong with such header file (e.g. &lt;code&gt;Picture&lt;/code&gt; in the example above):&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
&lt;li&gt;the header file is not installed&lt;/li&gt;
&lt;li&gt;the header file is not placed in the relative location as by the documented include statement and the official include search directories&lt;/li&gt;
&lt;li&gt;the header file includes another header from the same library that is not installed (e.g. for test utils)&lt;/li&gt;
&lt;li&gt;the header file includes another header from the same library which is placed in a relative location not resolvable by the official include search directories&lt;/li&gt;
&lt;li&gt;the header file includes another header from a private dependency, so not resolvable by the inherited official include search directories&lt;/li&gt;
&lt;li&gt;the header file uses language features unconditionally of a standard not enforced in the public build flags&lt;/li&gt;
&lt;li&gt;the header file relies on macro definitions not provided correctly, either missing or with wrong value&lt;/li&gt;
&lt;li&gt;the header file is not self-contained with the variants of the headers part of the installation (violating C++ Core Guidelines, &lt;a target="_blank" href="https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#sf11-header-files-should-be-self-contained"&gt;SF.11: Header files should be self-contained&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;(&amp;#8230; possibly more, please mention in comments)&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="wp-block-paragraph"&gt;All these can be mainly checked by simply creating a C++ source file which only includes the very header file, by the documented include statement, and testing for its successful compilation/code parsing, applying the official include search directories and build flags (and the inherited ones of public dependencies).&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;CMake Config Fails&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;When about to use a library at all, one would see to use the meta data blobs which also integrate with one&amp;#8217;s (meta) build system. E.g. in case of using CMake and as in the example above KF module KContacts, one would for setting up building against the library do as documented, relying on the CMake config files provided:&lt;/p&gt;
&lt;div class="wp-block-code"&gt;
&lt;div class="cm-editor"&gt;
&lt;div class="cm-scroller"&gt;
&lt;pre&gt;
&lt;code class="language-cmake"&gt;&lt;div class="cm-line"&gt;&lt;span class="tok-variableName tok-definition"&gt;find_package&lt;/span&gt;&lt;span class="tok-punctuation"&gt;(&lt;/span&gt;KF6 REQUIRED COMPONENTS Contacts&lt;span class="tok-punctuation"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="cm-line"&gt;&lt;span class="tok-variableName tok-definition"&gt;target_link_libraries&lt;/span&gt;&lt;span class="tok-punctuation"&gt;(&lt;/span&gt;MySoftwareProject PRIVATE KF6::Contacts&lt;span class="tok-punctuation"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p class="wp-block-paragraph"&gt;So what could go wrong with those CMake config files:&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
&lt;li&gt;the CMake config files are not installed&lt;/li&gt;
&lt;li&gt;the CMake config files are not installed by the correct name and in the correct location&lt;/li&gt;
&lt;li&gt;the library target is not provided by the CMake config files at all&lt;/li&gt;
&lt;li&gt;the library target is not provided by the documented name and the optional namespace&lt;/li&gt;
&lt;li&gt;the library target does not have the correct include search directories set&lt;/li&gt;
&lt;li&gt;the library target does not have the correct build flags set&lt;/li&gt;
&lt;li&gt;the library target misses some documented properties&lt;/li&gt;
&lt;li&gt;the library target misses a dependency in the public link interface, to inherit as needed include search directories and build flags&lt;/li&gt;
&lt;li&gt;the library target has an item in the public link interface not checked for by the CMake config files&lt;/li&gt;
&lt;li&gt;other documented utility targets or variables are not defined or have wrong values&lt;/li&gt;
&lt;li&gt;(&amp;#8230; possibly more, please mention in comments)&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="wp-block-paragraph"&gt;Most of these issues can be simply checked by creating a CMake project which searches for the library and links some dummy software to it, and testing for its successful configuration and build.&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;Other Fails&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;There are further library-related artifacts which should see checks after installation.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Any resources used from a library which are installed as separate files, like translation catalogs, images, sounds, or domain-specific data, could again be missed to be installed, installed by a wrong name or into the wrong location, or otherwise be badly processed before or during the installation process. Those are not specific to libraries though, thus not looked at more here.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Other artifacts are some which themselves are to be built against the library, such as project templates (like the &lt;a target="_blank" href="https://api.kde.org/ecm/kde-module/KDEPackageAppTemplates.html"&gt;KAppTemplate&lt;/a&gt; ones, e.g. for plugins) or examples for using the library. Those are not critical to the direct usage of a library though, thus also not looked at more here.&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;Continuous Integration As Limited Safe Guard&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;Software libraries are usually not developed in a void, but based on needs by other software. Changes in the public interface are made together with the respective changes in at least one consumer. So many issues would be detected in the process.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Then the library and many of its consumers, not just the ones a changes was made for, might be part of the same CI setup, where all these consumers would see at least some regular rebuild against the latest version of a library and thus would catch further regressions before the next release of the library.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;But not all API of a library might be used by those known consumers, instead only by 3rd-party without any integration into the library development. And some issues of API while used can be shadowed by the usage pattern. So for a more complete check some generic own solution is needed.&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;Some Automation: ECMInstalledLibraryCheck&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;Combining the simple check ideas for headers and CMake config files above, some addition to KDE&amp;#8217;s &lt;a target="_blank" href="https://api.kde.org/ecm/"&gt;Extra CMake Modules&lt;/a&gt; is proposed in this &lt;a target="_blank" href="https://invent.kde.org/frameworks/extra-cmake-modules/-/merge_requests/590"&gt;merge request&lt;/a&gt;: &lt;code&gt;ECMInstalledLibraryCheck&lt;/code&gt;. That module provides a macro to add checks for the installed library artifacts, from consumer POV. Currently it covers the public headers (includability) &amp;amp; CMake config files (proper data delivery needed for compiling). It adds one global target &lt;code&gt;all_installed_library_check&lt;/code&gt;, to run the checks for all libraries, and a target per library, &lt;code&gt;&amp;lt;library_target&amp;gt;_installed_library_check&lt;/code&gt;. Those targets would be used after installation only, obviously.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;For the example used above, KF&amp;#8217;s KContacts library, the check would be deployed like this:&lt;/p&gt;
&lt;div class="wp-block-code"&gt;
&lt;div class="cm-editor"&gt;
&lt;div class="cm-scroller"&gt;
&lt;pre&gt;
&lt;code class="language-cmake"&gt;&lt;div class="cm-line"&gt;&lt;span class="tok-comment"&gt;# use the module from ECM&lt;/span&gt;&lt;/div&gt;&lt;div class="cm-line"&gt;&lt;span class="tok-variableName tok-definition"&gt;include&lt;/span&gt;&lt;span class="tok-punctuation"&gt;(&lt;/span&gt;ECMInstalledLibraryCheck&lt;span class="tok-punctuation"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="cm-line"&gt;&lt;/div&gt;&lt;div class="cm-line"&gt;&lt;span class="tok-comment"&gt;# for the library target KF6Contacts set up the check&lt;/span&gt;&lt;/div&gt;&lt;div class="cm-line"&gt;&lt;span class="tok-variableName tok-definition"&gt;ecm_add_installed_library_check&lt;/span&gt;&lt;span class="tok-punctuation"&gt;(&lt;/span&gt;KF6Contacts&lt;/div&gt;&lt;div class="cm-line"&gt; PACKAGE_NAME &lt;span class="tok-string"&gt;&amp;quot;KF6Contacts&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="cm-line"&gt; PACKAGE_VERSION &lt;span class="tok-variableName2"&gt;$&amp;#123;KCONTACTS_VERSION}&lt;/span&gt;&lt;/div&gt;&lt;div class="cm-line"&gt; PACKAGE_TARGET_NAMESPACE &lt;span class="tok-string"&gt;&amp;quot;KF6::&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="cm-line"&gt;&lt;span class="tok-punctuation"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="cm-line"&gt;&lt;/div&gt;&lt;div class="cm-line"&gt;&lt;span class="tok-comment"&gt;# register the official include statements for the check&lt;/span&gt;&lt;/div&gt;&lt;div class="cm-line"&gt;&lt;span class="tok-variableName tok-definition"&gt;ecm_installed_library_check_include_strings&lt;/span&gt;&lt;span class="tok-punctuation"&gt;(&lt;/span&gt;KF6Contacts&lt;/div&gt;&lt;div class="cm-line"&gt; HEADERS &lt;span class="tok-variableName2"&gt;$&amp;#123;KContacts_CamelCase_HEADERS}&lt;/span&gt;&lt;/div&gt;&lt;div class="cm-line"&gt; PREFIX KContacts&lt;/div&gt;&lt;div class="cm-line"&gt;&lt;span class="tok-punctuation"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p class="wp-block-paragraph"&gt;Given the library target &lt;code&gt;KF6Contacts&lt;/code&gt; thus this adds the target named &lt;code&gt;KF6Contacts_installed_library_check&lt;/code&gt;. This target generates and builds a separate CMake-based project for a dummy library linking against the installed library, whose sources are one source file per passed include string, with a single code line &lt;code&gt;#include &amp;lt;include_string&amp;gt;&lt;/code&gt;. The check is considered passed if the builds completes without an error.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Additionally the checks can be extended to also cover CMake variables or preprocessor defines, by functions like &lt;code&gt;ecm_installed_library_check_cmake_variable()&lt;/code&gt;, &lt;code&gt;ecm_installed_library_check_compile_definition()&lt;/code&gt; and &lt;code&gt;ecm_installed_library_check_preprocessor_macro()&lt;/code&gt;. The last also has some convenience variant &lt;code&gt;ecm_installed_library_check_version_preprocessor_macros()&lt;/code&gt;, in our example deployed like this:&lt;/p&gt;
&lt;div class="wp-block-code"&gt;
&lt;div class="cm-editor"&gt;
&lt;div class="cm-scroller"&gt;
&lt;pre&gt;
&lt;code class="language-cmake"&gt;&lt;div class="cm-line"&gt;&lt;span class="tok-comment"&gt;# check all includes also have the usual version macros defined afterwards, only report errors&lt;/span&gt;&lt;/div&gt;&lt;div class="cm-line"&gt;&lt;span class="tok-variableName tok-definition"&gt;ecm_installed_library_check_version_preprocessor_macros&lt;/span&gt;&lt;span class="tok-punctuation"&gt;(&lt;/span&gt;KF6Contacts&lt;/div&gt;&lt;div class="cm-line"&gt; PREFIX KCONTACTS&lt;/div&gt;&lt;div class="cm-line"&gt; VERSION &lt;span class="tok-variableName2"&gt;$&amp;#123;KCONTACTS_VERSION}&lt;/span&gt;&lt;/div&gt;&lt;div class="cm-line"&gt; SILENT&lt;/div&gt;&lt;div class="cm-line"&gt;&lt;span class="tok-punctuation"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p class="wp-block-paragraph"&gt;The current state of the prototype has already found a number of existing issues in a number of libraries, which so far had not yet been uncovered by consumers&amp;#8217; usage pattern, and first fixes have been rolled out to prevent consumers hitting them in the future.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt; It also has exposed a principal issues with projects like some KF modules that provide multiple libraries, yet only a single CMake config file for their module. Such file would need to ensure the combined dependencies of all libraries, which then adds unneeded burden to consumers of just one library. Currently the dependency checks in KF CMake config files are rather pragmatically added, when existing consumers stumble over something missing.&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;Hurdles To Adopting The Check Automation&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;Checks can only return value for the cost of integrating them if they are also routinely applied and their results considered. Worse, if not used they run chance of bit-rot and actually clutter a project.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Typically a library has a suite of auto-tests, covering all the features. While developers are encouraged to use them on their local system during development, they are at least used on the central CI system, against as many platforms and configurations as possible.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;A first challenge with merging post-installation checks to the other checks and tests is that auto-tests are usually designed or at least prepared to be run pre-installation. KDE has had some &amp;#8220;&lt;a target="_blank" href="https://community.kde.org/Guidelines_and_HOWTOs/Making_apps_run_uninstalled"&gt;Running apps uninstalled&lt;/a&gt;&amp;#8221; initiative, which resulted at least for auto-tests of KDE Frameworks to be also run on CI before installation. CMake only has the concept of one suite of tests, without an idea of pre-installation and post-installation test times. So one would have e.g. to create some custom system on top, e.g. by using CMake/CTest test labels. And for CI do extra work to run and process the two sets of tests separately.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Another challenge is that like all tests the &lt;code&gt;ECMInstalledLibraryCheck&lt;/code&gt; checks come at a cost. While their creation is quickly done (generating a buildsystem file), the execution is taking some time. Because it mainly consists of a full compilation per each tested include statement, which despite just being a simple include line still results in lot of processing due to all the implicit overhead, even more when transitively including many template-ridden headers. And being a new system with some people the cost will scale the normal &amp;#8220;don&amp;#8217;t need this, never done that, no changes wanted&amp;#8221; reaction.&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;Collaboration Wanted&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;The author is currently done when it comes to own immediate desires for the features of &lt;code&gt;ECMInstalledLibraryCheck&lt;/code&gt; and uses it in personal projects as is. It has been though developed in the (KDE) public with the intent to share it, to have it be useful to others like KDE projects and gain from common usage and feedback.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Not being a CI system person, the author now is mainly looking for someone who can work on integrating the execution of &lt;code&gt;ECMInstalledLibraryCheck&lt;/code&gt; checks with KDE CI (or also their own projects&amp;#8217; CI). The idea would be that the check of the installed library artifacts is as useful as any unit test, to catch issues with new code and regressions immediately, so should be run along the normal unit tests, just in its own post-installation stage. This stage could also later see the addition of post-install checks for templates and examples as well as other things which are found useful to test post-install. Ideally the check result would be integrated into the test result display, but for a start just successfully completing the build target should be already useful as indication. Possibly projects would opt in to the test using some configuration flag, or in case of KF could default to it. Perhaps CI integration will also require certain things from the macros, so ideally the CI deployment can be sorted out before &lt;code&gt;ECMInstalledLibraryCheck&lt;/code&gt; gets merged and released. So if you find this kind of check useful and are experienced with (KDE) CI setup, please get in contact. &lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Then post-installation check of library artifacts might have further constraints or desires with some. Would people need doing parallel test of the installed library with different configurations or usage flags? Would people like to use this in cross-compilation (so far no generated code is executed, so in theory should be usable) and does that need further support? Are there other aspects of the installed artifacts you would like to see covered? Please give the current state of the check module a try for your own library projects and get in contact.&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;Try ECMInstalledLibraryCheck: Does Your Library Pass?&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;The file &lt;code&gt;ECMInstalledLibraryCheck.cmake&lt;/code&gt; should only depend on CMake, so can be just copied into your own project:&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
&lt;li&gt;download the raw file from &lt;a target="_blank" href="https://invent.kde.org/frameworks/extra-cmake-modules/-/blob/work/kossebau/ECMInstalledLibraryCheck/modules/ECMInstalledLibraryCheck.cmake"&gt;https://invent.kde.org/frameworks/extra-cmake-modules/-/blob/work/kossebau/ECMInstalledLibraryCheck/modules/ECMInstalledLibraryCheck.cmake&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;create subdir &lt;code&gt;cmake/ecmcopy&lt;/code&gt; in your project, place &lt;code&gt;ECMInstalledLibraryCheck.cmake&lt;/code&gt; inside&lt;/li&gt;
&lt;li&gt;make subdir known to CMake: &lt;code&gt;list(APPEND CMAKE_MODULE_PATH $&amp;#123;CMAKE_SOURCE_DIR}/cmake/ecmcopy)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;include module: &lt;code&gt;include(ECMInstalledLibraryCheck)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;setup check for your library targets, see docs at begin of module file how to do that&lt;/li&gt;
&lt;li&gt;run the installation target, then the target &lt;code&gt;all_installed_library_check&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;see how per library a project &amp;#8220;InstalledLibraryCheck&amp;#8221; is generated and build, the build log serves as success report&lt;/li&gt;
&lt;li&gt;if the check build fails, try to fix it, install (easy to forget &lt;img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /&gt; ) and run the check target again&lt;/li&gt;
&lt;li&gt;if curious, peek into the build directory and look at the generated file &lt;code&gt;$&amp;#123;library_target}_ECMInstalledLibraryCheck/CMakeLists.txt&lt;/code&gt;, it holds the complete check and can be also played directly with&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="wp-block-paragraph"&gt;The author has done this with many projects already, in KDE for all of KF modules as well as some graphics, games, multimedia, utility and education software libraries.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Now go and check your own library, and report back how useful &lt;code&gt;ECMInstalledLibraryCheck&lt;/code&gt; is for you, what issues it discovered and what your further needs are here &lt;img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /&gt;&lt;/p&gt;</description><author>Friedrich Kossebau</author></item><item><title>GSoC - Working on Marknote</title><link>https://prayag2.github.io/posts/gsoc-june-update/</link><pubDate>Tue, 30 Jun 2026 17:00:00 +0000</pubDate><guid isPermaLink="true">https://prayag2.github.io/posts/gsoc-june-update/</guid><description>&lt;h1 id="overview"&gt;Overview&lt;/h1&gt;
&lt;p&gt;I&amp;rsquo;m working on Marknote to introduce a block-editor inspired by popular note taking apps such as Notion. A block editor is a modern text editor that allows you to insert elements such as paragraphs, lists, tables, code, block quotes, etc. into separate blocks. Each block can be reordered, edited, and deleted. Such editors also give you the ability to insert elements by pressing &amp;ldquo;/&amp;rdquo; followed by the name of the element. This block based design of these editors make them very fun and intuitive to use.&lt;/p&gt;
&lt;p&gt;A problem that most of these editors have in common is incomplete markdown support. They do not support the full &lt;a target="_blank" href="https://commonmark.org/"&gt;commonmark&lt;/a&gt; spec. This means many things like nested blockquotes are not possible to use. Other problems include privacy concerns due to their closed sourced nature. They also are mostly web-based applications so they&amp;rsquo;re slow. This is where Marknote comes in. Marknote already is a popular note taking app by KDE. By introducing a robust block editor, users will be able to have a similar experience in an app that integrates beautifully with the KDE ecosystem, is offline, and most importantly respects privacy.&lt;/p&gt;
&lt;h1 id="current-status"&gt;Current Status&lt;/h1&gt;
&lt;p&gt;GSoC&amp;rsquo;s coding period began on 25th May 2026. Unfortunately, my university exams began at the same time and ended on 11th June 2026. So I was not available for the first few weeks. I was still able to implement a big portion of the project.&lt;/p&gt;
&lt;h2 id="integrating-md4qt"&gt;Integrating md4qt&lt;/h2&gt;
&lt;p&gt;I spent the first few days making md4qt a dependency of Marknote. It involved adding it into CI images, creating a KDE Craft blueprint, updating the flatpak config as well, and finally making sure it builds correctly using CMake.&lt;/p&gt;
&lt;h2 id="building-markdown-model"&gt;Building Markdown Model&lt;/h2&gt;
&lt;p&gt;After md4qt was finally usable in Marknote, I started working on developing the &lt;code&gt;AsyncDocBuilder&lt;/code&gt;. This class allows Marknote to read a markdown file asynchronously (without blocking the UI), and emit a signal with an Abstract Syntax Tree (AST) which represents the parsed markdown document.&lt;/p&gt;
&lt;p&gt;After that, I had to implement a tree model that represents the AST. The tree model inherits from &lt;code&gt;QAbstractItemModel&lt;/code&gt;. It uses a wrapper class called the &lt;code&gt;TreeItem&lt;/code&gt; that wraps around the AST. This represents a simple tree data structure where each node can have more than 1 children nodes. I was able to implement a working model succesfully, although it required a lot of brainstorming.&lt;/p&gt;
&lt;h2 id="getting-data-to-qml"&gt;Getting Data to QML&lt;/h2&gt;
&lt;p&gt;The tree model represented elements in the parsed markdown document. Each element may have different properties. For example, headings have a &lt;code&gt;level&lt;/code&gt;, lists have a &lt;code&gt;listType&lt;/code&gt;, etc. Since this model will be used in QML, the data must be accessible in QML. For that, I wrote multiple helper functions that would extract data from each node and insert them into a &lt;code&gt;QVariantMap&lt;/code&gt;. This map would be accessible from the &lt;code&gt;blockData&lt;/code&gt; role of the tree model, allowing me to easily access properties about these nodes in QML.&lt;/p&gt;
&lt;h2 id="implementing-delegates"&gt;Implementing Delegates&lt;/h2&gt;
&lt;p&gt;Now that the model is ready to use, we need QML delegates that will actually be rendered on screen. The biggest challenge here is that this model represents a tree. This means some elements can be present inside other elements. The standard built-in &lt;code&gt;TreeView&lt;/code&gt; would not work here. The reason is that, instead of truly nesting QML elements, it uses indents to show a tree like structure. This is fine for things like file trees, but not for a block editor. In a markdown compliant block editor, the QML elements must truly be nested. To tackle this problem, I had to brainstorm for a week. I tried multiple techniques. One was using a Repeater where the Delegates call themselves, recursively. While this worked, it wasn&amp;rsquo;t compatible with the tree model that we have created. After a bunch of research, I found out about &lt;code&gt;DelegateModel&lt;/code&gt;. It acts as a filter for models in QML. So I could just define a root index for the current view without modifying the actual model. So recursion was finally compatible with the existing tree model.&lt;/p&gt;
&lt;p&gt;This step is still under progress. You can see in the attached video that basic markdown elements can be rendered. These are not editable yet, but markdown parsing and rendering works flawlessly.&lt;/p&gt;
&lt;video controls width="100%"&gt;
&lt;source src="https://prayag2.github.io/posts/gsoc-june-update/video.webm" type="video/mp4"&gt;
Your browser does not support the video tag.
&lt;/video&gt;
&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Working on the block editor this month has been very exciting and challenging. There were some totally new problems that I had to solve that I didn&amp;rsquo;t foresee submitting my proposal. As always, this blog post does not involve the use of AI. All words are my own so it may contain grammatical errors :P&lt;/p&gt;</description><author>Prayag Jain</author></item><item><title>Ocean Updates – June 2026</title><link>https://anditosan.wordpress.com/2026/06/30/ocean-updates-june-2026-2/</link><pubDate>Tue, 30 Jun 2026 13:27:11 +0000</pubDate><guid isPermaLink="true">http://anditosan.wordpress.com/?p=616</guid><description>&lt;h2 class="wp-block-heading"&gt;Ocean Icons in Penpot&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;I began the process of moving icons from Figma to Penpot. The icons are locate in the Icons page inside Penpot. This page contains some placeholder icon components created by our contributors. This was done so that we could use generic icons for UI as we complete more parts of Ocean design.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Including new icons from Figma into Penpot is not easy. There are a couple of drawbacks we see. Penpot does not have the same shape control that Figma does. Because of that, Penpot does not recognize shapes like circles, squares, lines, etc. Another issue is the importing erases the naming schemes that the icons have. This is a known bug at Penpot and they are working to resolve it.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Penpot also seems to do something pretty interesting on import. It creates a folder where the graphics are contained, it adds an invisible background image, and in some cases, a bitmap in the same structure. I believe these are just import issues that Penpot resolves in different ways. I hope their parsing on import gets better overtime.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;However, with the new rendering engine in Penpot, the icon collection, though slow at times, is able to keep up with the rendering and I am able to load up thousands of svg icons in Penpot. Under the previous set up, this would not be possible without crashing.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Because of these two drawbacks, I had to flatten all the images before exporting. Otherwise, Penpot could run into rendering issues as svg code from Figma has its own quirks. Still, with these compromises, I was still able to copy all the monochrome icons built for Ocean into Penpot. Now, I have to take the time to rename all the icons to their proper names. There are also some icons that don&amp;#8217;t render properly, or at all. For those icons, I will have to take them case by case and fix them.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;After renaming all these icons and getting them to their proper organization, I will create components from them that can be used in UI throughout the file.&lt;/p&gt;
&lt;div class="wp-block-image"&gt;
&lt;figure class="aligncenter size-large"&gt;&lt;a target="_blank" href="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image.png"&gt;&lt;img width="707" height="1023" data-attachment-id="637" data-permalink="https://anditosan.wordpress.com/2026/06/30/ocean-updates-june-2026-2/image-26/" data-orig-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image.png" data-orig-size="1820,2636" data-comments-opened="1" data-image-meta="&amp;#123;&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image.png?w=707" src="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image.png?w=707" alt="" class="wp-image-637" srcset="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image.png?w=707 707w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image.png?w=1414 1414w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image.png?w=104 104w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image.png?w=207 207w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image.png?w=768 768w" sizes="(max-width: 707px) 100vw, 707px" /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;h2 class="wp-block-heading"&gt;Ocean + Union June Meeting&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;Earlier this month, we also connected with the Union team to discuss the implementation support of reference tokens and semantic tokens from Penpot into Plasma. We also discussed the creation of Ocean assets.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Providing support in Plasma for Ocean design tokens is no small feat. It requires careful preparation. This is one of those elements that Ocean Design provides. The goal here is that Plasma and applications are able to support the tokens/variables provided by the Ocean design system.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;In a distant future, our goal would be to give the Ocean system to anyone willing to create their own version. They would export their tokens and Plasma would support them without the need for additional code. This achieves a couple of great things, one is that designers work in an environment that is ready for editing with all the graphical sources needed, no need for coding skills. On the other hand, this should push interested users into designing and testing their designs first, without the need to push code first, which requires the mobilization of our teams to review, adapt and provide feedback. It&amp;#8217;s a &amp;#8220;cheaper&amp;#8221; effort to work with graphics first and see how they would look after export.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;There are more benefits to this approach, but these are two that I always go back to.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;From this meeting, our determination is that I should provide a series of spec files containing all the technical details from the foundational components in Penpot. These components are the smallest bit of interaction in graphical systems. Buttons, shadows, typography, etc. These are akin to the bricks on a wall.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;With this idea in mind, I was able to create and provide the specs to the Union team.&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;New Components in Penpot&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;Continuing with the process of creating sample components in Penpot, we now feature:&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
&lt;li&gt;Application Navigation: This page contains sidebars for desktop and mobile.&lt;/li&gt;
&lt;li&gt;Section Footers: This page contains footers used in application footers or even websites, for desktop and mobile sizes.&lt;/li&gt;
&lt;li&gt;Inline CTAs (Calls to action): These CTAs help users make quick decisions on a piece of information without the need for taking over the screen using Modals, for example.&lt;/li&gt;
&lt;li&gt;Section Headers (Received an expansion): Section headers used to be just one version of the component. This was expanded to add more versions.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;a target="_blank" href="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-6.png"&gt;&lt;img width="1024" height="454" data-attachment-id="647" data-permalink="https://anditosan.wordpress.com/2026/06/30/ocean-updates-june-2026-2/image-32/" data-orig-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-6.png" data-orig-size="3548,1574" data-comments-opened="1" data-image-meta="&amp;#123;&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-6.png?w=1024" src="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-6.png?w=1024" alt="" class="wp-image-647" srcset="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-6.png?w=1024 1024w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-6.png?w=2048 2048w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-6.png?w=150 150w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-6.png?w=300 300w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-6.png?w=768 768w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-6.png?w=1440 1440w" sizes="(max-width: 1024px) 100vw, 1024px" /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;a target="_blank" href="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-7.png"&gt;&lt;img width="1024" height="930" data-attachment-id="648" data-permalink="https://anditosan.wordpress.com/2026/06/30/ocean-updates-june-2026-2/image-33/" data-orig-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-7.png" data-orig-size="2444,2222" data-comments-opened="1" data-image-meta="&amp;#123;&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-7.png?w=1024" src="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-7.png?w=1024" alt="" class="wp-image-648" srcset="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-7.png?w=1024 1024w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-7.png?w=2048 2048w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-7.png?w=150 150w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-7.png?w=300 300w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-7.png?w=768 768w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-7.png?w=1440 1440w" sizes="(max-width: 1024px) 100vw, 1024px" /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;a target="_blank" href="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-8.png"&gt;&lt;img loading="lazy" width="1024" height="495" data-attachment-id="650" data-permalink="https://anditosan.wordpress.com/2026/06/30/ocean-updates-june-2026-2/image-34/" data-orig-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-8.png" data-orig-size="3836,1858" data-comments-opened="1" data-image-meta="&amp;#123;&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-8.png?w=1024" src="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-8.png?w=1024" alt="" class="wp-image-650" srcset="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-8.png?w=1024 1024w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-8.png?w=2048 2048w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-8.png?w=150 150w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-8.png?w=300 300w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-8.png?w=768 768w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-8.png?w=1440 1440w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;h6 class="wp-block-heading has-text-align-center"&gt;&lt;code&gt;&lt;mark style="background-color:#00aadc;color:#fcfcfc" class="has-inline-color"&gt;Please note that these components are "not" Plasma components and is not indicative of Plasma's future state. These are here for inspiration for the future, and for users looking to test their design edits and results. Eventually, these could serve as starting points for layout design, component creation, etc.&lt;/mark&gt;&lt;/code&gt;&lt;/h6&gt;
&lt;p class="wp-block-paragraph"&gt;In addition to these component samples, I am now working on building a calendar view component. I am taking inspiration from Merkuro Calendar and also including some ideas from Ocean. The idea is that a calendar view could be available for others to use and test designs against. More to come on this.&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;Fixes in Ocean Design System&lt;/h2&gt;
&lt;ul class="wp-block-list"&gt;
&lt;li&gt;Fixed layout and design for dropdown items. They were previously just text in a layout. They are supposed to behave differently inside dropdown menus. They need to have inner margins and separation from other items in a list. The shortcut component also received updates and looks more legit than before. This should make it easier to use dropdown components in Penpot.&lt;/li&gt;
&lt;li&gt;Created a dot component that is used in Calendars to show activity or reminders inside monthly views.&lt;/li&gt;
&lt;li&gt;Inputs components received updates so they behave better when manipulating sizing. There were some issues with containers and components inside containers so I tried fixing those. There is an existing Penpot bug that when components are updated at the source, the component copies tend to go back to use fixed sizing instead of dynamic sizing. This makes me cycle through fixing not just sources but copies of the components. It seems the issue is in nested components where the parent takes over some of the sizing properties. Penpot is working on this.&lt;/li&gt;
&lt;li&gt;Created the checkmark inside a circle component. This component is meant to be used when running through selections that need to indicate success in their interaction. For example, completing a survey, or a multi-step installation procedure. A checkbox is not appropriate there but a circle with a checkmark inside. So now that&amp;#8217;s available. It&amp;#8217;s not using a monochrome Ocean icon checkmark yet, but that can be changed in the future.&lt;/li&gt;
&lt;li&gt;Avatars are now using an image with color all inside. Previously I had an avatar image that was white and it made it difficult to see the white border around the avatar image.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="wp-block-image"&gt;
&lt;figure class="aligncenter size-large"&gt;&lt;a target="_blank" href="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-1.png"&gt;&lt;img loading="lazy" width="538" height="1024" data-attachment-id="638" data-permalink="https://anditosan.wordpress.com/2026/06/30/ocean-updates-june-2026-2/image-27/" data-orig-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-1.png" data-orig-size="604,1150" data-comments-opened="1" data-image-meta="&amp;#123;&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-1.png?w=538" src="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-1.png?w=538" alt="" class="wp-image-638" srcset="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-1.png?w=538 538w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-1.png?w=79 79w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-1.png?w=158 158w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-1.png 604w" sizes="auto, (max-width: 538px) 100vw, 538px" /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;a target="_blank" href="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-3.png"&gt;&lt;img loading="lazy" width="1024" height="898" data-attachment-id="642" data-permalink="https://anditosan.wordpress.com/2026/06/30/ocean-updates-june-2026-2/image-29/" data-orig-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-3.png" data-orig-size="1952,1712" data-comments-opened="1" data-image-meta="&amp;#123;&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-3.png?w=1024" src="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-3.png?w=1024" alt="" class="wp-image-642" srcset="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-3.png?w=1024 1024w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-3.png?w=150 150w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-3.png?w=300 300w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-3.png?w=768 768w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-3.png?w=1440 1440w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-3.png 1952w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;a target="_blank" href="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-2.png"&gt;&lt;img loading="lazy" width="1024" height="498" data-attachment-id="640" data-permalink="https://anditosan.wordpress.com/2026/06/30/ocean-updates-june-2026-2/image-28/" data-orig-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-2.png" data-orig-size="3278,1596" data-comments-opened="1" data-image-meta="&amp;#123;&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-2.png?w=1024" src="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-2.png?w=1024" alt="" class="wp-image-640" srcset="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-2.png?w=1024 1024w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-2.png?w=2048 2048w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-2.png?w=150 150w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-2.png?w=300 300w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-2.png?w=768 768w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-2.png?w=1440 1440w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;a target="_blank" href="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-4.png"&gt;&lt;img loading="lazy" width="744" height="1024" data-attachment-id="644" data-permalink="https://anditosan.wordpress.com/2026/06/30/ocean-updates-june-2026-2/image-30/" data-orig-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-4.png" data-orig-size="1668,2296" data-comments-opened="1" data-image-meta="&amp;#123;&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-4.png?w=744" src="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-4.png?w=744" alt="" class="wp-image-644" srcset="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-4.png?w=744 744w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-4.png?w=1488 1488w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-4.png?w=109 109w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-4.png?w=218 218w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-4.png?w=768 768w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-4.png?w=1440 1440w" sizes="auto, (max-width: 744px) 100vw, 744px" /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;p class="wp-block-paragraph"&gt;Next in Component Design&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
&lt;li&gt;Calendar view&lt;/li&gt;
&lt;li&gt;Slideout menus&lt;/li&gt;
&lt;li&gt;Progress steps&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class="wp-block-image size-large"&gt;&lt;a target="_blank" href="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-9.png"&gt;&lt;img loading="lazy" width="981" height="1023" data-attachment-id="651" data-permalink="https://anditosan.wordpress.com/2026/06/30/ocean-updates-june-2026-2/image-35/" data-orig-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-9.png" data-orig-size="2120,2212" data-comments-opened="1" data-image-meta="&amp;#123;&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;}" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-9.png?w=981" src="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-9.png?w=981" alt="" class="wp-image-651" srcset="https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-9.png?w=981 981w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-9.png?w=1962 1962w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-9.png?w=144 144w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-9.png?w=288 288w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-9.png?w=768 768w, https://anditosan.wordpress.com/wp-content/uploads/2026/06/image-9.png?w=1440 1440w" sizes="auto, (max-width: 981px) 100vw, 981px" /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;h2 class="wp-block-heading"&gt;Thanks&lt;/h2&gt;
&lt;ul class="wp-block-list"&gt;
&lt;li&gt;Thanks to Beryesa for creating the Penpot Design Notes page. This is super helpful when users need to understand what they are looking at and how it is used in the system. &lt;img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f64f.png" alt="🙏" class="wp-smiley" style="height: 1em; max-height: 1em;" /&gt;&lt;img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f64f.png" alt="🙏" class="wp-smiley" style="height: 1em; max-height: 1em;" /&gt;&lt;img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f64f.png" alt="🙏" class="wp-smiley" style="height: 1em; max-height: 1em;" /&gt;&lt;/li&gt;
&lt;li&gt;Thanks to iclone for his work on commenting around UX issues in the VDG channel.&lt;/li&gt;
&lt;li&gt;Thanks to the Union team for all their support for Ocean.&lt;/li&gt;
&lt;li&gt;Thanks to Lorenz for helping me troubleshoot some crashes in Penpot.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class="wp-block-heading"&gt;Penpot Issues and Features&lt;/h2&gt;
&lt;a class="wp-block-read-more" target="_blank" href="https://anditosan.wordpress.com/2026/06/30/ocean-updates-june-2026-2/" target="_self"&gt;https://github.com/penpot/penpot/issues&lt;span class="screen-reader-text"&gt;: Ocean Updates &amp;#8211; June&amp;nbsp;2026&lt;/span&gt;&lt;/a&gt;</description><author>Andres Betts</author></item><item><title>KDE Plasma 6.7.2, Bugfix Release for June</title><link>https://kde.org/announcements/plasma/6/6.7.2/</link><pubDate>Tue, 30 Jun 2026 00:00:00 +0000</pubDate><guid isPermaLink="true">https://kde.org/announcements/plasma/6/6.7.2/</guid><description>&lt;p&gt;Today KDE releases a bugfix update to KDE Plasma 6, versioned 6.7.2.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://kde.org/announcements/plasma/6/6.7.0/"&gt;Plasma 6.7&lt;/a&gt; was released in June 2026 with many feature refinements and new modules to complete the desktop experience.&lt;/p&gt;
&lt;p&gt;This release adds a week’s worth of new translations and fixes from KDE’s contributors. The bugfixes are typically small but important and include:&lt;/p&gt;
&lt;a target="_blank" href="https://kde.org/announcements/changelogs/plasma/6/6.7.1-6.7.2"&gt;View full changelog&lt;/a&gt;</description><author>KDE Community</author></item><item><title>Week 5: Curves Merged, Gradient Widget Begins</title><link>https://yashbavadiya.bearblog.dev/week-5-curves-merged-gradient-widget-begins/</link><pubDate>Mon, 29 Jun 2026 19:55:12 +0000</pubDate><guid isPermaLink="true">https://yashbavadiya.bearblog.dev/week-5-curves-merged-gradient-widget-begins/</guid><description>&lt;p&gt;This is a weekly update from my Google Summer of Code 2026 project with KDE, improving effect widgets in Kdenlive, a free and open source video editor.&lt;/p&gt;
&lt;h2 id=mr-887-merged&gt;MR !887 merged&lt;/h2&gt;&lt;p&gt;The Curves widget MR got merged to master this week and will ship in the Kdenlive 26.08 release. Final change before merge was replacing &lt;code&gt;blockSignals(true/false)&lt;/code&gt; pairs on the point spinboxes with &lt;code&gt;QSignalBlocker&lt;/code&gt; objects, which auto-unblock when they go out of scope cleaner and safer than manual pairs.&lt;/p&gt;
&lt;h2 id=gradient-widget-skeleton&gt;Gradient widget skeleton&lt;/h2&gt;&lt;p&gt;Started work on the Gradient widget, targeting the &lt;code&gt;gradientmap&lt;/code&gt; MLT filter. The filter already supports up to 32 color stops via &lt;code&gt;stop.N&lt;/code&gt; parameters (e.g. &lt;code&gt;stop.1=&amp;quot;#ff000000 0.0&amp;quot;&lt;/code&gt;), but Kdenlive's existing XML only exposed 2 stops with the wrong parameter type.&lt;/p&gt;
&lt;p&gt;Built a new &lt;code&gt;GradientEditWidget&lt;/code&gt; in &lt;code&gt;src/assets/view/widgets/&lt;/code&gt; with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Draggable color stop handles on a live &lt;code&gt;QLinearGradient&lt;/code&gt; preview bar&lt;/li&gt;
&lt;li&gt;Left-click on empty area adds a stop with an interpolated color&lt;/li&gt;
&lt;li&gt;Right-click on a handle removes it (minimum 2 stops enforced, max 32)&lt;/li&gt;
&lt;li&gt;Serializes to/from the MLT &lt;code&gt;stop.N&lt;/code&gt; format via a new &lt;code&gt;ParamType::GradientEditor&lt;/code&gt; wired through &lt;code&gt;AssetParameterModel&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Project save/reload round-trips correctly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Added &lt;code&gt;gradienteditwidgettest.cpp&lt;/code&gt; with 8 assertions covering serialization round-trips, add/remove stops, min/max enforcement, and position snapping. All passing.&lt;/p&gt;
&lt;h2 id=whats-next&gt;What's next&lt;/h2&gt;&lt;p&gt;Julius Künzel suggested the widget be designed for potential upstreaming to KDE Frameworks, and pointed to &lt;a target="_blank" href='https://mattbas.gitlab.io/Qt-Color-Widgets/'&gt;Qt-Color-Widgets&lt;/a&gt; as a reference; it has a &lt;code&gt;GradientEditor&lt;/code&gt; class with a polished UX. Investigating whether to wrap that instead of maintaining a custom implementation. Will update once there's more clarity on the direction.&lt;/p&gt;
&lt;p&gt;Both the Gradient widget MR and the Qt-Color-Widgets investigation are in progress; more next week.&lt;/p&gt;</description><author>Yash Bavadiya</author></item><item><title>Monthly Report - June 2026</title><link>https://krita.org/en/posts/2026/monthly-report-2606/</link><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate><guid isPermaLink="true">https://krita.org/en/posts/2026/monthly-report-2606/</guid><description>&lt;p&gt;Read on for a look at development news and the Krita-Artists forum's featured artwork from last month.&lt;/p&gt;
&lt;h2 id="development-report"&gt;Development Report&lt;/h2&gt;
&lt;h3 id="krita-53216021-released"&gt;Krita 5.3.2.1/6.0.2.1 Released&lt;/h3&gt;
&lt;p&gt;A 5.3.2.1/6.0.2.1 hotfix release was made to fix two serious regressions.&lt;/p&gt;
&lt;p&gt;First, a layer-related problem causing issues like the wrong layer being selected or crashes was fixed. This reverts the behavior of the layer being changed on keyframe selection. (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=520718"&gt;bug 1&lt;/a&gt;, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=520723"&gt;bug 2&lt;/a&gt;, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=520744"&gt;bug 3&lt;/a&gt;; &lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2803"&gt;change&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Second, a crash when inserting or removing hold frames was fixed. (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=520732"&gt;bug&lt;/a&gt;; &lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2804"&gt;change&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="developments-in-krita-plus"&gt;Developments in Krita Plus&lt;/h3&gt;
&lt;h4 id="android-donations-overhaul"&gt;Android Donations Overhaul&lt;/h4&gt;
&lt;p&gt;On Krita downloaded from the Android Google Play store, it was possible to purchase a supporter badge as a way of donating to the project.&lt;/p&gt;
&lt;p&gt;For the next release, Carsten has overhauled this into the ability to purchase supporter packs (&lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2787"&gt;change&lt;/a&gt;). These supporter packs will let you download resource bundles with brushes, templates, and more directly inside Krita, as a convenience compared to manually importing them. There is also a subscription, managed through Google Play, which will give access to all of the offered resource bundles.&lt;/p&gt;
&lt;p&gt;As with all official store versions of Krita, the money will go towards supporting Krita's development, and none of Krita's features will be locked behind a paywall. Krita on the Google Play store remains free, and offers the same APKs as available on the official website.&lt;/p&gt;
&lt;h4 id="other-features-and-fixes"&gt;Other Features and Fixes&lt;/h4&gt;
&lt;p&gt;On Android, a prompt to adjust the interface scale will now be shown on first startup, and it can be changed later in Settings → Change Interface Scale. (&lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2836"&gt;change&lt;/a&gt; by Carsten Hartenfels)&lt;/p&gt;
&lt;p&gt;Multiple layers selected with Ctrl+click are no longer deselected when using the Transform Tool (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=517590"&gt;bug&lt;/a&gt;; &lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2814"&gt;change&lt;/a&gt; by Luna Lovecraft). An issue where no layer was selected when deleting the top layer of a document and opening a new view on it was fixed (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=518465"&gt;bug&lt;/a&gt;; &lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2817"&gt;change&lt;/a&gt; by Gregg Jansen van Vuren).&lt;/p&gt;
&lt;p&gt;An issue where the buttons of the Selection Actions Bar and Assistant Tool panel could render entirely black, and an issue where Reference Images could cause slowdown, were fixed. (&lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2819"&gt;change&lt;/a&gt; by Wolthera van Hövell)&lt;/p&gt;
&lt;p&gt;Invert Selection no longer selects a larger area than it should. (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=518235"&gt;bug&lt;/a&gt;; &lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2788"&gt;change&lt;/a&gt; by Ricky Ringler)&lt;/p&gt;
&lt;p&gt;Crashes went undoing creating a text and then making a new text shape, and when undoing multiple shapes, were fixed. (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=520939"&gt;bug 1&lt;/a&gt;, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521106"&gt;bug 2&lt;/a&gt;; &lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2827"&gt;change 1&lt;/a&gt;, &lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2828"&gt;change 2&lt;/a&gt; by Elena Sagalaeva)&lt;/p&gt;
&lt;p&gt;A keyboard shortcut assigned to the Rotate or Zoom Canvas canvas inputs no longer crashes when used. (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=520581"&gt;bug&lt;/a&gt;; &lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2793"&gt;change&lt;/a&gt; by Agata Cacko)&lt;/p&gt;
&lt;h3 id="developments-in-krita-next"&gt;Developments in Krita Next&lt;/h3&gt;
&lt;h4 id="exporting-recorder-timelapses-on-android"&gt;Exporting Recorder Timelapses on Android&lt;/h4&gt;
&lt;p&gt;Previously, Krita on Android could not render video, as it's not possible to run an external FFmpeg as is done on other platforms.&lt;/p&gt;
&lt;p&gt;However, Carsten has found a way to instead use Android's built-in MediaEncoder to render the Recorder's timelapses (&lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2826"&gt;change&lt;/a&gt;). This is also planned to be implemented for rendering animation in the future.&lt;/p&gt;
&lt;h4 id="other-features-and-fixes-1"&gt;Other Features and Fixes&lt;/h4&gt;
&lt;p&gt;Various other features and fixes have made their way into the Unstable builds.&lt;/p&gt;
&lt;p&gt;The Wide Gamut Color Selector now has the saved color history feature where the color history is remembered on restart and can be saved into the document. This is part of the effort to make it a replacement for the Advanced Color Selector. (&lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2783"&gt;change&lt;/a&gt; by Wolthera van Hövell)&lt;/p&gt;
&lt;p&gt;The Histogram Docker now scales the histogram based on the maxiumum value, and has a button to show it in logarthimic scale. (&lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2775"&gt;change&lt;/a&gt; by Wolthera van Hövell)&lt;/p&gt;
&lt;p&gt;In the Transform Tool's Free transform mode, holding Ctrl for perspective and then letting go of Ctrl now activates a camera height adjustment mode. (&lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2358"&gt;change&lt;/a&gt; by Ralek Kolemios)&lt;/p&gt;
&lt;h3 id="future-developments"&gt;Future Developments&lt;/h3&gt;
&lt;h4 id="testing-needed-updated-library-dependencies"&gt;Testing Needed: Updated Library Dependencies&lt;/h4&gt;
&lt;p&gt;The team has been working on updating the various libraries Krita depends on for things such as file format support to newer versions. These updated dependencies need testing before they can be merged to the main builds, so check out the &lt;a target="_blank" href="https://krita-artists.org/t/testng-needed-krita-updates-all-the-libraries-it-depends-on/185785"&gt;library updates forum topic&lt;/a&gt; for test packages if you want to help!&lt;/p&gt;
&lt;h2 id="community-report"&gt;Community Report&lt;/h2&gt;
&lt;h3 id="may-2026-monthly-art-challenge-results"&gt;May 2026 Monthly Art Challenge Results&lt;/h3&gt;
&lt;p&gt;The winner of the &lt;a target="_blank" href="https://krita-artists.org/t/may-2026-art-challenge-animals-and-patterns/181984"&gt;&amp;quot;Animals and Patterns&amp;quot;&lt;/a&gt; challenge is…&lt;/p&gt;
&lt;figure class="featured-artwork"&gt;
&lt;a target="_blank" href="https://krita.org/images/posts/2026/m2606_magnolia_horse-npc_lq.webp"&gt;
&lt;img
src="https://krita.org/images/posts/2026/m2606_magnolia_horse-npc_lq.webp"
alt="Magnolia Horse by npc"
class="fit"
&gt;
&lt;/a&gt;
&lt;figcaption&gt;&lt;span class="featured-artwork__title"&gt;&lt;a target="_blank" href="https://krita-artists.org/t/magnolia-horse-may-2026-art-challenge/184607/"&gt;Magnolia Horse&lt;/a&gt;&lt;/span&gt; by &lt;span class="featured-artwork__artist"&gt;npc&lt;/span&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="join-this-months-art-challenge"&gt;Join This Month's Art Challenge!&lt;/h3&gt;
&lt;p&gt;For June's theme, last month's winner has chosen &lt;a target="_blank" href="https://krita-artists.org/t/june-2026-art-challenge-something-unexpected/184626/"&gt;&amp;quot;Something Unexpected&amp;quot;&lt;/a&gt;, with the optional challenge of using filters.&lt;/p&gt;
&lt;h2 id="featured-artwork"&gt;Featured Artwork&lt;/h2&gt;
&lt;p&gt;This month's featured forum artwork, as voted in the &lt;a target="_blank" href="https://krita-artists.org/t/nominate-your-favourite-artwork-here-april-may-2026/179637/"&gt;Best of Krita-Artists - April/May 2026&lt;/a&gt;:&lt;/p&gt;
&lt;figure class="featured-artwork"&gt;
&lt;a target="_blank" href="https://krita.org/images/posts/2026/m2606_hornet_meets_the_moss_mother-desenhunos_lq.webp"&gt;
&lt;img
src="https://krita.org/images/posts/2026/m2606_hornet_meets_the_moss_mother-desenhunos_lq.webp"
alt="Hornet meets the Moss mother by desenhunos"
class="fit"
&gt;
&lt;/a&gt;
&lt;figcaption&gt;&lt;span class="featured-artwork__title"&gt;&lt;a target="_blank" href="https://krita-artists.org/t/hornet-meets-the-moss-mother/179721"&gt;Hornet meets the Moss mother&lt;/a&gt;&lt;/span&gt; by &lt;span class="featured-artwork__artist"&gt;desenhunos&lt;/span&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class="featured-artwork"&gt;
&lt;a target="_blank" href="https://krita.org/images/posts/2026/m2606_a_ruin_at_night-alexandre_perrot_lq.webp"&gt;
&lt;img
src="https://krita.org/images/posts/2026/m2606_a_ruin_at_night-alexandre_perrot_lq.webp"
alt="A ruin at night by Alexandre_Perrot"
class="fit"
&gt;
&lt;/a&gt;
&lt;figcaption&gt;&lt;span class="featured-artwork__title"&gt;&lt;a target="_blank" href="https://krita-artists.org/t/a-ruin-at-night/180529"&gt;A ruin at night&lt;/a&gt;&lt;/span&gt; by &lt;span class="featured-artwork__artist"&gt;Alexandre_Perrot&lt;/span&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class="featured-artwork"&gt;
&lt;a target="_blank" href="https://krita.org/images/posts/2026/m2606_a_cursed_forest-alexandre-perrot_lq.webp"&gt;
&lt;img
src="https://krita.org/images/posts/2026/m2606_a_cursed_forest-alexandre-perrot_lq.webp"
alt="A cursed forest by Alexandre_Perrot"
class="fit"
&gt;
&lt;/a&gt;
&lt;figcaption&gt;&lt;span class="featured-artwork__title"&gt;&lt;a target="_blank" href="https://krita-artists.org/t/a-cursed-forest/179724"&gt;A cursed forest&lt;/a&gt;&lt;/span&gt; by &lt;span class="featured-artwork__artist"&gt;Alexandre_Perrot&lt;/span&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class="featured-artwork"&gt;
&lt;a target="_blank" href="https://krita.org/images/posts/2026/m2606_watery_landscape-usamafirdous.jpeg"&gt;
&lt;img
src="https://krita.org/images/posts/2026/m2606_watery_landscape-usamafirdous.jpeg"
alt="Waterly landscape by usamafirdous"
class="fit"
&gt;
&lt;/a&gt;
&lt;figcaption&gt;&lt;span class="featured-artwork__title"&gt;&lt;a target="_blank" href="https://krita-artists.org/t/watery-landscape/116300"&gt;Waterly landscape&lt;/a&gt;&lt;/span&gt; by &lt;span class="featured-artwork__artist"&gt;usamafirdous&lt;/span&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class="featured-artwork"&gt;
&lt;a target="_blank" href="https://krita.org/images/posts/2026/m2606_cherry_blossoms-aglow_lq.webp"&gt;
&lt;img
src="https://krita.org/images/posts/2026/m2606_cherry_blossoms-aglow_lq.webp"
alt="Cherry Blossoms by Aglow"
class="fit"
&gt;
&lt;/a&gt;
&lt;figcaption&gt;&lt;span class="featured-artwork__title"&gt;&lt;a target="_blank" href="https://krita-artists.org/t/cherry-blossoms/169210"&gt;Cherry Blossoms&lt;/a&gt;&lt;/span&gt; by &lt;span class="featured-artwork__artist"&gt;Aglow&lt;/span&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="nominate-and-vote-for-next-months-featured-artwork"&gt;Nominate and Vote For Next Month's Featured Artwork!&lt;/h3&gt;
&lt;p&gt;Participate in next month's nominations and voting to voice your opinion on the &lt;a target="_blank" href="https://krita-artists.org/t/nominate-your-favourite-artwork-here-may-june-2026/183576"&gt;Best of Krita-Artists - May/June 2026&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="krita-is-free---but-you-can-contribute"&gt;Krita is Free - But You Can Contribute!&lt;/h2&gt;
&lt;p&gt;Krita is free to use and modify, but it can only exist with the contributions of the community. A small sponsored team alongside volunteer programmers, artists, writers, testers, translators, and more from across the world keep development going.&lt;/p&gt;
&lt;p&gt;If this software has value to you, consider donating to the &lt;a target="_blank" href="https://krita.org/en/donations/"&gt;Krita Development Fund&lt;/a&gt;. Or &lt;a target="_blank" href="https://krita.org/en/get-involved/"&gt;Get Involved&lt;/a&gt; and put your skills to use making Krita and its community better!&lt;/p&gt;
&lt;figure class="fit"&gt;&lt;img src="https://krita.org/images/pages/2021-11-16_kiki-piggy-bank_krita5.png"
alt="Krita&amp;#39;s mascot Kiki putting money in a piggy bank"&gt;
&lt;/figure&gt;
&lt;h2 id="additional-changes"&gt;Additional Changes&lt;/h2&gt;
&lt;h3 id="krita-plus-stable-533603-prealpha"&gt;Krita Plus (Stable, 5.3.3/6.0.3-prealpha):&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;File Formats: Fix loading XMP Exif metadata where a rational number field has spaces. When attempting to save XMP Exif with invalid values, omit the invalid values and log a warning instead of failing to save. (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=520981"&gt;bug 1&lt;/a&gt;, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=520982"&gt;bug 2&lt;/a&gt;; &lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2820"&gt;change&lt;/a&gt; by Agata Cacko)&lt;/li&gt;
&lt;li&gt;General: Add icons for the Getting Started, User Community, Krita Website, Source Code, and Switch Application Language actions (&lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2792"&gt;change 1&lt;/a&gt;, &lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2808"&gt;change 2&lt;/a&gt; by Arkady Flury)&lt;/li&gt;
&lt;li&gt;HDR: Animation: Use non-constant luminance coefficients so FFmpeg &amp;gt;=7 will render HDR animations. (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=520669"&gt;bug&lt;/a&gt;; &lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2806"&gt;change&lt;/a&gt; by Wolthera van Hövell)&lt;/li&gt;
&lt;li&gt;Android: Support stylus barrel rotation. (&lt;a target="_blank" href="https://invent.kde.org/szaman/qtbase/-/merge_requests/19"&gt;change&lt;/a&gt; by Carsten Hartenfels)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="krita-next-unstable-540610-prealpha"&gt;Krita Next (Unstable, 5.4.0/6.1.0-prealpha):&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Comic Panel Editing Tool: Close all shapes cut with the tool. (&lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2705"&gt;change&lt;/a&gt; by Agata Cacko)&lt;/li&gt;
&lt;li&gt;Selections: Fix moving a vector selection to not convert it to a pixel selection. (&lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2758"&gt;change&lt;/a&gt; by Luna Lovecraft)&lt;/li&gt;
&lt;li&gt;Filters: Fix Wavelet Noise Reducer only applying to the first 512 rows of the image. (&lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2809"&gt;change&lt;/a&gt; by Sergey Kleimenychev)&lt;/li&gt;
&lt;li&gt;General: Fix Image Split with guides being off by one pixel. (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=492965"&gt;bug&lt;/a&gt;; &lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2813"&gt;change&lt;/a&gt; by Aditya Rout)&lt;/li&gt;
&lt;li&gt;General: Fix the backup file suffix setting in General-&amp;gt;File Handling to be editable. (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521186"&gt;bug&lt;/a&gt;; &lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/merge_requests/2818"&gt;change&lt;/a&gt; by Carsten Hartenfels)&lt;/li&gt;
&lt;li&gt;Selection Tools: The option to Move Selected Content was reverted due to bugs, such as making a selection showing the move cursor. (&lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=520941"&gt;bug&lt;/a&gt;; &lt;a target="_blank" href="https://invent.kde.org/graphics/krita/-/commit/2bd9710f0c"&gt;change&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="nightly-builds"&gt;Nightly Builds&lt;/h2&gt;
&lt;p&gt;These pre-release versions of Krita are built every day.&lt;/p&gt;
&lt;p&gt;Note that there are currently no Qt6 builds for Android.&lt;/p&gt;
&lt;p&gt;Get the latest bugfixes in &lt;strong&gt;Stable&lt;/strong&gt; Krita Plus (5.3.3/6.0.3 prealpha): Linux &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/krita-6.0/linux"&gt;Qt6&lt;/a&gt; &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/krita-6.0/linux-qt5"&gt;Qt5&lt;/a&gt; — Windows &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/krita-6.0/windows"&gt;Qt6&lt;/a&gt; &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/krita-6.0/windows-qt5"&gt;Qt5&lt;/a&gt; — macOS &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/krita-6.0/macos-universal"&gt;Qt6&lt;/a&gt; &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/krita-6.0/macos-universal-qt5"&gt;Qt5&lt;/a&gt; — Android arm64 &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/krita-6.0/android-arm64-v8a"&gt;Qt5&lt;/a&gt; – Android arm32 &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/krita-6.0/android-arm32-v7a"&gt;Qt5&lt;/a&gt; – Android x86_64 &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/krita-6.0/android-x86-64"&gt;Qt5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Or test out the latest &lt;strong&gt;Experimental&lt;/strong&gt; features in Krita Next (5.4.0/6.1.0-prealpha). Feedback and &lt;a target="_blank" href="https://docs.krita.org/en/untranslatable_pages/reporting_bugs.html"&gt;bug reports&lt;/a&gt; are appreciated!: Linux &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/master/linux"&gt;Qt6&lt;/a&gt; &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/master/linux-qt5"&gt;Qt5&lt;/a&gt; — Windows &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/master/windows"&gt;Qt6&lt;/a&gt; &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/master/windows-qt5"&gt;Qt5&lt;/a&gt; — macOS &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/master/macos-universal"&gt;Qt6&lt;/a&gt; &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/master/macos-universal-qt5"&gt;Qt5&lt;/a&gt; — Android arm64 &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/master/android-arm64-v8a"&gt;Qt5&lt;/a&gt; – Android arm32 &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/master/android-arm32-v7a"&gt;Qt5&lt;/a&gt; – Android x86_64 &lt;a target="_blank" href="https://cdn.kde.org/ci-builds/graphics/krita/master/android-x86-64"&gt;Qt5&lt;/a&gt;&lt;/p&gt;</description><author>Krita News</author></item><item><title>Teaching digiKam to Understand You: Natural Language Search with Local LLMs</title><link>http://srirupa19.github.io/gsoc/2026/06/28/gsoc1.html</link><pubDate>Sun, 28 Jun 2026 04:33:36 +0000</pubDate><guid isPermaLink="true">http://srirupa19.github.io/gsoc/2026/06/28/gsoc1</guid><description>&lt;p&gt;&lt;em&gt;GSoC 2026 • digiKam • Post 1: Design and Progress&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I’ve been hanging around KDE apps since I was a teenager :), so getting to spend another summer inside one feels a bit like coming home. This time it’s digiKam!&lt;/p&gt;
&lt;p&gt;Here’s what I want digiKam to do: Let me type “photos of mountains from last summer that I rated highly” into a search box, and have it just… find them. No complex filters, no guessing where to click, just plain English, the way you’d ask a friend who’d been on the trip with you.&lt;/p&gt;
&lt;p&gt;That, in one sentence, is my GSoC project: interfacing digiKam’s search engine with an AI-based &lt;strong&gt;LLM&lt;/strong&gt; so you can search your photo collection in natural language. For many users, digiKam’s &lt;strong&gt;Advanced Search&lt;/strong&gt; is a hidden gem, powerful but a little intimidating. By adding natural language support, we’re making it accessible to everyone, from beginners to experts who want to save time. And as someone who’s used KDE apps for years, I loved the idea of bridging the gap between digiKam’s powerful features and the simplicity of just &lt;em&gt;asking&lt;/em&gt; for what you want.&lt;/p&gt;
&lt;p&gt;I’d recently been deep-diving into transformers, and this project stood out to me as a near-perfect blend: real software development &lt;em&gt;and&lt;/em&gt; having to actually understand LLMs, which architectures fit where, when you want an encoder versus a decoder, and how a model behaves once it’s wired into an actual application.&lt;/p&gt;
&lt;p&gt;This first post is about the overall design and the progress so far. The more interesting bits about the actual language model: which one, how fast, how accurate, are coming in a second post, so consider this the scene-setting.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Mild Technical Content Ahead, but I promise to keep the scary parts optional. ;) )&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The one idea the whole project rests on&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DigiKam already has a powerful &lt;strong&gt;Advanced Search&lt;/strong&gt; feature: a dialog packed with dropdowns for tags, dates, ratings, albums, color labels, and more. It can handle complex queries, but it requires users to know how to navigate it.&lt;/p&gt;
&lt;p&gt;So the &lt;strong&gt;LLM&lt;/strong&gt; in my project does NOT search your photos. Let me say that again, because it’s the most important design decision: the model never touches your database, never decides what matches, never invents results. All it does is &lt;strong&gt;translate&lt;/strong&gt; your sentence into the exact same structured query you could have built by clicking the dialog yourself. The model produces an “intent”; digiKam’s existing, trusted search engine does the actual searching.&lt;/p&gt;
&lt;p&gt;I like this framing because it keeps the AI firmly in its lane. The LLM is a translator sitting in front of a door that already exists: it’s not a new door, and it definitely isn’t allowed to wander off and make things up. Anything it produces is something a human could have produced by clicking. That’s the safety guarantee, and everything in the pipeline is built to enforce it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Pipeline in Action&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here’s the journey your query takes:&lt;/p&gt;
&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;Your sentence
|
v
[ Prompt Builder ] : wraps it with format instructions
|
v
[ Language Backend ] : runs the model, returns raw output
|
v
[ Intent Parser ] : validates strictly; rejects anything malformed
|
v
[ Capability Dictionary ] : maps human words to digiKam's real fields
|
v
[ Intent Resolver ] : builds concrete search criteria
|
v
Advanced Search widgets populated —&amp;gt; digiKam runs the search
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Walking through it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You type a sentence.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;prompt builder&lt;/strong&gt; wraps it in instructions that tell the model exactly what format to answer in.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;language backend&lt;/strong&gt; runs the model and gets back its answer.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;intent parser&lt;/strong&gt; reads that answer and crucially &lt;em&gt;validates it strictly&lt;/em&gt;. The model’s output is never trusted directly. If it isn’t well-formed and doesn’t match the known fields and operators, it’s rejected outright. No partial guessing.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;capability dictionary&lt;/strong&gt; maps fuzzy human words to digiKam’s real fields: “best” might mean a high rating or an “Accepted” pick label, “colour label” maps to the actual colour-label field, and so on.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;intent resolver&lt;/strong&gt; turns the validated, mapped intent into concrete search criteria.&lt;/li&gt;
&lt;li&gt;Those criteria populate the Advanced Search widgets, and digiKam runs the search exactly as if you’d filled them in by hand.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The nice consequence of splitting it up this way is that the model can be as small and dumb as we like, every layer after it is busy double-checking its homework. If the model says something nonsensical, the parser catches it. If it names a field that doesn’t exist, the dictionary won’t map it. By the time anything reaches your database, it’s been laundered through several layers of “is this actually a thing digiKam can do?”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why Local Models?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A quick but important detour. The model runs &lt;em&gt;locally&lt;/em&gt; on your own machine, not in some company’s cloud. Running the model locally isn’t just about performance - it’s about privacy.&lt;/p&gt;
&lt;p&gt;And privacy matters more here than it might first appear. Think about what’s actually in a photo library: where you live, who your family and friends are, where you travelled and when, the inside of your home, your children, the events that matter to you. A photo collection is one of the most personal things a person keeps on a computer. And the &lt;em&gt;searches&lt;/em&gt; you run over it are revealing in their own right, the words you’d type to find a photo say something about what you’re looking for and why.&lt;/p&gt;
&lt;p&gt;If any of that were sent off to a remote server to be processed, you’d be trusting a third party with exactly the information most people would least want to hand over. Running everything on-device sidesteps that entirely: your photos never leave your machine, your queries never leave your machine, and there’s no account, no API key, and no internet connection required. The feature works the same on a plane as it does at home.&lt;/p&gt;
&lt;p&gt;The catch is that a local model is a big file you have to get onto people’s computers somehow which brings me to the part I spent most of this period actually building.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Plugging into digiKam’s Infrastructure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C++ has been my favourite language since my teens, and one of the quiet pleasures of this project has been getting to brush up on it properly. Qt, though, is a different story and a familiar one if you’ve read my Krita posts. Every term I spend with Qt I learn a little more, and every term I’m reminded that it’s one of the harder frameworks to get comfortable in, precisely because it leans so heavily on design patterns. You don’t really “learn Qt” so much as slowly stop being surprised by it.&lt;/p&gt;
&lt;p&gt;When I first thought about “the model needs to be downloaded onto the user’s computer,” my instinct was to just write something that downloads a file. Simple enough. But that instinct was wrong. digiKam already knows how to download large model files. It’s been doing it for years, for face recognition, object detection, auto-rotation, aesthetics scoring. There’s a whole system for it: a central &lt;code class="language-plaintext highlighter-rouge"&gt;DNNModelManager&lt;/code&gt; that reads a config file describing each model, and a &lt;code class="language-plaintext highlighter-rouge"&gt;FilesDownloader&lt;/code&gt; that fetches the files from KDE’s servers and verifies them. My mentor’s guidance was clear and correct: don’t build a parallel download mechanism, plug into this one.&lt;/p&gt;
&lt;p&gt;The wrinkle is that this entire system was built for &lt;strong&gt;OpenCV vision models&lt;/strong&gt; - models that look at images. My model is a &lt;strong&gt;language model&lt;/strong&gt; run by a completely different library (llama.cpp). It’s a different kind of beast that doesn’t fit the OpenCV machinery at all.&lt;/p&gt;
&lt;p&gt;The solution turned out to be pleasingly modular. By creating a lightweight &lt;code class="language-plaintext highlighter-rouge"&gt;DNNModelNaturalLanguage&lt;/code&gt; class, I was able to plug into digiKam’s existing model download system without modifying its core logic. This means the GGUF file is downloaded, verified, and managed just like digiKam’s other AI models (e.g., for face recognition). There’s an existing model type in digiKam (&lt;code class="language-plaintext highlighter-rouge"&gt;DNNModelConfig&lt;/code&gt;) that registers and verifies a file but does no OpenCV loading and that was almost exactly the shape I needed, so my wrapper mirrors it. The actual loading and running of the model happens separately, in a &lt;code class="language-plaintext highlighter-rouge"&gt;SearchLlamaBackend&lt;/code&gt; that talks to llama.cpp.&lt;/p&gt;
&lt;p&gt;So the division of labour is clean: digiKam’s existing system handles &lt;em&gt;getting the file onto your computer&lt;/em&gt; (download, checksum, the works), and my llama.cpp backend handles &lt;em&gt;running it&lt;/em&gt;. No duplication, and my model gets to ride the same well-tested rails as every other model in digiKam.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why Qwen2.5-1.5B-Instruct&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A word on the model itself (much more in post two). I went with &lt;strong&gt;Qwen2.5&lt;/strong&gt;-1.5B-Instruct, in a quantized GGUF form, for a few reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Size vs. capability.&lt;/strong&gt; At ~1.12 GB (Q4_K_M quantization) it’s small enough to download and run on a normal laptop, but the 1.5B-Instruct variant is genuinely good at following instructions and producing structured JSON, which is exactly what I need it to do.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It’s good at the specific job.&lt;/strong&gt; This project lives or dies on the model reliably emitting clean, parseable, schema-shaped output. Qwen2.5 is notably solid at structured outputs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The licence.&lt;/strong&gt; It’s Apache 2.0, so it’s freely redistributable, which means KDE can actually host the file on its own infrastructure.
&lt;strong&gt;Why a decoder-only model (and not BERT)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before picking a &lt;em&gt;specific&lt;/em&gt; model, I had to pick a &lt;em&gt;kind&lt;/em&gt; of model and this is one of the places my transformers reading actually paid off, so indulge me for a paragraph.&lt;/p&gt;
&lt;p&gt;The obvious-seeming choice for “understand a sentence and classify it” is an encoder model like BERT. Encoders are efficient, deterministic, and great at fixed-label tasks. But they assume a &lt;em&gt;finite, predefined output space&lt;/em&gt; and that’s exactly what search queries don’t have. A query can express any number of constraints (“landscape photos with red labels near Paris last summer” is four constraints at once), and I’ll keep adding new searchable dimensions over time. To force that into an encoder, I’d need a pile of auxiliary pieces: intent classifiers, entity extractors, rule-based combiners and that scaffolding gets more brittle every time digiKam gains a new search field.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;decoder-only&lt;/strong&gt; model sidesteps all of that. It generates a &lt;em&gt;sequence&lt;/em&gt;, so it can emit a variable number of structured constraints directly as JSON, following a schema I define in the prompt. New search field? Update the schema and no retraining. And it handles ambiguity gracefully: instead of being forced to pick one interpretation of “best photos,” it can emit a clarification request inside the same constrained output. (Encoder-decoder models like T5 could generate structured output too, but they carry extra architectural and latency overhead that’s wasteful for a local, on-demand desktop feature.)&lt;/p&gt;
&lt;p&gt;So the short version: a small decoder-only model gives me compositional, schema-shaped generation with built-in ambiguity handling, at a size that runs on a laptop. That’s the whole wishlist.&lt;/p&gt;
&lt;p&gt;All assuming 4-bit (Q4) quantization in GGUF form, which is the standard for CPU inference with llama.cpp:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Params&lt;/th&gt;
&lt;th&gt;Size (Q4)&lt;/th&gt;
&lt;th&gt;Licence&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Qwen2.5-1.5B-Instruct&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.5B&lt;/td&gt;
&lt;td&gt;~0.9–1.2 GB&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Balanced quality/efficiency, good structured output, long context — &lt;strong&gt;my primary&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TinyLlama 1.1B&lt;/td&gt;
&lt;td&gt;1.1B&lt;/td&gt;
&lt;td&gt;~0.7–0.9 GB&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Lightest, fast CPU inference — &lt;strong&gt;fallback for low-RAM machines&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 2B Instruct&lt;/td&gt;
&lt;td&gt;2B&lt;/td&gt;
&lt;td&gt;~1.3–1.6 GB&lt;/td&gt;
&lt;td&gt;(Gemma terms)&lt;/td&gt;
&lt;td&gt;Strong general language understanding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phi-2&lt;/td&gt;
&lt;td&gt;2.7B&lt;/td&gt;
&lt;td&gt;~1.5–1.8 GB&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Better reasoning than 1B models, heavier CPU load&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen2.5-3B-Instruct&lt;/td&gt;
&lt;td&gt;3B&lt;/td&gt;
&lt;td&gt;~1.8–2.2 GB&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;More capable than 1.5B, but higher RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phi-3 Mini&lt;/td&gt;
&lt;td&gt;3.8B&lt;/td&gt;
&lt;td&gt;~2.2–2.6 GB&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Best comprehension here, but slowest and largest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The pattern is a straightforward size-vs-capability trade-off. The bigger models (Phi-3 Mini, Qwen2.5-3B) reason better but want more RAM and run slower on a CPU-only laptop and since this feature has to stay usable on ordinary hardware without a dedicated GPU, “runs comfortably in ~1 GB of RAM” is a hard constraint, not a preference. That rules the heavier models out for the default.&lt;/p&gt;
&lt;p&gt;Among the lightweight options, &lt;strong&gt;Qwen2.5-1.5B-Instruct&lt;/strong&gt; hits the sweet spot: small enough for a CPU laptop, but notably reliable at the one thing this project actually needs: emitting clean, schema-shaped structured output. &lt;strong&gt;TinyLlama 1.1B&lt;/strong&gt; stays in the picture as a fallback for lower-end machines where even 1.5B is too much. Both are Apache 2.0, which (as above) is what makes KDE hosting possible, a point that quietly eliminated some otherwise-tempting models with restrictive licences.&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img src="//srirupa19.github.io/assets/gif_1.gif" alt="Natural language search demo" width="100%" /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where things stand&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The pipeline already works end-to-end using a mock backend (standing in for the real model). So, prompt &amp;gt; parse &amp;gt; resolve &amp;gt; populate-the-search-and-run is all functioning and unit-tested. And the download integration I described above is in place: the model is registered with digiKam’s central manager, and I’ve verified it gets picked up correctly and its file path resolves to the shared model directory.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What’s Next?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Host the GGUF model on KDE’s infrastructure (in progress).&lt;/li&gt;
&lt;li&gt;Wire up llama.cpp for local inference.&lt;/li&gt;
&lt;li&gt;Benchmark Qwen2.5 vs. TinyLlama on digiKam-specific queries (e.g., “5-star photos”, “pick label accepted”).&lt;/li&gt;
&lt;li&gt;Dive into model performance, fine-tuning, and caching!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Found an excuse to start drawing again :)&lt;/p&gt;
&lt;p&gt;&lt;img src="//srirupa19.github.io/assets/img1.png" alt="Hand drawn art" /&gt;&lt;/p&gt;</description><author>Srirupa Datta</author></item><item><title>XDG Desktop Portal Location API for KDE applications</title><link>https://www.volkerkrause.eu/2026/06/27/kde-xdg-portal-location-api.html</link><pubDate>Sat, 27 Jun 2026 06:00:00 +0000</pubDate><guid isPermaLink="true">https://www.volkerkrause.eu/2026/06/27/kde-xdg-portal-location-api</guid><description>&lt;p&gt;In my &lt;a href="//www.volkerkrause.eu/2026/06/13/kde-android-news-june-2026.html"&gt;last post on Android platform integration&lt;/a&gt;
I had suggested increasing the focus on Linux on mobile phones, due to
&lt;a target="_blank" href="https://keepandroidopen.org/"&gt;Google’s ongoing attempts to close down Android for us&lt;/a&gt;.
I have to follow that myself then of course, starting with looking at the
situation around location/positioning.&lt;/p&gt;
&lt;h3 id="what-we-have"&gt;What we have&lt;/h3&gt;
&lt;p&gt;The positioning stack looks roughly as follows as far as KDE applications are concerned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="https://gitlab.freedesktop.org/geoclue/geoclue"&gt;Geoclue&lt;/a&gt; collects positioning data
from various sources (&lt;a target="_blank" href="https://en.wikipedia.org/wiki/Satellite_navigation"&gt;GNSS&lt;/a&gt; receiver,
cell modem, online service, etc) and provides a D-Bus API for it.&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="https://github.com/flatpak/xdg-desktop-portal"&gt;XDG Desktop Portal&lt;/a&gt; has a
&lt;a target="_blank" href="https://flatpak.github.io/xdg-desktop-portal/docs/doc-org.freedesktop.portal.Location.html"&gt;Location API&lt;/a&gt;
for exposing this to sandboxed applications, including permission handling. XDG Desktop Portal
itself uses Geoclue as its source.&lt;/li&gt;
&lt;li&gt;Qt Positioning provides the application-facing API for retrieving position data, and &lt;code class="language-plaintext highlighter-rouge"&gt;QLocationPermission&lt;/code&gt;
provides the API for requesting permissions when running sandboxed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There’s two main gaps here though:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Qt Positioning only has a Geoclue backend, not one for the XDG Desktop Portal Location API.
This means we wont have access to positioning information in a sandbox.&lt;/li&gt;
&lt;li&gt;Qt’s entire permission API has only a dummy implementation on Linux, meaning it will always
claim all permissions have been granted, which isn’t true in a sandbox.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What I couldn’t look into is whether Geoclue is able to actually retrieve GNSS data on “real” hardware,
lacking access to devices to test this on.&lt;/p&gt;
&lt;h3 id="developer-tooling"&gt;Developer Tooling&lt;/h3&gt;
&lt;p&gt;Testing GNSS code with real hardware is rather inconvenient anyway, you have to move around for this,
and quite a bit even when you also want to test various edge cases. Much better would be a way to inject arbitrary
GNSS data low enough in the stack.&lt;/p&gt;
&lt;p&gt;Many years ago I had built something like this for GammaRay, but that works on the level of Qt Positioning, which
is above the parts we want to test here. Fortunately Geoclue offers us a way to do this as well. It’s looking for
&lt;code class="language-plaintext highlighter-rouge"&gt;_nmea-0183._tcp&lt;/code&gt; &lt;a target="_blank" href="https://en.wikipedia.org/wiki/Multicast_DNS"&gt;mDNS&lt;/a&gt; services that provide a
&lt;a target="_blank" href="https://en.wikipedia.org/wiki/NMEA_0183"&gt;NMEA 0183&lt;/a&gt; feed, and will use that as a source for GNSS data.&lt;/p&gt;
&lt;p&gt;NMEA 0183 is a decades-old serial port protocol for GNSS equipment, easy enough to implement. As there are more usecases
for this below, there’s now a &lt;a target="_blank" href="https://invent.kde.org/vkrause/xdg-portal-location-integration/-/tree/master/src/lib"&gt;small library&lt;/a&gt;
setting up such a services, announcing it via mDNS and sending NMEA 0183 messages.
NMEA 0183 defines two dozen or so different message types, but since Geoclue only looks at &lt;code class="language-plaintext highlighter-rouge"&gt;GGA&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;RMC&lt;/code&gt; ones those are
all we need.&lt;/p&gt;
&lt;figure&gt;
&lt;img src="https://www.volkerkrause.eu/assets/posts/234/kde-xdg-portal-location-api-spoofer.jpg" alt="Screenshot of a map view showing a GPX track replay on the left and simulated and received position data in text form on the right." loading="lazy" /&gt;
&lt;figcaption&gt;XDG portal location spoofing tool.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Then all we need is a little GUI on top of this to select inputs on a map and have that fed into Geoclue.
As a bonus we also have &lt;a target="_blank" href="https://en.wikipedia.org/wiki/GPS_Exchange_Format"&gt;GPX&lt;/a&gt; track replay,
so you can get a continuous feed of position updates automatically.
The code is &lt;a target="_blank" href="https://invent.kde.org/vkrause/xdg-portal-location-integration/-/tree/master/src/spoofer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="xdg-portal-plugin-for-qt-positioning"&gt;XDG Portal plugin for Qt Positioning&lt;/h3&gt;
&lt;p&gt;Being able to “move” around the world from the convenience of my desk/couch made it then easy to implement the main missing piece here,
connecting Qt Positioning to the XDG Desktop Portal Location API. The code is
&lt;a target="_blank" href="https://invent.kde.org/vkrause/xdg-portal-location-integration/-/tree/master/src/positioning"&gt;here&lt;/a&gt;,
it’s just a couple of D-Bus calls and a bit of boilerplate needed for positioning plugins.&lt;/p&gt;
&lt;p&gt;It’s registered with a higher priority than the Geoclue plugin and will be skipped if the portal API is not available.&lt;/p&gt;
&lt;h3 id="qpermission-api"&gt;QPermission API&lt;/h3&gt;
&lt;p&gt;That still leaves the permission handling. Qt’s API for that lives in Qt Core, so we cannot just implement support
for XDG protal permissions there, as that needs dependencies from higher up in the stack, such as D-Bus and window ids.&lt;/p&gt;
&lt;p&gt;There’s an easy way out though, by generalizing an already existing permission plugin system that so far is only provided on Apple platforms.
A &lt;a target="_blank" href="https://codereview.qt-project.org/c/qt/qtbase/+/747076"&gt;patch to Qt&lt;/a&gt; enabling this on Unix systems as well is in review currently.
With that applied implementing support for requesting location permissions is then very similar to what the positioning plugin already
does, you’ll find the code &lt;a target="_blank" href="https://invent.kde.org/vkrause/xdg-portal-location-integration/-/tree/master/src/permissions"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A very convenient side-effect of having permission plugins is that we can now also build a “simulator” that allows testing permission
flows in applications while running in an unrestricted development environment and without having to mess with system permission settings
each time.&lt;/p&gt;
&lt;p&gt;So I did that &lt;a target="_blank" href="https://invent.kde.org/vkrause/xdg-portal-location-integration/-/tree/master/src/permissions-simulator"&gt;here&lt;/a&gt;,
usage is pretty simple:&lt;/p&gt;
&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ qpermission-simulator [--ask|--grant|--deny] &amp;lt;application-to-test&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Note that this also needs the above mentioned Qt patch to actually do anything, and it currently requires the tested application
to be a &lt;code class="language-plaintext highlighter-rouge"&gt;QApplication&lt;/code&gt; in order to show its UI. It does work for all permission types supported by Qt though, not just the location one.&lt;/p&gt;
&lt;h3 id="other-positioning-sources"&gt;Other positioning sources&lt;/h3&gt;
&lt;p&gt;One unique feature that &lt;a target="_blank" href="https://github.com/microg/GmsCore/wiki"&gt;microG&lt;/a&gt; offers on Google-free Android is using onboard APIs of
planes/trains/buses as a location source. That’s useful as the GNSS antennas of those vehicles tend to give you much better results
than the one on your phone inside the metal casing of the vehicle.&lt;/p&gt;
&lt;p&gt;Of course we have to have that as well, and it’s easy enough to build that since we have an existing library for dealing with
onboard APIs already as part of &lt;a target="_blank" href="https://commits.kde.org/kpublictransport"&gt;KPublicTransport&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Putting that together with the NMEA 0183 server we get a &lt;a target="_blank" href="https://invent.kde.org/vkrause/xdg-portal-location-integration/-/tree/master/src/onboard"&gt;small KDED module&lt;/a&gt;
that watches for changes to the Wi-Fi network you are connected to, and if it’s one of a known onboard API it’ll offer
its service to Geoclue. As Geoclue will only connect to it on demand (ie. when an application actually asks for a location)
it will only poll the onboard API when necessary, so we also get practically no overhead in the idle state here.&lt;/p&gt;
&lt;p&gt;Other sources are possible in a similar way as well, e.g. having &lt;a target="_blank" href="https://kdeconnect.kde.org/"&gt;KDE Connect&lt;/a&gt; provide location data
from your phone to your desktop computer.&lt;/p&gt;
&lt;h3 id="feedback"&gt;Feedback&lt;/h3&gt;
&lt;p&gt;This is mostly the result of about two weeks of prototyping, and I’d very much appreciate review and feedback on this.
Does the general approach make sense? Is there something else missing around the the location/position topic? Where should
the various components live and be distributed eventually (some of this only really relevant inside a Flatpak sandbox fox example)?&lt;/p&gt;</description><author>Volker Krause</author></item><item><title>This Week in Plasma: Post-6.7 Bug-fixing</title><link>https://blogs.kde.org/2026/06/27/this-week-in-plasma-post-6.7-bug-fixing/</link><pubDate>Sat, 27 Jun 2026 00:00:01 +0000</pubDate><guid isPermaLink="true">https://blogs.kde.org/2026/06/27/this-week-in-plasma-post-6.7-bug-fixing/</guid><description>&lt;!-- Example wording for a change, MR version. (Developer Name, [repo-name MR #xxx](https://invent.kde.org/plasma/repo-name/-/merge_requests/xxx)) --&gt;
&lt;!-- Example wording for a change, Bugzilla version. (Developer Name, [KDE Bugzilla #xxx](https://bugs.kde.org/show_bug.cgi?id=xxx)) --&gt;
&lt;!-- ![](thumbnail.png) --&gt;
&lt;!--
&lt;section class="swiper d-flex mb-5" aria-label="Screenshots" role="list"&gt;
&lt;div class="swiper-wrapper d-flex my-3" role="listitem"&gt;
&lt;/div&gt;
&lt;div class="swiper-pagination" style="bottom: 0"&gt;&lt;/div&gt;
&lt;div class="swiper-button-prev"&gt;&lt;/div&gt;
&lt;div class="swiper-button-next"&gt;&lt;/div&gt;
&lt;/section&gt;
--&gt;
&lt;!--
&lt;figure class="text-center ratio ratio-16x9" style=""&gt;
&lt;video controls&gt;&lt;source src="%25!s%28%3cnil%3e%29something.mp4" type="video/mp4" /&gt;&lt;/video&gt;&lt;/figure&gt;
--&gt;
&lt;p&gt;Welcome to a new issue of &lt;em&gt;This Week in Plasma!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week members of the core Plasma team spent almost all of their time in bug-fixing mode! As usual, people unleashed their real-world setups on the new Plasma release and found some issues we missed during the development process, and that nobody reported during the two beta releases. So we made it a priority to fix those issues!&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://kde.org/announcements/plasma/6/6.7.1"&gt;Plasma 6.7.1&lt;/a&gt; was released earlier this week with the first round of fixes, and 6.7.2 is scheduled for early next week with more.&lt;/p&gt;
&lt;p&gt;A few new features and UI improvements started landing, too.&lt;/p&gt;
&lt;p&gt;Check it out here:&lt;/p&gt;
&lt;h2 id="notable-new-features"&gt;Notable new features&lt;/h2&gt;
&lt;!-- Can find some with https://invent.kde.org/groups/plasma/-/merge_requests/?sort=merged_at_desc&amp;state=merged&amp;label_name%5B%5D=Feature&amp;first_page_size=20 --&gt;
&lt;h3 id="plasma-68"&gt;Plasma 6.8&lt;/h3&gt;
&lt;p&gt;You can now set up wallpaper slideshows that don’t change automatically. Instead you can manually switch the wallpaper via the item in the desktop context menu or its global keyboard shortcut. (Fushan Wen, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=518669"&gt;KDE Bugzilla #518669&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Added an Esperanto keyboard layout to Plasma’s virtual keyboard. (Daniel O’Neill, &lt;a target="_blank" href="https://invent.kde.org/plasma/plasma-keyboard/-/merge_requests/148"&gt;plasma-keyboard MR #148&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id="notable-ui-improvements"&gt;Notable UI improvements&lt;/h2&gt;
&lt;!-- Can find some with https://invent.kde.org/groups/plasma/-/merge_requests/?sort=merged_at_desc&amp;state=merged&amp;label_name%5B%5D=Enhancement&amp;first_page_size=20 --&gt;
&lt;h3 id="plasma-672"&gt;Plasma 6.7.2&lt;/h3&gt;
&lt;p&gt;Improved text alignment in System Monitor’s Processes page while using the tree view. (Arjen Hiemstra, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=442095"&gt;KDE Bugzilla #442095&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="plasma-68-1"&gt;Plasma 6.8&lt;/h3&gt;
&lt;p&gt;Reduced the number of visual frames in the Menu Editor app. (Levi Leal, &lt;a target="_blank" href="https://invent.kde.org/plasma/kmenuedit/-/merge_requests/59"&gt;kmenuedit MR #59&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id="notable-bug-fixes"&gt;Notable bug fixes&lt;/h2&gt;
&lt;!--
Can find some with:
- HI and VHI bugs fixed: https://tinyurl.com/bdepnh4v
- All bugs fixed: https://invent.kde.org/groups/plasma/-/merge_requests/?sort=merged_at_desc&amp;state=merged&amp;label_name%5B%5D=Bugfix&amp;first_page_size=20
--&gt;
&lt;h3 id="plasma-666"&gt;Plasma 6.6.6&lt;/h3&gt;
&lt;p&gt;Fixed an issue that could make KWin crash when some apps opened dialogs and popups in non-standard ways. (Vlad Zahorodnii, &lt;a target="_blank" href="https://invent.kde.org/plasma/kwin/-/merge_requests/9444"&gt;kwin MR #9444&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Fixed a regression introduced by Qt 6.11 that made the word “Undefined” appear next to Places entries in the Kickoff Application Launcher widget. (Christoph Wolk, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521799"&gt;KDE Bugzilla #521799&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Fixed a visual glitch affecting users of Deskflow that could make a clone of the pointer inappropriately remain visible on the client machine. (David Redondo, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521486"&gt;KDE Bugzilla #521486&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="plasma-671"&gt;Plasma 6.7.1&lt;/h3&gt;
&lt;p&gt;Fixed a somewhat common case where KWin could crash on the lock screen when using an NVIDIA GPU. (Xaver Hugl, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=520842"&gt;KDE Bugzilla #520842&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Fixed a recent regression that made KWin crash when using a DisplayLink monitor. (Xaver Hugl, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=520361"&gt;KDE Bugzilla #520361&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Fixed an issue that could make screens plugged into a laptop with both an NVIDIA and an AMD GPU freeze. (Xaver Hugl and SungHwan Jung, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521727"&gt;KDE Bugzilla #521727&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Fixed a recent regression that broke certain shader-based KWin effects, including the popular “Burn My Windows” effects. (Xaver Hugl, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521774"&gt;KDE Bugzilla #521774&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Fixed a recent regression that broke color-related KWin effects like color blindness correction and screen color inversion. (Xaver Hugl, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521737"&gt;KDE Bugzilla #521737&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id="plasma-672-1"&gt;Plasma 6.7.2&lt;/h2&gt;
&lt;p&gt;Fixed the currently most common KWin crash, related to variable refresh rates with multi-monitor setups. (Vlad Zahorodnii, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521909"&gt;KDE Bugzilla #521909&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Fixed a case where Info Center could crash when trying to display information about certain NVIDIA GPUs. (Harald Sitter, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521295"&gt;KDE Bugzilla #521295&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Fixed a recent regression that broke the RDP server when run using systemd. Sorry about that! (David Edmundson, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521776"&gt;KDE Bugzilla #521776&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Fixed a recent regression that could sometimes make Chromium-based apps freeze if another window was forced into “Keep Above Others” mode. (Xaver Hugl, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521687"&gt;KDE Bugzilla #521687&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="plasma-68-2"&gt;Plasma 6.8&lt;/h3&gt;
&lt;p&gt;Fixed a case where Plasma could crash after you ejected an audio CD from Dolphin or &lt;a target="_blank" href="https://apps.kde.org/audex"&gt;Audex&lt;/a&gt;. (Kai Uwe Broulik, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=522051"&gt;KDE Bugzilla #522051&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="flatpak-1181"&gt;Flatpak 1.18.1&lt;/h3&gt;
&lt;p&gt;Fixed an issue that made a background service for Flatpak crash if you used the KDE desktop portal dialog to allow an app to update itself while the app was still running. (Sebastian Wick, &lt;a target="_blank" href="https://github.com/flatpak/flatpak/issues/6686"&gt;flatpak issue #6686&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="gtk-4232"&gt;GTK 4.23.2&lt;/h3&gt;
&lt;p&gt;Made the process of selecting text to later paste it by middle-clicking more reliable in GTK 4 apps. (Vlad Zahorodnii, &lt;a target="_blank" href="https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/10006"&gt;gtk MR #10006&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id="notable-in-performance--technical"&gt;Notable in performance &amp;amp; technical&lt;/h2&gt;
&lt;h3 id="plasma-672-2"&gt;Plasma 6.7.2&lt;/h3&gt;
&lt;p&gt;Improved full-screen video playback performance in Chromium-based apps. (Xaver Hugl, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521960"&gt;KDE Bugzilla #521960&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="plasma-68-3"&gt;Plasma 6.8&lt;/h3&gt;
&lt;p&gt;Turned on triple buffering by default for NVIDIA GPUs, because the bugs blocking this from working properly in the past have since been fixed. (Xaver Hugl, &lt;a target="_blank" href="https://invent.kde.org/plasma/kwin/-/merge_requests/9472"&gt;kwin MR #9472&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id="how-you-can-help"&gt;How you can help&lt;/h2&gt;
&lt;p&gt;KDE has become important in the world, and your time and contributions have helped us get there. As we grow, we need your support to keep KDE sustainable.&lt;/p&gt;
&lt;p&gt;Would you like to help put together this weekly report? Introduce yourself in &lt;a target="_blank" href="https://matrix.to/#/%23this-week-kde-apps:kde.org"&gt;the Matrix room&lt;/a&gt; and &lt;a target="_blank" href="https://community.kde.org/Promotion/This_week_in_KDE"&gt;join the team&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Beyond that, you can help KDE by directly &lt;a target="_blank" href="https://community.kde.org/Get_Involved"&gt;getting involved&lt;/a&gt; in any other projects. Donating time is actually more impactful than donating money. Each contributor makes a huge difference in KDE — you are not a number or a cog in a machine! You don’t have to be a programmer, either; many other opportunities exist.&lt;/p&gt;
&lt;p&gt;You can also help out by &lt;a target="_blank" href="https://kde.org/donate"&gt;making a donation&lt;/a&gt;! This helps cover operational costs, salaries, travel expenses for contributors, and in general just keeps KDE bringing Free Software to the world.&lt;/p&gt;</description><author>Nate Graham</author></item><item><title>Techpaladin is hiring again</title><link>https://pointieststick.com/2026/06/26/techpaladin-is-hiring-again/</link><pubDate>Fri, 26 Jun 2026 14:30:39 +0000</pubDate><guid isPermaLink="true">http://pointieststick.com/?p=29629</guid><description>&lt;p class="wp-block-paragraph"&gt;Time to put on my Techpaladin Software had again: &lt;a target="_blank" href="https://techpaladinsoftware.com/joinus.html"&gt;we&amp;#8217;re hiring&lt;/a&gt;! David Edmundson &lt;a target="_blank" href="https://blog.davidedmundson.co.uk/blog/techpaladin-are-hiring/"&gt;has already posted it&lt;/a&gt;, so I&amp;#8217;m here to boost the signal: we need you! Especially if you&amp;#8217;ve got experience with Qt/KDE development.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;We&amp;#8217;re looking for someone with that plus an eye for UX &amp;amp; design, and another person with that plus deep tech skills, particularly around I/O and other &amp;#8220;system plumbing&amp;#8221; topics.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Check it out: &lt;a target="_blank" href="https://techpaladinsoftware.com/joinus.html"&gt;https://techpaladinsoftware.com/joinus.html&lt;/a&gt;&lt;/p&gt;</description><author>Nate Graham</author></item><item><title>Submit a KDE goal!</title><link>https://pointieststick.com/2026/06/26/submit-a-kde-goal/</link><pubDate>Fri, 26 Jun 2026 14:13:22 +0000</pubDate><guid isPermaLink="true">http://pointieststick.com/?p=29632</guid><description>&lt;p class="wp-block-paragraph"&gt;KDE has now started its &lt;a target="_blank" href="https://blogs.kde.org/2026/06/20/kde-goals-call-for-submissions/"&gt;fifth round of &amp;#8220;goal-setting&amp;#8221;&lt;/a&gt; — a process that began in 2017.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;These goals are big, high-level goals. Think &amp;#8220;focus on large strategic topic X&amp;#8221; more so than &amp;#8220;fix my pet bugs A, B, and C&amp;#8221;.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;And it&amp;#8217;s up to the KDE community to choose the goals! Up to you, up to me, up to all of us. They will then be voted on, with the top three informing KDE&amp;#8217;s overall direction for the next two years.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;KDE needs you! Your fresh ideas, your contributions, your budding leadership talent. But &lt;em&gt;not&lt;/em&gt; your imposter-syndrome-driven fear of coming out of your shell. &lt;img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /&gt; Overcome that!&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;I&amp;#8217;ve now been the champion for two goals: &amp;#8220;&lt;a target="_blank" href="https://community.kde.org/Goals/Usability_%26_Productivity"&gt;Usability &amp;amp; Productivity&lt;/a&gt;&amp;#8221; and &amp;#8220;&lt;a target="_blank" href="https://community.kde.org/Goals/Automate_and_systematize_internal_processes"&gt;Automate &amp;amp; Systematize Internal Processes&lt;/a&gt;&amp;#8220;. I&amp;#8217;d count the first as pretty successful; the second, less so. So at this point I feel like I have a pretty good idea of what works and what doesn&amp;#8217;t, and I&amp;#8217;d like to use that knowledge to help others submit their own high-quality actionable goals.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Here&amp;#8217;s what works, in my experience:&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
&lt;li&gt;&lt;strong&gt;Articulate an immediately obvious large problem or aspiration.&lt;/strong&gt; If you&amp;#8217;ve spent any time in KDE or using KDE software, you&amp;#8217;ll have encountered stuff that could be better. Big stuff. That&amp;#8217;s the topic to write a goal around! Not &amp;#8220;Discover is too slow to refresh when I launch it&amp;#8221; but rather &amp;#8220;First-class software delivery UX&amp;#8221; (you can steal that).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Have a technical lead and a communications lead.&lt;/strong&gt; They can be different people, but you need both. Only have a tech lead? Not enough communication, people forget about it, don&amp;#8217;t join, and the tech lead burns out. Only have a comms lead? Not enough work happens and the goal limps embarrassingly towards the finish line.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you propose a goal, be the tech lead.&lt;/strong&gt; You can be the comms lead too. But you should be prepared to be the tech lead. It&amp;#8217;s much easier to recruit people to do other things than it is to recruit a tech lead to do a ton of work on your behalf that you can&amp;#8217;t to yourself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don&amp;#8217;t bite off more than you can chew.&lt;/strong&gt; If you can&amp;#8217;t be the tech lead on your idea, scale it back or change its scope so that you &lt;em&gt;can&lt;/em&gt; be the tech lead. This doesn&amp;#8217;t mean you have to know how to do everything. It just means you can do a big chunk of the technical work, and at least &lt;em&gt;understand&lt;/em&gt; the concepts of the things you can&amp;#8217;t personally do.&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="wp-block-paragraph"&gt;It&amp;#8217;s really fun, and you end up having a huge impact on how awesome KDE is.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;I&amp;#8217;ve submitted a goal proposal about &lt;a target="_blank" href="https://invent.kde.org/teams/goals/goal-setting/2026/-/work_items/2"&gt;improving KDE&amp;#8217;s documentation&lt;/a&gt;. Credible choices make voting useful, but right now we have as many submissions as goal slots, and that&amp;#8217;s no fun. So &lt;a target="_blank" href="https://invent.kde.org/teams/goals/goal-setting/2026/-/work_items"&gt;get yours in too&lt;/a&gt;! &lt;/p&gt;</description><author>Nate Graham</author></item><item><title>Techpaladin are hiring!</title><link>http://blog.davidedmundson.co.uk/blog/techpaladin-are-hiring/</link><pubDate>Fri, 26 Jun 2026 11:33:55 +0000</pubDate><guid isPermaLink="true">https://blog.davidedmundson.co.uk/?p=601</guid><description>&lt;p&gt;If you've been around KDE, you've probably heard of &lt;a target="_blank" href="https://techpaladinsoftware.com" title="Techpaladin Software"&gt;Techpaladin Software&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://blog.davidedmundson.co.uk/wp-content/uploads/2026/06/KDE-tea-party-300x132.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;We're a consultancy that works almost exclusively on KDE, improving KDE upstream while delivering the features and functionality our clients need.&lt;/p&gt;
&lt;p&gt;We're growing and looking for more developers to join the team. We're after experienced developers who are already familiar with KDE, C++, and Qt.&lt;/p&gt;
&lt;p&gt;We currently have two positions available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Someone with a keen eye for design to work on high-level features and help shape the user experience.&lt;/li&gt;
&lt;li&gt;Someone with a more technical background to work on lower-level system integration and platform work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In return, you'll get to work with some of the most talented and welcoming developers in this space... and also me!&lt;/p&gt;
&lt;p&gt;If that sounds interesting, you can find more information and apply here:&lt;br /&gt;
&lt;a target="_blank" href="https://techpaladinsoftware.com/joinus.html"&gt;https://techpaladinsoftware.com/joinus.html&lt;/a&gt;&lt;/p&gt;</description><author>David Edmundson</author></item><item><title>KEcoLab Sprint: Two Days in Berlin</title><link>https://wiki.drquark.ch/ComputerScience/Conferences/kecolab-sprint-2026</link><pubDate>Fri, 26 Jun 2026 10:00:00 +0000</pubDate><guid isPermaLink="true">https://wiki.drquark.ch/ComputerScience/Conferences/kecolab-sprint-2026</guid><description>&lt;p&gt;KDE Eco organized a two-day sprint to work on &lt;a target="_blank" href="https://invent.kde.org/sdk/kecolab" class="external"&gt;KEcoLab&lt;svg class="external-icon" viewBox="0 0 512 512"&gt;&lt;path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; — the energy measurement lab I maintain. A few more people came and joined on day two, which made the discussions richer. The sprint was mostly about figuring out the next steps for KEcoLab, fixing some open issues with the measurement pipeline, and trying to get a second system set up in the lab. You can find the full sprint notes &lt;a target="_blank" href="https://invent.kde.org/sdk/kecolab/-/boards?show=eyJpaWQiOiI2NSIsImZ1bGxfcGF0aCI6InNkay9rZWNvbGFiIiwiaWQiOjUyODMzfQ%3D%3D" class="external"&gt;here&lt;svg class="external-icon" viewBox="0 0 512 512"&gt;&lt;path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to KDE e.V. for sponsoring the sprint, KDAB for hosting us at their Berlin office, and Volker for the guidance and support throughout.&lt;/p&gt;
&lt;h2 id="headless-remote-access"&gt;Headless Remote Access&lt;a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#headless-remote-access" class="internal"&gt;&lt;svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first thing we wanted to sort out was making the lab PC fully remotely accessible, which means we could use it without having someone physically in the room to debug our issues with the lab PC. SSH was already working fine, but RDP was not very reliable (it used to break sometimes). Nowadays, We had to go to the lab PC in person once to allow remote connections, which is exactly the kind of thing you do not want to do repeatedly. During the sprint, we applied a fix using &lt;code&gt;flatpak permission-set&lt;/code&gt; to persist screen capture permissions across reboots, based on a recently merged patch (&lt;a target="_blank" href="https://invent.kde.org/plasma/xdg-desktop-portal-kde/-/merge_requests/326" class="external"&gt;plasma/xdg-desktop-portal-kde!326&lt;svg class="external-icon" viewBox="0 0 512 512"&gt;&lt;path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;However, the issue is not fully closed. A couple of days after the sprint, the problem came back and it was not clear what had changed. We had a follow-up meeting to discuss this, notes &lt;a target="_blank" href="https://invent.kde.org/sdk/kecolab/-/boards?show=eyJpaWQiOiI2NiIsImZ1bGxfcGF0aCI6InNkay9rZWNvbGFiIiwiaWQiOjUyODQ3fQ%3D%3D" class="external"&gt;here&lt;svg class="external-icon" viewBox="0 0 512 512"&gt;&lt;path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;. Joseph and Volker are currently testing different approaches to figure out how to properly persist the session across reboots. We will update this once we have a reliable fix.&lt;/p&gt;
&lt;h2 id="setting-up-a-second-machine"&gt;Setting Up a Second Machine&lt;a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#setting-up-a-second-machine" class="internal"&gt;&lt;svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Cornelius Schumacher donated a Fujitsu Esprimo 510 to the lab for us to add as a second System Under Test. It did not go well. The machine threw six beeps on boot, which pointed to a CPU or motherboard problem, most likely a BIOS flash failure. We tried reseating the RAM, resetting the CMOS battery, testing each RAM stick one by one. Nothing changed. The machine is not usable, but we are keeping the hardware for spare parts.&lt;/p&gt;
&lt;h2 id="debugging-the-okular-pipeline"&gt;Debugging the Okular Pipeline&lt;a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#debugging-the-okular-pipeline" class="internal"&gt;&lt;svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We ran the full Okular measurement pipeline on Wayland and hit a few problems. On day two, we saw an &lt;code&gt;R&lt;/code&gt; error about non-numeric data. When we looked into it, the collectl files had data from pipeline runs we had stopped earlier, stopping a pipeline mid-run was causing the next run to append data to existing files, which broke the statistical analysis. We now have issues open to fix this properly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kill pipeline: &lt;a target="_blank" href="https://invent.kde.org/sdk/kecolab/-/issues/64" class="external"&gt;#64&lt;svg class="external-icon" viewBox="0 0 512 512"&gt;&lt;path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Failsafe for pipeline failure: &lt;a target="_blank" href="https://invent.kde.org/sdk/kecolab/-/issues/18" class="external"&gt;#18&lt;svg class="external-icon" viewBox="0 0 512 512"&gt;&lt;path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cancel SUS script: &lt;a target="_blank" href="https://invent.kde.org/sdk/kecolab/-/issues/16" class="external"&gt;#16&lt;svg class="external-icon" viewBox="0 0 512 512"&gt;&lt;path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A cleanup stage has since been added to the pipeline to handle this — see &lt;a target="_blank" href="https://invent.kde.org/sdk/kecolab/-/merge_requests/152" class="external"&gt;!152&lt;svg class="external-icon" viewBox="0 0 512 512"&gt;&lt;path d="M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The reports also had wrong durations and missing averages. That turned out to be missing &lt;code&gt;stopActions&lt;/code&gt; in the &lt;code&gt;ydotool&lt;/code&gt; scripts. Once we fixed those, the numbers looked reasonable. Joseph is continuing to work on this and will follow up on the remaining open questions.&lt;/p&gt;
&lt;p&gt;There is also a broader question about the data itself. Our power draw results look very different from measurements taken at Umwelt Campus Birkenfeld back in 2022. Their data showed distinct power draw phases across tasks, while ours is mostly flat apart from the spike when Okular opens. It could be Wayland versus X11, Flatpak versus a repo package, or just Fedora versus Ubuntu. Probably a mix of all of them. Something to investigate.&lt;/p&gt;
&lt;h2 id="future-planning"&gt;Future Planning&lt;a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#future-planning" class="internal"&gt;&lt;svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We went through the open issues and talked about what comes next, integrating KEcoLab into a broader KDE Plasma testing workflow, planning for the Akademy BoF, and ideas around extending &lt;code&gt;ydotool&lt;/code&gt;/&lt;code&gt;kdotool&lt;/code&gt; to make measurement scripts more flexible. We did not get through everything but the direction is clearer now.&lt;/p&gt;
&lt;h2 id="outside-the-lab"&gt;Outside the Lab&lt;a role="anchor" aria-hidden tabindex="-1" data-no-popover href="#outside-the-lab" class="internal"&gt;&lt;svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"&gt;&lt;/path&gt;&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After the first day, Carl, Aakarsh, Joseph, and I headed to Tempelhofer Feld. It was a warm evening and the field was full of people cycling, skating, and just sitting around. We walked around for a while and talked about everything except KEcoLab, which was exactly what we needed. A big thank you to Carl and Joseph for showing us around, Berlin has a way of making you feel like you have all the time in the world, even when you have a pipeline to fix in the morning.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Not everything worked, but we came away knowing exactly what needs to be fixed and why. That is usually what a good sprint looks like.&lt;/p&gt;
&lt;img src="../../templehofer-1.jpg" alt="Tempelhofer Feld" width="800" style="display: block; margin: 0 auto;" loading="lazy"&gt;
&lt;p style="text-align: center;"&gt;&lt;em&gt;Tempelhofer Feld&lt;/em&gt;&lt;/p&gt;</description><author>Karanjot Singh</author></item></channel></rss>