KDE Planet - Latest News

  • KDE at 30: What Are the Colored Blobs Telling Us? (2026/09/19 07:12)
    OK, it’s been a while since I blogged about community data analytics… I thought I’d do more posts on the matter but somehow never managed to get back to it. Now it’s a bit more than 6 years since my last post on the topic! Worry not though I didn’t loose touch. Indeed I still hone this skill professionally since it’s an excellent source of information to better target audits or to give better advice when consulting on software architecture. This is by the way exactly what my last post on the topic was about. But this is not what we’re here for today! Indeed, in a few weeks, KDE will turn 30 years old. This is impressive in terms of longevity for such a community. We’ve fostered a very diverse group, people are coming and going of course… So where does KDE stand? Are we looking at 30 more years or is it on a darker path? It took a quick look at how KDE has been growing and shrinking as part of a post about communities size and activity. It was a quick peek only (I needed to look at other communities too) and 8 years ago. Time to revisit it all and with more details! Time to brace yourselves, it shall be a somewhat long read, we have 30 years to explore, but more importantly we’ll look at several subcommunities separately. Choices, improvements, and caveats For this article I made a couple of choices. I decided to give the current article the same angle than the 2018 one about communities size and activity. So I won’t show some of the more advanced diagrams I can produce and will stick only to the easy to read “team size” diagram and the “activity” diagram (the beloved “colored blobs” diagram). For the latter, I also decided to anonymize the contributors, so no need to zoom to try to find your name, you won’t. I generally leave them when I’m doing more focused work since we mostly know who is working in a given team, but here I’ll be casting a very wide net and I don’t feel some people to feel uncomfortable because their name appears. Hopefully this should limit ego trips. Note however, that behind the curtain I did produce “contributor network” diagrams (more advanced, more expensive, harder to read) without anonymization. They won’t be included in the article, but if I happen to mention some people, it’ll likely come from prior knowledge that I validated through those diagrams. The last choice I made which deviates from previous explorations is how I map identities. I usually went for names and used manually curated rules to normalize such names. Some people are not really consistent there with sometimes three or more variations (looking at you Aleix 😉) hence those rules. Now doing this for all of KDE over 30 years… let’s say I didn’t have the time to update my rules this time around. Also, we’re having more company sponsored development nowadays so I decided to use emails. That means for instance that I represent two different contributors depending if I’m using my kde.org or my enioka.com email address. It doesn’t seem to skew too much the data, probably less than not having normalized names. For finer grained explorations it also helps figure out if a given contributor was doing something on company time or his own time (not everyone has that discipline but so be it). Now let’s talk about improvements compared to previous related articles. Roughly speaking I tended to look only at repositories with C++ in them: libraries and applications. This time, I changed how I built my corpus of repositories (the switch to GitLab made things easier too) and I’m covering as wide as I could. It’s important because we’re doing more packaging work nowadays and also we can get a glimpse to the sysadmin activity. But that’s also where lay the caveats… I didn’t include the kdelibs repository this time, to reduce chances of counting some of the commits happening during the KDE Frameworks transition twice. This means we’ll have the very early history missing and the one we have will be underestimated a bit. But from previous explorations this shouldn’t distort things too much or change the trends we’re going to see anyway. I double checked this by also running experiments with kdelibs included on the side so I’m not worried. It’s worth keeping in mind though as if you use a fine enough comb you might spot tiny discrepancies. Another problem to keep in mind is that I had to exclude the KDE Neon repositories. This is quite unfortunate but the majority of them started as forks coming from Debian or Ubuntu and so they pulled many commits unrelated to our community activity. The volume of those commits was unfortunately high enough that it’d completely skew the data at important points in time to have a readable history. Sadly I couldn’t figure a way to reliably sort between the commits to keep and the ones to reject hence why I left it completely out. Still it is something to keep in mind as well: later years are slightly underestimated. Hopefully not by much but I have no way to check. However the Snap packaging and KDE Neon Core efforts are included as those were easy to split from the rest. OK… with all those disclaimers out of the way time to look at the result. 30 years of KDE history First let’s take a look at the teamsize plot for the whole community. It is an updated version from my 2018 post. Back then it was the only one we looked at. Of course, keep in mind I did things slightly differently as explained in the previous section. [Full page version] What can we see here? (I recommend looking at the full page version for all the plots) First striking thing is a similar profile to the plot I did in 2018 for the 1997 to 2018 period. Which is good news: what I wrote in 2018 isn’t invalidated by the adjusted and improved method I used for data collection. Back then I noted that the active part of the community had been growing all the way to 2010 then started to shrink again. This is what we see, it peaks around 180 on average (and sometimes reaches towards around 200 people) then shrinks again hitting bottom around 110 persons on average in 2017. We had no definite answer about why we’d seen this decline. The best shot we had is work done by Paul Adams and presented at Akademy 2014 pointing out that the community cohesion started to drop around the same time. This kind of pointed to the switch to git which could have demotivated some of the existing contributors. Also we didn’t have a really good forge on top, so it was harder to have a consolidated view of what was happening in all of the repositories IMHO. Alright, but 2017 is almost ten years in the past… Since then, we had two major events happening. First, 2018 is the year where we had the first set of KDE Goals being picked by the community, one being “Streamlined onboarding of new contributors”. Second, we had the transition to GitLab which was fully delivered early in the second quarter of 2020. Interestingly, we see the team size starts to pick up again towards the end of 2017. This is around the same time as the beginning of the KDE Goal process leading up to the first set of goals being selected in November 2017. It is also when we worked on the KDE Vision refresh. Around this period we don’t see the commit count pick up though (the entry count line), the new people probably joining at the time don’t quite compensate earlier losses. Then later on, we see the team size growing again but this time the commit count is picking up too. It is between the end of 2019 all the way to mid-2020. Could it be helped by the GitLab switch? In any case, this is very good news, in my 2018 post I wonder if KDE would stabilize around the lower value of the time or pick up again… It definitely picked up again! Now it seems like the team size if around 140 people on average, so closer to the all time high of 2010 but we didn’t fully close the gap yet. Interestingly though, the commit count is much closer to the one we had in 2010, with a bit less people. We even had an all time high commit count in 2023 which surpassed any other week since the creation of the project. And to make things even brighter, the trends at the end of the plot point upwards. Looks like 2026 will be a very good year. Hopefully the growth will stay stable this time and then the community will be the biggest it’s ever been. Now let’s take another point of view. [Full page version] This is our activity plot for the whole history of all of KDE. This is our colored blobs, I won’t focus much on the colors this time, it just says we have some contributors who are constant outliers in their activity. It’s not news and I’m not going to point them out. Much more interesting is the shape of those blobs. The “bottom envelope” forms a curve and if we look at the angle it has, it is becoming more and more vertical. It’s not always the case we see some inflexion points if we zoom in, but on the whole history it definitely becomes steeper. Including towards the end of 2025 and through 2026 we see it changing again reinforcing the same trend. This means we’re seeing more and more new contributors. KDE is recruiting new contributors and does so faster and faster. But is it only drive by contributions or people staying for longer? This is were what’s on the other side of the curve, the actual blobs get interesting. If it’s not very dense and we see “lots of gray” it means people contribute a bit then stop. If it’s dense it means they’re staying around much longer or “forever”. To me, it started to get denser around 2019. So not only KDE is recruiting faster, but it’s retaining contributors for longer. It’s of course not at dense as in the early days but it’s likely the best you can do with such an old, large, and diverse community. So altogether, I would say that KDE is a community which struggled between 2010 and 2017. It shrunk in the process but has been recovering since then. It feels very strong right now and could surpass the all time high it had in the past if the conditions are right. There are first signs of this: more commits per contributor, recruiting more, and better retention. Looking a bit closer At least we established that the forest (the whole KDE) is likely healthy. It doesn’t tell us much about individual trees though. Even healthy forests have diseased trees and that’s OK. Still for our exploration I think it’s good that we reduce the scope a bit and look at sub-communities within KDE to see how they fare. KDE Frameworks [Full page version] Looking at KDE Frameworks the teamsize plot seems to tell a very different story than KDE as a whole. There are obvious similarities though. It’s mostly growth since the beginning and until 2010, the slope on that post is not as steep but remember the caveats. Since I didn’t include the kdelibs repository we miss some commits in the early history. We find the same dip starting in 2010, but there’s a first big difference. It rebounds strongly and much earlier! Around 2012 it picks up already and reaches all times high in 2014. There I immediately know how to explain it because I was right in the middle of it. We knew we were reaching the limits of the kdelibs model and in 2011 we had the Platform11 meeting. This is where we planned to turn kdelibs into KDE Frameworks. So for us a slow down in the kdelibs area was only natural we were busy making the necessary plans for the architectural transition. The transition itself began to be executed a bit later culminating in 2014 with the release of KDE Frameworks 5.0. Hence the new dip we see just after. Everyone was tired and things were getting back to normal. By 2015/2016 the activity level was already back to the activity level of 2010. This explains why I was kind of surprised by Paul’s talk in 2014… I was buried deep in KDE Frameworks and everything looked fine from there. Which leave us now with the period of the GitLab transition. When it’s fully in effect (2020) KDE Frameworks also grows just like the whole KDE community. It’s oscillating a bit but it looks like it stabilized there. [Full page version] On the side of the activity plot, we see an overall acceleration in recruiting since the very beginning but it has clear periods of slowing down. Towards the end we find the same profile than for the whole of KDE: it looks like it’s accelerating further in 2026. That being said in terms of retention, KDE Frameworks isn’t as good as KDE as a whole. But maybe it’s fine, it’s the base of all the projects and by its nature it likely attracts more drive by contributions than anywhere else in the community. We want to mutualize and that’s what people seem to be doing. This product is not very noisy and just happily churns along it seems. KDE PIM [Full page version] KDE PIM clearly has a more complicated history. It starts to mostly grow like the rest of KDE all the way to 2004 and then has a first clear dip in team size starting in 2004. It took three years to recover from it. I’m not sure what caused it… I wonder if it’s related to the great KMail maintainer war I hear about from time to time? It was before my time getting involved in KDE PIM. Anyway, once the project recovered in 2007 things seem to be going along well with even a small spike in team size and larger spike in commits around 2009. If my memory serve this is when KDE PIM had seen some serious funding last. Then it dives like the whole of KDE around 2010. It starts to pickup a bit again during the GitLab transition, but not as dramatically as the whole of KDE so something else must sustain that community wise increase. This is a common pattern for the whole of our applications by the way (I did plot it but didn’t include it here as this is already way too long). One reason to rejoice is the increase of both team size and commits building up in 2026. With some of my colleagues, we might have something to do with this and I’m fairly happy about it. It’s likely not the only factor of course, as I mentioned earlier it looks like 2026 will be a particularly good year for KDE as a whole. [Full page version] In term or recruiting and retention, KDE PIM is a bit at risk I’d say. Clearly there’s been a slow down in recruiting new contributors starting in 2015. It looks like it’s slowly getting better catching up to earlier times but it took ten years to get there and it’s too early to see if it’ll sustain it. In term of retention… let’s face it, it’s never been great nor improving. There’s a few individuals who stay around but not many. There’s clearly something pushing new contributors away preventing them to stay for long. For the nature of the product it raises questions. I have theories but no definitive answer so I won’t share them here. What’s sure is that KDE PIM needs more involvement going forward to be sustainable. Plasma [Full page version] Time to our flagship product: Plasma. The plots here include desktop, mobile, and big screen repositories. Note the very early history can’t be trusted, clearly it inherited commits from before Plasma was a thing. Anyway, in terms of team size it’s been almost constantly growing. We find the 2010 dip but it’s much less dramatic than in all the other plots. It stabilized much quicker and managed to stay with an almost identical team size. We also find the increase leading up to 2020. And clearly it’s one of the projects which benefitted the most of the GitLab transition. It’s average team size almost doubled during the transition! Earlier I asked where the increase we could see on KDE as a whole but not on applications was coming from? Well, this is probably it. Like the rest of KDE, 2026 will be a very good year for Plasma as well. I wonder… will it double in size again next year compared to 2020? [Full page version] Unsurprisingly recruiting is going well in Plasma if we look at the activity plot. Now the retention has been somewhat spotty, but clearly it’s improving: the density increases as we go down. Keep up the good work I’d say! KDE Linux [Full page version] Time to look at the new kid on the block: KDE Linux. There’s been a lot of PR and expectations around this one but keep in mind it’s still young (history starts in 2023). We don’t have many data points yet so it’s a bit more difficult to draw conclusions. Clearly so far it’s been growing in term of team size. This is good. That said, it is rather smaller than I’d expect from the exposure the project gets. This can be a good thing if it’s because we have a high impact team. But it can be a bad thing if it’s a sign of hyping things up before they’re truly ready to have a bigger team. Time will tell I guess. What worries me a bit more is that the commit count doesn’t seem to pick up as fast as the team size. Again, we need more data and history to be sure there is a problem. But I’m wondering if we’re seeing early difficulties to synchronize within the team which is eating away at what could be produced. It might be a sign of some growing pains having a hard time to make newcomers truly productive. [Full page version] The activity plot seems to go in the same direction as my questioning above. The project has been recruiting faster towards the end of 2025 and this year. At the same time its retention rather diminished it seems. It could be again a sign of newcomers not finding their place or simply only motivated by drive by contributions. Community wise it looks like KDE Linux is off to a good start but needs to strengthen its path on how to get involved. Conclusion This article turned rather longer than I anticipated, sorry about that! We had a quick tour through 30 years of commit data. I would have liked to also process merge requests but at this scale it’s very time consuming so maybe I’ll do it another time on something more focused. In any case, I’m rather happy that KDE as a whole seems very healthy. The last time I did such an exploration we left things undecided wondering if the community would ever recover from “the big 2010 dip in activity”. I would argue it did and with a few more years like 2026 we could expect to even go above the 2010 levels. We’re seeing early signs of it I think. As for the projects we explored, flagship products (KDE Frameworks and Plasma) are doing rather well, for the other ones… your mileage may vary, it depends where you look. KDE PIM clearly has long term challenges it needs to overcome while KDE Linux raises questions but nothing unsurmountable. For both there’s likely some community work to be done, something need to be done to have a better retention of contributors. I’d loved to also zoom in on Krita, Kdenlive, Elisa, etc. There are so many products in KDE! So it looks like in almost 30 years KDE built a great community and many awesome products. We’re really forming a large and diverse family. Like any large families it can get sometimes ugly or messy but keeping the ties matter. Kudos to all the people involved for the past 30 years! Even if you’re not involved anymore you helped contribute something beautiful and precious to the world. We’re the living proof that large commons can be created and made sustainable thanks to passionate people.
  • This Week in Plasma: Let the Polishing Begin (2026/09/19 00:00)
    Welcome to a new issue of This Week in Plasma! This week, Plasma folks shifted to bug-fixing and polishing work for Plasma 6.8. As of the time of writing, there are only four open regression reports for Plasma 6.8, which means either the release is already amazing, or people aren’t testing the beta release enough! You know what you need to do. :) Also, notice that we have bug fixes going into four concurrent Plasma releases right now. FOUR! That’s a lot of release management, but it seems like the Plasma team is up to the task! Notable UI improvements Plasma 6.7.6 System Settings’ Wi-Fi & Networking page now fully fits within the window at its default and minimum size. (Marco Martin, KDE Bugzilla #443553) Plasma 6.8 On KWin’s Overview effect, highlights for adjacent virtual desktops no longer touch. (Nate Graham, KDE Bugzilla #523656) Kup’s backup progress notifications now show the elapsed time, and average speed information is now more accurate. (Méven Car, kup MR #62) Did another few rounds of visual polish on KDE’s desktop portal dialogs to increase their information density and visual consistency. (David Edmundson and Oliver Beard, xdg-desktop-portal-kde MR #628 and xdg-desktop-portal-kde MR #630) Plasma 6.9 Renaming a file or folder on the desktop now shows all the standard warnings and confirmations when necessary. (Ramil Nurmanov, plasma-desktop MR #3684) The Weather Report widget now warns you when the weather provider you’ve chosen might report less data than you would expect. (Ismael Asensio, kdeplasma-addons #1127) In the Clipboard widget, buttons to invoke actions now only appear for entries that have actions associated with them. (Tomáš Hnyk, KDE Bugzilla #440727) On System Settings’ Wi-Fi & Networking page, the “speed” setting has been renamed to “speed limit” to clarify its purpose. (Fernando Marcelino Muniz, KDE Bugzilla #523099) Notable bug fixes PulseAudioQt 1.9.0 Fixed a very odd issue whereby multiple audio devices could end up in a “selected” state, making it unclear which device was actually the default one, and impossible to change it. (Harald Sitter, KDE Bugzilla #500968) Plasma 6.6.7 Fixed a bug that could make the login screen fail to appear if no screens were present early in the boot process, and connected later. (Oliver Beard, KDE Bugzilla #520720) Fixed a bug that could occasionally make Plasma crash on login, seemingly randomly. (David Edmundson, plasma-workspace MR #7042) Fixed an old bug that could make Plasma crash seemingly randomly when something made a System Tray item animate in just the right way at just the right time. (David Edmundson, KDE Bugzilla #487699) Fixed a recent regression that de-synchronized the brightness level shown in the System Tray widget and the brightness OSD. (Christoph Wolk, KDE Bugzilla #523281) Transition times for the Night Light feature are now shown correctly in the Brightness & Color widget when Night Light is configured to be always on. (Vlad Zahorodnii, powerdevil MR #678) Plasma 6.7.6 Fixed a bug that could occasionally make KWin crash when you returned to a game using Alt+Tab. (Vlad Zahorodnii, KDE Bugzilla #510116) Fixed a focus-related regression with Wine windows. (Vlad Zahorodnii, KDE Bugzilla #525590) The Clipboard widget no longer disappears from the System Tray when its panel is over 100px thick. (Tomáš Hnyk, plasma-workspace MR #7048) Plasma 6.8 Fixed a bug that could sometimes make KWin crash when interacting with titlebar buttons in very specific ways. (Vlad Zahorodnii, kwin MR #9926) Fixed a very weird bug that could make Plasma hang on login when the computer was connected to a monitor with a non-standard VCP range, such as the Samsung Odyssey G60SF. (Marco Martin, KDE Bugzilla #525216) Deleting three or more items at a time from the Menu Editor app no longer makes it crash. (David Edmundson, KDE Bugzilla #525598) Unit conversions in KRunner-powered searches now work in French. (Tobias Fella, KDE Bugzilla #510873) Plasma 6.9 When Plasma Browser Integration sends a notification about files downloaded using a Firefox-based browser packaged as a Flatpak, the file path that it shows is no longer garbled. (Bharadwaj Raju, KDE Bugzilla #524384) Made Plasma Browser Integration more robust at exporting album art from a compatible browser to the Media Player widget. (Takashi Kashiwagi, KDE Bugzilla #514788) Fixed a subtle incompatibility between Plasma’s Edit Mode and the popular Conky system monitoring widgets. (力文 胡, KDE Bugzilla #525792) Notable in performance & technical Plasma 6.8 Plasma no longer writes to a cache file every single time it displays a notification. (ValdikSS, KDE Bugzilla #523805) How you can help KDE has become important in the world, and your time and contributions have helped us get there. As we grow, we need your support to keep KDE sustainable. Would you like to help put together this weekly report? Introduce yourself in the Matrix room and join the team! Beyond that, you can help KDE by directly getting involved in any other projects. Donating time is actually more impactful than donating money. Each contributor makes a huge difference in KDE — you are not a number or a cog in a machine! You don’t have to be a programmer, either; many other opportunities exist. You can also help out by making a donation! This helps cover operational costs, salaries, travel expenses for contributors, and in general just keeps KDE bringing Free Software to the world. To get a new Plasma feature or a bug fix mentioned here Push a commit to the relevant merge request on invent.kde.org.
  • Web Review, Week 2026-38 — The Graz Edition (2026/09/18 12:50)
    Made it to Graz for Akademy 2026. Looking forward to meeting my fellow gearheads. In the meantime, let’s go for my web review for the week 2026-38. 25 Years of Mass Surveillance Is Enough Tags: tech, surveillance, politics, democracy This essay is fairly US centric but since other countries used the US surveillance apparatus as a blueprint for their own it’s widely applicable. It’s 25 years of failures and constitutional hazard, maybe it’s time to finally respect the right to privacy? Or are our governments too hooked to controlling the population and hunting dissent? https://www.lawfaremedia.org/article/25-years-of-mass-surveillance-is-enough What kind of Software should we fund? Tags: tech, foss, fundraising, supply-chain, ethics, business The article it refers to is interesting as well of course. Still it shines a crude light on the biases it has. We might have a way to fund libraries available via registries. That’s a good thing… But it ignores a lot of what Free Software is about. We need solutions for more software than just a specific family of libraries. https://tante.cc/2026/09/17/what-kind-of-software-should-we-fund/ Inside ‘Project Lily’: The Humans Reading Your ChatGPT Chats Tags: tech, ai, machine-learning, gpt, surveillance Of course unsurprising. Still it’s important to get the proofs out. https://www.404media.co/inside-project-lily-the-humans-reading-your-chatgpt-chats/ ‘Doom Loop’: OpenAI and Microsoft Admits LLMs Are Destroying the Web and Built on Theft Tags: tech, ai, machine-learning, gpt, ethics, copyright They claim fair use in public court but they know full well what they’ve been doing. https://www.404media.co/doom-loop-openai-and-microsoft-admits-llms-are-destroying-the-web-and-built-on-theft/ Be alert: targeted attacks on prominent Rustaceans Tags: tech, rust, supply-chain, security Bad actors clearly want to compromise supply chains. Stay safe and keep your eyes open. https://blog.rust-lang.org/2026/09/17/targeted-attacks/ what if my git host were a static site generator? Tags: tech, tools, git, self-hosting Looks like an interesting tool to expose git repositories read-only on the web. https://char.lt/blog/2026/09/sorcery-repo-viewer/ A Design Space Exploration of Async/Await Tags: tech, asynchronous, reliability You think async/await works in the same way across languages? Think again! There are several choices of implementation behind it. You better know which choices your particular runtime did, otherwise you will get surprises. It also means it’s harder to reuse language from a given runtime and carry it over somewhere else. Of course I recommend reading the full paper, but this short summary gives a good idea of the content. https://cel.cs.brown.edu/blog/design-space-async-await/ How fast is C++23’s std::flat_map? Tags: tech, c++, data, performance Indeed it’s a very good new type of maps in many cases. Again a good illustration that nowadays memory layout is often more important than algorithmic complexity. https://lemire.me/blog/2026/09/16/how-fast-is-c23s-stdflat_map/ C++26: Trivial infinite loops are no longer undefined behaviour Tags: tech, c++, reliability, safety It’s about time that it got fixed… This was really a language defect. https://www.sandordargo.com/blog/2026/09/16/cpp26-trivial-infinite-loops How to Recognize a Change in Capacity to Stop Pressure Tags: management, productivity Doesn’t feel too actionable on how to detect the change of capacity. That said the advice on how to deal with it is correct. https://www.jrothman.com/mpd/2026/09/management-minute-how-to-recognize-a-change-in-capacity-to-stop-pressure/ Clear as Mud Tags: management, delegation A few things to keep in mind when delegating tasks. This seems trivial but it’s harder than it sounds. https://managementblog.org/2026/08/28/clear-as-mud/ Proper English is a Myth: There’s No ‘Correct’ Way to Write Tags: linguistics, writing I’d say it goes a bit too far in its stance at times. That said it’s a good reminder that English like any other languages is in a constant state of flux. https://brennan.day/proper-english-is-a-myth-theres-no-correct-way-to-write/ Bye for now!
  • Canvas2D: New QML canvas element using Qt Canvas Painter (2026/09/18 08:12)
    In the earlier blog posts about Qt Canvas Painter we have looked at what it is, the new rendering features it brings, how fast it is compared to QPainter, and how path caching makes even a million line segments render smoothly. All of those earlier blog posts used the QCanvasPainter C++ API. At the end of the path caching post I teased that a QML element was coming, and it is here now: Canvas2D, available in Qt 6.12.
  • Meet Marknote's New Block Editor (2026/09/17 18:30)
    About Block Editors A block editor is an easy to use rich text editor which treats every component of your text as a block. You may be familiar with apps like Notion and the editor you see there is exactly that. A block editor allows you to easily re-order your components and make your editing workflow feel more interactive. Most block editors that you will see online support a subset of CommonMark’s features such as headings, lists, quotes, and tables which makes editing even more seamless. Why? Traditional text editors feature one continuous text field for you to write down content. This is fine if you need simple formatting and do not need frequent rearrangement. However, if you need structured and extensible content, reusable components, easy rearrangement, and better pragmatic control, block editors are an excellent choice. Marknote has been a popular note taking app for Linux for a few years now. It supported a subset of Markdown in edit mode and Qt’s built-in markdown parser that’s present in the TextArea QML component to load markdown files. This means that markdown parsing was handled in two separate ways, when you launch Marknote, Qt’s built-in markdown parser would render the content, but when you edit the document in real time, a bunch of pattern matching rules decided how to auto-transform the current text into formatted text. For example, rules like “Is the current word surrounded by asterisks (*)?”. These rules worked fine for simple use cases, but they introduced unhandled edge-cases and were very hard to extend and maintain. Marknote’s New Block Editor Your browser does not support the video tag. This is Marknote’s new block editor. It supports the full CommonMark spec, powered by KDE’s new markdown parser known as md4qt . It supports everything you might expect from a markdown editor and more. You can drag-and-drop component anywhere you want. It features an easy to use command prompt which you can invoke by pressing slash (/) on your keyboard. You can see it in action in the video above. Challenges Implementing this block editor was challenging yet fun. The first challenge was to render nested components in QML. This challenge and how I solved it is described in detail here . After this, I was able to easily render markdown documents using nested QML components. The next challenge was to allow editing those blocks. Editing Blocks MD4Qt parses markdown in the form of abstract syntax trees (ASTs). You can traverse the tree, modify it, or delete nodes from it. What I needed was a way to edit the text content. When you edit a block in realtime, parsing its markdown content on every keystroke is not a good idea because of potential performance issues. This is why, the block editor is implemented this way: you will see the raw markdown of the paragraph block you’re currently editing. Only when the current block goes out of focus (by switching to another block or pressing Esc), the content will be parsed. This means you can paste an entire markdown document in a block and it will easily expand into blocks as if you had pasted actual blocks! Auto transformation for blocks based on very simple rules is still present. For example, you can create headings by pressing one or more times # followed by a space. These are only a handful of rules so there aren’t any edge cases. Editing Blocks Demo Implementing Tables Tables are very complex in nature. Each table has multiple rows and columns, which means multiple text fields. I took inspiration from other block editors here. Each table is just one block. It can not have nested blocks inside it. This made it easier to implement them. In the old editor, tables were very simple. They didn’t have any controls to delete or modify rows. Since each component here is designed in QML, I had a lot of flexibility in how I want the tables to look and be controlled. So each table now has buttons to insert and delete rows and columns. I’ll soon also add the ability to drag and drop table columns and rows. Table Demo Drag and Drop The next challenge was to implement drag-and-drop. Since markdown can become complex with its nesting features, I needed a way to make sure it feels very natural. The most important thing was to place the drag handle in a place which does not make it look awkward. Since blocks can be nested, each nested block had to have its own drag handle. Most block editors either don’t support nested blocks or the ones which do, do not allow dragging them when they’re nested. I wanted both, so after many trials, I made the handles invisible at first. When you hover over a block, you will see its drag handle, and when you hover over the drag handle, the entire block shifts a little towards the right, clearly indicating which part of the block you’re about to drag (which is essential to know here because of nesting). I immediately liked this way of doing it so I stuck with it. Implementing the remaining logic was pretty straightfoward with QML’s DropArea and DragHandler elements. Drag and Drop Demo Fixing Existing Features Marknote had a good list of features implemented by many different contributors, for example, search and replace, a table of contents drawer, source mode, GUI formatting controls, internal note links, and an emoji picker. These are strictly tied to the old text editor. Fixing them required understanding the old code and making them work with the new editor. For some features like search and replace, I had to go with workarounds due to lack of enough time. Searching within the block editor works as intended, however, when you open the replace field as well, you will be moved to the source mode which contains the raw markdown of the file. I have plans to change this behavior in the future, but it does the job for now. Conclusion This project was part of my Google Summer of Code 2026 project. I had a lot of fun implementing it and learned a lot. I’m very grateful to my mentors Carl Schwan and Mathis Brüchert for their support in the development of the block editor. My plans are to continue working on Marknote to make it the best note taking app on Linux. I’m also involved in other KDE projects such as Drawy and am planning to contribute to Plasma as well as I recently switched from Hyprland to KDE Plasma and have been loving the convenience it provides. I believe the KDE ecosystem is the future of Linux and I want to contribute to it as much as I can. Thanks for reading this blog. As always, no AI was used to write this blog and all words are my own.
  • A Cross-Platform C# UI Framework via Qt’s Bridging Technology (2026/09/17 15:45)
    Every C# UI framework comes with a familiar pattern: Windows-first, Linux absent, roadmap uncertain. WPF stalled, MAUI skipped Linux, WinUI 3 stays Windows-native. At the same time, demand for embedded Linux grows and C# teams feel the lack of good UI alternatives for C# on Linux. Qt Bridges, a bridging technology in public beta for C#, provides access to a UI framework that allows preserving your existing C# codebase while utilizing Qt Quick’s feature-rich UI libraries and APIs, hardware acceleration, and cross-platform capability.
  • Imprint 1.0 and Kirigami Addons 1.14.0 (2026/09/17 15:00)
    Happy to announce a new version of Kirigami Addons, as well as the first version of my new app: Imprint. Kirigami Addons is a collection of many useful modules for your QML and Kirigami applications, and Imprint is a new PDF editor. Let’s start with the more user facing of the two. Imprint 1.0 Imprint is a very basic PDF editor. Right now it allows you to merge multiple PDFs together; re-order, remove or delete pages; and add or remove password protection. There are also ways to modify a single PDF page, by for example cropping it. Or adding basic annotation: Additionally, all actions made in Imprint are based on commands which are undoable. On the technical side, I use both Poppler and QPDF. Poppler is used for rendering the PDF, and QPDF is used for editing the raw PDF. The annotations for the editor use the new QtCanvasPainter module from Qt, which is great as it allows moving most of the code to C++. For now, this really provides the foundation of a powerful PDF editor and in the future I hope to be able to come near feature parity with proprietary apps like iLovePDF. I expect as always to release another version soon with a lot of bugfixes :) Kirigami Addons 1.14.0 As always when working on a new application, this is the occasion to improve Kirigami Addons even more :) FormCard The FormCard modules received a new component FormDelegateCollapsible contributed by Robert French. As the name indicates, it allows you to make a section of a FormCard collapsible. Another improvement is that any FormCard delegate can now be injected into a FormGridContainer. FormCard.FormGridContainer { FormCard.FormButtonDelegate { text: "Open" description: "Open a document" } FormCard.FormSwitchDelegate { text: "Enable sync" } } Since KAboutData was extended with more data that application developers can provide, the AboutPage component was also extended in terms of the data we display to the user. We now support Mastodon and Matrix links, and when clicking on the application name, we display the changelog. This module also received numerous performance improvements based on the results of qmlprofiler and I did some internal refactoring to take advantage of newer Qt/QML APIs (e.g. LayoutItemProxy). Actions The actions modules of Kirigami Addons also received numerous updates to cover the cases of a document editor like Imprint. The biggest change is that there is now a QML API in addition to the existing C++ API; that there is a way to define and render menus; and a way to add context to an action, so that a group of actions is enabled or not depending on a state (e.g. document open, document modified, one page selected, multiple pages selected). Packager section You can find the package on download.kde.org (kirigami addons) and it has been signed with my GPG key. For Imprint, it is for now a personal project not part of KDE, and you can find a tarball (checksum: 1b44d0f138ac175dc13cb00cef5740336f006b2a4dd4737266938278408bd34f) on this website and it is also signed (checksum: 70073cb71f970e94a5d3c7dd4dba6dc5c17a0d19b331a1556e739dc91f748994). Akademy 2026 I am also going to be at Akademy, but this time only for the weekend as I am afterward taking the sleeper train on Sunday evening to get back to Berlin in the morning for the Nextcloud Community Conference.
  • QML and C# without C++: Qt Bridge for C# 0.4.0 Beta Released (2026/09/17 14:32)
    As part of the on-going development of Qt Bridges, and beyond the two Beta versions already released, we've continued to add new features to the C# bridge, and we're now announcing the release of a new Beta version 0.4.0. The highlight of this release is the possibility to develop C# + QML applications without the need for a C++ compiler. This means that C# developers can now take full advantage of Qt’s UI framework capabilities while keeping their familiar development workflow. Other features that we've added in this release include support for macOS and Windows on ARM.
  • Oxygen 6.8 – more polish for KDE’s classic theme (2026/09/17 09:47)
    The big KDE Plasma 6.7 release ushered in the summer. Now, as summer draws to a close, a new 6.8 release is cooking, due to arrive in about a month's time. Most of the development is done at this point, and we have a few changes to report for our classic Oxygen theme that you...... Continue Reading →
  • KDED refactoring Progress Update! (2026/09/16 13:18)
    The past couple of weeks moved on to the other half of the editor work- the kded dialogs that pops up on NetworkManager's behalf - the secret prompt, the SIM PIN dialog, the mobile broadband wizard. Why this needs doing The Connection Editor isn't the only place libs/editor gets used. kded's network management module runs as NetworkManager's secret agent: whenever NetworkManager needs a password, a PIN, or a fresh mobile broadband connection, it asks the agent, and the agent has been popping up a QDialog ever since. PasswordDialog asks for Wi-Fi/PPP/VPN secrets, PinDialog unlocks a SIM, MobileConnectionWizard walks through adding a GSM/CDMA connection when you plug in a modem or pair a Bluetooth phone for DUN. All three are widgets, and the VPN half of PasswordDialog reuses the same VpnUiPlugin-returning-a-QWidget mechanism the editor already moved off of. The straightforward half The new module is kdedqml, structured the same way editorqml was: a small set of QObjects and a PromptWindow that hosts whichever QML file they back. kdedqml/ ├── passwordprompt.cpp / .h secrets for a plain setting or a VPN ├── pinprompt.cpp / .h SIM PIN/PUK unlock ├── mobilewizard.cpp / .h GSM/CDMA connection wizard ├── promptwindow.cpp / .h hosts one QML file + one backing QObject └── qml/ ├── PasswordPrompt.qml ├── PinPrompt.qml └── MobileWizard.qml PromptWindow is the one new idea here, and it's deliberately dumb - give it a QUrl and a QObject, and it loads the QML file into a QQmlApplicationEngine, exposes the object as a context property named prompt, and shows the window. Every one of the three prompts is just "construct the backing object, hand it to a PromptWindow": m_promptWindow->show(QUrl(QStringLiteral("qrc:/plasma-nm/kdedqml/qml/PasswordPrompt.qml")), m_dialog); PasswordPrompt itself does the boring 90% of the work first: it duplicates what PasswordDialog already did for plain secrets (Wi-Fi retry messages, WEP/WPA key validation via NetworkManagerQt rather than a regex, the same rule as last time) and, for VPNs, reuses the AuthSetting classes the editor already has: if (shortName == QLatin1String("ssh")) { m_vpnAuth = createAuth<SshAuthSetting>(hints, this, vpnSetting, m_vpnSecrets); } else if (shortName == QLatin1String("sstp")) { m_vpnAuth = createAuth<SstpAuthSetting>(hints, this, vpnSetting, m_vpnSecrets); } ... createAuth constructs the setting and calls loadSecrets(), just pointed at secrets instead of full config. Ten VPN types wired up this way, and PasswordPrompt.qml picks the matching Auth.qml from the editor with a Loader switching on service type, exactly like the editor's own VPN page switches on it. The half that is actually interesting OpenConnect doesn't fit that shape at all, because it was never really a settings-and-secrets dialog. The widget version, OpenconnectAuthWidget, runs a whole login session: it drives libopenconnect on a worker thread, and the C library calls back into Qt synchronously to ask for a login form, validate a server certificate, or open a browser for single sign-on - and it expects an answer before it returns, because it's still in the middle of openconnect_obtain_cookie(). The trick the widget uses, and the one I had to keep, is that the callback doesn't wait on the GUI thread's answer via a blocking Qt connection. It emits a signal, then blocks itself on a QWaitCondition: int OpenconnectAuthWorkerThread::validatePeerCert(void *cert, const char *reason) { ... bool accepted = false; m_mutex->lock(); Q_EMIT validatePeerCert(qFingerprint, qCertinfo, qReason, &accepted); m_waitForUserInput->wait(m_mutex); m_mutex->unlock(); ... } The worker thread is asleep inside wait(), so the bool *accepted pointer it handed across threads stays valid for however long the GUI takes to answer - which for a modal QDialog::exec() was instant, but for a QML dialog the answer only comes back later, from a separate button click. So OpenconnectAuth (the new QML-facing class) splits every one of these callbacks into two halves: the slot that receives the signal just records the state and returns immediately, and a separate Q_INVOKABLE - acceptCertificate(), submitForm() - does the actual wakeAll() once the user has answered: void OpenconnectAuth::acceptCertificate(bool accept) { *m_certAcceptedPtr = accept; ... m_mutex.lock(); m_workerWaiting.wakeAll(); m_mutex.unlock(); } Everything else - the dynamic login form built from oc_auth_form, the "changing the group re-submits" behaviour, the SSO web login - is the same worker thread, copied unchanged, talking to a QML WebEngineView instead of a QWebEngineView widget. The two share the same underlying Qt WebEngine types (QWebEngineLoadingInfo, QWebEngineCookieStore, QWebEngineWebAuthUxRequest), so the bridge is mostly mechanical - a WebEngineView.onWebAuthUxRequested handler calling straight into the existing OpenconnectWebAuth helper from the editor's SSO work. Wiring it together secretagent.cpp picks between PasswordDialog and PasswordPrompt with a type alias behind HAVE_KDEDQML, so the rest of the file barely changes: #ifdef HAVE_KDEDQML using SecretsPrompt = PasswordPrompt; #else using SecretsPrompt = PasswordDialog; #endif The one real change is that closing a prompt used to be m_dialog->deleteLater() scattered across cancel, reject, and kill paths; those all go through one closePrompt() now, which also closes the shared PromptWindow if there is one. bluetoothmonitor.cpp and modemmonitor.cpp get the same treatment for the mobile wizard and the PIN dialog - and the PIN one loses something along the way: it no longer calls QDialog::exec(), so unlocking a SIM doesn't block kded on a nested event loop anymore. OpenConnect gets one more property on top of that, selfDriven, because the worker thread accepts the dialog itself once it has a cookie - there's no Ok button to press, only Cancel: standardButtons: prompt.selfDriven ? QQC2.DialogButtonBox.Cancel : QQC2.DialogButtonBox.Ok | QQC2.DialogButtonBox.Cancel Same BUILD_EDITORQML flag as before, just gating one more directory now. What is left The mobile broadband wizard, PIN prompt, and OpenConnect are all wired up now. What's left is test coverage for the new kdedqml classes, and the actual port to Plasma Mobile, since PromptWindow and the three prompts were built with a phone-sized layout in mind but haven't been run on one yet. HAVE_KDEDQML and HAVE_OPENCONNECT both mean the widget path is still there, on purpose - nothing gets to come out until the QML path has actually been exercised end to end, tests included. And this was only the kded side; the applet's Handler::showConnectionEditor() still opens the widget ConnectionEditorDialog directly for WPA-Enterprise networks it can't join with a password alone, which is the other loose thread from last time and still isn't pulled. Thanks, see you soon.
  • I'm Going to Akademy! (2026/09/15 21:00)
    It’s been 7 years since I last posted such a banner, and just today I remembered how I was always excited about this kind of posts, so here we go. I’ve also been to Akademy in W√ºrzburg 2 years ago, but didn’t post the banner for some reason (silly me!). I haven’t really contributed to KDE for quite a while, but Akademy is always worth attending, even just to meet old friends again and make some new ones. Plus this year is KDE’s 30th birthday. KDE has been such a huge part of my life, so I am not going to miss such an anniversary. Can’t wait to see you all in Graz soon!
  • Krita 5.3.4 Released! (2026/09/15 00:00)
    Today we're releasing Krita 5.3.4 and 6.0.4, containing many bugfixes and improvements across the board. It also finally brings video exports to Android, which means you can now render animations and timelapses from the recorder. Apart from that, Arkady Flury has been improving Krita's icons at a steady rate. Thanks! Also of note: the GIMP XCF file import plugin has been removed. The plugin relied on a third party library that is no longer maintained and had many security issues. Changelog Don't allow to record images that are too big (2^29spixels) Fix recorder export when some frames are missing Disable long-press on canvas widgets (Bug 525361) Fix layer thumbnails scaling when using display scaling Fix openening large exr files Fix writable resource path validator (Bug 521186) Fix channel flags when converting the image's color space Fix a rare crash when creating a new image on Windows (happens when the user holds a key while creating the image) Fix a crash when a python plugin specifies an invalid action path Fix resetting native touch gestures on configuration change Fix issues with adding resource bundles and resources on Android Fix a crash when "First Frame" shortcut is used when a file with a linked audio track is open. (Bug 524212) Fix the recorder interrupting using tools (Bug 488472) Fix potentional crashes with some fonts (Bug 523857) Do not warn the user about active global selections masks when exporting a file The comic manager plugin received several fixes for memory leaks and improved epub export Support to render animations and export timelapses on Android. Additional bundles in the Android supporter subscription: the latest SK3 pencil bundle, as well as the earlier SK1 and SK2 bundles. ⚠️ Warning We consider Krita 5.3.4 suitable for productive work; 6.0.4 is, because of the many changes from Qt5 to Qt6 more experimental. Download 5.3.4 Windows If you're using the portable zip files, just open the zip file in Explorer and drag the folder somewhere convenient, then double-click on the Krita icon in the folder. This will not impact an installed version of Krita, though it will share your settings and custom resources with your regular installed version of Krita. For reporting crashes, also get the debug symbols folder. ⓘ Note We are no longer making 32-bit Windows builds. 64 bits Windows Installer: krita-x64-5.3.4-setup.exe Portable 64 bits Windows: krita-x64-5.3.4.zip Debug symbols. (Unpack in the Krita installation folder) Linux Note: starting with recent releases, the minimum supported distro versions may change. On Wayland, Krita is only tested against KDE Plasma's KWin. Other compositors may not be fully compatible. ⚠️ Warning Starting with recent AppImage runtime updates, some AppImageLauncher versions may be incompatible. See AppImage runtime docs for troubleshooting. 64 bits Linux: krita-5.3.4-x86_64.AppImage MacOS ⚠️ Warning With Krita 5.3.4 release minimum supported MacOS version has increased from 10.14 (Mojave) to 10.15 (Catalina) MacOS disk image: krita-5.3.4-signed.dmg Android Krita on Android is still beta; tablets only. 64 bits Intel CPU APK 64 bits Arm CPU APK 32 bits Arm CPU APK Source code Source code is the same as 6.0.4. See the 6.0.4 section. md5sum For all downloads, visit https://download.kde.org/stable/krita/5.3.4/ and click on "Details" to get the hashes. Key The Linux AppImage and the source tarballs are signed. You can retrieve the public key here. The signatures are here (filenames ending in .sig). Download 6.0.4 Windows If you're using the portable zip files, just open the zip file in Explorer and drag the folder somewhere convenient, then double-click on the Krita icon in the folder. This will not impact an installed version of Krita, though it will share your settings and custom resources with your regular installed version of Krita. For reporting crashes, also get the debug symbols folder. ⓘ Note We are no longer making 32-bit Windows builds. 64 bits Windows Installer: krita-x64-6.0.4-setup.exe Portable 64 bits Windows: krita-x64-6.0.4.zip Debug symbols. (Unpack in the Krita installation folder) Linux Note: starting with recent releases, the minimum supported distro versions may change. ⚠️ Warning Starting with recent AppImage runtime updates, some AppImageLauncher versions may be incompatible. See AppImage runtime docs for troubleshooting. 64 bits Linux: krita-6.0.4-x86_64.AppImage MacOS Note: minimum supported MacOS may change between releases. MacOS disk image: krita-6.0.4-signed.dmg Android Krita 6.0.4 is not yet functional on Android, so we are not making APK's available for sideloading. Source code krita-6.0.4.tar.gz krita-6.0.4.tar.xz md5sum For all downloads, visit https://download.kde.org/stable/krita/6.0.4/ and click on "Details" to get the hashes. Key The Linux AppImage and the source tarballs are signed. You can retrieve the public key here. The signatures are here (filenames ending in .sig).
  • KDE e.V. is looking for a Software Infrastructure and Continuous Delivery Engineer (2026/09/14 00:00)
    KDE e.V., the non-profit organisation supporting the KDE community, is looking to hire a Software Infrastructure and Continuous Delivery Engineer to help improve our infrastructure that the KDE community relies on. Please see the call for proposals for more details about this contract opportunity. We are looking forward to your application. The full call for proposals has more details.
  • This Week in Plasma: 6.8 Beta Release! (2026/09/12 00:00)
    Welcome to a new issue of This Week in Plasma! This week we released a beta of Plasma 6.8, and it’s ready for testing. Before branching, the team landed a lot of great improvements to make sure it’s an awesome release. Check it out: Notable new features Plasma 6.8 The Kup backup system has moved to Plasma! That means it will get regular releases, and we’re encouraging OS developers to start including it. It really works very well for off-device backups. Notable UI improvements Plasma 6.6.7 Discover once again shows Snap versions of apps in the source selector menu rather than as separate apps. (Gabriel Kuznik, KDE Bugzilla #519204) Plasma 6.8 The clipboard’s settings for how to handle copied image data and “MIME actions” are now a lot more comprehensible. (Tomáš Hnyk, KDE Bugzilla #348932, KDE Bugzilla #502274, and KDE Bugzilla #473882) New Old Changing the volume really quickly no longer causes irritating-sounding popping noises in the volume level preview sounds. (Jeremy Senkiw, plasma-pa MR #424) On the lock and login screens, clicking the “Show On-Screen Keyboard” button (renamed from “Virtual Keyboard”) now always shows the keyboard as you would expect, irrespective of its typical visibility settings. (Kristen McWilliam and Nate Graham, KDE Bugzilla #467209 and plasma-workspace MR #7044) The Input Method widget has been somewhat similarly overhauled. Now it’s primarily used to switch between on-screen keyboard visibility modes, but also lets you manually show the keyboard while an XWayland-using app is focused, because these apps don’t have support for making the keyboard appear automatically. (Kristen McWilliam, plasma-workspace MR #6876) The Kickoff Application Launcher widget is now always big enough by default to fully accommodate all items in its sidebar, rather than sometimes being scrollable — occasionally by even just a few pixels, which was fairly silly. (Christoph Wolk, KDE Bugzilla #515175) Notifications’ speed graphs now have better axis label padding. (Méven Car, plasma-workspace issue #151) Spectacle no longer shows a weird and misleading message about successfully copying the image to the clipboard after you use the “Share…” feature to share the image elsewhere. (Tobias Fella, spectacle MR #586) Improved the keyboard navigation behavior of the Digital Clock widget’s calendar view. (Christoph Wolk, plasma-workspace MR #6900) On System Settings’ Quick Settings page, the list of frequently-used pages is never just empty; now it shows a default set until you’ve used the app enough so that it knows what pages you frequently use. (Tobias Fella, KDE Bugzilla #522711) Changed the percentages shown on the Power & Battery widget to use fixed-width “tabular numerals”, so other UI elements don’t slightly jump around as the numbers change when using some fonts. (Christoph Wolk, powerdevil MR #674) If you have multiple panels with System Tray widgets on them, clicking the “Show Notifications” button on the “You missed some notifications” notification now only opens the notification history widget on the first/main panel. (Ameen Al-Asady, plasma-workspace MR #7028) In the Clipboard widget’s history view, the inline buttons for the selected item now only appear when it’s hovered or when any of the buttons have keyboard focus. This makes it possible to make the buttons disappear so you can read all of the selected item’s text. (Christoph Wolk, KDE Bugzilla #520130) Reduced a bit of awkwardness in the way you rename audio devices. (Tomáš Hnyk, KDE Bugzilla #508211) Notable bug fixes Plasma 6.6.7 Fixed a really weird bug in the Kickoff Application Launcher that could make phantom representations of apps in one category appear in other categories after you scrolled around there for a bit and then switched to the other category. (Christoph Wolk, KDE Bugzilla #515229) Plasma 6.7.6 Fixed a weird bug that prevented moving focus from the password field of a network shown in the Networks widget back up to the widget’s search field. (Christoph Wolk, KDE Bugzilla #525321) Plasma 6.8 Plasma no longer crashes if you query the wallpaper using D-Bus while the wallpaper settings dialog was open, and then switching wallpaper plugins. (Alperen Yildiz, KDE Bugzilla #525207) Copying text in LibreOffice apps now adds it to the persistent history every single time, rather than only every other time. (Tomáš Hnyk, KDE Bugzilla #519510) Middle-click-pasting text that was selected in a non-Qt-based app into a Qt-based app now works every time, rather than every other time. (Tomáš Hnyk, KDE Bugzilla #506325) Fixed an issue that could make some tool settings in Spectacle’s full-screen annotation UI appear off-screen. (Mirko Laruina, KDE Bugzilla #524499) Fixed an issue that could leave the wallpaper previews in the Activity Switcher sidebar all black, instead of showing the wallpaper. (Nicolas Fella, KDE Bugzilla #378693) An invalid XWayland configuration file inside /etc/xdg/Xwayland-session.d/ no longer prevents KWin from launching XWayland at all. (Ilya Katsnelson, kwin MR #9894) Entering and exiting full-screen mode no longer makes Task Manager tasks’ “I’m playing audio right now” indicators disappear or get stuck in a partially transparent state. (Christoph Wolk, KDE Bugzilla #522471) Frameworks 6.31 Fixed a bug that made the “Frames and Outlines Contrast” theme setting not take effect in certain apps where it was expected to work. (Akseli Lahtinen, KDE Bugzilla #525364) Manually setting your home folder to “Indexed” on System Settings’s Search page no longer creates an un-removable clone of that entry. (Nicolas Fella, KDE Bugzilla #487212) Qt 6.11.1 Fixed a serious QML issue that could make QML-based UIs break with nonsensical property errors. (Fabian Kosmale, Qt bug #149607 and Qt bug #146886) Notable in performance & technical Plasma 6.8 KWin has gained support for the commit_timing Wayland protocol. (Xaver Hugl, KDE Bugzilla #513283) Remote desktop connections now benefit from even lower latency. (David Edmundson, krdp MR #237) Gear 26.12 System Settings’ KDE Wallet page has been ported to QML. (Nicolas Fella, kwalletmanager MR #78) How you can help KDE has become important in the world, and your time and contributions have helped us get there. As we grow, we need your support to keep KDE sustainable. Would you like to help put together this weekly report? Introduce yourself in the Matrix room and join the team! Beyond that, you can help KDE by directly getting involved in any other projects. Donating time is actually more impactful than donating money. Each contributor makes a huge difference in KDE — you are not a number or a cog in a machine! You don’t have to be a programmer, either; many other opportunities exist. You can also help out by making a donation! This helps cover operational costs, salaries, travel expenses for contributors, and in general just keeps KDE bringing Free Software to the world. To get a new Plasma feature or a bug fix mentioned here Push a commit to the relevant merge request on invent.kde.org.
  • Web Review, Week 2026-37 (2026/09/11 15:47)
    Let’s go for my web review for the week 2026-37. Making Social Media Social Tags: tech, fediverse, social-media, community Interesting approach. When friction to subscription is a good way to really build community. https://tante.cc/2026/09/10/making-social-media-social/ Automattic CEO Matt Mullenweg Put on ‘Leave of Absence’ Tags: tech, blog, wordpress, business Looks like the drama continues. I wonder where this will land. https://www.404media.co/wordpress-automattic-ceo-matt-mullenweg-put-on-leave-of-absence/ Doomscrolling ourselves to death Tags: tech, book, reading, tv, social-media, attention-economy, politics, history The argument presented is maybe a bit too mechanical for my taste. That said there’s indeed something to be said about the decline in literacy and its consequences on our societies. https://www.edwest.co.uk/p/doomscrolling-ourselves-to-death Tristan Buckmaster’s statement on the Navier-Stokes resolution Tags: tech, ai, machine-learning, gpt, mathematics, ethics, science Shows some insights into the kerfuffle around the Navier-Stokes recent resolution. The behavior of OpenAI in this affair is ludicrous. In my opinion this is showing research malpractice… Why care about the scientific method when you have a shot at good PR? https://cims.nyu.edu/~tristanb/statement.pdf The function of LLM-based math “proofs” Tags: tech, ai, machine-learning, gpt, mathematics, research, science Is it badly conducted research for PR purpose? Who would have expected anything different? I wish we’d fund real science instead… https://tante.cc/2026/09/07/the-function-of-llm-based-math-proofs/ Soft-deprecating re.match() Tags: tech, api, python Interesting way to deal with deprecation in Python. Indeed sometimes it doesn’t hurt to keep the not so ideal old name… but you want to push user code to know they miss an opportunity in readability by using the old name. https://hugovk.dev/blog/2026/soft-deprecating-re.match/ A quick overview of atomics in C Tags: tech, c, multithreading, atomics Still need to understand atomics and memory barrier? This is a neat primer. https://lemire.me/blog/2026/09/09/a-quick-overview-of-atomics-in-c/ Visualizing Rust’s Vtables: How dyn Trait Works In Memory Tags: tech, c++, rust, memory, type-systems Interesting exploration of how static and dynamic dispatchs work behind the scene in Rust. The chosen tradeoffs are different than in C++ and that’s something to keep in mind. https://sofiabelen.github.io/projects/visualizing-rusts-vtables-how-dyn-trait-works-in-memory/ My HTML Boilerplate Tags: tech, web, html There’s a lot of important metadata in HTML pages nowadays… and there could be more than proposed here. https://vale.rocks/posts/html-boilerplate There’s No Limit to How Bad Code Can Get Tags: tech, software, engineering, quality Good point. The metaphors we use have obviously some limits. In the case of the “sinking ship” when used for software it doesn’t quite work as there’s no bottom… https://zachkehs.com/blog/theres_no_limit_to_how_bad_code_can_get/ On Quality: What It Is and Why Products Get Worse Tags: production, quality, craftsmanship Very nice read about quality in general and why it’s really hard to define. It also explores how it can degrade over time in existing products. https://www.worseonpurpose.com/p/on-quality Degeneracy is a Symptom Tags: history, economics, politics Or why it’s stupid to judge people on their non virtuous behavior while at the same time fostering the structures which ensure that virtue does not pay. So indeed, some people read the odds properly and act accordingly… https://henryfudgeofficial.substack.com/p/degeneracy-is-a-symptom The Last Person to Know the Dictator Is Screwed Is the Dictator Tags: history, politics Build a good enough echo chamber and you won’t know you’re toast before it’s too late. https://thegrimhistorian.substack.com/p/the-last-person-to-know-the-dictator When Death Was a Relief Tags: history Such a wonderful species we are… not. Things can get really nasty when someone starts exploiting beliefs and gains some sort of power. And then, the blame game begins. Unfortunately it regularly happens. https://m.youtube.com/watch?v=205swuI0JlY Bye for now!
  • I just want us to feel something… (2026/09/11 14:57)
    So... Koko needed a new icon. Koko is KDE's image viewer, sharing its name with the rather famous gorilla, and yes, putting a gorilla in the icon would have made perfect sense... but we all love cats, and so did KOKO, so here we are And while making this ridiculously cute thing I kept thinking about something that has been bothering me more and more. Hopefully the cuteness of the cat will alleviate the ranty nature of what follows Why is so much of what we design today so f...... boring? We have incredible displays, GPUs doing absurd things, animation engines, shaders, QML, tools I could only dream about 20 years ago... and somehow so much of what we make with all of that looks like the same five rectangles arranged in slightly different ways. Clean. and forgettable, austere but not in a brutalist way, its.... just booooring . I've spent quite a bit of time recently bringing bits of old Oxygen back to life, and I know there is a temptation to read that as nostalgia, as if my answer is “look, things were better when we had shiny icons!” It isn't. I don't want the future to look like 2008. In fact I think this sudden fascination with old interfaces, skeuomorphism, Winamp skins, old games, old icons and all the rest is a symptom of something else. People are looking backwards because they miss design having a personality. They miss opening something and actually having a reaction to it. And now we have AI. And f'ing..... makes the whole thing even more urgent to me. AI is spectacularly good at producing things that look like things that already exist. And if our design ambition was already reduced to producing safe, familiar, derivative variations of whatever everyone else is doing or that we have done... congratulations, they have automated it,.... and and I can't feel much more from such things... other than plain sadness. So I don't want us to go backwards. I want us to go somewhere. Make something NEW!!! Make something strange. Make something excessive. Make something beautiful, ugly, funny, annoying, charming, stupid, brilliant, probably all of those at once. Make something somebody will hate enough to write a 14 rant bolg post about. Just please make us feel something. see you soon in aKademy for more ranting and maybe a beer or 2 Also played with this for the plasma-studio app. I think i can do better OOOOO and OBVIUSLY if you want our sort of Crazy JOIN us in Oxygen, or KDE or anything just go do stuf NEW stuf!!!!!!
  • Kdenlive 26.08.1 released (2026/09/11 13:45)
    The first maintenance release of the 26.08 series is out with the usual batch of stability fixes and workflow improvements. Highlights include a big batch of fixes for crashes when changing Timeline Preview settings, deleting sequences, stopping audio recordings, and using ripple editing when the Project Monitor is hidden. This release also fixes Effects Zones not being kept inside the clip boundary and tabs are now readable on theme changes on Windows. Join us at Akademy Some of the team members will be in Graz for Akademy, celebrating 30 years of KDE. Also Jean-Baptiste Mardelle will be giving a talk about Kdenlive. Kdenlive needs your support Our small team has been working for years to build an intuitive open source video editor that does not track you, does not use your data, and respects your privacy. However, to ensure a proper development requires resources, so please consider a donation if you enjoy using Kdenlive - even small amounts can make a big difference. For the full changelog continue reading on kdenlive.org.
  • Akademy-es 2026 ... in a campsite! (2026/09/10 20:28)
    Akademy-es 2026 is happening October 23 to 25 in Camping Arco Iris (Villaviciosa de Odón, Madrid) For the 20th anniversary of the first Akademy-es, the organizers have chosen a campsite to do a slightly different event focusing on the community side of KDE. There will still be of course talks, so remember you can submit one until this September 13th!  See you there!  
  • JPEG-XL as default in AppStream, and better media processing (2026/09/10 17:48)
    Two weeks ago, I released AppStream 1.2.0. This release contains a lot of great changes, but one of the most important ones concerns how media are being handled, and AppStream’s default image export format. AppStream is a Freedesktop metadata standard to describe software components. That can be anything from system services over fonts to console and graphical applications. AppStream metadata is supposed to give users enough information to decide whether they want to install a piece of software, to represent that piece of software, and to give the operating system enough information to decide whether a software component should be installed automatically and (to some extent) what capabilities and relations it has, to provide the user with sensible options. Especially for the first two goals, and especially for GUI applications, AppStream supports icons and screenshots, which are used to showcase applications. Today, AppStream is used by all kinds of services, from Linux distributions over firmware updates to Flatpak and desktops directly. AppStream’s original design however comes from the perspective of Linux distributions in 2011, where you may want to browse the software catalog offline, without delay, and without pinging an external server (which could be a privacy concern). Therefore, a common way to deploy an AppStream-enabled software repository is to ship all icons of all applications in the repository to the user as part of the repository metadata download. AppStream does support remote icon downloads nowadays, and for a while I thought that this would become the default eventually. However, especially in today’s world, having a bandwidth-saving, instantly responsive, privacy-protecting application browsing experience seems more important that ever. PNG images are great! The only format that AppStream supports for icons and screenshots (which are downloaded on-demand from your distributor’s CDN) has always been exclusively PNG. PNG images are perfect for icons, because they compress well (especially for common icon shapes), are fast and simple to load, and can be loaded anywhere, by any toolkit or webbrowser. They also ensure we deliver faithful screenshot images, even though we may have scaled or re-rendered them. Still though, PNG images are less great for screenshots, as they are not very efficient, which puts strain on any CDN that has to deliver them, as well as on people’s internet connections when browsing screenshots. Having smaller thumbnails alleviates that problem a little, but does not fully solve it. But even for icons, PNG could be improved upon: In many cases, icons are re-downloaded with the repository metadata again and again, so having a large icon tarball adds up to the data transferred during metadata refreshes. AppStream also now supports large 128x128px icons, which nobody in 2012 expected we would need, adding even more data that will be re-downloaded. Saving some space here translates directly to lower bandwidth costs as well as faster downloads for users. To improve PNG file sizes, the AppStream Compose library, which handles all image processing and metadata catalog composition, was running optipng on all generated PNG images. That does create smaller PNG images, but they were still relatively large compared to other image formats. For a long time though, there was no alternative to PNG images for icons: There was no lossless image compression format that could give us the same quality as PNG images and that was also widely supported. JPEG-XL vs PNG in AppStream Since 2021 we have JPEG-XL (JXL), which offers a true lossless mode with often better compression than PNG. The issue was that JPEG-XL wasn’t widely supported. Then, in 2025, the PDF Association selected JPEG-XL as the preferred image format for HDR images in PDFs, and now we are finally getting browser support and more ubiquitous availability of the format (you can try it right now in Firefox!). For screenshots, using JXL’s lossy mode, it has obvious and extreme size advantages over PNG, so supporting JXL or WebP for screenshot images was an obvious choice. If JXL would support the lossless case very well as well though, we could serve many use cases with the same exported image format, which is very attractive to me. So, the obvious next question was whether it was worth the pain of switching the icon format, so I did some measurements on real icons. For that I used the AppStream component icon pool that Debian Unstable ships, which is almost 5000 application icons of various sizes, and converted them to PNG: Icon sizeIconsPNG totalJXL totalPool savedPNG avgJXL avgMedian savedMean saved Worst BestLarger as JXL 48×48 1544 3.7 MiB 3.0 MiB 17.8%2.4 KiB2.0 KiB 17.9% 16.7%-118.7%60.0% 206 64×64 2018 7.0 MiB 5.8 MiB 17.8%3.6 KiB2.9 KiB 18.0% 15.8%-112.7%70.0% 279 128×128 1411 11.2 MiB 8.7 MiB 22.0%8.1 KiB6.3 KiB 20.1% 17.5% -89.7%61.0% 209 TOTAL 4973 21.9 MiB 17.5 MiB 19.9%4.5 KiB3.6 KiB 18.6% 16.6%-118.7%70.0% 694 PNG images saved with libpng at effort=4, compression=9, then optimized using optipng -o2, JXL images encoded using vips jxlsave lossless=1 effort=7 strip=1 via VIPS/libjxl. As the table shows, using lossless JXL images over size-optimized PNG images (using optipng’s default settings) provides a roughly 20% gain. This does not look like much, until you consider how often these files are downloaded: A 20% file size reduction may only save 1-2 MiB of disk space, but if they are downloaded over and over again by many clients, it will save a lot of bandwidth. Interesting JXL encoding findings As a sidequest, I was curious why some images were larger than their PNG counterparts when encoded with JXL, and what the ones that were significantly smaller were. In short, the biggest size reductions for JXL existed on images that were already small as PNG, and contained large, flat color surfaces with hard edges and simple shapes. They were not very interesting, and much of JXL’s wins come from accumulating smaller gains across all files, which compound the bigger icons get (especially at 128x128px, where JXL truly shines). The events were JXL loses to PNG are more interesting: For example, it does quite poorly with pixel-art images that have a lot of repeating patterns. Those are encoded well by PNG, but less efficiently by JXL. Take for example Vonsh: Icon of Vonsh, an SDL-based snake game, which PNG compresses better than JXL My guess is that while PNG can exploit the repeating pixel patterns for compression, JXL’s predicts surrounding pixels from its neighbours, which fails too often and makes it pay almost full entropy per pixel. In this single rare case, the PNG is at 5.4 KiB, while the JXL is almost 8 KiB in size. Other cases I looked at were arguably buggy input data, where color channels were hidden under the alpha channel of the input image. PNG could probably again exploit repeats, while we were forcing JXL to encode pixels that were invisible in the final image. This is arguably a problem with the original input data. Currently, AppStream does not make any changes to icons at all, but in future we might add a filter that removes invisible colors from images to solve this pathological case (it was only two icons out of 5000 though, so it is not a high priority). The third case I found where JXL loses to PNG were icons with checkerboard-like patterns: Icon of x3270, an IBM 3270 Terminal Emulator For those, PNG can likely again exploit the repeating patterns, while a checkerboard layout is pretty bad for left/top predictors like JXL’s. However, in this case the size difference (and loss for JXL) is only 450 bytes, so even though JXL loses to PNG, it does so not by much. JXL in AppStream Given these findings, JPEG-XL is the default image format starting with AppStream 1.2.0. AppStream Compose will encode all images losslessly as JXL, while screenshots are encoded in lossy mode at Q=90 effort=7. Since the optipng step does not happen for JXL images, this comes at no speed penalty and is even a bit faster on modern x86_64 CPUs (where libjxl can use SIMD). PNG is still available, and Compose can be told to switch between the two formats. Upsides of JXL in AppStream right now If you use JXL in Compose or the recent release of appstream-generator, you will get much smaller images and, for screenshots, will benefit from other JPEG-XL features such as progressive decoding, providing a far nicer user experience. libAppStream has supported JXL icons since version 1.1.3, so your clients will need that version or a newer one, and all software centers will have to support loading JXL images (which all of them do, provided the right plugins are installed). Downsides of switching to JXL too quickly JXL is a very new format, so web browsers might not yet display it if you are serving webpages. Your clients may also have bugs in processing JXL images, as the format is still “new”. For example, switching on JXL in Debian sent KDE Discover into an infinite loop on startup while trying to load the icons (an issue which has been fixed, but clients will need that patch first before JXL is switched on). This currently makes JXL enablement only possible when you know that your clients can support it. This is the case for me in Debian Unstable and Debian 14, which are using JXL images for a few weeks now, but not for any older releases. Platforms like Flatpak have it even harder, because they do know even less about their clients. So, even though it has big advantages, you may want to hold off on using JXL right away, and force PNG by setting the ImageFormat key to png in appstream-generator‘s configuration, or passing --image-format=png to appstreamcli compose. It is also worth mentioning that JPEG-XL is much, much slower on systems that do not have SIMD instructions or for which the libjxl/jxl-rs library does not have them (such as apparently riscv64 right now). If this is a concern, you might not want to switch to JXL right away. Media pipeline improvements Besides the JXL default change, AppStream 1.2.0 also comes with a complete overhaul of its media processing pipeline. While libappstream, AppStream’s main library, does not do any media processing and comes with very minimal dependencies to be embedded in client applications and used on servers, the same can not be said about libappstream-compose, AppStream’s library to build metadata generating applications (the server-side part, usually). The compose library has to render fonts into font specimen cards, inspect translation files, render SVG images, decode all kinds of raster images, inspect video files, etc. Especially the fonts, and the fact that fonts can appear in SVG images, has caused issues in the past, as libappstream-compose is a heavily threaded library and most font libraries can only work from a single thread. This forced the library to essentially go into single-thread mode anytime anything that could touch a font was being processed. AppStream also originally was created for a “safe world” where applications were vetted by the distributors before their metadata was processed. This is increasingly not the case, so it made sense to put at least a few guardrails on the most complex part of the pipeline: The media processing. As part of the change, media processing was split out into a separate worker process. This solved two problems at once: Font handling was isolated in a single-threaded binary – if we wanted to handle fonts in parallel, we could simply spawn more workers. And, being in a separate process, the media processing could now be sandboxed. As part of the multiprocess changes, Compose also switched from using GdkPixbuf to VIPS for image processing. The latter allows for much more fine-grained control over the image output and encoding, and comes with a lot of well-maintained filters and operations, which made it possible to eliminate a fair chunk of AppStream’s hand-rolled image processing operations. As part of this transition, we unfortunately lost the ability to read XPM images, which dropped about 20-30 applications from the pool at Debian. But in the name of security, this is a sensible choice, especially since most XPM icons were very small and low-resolution, and applications using them could benefit from adding a high-quality PNG icon anyway. With VIPS, we also now restrict the amount of image formats we can load to a sensible set, so extremely niche or unexpected formats will be outright rejected (this includes sane-but-unusual formats for screenshots and icons, such as TIFF images). The Compose library, with all of these changes, will now just request high-level operations (e.g. “render a font card for this font to a JXL image”) from the worker, and provide it with input data in sealed memfds and output locations as FDs as well. On Linux systems, the worker will use Landlock if available, to block all write access to the filesystem, deny device access and deny TCP and UDP as well. The sandbox can certainly be tightened a fair bit in future, but this was a good and safe start to gain some experience with it without having things break too easily, given the many places Compose is used in (also, Landlock’s API is surprisingly nice to use, so it was easier than I thought to add in this early version). With all of these changes, the libappstream-compose library is now also officially marked API-stable, so you should be able to rely on it in future to build new things (its API has barely changed in the past, and now with the new media API and defaults change in place, it was time to declare it stable). I want to see / try this! Currently, the easiest way to have a look at the new data is to check out Debian Unstable. If you have a JXL-enabled browser, you can also see the icons in AppStream Generator’s HTML pages for Debian Sid. If you are using appstream-generator for your distribution, you will also get much more pleasant statistics and HTML pages, as well as fully deterministic media output and a whole bunch of security updates, so, update to its recent 1.0 release. Please keep in mind that if you switch to JXL, the client tools receiving the image data have to support it. Support varies depending on the Linux distribution, so, test it first and switch the default back to PNG in case you encounter any issues. What’s next? With so many features and changes landed, the next changes in AppStream will focus on improving what already exists and fixing any issues (there will be more blogposts about the other features 1.2.x delivers!). Testing with the entire Debian archive as data source makes me fairly confident though that there will not be many problems. In the longer term, tightening the media processing sandbox will also be something we might want to do, e.g. by hiding parts of the filesystem tree or filtering syscalls. For JPEG-XL, one obvious question is “Will you add support for it to the Freedesktop icon-theme specification as supported format alongside PNG, SVG(Z), and XPM?”. For on-disk icon repositories, JXL’s space-savings are less compelling, and it being HDR-capable is also not necessarily a killer feature (PNG can go a long way!). However, JPEG-XL’s ability to immediately decode larger images at reduced resolution without resampling could legitimately be very powerful here, as applications could ship a single large image and quickly decode it at 1/2, 1/4 or 1/8 the size for different purposes in their UI. JPEG-XL also supports spot-color extra channels, which applications could use as masks to recolor raster icons at render time. This could be incredibly nice to color symbolic icons on-the-fly without any SVG and CSS. JXL also provides richer metadata, which might be neat for (license/author) documentation. So, the answer here is: Maybe it makes sense to allow another format, but this will have to be discussed first, as it would force JXL into every toolkit and desktop, which is a much bigger ask than supporting it only in AppStream. As always, let me know what you think and please report any issues or bugs directly against AppStream or AppStream Generator if you encounter problems that are with the tools, and not with a project’s metadata.
  • Parametrized Keyframes - Status Report, September 2026 (2026/09/10 11:00)
    Besides maintenance and debugging work, this year, my work on Kdenlive was mostly dedicated to refactoring the Kdenlive keyframes system to make it more powerful. This is part of a NGI Zero Commons grant via NLnet, see my last status report from february for some more context. Previously, keyframes were set globally for an effect, touching all its parameters. With the updated logic, you can now decide to add keyframes only to a specific parameter, and parameters can have independant keyframes. This work will soon be made available for testing, and will be part of the next 26.12.0 Kdenlive release. This new widget allows to move keyframes for several effects in one step, and also supports keyframe scaling, meaning that you can easily stretch a group of keyframes. Effect Stack Before Effect Stack After Refactoring Basic keyframe features remain in the effect stack, like add/remove keyframe and seek to previous/next keyframe, but all other keyframe-related features have otherwise been removed from the effect stack into a dedicated Keyframes panel. The parameter values now have a colored background to indicate if you are currently on a keyframe or not. One drawback is that it uses more space, but we plan to futher refine the interface in the next months before the final release. New features Beyond the obvious possibility to add per-parameter keyframes, and manage keyframes from several effects in one place, a few other features were included in the rewrite: Move keyframes with keyboard You can now grab the selected keyframes with the usual shortcut, then move them frame by frame using arrow keys. Zoom and Keyframe scaling Zooming and scrolling can be used with the standard mouse wheel events, and it is now possible to scale selected keyframes by selecting them and dragging with the Ctrl modifier. And all the rest The Keyframes interface also allows to filter parameters by name to only show matching parameters, useful if you have lots of effects on a clip. All this work will also make it much easier to add new keyframe features in the future. Performance "Adding new features is nice, but what about performance?" you may ask. Well, good news: this work also involved some cleanup and performance improvements. People working with lots of keyframes (for example with object tracking) will really enjoy the changes. For example if you have a clip with more than 1000 keyframes, you will enjoy: Much faster project load time (can be as much as twice as fast) Much faster keyframe operation (changing a keyframe value was previously very laggy) Much better playback speed when the clip is selected (was previously very choppy) And even if you don't use that many keyframes, the general workflow should be a lot smoother. Meet us at Akademy Part of the Kdenlive team will be in Graz for KDE's Akademy, celebrating 30 years of KDE. Be there to meet us! Kdenlive needs your support Our small team has been working for years to build an intuitive open source video editor that does not track you, does not use your data, and respects your privacy. However, to ensure a proper development requires resources, so please consider a donation if you enjoy using Kdenlive - even small amounts can make a big difference.
  • KDE Plasma 6.8 Beta Release (2026/09/10 00:00)
    Here are the new modules available in the Plasma 6.8 beta: kup: Backup scheduler for the Plasma desktop Some important features and changes included in 6.8 beta are highlighted on KDE community wiki page. Help stress-test the Union theming system This releases marks the second half of the Union theming system’s public tech preview! New in Plasma 6.8: Union now themes QtWidgets applications, such as Dolphin and Kate. Bear in mind this support is preliminary and you will encounter bugs. When you do, please report them here! To test Union: Make sure the union package is installed (name may differ depending on your distro) Launch System Settings In the sidebar, navigate to Colors & Themes → Application Style Click “Breeze (Union)” Click Apply This will apply Union styling to both QtQuick and QtWidgets apps. The intention is for these apps to look as similar as possible when styled with Union to how they look with Breeze — though any minor visual improvements should be considered intentional! If you find any issues, make sure they’re Union-specific by running the app with the Breeze style to compare the two. If the issue is Union-specific, report it here! Everything else View full changelog
  • KDE Gear 26.08.1 (2026/09/10 00:00)
    Over 180 individual programs plus dozens of programmer libraries and feature plugins are released simultaneously as part of KDE Gear. Today they all get new bugfix source releases with updated translations, including: kdeconnect: Fix orientation of an arrow within the plasmoid (Commit, fixes bug #524889) kongress: Fix opening the room map from a talk (Commit) okular: Fix a crash when saving documents (Commit, fixes bugs #477153 and #505130) Distro and app store packagers should update their application packages. 26.08 release notes for information on tarballs and known issues. Package download wiki page 26.08.1 source info page 26.08.1 full changelog
  • KDE Ships Frameworks 6.30.0 (2026/09/09 00:00)
    Wednesday, 9 September 2026 KDE today announces the release of KDE Frameworks 6.30.0. This release is part of a series of planned monthly releases making improvements available to developers in a quick and predictable manner. New in this version Baloo Apply clang-format on fileexcludefilters.cpp. Commit. Exclude .snapshots folders from indexing. Commit. [app] Skip content indexing in the extractor if onlyBasicIndexing is set. Commit. See bug #500665 Bluez Qt Port away from ecm_add_qml_module's deprecated CLASSNAME arg. Commit. Breeze Icons Set missing fill="currentColor" for update-busy. Commit. Add "tv" symlink to "video-television". Commit. Add symlinks for text-x-shellscript. Commit. Add symbolic mastodon icon. Commit. Extra CMake Modules List ECM sources explicitly instead of using GLOBS. Commit. ECMInstalledLibraryCheck: add more separating linebreaks to generated files. Commit. ExecuteKDEModules: add newer KDE modules to test. Commit. ExecuteKDEModules: split off support for apple platform, document it. Commit. ECMInstalledLibraryCheck: use $cond:string over $IF:cond,string,. Commit. Add ECMInstalledLibraryCheck. Commit. Ecm_generate_export_header: make VERSION optional, default to PROJECT_VERSION. Commit. ECMSetupVersion: support version args in . and forms. Commit. ECMSetupVersion: use final hex number in version header, not calculation. Commit. KCalendarCore Use QLocale for concatenating recurrence days. Commit. Improve translation contexts for some of the recurrence descriptions. Commit. Src/vcalformat.cpp - fix spelling typo in a comment. Commit. Adapt recurrenceDescription unit tests to English translations. Commit. Add Incidence::recurrenceDescription. Commit. Fix Incidence::statusName property name. Commit. Add translated enum names for Incidence::secrecy and Incidence::status. Commit. Change parseScheduleMessage to take a QByteArray as input. Commit. Add translated names for attendee status and role enums. Commit. Fix tr() message context. Commit. Expose Calendar and ScheduleMessage to python bindings. Commit. Add translated error messages. Commit. KCMUtils Documentation fixes. Commit. Fix documentation for SettingsStateBinding. Commit. Fix docs for KQuickManagedConfigModule. Commit. Kcmutils_generate_module_data: add missing var init, for safer usage. Commit. Add missing EXCLUDE_DEPRECATED_BEFORE_AND_AT default variable declaration. Commit. No longer explicitly include CMakeParseArguments. Commit. Fix types in QML documentation. Commit. KCodecs [KEncodingProber] Fix signedness issues for mBestGuess index. Commit. [KEncodingProber] Return 0.0 confidence if encoding signals wrong syntax. Commit. [KEncodingProber] Clean up float constants and C-style static casts. Commit. [KEncodingProber] Drop charlen tables from state machine models. Commit. [KEncodingProber] Remove need for charlen table from MBCS probers. Commit. [KEncodingProber] Remove some erroneously copied comment. Commit. [KEncodingProber] Remove no longer used method. Commit. [KEncodingProber] SBCS: Replace model pointer with reference. Commit. [KEncodingProber] SBCS: Replace unbounded array pointer with span. Commit. [KEncodingProber] Move sequence counter sum out of loop. Commit. [KEncodingProber] Test for Cyrillic encodings (and Unicode reencodings). Commit. [KEncodingProber] Test for ASCII only UTF-16 encoded texts. Commit. KColorScheme Kcolorschemetest: explicitly cast enum values to int for arithmetic ops. Commit. KConfig Add some missing CMake var initialization, for safer usage. Commit. Kconfigcore: minor cleanups. Commit. Fix tabNext() and tabPrev() default documentation. Commit. KContacts Add Matrix icon. Commit. KCoreAddons KFormat: Get current time in UTC. Commit. Kfilesystemtype: identify a fuse mount by its name when the table cannot. Commit. Kfilesystemtype: tell a fuse mount with a disk behind it from one without. Commit. KDav Fix DavItemMoveJob doc's \since specifier from 6.29 to 6.30. Commit. Add dav MOVE job. Commit. KFileMetaData Reenable Qt 6.12 CI. Commit. [PostscriptDscExtractor] Fix time offset parsing for Qt 6.12. Commit. [PostscriptDscExtractor] Modernize QString usage. Commit. [SimpleExtractionResult] Fix copy constructor. Commit. [EmbeddedImageData] Remove some dead, unreachable code and data. Commit. Fix a few nodiscard warnings for QFile::open. Commit. [ExtractorPlugin] Allow alias names when matching extractor mimetypes. Commit. Fixes bug #522678 [kfilemetadata_dump] Provide information about cover images etc. Commit. See bug #500113 [FFmpegExtractor] Extract cover image from Matroska streams. Commit. See bug #500113 [FFmpegExtractorTest] Move test class declaration to implementation file. Commit. KGlobalAccel Parse QKeySequence from QDBusArgument more carefully. Commit. Fixes bug #524700 KGuiAddons Add geo: URI handler for Cartes. Commit. Add support to pass along the unmodified geo: URI in an URL template. Commit. Fix geo: URI query string encoding. Commit. Reuse explicitly provided image data. Commit. Fixes bug #519651 Waylandclipboard: Check isInterruptionRequested in prepare read loop. Commit. Fixes bug #517743 KHolidays Fix dates for 2083 (2026/27 A.D.). Commit. Update Norwegian holidays based on official sources. Commit. Update event date for Urs Aala-Hazrat. Commit. KI18n Add another test case for 0. Commit. KIdletime Include CMakeFindFrameworks only with APPLE. Commit. Drop no longer used CMake variable. Commit. KImageformats Jp2: Fix new[] vs delete by not doing new[]. Commit. Fixes bug #525120 QRoundOrZero_T: fix possible assert in qRound. Commit. Fixes bug #524678 Autotests: Add non-standard HEIF image. Commit. Heif: re-enable decoding of non-standard images. Commit. Fixes bug #495686 Add HEIC test files with crop transformation. Commit. Heif: check crop values. Commit. Jxl: Do not rewind after reading final frame. Commit. Rgb: reject RLE start offsets that underflow the raster data. Commit. Avif: Do not rewind in jumpToNextImage(). Commit. Ossfuzz: call functions used in animations. Commit. KIO Bring KSycoca::setupTestMenu code here. Commit. Copyjob: name the copy lists for what they hold. Commit. KUrlNavigator: Set the frameShape to StyledPanel. Commit. KDirModel: Pass UTC time to KFormat::formatRelativeDateTime(). Commit. Drop duplicated explicit install() call on kio_help plugin. Commit. KDirSortFilterProxyModel: Avoid creating QDateTime instance. Commit. [ftp] Send commands in upper case consistently. Commit. Fixes bug #523927 Autotests: Run the http worker tests as part of the suite. Commit. Http: Keep one network manager for the life of the worker. Commit. KOpenWithDialog: fix pattern matching in filterAcceptsRow(). Commit. Fixes bug #524085 Previewjob: drop the synchronous cached-thumbnail lookups. Commit. Desktopexecparsertest: fix typo in installation var. Commit. Desktopexecparsertest: add missing quotes for a string definition argument. Commit. Previewjob: make the previews in the order they were asked for. Commit. File worker: reserve an entry for the fields it always carries. Commit. Kcoredirlister: let the list of items grow instead of sizing it per batch. Commit. Http: Keep a large request body out of memory. Commit. Kmountpoint: Write the Latin-1 strings as literals. Commit. Kmountpoint: add SupportsFileCloning for COW filesystems. Commit. PreviewJob: Read cached thumbnails in bounded batches before generating. Commit. Gui: Read and write the thumbnail cache in one place. Commit. PreviewJob: add cachedPreview() for a synchronous cache-only lookup. Commit. Kfileitemactions: test service menu submenu. Commit. Kfileitemactions: fix submenu lifetime using main menu as the parent. Commit. Fixes bug #524239 Http: Report how far an upload has got, not what the answer weighs. Commit. Fixes bug #518511 Avoid MIME content-sniffing on slow filesystems. Commit. Systemdprocessrunner: Handle when unit returns failure. Commit. Don't show percent-encoded strings for items of desktop:/ IO worker. Commit. Fixes bug #522470 KIO: hand what a message carries over as it is within a process. Commit. Properties: show how much room a folder takes up, not only its data. Commit. Fixes bug #457363 Jobtest: set the language the expected text is written in. Commit. Filepreviewjob: Check remote-skip conditions before checking mimetype. Commit. File: ask statx for the permission bits that are read from its answer. Commit. File: let a folder with the setgid bit give a copied file its group. Commit. Fixes bug #399270 File worker: ask for the mount of the destination while looking at it. Commit. File worker: create copy destinations relative to a pinned directory fd. Commit. OpenURLJob: Stop reading BrowserApplication from kdeglobals. Commit. KMountPoint: cache mount lookups by unique mount id. Commit. Autotests: verify KFileCopyToMenu prunes missing recent destinations. Commit. Autotests: test for non_existing directories removed. Commit. Kfilecopytomenu: Limits max entries and removes unavailable links from the list. Commit. Git-blame-ignore-revs: add code reorganization commits. Commit. Kfileitemactions: reorder functions for better readability. Commit. Openurljobtest: wait for the launched processes before ending a test. Commit. Autotests: ask the mime database which type a test means. Commit. Openurljob: open a shell script rather than refuse it as a program. Commit. Fixes bug #522948 Knewfilemenu: reorder execute functions to match the order they are called in slotActionTriggered. Commit. Knewfilemenu: allow overriding system templates with local templates. Commit. Fixes bug #473991 Knewfilemenu: set application link title to not be misleading. Commit. Fixes bug #520949 Knewfilemenu: fix relative symlinks. Commit. Fixes bug #508444 RenameFileDialog: offer the rename operation of the last rename. Commit. Fixes bug #523932 RenameFileDialog: free what the dialog owns. Commit. SlaveBase: do not take a missing total for a finished transfer. Commit. DeleteJob: pass on the bytes its rmdir subjob reports. Commit. Kio_file: delete a tree natively on unix, and report the bytes deleted. Commit. Kirigami Fix typo in documentation. Commit. Remove wrong API documentation marker. Commit. Pull TODO out of API documentation. Commit. Fix \since syntax. Commit. Fix documentation syntax in ScenePosition. Commit. Fix documentation syntax in PagePool. Commit. Fix documented QML import name. Commit. Add missing \inherits to C++ types. Commit. Mark SafeArea as internal. Commit. Fix parameter name in documentation. Commit. Add missing parameter marker in documentation. Commit. Add missing full stops in documentation. Commit. Remove non-functional link. Commit. Remove * from QML API documentation comment. Commit. Qml-format InlineViewHeader. Commit. Qml-format LinkButton. Commit. Fix type name in documentation. Commit. Add explicit \inherits where needed. Commit. ColumnView: better layout for pinned items. Commit. ListItemDragHandle: stop the dropAnimation if one is still running. Commit. Fixes bug #517233 InlineMessage: Use smallSpacing for the label also on its right. Commit. Typo--. Commit. SwipeListItem: add a deprecated notice. Commit. SwipeListItem: Don't make the content item overlap the icons. Commit. Fixes bug #518436 Forms/flat: Fix padding calculation for subtitle. Commit. Flat/FormGroup: remove unused import. Commit. Flat/FormGroup: make spacing around headings more like FormLayout. Commit. Flat/FormGroup: simplify layout. Commit. Flat/FormGroup: make header more accurate to FormLayout. Commit. OverlaySheet: make the scrim darker. Commit. Fixes bug #447965 Fix Overlaysheet touchscreen behavior. Commit. Drop unneeded AUTOMOC_MOC_OPTIONS. Commit. FormGroup(cards): fix resize loop. Commit. Drop explicit CMake settings duplicatd from KDECMakeSettings. Commit. Include KDECMakeSettings/KDEFrameworkCompilerSettings early. Commit. Remove duplicated KDEInstallDirs module include. Commit. Forms: Explicitly specify individual paddings when setting padding. Commit. Units::eventFilter: fix to react just to font change of app instance. Commit. FormEntry: make it possible to get the inner spacing. Commit. FormEntry: make spacing more consistent. Commit. Finish making GlobalDrawer.isMenu behave the same everywhere. Commit. ImageColors: de-flake test_extractColors. Commit. Kirigami app template: use PROJECT arg with ecm_setup_version(). Commit. FormEntry(flat): make sure the trailing area is actually fillHeight. Commit. Add another safety check before automatically popping hidden pages. Commit. FormEntry(flat) some minor fixes. Commit. FormEntry(flat) some minor fixes. Commit. FormEntry(all): rename forceExpanedContents with fullWidth. Commit. Form: center contents only horizontally. Commit. FormEntry (both): completely propagate Layout properties. Commit. FormEntry(cards): fix the flipping of switches. Commit. FormEntry (flat): reorganize the internal layout. Commit. FormEntry: make links inthe subtitle clickable. Commit. FormEntry: introduce forceExpandedContents. Commit. Docs: Explicitly ignore basictheme_p.h in Platform documentation. Commit. Docs: Suppress "can't link to index.html" warnings. Commit. Docs: Don't generate documentation for private types. Commit. Forms: Fix documentation of FormAlignmentGroup members. Commit. Forms: Fix documentation of FormGroup type. Commit. Docs: Ensure the Forms module is properly included in indices. Commit. Icon: Don't try to load empty fallback icons. Commit. Set implicitwidth at 3d gridunits only for cards layout. Commit. Keep the ToolBarPageFooter menu inside the SafeArea. Commit. Make the Page globalFooter page property a QQC2.Page type. Commit. Keep ToolBarPageFooter buttons inside the SafeArea. Commit. KJobWidgets Kjobcreator: Fix tab order. Commit. KNotifications Notificationtester: Add URL text field. Commit. KParts Remove some unused includes. Commit. KQuickCharts Add_qml_tests: initialize _extra_args variable in all cases. Commit. Fix usage of misnamed KDE_INSTALL_DEFAULT_ARGUMENTS. Commit. Controls/LegendDelegate: use tabular numerals for value. Commit. KRunner Remove left-overs of dropped ecm_setup_qtplugin_macro_names usage. Commit. KService Fix documentation syntax. Commit. KSVG Add missing EXCLUDE_DEPRECATED_BEFORE_AND_AT default variable declaration. Commit. SvgItem: hold one texture for one picture, like FrameSvgItem does. Commit. KTextEditor Only show bracket match preview if the view is visible. Commit. Vi-mode: Fix append to block for tabs. Commit. Vi-mode: Fix cursor column swap with tabs. Commit. Vi-mode: Fix operations in selection ranges with tabs. Commit. Vi-mode: Fix success message for non-successful save commands. Commit. Fixes bug #473077 Vi-mode: Fix "save all" command for unnamed files. Commit. Fix resolution for KateVi::Range debug operator. Commit. Vi-mode: Implement filename registers. Commit. Vi-mode: Fix yank highlight for blocks with tabs. Commit. Vi-mode: Simplify method to detect waiting for characters. Commit. Vi-mode: Refactor the method for leaving insert mode. Commit. Vi-mode: Fix checks for setting user marks. Commit. Fixes bug #520734 KTextTemplate No longer explicitly include CMakeParseArguments. Commit. Make date/time filter locale-aware. Commit. Make Context accessible to filters. Commit. KUnitConversion Fix inconsistencies in exponentiated units. Commit. Check if toUnit is in this category before trying to convert. Commit. KUserFeedback User-feedback-manual.qdocconf template: fix outdated version variable use. Commit. User-feedback-manual.qdocconf template: fix outdated URL. Commit. KWallet Properly handle when the portal fails to open the wallet. Commit. Remove unused variable. Commit. Remove some default function args. Commit. Ksecretd: Remove unused method parameters. Commit. Remove leftovers from KSecretsService. Commit. Ksecretd: Remove unused sessionTimeout parameter from pamOpen. Commit. Ksecretd: Remove wrong comment. Commit. Remove unused WId parameter from sync(). Commit. Drop KSecretD::sync. Commit. Ksecretd: Fix Completed argument when dismissing collection creation. Commit. Ksecretd: Drop appId. Commit. Drop defunct Leave Open option from kcfg. Commit. Ksecretd: Remove unused force parameter from internalClose(). Commit. Ksecretd: Drop CloseCancelled handling. Commit. Remove unneeded KSecretD::networkWallet. Commit. Drop unneeded KSecretD::doCloseSignals. Commit. Ksecretd: Drop unused walletOpened signal. Commit. Ksecretd: Make sure collection is reported as unlocked after PAM unlock. Commit. See bug #459287 Ksecretd: Make parameter names consistent. Commit. Ksecretd: Drop unneeded intermediate function. Commit. Drop long-time commented out code. Commit. Add missing KWALLET_BUILD_DEPRECATED_SINCE in cpp file. Commit. Add desktop file for kwalletd. Commit. Run clang-format. Commit. Drop dead CMake code for tests. Commit. Deprecate Wallet::requestChangePassword(). Commit. Deprecate Wallet::lockWallet(). Commit. Deprecate Wallet::sync(). Commit. Ksecretd: Remove unused force parameter from close(). Commit. Ksecretd: Drop KWalletSessionStore. Commit. Drop unused handleSession from ksecretd. Commit. Drop Close When Idle handling from kwalletd. Commit. Fixes bug #524500 Propagate locked status from backend to kwalletd. Commit. Add formatting commit to ignore list. Commit. Drop isPath handling. Commit. Drop unused function. Commit. Fix logic errors in internalOpen. Commit. Fixes bug #524373. Fixes bug #524592 Autotests: fix dependency version var name. Commit. Fix memory leaks in kwalletd. Commit. Add Leave Manager Open to kcfg file. Commit. Export kcfg file in CMake config. Commit. Drop pseudo access control for wallet. Commit. KWidgetsAddons KColorMimeData: guard against a null QMimeData pointer. Commit. KMessageDialog: clean-up left-over KF5 times show event handling. Commit. KWindowSystem Remove outdated & unused CMakeFindFrameworks include. Commit. KXMLGUI Aboutkde: use better shadow for Konqi. Commit. Fix broken toolbars after second edit w/ multiple KXMLGUIClients. Commit. Fixes bug #442179 Mark more pimpl parent pointers as const, consistently be first member. Commit. Modem Manager Qt Do not use CMAKE_MODULE_PATH variable before it is created. Commit. Remove usage of no longer existing QT_DEFINITIONS CMake variable. Commit. Remove Qt4-times unused subdir CMakeLists.txt file for D-Bus support. Commit. Network Manager Qt Drop Q_FLAGS/Q_ENUMS on non-QObject/gadget types. Commit. Port away from deprecated Q_FLAGS. Commit. Oxygen Icons Fixes. Commit. More fixes. Commit. Bug fixing. Commit. Missing icon sizes. Commit. Minor bug fix. Commit. Add go-parent-folder icons for Bug 524878. Commit. Minor fix i hope to a rendering bug. Commit. Another derivative icon. Commit. More bug fixing. Commit. Bug fixing. Commit. New size and clean up, the symbolic needs to point to point to a correct version of the icons for how its used in plasma, renaming on the applet to the correct linked version would be more optimal IMO. Commit. Miss commit fix. Commit. New icon for KDebugSettings. Commit. Small improvements. Commit. More sizes. Commit. Just for testing. Commit. Aparently forgot to submit the source svg. Commit. 32X32 AND 22X22 OF KTIMER ICON VERSIONS. Commit. Improvement in visibility. Commit. New icon. Commit. Renaming. Commit. Missed an icon raster. Commit. Fixing a bug and removing the faoux backlight. Commit. New ktimer icon still missing the small sizes. Commit. Purpose Remove no longer used cmake variable. Commit. Removal of pastebin pulgin. Commit. QQC2 Desktop Style SwipeDelegate: remove workarounds for inset. Commit. TableHeaderViews: account for the margins of the root control. Commit. See bug #524099 Solid Upower: Return -1 for unknown battery percentages. Commit. See bug #518513 Autotests: drop usage of not existing LIBS variable. Commit. Sonnet Fix typo in function name. Commit. Syntax Highlighting Add DotEnv syntax highlighting. Commit. Repository.h: Make Repository::eventFilter() protected. Commit. Syntax/yaml.xml: Have BuildStream files use the yaml highlighter. Commit. Associate .envrc files with Bash. Commit. Add KDL syntax highlighting. Commit. Add Just syntax highlighting. Commit. Initialize more cmake variables explicitly. Commit.
  • KDE Plasma 6.7.5, Bugfix Release for September (2026/09/08 00:00)
    Today KDE releases a bugfix update to KDE Plasma 6, versioned 6.7.5. Plasma 6.7 was released in June 2026 with many feature refinements and new modules to complete the desktop experience. This release adds a month’s worth of new translations and fixes from KDE’s contributors. The bugfixes are typically small but important and include: View full changelog
  • Harmonicon v0.0.11, or, the harmonica I made up (2026/09/08 00:00)
    I tagged v0.0.11 last night. Or this morning. I’ve stopped keeping track of which side of midnight things happen on. Most of what’s in this tag I already went on about on Monday, in the weekly update: the harp swapping, the Guitar Pro files, the pitch detectors that turn out not to hear chords. Go read that one if you want the long version, and it is a long version, I checked. This is only about the four things that landed after I wrote it. Four things. Well. Three things, because one of them was me deleting a line out of a TODO file, and I’m not going to make you read a paragraph about that. The harmonica I made up So there was this line in my TODO list, and it said my chromatic harmonica was modelled as reaching less of its range than a diatonic, which is backwards. Chromatics are the ones that get all the notes. That’s the deal with a chromatic. You press the little button on the side and you get the notes in between, that is the entire pitch of the instrument, that’s why it costs four times as much as the other one. So I went in to fix it, expecting to add a missing technique somewhere, and what I found instead was that the layout in my code was not a chromatic harmonica. It was not a harmonica at all. It was a C major scale going up one note per hole. C D E F G A B C D E F G, straight up, like somebody had typed a scale into an array and gone to lunch, which, in fairness, is exactly what happened, and the somebody was me. A real 12-hole chromatic is solo tuned. It goes C E G C, then D F A B, and that four hole group repeats up the instrument for three octaves. That repeating is the whole point of it. That’s what makes one fingering work in every octave, that’s the thing you’re buying. Mine repeated nothing. Mine also stopped at A5 instead of C7, so fourteen of the thirty seven semitones between C4 and C7 weren’t reachable at all, on an instrument whose one job is reaching all of them. Fourteen out of thirty seven. On the chromatic. The one that gets all the notes. Nobody noticed, and here’s the bad part Now you’d think somebody would have noticed, and here is why nobody did, and it’s the part that actually bothers me. Both of the chromatic charts I ship had the made up layout copied into them. Both of them. So they agreed with the code perfectly, and the code agreed with them, and everybody in there was consistent and confident and describing an instrument nobody owns. One of those two charts, and I want you to appreciate this with me, one of those two charts is the lesson that teaches you the chromatic slide. So if you had gone out and bought a real chromatic harmonica, an actual physical one, made of metal, by a company, and you’d sat down to learn the slide from my game, the hole numbers would have been wrong. Every one of them. And nothing anywhere would have told you why, and you would have assumed the problem was you, because when you’re learning an instrument you always assume the problem is you, and about nine times in ten you’re right, and this was the tenth time. Both charts are re-fingered onto the real instrument now. The music didn’t change, and it couldn’t, because every event already recorded the pitch it sounds and those pitches were fine. It was only ever the hole numbers that were imaginary. So I re-resolved each event from its note instead of its hole: thirty three of them in Für Elise, sixteen in the lesson. Not one note moved. The slide lesson does now teach ten slides instead of fourteen, because on a real solo tuned harmonica more of those notes just sit on a plain reed and don’t need the button. Which is fine. Ten slides is plenty of slides. And the test that would have caught this doesn’t compare the charts to themselves, because as established they were extremely happy with themselves. It compares them against a tuning this codebase can actually build. The staff was lying too, only quietly Two smaller ones, both in the notation strip along the top. Accidentals were drawn per note instead of per bar. So if a tune leans on one altered note, and blues tunes do, a second position blues leans on its F# all day long, you got the same sharp redrawn in front of every single note. Which looks silly, but it’s worse than silly, because each one is about eleven pixels wide and an eighth note only has seventeen pixels to give in the first place. They hold for the rest of the bar now, like they do on paper. And every note that cancels one gets a real natural sign, because just skipping the repeats would have left a later plain F in that bar reading as an F#, and I’d have gone from drawing something redundant to drawing something false, which is a worse trade than it sounds. The staff itself was a fixed thirty four pixels per beat, and a notehead plus the accidental in front of it wants about twenty one, and a sixteenth note was getting eight and a half. They overlapped. Of course they overlapped. It works out the spacing from each song’s own density now, with a cap on it, because otherwise one busy bar shrinks how far ahead you can see down to about a bar and a half, and then you can’t read the thing at all. That’s v0.0.11. Still 0.0.x, still early, still on GitHub, still, as of this week, no longer shipping an instrument that does not exist.
Enter your comment. Wiki syntax is allowed:
Please fill all the letters into the box to prove you're human. D P C O P
 
  • news/planet/kde.txt
  • Last modified: 2021/10/30 11:41
  • by 127.0.0.1