<?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-15T07:00:00+00:00</lastBuildDate><atom:link href="https://planet.kde.org/index.xml" rel="self" type="application/rss+xml"/><item><title>The Akademy 2026 Program is now live!</title><link>https://akademy.kde.org/news/2026-07_akademy-2026-program-now-live/</link><pubDate>Wed, 15 Jul 2026 07:00:00 +0000</pubDate><guid isPermaLink="true">https://akademy.kde.org/news/2026-07_akademy-2026-program-now-live/</guid><description>&lt;p&gt;The &lt;a target="_blank" href="https://akademy.kde.org/2026/program/"&gt;&lt;strong&gt;Akademy 2026 Program&lt;/strong&gt;&lt;/a&gt; is now live!&lt;/p&gt;
&lt;p&gt;This year’s Akademy will take place in &lt;strong&gt;Graz&lt;/strong&gt;, hosted at the Graz University of Technology, both &lt;strong&gt;in person&lt;/strong&gt; and &lt;strong&gt;online&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Akademy starts with a &lt;strong&gt;welcome event on Friday, 18 September&lt;/strong&gt;, followed by two full days of talks on &lt;strong&gt;Saturday, 19&lt;/strong&gt; and &lt;strong&gt;Sunday, 20 September&lt;/strong&gt;, then four days of dedicated &lt;strong&gt;BoFs, workshops, meetings, and training&lt;/strong&gt; from &lt;strong&gt;Monday, 21,&lt;/strong&gt; through &lt;strong&gt;Thursday, 24 September&lt;/strong&gt;. Expect a community &lt;strong&gt;day trip&lt;/strong&gt; midweek.&lt;/p&gt;
&lt;p&gt;The schedule highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Talks covering &lt;strong&gt;What's coming up in Qt, KDE Linux at 2, Beauty in Code,&lt;/strong&gt; and many more.&lt;/li&gt;
&lt;li&gt;More in-depth sessions on &lt;strong&gt;An Agency, A Need of Sovereignty, and KDE's Will to Conquer the Enterprise, Goals wrap-up and reveal of new goals, Are we really doing to use the same Desktop UX forever?&lt;/strong&gt; and beyond.&lt;/li&gt;
&lt;li&gt;Community-driven workshops and BoFs cultivate collaboration and project momentum throughout the week.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This hybrid event model continues to grow, embracing both &lt;strong&gt;onsite attendance and remote participation&lt;/strong&gt;, allowing contributors from around the globe to connect and engage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Venue &amp;amp; Registration Details:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Venue:&lt;/strong&gt; Graz University of Technology&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;In-person + Online&lt;/strong&gt;: &lt;strong&gt;19–24 September&lt;/strong&gt; (with the welcome event on &lt;strong&gt;18 September&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Registration is open&lt;/strong&gt; and free!&lt;/li&gt;
&lt;li&gt;You can explore the &lt;strong&gt;full program&lt;/strong&gt; on &lt;a target="_blank" href="https://akademy.kde.org/2026/program/"&gt;Akademy’s website&lt;/a&gt;. Stay tuned for our keynote announcement!&lt;/li&gt;
&lt;/ul&gt;</description><author>Akademy</author></item><item><title>The Model Was Never the Hard Part: Integrating Qwen2.5 into digiKam for Natural Language Search</title><link>http://srirupa19.github.io/gsoc/2026/07/14/gsoc2.html</link><pubDate>Tue, 14 Jul 2026 20:33:36 +0000</pubDate><guid isPermaLink="true">http://srirupa19.github.io/gsoc/2026/07/14/gsoc2</guid><description>&lt;p&gt;&lt;em&gt;GSoC 2026 • digiKam • Post 2: Inference, Bugs, and the Build&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In my first post, I introduced the goal: type a plain-English search into digiKam and have a local LLM translate it into structured search criteria. That post built the whole pipeline - prompt builder, JSON parser, intent resolver, against a mock backend that returned canned responses, so everything could be tested before a real model was wired in. This post is about swapping that mock for real llama.cpp inference, and everything that broke along the way, which was almost never the model.&lt;/p&gt;
&lt;p&gt;At the end of my last post I promised that this one would be about the actual language model: which one, how fast, how accurate. I’ve been looking forward to writing it.&lt;/p&gt;
&lt;p&gt;Here’s the thing I did not expect. The model works. It has essentially always worked. Almost every hard problem I hit over the past few weeks lived &lt;em&gt;somewhere else&lt;/em&gt;: in a compiler flag, in a JSON type, in a git server’s opinions about submodules. This post is the honest version of what it takes to put a language model inside a desktop application, and the honest version is that the language model is the small part.&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img src="//srirupa19.github.io/assets/img_2.png" alt="Natural language search demo" width="100%" /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Actually running the thing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Last time the pipeline ran end-to-end against a mock backend: something that returned canned answers so I could build and test everything around it. Replacing that mock with a real model meant writing &lt;code class="language-plaintext highlighter-rouge"&gt;SearchLlamaBackend&lt;/code&gt;, which loads a quantized Qwen2.5 GGUF through llama.cpp and generates tokens.&lt;/p&gt;
&lt;p&gt;Two decisions shaped it.&lt;/p&gt;
&lt;p&gt;The first decision was that &lt;strong&gt;every single &lt;code class="language-plaintext highlighter-rouge"&gt;llama_*&lt;/code&gt; call happens on a worker thread&lt;/strong&gt;. Loading a 1 GB model takes a few seconds; generating tokens takes a few more. If any of that ran on the GUI thread, digiKam would freeze every time you searched. So the backend owns a &lt;code class="language-plaintext highlighter-rouge"&gt;QThread&lt;/code&gt;, the worker lives on it, and everything crosses the boundary through queued signals - the UI stays responsive while the model thinks.&lt;/p&gt;
&lt;p&gt;Here’s the shape of it (simplified from the real method, which has the error handling and tokenization removed for readability):&lt;/p&gt;
&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;SearchLlamaWorker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;slotDoInference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;QString&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;maxTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;&amp;#123;&lt;/span&gt;
&lt;span class="n"&gt;Q_UNUSED&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// greedy decoding, determinism over creativity&lt;/span&gt;
&lt;span class="n"&gt;llama_context&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;static_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;llama_context&lt;/span&gt;&lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m_context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;llama_vocab&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;vocab&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;llama_model_get_vocab&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Start each query from an empty context.&lt;/span&gt;
&lt;span class="n"&gt;llama_memory_clear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;llama_get_memory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Greedy sampler: always pick the single most likely next token.&lt;/span&gt;
&lt;span class="n"&gt;llama_sampler&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;smpl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;llama_sampler_chain_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;llama_sampler_chain_default_params&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;llama_sampler_chain_add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;smpl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;llama_sampler_init_greedy&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;QString&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;maxTokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;&amp;#123;&lt;/span&gt;
&lt;span class="n"&gt;llama_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;llama_token&lt;/span&gt; &lt;span class="n"&gt;tok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;llama_sampler_sample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;smpl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;llama_vocab_is_eog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vocab&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tok&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="cm"&gt;/* decoded token text */&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// Stop as soon as the JSON object closes (balanced braces).&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jsonObjectComplete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;llama_sampler_free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;smpl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Q_EMIT&lt;/span&gt; &lt;span class="n"&gt;signalOutputReady&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// back to the main thread, via a queued signal&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Two things in there are deliberate. &lt;code class="language-plaintext highlighter-rouge"&gt;llama_memory_clear&lt;/code&gt; at the top wipes the context’s KV cache so every query starts fresh - I’ll come back to why that one line matters more than it looks. And the sampler is &lt;strong&gt;greedy&lt;/strong&gt;: no temperature, no randomness, the model always takes its single most likely token. That’s the opposite of how you’d run an LLM writing prose, where a little randomness keeps it from sounding wooden. But I don’t want prose. I want the &lt;em&gt;same query to give the same JSON every time&lt;/em&gt; - so a bug is reproducible, and so the query cache from the last phase stores a real answer instead of one of several possible ones. For structured output, determinism isn’t a limitation; it’s the whole point.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Knowing when to shut up&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A small problem I enjoyed solving. The model is supposed to emit one JSON object and stop. Sometimes it does. Sometimes it emits the object, decides it’s on a roll, and keeps going, producing helpful commentary, a second example, and whatever else it feels like until it hits the token limit.&lt;/p&gt;
&lt;p&gt;Generating tokens you’re going to throw away is pure waste, and on a CPU each one costs real time. So the decode loop watches the output as it accumulates and counts brace depth. The moment the braces balance, meaning the first complete JSON object has closed, generation stops. In practice this cut a typical query from a hundred-plus tokens down to about twenty-two.&lt;/p&gt;
&lt;p&gt;It’s a heuristic, and I know its failure mode: a &lt;code class="language-plaintext highlighter-rouge"&gt;}&lt;/code&gt; inside a string value would fool it. My schema doesn’t have string values that contain braces, so it holds. If that ever changes, the honest fix is to attempt a real parse each iteration and stop when it succeeds. I’d rather ship the simple thing that works and know exactly where it breaks.&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img src="//srirupa19.github.io/assets/gif_2.gif" alt="Natural language search demo" width="100%" /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Three bugs, none of them the model’s&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Once real queries started flowing, things broke. Every single time, I assumed the small model was being dumb. Every single time, I was wrong.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A rating of 5 kept vanishing.&lt;/strong&gt; I’d ask for five-star photos, watch the model emit perfectly correct JSON with &lt;code class="language-plaintext highlighter-rouge"&gt;"value": 5&lt;/code&gt; in it, and watch the rating field come out empty. The parser was calling &lt;code class="language-plaintext highlighter-rouge"&gt;QJsonValue::toString()&lt;/code&gt;, which returns an &lt;em&gt;empty string&lt;/em&gt; when the value is a number rather than a string. Not an error. Not a warning. An empty string. The model had said &lt;code class="language-plaintext highlighter-rouge"&gt;5&lt;/code&gt;; my code heard silence.&lt;/p&gt;
&lt;p&gt;The fix was to stop assuming. Instead of blindly calling &lt;code class="language-plaintext highlighter-rouge"&gt;.toString()&lt;/code&gt;, the parser now checks the JSON value’s type first, string, number, or bool, and converts each properly (&lt;code class="language-plaintext highlighter-rouge"&gt;QString::number()&lt;/code&gt; for a number, and so on). One value arriving as &lt;code class="language-plaintext highlighter-rouge"&gt;5&lt;/code&gt; instead of &lt;code class="language-plaintext highlighter-rouge"&gt;"5"&lt;/code&gt; shouldn’t be able to silently erase a search constraint, and now it can’t.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dates never populated.&lt;/strong&gt; The model would emit a date. The date widget wanted a &lt;em&gt;range&lt;/em&gt;, in the form &lt;code class="language-plaintext highlighter-rouge"&gt;start..end&lt;/code&gt;. Nobody had told the model that. This wasn’t a bug in the model so much as a bug in the instructions I’d given it.&lt;/p&gt;
&lt;p&gt;The fix was in the prompt, not the code. I added an explicit instruction: dates must always be a range in the form &lt;code class="language-plaintext highlighter-rouge"&gt;2023-01-01..2023-12-31&lt;/code&gt;, a whole year expands to its first and last day, a whole month to its month boundaries. Plus one worked example. Small models learn far more from a single concrete example than from three sentences of rules, and once the example was there, the ambiguity was gone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And then: “last year” meant 2022.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This one is my favourite, because it’s structural rather than accidental. I typed “photos from last year,” expecting 2026. The model confidently produced 2022.&lt;/p&gt;
&lt;p&gt;It wasn’t guessing badly. &lt;strong&gt;It has no clock.&lt;/strong&gt; A language model’s sense of “now” is a fossil of whenever its training data was collected. It has no way to know what day it is, and this is the part that matters - no way to &lt;em&gt;know that it doesn’t know&lt;/em&gt;. So it answers with total confidence, and it’s wrong, and nothing in its output looks any different from when it’s right.&lt;/p&gt;
&lt;p&gt;The fix is embarrassingly simple: tell it the date. The prompt now includes today’s date and spells out the conversions explicitly: “last year” means such-and-such a range. It works.&lt;/p&gt;
&lt;p&gt;But I keep turning the general shape of this over. An LLM’s confidence is uncorrelated with whether it has the information needed to answer. Every layer of validation in this project exists because of that, and I built those layers before I had a concrete example of why they mattered. Now I have one.&lt;/p&gt;
&lt;p&gt;The practical lesson for digiKam is concrete: an LLM has no real-time awareness, and photo search is full of time-relative queries: “last year,” “last summer,” “two months ago.” Any of those is a landmine unless the prompt supplies the one thing the model can’t know on its own. So the current date now goes into every prompt, with the relative conversions spelled out. The model doesn’t need a clock; it needs to be told what time it is.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where the code lives, or: the submodule that couldn’t&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;llama.cpp had to get into digiKam’s tree somehow. The obvious answer, and the one my mentor and I agreed on, was a pinned git submodule: reference a specific tag, build it in-tree, keep it clearly separate from digiKam’s own code.&lt;/p&gt;
&lt;p&gt;I did that. I got it building. I pushed.&lt;/p&gt;
&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;remote: Audit failure - Invalid filename: .gitmodules
remote: Push declined - commits failed audit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;KDE’s git infrastructure does not permit submodules. The server rejects the push before it lands. My mentor’s response was immediate and pointed me at the right precedent: digiKam has vendored external code for years. libraw, libpgf, QtAVPlayer are all sitting in the tree as plain source. Copy llama.cpp in the same way, pin it to a tag, document where it came from.&lt;/p&gt;
&lt;p&gt;So I vendored it. And pushed. And:&lt;/p&gt;
&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;remote: Audit failure - Invalid filename:
core/utilities/searchwindow/thirdparty/llama.cpp/.gitmodules
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;llama.cpp has its own submodules. Of course it does.&lt;/p&gt;
&lt;p&gt;What followed was a trim. Out went the examples, the tools, the tests, the CI configuration, the Python conversion scripts, the web UI, the Swift bindings, the benchmark JSONs. What remained was &lt;code class="language-plaintext highlighter-rouge"&gt;src/&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;include/&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;ggml/&lt;/code&gt;, and the CMake files, the parts that actually build the library. Around 400 MB became 25 MB, the audit passed, and as a small bonus a CI job that had been failing (digiKam’s JSON validator choking on llama.cpp’s own tooling configs) started passing, because the files it was choking on no longer existed.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Git submodule&lt;/td&gt;
&lt;td&gt;Easy updates, clean separation&lt;/td&gt;
&lt;td&gt;Rejected outright by KDE’s git server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendoring&lt;/td&gt;
&lt;td&gt;Full control, self-contained&lt;/td&gt;
&lt;td&gt;Manual updates, larger repository&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For KDE’s infrastructure, vendoring wasn’t the better option so much as the only one that gets past the server. It’s worth being honest that it’s a workaround, not the ideal end state: the cleaner long-term answer is for llama.cpp to be available as a standard system package that digiKam can simply depend on, the way it does for most of its libraries. Until then, a trimmed, pinned, documented copy in the tree is the pragmatic choice.&lt;/p&gt;
&lt;p&gt;There’s a manifest file now too, &lt;code class="language-plaintext highlighter-rouge"&gt;llama_cpp_manifest.txt&lt;/code&gt;, in the same one-line format digiKam uses for every other bundled library. It records the exact commit that’s vendored. At packaging time it’s parsed into the Help → Components Info dialog, so when a user reports a bug we know precisely which llama.cpp is running underneath. It has to be updated by hand on every upgrade, which is noted, loudly, in the README.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Seventy-eight seconds&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The bug I’m most glad I chased.&lt;/p&gt;
&lt;p&gt;Once everything built, a single query took over a minute. The log was blunt about it:&lt;/p&gt;
&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;TIMING: generated 22 tokens in 78012 ms
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Twenty-two tokens. Seventy-eight seconds. Roughly three and a half seconds &lt;em&gt;per token&lt;/em&gt;, for a 1.5B model on a machine that should manage tens of tokens per second.&lt;/p&gt;
&lt;p&gt;I went looking for the pathology. Was it swapping? A gigabyte of model plus KV cache on a 15 GB machine, plausible but &lt;code class="language-plaintext highlighter-rouge"&gt;free&lt;/code&gt; showed plenty of headroom and barely any swap in use. Was it thread contention, too many threads fighting over eight cores? I checked &lt;code class="language-plaintext highlighter-rouge"&gt;top&lt;/code&gt; while a query ran, expecting to see the process idle, blocked on something.&lt;/p&gt;
&lt;p&gt;It was at 750% CPU. All eight cores, flat out, for seventy-eight seconds, to produce twenty-two tokens.&lt;/p&gt;
&lt;p&gt;That’s not a process that’s stuck. That’s a process working extremely hard and getting nowhere, which is a much more specific symptom, and it pointed at exactly one thing:&lt;/p&gt;
&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;CMAKE_BUILD_TYPE:STRING=Debug
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;I develop in Debug builds. Faster compiles, usable in a debugger, the sensible default. And llama.cpp, sitting in-tree, inherited that build type which meant ggml, the matrix-multiplication engine underneath everything, was compiled at &lt;code class="language-plaintext highlighter-rouge"&gt;-O0&lt;/code&gt;. No inlining, no vectorization. The SIMD instructions were available (&lt;code class="language-plaintext highlighter-rouge"&gt;-march=native&lt;/code&gt; was there); nothing was using them.&lt;/p&gt;
&lt;p&gt;Reconfiguring with &lt;code class="language-plaintext highlighter-rouge"&gt;-DCMAKE_BUILD_TYPE=Release&lt;/code&gt; flipped ggml to &lt;code class="language-plaintext highlighter-rouge"&gt;-O3&lt;/code&gt;, and the same query dropped from 78 seconds to about 8.7. A bit under nine times faster, from one flag. It’s still not fast, because a 1.5B model on a CPU never will be, but usable is the bar that matters.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Build type&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Tokens/sec&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Debug&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;78,012 ms&lt;/td&gt;
&lt;td&gt;~0.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Release&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;8,674 ms&lt;/td&gt;
&lt;td&gt;~2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;Same query, same machine, same model. The only difference is the compiler optimization level of the bundled llama.cpp.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The proper fix isn’t “always build Release,” because I want to keep debugging my own code. It’s a few lines of CMake that force optimization onto the bundled &lt;code class="language-plaintext highlighter-rouge"&gt;llama&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;ggml&lt;/code&gt; targets specifically, even in a Debug build, leaving the rest of digiKam alone:&lt;/p&gt;
&lt;div class="language-cmake highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nb"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;CMAKE_CXX_COMPILER_ID MATCHES &lt;span class="s2"&gt;"GNU|Clang"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;foreach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;_llama_target llama ggml ggml-base ggml-cpu&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;TARGET &lt;span class="si"&gt;$&amp;#123;&lt;/span&gt;&lt;span class="nv"&gt;_llama_target&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;target_compile_options&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="si"&gt;$&amp;#123;&lt;/span&gt;&lt;span class="nv"&gt;_llama_target&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; PRIVATE $&amp;lt;$&amp;lt;CONFIG:Debug&amp;gt;:-O2&amp;gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;endif&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;endforeach&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;endif&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;So my code stays debuggable, ggml stays fast, and the next person who builds digiKam in Debug doesn’t lose an evening the way I did.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The line I promised to come back to&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Once inference was fast, the feature worked. I typed a query, got the right photos, typed another, got those too. I was ready to call it done.&lt;/p&gt;
&lt;p&gt;Then I noticed that if I searched enough times, every search started failing. Not one bad query - &lt;em&gt;all&lt;/em&gt; of them, from some point onward. The first few worked perfectly; then a wall, and after it, every single query came back with “could not interpret the model output,” permanently, until I restarted digiKam.&lt;/p&gt;
&lt;p&gt;That “permanently until restart” is the tell. A bad query is one thing; a backend that works and then stops working forever is state gone wrong. Something was accumulating.&lt;/p&gt;
&lt;p&gt;It was the KV cache. A language model’s context has a cache of the tokens it has already seen, and llama.cpp appends to it as you decode. My inference code decoded each new query’s prompt straight onto the end of that cache without ever clearing it. So query one ran at positions 0 to 40. Query two ran at positions 40 to 80 - stacked on top of query one, which was still sitting there. Every search pushed the position higher, and once the total crossed the context limit (&lt;code class="language-plaintext highlighter-rouge"&gt;n_ctx&lt;/code&gt;, 4096 tokens), &lt;code class="language-plaintext highlighter-rouge"&gt;llama_decode&lt;/code&gt; started failing and never recovered, because the cache stayed full.&lt;/p&gt;
&lt;p&gt;The fix is the single line from the snippet earlier:&lt;/p&gt;
&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Start each query from an empty context.&lt;/span&gt;
&lt;span class="n"&gt;llama_memory_clear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;llama_get_memory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Clear the cache at the start of every inference, and each query is independent again.&lt;/p&gt;
&lt;p&gt;What gets me about this one is &lt;em&gt;why I didn’t catch it sooner&lt;/em&gt;. Every time I tested during development, I was restarting digiKam constantly - rebuilding, relaunching, running one query, rebuilding again. A fresh process has an empty cache, so the bug was invisible. It only appears when you do what an actual user does: open the app once and search several times in a row. My whole testing rhythm was hiding it.&lt;/p&gt;
&lt;p&gt;That’s the second bug in this project that only showed up under repeated real use - the first being a compiler flag that would only misbehave on someone else’s CPU. Both are arguments for the same thing: a test that runs two queries back to back, which is exactly the kind of automated inference test my mentor asked about in review. A single-query test would have passed. The bug lives in the second query.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What I actually learned&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I came into this project wanting to understand LLMs, and I have. But the thing I did not anticipate is how much of “put an LLM in an application” is not about the LLM.&lt;/p&gt;
&lt;p&gt;It’s about whether a bundled CMake target can live in an exported target’s link interface. (It can’t, and the workaround is &lt;code class="language-plaintext highlighter-rouge"&gt;$&amp;lt;TARGET_FILE:&amp;gt;&lt;/code&gt; plus an explicit &lt;code class="language-plaintext highlighter-rouge"&gt;add_dependencies&lt;/code&gt; to restore the build ordering.) It’s about a recursive header glob quietly sweeping llama.cpp’s headers into every unrelated compilation unit in the project, breaking files that have nothing to do with any of this. It’s about your distribution shipping OpenCV 4.6 when the project needs 4.8. It’s about a git server’s twenty-year-old policy on submodules.&lt;/p&gt;
&lt;p&gt;None of that is glamorous. All of it is the job. The model was the part I understood; everything wrapped around the model was the part I had to learn, and it’s the part I’m most glad to have learned, because it’s the part that makes a feature into something a project can actually ship and maintain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key takeaways&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The model is the small part.&lt;/strong&gt; The real work of putting an LLM in an application is integration: the build system, the packaging, the infrastructure. The inference was the piece I understood going in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Determinism is a feature.&lt;/strong&gt; For structured output that feeds a cache and has to be reproducible, greedy decoding beats anything with randomness in it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build flags decide whether a feature is usable.&lt;/strong&gt; The same code went from 78 seconds to 9 with one optimization level. Always profile in Release.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Infrastructure has opinions.&lt;/strong&gt; KDE’s git server rejects submodules outright, so vendoring wasn’t a preference, it was the only way in. Know your project’s constraints before you design around them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An LLM’s confidence says nothing about whether it’s right.&lt;/strong&gt; It called “last year” 2022 with total certainty. Every validation layer in this project exists because the model can be confidently wrong, and the output has to be checked against what the collection actually contains.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Where things stand&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Natural language search runs end-to-end against a real, local Qwen2.5 model. You type “photos from 2023 rated 5 stars,” the model turns it into structured constraints, digiKam’s own search engine finds the photos. “Red label photos rated at least 3 stars” works. Date ranges work. Relative dates work.&lt;/p&gt;
&lt;p&gt;The pipeline tests run against the mock backend and need no model, which keeps them CI-safe, and they now include regressions for both the numeric-value and the date-range bugs above. Neither of those would have been caught by a test of the model. Both were caught by a human typing a query and squinting at the result, which tells you something about where the bugs in this kind of system actually live.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What’s next&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Real-inference test:&lt;/strong&gt; an automated test that loads the actual model and runs a query, gated on the model being present so CI stays green when it isn’t. The KV cache bug above is exactly what this would catch, so it’s first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fix caching for relative dates:&lt;/strong&gt; the query cache currently stores relative-date queries, so a cached “last year” quietly goes wrong once the year changes. Those simply shouldn’t be cached.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ambiguity resolution:&lt;/strong&gt; “landscape” is both an orientation and a subject, and the model hedges. The robust fix is validating values against the collection’s actual tags and people, which the resolver already has hooks for.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompt hardening:&lt;/strong&gt; small models resist saying “I don’t know.” Prompt work has helped but not solved it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Benchmarking:&lt;/strong&gt; the comparison I promised, Qwen2.5 against TinyLlama on real digiKam queries.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks for reading. If you’re curious about the project or working on something similar, you can email me at: srirupa.sps@gmail.com if you wanna discuss! :)&lt;/p&gt;</description><author>Srirupa Datta</author></item><item><title>KDE Plasma 6.7.3, Bugfix Release for July</title><link>https://kde.org/announcements/plasma/6/6.7.3/</link><pubDate>Tue, 14 Jul 2026 00:00:00 +0000</pubDate><guid isPermaLink="true">https://kde.org/announcements/plasma/6/6.7.3/</guid><description>&lt;p&gt;Today KDE releases a bugfix update to KDE Plasma 6, versioned 6.7.3.&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 two weeks’ 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.2-6.7.3"&gt;View full changelog&lt;/a&gt;</description><author>KDE Community</author></item><item><title>Kommit-ing to a icon</title><link>https://nuno-icons.com/2026/07/13/kommit-ing-to-a-icon/</link><pubDate>Mon, 13 Jul 2026 21:28:13 +0000</pubDate><guid isPermaLink="true">https://nuno-icons.com/?p=263</guid><description>&lt;div pagelayer-id="y5d1060" class="p-y5d1060 pagelayer-post_props"&gt;
&lt;/div&gt;
&lt;div pagelayer-id="emi6892" class="p-emi6892 pagelayer-row pagelayer-row-stretch-auto pagelayer-height-default"&gt;
&lt;div class="pagelayer-row-holder pagelayer-row pagelayer-auto pagelayer-width-auto"&gt;
&lt;div pagelayer-id="k9w6885" class="p-k9w6885 pagelayer-col"&gt;
&lt;div class="pagelayer-col-holder"&gt;
&lt;p class="wp-block-paragraph"&gt;So… another missing icon gets some attention &lt;img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /&gt;&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;This time it was Kommit.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;The funny thing about Git related icons is that everybody eventually ends up drawing the same thing. A couple of connected nodes, some branches in a diamond shape....&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;I started pretty close to the existing Git visual language adjusted to Oxygen, but after a few iterations the icon slowly started drifting towards something that felt a bit more interesting. Softer shapes, more emphasis on the flow of the branches and less "K pasted into a square". (we love k)&lt;br&gt;&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;So here is the story of how a icon is set to life I could say a ton more things but.... heeee&lt;br&gt;&lt;/p&gt;
&lt;figure class="wp-block-image size-full"&gt;&lt;img fetchpriority="high" decoding="async" width="463" height="469" src="https://nuno-icons.com/wp-content/uploads/2026/07/image.png" alt="" class="wp-image-264" srcset="https://nuno-icons.com/wp-content/uploads/2026/07/image.png 463w, https://nuno-icons.com/wp-content/uploads/2026/07/image-296x300.png 296w" sizes="(max-width: 463px) 100vw, 463px" /&gt;&lt;/figure&gt;
&lt;figure class="wp-block-image size-full is-resized"&gt;&lt;img decoding="async" width="841" height="804" src="https://nuno-icons.com/wp-content/uploads/2026/07/image-1.png" alt="" class="wp-image-265" style="aspect-ratio:1.0460365023154454;width:464px;height:auto" srcset="https://nuno-icons.com/wp-content/uploads/2026/07/image-1.png 841w, https://nuno-icons.com/wp-content/uploads/2026/07/image-1-300x287.png 300w, https://nuno-icons.com/wp-content/uploads/2026/07/image-1-768x734.png 768w" sizes="(max-width: 841px) 100vw, 841px" /&gt;&lt;/figure&gt;
&lt;p class="wp-block-paragraph"&gt;This was not working for me at all need to pivot....&lt;/p&gt;
&lt;figure class="wp-block-image size-full is-resized"&gt;&lt;img decoding="async" width="798" height="797" src="https://nuno-icons.com/wp-content/uploads/2026/07/image-2.png" alt="" class="wp-image-266" style="width:468px;height:auto" srcset="https://nuno-icons.com/wp-content/uploads/2026/07/image-2.png 798w, https://nuno-icons.com/wp-content/uploads/2026/07/image-2-300x300.png 300w, https://nuno-icons.com/wp-content/uploads/2026/07/image-2-150x150.png 150w, https://nuno-icons.com/wp-content/uploads/2026/07/image-2-768x767.png 768w" sizes="(max-width: 798px) 100vw, 798px" /&gt;&lt;/figure&gt;
&lt;p class="wp-block-paragraph"&gt;ok there is somthing cool here lets explore more&lt;/p&gt;
&lt;figure class="wp-block-image size-full is-resized"&gt;&lt;img loading="lazy" decoding="async" width="878" height="867" src="https://nuno-icons.com/wp-content/uploads/2026/07/image-3.png" alt="" class="wp-image-267" style="aspect-ratio:1.0126963794597446;width:467px;height:auto" srcset="https://nuno-icons.com/wp-content/uploads/2026/07/image-3.png 878w, https://nuno-icons.com/wp-content/uploads/2026/07/image-3-300x296.png 300w, https://nuno-icons.com/wp-content/uploads/2026/07/image-3-768x758.png 768w" sizes="auto, (max-width: 878px) 100vw, 878px" /&gt;&lt;/figure&gt;
&lt;p class="wp-block-paragraph"&gt;shading lets do shading, (the old trick) oo and what if the line was a kinda of a flowing path?&lt;/p&gt;
&lt;figure class="wp-block-image size-full is-resized"&gt;&lt;img loading="lazy" decoding="async" width="969" height="967" src="https://nuno-icons.com/wp-content/uploads/2026/07/image-4.png" alt="" class="wp-image-268" style="aspect-ratio:1.0020690040820892;width:468px;height:auto" srcset="https://nuno-icons.com/wp-content/uploads/2026/07/image-4.png 969w, https://nuno-icons.com/wp-content/uploads/2026/07/image-4-300x300.png 300w, https://nuno-icons.com/wp-content/uploads/2026/07/image-4-150x150.png 150w, https://nuno-icons.com/wp-content/uploads/2026/07/image-4-768x766.png 768w" sizes="auto, (max-width: 969px) 100vw, 969px" /&gt;&lt;/figure&gt;
&lt;p class="wp-block-paragraph"&gt;wil never work as an icon, hummm.. need to make it more boxy!&lt;/p&gt;
&lt;figure class="wp-block-image size-full is-resized"&gt;&lt;img loading="lazy" decoding="async" width="779" height="775" src="https://nuno-icons.com/wp-content/uploads/2026/07/image-5.png" alt="" class="wp-image-269" style="width:467px;height:auto" srcset="https://nuno-icons.com/wp-content/uploads/2026/07/image-5.png 779w, https://nuno-icons.com/wp-content/uploads/2026/07/image-5-300x298.png 300w, https://nuno-icons.com/wp-content/uploads/2026/07/image-5-150x150.png 150w, https://nuno-icons.com/wp-content/uploads/2026/07/image-5-768x764.png 768w" sizes="auto, (max-width: 779px) 100vw, 779px" /&gt;&lt;/figure&gt;
&lt;p class="wp-block-paragraph"&gt;hummm maybe less red??? the previous line art was kinda cooler loking... ;(&lt;/p&gt;
&lt;figure class="wp-block-image size-large is-resized"&gt;&lt;img loading="lazy" decoding="async" width="1024" height="518" src="https://nuno-icons.com/wp-content/uploads/2026/07/image-6-1024x518.png" alt="" class="wp-image-270" style="width:469px;height:auto" srcset="https://nuno-icons.com/wp-content/uploads/2026/07/image-6-1024x518.png 1024w, https://nuno-icons.com/wp-content/uploads/2026/07/image-6-300x152.png 300w, https://nuno-icons.com/wp-content/uploads/2026/07/image-6-768x388.png 768w, https://nuno-icons.com/wp-content/uploads/2026/07/image-6.png 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /&gt;&lt;/figure&gt;
&lt;p class="wp-block-paragraph"&gt;yeah!!!.... but what if we make the lines more chubby?&lt;/p&gt;
&lt;figure class="wp-block-image size-full is-resized"&gt;&lt;img loading="lazy" decoding="async" width="897" height="907" src="https://nuno-icons.com/wp-content/uploads/2026/07/image-7.png" alt="" class="wp-image-271" style="aspect-ratio:0.9889806655751577;width:467px;height:auto" srcset="https://nuno-icons.com/wp-content/uploads/2026/07/image-7.png 897w, https://nuno-icons.com/wp-content/uploads/2026/07/image-7-297x300.png 297w, https://nuno-icons.com/wp-content/uploads/2026/07/image-7-768x777.png 768w" sizes="auto, (max-width: 897px) 100vw, 897px" /&gt;&lt;/figure&gt;
&lt;p class="wp-block-paragraph"&gt;ooooo yeah...."that is the way"&lt;/p&gt;
&lt;figure class="wp-block-image size-full"&gt;&lt;img loading="lazy" decoding="async" width="1024" height="1024" src="https://nuno-icons.com/wp-content/uploads/2026/07/kommit.png" alt="" class="wp-image-272" srcset="https://nuno-icons.com/wp-content/uploads/2026/07/kommit.png 1024w, https://nuno-icons.com/wp-content/uploads/2026/07/kommit-300x300.png 300w, https://nuno-icons.com/wp-content/uploads/2026/07/kommit-150x150.png 150w, https://nuno-icons.com/wp-content/uploads/2026/07/kommit-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /&gt;&lt;/figure&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p class="wp-block-paragraph"&gt;&lt;/p&gt;</description><author>Nuno Pinheiro</author></item><item><title>Week 7: Gradient Widget Review Fixes</title><link>https://yashbavadiya.bearblog.dev/week-7-gradient-widget-review-fixes/</link><pubDate>Mon, 13 Jul 2026 07:13:27 +0000</pubDate><guid isPermaLink="true">https://yashbavadiya.bearblog.dev/week-7-gradient-widget-review-fixes/</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-911-opened-and-reviewed&gt;MR !911 opened and reviewed&lt;/h2&gt;&lt;p&gt;Opened the Gradient widget MR this week, closing issue #1064 and referencing #2206. Jean-Baptiste reviewed it and flagged a few things.&lt;/p&gt;
&lt;h2 id=fixing-the-gradient-render-bug&gt;Fixing the gradient render bug&lt;/h2&gt;&lt;p&gt;The gradient bar was rendering as a flat, empty rectangle, only the stop handles below it showed color. Root cause: the native &lt;code&gt;QStyle::drawPrimitive(PE_Frame, ...)&lt;/code&gt; call added for frame styling was painting its interior background &lt;em&gt;after&lt;/em&gt; the gradient fill, covering it completely under Breeze's style. Fixed by reordering the paint sequence, frame first, then the checkerboard-for-alpha and gradient fill inside the frame's content rect, so nothing gets overpainted.&lt;/p&gt;
&lt;p&gt;Before:
&lt;img src="https://github.com/xevrion/gsoc-blog-images/blob/main/gsocimage%20%281%29.png?raw=true" alt="Gradient bar rendering as flat empty rectangle" /&gt;&lt;/p&gt;
&lt;p&gt;After:
&lt;img src="https://github.com/xevrion/gsoc-blog-images/blob/main/2026-07-13_12-05-45.png?raw=true" alt="Gradient bar showing correct multi-color gradient" /&gt;&lt;/p&gt;
&lt;h2 id=missing-32-stop-cap-at-the-model-layer&gt;Missing 32-stop cap at the model layer&lt;/h2&gt;&lt;p&gt;The widget already capped stops at 32, but &lt;code&gt;AssetParameterModel&lt;/code&gt;'s parsing path for &lt;code&gt;ParamType::GradientEditor&lt;/code&gt; had no equivalent check. A hand-edited or corrupted project file could bypass the widget entirely and load more than MLT's &lt;code&gt;gradientmap&lt;/code&gt; filter supports. Added truncation at the model level so both layers enforce the same limit independently.&lt;/p&gt;
&lt;h2 id=handle-visibility-fix&gt;Handle visibility fix&lt;/h2&gt;&lt;p&gt;The first stop's handle (black) was nearly invisible against Kdenlive's dark theme. Added a stroke around each unselected handle using the palette's text color at 50% opacity, so dark-colored stops stay visible regardless of theme.&lt;/p&gt;
&lt;h2 id=rgba-tooltip-on-hover&gt;RGBA tooltip on hover&lt;/h2&gt;&lt;p&gt;Added a small tooltip showing a stop's exact RGBA value on hover, requested during review.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://github.com/xevrion/gsoc-blog-images/blob/main/2026-07-13_12-24-24.png?raw=true" alt="Gradient widget showing RGBA tooltip on hover" /&gt;&lt;/p&gt;
&lt;h2 id=midterm-evaluation&gt;Midterm evaluation&lt;/h2&gt;&lt;p&gt;Submitted July 10.&lt;/p&gt;
&lt;h2 id=whats-next&gt;What's next&lt;/h2&gt;&lt;p&gt;MR !911 is rebased on current master and pushed with all review fixes; waiting on another look from Jean-Baptiste.&lt;/p&gt;</description><author>Yash Bavadiya</author></item><item><title>openQA Testing in KDE Linux</title><link>https://blogs.kde.org/2026/07/13/openqa-testing-in-kde-linux/</link><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><guid isPermaLink="true">https://blogs.kde.org/2026/07/13/openqa-testing-in-kde-linux/</guid><description>&lt;p&gt;The openQA-based testing system has recently been integrated into KDE Linux
(hooray!), and I thought it was about time I did a little write-up.&lt;/p&gt;
&lt;p&gt;The nature of KDE Linux, in which the whole system ships as a single signed
image rather than a pile of packages, is (in theory) wonderful for reliability.
However, this raises an uncomfortable question: how do we make sure that image
actually &lt;em&gt;works&lt;/em&gt; before we ship it to people? OpenQA is the answer!&lt;/p&gt;
&lt;p&gt;TL;DR: we boot each build in a virtual machine, run tests that interact with it
to ensure the system installs and upgrades properly and that desktop
functionality works. Once the tests pass, the user gets an end-to-end
tested image. This replaces the rather rudimentary basic-test machinery, which
simply booted up the live image and checked if the boot was blessed and if any
units failed.&lt;/p&gt;
&lt;h2 id="the-test-flow"&gt;The test flow&lt;/h2&gt;
&lt;p&gt;A single build goes through three stages.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;install-system&lt;/code&gt; takes the live ISO, boots it in a VM, and runs a real
installation onto an empty virtual disk, just like a real user would.
&lt;code&gt;sanity-test&lt;/code&gt; then boots that freshly installed disk and verifies the system
actually comes up and behaves. In between, while we're testing the upgrade path
in parallel, an &lt;code&gt;upgrade-system&lt;/code&gt; stage installs the previous release and upgrades
it to the current build to check whether the previous release can actually be
upgraded to the new build. Each stage hands its disk to the next.&lt;/p&gt;
&lt;p&gt;They're wired together as a dependency chain, so in the openQA web interface
the whole run shows up as a single connected graph. If installation fails, the
later stages don't bother running, as there's nothing to test.&lt;/p&gt;
&lt;p&gt;Our CI pipelines now approximately look like this:&lt;/p&gt;
&lt;img src="ci-flowchart.png" alt="CI flowchart. Imaging failures upload to CI artifacts, while successful images run parallel openQA test and upgrade jobs before gated publishing." width="100%"&gt;
&lt;h2 id="interesting-architectural-tidbits"&gt;Interesting architectural tidbits&lt;/h2&gt;
&lt;p&gt;We do a few things differently compared to your stock-standard openSUSE or
Fedora openQA instances.&lt;/p&gt;
&lt;h3 id="selenium-testing-instead-of-needle-testing"&gt;Selenium testing instead of needle testing&lt;/h3&gt;
&lt;p&gt;Normal openQA tests operate through &amp;quot;needles&amp;quot;. These aren't sewing needles;
rather, they're screenshots of the virtual machine in some desired state with
some JSON metadata attached. This metadata defines certain areas to match or
ignore, and the test code can click matched areas. While needles are certainly
effective at interacting with the system exactly how a user would, they have
drawbacks. It's quite annoying to make and constantly update needles, as well
as keep them from breaking every time there are slight changes in user
interfaces.&lt;/p&gt;
&lt;p&gt;Luckily for us, we already have a battle-tested way of interacting with user
interfaces for testing:
&lt;a target="_blank" href="https://invent.kde.org/sdk/selenium-webdriver-at-spi"&gt;selenium-webdriver-at-spi&lt;/a&gt;
. It's already widely used across unit tests in KDE projects, hence our
decision to use it affords us a lot more flexibility, maintainability, and
consistency. It also enables app developers to run their own tests on KDE Linux
with openQA down the track.&lt;/p&gt;
&lt;p&gt;Essentially, we have a Python &lt;code&gt;unittest&lt;/code&gt; script on the system that we're testing
(see the sysext section below for details), which attaches itself to an
application. It then interacts with the app by leveraging the AT-SPI2
accessibility API to send clicks and read the screen, in a similar vein to
screen-reading software such as Orca.&lt;/p&gt;
&lt;h3 id="ephemeral-workers-in-ci-jobs"&gt;Ephemeral workers in CI jobs&lt;/h3&gt;
&lt;p&gt;openQA instances usually have long-running workers that are hosted on servers.
It's a bit of a painful ordeal to get all that infrastructure up and running.
On top of that, hosted workers need to do an upload-download rigmarole
involving large assets from the server, such as the &lt;code&gt;.iso&lt;/code&gt; files and the
generated hard disk. This makes things &lt;em&gt;very slow&lt;/em&gt; for no good reason.&lt;/p&gt;
&lt;p&gt;We already have CI runners that work perfectly well for this and can be spun up
when needed, giving us effortlessly simple scaling. So, we spin up an openQA
worker container in a CI runner, which submits jobs to the openQA server. It
has its own UUID, which is shared with the job, so the worker running in CI is
always assigned the right job.&lt;/p&gt;
&lt;p&gt;This saves us from the bandwidth rigmarole because all the assets are generated
and consumed within the one container, so we can simply keep all the assets on
the worker and never upload them to the server. As a result, we save a lot of
storage space on the openQA server, so we can run it with fairly minimal
hosting requirements.&lt;/p&gt;
&lt;h3 id="the-use-of-systemd-system-extensions-to-inject-tests"&gt;The use of systemd system extensions to inject tests&lt;/h3&gt;
&lt;p&gt;How do we actually get our Selenium tests on the system, you may ask? Enter the
humble
&lt;a target="_blank" href="https://www.freedesktop.org/software/systemd/man/latest/systemd-sysext.html"&gt;system extension&lt;/a&gt;
, or sysext, for short.&lt;/p&gt;
&lt;p&gt;We include a few things in our sysext:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Python &lt;code&gt;unittests&lt;/code&gt; themselves.&lt;/li&gt;
&lt;li&gt;A bootstrap script with some system configuration, so we have an appropriate
environment set up for testing.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;venv&lt;/code&gt;, so we can make use of the Python ecosystem. This is created in the
bootstrap script.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of this is packaged up into an EROFS &lt;code&gt;.img&lt;/code&gt; file, which we mount to the
worker's VM. This is then automounted by an associated &lt;code&gt;udev&lt;/code&gt; rule in upstream
KDE Linux, with the bootstrapping script being triggered by an associated
service shortly afterward.&lt;/p&gt;
&lt;p&gt;Since we have the capability to inject tests and configuration into the system,
we're able to test things that would otherwise be impossible to test with
needles. For example, we test if essential desktop processes have ever crashed,
if any systemd services failed, if networking works, and if commands we ship
with KDE Linux work properly. All of these tests leverage direct access to the
innards of the system.&lt;/p&gt;
&lt;h3 id="interaction-with-the-system-through-ssh"&gt;Interaction with the system through SSH&lt;/h3&gt;
&lt;p&gt;To actually poke at the system and have the worker run these tests
sequentially, we need some way of interacting with the system. openQA provides
some facilities to interact with a serial terminal, but this proved to be very
fragile and unreliable, with buffering issues everywhere.&lt;/p&gt;
&lt;p&gt;Instead, we set up SSH with our sysext and use the facilities provided by the
Python library &lt;a target="_blank" href="https://www.fabfile.org/"&gt;Fabric&lt;/a&gt; to run all our tests in a
robust manner.&lt;/p&gt;
&lt;p&gt;Each test runs in a transient systemd service created by &lt;code&gt;systemd-run&lt;/code&gt;. This
runs the test as the intended user, groups its processes in a cgroup, gives it
an isolated journal stream for output, and returns its service exit status
synchronously. The harness can then collect the unit's journal even when the
test fails, and we keep everything neat and tidy.&lt;/p&gt;
&lt;h3 id="staging-images-before-we-publish-and-how-we-test-updates"&gt;Staging images before we publish, and how we test updates&lt;/h3&gt;
&lt;p&gt;To prevent users from downloading an image that still needs to be tested, we
create a staging directory on storage.kde.org, scoped to the imaging stage's
job ID, that stores the built artifacts in a directory tree. It has a layout
that mirrors the public-facing tree, so we can simply merge it in once tests
pass.&lt;/p&gt;
&lt;p&gt;However, this throws a spanner in the works when we try to test system upgrades
because we obviously can't upgrade to an image that hasn't been published yet!&lt;/p&gt;
&lt;p&gt;To fix this, the solution is simple. In the sysext, we simply point
&lt;code&gt;systemd-sysupdate&lt;/code&gt; to the staging directory we've already created. This has
some drawbacks, though. For the moment, we can't test delta updates through
&lt;code&gt;kde-linux-sysupdated&lt;/code&gt;. That shouldn't be too difficult to fix in the near
future, but we're waiting on KDE Linux to be entirely hosted on storage.kde.org
before we jump on that. The bigger issue here is that we really don't have a
good way of testing updates from the chunk store. A better story for this still
needs to be worked out, but for the time being the upgrade test is good enough.&lt;/p&gt;
&lt;h2 id="whats-to-come"&gt;What's to come&lt;/h2&gt;
&lt;p&gt;We have a few things we're aiming towards:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;As mentioned above, testing delta/chunked upgrades.&lt;/li&gt;
&lt;li&gt;Leveraging openQA to allow app developers to test their own apps atop KDE
Linux.&lt;/li&gt;
&lt;li&gt;Generalizing all our openQA glue so other projects can use the architecture
we've built.&lt;/li&gt;
&lt;li&gt;By extension, porting the aforementioned glue from admittedly fragile bash
scripts to Python or some other more appropriate language.&lt;/li&gt;
&lt;li&gt;Testing installs using manual partitioning and Full Disk Encryption.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;…and probably many more things that we haven't thought of yet. Exciting times!&lt;/p&gt;</description><author>Thomas Duckworth</author></item><item><title>The graveyard of being paid to use Windows 11, AKA “winning!”</title><link>https://pointieststick.com/2026/07/12/the-graveyard-of-being-paid-to-use-windows-11-aka-winning/</link><pubDate>Sun, 12 Jul 2026 13:47:00 +0000</pubDate><guid isPermaLink="true">http://pointieststick.com/?p=29733</guid><description>&lt;p class="wp-block-paragraph"&gt;I just finished reading Thom Holwerda&amp;#8217;s &lt;a target="_blank" href="https://www.osnews.com/story/145459/you-paid-me-a-long-time-linux-user-to-use-windows-11-exclusively-for-a-month-heres-how-it-went/"&gt;hilarious article on OSnews about being paid to use Windows 11 for a month&lt;/a&gt; from the perspective of being a &amp;#8220;switcher&amp;#8221; moving away from Linux. It&amp;#8217;s a great read; I encourage everyone to stop right now and &lt;a target="_blank" href="https://www.osnews.com/story/145459/you-paid-me-a-long-time-linux-user-to-use-windows-11-exclusively-for-a-month-heres-how-it-went/"&gt;go read it&lt;/a&gt;!&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;In a nutshell, it&amp;#8217;s truly amazing how bad the modern Windows user experience is when you&amp;#8217;re accustomed to anything else:&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
&lt;li&gt;Missing drivers&lt;/li&gt;
&lt;li&gt;Black screens&lt;/li&gt;
&lt;li&gt;Broken sleep/wake&lt;/li&gt;
&lt;li&gt;Ads and intrusive AI in apps&lt;/li&gt;
&lt;li&gt;No visual consistency&lt;/li&gt;
&lt;li&gt;An update experience that&amp;#8217;s fragmented, slow, and frustrating &lt;/li&gt;
&lt;/ul&gt;
&lt;p class="wp-block-paragraph"&gt;My extended family includes a lot of Mac users, and I can tell you it&amp;#8217;s barely better there. They suffer from:&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
&lt;li&gt;Limited hardware selection&lt;/li&gt;
&lt;li&gt;Devices that deliberately skimp on storage space to push people towards paid cloud storage subscriptions from Apple&lt;/li&gt;
&lt;li&gt;Ugly and low-contrast UIs&lt;/li&gt;
&lt;li&gt;Terrible window management&lt;/li&gt;
&lt;li&gt;Slow and unresponsive apps&lt;/li&gt;
&lt;li&gt;Poor integration with 3rd-party services&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class="wp-block-heading"&gt;We&amp;#8217;re ready&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;I&amp;#8217;ve been saying for years that Linux is ready for normal usage. We often lament our bugs and failures, but under-estimate just how bad the competition is.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;The reason why Windows and MacOS are so prominent is not because they&amp;#8217;re better, but rather because of their inertia and wide distribution on retail hardware. If people can&amp;#8217;t buy Linux computers in Best Buy and Mediamarkt, we&amp;#8217;ll never get there.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Inertia takes care of itself over time with success. But we can do something about distribution: we can continue to make our software &lt;em&gt;&lt;strong&gt;pre-installation ready&lt;/strong&gt;&lt;/em&gt;. I&amp;#8217;ve been talking about this since &lt;a target="_blank" href="https://pointieststick.com/2018/09/07/konquering-the-world/"&gt;my first Akademy talk in 2018&lt;/a&gt;, and KDE has made amazing progress in just 8 years.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;It&amp;#8217;s clearly working, too.&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;Successes&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;This is why I get so excited about &lt;a target="_blank" href="https://pointieststick.com/2026/06/30/the-steam-machine-is-here/"&gt;Valve&amp;#8217;s new Steam Machine console/PC running KDE Plasma&lt;/a&gt;. Five years ago, I &lt;a target="_blank" href="https://pointieststick.com/2021/07/16/this-week-in-kde-kde-powered-steamdeck-revealed/"&gt;got excited about the Steam Deck&lt;/a&gt;. And I&amp;#8217;m excited about &lt;a target="_blank" href="https://www.tuxedocomputers.com"&gt;Tuxedo Computers&lt;/a&gt; and &lt;a target="_blank" href="https://kfocus.org"&gt;Kubuntu Focus&lt;/a&gt; for shipping KDE Plasma on all of their computers out of the box. For an up-to-date list, see &lt;a target="_blank" href="https://kde.org/hardware"&gt;https://kde.org/hardware&lt;/a&gt;.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;I hope that in due time, I&amp;#8217;ll be excited about &lt;a target="_blank" href="https://frame.work/"&gt;Framework Computer&lt;/a&gt; and &lt;a target="_blank" href="https://slimbook.com"&gt;Slimbook&lt;/a&gt; shipping a Plasma-based OS out of the box, too. &lt;strong&gt;&lt;img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f60e.png" alt="😎" class="wp-smiley" style="height: 1em; max-height: 1em;" /&gt;&lt;/strong&gt; And someday after that, Razer. I think they&amp;#8217;d be receptive. And then Lenovo, HP, Dell, and Asus. I don&amp;#8217;t believe this is far-fetched.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;When people buy one of these devices, are they going to experience some Linux-specific bugs and annoyances? Yes, it&amp;#8217;s inevitable. Nothing is perfect. But what we offer is good. Better, even. Better for users and better for hardware vendors.&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;What&amp;#8217;s left&lt;/h2&gt;
&lt;p class="wp-block-paragraph"&gt;Is there more to do? Yes. We need a stronger 3rd-party software ecosystem, including Linux versions of more popular pro apps. A bit more Wayland work to close the remaining gaps. Operating systems that are safe and full-featured out of the box. Better documentation. More companies capable of offering professional support. And so on.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;But all of this is happening! Isn&amp;#8217;t that amazing? I find it amazing. Here we all are, offering the world a better option as some of the world&amp;#8217;s largest companies are in stage 2 or 3 of the &lt;a target="_blank" href="https://en.wikipedia.org/wiki/Enshittification"&gt;enshittification&lt;/a&gt; process. And we can help. It&amp;#8217;s so cool.&lt;/p&gt;</description><author>Nate Graham</author></item><item><title>I (heart) details.</title><link>https://nuno-icons.com/2026/07/11/i-heart-details/</link><pubDate>Sat, 11 Jul 2026 14:24:06 +0000</pubDate><guid isPermaLink="true">https://nuno-icons.com/?p=248</guid><description>&lt;div pagelayer-id="l9j7377" class="p-l9j7377 pagelayer-post_props"&gt;
&lt;/div&gt;
&lt;div pagelayer-id="a2t3234" class="p-a2t3234 pagelayer-row pagelayer-row-stretch-auto pagelayer-height-default"&gt;
&lt;div class="pagelayer-row-holder pagelayer-row pagelayer-auto pagelayer-width-auto"&gt;
&lt;div pagelayer-id="ujo8825" class="p-ujo8825 pagelayer-col"&gt;
&lt;div class="pagelayer-col-holder"&gt;
&lt;p class="wp-block-paragraph"&gt;Take this new Kamoso icon for example.&lt;/p&gt;
&lt;figure class="wp-block-image size-full"&gt;&lt;img loading="lazy" decoding="async" width="850" height="300" src="https://nuno-icons.com/wp-content/uploads/2026/07/kamosocomp.png" alt="" class="wp-image-249" srcset="https://nuno-icons.com/wp-content/uploads/2026/07/kamosocomp.png 850w, https://nuno-icons.com/wp-content/uploads/2026/07/kamosocomp-300x106.png 300w, https://nuno-icons.com/wp-content/uploads/2026/07/kamosocomp-768x271.png 768w" sizes="auto, (max-width: 850px) 100vw, 850px" /&gt;&lt;/figure&gt;
&lt;p class="wp-block-paragraph"&gt;Most people will see a "webcam" with a overly large lense. Some people might notice the reflections. Almost nobody will notice the tiny details inside the lens itself, the subtle changes in materials, the little bits of visual noise that stop things from feeling too artificial, or the writing around the lense repeating KAMOSOLENS 2026. And yet....&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Which naturally raises the question… why bother?&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Its not like users are going to zoom into a 256 pixel icon and start inspecting reflections like art critics examining a renaissance painting, (I realy wish you dont &lt;img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /&gt; ). Most of these details exist below the threshold of conscious perception. People don't really see them. At least not directly.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;And yet I still think they matter.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;The older I get the more I like to think details are a expression of love, of care. The kind of care that makes people do things that make absolutely no rational sense.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;I grew up in Portugal and over here mothers have a particular way of saying "I love you". They don't usually say it. Instead they spend two days preparing enough food to feed a small village and then look personally offended when you stop eating after the third serving. The food is the message. The effort is the message. The ridiculous amount of work nobody asked for is the message.&lt;br&gt;&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;&lt;br&gt;So inevetably I think design works in much the same way.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;When somebody spends hours polishing an animation that users will only experience for half a second, when somebody redraws an icon because one highlight feels wrong, when somebody obsesses over spacing differences measured in single pixels, they are saying "I care".&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;&lt;br&gt;Now make no mistake, as a user I often feel exactly the same level of care in very minimalistic interfaces. Simplicity and care are not opposites. Some of the most thoughtful designs I know are also some of the simplest.&lt;br&gt;&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;&lt;br&gt;But sometimes overly minimal, dare I say bland, interfaces communicate something else .... disinterest. The feeling that only the minimum amount of work was invested so a feature could exist.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;I think users only get to see the final thing, and as a user I find it difficult to care more about something than I believe its creators cared about it.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Thats why details matter to me. Not because people consciously notice every reflection, shadow or hidden joke buried inside an icon, but because details are little traces left behind by the people who made it.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;Evidence that somebody cared enough to spend time on things they didnt strictly need to spend time on. And I think people notice that (or I hope they do).&lt;br&gt;&lt;br&gt;&lt;br&gt;As Plans for Oxygen in Plasma 6.8.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;The biggest one is probably the work being done to make Oxygen play much nicer with Kirigami applications. Hopefully the Union effort will enable us to finally start to port things over and tackle some of the rough edges.There is also the usual stream of icons, fixes and random details that somehow consume far more time than they have any right to :)I'm also hopeful we can make some progress on icon selection options. No promises yet... but its definitely on the list of things I would like to see happen. at lest the UI.&lt;/p&gt;
&lt;p class="wp-block-paragraph"&gt;So stay tuned, Oxygen continues to slowly move forward. Which is honestly more than i expected when i started by "just fixing a bug"... heee...&lt;/p&gt;
&lt;div class="wp-block-comments"&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p class="wp-block-paragraph"&gt;&lt;/p&gt;</description><author>Nuno Pinheiro</author></item><item><title>This Week in Plasma: Audio Recording in Spectacle</title><link>https://blogs.kde.org/2026/07/11/this-week-in-plasma-audio-recording-in-spectacle/</link><pubDate>Sat, 11 Jul 2026 00:00:01 +0000</pubDate><guid isPermaLink="true">https://blogs.kde.org/2026/07/11/this-week-in-plasma-audio-recording-in-spectacle/</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 was busy! We’ve got some great new features to share, improved theming compatibility, UI improvements, bug fixes… and lots more! This is one of those weeks with a bit of something for everyone ­— even people who are picky about software dependencies. Take a look:&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;Spectacle now gives you the option to record audio during screen recordings! It can grab audio from the microphone, audio that the system is outputting, or both. (Khudoberdi Abdujalilov, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=474798"&gt;KDE Bugzilla #474798&lt;/a&gt;)&lt;/p&gt;
&lt;figure&gt;
&lt;img class="img-fluid" alt="Audio recording options in Spectacle" src="https://blogs.kde.org/2026/07/11/this-week-in-plasma-audio-recording-in-spectacle/audio-recording-in-spectacle.webp"
style="max-width: 100%; height: auto"
/&gt;
&lt;/figure&gt;
&lt;p&gt;System Monitor can now measure VRAM usage as a percentage of the total, just like it can for regular RAM. (Beck Thompson, &lt;a target="_blank" href="https://invent.kde.org/plasma/ksystemstats/-/merge_requests/135"&gt;ksystemstats MR #135&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The 13-month Ethiopian calendar joins the growing ranks of supported alternate calendars! (Eyobed Awel, &lt;a target="_blank" href="https://invent.kde.org/plasma/kdeplasma-addons/-/merge_requests/1079"&gt;kdeplasma-addons MR #1079&lt;/a&gt;)&lt;/p&gt;
&lt;figure&gt;
&lt;img class="img-fluid" alt="Ethiopian alternate calendar" src="https://blogs.kde.org/2026/07/11/this-week-in-plasma-audio-recording-in-spectacle/ethiopian-calendar.webp"
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-666"&gt;Plasma 6.6.6&lt;/h3&gt;
&lt;p&gt;Improved the responsiveness of the brightness slider in the Brightness &amp;amp; Color widget. (Marco Martin, &lt;a target="_blank" href="https://invent.kde.org/plasma/powerdevil/-/merge_requests/650"&gt;powerdevil MR #650&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="plasma-673"&gt;Plasma 6.7.3&lt;/h3&gt;
&lt;p&gt;The Vietnamese lunar calendar now displays its text in Vietnamese even if your system language is set to something else, which is more consistent with other alternate calendars. (Trần Nam Tuấn, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521787"&gt;KDE Bugzilla #521787&lt;/a&gt;)&lt;/p&gt;
&lt;figure&gt;
&lt;img class="img-fluid" alt="Vietnamese alternate calendar with text written in Vietnamese" src="https://blogs.kde.org/2026/07/11/this-week-in-plasma-audio-recording-in-spectacle/vietnamese-calendar-in-vietnamese.webp"
style="max-width: 100%; height: auto"
/&gt;
&lt;/figure&gt;
&lt;p&gt;The feature to show alternative characters when you press and hold a key on the keyboard now triggers after 600 milliseconds of holding, rather than 200. This should make it much harder to accidentally activate. (Kristen McWilliam, &lt;a target="_blank" href="https://invent.kde.org/plasma/plasma-keyboard/-/merge_requests/157"&gt;plasma-keyboard MR #157&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;You can now interact with the Overview and Custom Tiling overlays using a drawing tablet stylus in a Wayland session. (Nicolas Fella, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=468396"&gt;KDE Bugzilla #468396&lt;/a&gt; and &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=522677"&gt;KDE Bugzilla #522677&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="plasma-68-1"&gt;Plasma 6.8&lt;/h3&gt;
&lt;p&gt;Comboboxes in Plasma now use the active Plasma theme to style their popups, rather than using a hardcoded Breeze-style appearance. And their menu highlights no longer animate in and out, either, which matches the appearance everywhere else. (Filip Fila, &lt;a target="_blank" href="https://invent.kde.org/plasma/libplasma/-/merge_requests/1547"&gt;libplasma MR #1547&lt;/a&gt; and &lt;a target="_blank" href="https://invent.kde.org/plasma/libplasma/-/merge_requests/1550"&gt;libplasma MR #1550&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;System Settings’ Remote Desktop page no longer looks somewhere between “very awkward” and “broken” with a small and narrow window size, like on a phone. (Nick Haghiri, &lt;a target="_blank" href="https://invent.kde.org/plasma/krdp/-/merge_requests/208"&gt;krdp MR #208&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;System Settings’ “Report a Bug in the Current Page” feature now works for pages that didn’t come from KDE but still list a bug reporting URL. (Antti Savolainen, &lt;a target="_blank" href="https://invent.kde.org/plasma/systemsettings/-/merge_requests/412"&gt;systemsettings MR #412&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Auto-login now works in Plasma Login Manager on operating systems with older versions of systemd, like KDE neon. (David Edmundson, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=522006"&gt;KDE Bugzilla #522006&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Brightness on external monitors now changes more quickly after you adjust the brightness slider in the Brightness &amp;amp; Color widget. (Kylie CT, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=498913"&gt;KDE Bugzilla #498913&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="frameworks-629"&gt;Frameworks 6.29&lt;/h3&gt;
&lt;p&gt;When using the default &lt;code&gt;qqc2-desktop-style&lt;/code&gt; system (as opposed to when testing the upcoming Union system), list and grid view highlights in QML-based KDE software now respect the visual styling of the active app style, rather than having a hardcoded Breeze-style appearance. In addition, password fields no longer change in height for certain fonts when you type the first character into them. (Evgeniy Harchenko, &lt;a target="_blank" href="https://invent.kde.org/frameworks/qqc2-desktop-style/-/merge_requests/521"&gt;qqc2-desktop-style MR #521&lt;/a&gt; and &lt;a target="_blank" href="https://invent.kde.org/frameworks/qqc2-desktop-style/-/merge_requests/524"&gt;qqc2-desktop-style MR #524&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The Breeze icon theme now includes an icon for Android app bundle files. (Tobias Zwick, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=508430"&gt;KDE Bugzilla #508430&lt;/a&gt;)&lt;/p&gt;
&lt;figure&gt;
&lt;img class="img-fluid" alt="Montage of Android app bundle icons against light and dark backgrounds" src="https://blogs.kde.org/2026/07/11/this-week-in-plasma-audio-recording-in-spectacle/android-app-bundle-icons.png"
style="max-width: 100%; height: auto"
/&gt;
&lt;/figure&gt;
&lt;p&gt;The large fancy Kirigami tab bars seen in QML-based KDE software now switch the active tab when you scroll over them or press one of the standard tab-switching keyboard shortcuts — just like tab bars in QtWidgets-based apps do. (Tobias Ozór, &lt;a target="_blank" href="https://invent.kde.org/frameworks/kirigami/-/merge_requests/2123"&gt;kirigami MR #2123&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-1"&gt;Plasma 6.6.6&lt;/h3&gt;
&lt;p&gt;The Choose Application window no longer percent-encodes some characters in filenames, which looked pretty ugly. (David Redondo, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521748"&gt;KDE Bugzilla #521748&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The Media Frame widget no longer displays every other image in a somewhat sharpened and crunchy manner. (Marco Martin, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521534"&gt;KDE Bugzilla #521534&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="plasma-673-1"&gt;Plasma 6.7.3&lt;/h3&gt;
&lt;p&gt;Fixed a recent regression that broke closing windows in the Overview overlay by middle-clicking them. (Xaver Hugl, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=522015"&gt;KDE Bugzilla #522015&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Fixed a few remaining minor layout regressions in the Color Picker widget, so now it should always have the same size as it did in Plasma 6.6. (Tobias Fella, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=522377"&gt;KDE Bugzilla #522377&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Fixed a recent regression in an X11 session that made icons of all running Flatpak apps appear unnecessarily in the System Tray. (David Redondo, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=522864"&gt;KDE Bugzilla #522864&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Plasma no longer crashes if you disable the Calendar Events plugin in one Digital Clock widget when there are more than one of them with that plugin enabled. (Shouvik Kar, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=520465"&gt;KDE Bugzilla #520465&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;When the system is configured to automatically switch global themes at certain times of day, this switchover now takes place as expected even if the computer happened to be turned off when the transition would have taken place. (Vlad Zahorodnii, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=511740"&gt;KDE Bugzilla #511740&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="plasma-68-2"&gt;Plasma 6.8&lt;/h3&gt;
&lt;p&gt;Fixed a glitch related to scrolling in System Monitor’s Configure Columns popup, which is now a traditional window instead. (Arjen Hiemstra, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=517723"&gt;KDE Bugzilla #517723&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;In the Networks widget, connecting to a network you don’t have permission to edit no longer mistakenly makes all other available networks look connected. (Sergey Katunin, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=461028"&gt;KDE Bugzilla #461028&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="frameworks-629-1"&gt;Frameworks 6.29&lt;/h3&gt;
&lt;p&gt;Fixed a subtle regression that prevented overriding settings set at the vendor/distro level (e.g. via a &lt;code&gt;/etc/xdg/kwinrc&lt;/code&gt; file) that differed from Plasma’s own default settings. This affected Kubuntu and Fedora, which turned on Wobbly Windows and Plasma Keyboard, respectively. (Nicolas Fella, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=519481"&gt;KDE Bugzilla #519481&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Typst documents once again show a fancy icon when using the Breeze icon theme, fixing an issue where this stopped happening after the official MIME type for Typst files was changed upstream of KDE. (Boris Jurcaga, &lt;a target="_blank" href="https://invent.kde.org/frameworks/breeze-icons/-/merge_requests/554"&gt;breeze-icons MR #554&lt;/a&gt;)&lt;/p&gt;
&lt;figure&gt;
&lt;img class="img-fluid" alt="Montage of Typst icons against light and dark backgrounds" src="https://blogs.kde.org/2026/07/11/this-week-in-plasma-audio-recording-in-spectacle/typst-icons.png"
style="max-width: 100%; height: auto"
/&gt;
&lt;/figure&gt;
&lt;h2 id="notable-in-performance--technical"&gt;Notable in performance &amp;amp; technical&lt;/h2&gt;
&lt;h3 id="plasma-666-2"&gt;Plasma 6.6.6&lt;/h3&gt;
&lt;p&gt;Using a udev rule to set the &lt;code&gt;LIBINPUT_CALIBRATION_MATRIX&lt;/code&gt; property now works as expected in a Wayland session. (Nicolas Fella, &lt;a target="_blank" href="https://bugs.kde.org/show_bug.cgi?id=521464"&gt;KDE Bugzilla #521464&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id="plasma-68-3"&gt;Plasma 6.8&lt;/h3&gt;
&lt;p&gt;Spectacle no longer requires the fairly chunky OpenCV software library; we found a way to implement an adequately-performant blur effect without it. (Noah Davis, &lt;a target="_blank" href="https://invent.kde.org/plasma/spectacle/-/merge_requests/561"&gt;spectacle MR #561&lt;/a&gt; and &lt;a target="_blank" href="https://invent.kde.org/libraries/kquickimageeditor/-/merge_requests/53"&gt;kquickimageeditor MR #53&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>Web Review, Week 2026-28</title><link>https://ervin.ipsquad.net/blog/2026/07/10/web-review-week-2026-28/</link><pubDate>Fri, 10 Jul 2026 12:09:51 +0000</pubDate><guid isPermaLink="true">https://ervin.ipsquad.net/blog/2026/07/10/web-review-week-2026-28/</guid><description>&lt;p&gt;Let&amp;rsquo;s go for my web review for the week 2026-28.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="chat-control-10-eu-council-forces-messenger-scans-via-fast-track"&gt;Chat Control 1.0: EU Council forces messenger scans via fast-track&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, europe, surveillance&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is a shady move once more&amp;hellip; They really want to extend this security apparatus. We could hope there were enough MEPs to vote against this&amp;hellip; but it&amp;rsquo;s not been the case.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://www.heise.de/en/news/Chat-Control-1-0-EU-Council-forces-messenger-scans-via-fast-track-11353659.html"&gt;https://www.heise.de/en/news/Chat-Control-1-0-EU-Council-forces-messenger-scans-via-fast-track-11353659.html&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="you-paid-me-a-long-time-linux-user-to-use-windows-11-exclusively-for-a-month-heres-how-it-went"&gt;You paid me, a long-time Linux user, to use Windows 11 exclusively for a month: here’s how it went&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, windows, funny&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Funny experiment. If you&amp;rsquo;re a Linux user pondering going back to Windows it&amp;rsquo;ll likely cure you. Goodness the install experience is abysmal and that&amp;rsquo;s just the beginning of the troubles. Of course it has a good side as well but it feels fairly limited.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://www.osnews.com/story/145459/you-paid-me-a-long-time-linux-user-to-use-windows-11-exclusively-for-a-month-heres-how-it-went/"&gt;https://www.osnews.com/story/145459/you-paid-me-a-long-time-linux-user-to-use-windows-11-exclusively-for-a-month-heres-how-it-went/&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="democratizing-abandonware"&gt;Democratizing Abandonware&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, ai, machine-learning, gpt, copilot, slop, flatpak, codereview&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The data set is rather small but the trend is really bad. So much reviewer time wasted due to AI slop&amp;hellip; this time on the Flathub side.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://geopjr.dev/blog/democratizing-abandonware"&gt;https://geopjr.dev/blog/democratizing-abandonware&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="i-am-not-a-tool"&gt;I am not a tool&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, ai, machine-learning, gpt, copilot, ethics, foss&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Really this kind of AI push is a bad move from employers, especially when interacting with FOSS communities so much. This forces people to pass the ethical issues onto volunteers&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://eng.hroncok.cz/2026/07/07/ai-tool"&gt;https://eng.hroncok.cz/2026/07/07/ai-tool&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="bosses-horrified-as-ai-native-college-graduates-hit-the-workplace"&gt;Bosses Horrified as &amp;ldquo;AI Native&amp;rdquo; College Graduates Hit the Workplace&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, ai, machine-learning, gpt, productivity, education&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;How is going this social experiment at scale? Not well I&amp;rsquo;d say&amp;hellip; And some in those cohorts will end up in positions of power, that&amp;rsquo;s when it&amp;rsquo;ll become really &amp;ldquo;interesting&amp;rdquo; I guess.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://futurism.com/future-society/college-critical-thinking-ai"&gt;https://futurism.com/future-society/college-critical-thinking-ai&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="local-cpu-friendly-high-quality-tts-with-kokoro"&gt;Local, CPU-Friendly, High-Quality TTS with Kokoro&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, ai, machine-learning, speech&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This keeps being a very interesting TTS model. Looks like it&amp;rsquo;s getting simpler to deploy too.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://ariya.io/2026/03/local-cpu-friendly-high-quality-tts-text-to-speech-with-kokoro/"&gt;https://ariya.io/2026/03/local-cpu-friendly-high-quality-tts-text-to-speech-with-kokoro/&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="cpp2rust-automatic-translation-of-c-to-safe-rust"&gt;Cpp2Rust: Automatic Translation of C++ to Safe Rust&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, c++, rust, compiler&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Still need some work I&amp;rsquo;d say but this is interesting research. Transpiling C++ to Rust is getting more accessible. It need some improvements on the optimisation side to be more generally usable.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://web.ist.utl.pt/nuno.lopes/pubs/cpp2rust-pldi26.pdf"&gt;https://web.ist.utl.pt/nuno.lopes/pubs/cpp2rust-pldi26.pdf&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="physically-based---the-pbr-values-database"&gt;Physically Based - The PBR values database&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, shader, pbr, physics&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Cool resource to have the right values for various PBR materials.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://physicallybased.info/"&gt;https://physicallybased.info/&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="how-im-using-css-view-transitions-on-this-blog"&gt;How I&amp;rsquo;m using CSS View Transitions on this blog&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, html, css, animation&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A good reminder that you can go a long way to specify transitions with just CSS nowadays.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://blog.omgmog.net/post/how-im-using-css-view-transitions-on-this-blog/"&gt;https://blog.omgmog.net/post/how-im-using-css-view-transitions-on-this-blog/&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="size-does-matter-actually"&gt;Size does matter, actually&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, web, performance, complexity&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There are ways to have a lighter web. It leads to interesting techniques too.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://nh3.dev/blog/05-bloat"&gt;https://nh3.dev/blog/05-bloat&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="98-isnt-very-much"&gt;98% isn&amp;rsquo;t very much&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, reliability, statistics&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Can you rely on something? Indeed, if it fails &amp;ldquo;only&amp;rdquo; 2% of the time it can mean a lot of failures&amp;hellip; you better handle the edge cases and degrade gracefully.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://whynothugo.nl/journal/2026/07/03/98-isnt-very-much/"&gt;https://whynothugo.nl/journal/2026/07/03/98-isnt-very-much/&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="a-software-engineering-interview-question-i-like-computing-the-median"&gt;a software engineering interview question I like: computing the median&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, hr, interviews, complexity&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I like this kind of questions as well. It&amp;rsquo;s more interesting to aim for something simple to start with than a puzzle. Even topics considered simple have several layers of complexity.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://krisshamloo.com/blog/007"&gt;https://krisshamloo.com/blog/007&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="the-lion-the-witch-and-the-audacity-of-recruiters"&gt;The Lion, The Witch, and the audacity of recruiters&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, hr, interviews&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Whatever the hiring process, show some respect to the candidate. It&amp;rsquo;s the least you can do for them.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://hauleth.dev/post/the-lion-the-witch-and-the-aduacity-of-recruiter/"&gt;https://hauleth.dev/post/the-lion-the-witch-and-the-aduacity-of-recruiter/&lt;/a&gt;&lt;/p&gt;
&lt;br/&gt;
&lt;h4 id="the-myth-of-mind-uploading"&gt;The myth of mind uploading&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Tags: tech, scifi, science, philosophy&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A long piece, but digs in details on why &amp;ldquo;mind uploading&amp;rdquo; really can&amp;rsquo;t be a thing.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://plus.flux.community/p/the-myth-of-mind-uploading"&gt;https://plus.flux.community/p/the-myth-of-mind-uploading&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>KDE Ships Frameworks 6.28.0</title><link>https://kde.org/announcements/frameworks/6/6.28.0/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate><guid isPermaLink="true">https://kde.org/announcements/frameworks/6/6.28.0/</guid><description>&lt;p&gt;Friday, 10 July 2026&lt;/p&gt;
&lt;p&gt;KDE today announces the release of KDE Frameworks 6.28.0.&lt;/p&gt;
&lt;p&gt;This release is part of a series of planned monthly releases making improvements available to developers in a quick and predictable manner.&lt;/p&gt;
&lt;h2 id="new-in-this-version"&gt;New in this version&lt;/h2&gt;
&lt;details open="true" id="Baloo"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/baloo"&gt;Baloo&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;CI: Update clang-format job. &lt;a target="_blank" href="https://commits.kde.org/baloo/5a8c1d7b48e08d5ec5cc95086d4f29e2577fff35"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="Breeze Icons"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/breeze-icons"&gt;Breeze Icons&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Inject version macros to all public headers. &lt;a target="_blank" href="https://commits.kde.org/breeze-icons/93c9e24921ef5fc33d405e4f79150c44ede10cdf"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Remove duplicated ECMSetupVersion include. &lt;a target="_blank" href="https://commits.kde.org/breeze-icons/4b1ff8693edd0d94a576c3b54405a946ff10c045"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Avoid oversized Xcode script input lists. &lt;a target="_blank" href="https://commits.kde.org/breeze-icons/6e92d6d51a7508d17923564d3336afd50b2d5d3d"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Don't include quiet packages in feature_summary. &lt;a target="_blank" href="https://commits.kde.org/breeze-icons/e7ee0a65f7f8e4016f9ecc5a8e7390cca3e089f5"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="Extra CMake Modules"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/extra-cmake-modules"&gt;Extra CMake Modules&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Match build and install file system layout for generate templates. &lt;a target="_blank" href="https://commits.kde.org/extra-cmake-modules/01dc9a0c05dd4851b01b93e961c9aa33b1e96056"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix some typos in comments, docs and UI texts. &lt;a target="_blank" href="https://commits.kde.org/extra-cmake-modules/1b998e882b1b0b9bbbbf46b4c53eb006c148dccc"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ECMGenerateExportHeader: add option DEPRECATED_ATTRIBUTE_TYPE. &lt;a target="_blank" href="https://commits.kde.org/extra-cmake-modules/cd6dea678ccece84d538ed15e156358045760825"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KAuth"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kauth"&gt;KAuth&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Port to KWaylandExtras::exportToplevel. &lt;a target="_blank" href="https://commits.kde.org/kauth/e173bc8595251e814cd7777e6d6845aab802e3bd"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KCalendarCore"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kcalendarcore"&gt;KCalendarCore&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Write custom properties as TEXT or STRING based on their type. &lt;a target="_blank" href="https://commits.kde.org/kcalendarcore/cb3ee0c3be7f7e24c667cb88a96d4deade17be23"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add Android platform calendar plugin. &lt;a target="_blank" href="https://commits.kde.org/kcalendarcore/f73477f2bc33ef910afb236b26e770b1bb576489"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KCMUtils"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kcmutils"&gt;KCMUtils&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;KF6KCMUtilsQuick: inject version macros to all public headers. &lt;a target="_blank" href="https://commits.kde.org/kcmutils/bf9134a413ca9919f3b7ab72d2460b1cd9e398f9"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kquickconfigmodule.h: remove unused QQmlComponent include. &lt;a target="_blank" href="https://commits.kde.org/kcmutils/394a4566fdbc87db7630ef948a7076b9c8612241"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kcmloadtest: remove unused include. &lt;a target="_blank" href="https://commits.kde.org/kcmutils/706200e102137f5ad9e55cb4c6c24c7b6f5ac193"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KCodecs"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kcodecs"&gt;KCodecs&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;[KEncodingProber] Remove some unreachable Reset methods. &lt;a target="_blank" href="https://commits.kde.org/kcodecs/6c944f237a8166b5c80915896da91666226fb638"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[KEncodingProber] Reduce scope of some variables. &lt;a target="_blank" href="https://commits.kde.org/kcodecs/f5cbded142c8d3363a9c5182366e1e0d3505ff61"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KConfig"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kconfig"&gt;KConfig&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Ksharedconfig: only free the shared config at exit under AddressSanitizer. &lt;a target="_blank" href="https://commits.kde.org/kconfig/cdab6455aa3e6c3d198cd7ce3a5c8f9034ecdc88"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ksharedconfig: free the per-thread shared config at application exit. &lt;a target="_blank" href="https://commits.kde.org/kconfig/7951fbe74fbadbf4f401f4cac61dc9af07aa7de4"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Do not launch desktop helper processes on iOS and Android. &lt;a target="_blank" href="https://commits.kde.org/kconfig/a4ce536a84919338db07295a00dfc4cc481b39aa"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Do not launch desktop helper processes on iOS. &lt;a target="_blank" href="https://commits.kde.org/kconfig/c36494e2fffec083febfb2a4c735fe505367f890"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KContacts"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kcontacts"&gt;KContacts&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;CMake config file: search static-build-only dependencies only on condition. &lt;a target="_blank" href="https://commits.kde.org/kcontacts/aceb7312dc31fdc8ad99f46862fcfc84221fad75"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KCoreAddons"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kcoreaddons"&gt;KCoreAddons&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;KMemoryInfo: add basic GNU/Hurd support. &lt;a target="_blank" href="https://commits.kde.org/kcoreaddons/d53d3c756db6832893b6af6eeef6cc10982cc9d6"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KDirWatch_UnitTest: fix memory leaks. &lt;a target="_blank" href="https://commits.kde.org/kcoreaddons/afbd0b1e65f2f94cc0bd35766e7499dacd5a2e21"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KFileSystemType: add custom determineFileSystemTypeImpl for Hurd. &lt;a target="_blank" href="https://commits.kde.org/kcoreaddons/e0479530f19ad0c599b0f3d3e3874d27b23c43bb"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Switch to ECMGenerateExportHeader generating C++ standard attributes. &lt;a target="_blank" href="https://commits.kde.org/kcoreaddons/ed7c819e91d97f1d49accc58c1f7a51464bc75f4"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Aboutdata: Also fill componentName from AppStream data. &lt;a target="_blank" href="https://commits.kde.org/kcoreaddons/a4d8c195d129fe3c9f281ac985407eb181242d80"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Expose basic KSandbox properties to QML. &lt;a target="_blank" href="https://commits.kde.org/kcoreaddons/13780df95b246710c03952c05108cd557f0398af"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Find AppStream files on Android. &lt;a target="_blank" href="https://commits.kde.org/kcoreaddons/791841cdf5bb55a5a097f380473969014eb7ae35"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix Clang-Tidy: Method 'test_locking' can be made static. &lt;a target="_blank" href="https://commits.kde.org/kcoreaddons/768dea24cf7df27bebf5d0eda70432b4caebfef1"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix Clang-Tidy: Static member accessed through instance. &lt;a target="_blank" href="https://commits.kde.org/kcoreaddons/ff6505ee40f748d51f5418f8c5c5ebdac3378f4e"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix Clang-Tidy: Method 'test_fileStaleFiles' can be made static. &lt;a target="_blank" href="https://commits.kde.org/kcoreaddons/973f62d9a2d2a219a722b693e459b5831c85dd5e"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Aboutdata: Fix retrieving untranslated release notes. &lt;a target="_blank" href="https://commits.kde.org/kcoreaddons/6735b808ecf8f0d7e64faf832702a22c04715d8d"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KDav"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kdav"&gt;KDav&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Fix caldavprotocol color argb formatting. &lt;a target="_blank" href="https://commits.kde.org/kdav/6d8b5cdc62f58fa61d8abae5bf37c1d7da5c4c61"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KDE Daemon"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kded"&gt;KDE Daemon&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Disable startup notification for kded. &lt;a target="_blank" href="https://commits.kde.org/kded/6ffe591e878b825f5daa227932ab5f6ef9a11908"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KDNSSD"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kdnssd"&gt;KDNSSD&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Correctly track Avahi service types. &lt;a target="_blank" href="https://commits.kde.org/kdnssd/2416ac2601a6cb3ec5cbe49c8bb377955dab89b8"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add basic service browser example. &lt;a target="_blank" href="https://commits.kde.org/kdnssd/9456a7cf5ba9319cb247bc57bf2cc0439d9bb486"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KFileMetaData"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kfilemetadata"&gt;KFileMetaData&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;OSS-Fuzz: serialize AFL fuzzer builds. &lt;a target="_blank" href="https://commits.kde.org/kfilemetadata/c6268caa142d6f25187f0ad5eac013d6edaf8def"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Integrate KFileMetaData into OSS-Fuzz. &lt;a target="_blank" href="https://commits.kde.org/kfilemetadata/bedf3a9fc40ef5a2dc3f688d9ed2c835b215b77f"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KGuiAddons"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kguiaddons"&gt;KGuiAddons&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Use iOS-compatible platform and URL handling. &lt;a target="_blank" href="https://commits.kde.org/kguiaddons/1dbd01bea855e0b91f76abd7fa70b41f56abcf28"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KHolidays"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kholidays"&gt;KHolidays&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Holiday_et_am - fix region name. &lt;a target="_blank" href="https://commits.kde.org/kholidays/fa651bb41ed521fca506271c3db16ea2100bd387"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Holidays: Add Ethiopian holidays (et_en, et_am). &lt;a target="_blank" href="https://commits.kde.org/kholidays/8a70a810f9015400232894d9e9aba667556b8c95"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Updated Croatian holidays as of 2026. &lt;a target="_blank" href="https://commits.kde.org/kholidays/fbc88b2bcb3a6d6b7e64befe0d3dc9c1ddfb0641"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix occurrence of Mother's Day and Father's Day in Slovakia. &lt;a target="_blank" href="https://commits.kde.org/kholidays/524ad3b6953b2492737ebc3547339c822c9f172c"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KI18n"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/ki18n"&gt;KI18n&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;KTranscript: Use Q_APPLICATION_STATIC for impl. &lt;a target="_blank" href="https://commits.kde.org/ki18n/ffd060e05a11670f386154e9e46b85e1db69046d"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/520512"&gt;#520512&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix: use system locale as fallback for macOS app bundle. &lt;a target="_blank" href="https://commits.kde.org/ki18n/34140601f6418eccb898dded2fd901b044e9ac80"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Klocalizedcontext: correctly place deprecation attribute after class keyword. &lt;a target="_blank" href="https://commits.kde.org/ki18n/0c0cf995c3159c6a016e6401e77b2a5946d8d3ea"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KIconThemes"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kiconthemes"&gt;KIconThemes&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Disable desktop-only KIconThemes tools and plugin on iOS. &lt;a target="_blank" href="https://commits.kde.org/kiconthemes/1a482806d793a52fbf89e42095424254302c11da"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KIdletime"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kidletime"&gt;KIdletime&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Fully port to ecm_qt_declare_logging_category. &lt;a target="_blank" href="https://commits.kde.org/kidletime/cd8a70010ea23dde5ee62381ce687b97497528d7"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix debug category name kf5idletime_wayland It's not a kf5. &lt;a target="_blank" href="https://commits.kde.org/kidletime/4bd940972b56e97cb2174e17a9f3c3bb7ded72dd"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KImageformats"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kimageformats"&gt;KImageformats&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;EXR: added support for additional metadata. &lt;a target="_blank" href="https://commits.kde.org/kimageformats/e6bc1af5e4773ed04a5f5cb16a27ed723bba5199"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;JP2: limits the maximum number of channels to the global value defined. &lt;a target="_blank" href="https://commits.kde.org/kimageformats/18322b06593bf08105f9bdeaaa4bc142ba71ec31"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ossfuzz: replace INITGUID with &lt;strong&gt;ANSI&lt;/strong&gt;. &lt;a target="_blank" href="https://commits.kde.org/kimageformats/a5c62391386543f33199d69a5dcc66f2fcd03956"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;JXR: remove INITGUID define. &lt;a target="_blank" href="https://commits.kde.org/kimageformats/081975807cc0f6b4aa36dae12a79a31221a4ae95"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ossfuzz: update libaom and libavif. &lt;a target="_blank" href="https://commits.kde.org/kimageformats/b58b865ba4c35942d0374c1b8871a364e36373e4"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;HEIF: use heif_reader for random access devices. &lt;a target="_blank" href="https://commits.kde.org/kimageformats/8768a8cf97123b559e44a8336f5ca2efa38d235f"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Avif: If we only have single image, return false at jumpToNextImage. &lt;a target="_blank" href="https://commits.kde.org/kimageformats/7edf807082286279d8962323a0378d566361031b"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/521200"&gt;#521200&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Added limit to maximum number of channels. &lt;a target="_blank" href="https://commits.kde.org/kimageformats/52045ff84d271752a528af6c13290fb3494c6317"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Improve buffer memory management. &lt;a target="_blank" href="https://commits.kde.org/kimageformats/ec640db10e7af22e9693e318653f5072d97dd4f3"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KIO"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kio"&gt;KIO&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Knewfilemenu: misc refactoring. &lt;a target="_blank" href="https://commits.kde.org/kio/2303dc296c1f492747c770d130aec64a6e8a9dcd"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Knewfilemenu: remove EntryType. &lt;a target="_blank" href="https://commits.kde.org/kio/650a826c67fa4ec3d3d13c26f785027ebe603c39"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KFileWidgetTest: fix flaky testDropFile. &lt;a target="_blank" href="https://commits.kde.org/kio/976640bafbbcc90e13752e1b02b7219f26dd3ccf"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KFilePlacesView: only repaint the drop indicator when it changes. &lt;a target="_blank" href="https://commits.kde.org/kio/d22faca512a8ccb74eb38c91716dee937e434a21"&gt;Commit.&lt;/a&gt; See bug &lt;a target="_blank" href="https://bugs.kde.org/522257"&gt;#522257&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;WorkerThread: do not pthread_join the QThread's own thread. &lt;a target="_blank" href="https://commits.kde.org/kio/9f817ffc1d26fcc1139100a69c7f4d9d59c1494c"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;File worker: create directories with the requested mode. &lt;a target="_blank" href="https://commits.kde.org/kio/d1646c96a8f6cef465e8ff7121a8e15a3041599d"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;File worker: do not fail mkdir when overwrite is set and nothing to remove. &lt;a target="_blank" href="https://commits.kde.org/kio/3d66470e90fd0c5d11180009bac8d572d0369720"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KFilePermissionsPropsPlugin: fix isIrregular calculation when using extended ACLs. &lt;a target="_blank" href="https://commits.kde.org/kio/3ac55ad6fdd043323d5d0a2a7a4fd236cf146431"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Autotests: add a union-based UDSEntry candidate to the comparison benchmark. &lt;a target="_blank" href="https://commits.kde.org/kio/c6e3c6f65b6acbb5c9f09c3096e729eef74e3ee9"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kio_file: stop recursive deletion promptly when the job is cancelled. &lt;a target="_blank" href="https://commits.kde.org/kio/0c20ece176acfc21b7c020e6d35a9f4e867b8001"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Core, kio_file: stop directory listing promptly when the job is cancelled. &lt;a target="_blank" href="https://commits.kde.org/kio/1c372b8163d2885b695890bac5783183b9eff162"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KUrlNavigator: Fix context menu action removing focus effect from region of navbar. &lt;a target="_blank" href="https://commits.kde.org/kio/413f30206aafcee40ffb855a425a2644567c9f73"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Switch to ECMGenerateExportHeader generating C++ standard attributes. &lt;a target="_blank" href="https://commits.kde.org/kio/3078babde7785b3104693bfb8a463750c91e18fb"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Openurljob: treat x-ms-dos-executable as a native binary if the executable bit is set. &lt;a target="_blank" href="https://commits.kde.org/kio/b358a74208240099a6940877fe3b85f8dda51f1a"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Autotests: verify POSIX ACL preservation when copying a file. &lt;a target="_blank" href="https://commits.kde.org/kio/bc4c411aff2a493310866518840505a637bcfd11"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Commandlauncherjobtest: wait for KProcessRunner deletion in runExecutableInLocalPath. &lt;a target="_blank" href="https://commits.kde.org/kio/abfe4b4a5fca5d554f957f9e55d73365effe99f4"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Worker: do not flush deferred deletes globally in the destructor. &lt;a target="_blank" href="https://commits.kde.org/kio/6771015ea657ee998d1bfeb05dd71f6716494d08"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Autotests: add a regression test for the Worker::deref() deadlock. &lt;a target="_blank" href="https://commits.kde.org/kio/c7db0701bec782006cad468255267e63b325172c"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Worker: do not join the worker thread synchronously in deref(). &lt;a target="_blank" href="https://commits.kde.org/kio/ea783890e43f0ef99b77579bb6bf6c89d956438d"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Autotests/threadtest: redesign concurrent test to avoid Qt plugin singleton race. &lt;a target="_blank" href="https://commits.kde.org/kio/bd11222c94607b71e91f47e220e3caf7bd8e057d"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Autotests: fix reliability and prevent memory leaks. &lt;a target="_blank" href="https://commits.kde.org/kio/575c223ebe481fa2d82a5eb05375d539c5b114ec"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Scheduler: kill pending jobs on scheduler shutdown. &lt;a target="_blank" href="https://commits.kde.org/kio/1cfbfdaabb3556a3fc0f7ded1fe4614763f2fbd5"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Worker, WorkerThread: fix QPluginLoader, QLibraryPrivate and thread lifecycle leaks. &lt;a target="_blank" href="https://commits.kde.org/kio/086ffb96777a949792b40d652b578fe2d2f23321"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Enable LSAN in CI. &lt;a target="_blank" href="https://commits.kde.org/kio/9bd177bb40ab66114d812b1c7a05638a68807f4e"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;NameFinderJob: fix StatJob lifetime, add doKill() and clean up. &lt;a target="_blank" href="https://commits.kde.org/kio/419f82dee1b50109cd59e1458f4845a2924be412"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;File worker: set the modification time through SetFileTime on Windows. &lt;a target="_blank" href="https://commits.kde.org/kio/a97352d90f109b7e6d9fa8a819a5d208cb0a9458"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ignore the file worker move in git blame. &lt;a target="_blank" href="https://commits.kde.org/kio/23b702bd218361f5d6c48bda1070bfce0ca7f557"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;File worker: drop the stale chmod FIXME comment. &lt;a target="_blank" href="https://commits.kde.org/kio/2f5cfe4ce25724e4d09b49b7838ae7816b3034d9"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;File worker: remove the dead tryChangeFileAttr and ActionType enum. &lt;a target="_blank" href="https://commits.kde.org/kio/4459b80ea7118f59354b9dd99c65e13facfea58c"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;File worker: set the copied file's permissions and ownership through a descriptor. &lt;a target="_blank" href="https://commits.kde.org/kio/44cdb1f672ce76d8d9695942805d12dac7764905"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mkdirjob: add setOwnership to set uid/gid. &lt;a target="_blank" href="https://commits.kde.org/kio/b89dfc54c6e6f87c3d41ca24b3c046094ca03ad9"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/517067"&gt;#517067&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Deletejob: report files removed before a partial failure. &lt;a target="_blank" href="https://commits.kde.org/kio/6e58b9abbc2d13e949d00383ca96c4b4aa39c7da"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/424545"&gt;#424545&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Openurljobtest: wait for the launched output, not just the file. &lt;a target="_blank" href="https://commits.kde.org/kio/b0a623d2fc4b9ba9d45d30b2e17d62dd490c7c66"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Make KFilePropsPluginWidget labels' case adhere to the HIG. &lt;a target="_blank" href="https://commits.kde.org/kio/58b6191936d24fbf7e012d6ac61bc6b07c711e06"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kfileitem: do not read .directory on slow filesystems in iconName. &lt;a target="_blank" href="https://commits.kde.org/kio/786803f7f32a36293cfa0fed821323c5fa8be7bf"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/519189"&gt;#519189&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Filepreviewjobtest: Correct email in SPDX header. &lt;a target="_blank" href="https://commits.kde.org/kio/ae822339928fbf0c58c85cb295edb896a8d36a99"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Filepreviewjobtest: Correct email in SPDX header. &lt;a target="_blank" href="https://commits.kde.org/kio/2ae15c69a7a35cf7cf1f2686225a9c8244f7ac99"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Filepreviewjob: stop timeout timer when the job finishes. &lt;a target="_blank" href="https://commits.kde.org/kio/ad1eb8c809c2a88e6e344df15cb9e43666976dc6"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Core: refresh KIO changes without DBus notifications. &lt;a target="_blank" href="https://commits.kde.org/kio/7d91d14bbdfb6bcb0d683dad9e2718e0190809ce"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Widgets/kfileitem: center small icons in grid view. &lt;a target="_blank" href="https://commits.kde.org/kio/5a12f68da1292fd238891c8aada3cc03efc1fc2d"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/520659"&gt;#520659&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kfilewidget: jump to the closest sliderstep value. &lt;a target="_blank" href="https://commits.kde.org/kio/b65ad9c772128d8bd470b2b9433fac3acc6d6a40"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kfileplacesmodel: Check whether tags are a supported protocol before adding them. &lt;a target="_blank" href="https://commits.kde.org/kio/a6229b513df0b7840a017d64e7d655470b283cbc"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KFilePlaceEditDialog: avoid public include of &lt;KIconLoader&gt;. &lt;a target="_blank" href="https://commits.kde.org/kio/15037de46a865ddfb7d3fa5313ba0a08d05365b3"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="Kirigami"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kirigami"&gt;Kirigami&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Action: only enable alternateShortcut when the action is enabled. &lt;a target="_blank" href="https://commits.kde.org/kirigami/0ff3ed59f8e3a7883a3e88b7bc487f55365fb0ff"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FormEntry: fix binding loop. &lt;a target="_blank" href="https://commits.kde.org/kirigami/3a9364faa85fe7d9496eb2cc3de094d6e660072a"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FormEntry: always be hoverEnabled. &lt;a target="_blank" href="https://commits.kde.org/kirigami/f5caa26f0ef83415bd15d9b23146ed6042e931be"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Forms: Dont put items at fractional positions. &lt;a target="_blank" href="https://commits.kde.org/kirigami/c10b88f295f307152ff9365e2111f90f4fcbbde9"&gt;Commit.&lt;/a&gt; See bug &lt;a target="_blank" href="https://bugs.kde.org/522042"&gt;#522042&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;AbstractApplicationWindow: Fix applications that use an header item. &lt;a target="_blank" href="https://commits.kde.org/kirigami/c8889cbfcc8a3292db1e65b451e0c6f963718a4e"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/521552"&gt;#521552&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Primitives: Base Icon's node size on icon size, not item size. &lt;a target="_blank" href="https://commits.kde.org/kirigami/3c8de8d17dd16dd97866576adbdb8456840fc1cf"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/391315"&gt;#391315&lt;/a&gt;. Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/518041"&gt;#518041&lt;/a&gt;. Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/519129"&gt;#519129&lt;/a&gt;. Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/408215"&gt;#408215&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;AlignedSize: fix docs. &lt;a target="_blank" href="https://commits.kde.org/kirigami/0d9ff99312e356daf967e05b939df4af74be97b8"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Controls/private/DefaultChipBackground.qml: remove wrong colorSet. &lt;a target="_blank" href="https://commits.kde.org/kirigami/d7064e9e8ed0b217d6baebe7daec100356481849"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KMime"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kmime"&gt;KMime&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Don't create headers with an empty type. &lt;a target="_blank" href="https://commits.kde.org/kmime/94ce7c1220d689aa0884cf259157f0e190cb6060"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Stricter checks for yEnc metadata field separation. &lt;a target="_blank" href="https://commits.kde.org/kmime/8608c7cb212a841f20202a5b075083d071a0c140"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KNotifications"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/knotifications"&gt;KNotifications&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Android: Modernize JNI code. &lt;a target="_blank" href="https://commits.kde.org/knotifications/5752779e056f3c0884fecefb127d49c58956361f"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KParts"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kparts"&gt;KParts&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Dont copy kaboutdata into khelpmenu. &lt;a target="_blank" href="https://commits.kde.org/kparts/99001bbe34586a3a7c67b34435243b16b52d8a3d"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KRunner"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/krunner"&gt;KRunner&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;KRunner::ResultsModel: remove unneeded QIcon include. &lt;a target="_blank" href="https://commits.kde.org/krunner/dec5f2756381884b4749b69844e8f695c595af1d"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KService"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kservice"&gt;KService&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Services/kservicegroup: include storageId in sorting key. &lt;a target="_blank" href="https://commits.kde.org/kservice/7e643dbcd3d780894278a036417ce50ef46a5ebd"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/516802"&gt;#516802&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KSVG"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/ksvg"&gt;KSVG&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;KF6Svg: drop publically unused KF6::ConfigCore from public link interface. &lt;a target="_blank" href="https://commits.kde.org/ksvg/e2e4bf327a3a873e274ab38cef9db20b0a1b78d2"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KSvg::ImageSet: remove unneeded KSharedConfig include. &lt;a target="_blank" href="https://commits.kde.org/ksvg/c9cd1520c389882f15163d449fb0e7f4a76630d7"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KTextEditor"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/ktexteditor"&gt;KTextEditor&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Fix typo in settings. &lt;a target="_blank" href="https://commits.kde.org/ktexteditor/b47965763cd72bede6ea744e59847f3bf25b46ff"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Vi-mode: Fix reversed mouse selection range. &lt;a target="_blank" href="https://commits.kde.org/ktexteditor/3ded1f1e15c4ac57a1a916d107b1a4cf644ae0e5"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/454417"&gt;#454417&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Vi-mode: Fix command range for mouse selection. &lt;a target="_blank" href="https://commits.kde.org/ktexteditor/6f6cbc7f0f15c919b30ddf4e04044e8a0944e461"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/454312"&gt;#454312&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Vi-mode: Implement read-only registers: search and command. &lt;a target="_blank" href="https://commits.kde.org/ktexteditor/31a0c1182eb35bbe376e94ad5f268f25a5084a6c"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Vi-mode: Fix register for last inserted text. &lt;a target="_blank" href="https://commits.kde.org/ktexteditor/9626e9ebd30e6be7c845b87d841698e708ea7f85"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Vi-mode: Simplify validation of register characters. &lt;a target="_blank" href="https://commits.kde.org/ktexteditor/8e352302808fced3b1184986e1157227e7192bcf"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Change setting wording. &lt;a target="_blank" href="https://commits.kde.org/ktexteditor/162840d4d5bb31dc84ce37d38d619d480e36136b"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Word cursor movement: Only stop at underscores in camel cursor. &lt;a target="_blank" href="https://commits.kde.org/ktexteditor/dbb9eb497441738577ec3196f5ed4d9f2339adda"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Vi-mode: Shorten names for VI modes on the status bar. &lt;a target="_blank" href="https://commits.kde.org/ktexteditor/dae64ec254338eafd52d725caa6eec330fafac4f"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Vi-mode: Allow count for multiple undo/redo. &lt;a target="_blank" href="https://commits.kde.org/ktexteditor/63d873b7410027f56d0d6164aa27a8d267d6beb1"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add editor color theme preview icon to config page combo boxes. &lt;a target="_blank" href="https://commits.kde.org/ktexteditor/494d3862bbe5800c3cab4098e90cdcdb6cb902a5"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Show preview icons for editor color themes. &lt;a target="_blank" href="https://commits.kde.org/ktexteditor/2fd634b15bc082944367308a6c45275cc374f740"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Themeconfig: Set file type instead of highlighting mode. &lt;a target="_blank" href="https://commits.kde.org/ktexteditor/b1911062b4512b30607afe6990bcd5a4bbfd9f28"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KUnitConversion"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kunitconversion"&gt;KUnitConversion&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;ADD: Wh (watt-hour) energy conversion. &lt;a target="_blank" href="https://commits.kde.org/kunitconversion/6a904fabb406de6ff0a4a7075196395dabd5f788"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KUserFeedback"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kuserfeedback"&gt;KUserFeedback&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Inject version macros to all public headers. &lt;a target="_blank" href="https://commits.kde.org/kuserfeedback/2611c9b6eba8488c6fd619472ec312b8744f7440"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KWallet"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kwallet"&gt;KWallet&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Fix(ksecretd): reject invalid UTF-8 in &lt;code&gt;SetSecret&lt;/code&gt;/&lt;code&gt;CreateItem&lt;/code&gt; instead of silent corruption. &lt;a target="_blank" href="https://commits.kde.org/kwallet/d6e87dc9ee4834a64b4d3bd41decd0aa324906e4"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KWidgetsAddons"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kwidgetsaddons"&gt;KWidgetsAddons&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;KJobWidgets: place deprecation attribute standard-type-clang-compatible. &lt;a target="_blank" href="https://commits.kde.org/kwidgetsaddons/349c00111851f78a675e0dec6189d885ea0fb329"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Exclude KMimeTypeEditor from iOS builds. &lt;a target="_blank" href="https://commits.kde.org/kwidgetsaddons/96672832e209501d6567a3efd5d3c398c60bec05"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KWindowSystem"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kwindowsystem"&gt;KWindowSystem&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Platforms/xcb: Handle Xwayland restarts better. &lt;a target="_blank" href="https://commits.kde.org/kwindowsystem/a941b6f464c9541a63b6c22d98ac36ded4b43345"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Platforms/xcb: Manage atoms with a shared pointer. &lt;a target="_blank" href="https://commits.kde.org/kwindowsystem/301989e8aaa4237a9da6384bc042f5c23702c31a"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Restore guard for null window in exportWindow. &lt;a target="_blank" href="https://commits.kde.org/kwindowsystem/9beda3c96988ef5a392c659a06f02bc4942fccbe"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/521241"&gt;#521241&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fixup! s/27/28. &lt;a target="_blank" href="https://commits.kde.org/kwindowsystem/78a0d42b4b57e7e196c46c2d18bb38d5d915cc98"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Provide a future based API to export a window. &lt;a target="_blank" href="https://commits.kde.org/kwindowsystem/3dc14c64da185cb709e1454fe6a59d6e58b13bd3"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="KXMLGUI"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/kxmlgui"&gt;KXMLGUI&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Support modifier-only shortcuts in KShortcutsEditor. &lt;a target="_blank" href="https://commits.kde.org/kxmlgui/1f507749b6b4eb3e2f2ecd0465a1dfb5ca3636f5"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/518302"&gt;#518302&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Refactor internal KShortcutsEditor bits to support shortcut patterns. &lt;a target="_blank" href="https://commits.kde.org/kxmlgui/4c2bc7b51cf59916c77f4dd9bb65aca74a0649b7"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Don't call moveValuesTo on invalid source. &lt;a target="_blank" href="https://commits.kde.org/kxmlgui/2d72361f69f8f0d4ac62928f3708572f9703fcc9"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/520556"&gt;#520556&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="Oxygen Icons"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/oxygen-icons"&gt;Oxygen Icons&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Add to favorites icon. &lt;a target="_blank" href="https://commits.kde.org/oxygen-icons/7fa065fcf55ffb324d6f315c0f4cc732688b07ad"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Updated kt-magnet for sizes 22-64. &lt;a target="_blank" href="https://commits.kde.org/oxygen-icons/5f650d0725fd73916fd401c399bf2e5a34f2f411"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Actions/kt-magnet initial version. &lt;a target="_blank" href="https://commits.kde.org/oxygen-icons/8e0870618eefd8a4cb73b36f68025bf94f0a714f"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Appimage mimetype. &lt;a target="_blank" href="https://commits.kde.org/oxygen-icons/0599d3bd27c8f09f5e2322054be8e535a52bbf5f"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Symlink system-save-session -&amp;gt; document-save. &lt;a target="_blank" href="https://commits.kde.org/oxygen-icons/9b261e9927d2fa01ae304f3f77e54bd9fde36146"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Application-x-msdownload -&amp;gt; application-x-ms-dos-executable. &lt;a target="_blank" href="https://commits.kde.org/oxygen-icons/122dde91789d308d10662a585ba11e3f2542f9e1"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Amarok-symbolic. &lt;a target="_blank" href="https://commits.kde.org/oxygen-icons/f5693687189142b944a4045faf9ee4ff46fbf09b"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Some symlinks for eye icon. &lt;a target="_blank" href="https://commits.kde.org/oxygen-icons/2d4e505b04302f2b64fa57acbec613116df0a672"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Https://invent.kde.org/frameworks/oxygen-icons/-/work_items/1#note_1527713 fix. &lt;a target="_blank" href="https://commits.kde.org/oxygen-icons/53d3ca120e954ce14d13c17d06ef787048b4d17b"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;More symbolic icons for 32x32. &lt;a target="_blank" href="https://commits.kde.org/oxygen-icons/b1610c1c860e0bf1f1fc44164848fd7f0439427d"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Another icon complete. &lt;a target="_blank" href="https://commits.kde.org/oxygen-icons/2f415dabfafd4dd0867fa74cd5916812fd1dcf12"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Another icons that was not needed 20 years ago :D. &lt;a target="_blank" href="https://commits.kde.org/oxygen-icons/b3fec3cada7bacbfc9b4277cde58fe6533505302"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Keepsecret app icon. &lt;a target="_blank" href="https://commits.kde.org/oxygen-icons/4b783b91e2499f35d6b252875ad336029d978e1d"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;New icon for a series. &lt;a target="_blank" href="https://commits.kde.org/oxygen-icons/185abfb30f84be2da305289e1161e840b03b48da"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="Prison"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/prison"&gt;Prison&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Fix documentation syntax. &lt;a target="_blank" href="https://commits.kde.org/prison/a214f6b49268e99e1f457379f86b1d5f27bb3494"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add support for rendering ITF and Codabar barcodes. &lt;a target="_blank" href="https://commits.kde.org/prison/b592e80879b799f0ad2313f06614178e65edc1ec"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="Purpose"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/purpose"&gt;Purpose&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Fix constraints not being evaluated correctly. &lt;a target="_blank" href="https://commits.kde.org/purpose/e512254e00999a747e196369927176536f25100d"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/521138"&gt;#521138&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="QQC2 Desktop Style"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/qqc2-desktop-style"&gt;QQC2 Desktop Style&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;ComboBox: Fix width calculation in some situations. &lt;a target="_blank" href="https://commits.kde.org/qqc2-desktop-style/d43f5b54115d0ad8215c685b95f38cb872dbc2d1"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/522453"&gt;#522453&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Set implicitWidth for ComboBox popups. &lt;a target="_blank" href="https://commits.kde.org/qqc2-desktop-style/b01e832771ac23324fec193d6853355866089099"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="Solid"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/solid"&gt;Solid&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Windows: do not query drives without a reachable volume. &lt;a target="_blank" href="https://commits.kde.org/solid/7c6626a194e12e2a491aef305d4d6cbc77267642"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Allow discovery of Samba shares under BSD. &lt;a target="_blank" href="https://commits.kde.org/solid/d1b70027663c85b8c4be563f6ce535e979b96751"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fix: add missing ARM CPU part numbers from util-linux lscpu-arm.c. &lt;a target="_blank" href="https://commits.kde.org/solid/8675e640491209ca42229dd10835ca7bf0adb7ec"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;QDoc fixes. &lt;a target="_blank" href="https://commits.kde.org/solid/33de5523917a385fceb40e42fcef6162da4c1ba7"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;details open="true" id="Syntax Highlighting"&gt;
&lt;summary class="h4"&gt;&lt;a target="_blank" href="https://commits.kde.org/syntax-highlighting"&gt;Syntax Highlighting&lt;/a&gt;&lt;/summary&gt;&lt;ul&gt;
&lt;li&gt;Invalidate cached translations when language changes. &lt;a target="_blank" href="https://commits.kde.org/syntax-highlighting/956564c23b233d7fa99218745909f823457e763f"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Powershell: fix parentheses matching in command substitution with function calls. &lt;a target="_blank" href="https://commits.kde.org/syntax-highlighting/eb56d8427a6dd83eb02586616a3e3928788d0bad"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/519774"&gt;#519774&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Powershell: fix Numeric Suffix when the previous line ends with number. &lt;a target="_blank" href="https://commits.kde.org/syntax-highlighting/1f66f37f1e2a805f376c56dc69f0ef106c33ba27"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Make build reproducable. &lt;a target="_blank" href="https://commits.kde.org/syntax-highlighting/fb41b0e8848ac054d6eda97d65fc63e8880c8360"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Adapt refs to fixed scope highlighting. &lt;a target="_blank" href="https://commits.kde.org/syntax-highlighting/7f3e645b090ae1e3295dcac31cb7d4f3d3fa26cd"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fixes formatting for scopes containing types like 'std::char' or 'std::str::Bytes' which contain 'str' and 'char'. &lt;a target="_blank" href="https://commits.kde.org/syntax-highlighting/57bbff88cdb7bb77214762853edec196491931da"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Systemd unit: update to systemd v261. &lt;a target="_blank" href="https://commits.kde.org/syntax-highlighting/f4c5615975226de9c56ce91d03f84c5db1a42598"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;YAML: fix some bad indentation detection, add Timestamp and fix some defects. &lt;a target="_blank" href="https://commits.kde.org/syntax-highlighting/ccb31f722406d5b980ba57cf71a3ffab70a82847"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fish: end keyword of function as Keyword instead of Control Flow. &lt;a target="_blank" href="https://commits.kde.org/syntax-highlighting/b08adefa1df345f3d5000d0507f1b334b96a55b1"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fish: use the &amp;quot;Function Doc&amp;quot; style for strings with --description followed by spaces. &lt;a target="_blank" href="https://commits.kde.org/syntax-highlighting/5707c1f2b02d619a6d6449adfb8dc96ebae03847"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/521369"&gt;#521369&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Theme: Add preview icon. &lt;a target="_blank" href="https://commits.kde.org/syntax-highlighting/0d266403ba7897030a632f5168f0a4349da323ba"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Zsh: remove String Transl. which does not exist in zsh. &lt;a target="_blank" href="https://commits.kde.org/syntax-highlighting/36d80835a5e2e13037524531df8b464992c25c06"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bash: fix String Transl. highlingting (was a String DoubleQ). &lt;a target="_blank" href="https://commits.kde.org/syntax-highlighting/27d0a0894c3243d7999b1466d377b1c8b5a7f128"&gt;Commit.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bash: fix context pop of brace command substitution ($&amp;#123; cmd}/$&amp;#123;|cmd}). &lt;a target="_blank" href="https://commits.kde.org/syntax-highlighting/5e2cad6b75030e530b5facd0fd492c881cc3aba0"&gt;Commit.&lt;/a&gt; Fixes bug &lt;a target="_blank" href="https://bugs.kde.org/521069"&gt;#521069&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;</description><author>KDE Community</author></item><item><title>Improving Koko (Part 1 of 2)</title><link>https://nolib.dev/posts/improving-koko-1/</link><pubDate>Thu, 09 Jul 2026 13:51:40 +0000</pubDate><guid isPermaLink="true">https://nolib.dev/posts/improving-koko-1/</guid><description>Myself and others have been contributing to Koko under the banner of Techpaladin Software. Here&amp;rsquo;s what we&amp;rsquo;ve been up to over the past year.</description><author>Oliver Beard</author></item><item><title>Qt for MCUs 2.12.2 LTS Released</title><link>https://www.qt.io/blog/qt-for-mcus-2.12.2-lts-released</link><pubDate>Thu, 09 Jul 2026 03:00:00 +0000</pubDate><guid isPermaLink="true">https://www.qt.io/blog/qt-for-mcus-2.12.2-lts-released</guid><description>&lt;p&gt;Qt for MCUs 2.12.2 LTS has been released and is available for download.&lt;span&gt; This patch release provides several bug fixes and other improvements while maintaining source compatibility with Qt for MCUs 2.12 (see &lt;a target="_blank" href="https://www.qt.io/blog/qt-for-mcus-2.12-lts-released?hsLang=en"&gt;Qt for MCUs 2.12 LTS released&lt;/a&gt;). This release does not add any new functionality however as part of a continuous effort to scale Qt for MCUs to more platforms new Tier-2 board Nuvoton Gerda-4L is now available.&amp;nbsp;&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%2Fqt-for-mcus-2.12.2-lts-released&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>GSOC progress, Midterm and Upcoming goals</title><link>https://sayandeep.bearblog.dev/gsoc-progress-midterm-and-upcoming-goals/</link><pubDate>Wed, 08 Jul 2026 13:51:00 +0000</pubDate><guid isPermaLink="true">https://sayandeep.bearblog.dev/gsoc-progress-midterm-and-upcoming-goals/</guid><description>&lt;h3 id=hi-everyone-so-we-are-halfway-through-our-journey-of-gsoc-2026-its-time-for-the-midterm-and-new-status-updates-we-have-accomplished-over-the-past-6-weeks&gt;Hi everyone!! So we are halfway through our journey of GSOC 2026. It's time for the midterm and new status updates we have accomplished over the past 6 weeks.&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;During my first and second weeks, I familiarized myself more with the XMPP protocols and clients like Kaidan, etc., which can be used for XMPP server interactions and also created a page for the Mankala Engine using Hugo. I have successfully added the option to register XMPP accounts from within the Mankala Engine and also added an XMPP compliance check in the 2nd week, which makes sure that the selected XMPP server has all the protocols that are needed to play the game.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For the next tasks in week 3, I worked on extracting usernames and profile player icons from within the XMPP servers and directly display it as part of the user account in the game. I also fixed the sizes for the different components in the profile page and gave it a proper redesign.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="center"&gt;
&lt;img src="https://raw.githubusercontent.com/redhatsam09/redhatsam09.github.io/refs/heads/main/VirtualBox_swayy_24_06_2026_14_00_09.png" alt="login" width="500" style="border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);" /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For weeks 4 and 5, I spent time creating the tournaments. I experimented a bit with the connectivity to connect more than 2 players to an XMPP server, and then created a detailed tournament page for the number of wins, losses, and player match details, and thus implemented the round-robin tournament style. Some more features, like setting up the time limits for each move and accepting game invites, were also added.&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="center"&gt;
&lt;img src="https://raw.githubusercontent.com/redhatsam09/redhatsam09.github.io/refs/heads/main/VirtualBox_fedora_08_07_2026_19_08_37.png" alt="tournament" width="600" style="border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);" /&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the 6th week, I gave a talk at the ILUGC (Indian Linux Users Group Chennai) virtual meet and got feedback from the players, and implemented better sounds and a sound button for the game. I also added animations for the shells so they get smoothly displaced to their destined pits after each move.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=challenges-i-faced&gt;Challenges I faced&lt;/h3&gt;&lt;p&gt;The most difficult part while implementing tournaments can be said to connect multiple players and track their moves in real time across the games.
The best possible way to fix this was to create a XMPP MUC and then join the player using that and track the moves being sent across the channel. So, for example a move played by Player 1 will be sent to Player 2, to do this we send the request from Player 1's account track the request through the MUC and display it on the Players 2's board and same goes for multiple players present in the game.&lt;/p&gt;
&lt;h3 id=goals-for-upcoming-weeks&gt;Goals for upcoming weeks&lt;/h3&gt;&lt;p&gt;A couple of changes were added based on our GSOC proposal, and a lot of new things and features were implemented.
In the next half of GSOC, I plan to work on text- and voice-based chat options within the Mankala so that players can communicate with others during their matches. I also plan to add another variant of tournaments, which gives the players a broader number of options to choose from, and add the feature to create a user-defined AI to play against another person or an AI over the network.&lt;/p&gt;
&lt;p&gt;Thanks for reading 🚀&lt;/p&gt;</description><author>Sayandeep Dutta</author></item><item><title>Week 6: Clipboard Auto-Clear with Klipper Protection</title><link>https://roshani-gsoc.bearblog.dev/week-6-clipboard-auto-clear-with-klipper-protection/</link><pubDate>Tue, 07 Jul 2026 08:14:00 +0000</pubDate><guid isPermaLink="true">https://roshani-gsoc.bearblog.dev/week-6-clipboard-auto-clear-with-klipper-protection/</guid><description>&lt;p&gt;This week I implemented clipboard auto-clear for KeepSecret (&lt;a target="_blank" href='https://invent.kde.org/utilities/keepsecret/-/merge_requests/36'&gt;!36&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;When a user copies a password, it shouldn't stay in the clipboard indefinitely — that's a real security risk if the clipboard gets inspected, synced, or accessed by another application.&lt;/p&gt;
&lt;h2 id=what-was-implemented&gt;What was implemented:&lt;/h2&gt;&lt;p&gt;After copying a password, the clipboard is automatically cleared after 30 seconds. A &lt;code&gt;Kirigami.InlineMessage&lt;/code&gt; countdown notification appears in the entry page showing "Password copied. Clipboard will be cleared in X seconds", updating every second. The clipboard is also cleared when the app quits via &lt;code&gt;QCoreApplication::aboutToQuit&lt;/code&gt;.
Instead of &lt;code&gt;QClipboard::clear()&lt;/code&gt; (which on X11 reverts to the previous clipboard entry), the clipboard is overwritten with an empty string. A single repeating &lt;code&gt;QTimer&lt;/code&gt; of 1 second handles both the countdown and the clear — subtracting 1 second each tick, stopping and clearing when it reaches 0. The timeout uses &lt;code&gt;std::chrono::seconds&lt;/code&gt; as suggested by &lt;a target="_blank" href='https://invent.kde.org/mart'&gt;Marco Martin&lt;/a&gt; during review.&lt;/p&gt;
&lt;h2 id=klipper-history-protection&gt;Klipper history protection:&lt;/h2&gt;&lt;p&gt;One tricky KDE-specific problem: even if you clear the clipboard after the timeout, the password could still be sitting in Klipper's clipboard history. The fix is to add the &lt;code&gt;x-kde-passwordManagerHint&lt;/code&gt; MIME type (set to "secret") alongside the password data when copying. Klipper specifically checks for this hint and skips adding that entry to its history entirely — so the password never gets recorded there in the first place. This approach was pioneered by KeePassXC.&lt;/p&gt;</description><author>Roshani Kumari</author></item><item><title>KDE Mega Sprint 2026</title><link>https://nolib.dev/posts/mega-sprint-2026/</link><pubDate>Tue, 07 Jul 2026 07:40:57 +0000</pubDate><guid isPermaLink="true">https://nolib.dev/posts/mega-sprint-2026/</guid><description>I attended my first KDE sprint in Graz, Austria, travelling abroad for the first time. In this late blog post, I discuss the things I did and my thoughts on travel.</description><author>Oliver Beard</author></item><item><title>KDE Plasma 6.6.6, Bugfix Release for July</title><link>https://kde.org/announcements/plasma/6/6.6.6/</link><pubDate>Tue, 07 Jul 2026 00:00:00 +0000</pubDate><guid isPermaLink="true">https://kde.org/announcements/plasma/6/6.6.6/</guid><description>&lt;p&gt;Today KDE releases a bugfix update to KDE Plasma 6, versioned 6.6.6.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="https://kde.org/announcements/plasma/6/6.6.0/"&gt;Plasma 6.6&lt;/a&gt; was released in February 2026 with many feature refinements and new modules to complete the desktop experience.&lt;/p&gt;
&lt;p&gt;This release adds two months’ 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.6.5-6.6.6"&gt;View full changelog&lt;/a&gt;</description><author>KDE Community</author></item><item><title>Week 4 + Week 5 GSoC update | Almost had a heart attack</title><link>https://ojasmaheshwari.github.io/b/2026/week-4-week-5-gsoc-update-almost-had-a-heart-attack</link><pubDate>Mon, 06 Jul 2026 18:46:16 +0000</pubDate><guid isPermaLink="true">https://ojasmaheshwari.github.io/b/2026/week-4-week-5-gsoc-update-almost-had-a-heart-attack</guid><description>&lt;p&gt;Ok, the title is &lt;strong&gt;slightly&lt;/strong&gt; click-baity but hear me out.&lt;/p&gt;
&lt;p&gt;So nearly 2 weeks ago, after writing a lot of code for making the font subsetting work for annotations, I found a flaw in my approach.&lt;/p&gt;
&lt;p&gt;I was never deleting the old original font after embedding it's subset version.&lt;/p&gt;
&lt;p&gt;So what happened is that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Suppose a user creates a new annotation in an empty PDF.&lt;/li&gt;
&lt;li&gt;The subsetted font gets embedded and used in the PDF.&lt;/li&gt;
&lt;li&gt;But the original font stays there, taking space.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is actually slightly worse than when we had no subsetting at all.&lt;/p&gt;
&lt;p&gt;So the solution should just be to delete the original font right? &lt;em&gt;Nope&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If we simply delete the original font, it would create the following problem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Suppose a PDF with two annotations pointing / using the same font.&lt;/li&gt;
&lt;li&gt;User edits the 1st annotation.&lt;/li&gt;
&lt;li&gt;1st annotation uses the subset font, and the old font gets deleted from the PDF.&lt;/li&gt;
&lt;li&gt;The 2nd annotation is rendered useless.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When I realized this, I thought I would need to completely change how I do subsetting, and almost all the code I had written will go to waste.&lt;/p&gt;
&lt;p&gt;My new idea was to never let the full version of a font to exist inside the PDF. What I mean is subsetting immediately when the font is loaded from the disk and is about to be embedded as a &lt;code&gt;Font&lt;/code&gt; object.&lt;/p&gt;
&lt;p&gt;But I had a meeting with my mentor Albert Astals Cid yesterday, and we decided to settle on a simpler approach.
We can simply detect if the font we want to delete is:- &lt;em&gt;a font we added ourselves&lt;/em&gt; or &lt;em&gt;a pre-existing font&lt;/em&gt; inside the PDF.&lt;/p&gt;
&lt;p&gt;If we added it ourselves, we can safely remove it. Otherwise, let it stay there as it might be in use by other annotations.&lt;/p&gt;
&lt;p&gt;I implemented it today, and we have working font subsetting for freetext annotations right now (not merged).&lt;br&gt;
https://gitlab.freedesktop.org/poppler/poppler/-/merge_requests/2220&lt;/p&gt;
&lt;h2&gt;A simple size experiment&lt;/h2&gt;
&lt;p&gt;Here's a simple experiment which demonstrates the impact of font subsetting on PDF file size:&lt;/p&gt;
&lt;p&gt;Original file size: 105820 bytes = 105.82 KB&lt;/p&gt;
&lt;p&gt;After adding an annotation with content &amp;quot;hello world&amp;quot;:&lt;/p&gt;
&lt;p&gt;Poppler &lt;strong&gt;without&lt;/strong&gt; font subsetting: 504699 bytes = 504.699 KB&lt;/p&gt;
&lt;p&gt;Poppler &lt;strong&gt;with&lt;/strong&gt; font subsetting: 145806 bytes = 145.806 KB&lt;/p&gt;
&lt;p&gt;That's like a 500% improvement...&lt;/p&gt;
&lt;h2&gt;What's next&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Right now, I only do the subsetting for ttf/otf fonts and not for ttc fonts. I need to do that.&lt;/li&gt;
&lt;li&gt;I need to make the subsetting work for forms as well.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Thank You&lt;/h2&gt;
&lt;p&gt;Good Night!&lt;/p&gt;</description><author>Ojas Maheshwari</author></item><item><title>Kdenlive 26.04.3 released</title><link>https://kdenlive.org/news/releases/26.04.3/</link><pubDate>Mon, 06 Jul 2026 13:15:00 +0000</pubDate><guid isPermaLink="true">https://kdenlive.org/news/releases/26.04.3/</guid><description>&lt;p&gt;The last maintenance release of the 26.04 series is out, bringing the usual batch of bug fixes and workflow and stability improvements. Highlights include fixes for crashes when undoing sequence creation and recording audio without an audio device, as well as improvements to Rectangular Alpha Mask and Rotoscoping effects. This release also continues the security hardening efforts of this cycle by preventing unwanted command execution on MLT versions below 7.40.&lt;/p&gt;
&lt;p&gt;For the full changelog &lt;a target="_blank" href="https://kdenlive.org/news/releases/26.04.3/#full-changelog"&gt;continue reading on kdenlive.org&lt;/a&gt;.&lt;/p&gt;</description><author>Kdenlive</author></item><item><title>Week 6: Gradient Widget Wired to Qt-Color-Widgets</title><link>https://yashbavadiya.bearblog.dev/week-6-gradient-widget-wired-to-qt-color-widgets/</link><pubDate>Mon, 06 Jul 2026 10:20:54 +0000</pubDate><guid isPermaLink="true">https://yashbavadiya.bearblog.dev/week-6-gradient-widget-wired-to-qt-color-widgets/</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=gradient-widget-switched-to-qt-color-widgets&gt;Gradient widget: switched to Qt-Color-Widgets&lt;/h2&gt;&lt;p&gt;Julius Künzel suggested last week that the Gradient widget be built with an eye toward upstreaming to KDE Frameworks, pointing to &lt;a target="_blank" href='https://mattbas.gitlab.io/Qt-Color-Widgets/'&gt;Qt-Color-Widgets&lt;/a&gt;'s &lt;code&gt;GradientEditor&lt;/code&gt; class as a reference. It's already vendored inside MLT's Glaxnimate module, so this week I wired it in directly instead of maintaining a fully custom-painted widget.&lt;/p&gt;
&lt;p&gt;The vendored &lt;code&gt;color_widgets::GradientEditor&lt;/code&gt; gives a native-styled gradient bar with checkerboard alpha preview, drag-and-drop stop reordering, and its own color dialog, all for free.&lt;/p&gt;
&lt;h2 id=fixing-undo-stack-behavior&gt;Fixing undo-stack behavior&lt;/h2&gt;&lt;p&gt;The library only emits &lt;code&gt;stopsChanged&lt;/code&gt; on completed actions (mouse release, menu add/remove, dialog accept), not per-pixel during drags. That meant two bugs: every plain click created a junk undo-stack entry, and drags had no live preview on the monitor at all.&lt;/p&gt;
&lt;p&gt;Fixed with three pieces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;commitStops()&lt;/code&gt; emits &lt;code&gt;valueChanged(..., true)&lt;/code&gt; only when the serialized value actually changed&lt;/li&gt;
&lt;li&gt;An &lt;code&gt;eventFilter&lt;/code&gt; emits &lt;code&gt;valueChanged(..., false)&lt;/code&gt; during drag moves, for live monitor preview&lt;/li&gt;
&lt;li&gt;An echo-guard in &lt;code&gt;slotRefresh()&lt;/code&gt; ignores the model value coming back from our own emit; without it, the synchronous refresh resets the editor's selection and kills the drag mid-motion&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=32-stop-cap&gt;32-stop cap&lt;/h2&gt;&lt;p&gt;MLT's &lt;code&gt;gradientmap&lt;/code&gt; filter supports &lt;code&gt;stop.1&lt;/code&gt; through &lt;code&gt;stop.32&lt;/code&gt;. The library has no pre-add hook to reject a 33rd stop, so &lt;code&gt;commitStops()&lt;/code&gt; rejects after the fact: the just-added stop gets removed and the editor reset under a signal blocker, with no undo entry created. &lt;code&gt;gradientStopsFromString()&lt;/code&gt; also truncates at 32 on load, so an over-long saved value can't smuggle in extra stops. Exposed as &lt;code&gt;GradientEditWidget::MaxStops&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=build-configurable-vendor-path&gt;Build: configurable vendor path&lt;/h2&gt;&lt;p&gt;The path to Qt-Color-Widgets was previously hardcoded assuming a sibling MLT checkout. Replaced with a &lt;code&gt;KDENLIVE_QTCOLORWIDGETS_PATH&lt;/code&gt; CMake cache variable; same default, overridable with &lt;code&gt;-D&lt;/code&gt;, and a missing path is now a fatal configure error instead of a silent skip that only surfaced at compile time.&lt;/p&gt;
&lt;h2 id=tests&gt;Tests&lt;/h2&gt;&lt;p&gt;&lt;code&gt;gradienteditwidgettest.cpp&lt;/code&gt; now covers a full widget-interaction path with a real timeline document and synthesized mouse events: a plain click produces zero undo entries, a drag produces two preview emissions plus exactly one committed undo entry, and adding a 33rd stop is rejected with the editor staying at 32. All 5 test cases pass, 62 assertions.&lt;/p&gt;
&lt;h2 id=whats-next&gt;What's next&lt;/h2&gt;&lt;p&gt;Four commits are done locally (gradient widget + CMake + tests, plus two unrelated Qt 6.10 compat fixes found along the way), but nothing's pushed yet. Waiting on Jean-Baptiste to confirm this is the direction to commit to before opening an MR.&lt;/p&gt;</description><author>Yash Bavadiya</author></item><item><title>KDE Gear 26.08 branches created</title><link>https://tsdgeos.blogspot.com/2026/07/kde-gear-2608-branches-created.html</link><pubDate>Sun, 05 Jul 2026 22:22:11 +0000</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7523589.post-3036488551218719278</guid><description>&lt;p&gt;Make sure you commit anything you want to end up in the KDE Gear 26.08 releases to them&lt;br /&gt;&lt;br /&gt;Next Dates:&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&amp;nbsp; July 16, 2026, 23:59 UTC: 26.08 Freeze and Beta (26.07.80) tarball creation&lt;/li&gt;&lt;li&gt;&amp;nbsp; July 17 2026: 26.08 Beta (26.07.80) release&lt;/li&gt;&lt;li&gt;&amp;nbsp; July 30, 2026, 23:59 UTC: 26.08 RC (26.07.90) tarball creation&lt;/li&gt;&lt;li&gt;&amp;nbsp; July 31, 2026: 26.08 RC (26.07.90) Release&lt;/li&gt;&lt;li&gt;&amp;nbsp; August 13, 2026, 23:59 UTC: 26.08 tarball creation&lt;/li&gt;&lt;li&gt;&amp;nbsp; August 14, 2026: 26.08 packages released to packagers&lt;/li&gt;&lt;li&gt;&amp;nbsp; August 20, 2026: 26.08 Release&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;a target="_blank" href="https://community.kde.org/Schedules/KDE_Gear_26.08_Schedule"&gt;https://community.kde.org/Schedules/KDE_Gear_26.08_Schedule&lt;br /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;</description><author>Albert Astals Cid</author></item><item><title>Rolisteam v1.10 is out!</title><link>http://renaudguezennec.eu/index.php/2026/07/05/rolisteam-v1-10-is-out/</link><pubDate>Sun, 05 Jul 2026 14:22:55 +0000</pubDate><guid isPermaLink="true">http://renaudguezennec.eu/?p=5122</guid><description>&lt;p&gt;After a long development cycle, we are thrilled to announce the official release of &lt;strong&gt;Rolisteam v1.10&lt;/strong&gt;. This version brings a wave of brand-new tools for Game Masters, a major technical overhaul of the whole project, and a much healthier codebase for the years to come.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Download it now:&lt;/strong&gt; &lt;a target="_blank" href="https://rolisteam.org/02_download/"&gt;https://rolisteam.org/02_download/&lt;/a&gt;&lt;/p&gt;
&lt;h2 class="wp-block-heading" id="whats-new"&gt;What&amp;#8217;s new&lt;/h2&gt;
&lt;h3 class="wp-block-heading" id="mind-maps"&gt;Mind maps&lt;/h3&gt;
&lt;p&gt;Rolisteam now embeds a full mind-map editor, letting you sketch out plots, NPC relationships, or campaign notes visually, right next to your other campaign tools.&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/3dkokPLlre8" title="Mind-map demo video" 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;p&gt;Watch it in action: &lt;a target="_blank" href="https://youtu.be/3dkokPLlre8"&gt;https://youtu.be/3dkokPLlre8&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Documentation: &lt;a target="_blank" href="https://doc.rolisteam.org/21_mindmap/"&gt;https://doc.rolisteam.org/21_mindmap/&lt;/a&gt;&lt;/p&gt;
&lt;h3 class="wp-block-heading" id="3d-dice-powered-by-a-physics-engine"&gt;3D dice, powered by a physics engine&lt;/h3&gt;
&lt;p&gt;Rolling dice has never been more satisfying. The new 3D dice roller uses a real physics engine to simulate dice tumbling and bouncing, giving your rolls a tactile, tabletop feel.&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/d18iqq4eNFw" title="3D dice demo video" 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;p&gt;Watch it in action: &lt;a target="_blank" href="https://youtu.be/d18iqq4eNFw"&gt;https://youtu.be/d18iqq4eNFw&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Documentation: &lt;a target="_blank" href="https://doc.rolisteam.org/34_dice3d/"&gt;https://doc.rolisteam.org/34_dice3d/&lt;/a&gt;&lt;/p&gt;
&lt;h3 class="wp-block-heading" id="a-new-interface-for-instant-messaging"&gt;A new interface for instant messaging&lt;/h3&gt;
&lt;p&gt;The instant messaging panel has been redesigned from the ground up for better readability and a smoother chat experience during your sessions.&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/t8iAKKfH2E4" title="Instant messaging demo video" 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;p&gt;Watch it in action: &lt;a target="_blank" href="https://youtu.be/t8iAKKfH2E4"&gt;https://youtu.be/t8iAKKfH2E4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Documentation: &lt;a target="_blank" href="https://doc.rolisteam.org/07_chat/"&gt;https://doc.rolisteam.org/07_chat/&lt;/a&gt;&lt;/p&gt;
&lt;h3 class="wp-block-heading" id="antagonist-panel"&gt;Antagonist panel&lt;/h3&gt;
&lt;p&gt;A brand-new Antagonist panel lets you list and manage all the NPCs of your campaign in one place, with search and filtering options to quickly find the antagonist you need, right when you need it.&lt;/p&gt;
&lt;iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/CKDvFuruCwE" title="Antagonist panel demo video" 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;p&gt;Watch it in action: &lt;a target="_blank" href="https://youtu.be/CKDvFuruCwE"&gt;https://youtu.be/CKDvFuruCwE&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Documentation: &lt;a target="_blank" href="https://doc.rolisteam.org/07_antagonist/"&gt;https://doc.rolisteam.org/07_antagonist/&lt;/a&gt;&lt;/p&gt;
&lt;h3 class="wp-block-heading" id="a-new-connection-profile-selection-dialog"&gt;A new connection profile selection dialog&lt;/h3&gt;
&lt;iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/BJ0_8XG9NQc" title="Connection profile dialog demo video" 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;p&gt;Choosing and managing your connection profiles is now easier thanks to a completely reworked selection dialog.&lt;/p&gt;
&lt;p&gt;Watch it in action: &lt;a target="_blank" href="https://youtu.be/BJ0_8XG9NQc"&gt;https://youtu.be/BJ0_8XG9NQc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Documentation: &lt;a target="_blank" href="https://doc.rolisteam.org/03_firststeps/"&gt;https://doc.rolisteam.org/03_firststeps/&lt;/a&gt;&lt;/p&gt;
&lt;h2 class="wp-block-heading" id="improvements"&gt;Improvements&lt;/h2&gt;
&lt;h3 class="wp-block-heading" id="battle-maps"&gt;Battle maps&lt;/h3&gt;
&lt;ul class="wp-block-list"&gt;
&lt;li&gt;New, streamlined toolbar for the vectorial map (VMap).&lt;/li&gt;
&lt;li&gt;Full light and shadow management, including support for multiple light sources, adjustable light radius, and network synchronization of lights.&lt;/li&gt;
&lt;li&gt;New shadow casting from walls, computed via raycasting, for more realistic fog-of-war and line-of-sight.&lt;/li&gt;
&lt;li&gt;Various improvements to zoom, item resizing, drag-and-drop from the media panel, and undo/redo reliability.&lt;/li&gt;
&lt;/ul&gt;
&lt;iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/RtnZxa5HjAQ" title="Battle map demo video" 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;p&gt;Watch it in action: &lt;a target="_blank" href="https://youtu.be/RtnZxa5HjAQ"&gt;https://youtu.be/RtnZxa5HjAQ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Documentation: &lt;a target="_blank" href="https://doc.rolisteam.org/05_vectorialmap/"&gt;https://doc.rolisteam.org/05_vectorialmap/&lt;/a&gt;&lt;/p&gt;
&lt;h3 class="wp-block-heading" id="character-sheet"&gt;Character sheet&lt;/h3&gt;
&lt;ul class="wp-block-list"&gt;
&lt;li&gt;Reworked tables for a more flexible and reliable layout.&lt;/li&gt;
&lt;li&gt;Dice commands can now be written directly in the sheet&amp;#8217;s code.&lt;/li&gt;
&lt;li&gt;New buttons to navigate to the next/previous page of a multi-page sheet.&lt;/li&gt;
&lt;li&gt;Automatic sharing&lt;/li&gt;
&lt;li&gt;RCSE: Auto filler dialog&lt;/li&gt;
&lt;li&gt;RCSE: New way to generate code&lt;/li&gt;
&lt;/ul&gt;
&lt;iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/343vYAqrui8" title="Character sheet demo video" 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;p&gt;Watch it in action: &lt;a target="_blank" href="https://youtu.be/343vYAqrui8"&gt;https://youtu.be/343vYAqrui8&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Documentation: &lt;a target="_blank" href="https://doc.rolisteam.org/06_charactersheet/"&gt;https://doc.rolisteam.org/06_charactersheet/&lt;/a&gt;&lt;/p&gt;
&lt;h3 class="wp-block-heading" id="pdf-viewer"&gt;PDF viewer&lt;/h3&gt;
&lt;p&gt;The built-in PDF viewer, used for sharing handouts and rulebook excerpts with your players, has also received its share of polish this release.&lt;/p&gt;
&lt;iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/rRrQwUmLUp0" title="PDF viewer demo video" 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;p&gt;Watch it in action: &lt;a target="_blank" href="https://youtu.be/rRrQwUmLUp0"&gt;https://youtu.be/rRrQwUmLUp0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Documentation: &lt;a target="_blank" href="https://doc.rolisteam.org/20_pdf/"&gt;https://doc.rolisteam.org/20_pdf/&lt;/a&gt;&lt;/p&gt;
&lt;h3 class="wp-block-heading" id="translations"&gt;Translations&lt;/h3&gt;
&lt;p&gt;Thanks to the KDE translation teams, Rolisteam is now available in even more languages, with existing translations kept up to date release after release.&lt;/p&gt;
&lt;h2 class="wp-block-heading" id="refactoring"&gt;Refactoring&lt;/h2&gt;
&lt;p&gt;Under the hood, this release is the result of a massive modernization effort:&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
&lt;li&gt;&lt;strong&gt;Port to Qt 6&lt;/strong&gt; — the entire codebase now runs on the Qt 6 framework.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build system switched to CMake&lt;/strong&gt;, replacing the previous qmake-based setup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Websites migrated from self-hosting to KDE&amp;#8217;s infrastructure.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Websites migrated from the Pelican generator to Hugo.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source hosting moved from GitHub to KDE&amp;#8217;s GitLab.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class="wp-block-heading" id="quality"&gt;Quality&lt;/h2&gt;
&lt;p&gt;Code quality and long-term maintainability were a major focus of this release:&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
&lt;li&gt;&lt;strong&gt;70% of the code is now covered by unit tests.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;An extensive suite of validation tests now runs continuously to catch regressions early.&lt;/li&gt;
&lt;li&gt;Dedicated test coverage was added for the mind-map, the character sheet, translations, and the network layer.&lt;/li&gt;
&lt;li&gt;Continuous integration now tracks code coverage on every change.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class="wp-block-heading" id="a-huge-thank-you"&gt;A huge thank you&lt;/h2&gt;
&lt;p&gt;This release wouldn&amp;#8217;t have been possible without the community, the KDE translation teams, and everyone who reported bugs, tested pre-releases, and contributed code. Thank you!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Download Rolisteam v1.10 now:&lt;/strong&gt; &lt;a target="_blank" href="https://rolisteam.org/02_download/"&gt;https://rolisteam.org/02_download/&lt;/a&gt;&lt;/p&gt;</description><author>Renaud Guezennec</author></item><item><title>KDE snaps, Debian packaging adventures, and what's next</title><link>https://scarlettgatelymoore.dev/blog/kde-snaps-debian-packaging-update/</link><pubDate>Sun, 05 Jul 2026 00:00:00 +0000</pubDate><guid isPermaLink="true">https://scarlettgatelymoore.dev/blog/kde-snaps-debian-packaging-update/</guid><description>Updated KDE content snaps with Qt 6.11.1, KF6 6.27.0, and Applications 26.04.3, critical bug fixes, Debian packaging of Rust crates for Plasma 6.7.0, and what's on the horizon.</description><author>Scarlett Gately Moore</author></item><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 more easily find the System Settings page responsible for the “press and hold a key to see alternative characters” popup, to turn it on or off or change 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 went 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 in 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 is 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></channel></rss>