Skip to content

Sunday, 8 June 2025

Pride Month, better MobiPocket performance and progress in Chessament

Welcome to a new issue of "This Week in KDE Apps"! Every week we cover as much as possible of what's happening in the world of KDE apps.

This week issue is a bit special as it is also covering the past week as last Sunday some other contributors and me were busy at the KDE booth at the Umweltfestival in Berlin.

Additionally, as it is the beginning of Pride Month, I would like to take this opportunity to celebrate and acknowledge the invaluable contributions of LGBTQIA+ members within the KDE community. Their work, creativity, and dedication continue to enrich our project and foster a more inclusive and diverse environment for all.

This celebration is especially important at a time when many large tech corporations are rolling back their visible support for the LGBTQIA+ community. KDE and other grass roots organisations have your back!

Getting back to all that's new in the KDE App scene, let's dig in!

Windows Store

Christoph Cullmann published a blog post about the state of KDE apps in the Microsoft Store. Things are looking good!

Multimedia Applications

Okular View and annotate documents

Stefan Brüns speed up the parsing of MobiPocket files considerably (25.08.0 - link 1, link 2 and link 3) and also fixed some parsing issues (link1 and link 2). These changes were implemented in QMobiPocket and improve the rendering speed in Okular for MobiPocket documents but also speed up Baloo indexing of these files and the creation of thumbnails in Dolphin.

Carl Schwan did some further improvements and reduced the number of temporary allocations (link 1, link 2 and link 3)

Carl Schwan fixed the detection of HTML inside mobipocket files (25.04.3 - link).

Sune Vuorela improved the scaling of stamps for annotations (25.08.0 - link). Now, when using a non-default sized stamp, the stamp won't appear pixelated anymore.

Haruna Media player

Victor Blanchard added an option to play the next video automatically in a playlist (link).

AudioTube YouTube Music app

Aleksandr Borodetckii added the option to sort the songs in the "Played songs" list by "last added" (link).

Travel Applications

KDE Itinerary Digital travel assistant

Volker added a departure details dialog. This dialog contains service alerts, occupancy information, vehicle amenities and the operator information when available (link), and published his bi-monthly blog post about all the changes in Itinerary, KTrip, Transitous and co.

Johannes Krattenmacher added ticket extractors for Stena, Viking and IHG (link).

KTrip Public transport navigator

Education Applications

Kig Interactive Geometry

Matthieu Carteron ported Kig to Qt6/KF6 (25.08.0 - Link).

Creative Applications

Krita Digital Painting, Creative Freedom

Freya Lupen fixed a crash when clearing the text field in text brush pipe mode (link).

System Applications

Dolphin Manage your files

Victor Blanchard added an off-by-default setting to automatically switch to icons view mode in folders with a lot of image or video files (25.08.0 - link).

Kai Uwe Broulik simplified how locations in window and tab titles for search results pages are displayed (25.08.0 - link).

Vladislav Kachegov fixed an incorrect view reset when unmounting similarly-named devices (link).

Social Applications

Tokodon Browse the Fediverse

Joshua Goins made it possible to boost your own private post (25.04.03 - link), improved the tooltips for disabled polls and attachment buttons (25.08.0 - link) and did some small improvements to the multi account handling (link).

Joshua also limited the number of poll choice using the limit defined by the server (25.08.0 - link) and fixed a crash when clicking on "Mark as Read" on the notifications page (25.04.3 - link).

NeoChat Chat on Matrix

James Graham made the view position itself correctly at the bottom when switching rooms (25.08.0 - link).

Browsers and Networking

KRDC Connect with RDP or VNC to another computer

Fabio Bas fixed a crash when the main window is outside of any screen (25.04.03 - link).

Alligator RSS feed reader

Julius Künzel fixed opening links with a relative URLs (25.04.03 - link 1 and link 2).

KDE PIM

KOrganizer KOrganizer is a calendar and scheduling application

Allen Winter fixed a crash in KOrganiser (link) and added a feature to display times in 24h format in the agenda view (link).

Games

Chessament - Chess tournament manager

Manuel Alcaraz created a new logo for Chessament (link).

Manuel also added a feature to select the color of the player. This can be set manually or be randomly chosen (link).

Utilities

KAIChat AI Chat

Laurent started working on a frontend for Ollama.

Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>

Alpaka An AI chat client

Siavosh Kasravi enabled a feature to save the prompt history in the session so that you can quickly re-execute or edit a previous prompt.

Anyone familiar with my blog will know that I like to write about incense. A reader wrote to me some time ago asking about what sticks I’ve been enjoying lately, and it occurred to me that it might be a nice thing to have a “now listening” type feature on my website, so that fellow incense heads could get a sense of the types of incense I like. After all, while I write plenty of incense reviews, they represent only a small percentage of the sticks, cones, powders, woods, and resins I’m burning or heating from day to day. (If you’re here for my incense content, feel free to skip this one and head to /now-burning to see the new feature!)

The issue of ergonomics #

While it would have been simple enough for me to build a microblogging feature into my Eleventy website, the trouble was wanting to use it after it was built. Unlike using a CMS such as WordPress to make a website, I knew of no nice interface for Eleventy, or for that matter any SSG, that would help me create a post and publish it online without opening an IDE[1] and using the command line. Instead, the process looks something like this:

A screenshot of a complicated looking text editor with a terminal widget at the bottom beside a copy of my website running on localhost.
I don’t necessarily want to feel like a hackerman every time I decide to make a tiny status update. Also, I just noticed that I totally screwed up the frontmatter for that post.

As big of a nerd as I am, I’m just not going to want to do that multiple times a day for what amounts to a status post. This lead me to scour the internet looking for a solution: something that I could run on my own desktop or laptop that could build my site locally and push changes to my website, hosted the old fashioned way: as a bunch of text files sitting on a server accessible via SFTP. No needless complexity like running Eleventy on the server, or using a host like Netlify.[2] Surely there’d be something, right? Surely, the realm of SSGs can’t be without at least one nice, local user interface that people can use without being a web developer?

An attempt to fix the problem #

In the end, I did find one answer to the problem: Publii. Publii seems to be made predominantly with end-users in mind, however. It’s not just a local[3] CMS, it’s an SSG in its own right, which does me no good as I can’t make it work with my website[4]. So after coming up with nothing I could use, I gave the idea a rest for a while until I had the epiphany that I could solve the problem with a simple script using KDE’s KDialog to provide a rudimentary UI. So that’s what I did.

The idea was simple: a wizard-like experience that guides the user through the creation of a microblog / status post. Post types and the data they collect should be customized by the user via a JSON configuration file. After the post data is collected from the user, the script should execute a user-defined build command as well as a user-defined command to sync the static files to the server.

Building “Poaster” #

For some reason, I decided to write my script in Ruby, a language for which I once completed a course before promptly forgetting everything I knew about it. I would have had a much easier time using JavaScript and Node, which I am much more familiar with and have successfully used for similar purposes. Why I did not is anyone’s guess. All this to say: please do not make (too much) fun of my shitty little script, which I have dubbed “Poaster.”

I started with the JSON configuration file, /Poaster/config/config.json:

{
    "buildCommand": "npx @11ty/eleventy",
    "postTypes": [
        {
            "name": "Now Burning",
            "postUnitName": "incense",
            "contentEnabled": true,
            "frontMatter": [
                {
                    "name": "title"
                },
                {
                    "name": "manufacturer"
                },
                {
                    "name": "date"
                },
                {
                    "name": "time"
                }
            ],
            "postDirectory": "/post/output/dir"
        }
    ],
    "uploadCommand": "rsync -av --del /local/path/to/site/output
username@my.server:/remote/path/to/public/site/files",
    "siteDirectory": "/local/path/to/site/repo"
}

Here, the user can specify as many post types as they like, each with their own output directory. Each post type can also collect as many pieces of frontmatter as the user cares to specify.

The first thing the script needed to do was ask the user which post type they want to create, so I referenced the KDialog tutorial and wrote a method to handle that /Poaster/lib/spawn_radio_list.rb:

def spawn_radio_list(title, text, options_arr)
  command = %(kdialog --title "#{title}" --radiolist "#{text}")
  options_arr.each_with_index do |option, i|
    command += %( #{i} "#{option}" off)
  end
  `#{command}`
end

I wrote a few more methods in /Poaster/lib to spawn toast notifications, input boxes, create directories if they don’t exist, and write files: /Poaster/lib/spawn_toast.rb:

def spawn_toast(title, text, seconds)
  `kdialog --title "#{title}" --passivepopup "#{text}" #{seconds}`
end

/Poaster/lib/spawn_input_box.rb:

def spawn_input_box(title, text)
  `kdialog --title "#{title}" --inputbox "#{text}"`
end

/Poaster/lib/ensure_dir_exists.rb:

def ensure_dir_exists(directory_path)
  unless Dir.exist?(directory_path)
    FileUtils.mkdir_p(directory_path)
    spawn_toast 'Directory Created', %(Poaster created #{directory_path}.), 10
  end
end

/Poaster/lib/write_file.rb:

def write_file(directory, name, extension, content)
  post_file = File.new(%(#{directory}/#{name}.#{extension}), 'w+')
  post_file.syswrite(content)
  post_file.close
end

All I had to do then was tie it all together in /Poaster/poaster.rb:

#!/usr/bin/env ruby
require 'json'
require 'fileutils'
require './lib/spawn_input_box'
require './lib/spawn_radio_list'
require './lib/spawn_toast'
require './lib/ensure_dir_exists'
require './lib/write_file'

config_data = JSON.parse(File.read('./config/config.json'))
dialog_title_prefix = 'Poaster'

# Populate types_arr with post types
post_types_arr = []
config_data['postTypes'].each do |type|
  post_types_arr.push(type['name'])
end

# Display post list dialog to user
post_type = config_data['postTypes'][Integer(spawn_radio_list(dialog_title_prefix, 'Select a post type:', post_types_arr))]

# Set the word we will use to refer to the post
post_unit = post_type['postUnitName']

# Collect frontmatter from user
frontmatter = []
post_type['frontMatter'].each do |item|
  frontmatter.push({ item['name'] => spawn_input_box(%(#{dialog_title_prefix} - Enter Frontmatter'), %(Enter #{post_unit} #{item['name']}:)) })
end

# Collect post content from user
post_content = spawn_input_box %(#{dialog_title_prefix} - Enter Content), %(Enter #{post_unit} content:)

# Make sure the output folder exists
post_directory = post_type['postDirectory']
ensure_dir_exists(post_directory)

# Create post string
post = %(---\n)
post_id = ''
frontmatter.each_with_index do |item, i|
  post += %(#{item.keys[0]}: #{item[item.keys[0]]})
  post_id += %(#{item[item.keys[0]].chomp}#{i == frontmatter.length - 1 ? '' : '_'})
end
post += %(---\n#{post_content})

# Write post string to file and notify user
post_file_name = %(#{post_type['name']}_#{post_id.chomp})
post_extension = 'md'

write_file post_directory, post_file_name, post_extension, post
spawn_toast 'File Created', %(Poaster created #{post_file_name}#{post_extension} at #{post_directory}.), 10

# Run build and upload commands
`cd #{config_data['siteDirectory']} && #{config_data['buildCommand']} && #{config_data['uploadCommand']}`

Burning now #

There is a lot that this script should do that it doesn’t, but for now, it’s still a handy wee utility for SSG users on GNU/Linux systems running KDE who want to make creating quick status-type posts a little less painful. Just make sure KDialog is installed (as well as Ruby, naturally), clone the repo, create /Poaster/config/config.json to meet your needs using the example as a reference and you’re off to the races! I’ve even made a silly little toaster icon using assets from some of the KDE MimeType icons that you can use if you want to make a .desktop file so that you can click an icon on your app launcher to start the script.

A screenshot showing Poaster in my app launcher.
Isn’t that nice?

My poaster.desktop file looks something like this:

[Desktop Entry]
Exec=/path/to/poaster.rb
GenericName[en_US]=Create a post with Poaster.
GenericName=Create a post with Poaster.
Icon=/path/to/poaster_icon.svg
Name=Poaster
NoDisplay=false
Path=/path/to/repo/
StartupNotify=true
Terminal=false
Type=Application

Here’s the script in action:

The ease! The convenience!

To build the new “now burning” incense microblog feature, I created two new pages. /now-burning shows the latest entry:

---
layout: layouts/base.njk
title: "Nathan Upchurch | Now Burning: What incense I'm burning at the moment."
structuredData: none
postlistHeaderText: "What I've been burning:"
---
{% set burning = collections.nowBurning | last %}

<h1>Now Burning:</h1>
<article class="post microblog-post">
	<img class="microblog-icon" src="/img/censer.svg">
	<div class="microblog-status">
		<h2 class="">{{ burning.data.title }}{% if burning.data.manufacturer %}, {{ burning.data.manufacturer }}{% endif %}, {{ burning.date | niceDate }}, {{ burning.data.time }}</h2>
		{% if burning.content %}
		<div class="microblog-comment">
			{{ burning.content | safe }}
		</div>
		{% endif %}
	</div>
</article>
<a href="/once-burned/">
	<button type="button">Previous Entries »</button>
</a>

…and /once-burned shows past entries:

---
layout: layouts/base.njk
title: "Nathan Upchurch | Once Burned: Incense I've burning in the past."
structuredData: none
---
{% set burning = collections.nowBurning | last %}

<h1>Previous “Now Burning” Entries:</h1>
{% set postsCount = collections.nowBurning | removeMostRecent | length %}
{% if postsCount > 0 %}
{% set postslist = collections.nowBurning | removeMostRecent %}
{% set showPostListHeader = false %}
{% include "incenseList.njk" %}
{% else %}
<p>Nothing’s here yet!</p>
{% endif %}
<a href="/now-burning/">
	<button type="button">Latest »</button>
</a>

…using a post-listing include built specifically for microblogging:

<section class="postlist microblog-list">
	{% if postlistHeaderText %}<h2>{{ postlistHeaderText }}</h2>{% endif %}
	<div class="postlist-item-container">
		{% for post in postslist | reverse %}
		<article class="postlist-item">

			<div class="post-copy">
					<h3>
						{% if post.data.title %}{{ post.data.title | safe }}{% else %}?{% endif %}{% if post.data.manufacturer %}, {{ post.data.manufacturer | safe }}{% endif %}
					</h3>

				<div class="post-metadata">
					<div class="post-metadata-copy">
						<p>
						<time datetime="{{ post.date | htmlDateString }}">{{ post.date | niceDate }}{% if post.data.time %}—{{ post.data.time }}{% endif %}</time>
						</p>
					</div>
				</div>
				{% if post.content %}
				<div class="microblog-comment">
					{{ post.content | safe }}
				</div>
				{% endif %}
			</div>
		</article>
		<hr>
		{% endfor %}
	</div>
</section>

And that’s about it! There’s a lot to do to make the script a little less fragile, such as passing along build / upload error messages, allowing for data validation via regex, et cetera. I’m sure I’ll get to it at some point. If Poaster is useful to you, however, and you’d like to submit a patch to improve it, please do let me know.


  1. Yes, I am aware that Kate isn’t technically an IDE. ↩︎

  2. At risk of sounding crabbit and behind the times, I don’t know why web development has to be so damned complicated these days. Like, an entire fancy for-profit infrastructural platform that exists just to host static websites? It seems nuts to me. ↩︎

  3. Thank christ. Why does everything need to run in the cloud when we already have computers at home? ↩︎

  4. I did however use it to very quickly set up a nice looking blog site for my partner. ↩︎

Kicking Off with EteSync and UI Decoupling

The first week of my Google Summer of Code journey with the KDE community has nearly come to an end, and it’s been an exciting start. As a quick reminder, my project — “Merkuro – Porting Away from QtWidgets” — focuses on making Akonadi components leaner by decoupling their UI from core logic and reducing dependencies on QtWidgets.


Choosing Where to Begin

Originally, I planned to begin with the KMail agents. However, after discussing it with one of my mentors, Claudio, we realized that these agents may benefit from more than just UI decoupling — they are prime candidates to be moved into the kdepim-runtime repository. This would help consolidate Akonadi agents and resources for better maintainability and cohesion.

Because this is a larger architectural change, we agreed it would be more effective to tackle it later in the project.


Refocusing on Resources Within kdepim-runtime

I shifted my focus to the agents and resources already in kdepim-runtime. I was pleased to see that some groundwork for decoupling had already been laid for resources like DAV, Google, and IMAP, giving me a solid reference to work from.

With a clear direction, I chose the EteSync resource as my first decoupling target.


Decoupling the EteSync Resource

This week, I carried out three main tasks:

  1. Refactoring the Core Code
    I modified etesyncresource.cpp/.h and etesyncclientstate.cpp/.h to remove all UI-related logic previously embedded in the core functionality.

  2. Updating the Build System
    I adjusted the CMakeLists.txt to ensure the resource no longer compiles or links against any QtWidgets-based code.

  3. Creating the UI Plugin
    I created a dedicated configuration plugin consisting of etesyncconfig.cpp and its corresponding .json metadata file. All UI-related code now lives in this separate plugin.


Testing with Akonadi Console

To verify my changes, I’ve been using the Akonadi Console, a powerful tool that lets developers inspect and manage Akonadi agents and resources in real time. My goal is to ensure the refactored EteSync resource functions correctly in Merkuro, Kontact, and any other application that uses Akonadi.


What’s Next?

Before submitting a merge request, I plan to carry out thorough initial testing to ensure everything is stable and there are no regressions. Once the EteSync resource is confirmed to work cleanly with the plugin, I’ll move on to the next target in the decoupling process.

It’s been a productive first week, and I’m looking forward to building on this momentum in the weeks to come!

Saturday, 7 June 2025

Welcome to a new issue of This Week in Plasma! Every week we cover the highlights of what’s happening in the world of KDE Plasma and its associated apps like Discover, System Monitor, and more.

This week we continued to focus on bug fixing and user interface polish for Plasma 6.4, which will be released next Thursday. As a result, a lot of impactful changes were merged! Check it out:

Notable UI Improvements

Plasma 6.4.0

On System Settings’ Wi-Fi & Internet page, the networks list is now fully keyboard-navigable, and uses KDE’ s standard list item styling. (Christoph Wolk, link)

The Kicker Application Menu widget’s favorites list is now fully keyboard-accessible. (Christoph Wolk, link)

Disabled the ability to drag screens on top of other screens on System Settings’ Display & monitor page, because this would produce a screen arrangement that isn’t supported and would trigger many very strange bugs throughout the system. (David Redondo, link)

Waking up a sleeping computer by pressing the power button no longer causes the logout screen to be shown after the system waked up and you unlock it. (Niccolò Venerandi, link)

Did some UI polishing on the Digital Clock widget’s config window, resulting in better alignments overall. (Christoph Wolk, link)

Digital Clock config dialog with good control alignment

When you have a complex panel arrangement with variable-length panels on adjacent screen edges, the horizontal panels now always take priority for filling the empty space, so you never run into a situation where multiple panels are fighting for the same space and sometimes overlap. (Marco Martin, link)

Increased the visibility of the System Monitor’s per-process CPU line charts for selected list items. (Arjen Hiemstra, link

Plasma 6.5.0

Switching the time span on Info Center’s Energy page now smoothly animates the graph view to show the new time span. (Ismael Asensio, link)

System Settings’ Fonts page now prevents you from breaking your system entirely by setting the fonts to something below 4pt. Also if you set a font size between 5 and 6 pt, it now also warns you that Plasma was really not designed to handle this, and that screen scaling may be a better approach. (Nate Graham, link)

Made the text of the “Your disk is in trouble” notification fit into the header. (Harald Sitter, link)

Notable Bug Fixes

Plasma 6.3.6

System Monitor once again lets you see the current table columns while the table column configuration dialog is open. (Nate Graham, link)

Plasma 6.4.0

Putting a Sticky Note widget on a very thick panel can no longer cause Plasma to freeze; now you can use a thick panel with a sticky note on it as a sort of notes sidebar! (Christoph Wolk, link)

Fixed the most common System Monitor crash. (Arjen Hiemstra, link)

Fixed another crash in System Monitor, this time a divide-by-zero. (Arjen Hiemstra, link)

Fixed a case where xdg-desktop-portal-kde could crash after you choose a video source to start streaming. (David Redondo, link)

Fixed a bug that caused Discover to crash if you close it immediately after it launched. (Wendi Gan, link)

Fixed multiple subtle bugs with the screen chooser widget and OSD that caused it to do the wrong thing on rotated screens or when mirroring screens. (David Redondo, link)

Fixed a bug that caused System Settings’ search field to not be focused properly when pressing Ctrl+F while any UI elements in a settings page already had focus. (Marco Martin, link)

Fixed the root cause of multiple issues involving windows disappearing when you disconnect the screen they’re on! (Xaver Hugl, link)

Clicking a button on a desktop widget that opens a menu no longer inappropriately makes the widget enter Widget Edit Mode. (Christoph Wolk, link)

Files with a # or ? character in their name or full path are no longer unexpectedly missing from the history lists in Kicker/Kickoff/etc launchers. (Christoph Wolk, link 1 and link 2)

Fixed a bug that caused the screen chooser window to sometimes not appear as expected when OBS was launched. (David Redondo, link)

Fixed a bug that caused tiled windows on a multi-screen setup to lose their tiling settings when the system went to sleep and woke up again. (Xaver Hugl, link)

The “Move window to [activity]” feature now works properly when invoked from the Task Manager widget. (Christoph Wolk, link)

Fixed a bug in the Kicker Application Menu that caused keyboard navigation to not work if the popup opened with an item under the pointer. (Christoph Wolk, link)

In the Overview effect’s grid view, dragging windows tiled on one virtual desktop over to a different virtual desktop now keeps them tiled as expected. (Vlad Zahorodnii, link)

Plasma 6.5.0

Fixed a bug that caused the Networks widget to sometimes incorrectly think you had a hotspot enabled after you disconnect from the active Wi-Fi network. (Niccolò Venerandi, link)

Frameworks 6.15

Fixed a bug that caused certain list items throughout Plasma and KDE apps with inline buttons to sometimes mis-position their buttons. (Efe Çiftci, link)

Other bug information of note:

Notable in Performance & Technical

Plasma 6.4.0

Improved cursor smoothness and reduced flicker associated with the use of the variable refresh rate feature. (Xaver Hugl, link)

Reduced unnecessary CPU usage on System Monitor’s Processes page even more. (David Edmundson, link 1 and link 2) Prevented a ton of ignorable but scary-seeming “Page flip failed!’ warnings from appearing in the journal log while watching a full screen video in MPV. (Xaver Hugl, link)

Plasma 6.5.0

If you modify the keyboard layout using the kwriteconfig command-line tool, those changes now take effect immediately. (Bojidar Marinov, link)

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.

You can help KDE by becoming an active community member and getting involved somehow. 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 us by making a donation! Any monetary contribution — however small — will help us cover operational costs, salaries, travel expenses for contributors, and in general just keep KDE bringing Free Software to the world.

To get a new Plasma feature or a bugfix mentioned here, feel free to push a commit to the relevant merge request on invent.kde.org.

Friday, 6 June 2025

Let’s go for my web review for the week 2025-23.


Bonfire’s new software lets users build their own social communities

Tags: tech, social-media, fediverse, foss

Nice to see one more implementation available for the fediverse. This one comes with interesting features actually.

https://techcrunch.com/2025/06/05/bonfires-new-software-lets-users-build-their-own-social-communities-free-from-platform-control/


DNS4EU For Public

Tags: tech, dns, gdpr, privacy

Interesting initiative to have DNS servers compliant with GDPR, respecting your privacy and with the filtering you need. Now the real question is how long it’ll live by its mission.

https://www.joindns4.eu/for-public


yet another LLM

Tags: tech, ai, machine-learning, gpt, criticism, funny

This is a funny way to point out people jumping on LLMs for tasks where it doesn’t make sense.

https://www.yetanotherllm.com/


Artificial Power: 2025 Landscape Report - AI Now Institute

Tags: tech, ai, machine-learning, gpt, gafam, economics, politics

A long but important report in my opinion. Reading the executive summary is a must. This gives a good overview of the AI industrial complex and the type of society it’s leading us into. The report also gives a political agenda to put us on a better path.

https://ainowinstitute.org/publications/research/ai-now-2025-landscape-report


It turns out you can train AI models without copyrighted material

Tags: tech, ai, machine-learning, gpt, copyright, foss, ethics

If there was still any doubt that the arguments coming from the big model providers were lies… Yes, you can train large models using a corpus of training data for which you respect the license. With the diminish return in performance of the newer families of models, the performance they got from the model trained on that corpus is not bad at all.

https://www.engadget.com/ai/it-turns-out-you-can-train-ai-models-without-copyrighted-material-174016619.html?src=rss


Deep learning gets the glory, deep fact checking gets ignored

Tags: tech, ai, machine-learning, biology, science, research

We already had reproducibility issues in science. With such models which allow to produce hundreds of “novel” results in one paper, how can we properly keep up in checking all the produced data is correct? This is a real challenge.

https://rachel.fast.ai/posts/2025-06-04-enzyme-ml-fails/index.html


Using ‘Slop Forensics’ to Determine Model Ancestry

Tags: tech, ai, machine-learning, gpt, research

Interesting research to determine how models relate to each other. This becomes especially important as the use of synthetic data increases.

https://www.dbreunig.com/2025/05/30/using-slop-forensics-to-determine-model-ancestry.html


The effects of over-reliance on AI dialogue systems on students’ cognitive abilities: a systematic review

Tags: tech, ai, machine-learning, gpt, cognition, learning

Somehow I missed this paper last year. Interesting review of studies on the use of gen AI chat systems in learning and research environments. The amount of ethical issues is non negligible as one would expect. It also confirms the negative impact of using those tools on cognitive abilities. More concerning is the creation of a subtle vicious circle as highlighted by this quote: “regular utilization of dialogue systems is linked to a decline in abilities of cognitive abilities, a diminished capacity for information retention, and an increased reliance on these systems for information”.

https://slejournal.springeropen.com/articles/10.1186/s40561-024-00316-7


Brainrot: why I quit using ChatGPT

Tags: tech, ai, machine-learning, gpt, cognition, learning

A personal experience which led to not using ChatGPT anymore. This kind of validates other papers on cognitive decline, the added value is in how it makes it more personal and concrete.

https://elinesandes.medium.com/brain-rot-why-i-quit-using-chatgpt-844a46db3cc1


I Think I’m Done Thinking About genAI For Now

Tags: tech, ai, machine-learning, gpt, copilot, economics, ecology, philosophy, quality, ethics

I don’t think I’m ready to give up just yet… Still, I recognise myself so much in this piece it feels like I could have written it (alas I don’t write that well).

https://blog.glyph.im/2025/06/i-think-im-done-thinking-about-genai-for-now.html


Autonomous coding agents: A Codex example

Tags: tech, ai, machine-learning, gpt, copilot

Interesting little experiment. It’s clearly making progress for smaller tasks. The output is still a bit random and often duplicates code though.

https://martinfowler.com/articles/exploring-gen-ai/autonomous-agents-codex-example.html


beachpatrol: A CLI tool to replace and automate your daily web browser

Tags: tech, web, browser, tools, scripting, automation

Early days for this project but the idea is interesting. I could clearly things I’d want to automate that way.

https://github.com/sebastiancarlos/beachpatrol


No More Shading Languages: Compiling C++ to Vulkan Shaders

Tags: tech, graphics, gpu, vulkan, shader

Somehow this is funny that it works at all. With the advent of SPIR-V we’re clearly seeing more experiments in the shading languages space.

https://xol.io/random/vcc-paper.pdf


C++ to Rust Phrasebook

Tags: tech, programming, rust, c++, learning

It’s a very good idea to help C++ developers pickup Rust.

https://cel.cs.brown.edu/crp/title-page.html


How to deal with Rust dependencies

Tags: tech, dependencies, supply-chain, rust

Not strictly about Rust, still is shows how to approach the conversation about your dependencies. It also gives good ideas on how to try to reduce them.

https://notgull.net/rust-dependencies/


Why Use Structured Errors in Rust Applications?

Tags: tech, programming, rust, safety

Interesting post about the options for error handling in Rust. It highlights the tradeoffs to keep in mind when creating structured errors.

https://home.expurple.me/posts/why-use-structured-errors-in-rust-applications/


Designing Error Types in Rust Libraries

Tags: tech, programming, rust

Due to how errors are handled in Rust, designing them is a real concern. Several approaches are presented here, using wrapper types is likely the better trade off.

https://d34dl0ck.me/rust-bites-designing-error-types-in-rust-libraries/index.html


Simpler backoff

Tags: tech, programming

A good reminder that it is sometimes better to use lookup tables.

https://commaok.xyz/post/simple-backoff/


Tests should not contain logic

Tags: tech, tests, tdd, complexity

A good reminder that the complexity of tests should be as low as possible.

https://blog.snork.dev/posts/tests-should-not-contain-logic.html


Decomplexification

Tags: tech, programming, quality, complexity

Nice illustration on how you can hunt down complexity in your codebases. It is obviously a slow process but comes with nice benefits.

https://daniel.haxx.se/blog/2025/05/29/decomplexification/


Be Empirical

Tags: tech, programming, craftsmanship, learning, debugging

This is an important piece of advice. You need to try things for yourself and fail to really learn. I’m not talking about failing in production of course. But trying to break something locally to see how it behaves, reading the errors, etc. is part of learning. This is how you will troubleshoot things faster the next time.

https://kevbuchanan.github.io/posts/be-empirical


Extreme Carpaccio

Tags: tech, agile, programming, xp, learning, teaching

This looks like a really fun workshop. Been wanting to run one for a long time now. Somehow I never had the chance.

https://diegolemos.net/2016/01/07/extreme-carpaccio/


Convolutions, Polynomials and Flipped Kernels

Tags: tech, mathematics

I always find interesting how several math domains have similarities and bridges between them. Here it’s about the ties between polynomials multiplications and convolution sums.

https://eli.thegreenplace.net/2025/convolutions-polynomials-and-flipped-kernels/


A Short History of “Hack”

Tags: tech, hacking, culture

A good piece so that the origin of the term doesn’t get lost.

https://www.newyorker.com/tech/annals-of-technology/a-short-history-of-hack


Are we reading Machiavelli wrong?

Tags: philosophy, politics

I’m really glad about this interview. I’ve been thinking that Machiavelli texts have been wrongly considered for a long time now. It’s time to reconsider what Machiavellian should really mean.

https://www.vox.com/the-gray-area/414753/machiavelli-prince-authoritarian-critique-political-philosophy



Bye for now!

Intro

Hi all! My name is Ross Rosales. I am a self-taught Software Engineer and former Registered Nurse with a background in the Emergency Deparment. Through the great community of KDE and Open Source I gained so much valuable experience that I apply in my everyday career and life. As I continue learning everyday, I want to share what I'll be working on over the next 12 weeks.

About Krita

Krita is an amazing open source and free painting program with countless growing features. Although I may not paint or draw very well myself, I've always admired how artists are able to create anything they can put their mind to with the tools at their disposal. My goal is to contribute to Krita and support all artists by helping their ideas become reality.

Proposal

To make artists' workflow easier, this GSoC I plan to create a floating toolbar that will contain common selection actions artists frequently switch between. The idea is to improve accessibility to tools that may not be intuitive to new or experienced users. Link to my proposal

Plans

In addition to sharing my progress on the Selection Action Bar for GSoC, I also plan to write about how new contributors can join the KDE community and reduce the barrier to entry for Krita. I’ll do this through personal walkthroughs covering environment setup, writing code for the first time, engaging with the community, and providing quick links to helpful resources—all in one place.

Special Thanks

Thank you to the KDE and Krita communities for giving me the opportunity to join such an amazing group of individuals. Special thanks to Dmitry, Emmet, Halla, Tiar, Wolthera, and everyone I interact with in Krita Chat!

Contact

To anyone reading this, please feel free to reach out to me. I’m always open to suggestions and thoughts on how to improve as a developer and as a person.
Email: ross.erosales@gmail.com
Matrix: @rossr:matrix.org

Welcome to the May 2025 development and community update.

Community Report

May 2025 Monthly Art Challenge Results

24 forum members took on the challenge of the "Humongous Hats" theme. And the winner is… Mouse Sage 🐭 by @Mythmaker

Mouse Sage 🐭 by @Mythmaker

The June Art Challenge is Open Now

For the June Art Challenge, @Mythmaker has passed the honor of choosing the topic to regular participant @Corentin, who has chosen "Wrath of the Sun" as the theme. Interpret this title however you want, optionally include some sort of decorative design, and have fun with the sun!

Best of Krita-Artists - April/May 2025

This month's Best of Krita-Artists Nominations thread received 20 nominations of forum members' artwork. When the poll closed, these five wonderful works made their way onto the Krita-Artists featured artwork banner: King-under-Leaves by @canedo

King-under-Leaves by @canedo

Illustration by @JoaoGGarin

Illustration by @JoaoGGarin

Tree Sparrow by @kacart

Tree Sparrow by @kacart

Splattery trees by @SebSepia

Splattery trees by @SebSepia

New Life Zone by @Yaroslavus_Artem

New Life Zone by @Yaroslavus_Artem

Best of Krita-Artists - May/June 2025

Take a look at the nominations for next month, and suggest your favorite latest artworks to be featured. Don't forget to vote when the poll opens on June 11th!

Ways to Help Krita

Krita is Free and Open Source Software developed by an international team of sponsored developers and volunteer contributors. That means anyone can help make Krita better!

Support Krita financially by making a one-time or monthly monetary donation. Or donate your time and Get Involved with testing, development, translation, documentation, and more. Last but not least, you can spread the word! Share your Krita artworks, resources, and tips with others, and show the world what Krita can do.

Other Notable Changes

Other notable changes in Krita's development builds from May 8 - June 6, 2025.

Stable branch (5.2.10-prealpha):

  • General: Fix a crash when autosaving heavy images with lots of compositions and an adjustment layer with vector selection. (Change, by Dmitry Kazakov)
  • File Formats: TIFF: Fix TIFF file size bloating after each overwrite. (Change, by Igor Danilets)
  • General: Change Resize Canvas's 'Constrain proportions' toggle to not reset the canvas size. (bug report) (Change, by Halla Rempt)
  • Linux: Upgrade AppImage base to Ubuntu 2204. (Change, by Dmitry Kazakov)

Unstable branch (5.3.0-prealpha):

Bug fixes:

  • Android: Fix the Text Properties Docker being blank. (bug report) (Change, by Dmitry Kazakov)
  • General: Fix floating toolbars disappearing on restart. (bug 504463) (Change, by Freya Lupen)
  • Python Plugins: Workflow Buttons Docker: Fix Pan and Text Tool buttons. (bug report) (Change, by Freya Lupen)

Features:

  • Text Properties Docker: Allow configuring when each property should be shown in the list; always, never, when set, or when relevant (inherited or set). (Change, by Wolthera van Hövell)
  • Text Properties Docker: Add Text Rendering property, for antialiasing/hinting options. (Change, by Wolthera van Hövell)
  • SVG: Handle SVG title and desc metadata. (Change, by Wolthera van Hövell)
  • Shortcuts/Toolbars: Add Force Palette Colors action to limit color selection to colors in the palette. (Change, by Halla Rempt)
  • Python Plugins/Scripting: Add and use FileDialog class, which uses Krita's wrapper around QFileDialog in order to respect Krita's "Don't use native file dialogs" setting. (bug report, bug report) (Change, by Freya Lupen)

Nightly Builds

Pre-release versions of Krita are built every day for testing new changes.

Get the latest bugfixes in Stable "Krita Plus" (5.2.10-prealpha): Linux - Windows - macOS (unsigned) - Android arm64-v8a - Android arm32-v7a - Android x86_64

Or test out the latest Experimental features in "Krita Next" (5.3.0-prealpha). Feedback and bug reports are appreciated!: Linux - Windows - macOS (unsigned) - Android arm64-v8a - Android arm32-v7a - Android x86_64

Thursday, 5 June 2025

I was recently interviewed by Jonathan Bennett of the FLOSS Weekly show! If you aren’t totally sick of my ugly mug yet, you can hear me talk about some of my favorite topics: KDE on hardware, onboarding people to Plasma, the importance of preserving readiness, and how difficult it is to actually install and uninstall software on a Mac. You can check it out at https://hackaday.com/2025/06/04/floss-weekly-episode-835-board-member-b/, or watch the video version here:

I’ve written a small Neovim plugin which might be useful to people who often work on several projects in parallel.

It activates a specific theme based on the project you are working on (the current directory you start Neovim from).

It allows you to define which themes should be used for which projects. The configuration is simple and allows specifying patterns for matching project names (not full regex, but what Lua supports).

My configuration looks something like this (this is in Fennel, for the Lua version, check out the readme):

:opts {
    :themes [
        { :matcher "radio" :theme "nordic" }
        { :matcher "^/kde" :theme "hybrid" }
        { :matcher "qt$"   :theme "moonfly" }
    ]
    :defaultTheme "habamax"
    :postExec {
        :moonfly [ ":hi TabLineSel guibg=#508050 guifg=#f0f0f0" ]
        :nordic  [ ":hi TabLineSel guibg=#5070f0 guifg=#f0f0f0" ]
        :hybrid  [ ":hi TabLineSel guibg=#80a020 guifg=#f0f0f0" ]
    }
}

The source code, and the instructions how to use it are available on GitLab.

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:

  • kdenlive: Fix bin clip effects disappear after disabling a timeline clip (Commit, fixes bug #439194)
  • knights: When saving the game, use the proper extension "pgn" in case no extension was provided (Commit, fixes bug #502963)
  • kreversi: Fix inconsistent availability of undoing after end of game (Commit, fixes bug #351812)

Distro and app store packagers should update their application packages.