<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SoK on KDE Blogs</title><link>https://blogs.kde.org/categories/sok/</link><description>Recent content in SoK on KDE Blogs</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Tue, 07 Apr 2026 17:19:13 +0000</lastBuildDate><atom:link href="https://blogs.kde.org/categories/sok/index.xml" rel="self" type="application/rss+xml"/><item><title>Season of KDE 2026 – Final Blog</title><link>https://blogs.kde.org/2026/04/07/sok-final-keshav-nanda/</link><pubDate>Tue, 07 Apr 2026 00:00:00 +0000</pubDate><author>Keshav-Nanda</author><guid>https://blogs.kde.org/2026/04/07/sok-final-keshav-nanda/</guid><description>&lt;p&gt;Greetings to everyone in the KDE community!&lt;/p&gt;
&lt;p&gt;As SoK '26 comes to a close, this blog post summarizes the work done in the second half.
Please refer to my &lt;a href="https://blogs.kde.org/2026/03/20/sok-midterm-keshav-nanda/"&gt;mid-term blog post&lt;/a&gt;
for further context.&lt;/p&gt;
&lt;p&gt;My SoK task was to ensure all the &lt;code&gt;.pot&lt;/code&gt; files generated have source references
relative to the project root.&lt;/p&gt;
&lt;p&gt;Upon discussion with my mentor, &lt;a href="https://invent.kde.org/finw"&gt;Finley Watson&lt;/a&gt;, and my
teammate &lt;a href="https://invent.kde.org/faucetfailure"&gt;Aviral Singh&lt;/a&gt;, we decided to create merge
requests to a throwaway repo made by our mentor to ensure that all the messy commits are
cleaned up and functioning well. This was also done to ensure that the MRs don't create
regressions of any kind.&lt;/p&gt;
&lt;p&gt;I created an &lt;a href="https://invent.kde.org/finw/project_relative_scripty_paths/-/merge_requests/1"&gt;MR&lt;/a&gt;
that modifies the &lt;code&gt;createdesktopcontext.pl&lt;/code&gt; file. Instead of using lazy regex to manipulate
the path string and extract a basename, I used Perl's built-in &lt;code&gt;File::Spec-&amp;gt;abs2rel&lt;/code&gt; to
compute the correct project-root-relative path programmatically.&lt;/p&gt;
&lt;p&gt;I also created &lt;a href="https://invent.kde.org/sysadmin/l10n-scripty/-/merge_requests/121"&gt;MR !121&lt;/a&gt;
which makes use of Aviral's validation script to ensure that the logs generated match the
format of &lt;a href="https://logs.l10n.kde.org/260323.branches_stable_l10n-kf6"&gt;Scripty's existing logs&lt;/a&gt;.
The MR ensures that there is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;One &lt;code&gt;WARNING in &amp;lt;file&amp;gt;: &amp;lt;message&amp;gt;&lt;/code&gt; line per bad path&lt;/li&gt;
&lt;li&gt;One self-contained summary line per POT, always printed&lt;/li&gt;
&lt;li&gt;Zero noise when everything is clean&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Looking back, SoK has taught me a lot of things. I've learnt how to navigate complex
codebases, read and write Bash and Perl, and deal with complex version control rather
than just &lt;code&gt;git add .&lt;/code&gt;, &lt;code&gt;git commit -m&lt;/code&gt; and &lt;code&gt;git push&lt;/code&gt; ;)&lt;/p&gt;
&lt;p&gt;I've also realised how important commit history and messages are (which I never paid much
attention to while developing personal projects). Overall, this has been an amazing and
enjoyable experience for me and I would like to thank my mentor Fin for the guidance, and
Aviral for being a great teammate throughout.&lt;/p&gt;</description></item><item><title>Season of KDE 2026 - Fixing the Glossary in Lokalize (Final)</title><link>https://blogs.kde.org/2026/04/06/season-of-kde-2026-fixing-the-glossary-in-lokalize-final/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><author>Jaimukund Bhan</author><guid>https://blogs.kde.org/2026/04/06/season-of-kde-2026-fixing-the-glossary-in-lokalize-final/</guid><description>&lt;p&gt;Greetings to the KDE community!&lt;/p&gt;
&lt;p&gt;This is a blog which follows my &lt;a href="https://blogs.kde.org/2026/03/08/season-of-kde-2026-fixing-the-glossary-in-lokalize-midterm/"&gt;previous post&lt;/a&gt; and includes the work I did in the second half of Season of KDE.&lt;/p&gt;
&lt;h3 id="improved-manual-glossary-term-addition"&gt;&lt;a href="https://invent.kde.org/sdk/lokalize/-/merge_requests/295"&gt;Improved manual Glossary term addition&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There are two methods to add terms to the glossary. The first one is to highlight the source and target terms in the Editor Tab, and then using the context menu in the Glossary View to &lt;code&gt;Define a New Term&lt;/code&gt;. The second is to manually add new terms through the Glossary Tab without any prior text selection. Previously, when a term had to be added manually, a blank entry was made first, which the user could then edit. This meant that multiple blank entries could be accidentally accumulated in the Glossary file.
Users are now prompted to enter the source and target terms in a dialog box when trying to add terms manually, removing the need of creating blank entries.&lt;/p&gt;
&lt;h3 id="fixed-the-shortcut-key-for-previous-active-tab"&gt;&lt;a href="https://invent.kde.org/sdk/lokalize/-/merge_requests/296"&gt;Fixed the shortcut key for Previous Active Tab&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The shortcut key for switching to the Previously Active Tab was not working properly as the &lt;code&gt;currentChanged&lt;/code&gt; signal updated the current index of the &lt;code&gt;m_mainTabs&lt;/code&gt; before the previous index could be saved to the &lt;code&gt;previousActiveTabIndex&lt;/code&gt; variable.
I updated the event filter to catch tab switches made through mouse clicks and replaced the integer variable with a widget pointer, since it would remain valid even if tab positions change, whereas an index-based would require calculations.&lt;/p&gt;</description></item><item><title>Making Plasma Setup More Mobile-Friendly: A SoK'26 Conclusion</title><link>https://blogs.kde.org/2026/03/31/making-plasma-setup-more-mobile-friendly-a-sok26-conclusion/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><author>Onat Ribar</author><guid>https://blogs.kde.org/2026/03/31/making-plasma-setup-more-mobile-friendly-a-sok26-conclusion/</guid><description>&lt;p&gt;Hey everyone! SoK '26 is wrapping up, so here's my final post. If you haven't read the midterm update yet, I'd recommend starting there — this post picks up from where that one left off.&lt;/p&gt;
&lt;p&gt;Some relevant links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blogs.kde.org/2026/03/12/making-plasma-setup-more-mobile-friendly-a-sok26-midterm-update/"&gt;Midterm blogpost&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://invent.kde.org/teams/mentor-programs/2026/-/issues/51"&gt;Project proposal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.kde.org/SoK/2026/StatusReport/Onat_Ribar"&gt;Status report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://invent.kde.org/plasma/plasma-setup/-/merge_requests/95"&gt;MR: plasma-setup !95&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/6411"&gt;MR: plasma-workspace !6411&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tldr-the-project"&gt;TLDR: The project&lt;/h3&gt;
&lt;p&gt;Plasma Setup is KDE's first-run wizard: it greets you on a fresh install and walks you through account creation, keyboard layout, timezone, and basic system config. It was built with desktop screens in mind, and my project was to make it work properly on phones and tablets running Plasma Mobile
without breaking the desktop experience.&lt;/p&gt;
&lt;h3 id="where-the-midterm-left-things"&gt;Where the midterm left things&lt;/h3&gt;
&lt;p&gt;By the midterm I had worked through most of the UI issues: overlapping components, wallpaper disappearing on portrait layouts, the wizard not filling the screen on mobile, the hostname field overflowing, the timezone page's OpenStreetMap widget being too fiddly for touchscreens. Two MRs were open, one in &lt;code&gt;plasma-setup&lt;/code&gt; and one in &lt;code&gt;plasma-workspace&lt;/code&gt; for the timezone selector since that component lives there. The plan was to spend the remaining weeks getting them merged.&lt;/p&gt;
&lt;p&gt;That's roughly what happened, though it took longer than expected. I requested a two-week extension so we could handle the review process properly rather than rushing it.&lt;/p&gt;
&lt;h3 id="what-the-second-half-looked-like"&gt;What the second half looked like&lt;/h3&gt;
&lt;p&gt;Mostly review cycles. Writing the MRs was one thing; getting them merge-readywas another. A fair amount of that time was spent in the terminal, checking diffs, rebasing, keeping the history clean, more than it was actually writing new code. Anyone who's worked on a shared codebase knows how that goes.&lt;/p&gt;
&lt;p&gt;The MRs were fairly dynamic throughout. Ideas came up during review that hadn't been in the original scope, some made it in, some got tested and scrapped. The final diff looks quite different from what was there at first open, which is usually a sign the review process is doing its job.&lt;/p&gt;
&lt;p&gt;What I did recalibrate to was the specific culture of OSS contribution. The conventions are different from a professional codebase: how commits are structured, how feedback is framed, what a well-scoped MR looks like in this context. Not a harder or easier bar, just a different one, and getting fluent in it is part of the work.&lt;/p&gt;
&lt;h3 id="the-open-threads-from-the-midterm"&gt;The open threads from the midterm&lt;/h3&gt;
&lt;p&gt;I flagged two things in the midterm that weren't guaranteed to get done: virtual keyboard handling and the &lt;code&gt;kcm_keyboard&lt;/code&gt; dependency decoupling.&lt;/p&gt;
&lt;p&gt;Neither got done. The virtual keyboard situation is an open design question for the project, not something I could resolve within this scope. The &lt;code&gt;kcm_keyboard&lt;/code&gt; decoupling is something I'd still like to take a crack at. The underlying issue is real: a mobile setup wizard probably shouldn't need to pull in &lt;code&gt;plasma-desktop&lt;/code&gt;. But testing showed it wasn't causing visible breakage in practice, so it got deprioritised in favour of getting the UI work properly landed. Worth picking up as a future contribution.&lt;/p&gt;
&lt;h3 id="see-it-in-action"&gt;See it in action&lt;/h3&gt;

 


&lt;figure class="text-center ratio ratio-16x9" style=""&gt;
 &lt;video controls&gt;&lt;source src="https://blogs.kde.org/2026/03/31/making-plasma-setup-more-mobile-friendly-a-sok26-conclusion/demo.webm" type="video/mp4" /&gt;&lt;/video&gt;&lt;/figure&gt;

&lt;h3 id="wrapping-up"&gt;Wrapping up&lt;/h3&gt;
&lt;p&gt;I participated in SoK '25 as well but had to drop out partway through, so finishing this one properly feels good. Plasma Setup on mobile is in a noticeably better state than it was ten weeks ago, and the changes are upstream, which is what matters.&lt;/p&gt;
&lt;p&gt;I'm planning to keep contributing to KDE and take on more within the ecosystem. There's plenty left to do and I'd like to have a more permanent stake in it.&lt;/p&gt;
&lt;p&gt;Thanks to Kristen McWilliam for the mentorship throughout, and to KDE and the SoK programme for running this. It's a genuinely good way to get people into open source contribution.&lt;/p&gt;
&lt;p&gt;You can reach me on Matrix at @onatribar:matrix.org.&lt;/p&gt;
&lt;p&gt;Until we meet again!&lt;/p&gt;</description></item><item><title>[SoK 2026] Final Update for 'Automating Promo Data Collection' Task</title><link>https://blogs.kde.org/2026/03/27/sok-2026-final-update-for-automating-promo-data-collection-task/</link><pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate><author>CJ Nguyen</author><guid>https://blogs.kde.org/2026/03/27/sok-2026-final-update-for-automating-promo-data-collection-task/</guid><description>&lt;p&gt;Hi all! Just finished up the last bit of work for my Season of KDE task of automating data collection for the KDE promotional team.&lt;/p&gt;
&lt;p&gt;Since the &lt;a href="https://blogs.kde.org/2026/02/18/sok-2026-midterm-update-for-automating-promo-data-collection-task/"&gt;midterm blogpost&lt;/a&gt; I've been assigned no new tasks.
That means my final deliverables are a &lt;a href="https://invent.kde.org/cjnguyen/social_medial_follower_posts_scraper"&gt;follower/post count scraping script&lt;/a&gt; for specific social media websites, a &lt;a href="https://invent.kde.org/cjnguyen/reddit_insights_scraper"&gt;Reddit Insights page scraper&lt;/a&gt; that totals weekly insight data for a given subreddit, and &lt;a href="https://invent.kde.org/cjnguyen/google-alerts-evaluator"&gt;an article evaluation script&lt;/a&gt; that reads articles found by the Google Alerts system and evaluates their sentiment on KDE and its software.&lt;/p&gt;
&lt;h2 id="follower-and-post-counts-scraper"&gt;Follower and post counts scraper&lt;/h2&gt;
&lt;p&gt;Nothing much has changed here outside of some better error handling, consistency in argument help strings, and improved readability of log messages.
The script has run well on its weekly timer and seems to show no signs of giving up.
I do think I can improve it by making it more extensible to accommodate the scrubbing of new websites and accounts, but as of now it functions well for the links we're most worried about.&lt;/p&gt;
&lt;h2 id="reddit-insights-page-scraper"&gt;Reddit Insights page scraper&lt;/h2&gt;
&lt;p&gt;In the prior blogpost I mentioned worries about getting the script to run on a headless server.
The script has since been made capable of running headlessly through use of a Docker image which wraps the program run with an Xvfb display server.
&lt;a href="https://x.org/releases/X11R7.7/doc/man/man1/Xvfb.1.xhtml"&gt;Xvfb&lt;/a&gt; enables this by running display requirements in virtual memory, allowing for the use of headful software in a headless environment.&lt;/p&gt;
&lt;p&gt;Shoutouts to &lt;a href="https://github.com/seanpianka/docker-python-xvfb-selenium-chrome-firefox"&gt;Sean Pianka's repo&lt;/a&gt; containing dockerfiles used to run Xvfb-wrapped Selenium scripts and &lt;a href="https://github.com/SeleniumHQ/docker-selenium"&gt;Selenium's own Docker images&lt;/a&gt; used for Selenium Grid server project.
Without those resources it would have taken me a lot longer to hack together the requirements for a Docker image that could run Selenium headfully.&lt;/p&gt;
&lt;p&gt;Along with the headless runs being solved, I also implemented plenty of bug fixes and improvements to user-facing messages.
Many of the bugs came from not properly exiting Selenium during handled errors which I found out from the server having hundreds of open Firefox instances.
Hopefully I've cleaned all those up.&lt;/p&gt;
&lt;h2 id="google-alerts-evaluator"&gt;Google Alerts evaluator&lt;/h2&gt;
&lt;p&gt;This task was a fairly large undertaking involving plenty of research and implementation steps.
There were three major requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Develop a pipeline to take in Google Alerts emails and pre-process them into articles the model can read.&lt;/li&gt;
&lt;li&gt;Evaluate lightweight sentiment analysis models that can run on a server for their ability to analyze articles on KDE products.&lt;/li&gt;
&lt;li&gt;Parse model output into a human-readable and easy to work with data format.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The final result is a pipeline that&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Reads Google Alerts emails&lt;/li&gt;
&lt;li&gt;Pre-processes the articles into Markdown files for model reading&lt;/li&gt;
&lt;li&gt;Feeds them to a local LLM configured to provide sentiment analysis output&lt;/li&gt;
&lt;li&gt;Takes the LLM output and sends it into a CSV file (if possible)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can see how this task could take a lot of time out of people, so hopefully this pipeline can significantly alleviate that time spent.&lt;/p&gt;
&lt;h3 id="google-alerts-email-reading-and-processing"&gt;Google Alerts email reading and processing&lt;/h3&gt;
&lt;p&gt;This was no issue as Google Alerts are all sent through Gmail and Google itself provides a &lt;a href="https://developers.google.com/workspace/gmail/api/guides"&gt;very useable Gmail API&lt;/a&gt; for extracting emails from Gmail accounts.
After generating the required credentials, fetching emails was as easy as using tools built specifically for this job in a &lt;a href="https://pypi.org/project/google-api-python-client/"&gt;Python package that contained bindings&lt;/a&gt; for the Gmail API in Python.
The emails were all formatted in XML, so past experience with webscraping from the last two tasks played a part in making fetching article links from the emails painless to implement.
After the article links were extracted from the emails, their contents were then fetched in Markdown format for use with the decided model.&lt;/p&gt;
&lt;h3 id="model-evaluation"&gt;Model evaluation&lt;/h3&gt;
&lt;p&gt;We very quickly looked towards some local large-language models (LLMs) to serve the sentiment analysis task.
There were more than a few sentiment analysis fields that would be difficult for more basic models and it simplified implementation greatly.
After the evaluation of some small-footprint models, by far the best at both conforming to the desired output format and performing sentiment analysis on the articles was Qwen3 with 4 billion parameters.
It is lightweight enough to run on an older CPU in decent time, and while it doesn't agree amazingly with human judgement it more often errs on the side of caution, such as deciding more articles are related to KDE than aren't which wastes time but doesn't exclude relevant articles.&lt;/p&gt;
&lt;h3 id="designing-model-output-and-post-processing"&gt;Designing model output and post-processing&lt;/h3&gt;
&lt;p&gt;It turns out that LLMs come in different flavors, and some, specifically instruct models, are much better at conforming to instructions than others.
Many attempts were made to make other types of models provide output in a strict format and, if you need specific output, it's a headache you should definitely consider avoiding by choosing instruct models from the start.&lt;/p&gt;
&lt;p&gt;An instruct model coupled with a well-constructed system prompt (the meta prompt that sets initial instructions for the model) and grammar file &lt;a href="https://github.com/ggml-org/llama.cpp/blob/master/grammars/README.md"&gt;written in GBNF format&lt;/a&gt; can cause model output to be very predictable.
The system prompt written for this task is specifically constructed to bound model output by asking it to output sentiment analysis features in a Python formatted array of strings.
Even with the above methods, instruct models still do botch output occasionally, so the script contains plenty of post-processing and error handling steps before model output is processed into the output CSV file.&lt;/p&gt;
&lt;h2 id="experience-and-lessons-learned"&gt;Experience and lessons learned&lt;/h2&gt;
&lt;p&gt;I've learned a significant amount about web scraping and how to navigate data troubles.
I'm definitely a lot more confident about using developer webtools, HTML processing, and browser automation frameworks as a result of my SoK experience.
Also after working on the Google Alerts sentiment analysis task, and I certainly feel more educated on AI topics and how they are used and deployed.&lt;/p&gt;
&lt;p&gt;My project was a little unusual in that I wasn't working on an existing KDE software but utility scripts that were built from ground-up for KDE community members.
This made things fun through the freedom I had with implementing solutions, but I feel the scripts are not fully developed or as problem-free as possible.
I'd hate to just leave them as is while feeling that way, so I'll continue working on the already made scripts as well as new ones so long as I can help out.&lt;/p&gt;
&lt;p&gt;Huge thanks to &lt;a href="https://invent.kde.org/paulb"&gt;Paul Brown&lt;/a&gt; for mentoring me through this project and being a pleasure to work with, as well as the KDE community for hosting this great event.
I had a lot of fun working on these scripts and am glad I could help out by contributing something to this awesome community.&lt;/p&gt;</description></item><item><title>Season of KDE 2026: Wrapping up</title><link>https://blogs.kde.org/2026/03/25/season-of-kde-2026-wrapping-up/</link><pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate><author>Siddharth Chopra</author><guid>https://blogs.kde.org/2026/03/25/season-of-kde-2026-wrapping-up/</guid><description>&lt;p&gt;Greetings!&lt;/p&gt;
&lt;p&gt;As we're nearing the end of SoK 2026, I am writing to share my experience and progress since my &lt;a href="https://blogs.kde.org/2026/02/14/season-of-kde-2026-my-journey-with-marknote/"&gt;previous blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The second half of my SoK project has been a real learning experience for me, about how contributions to KDE and open-source communities in general work. I also learnt the importance of thorough testing, bug fixing, and polishing that is required before shipping any software.&lt;/p&gt;
&lt;h3 id="technical-update-and-challenges-faced"&gt;Technical update and challenges faced&lt;/h3&gt;
&lt;p&gt;Till the halfway mark, I was able to complete a rough working version of the source mode editor. But after feedback from my mentor, I realized that a lot of work was still left to be done.&lt;/p&gt;
&lt;p&gt;Firstly, there were a lot of repeated lines of code in my solution, as I had essentially split the existing editor into two - the rich editor and the raw editor. This meant that a lot of the functionality was common between the two editors, and I had re-used existing code for that. This was true for both the QML pages and the C++ document handlers.
As I now realize, that would have been a nightmare for maintainability, as any single fix or change would have to be made in two places.&lt;/p&gt;
&lt;p&gt;The fix for the C++ part seemed to be obvious: to use inheritance. So I decided to make the &lt;code&gt;RichDocumentHandler&lt;/code&gt; and &lt;code&gt;RawDocumentHandler&lt;/code&gt; inherit from a common parent, the &lt;code&gt;DocumentHandler&lt;/code&gt;. &lt;code&gt;DocumentHandler&lt;/code&gt; now contained all the common methods, significantly reducing repeated lines of code.&lt;/p&gt;
&lt;p&gt;Similarly on the QML side, I made a parent component, &lt;code&gt;EditPage&lt;/code&gt;, and made the Rich and Raw edit pages inherit from it. This caused some issues (mostly related to property sharing between components) that were eventually fixed.&lt;/p&gt;
&lt;p&gt;A major issue I faced was caused by the fact that my MR essentially removed the existing &lt;code&gt;EditPage.qml&lt;/code&gt; and &lt;code&gt;documenthandler.cpp&lt;/code&gt; (although files with the same name are still present, they serve different purposes). Their contents were divided into two files - the rich and raw versions respectively.
But while I was working on my feature, other contributors were still modifying the old files. Git can't handle this automatically, because the old file is in a way completely changed. This meant that I had to manually go through each commit to the old files, and move the changes accordingly to the new files.
This proved to be a major headache, and caused me (and even Carl) to spend considerable time manually rebasing.
So when finally the feature was merged, it was a sigh of relief, as we wouldn't need to manually maintain it anymore!&lt;/p&gt;
&lt;p&gt;Apart from this, I also added a spell-checking capability to the editor, using Sonnet.&lt;/p&gt;
&lt;h3 id="demo"&gt;Demo&lt;/h3&gt;

 


&lt;figure class="text-center ratio ratio-16x9" style=""&gt;
 &lt;video controls&gt;&lt;source src="%25!s%28%3cnil%3e%29vid2.webm" type="video/mp4" /&gt;&lt;/video&gt;&lt;/figure&gt;

&lt;h3 id="learning-and-experience"&gt;Learning and experience&lt;/h3&gt;
&lt;p&gt;I was grateful to see my work get published in Marknote 1.5 - and also felt a responsibility at the same time. Source mode is an asset for the app, but at the same time any bugs in my work are also a liability!&lt;/p&gt;
&lt;p&gt;I learnt how a professional application is different from a hobby project, and how the quality and rigour of work should reflect that.&lt;/p&gt;
&lt;p&gt;It was a really fun experience working with the KDE community and I'd like to thank my mentor &lt;a href="https://invent.kde.org/carlschwan"&gt;Carl Schwan&lt;/a&gt; for always being there to help!&lt;/p&gt;
&lt;p&gt;SoK has been a great first stepping stone to introduce me to the community, and I'm looking forward to contributing to Marknote and other apps even after the program!&lt;/p&gt;</description></item><item><title>Season of KDE 2026 - Improving mentorship.kde.org for better onboarding of new contributors</title><link>https://blogs.kde.org/2026/03/21/season-of-kde-2026-improving-mentorship.kde.org-for-better-onboarding-of-new-contributors/</link><pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate><author>Aryan Rai</author><guid>https://blogs.kde.org/2026/03/21/season-of-kde-2026-improving-mentorship.kde.org-for-better-onboarding-of-new-contributors/</guid><description>&lt;p&gt;Greeting everyone! I am Aryan.&lt;/p&gt;
&lt;p&gt;I have only just started my open source journey and was glad to be a part of SOK program. I really learned a lot which I think I otherwise would have not. With this blog I will be sharing about the project I worked on and also my learnings and future endeavour.&lt;/p&gt;
&lt;p&gt;For the last 2 months me and my fellow partner &lt;a href="https://invent.kde.org/decimatrix"&gt;Advaith SK&lt;/a&gt; worked on ways on how to improve the existing mentorship.kde.org so that it is more accessible and user friendly for new contributors as well as we tried to structure the internals of the website for better code readability and resuabililty.&lt;/p&gt;
&lt;h2 id="why-was-this-project-relevant"&gt;Why was this project relevant&lt;/h2&gt;
&lt;p&gt;mentorship.kde.org is basically the first page a new contributor visits when exploring about KDE. So it is very important for the website to not overwhelm the new contrbutor but provide all the relevant information and links in a ordered and systematic way.&lt;/p&gt;
&lt;h2 id="what-problems-did-i-identify"&gt;What problems did I identify&lt;/h2&gt;
&lt;p&gt;We noticed a gap in the project, KDE organizes many programs throughout the year for mentoring and developing more and more contributors. But we noticed that there was no single page that lists all the relevant programs a candidate might be interested in.
Moreover on the developer's side we noticed that the repo of mentorship.kde.org is using many different cards for displaying its data throughout, and each card was schematically different than the others but in the end all of them were pretty much serving the same purpose.&lt;/p&gt;
&lt;h2 id="what-were-the-solutions"&gt;What were the solutions&lt;/h2&gt;
&lt;p&gt;To solve this, I built a separate /programs page for the website, whose task is to only list all the programs that KDE organizes throughout the year.
And to solve the developer's side problem, I standardized the cards. So basically for each component using their own rules for displaying cards, what I changed was I implemented a central card.html and card.scss which governs all cards. In case of some variations required I introduced the $variants feature of Hugo to carefully keep the uniqueness of cards required for each page.&lt;/p&gt;
&lt;h2 id="merge-requests"&gt;Merge requests&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://invent.kde.org/paulb/kde-mentor-programs-g-so-c-2025-project/-/merge_requests/11"&gt;Initial standardisation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://invent.kde.org/paulb/kde-mentor-programs-g-so-c-2025-project/-/merge_requests/17"&gt;Programs page&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="miscellaneous"&gt;Miscellaneous&lt;/h2&gt;
&lt;p&gt;I also noticed that in the resoruces page, the resources listed are relatively few, moreover the hyperlinks provided were also not updated. So I added more resources there and also updated the broken links present previously.&lt;/p&gt;
&lt;h2 id="future-work"&gt;Future work&lt;/h2&gt;
&lt;p&gt;To attract more new contributors, in future we can also extend our project to have a hall of fame section where there is list of blogs of all graduated students of a particular program.&lt;/p&gt;
&lt;h2 id="final-thoughts"&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;A big thank you to my mentors, &lt;a href="https://invent.kde.org/drowsywings"&gt;&lt;strong&gt;drowsywings&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://invent.kde.org/paulb"&gt;&lt;strong&gt;paulb&lt;/strong&gt;&lt;/a&gt;, for thoughtful guidance and constant support throughout the project.&lt;/p&gt;
&lt;p&gt;I have grown in this season with more confidence, more curiosity, and even more appreciation for the people behind free software infrastructure. I will be proud even if this work helps just one curious contributor to get onboard with the KDE ecosystem.&lt;/p&gt;</description></item><item><title>[SoK 2026] Appium Testing for Lokalize</title><link>https://blogs.kde.org/2026/03/20/sok-appium-testing-lokalize/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate><author>Vishesh Srivastava</author><guid>https://blogs.kde.org/2026/03/20/sok-appium-testing-lokalize/</guid><description>&lt;p&gt;Hey there! I'm Vishesh Srivastava, and this is the full write-up for my SoK 2026 project: adding Appium-based UI tests to &lt;a href="https://apps.kde.org/lokalize/"&gt;Lokalize&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="so-whats-lokalize"&gt;So what's Lokalize?&lt;/h2&gt;
&lt;p&gt;It's KDE's translation tool - the app translators use to work with PO files and manage translation projects. It already had unit tests, but no UI tests. So the goal of this project was to setup a UI testing framework using Appium.&lt;/p&gt;
&lt;h2 id="the-first-task-bug-514468"&gt;The first task: Bug 514468&lt;/h2&gt;
&lt;p&gt;Before Appium work started, my first task was &lt;a href="https://bugs.kde.org/show_bug.cgi?id=514468"&gt;Bug 514468&lt;/a&gt;. The issue was that copyright year strings in PO headers could become very long, like:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;2006, 2010, 2011, 2012, 2013, 2014, 2015, 2017, 2018, 2019, 2020, 2021&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;instead of the shorter:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;2006, 2010-2015, 2017-2021&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I was asked to write a failing test first, so I added a placeholder &lt;code&gt;simplifyYearString&lt;/code&gt; function and wrote a unit test for the expected collapsed output. At first it was pushed with &lt;code&gt;QEXPECT_FAIL&lt;/code&gt;, since the actual implementation was meant to be done separately.&lt;/p&gt;
&lt;p&gt;This was small compared to the main project, but it helped me get comfortable with setting up KDE's build system and how tests are added to Lokalize.&lt;/p&gt;
&lt;h2 id="building-the-appium-setup-from-scratch"&gt;Building the Appium setup from scratch&lt;/h2&gt;
&lt;p&gt;Lokalize had no Appium setup at all, so this part started from zero.&lt;/p&gt;
&lt;p&gt;The first tests were simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;simple_open.py&lt;/code&gt; just opens Lokalize and closes it&lt;/li&gt;
&lt;li&gt;&lt;code&gt;file_open.py&lt;/code&gt; opens the File menu and checks that the open dialog path works&lt;/li&gt;
&lt;li&gt;&lt;code&gt;workflowtest.py&lt;/code&gt; simulates an actual translator workflow&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last one was the main test I was aiming for. It opens a &lt;code&gt;.po&lt;/code&gt; file with untranslated entries, types translations into the editor, uses &amp;quot;Approve and Go Next&amp;quot;, checks that the UI updates properly, verifies the status bar reaches &lt;code&gt;Not ready: 0&lt;/code&gt;, and finally saves the file.&lt;/p&gt;
&lt;p&gt;That made it a proper end-to-end test.&lt;/p&gt;
&lt;h2 id="problem-encountered-in-the-last-test"&gt;Problem encountered in the last test&lt;/h2&gt;
&lt;p&gt;Appium depends on accessibility information to find and interact with widgets. Lokalize's editor fields did not expose accessibility ids for Appium to call them (found using &lt;a href="https://apps.kde.org/accessibilityinspector/"&gt;accessibilityinspector&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;So I had to make changes in &lt;code&gt;editorview.cpp&lt;/code&gt; to add object names and accessible names to the widgets. Without that, the test scripts could open the app and click menus, but they were basically blind when it came to the translation editor.&lt;/p&gt;
&lt;p&gt;Other KDE apps with Appium tests, like Dolphin and KCalc, had tests which used these and were useful references here.&lt;/p&gt;
&lt;p&gt;Below is a demo of this working:&lt;/p&gt;
&lt;video controls preload="metadata" width="800"&gt;
 &lt;source src="Demo_appium.mp4" type="video/mp4"&gt;
&lt;/video&gt;
&lt;h2 id="making-it-run-with-the-rest-of-the-test-suite"&gt;Making it run with the rest of the test suite&lt;/h2&gt;
&lt;p&gt;The next step was integrating the Appium tests into CMake so they could run as part of Lokalize's normal test flow.&lt;/p&gt;
&lt;p&gt;I added an &lt;code&gt;appiumtests/CMakeLists.txt&lt;/code&gt; and a &lt;code&gt;BUILD_APPIUM_TESTS&lt;/code&gt; option, so the tests can be enabled and run through the normal KDE tooling:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kde-builder --run-tests lokalize --no-include-dependencies --no-src --cmake-options&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-DBUILD_APPIUM_TESTS=ON&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That was important because UI tests are much less useful if they live outside the project's regular test workflow. The &lt;code&gt;BUILD_APPIUM_TESTS&lt;/code&gt; option was kept because it was not advised to run Appium tests in the CI/CD.&lt;/p&gt;
&lt;h3 id="another-issue-making-the-tests-independent-of-the-local-user-setup"&gt;Another issue: Making the tests independent of the local user setup&lt;/h3&gt;
&lt;p&gt;One issue was that on opening, Lokalize asked for a name and email address which I was earlier typing manually. This was undesired since tests had to be run without user intervention.&lt;/p&gt;
&lt;p&gt;So I added a file &lt;code&gt;test_support.py&lt;/code&gt;, that creates a temporary config directory, writes a minimal &lt;code&gt;lokalizerc&lt;/code&gt;, and launches Lokalize with that isolated configuration. That way the tests do not depend on my own existing settings or require any user input.&lt;/p&gt;
&lt;p&gt;I also reused that helper across the test files so they stopped repeating the same Appium setup code again and again.&lt;/p&gt;
&lt;h3 id="writing-a-failing-bug-test"&gt;Writing a failing bug test&lt;/h3&gt;
&lt;p&gt;After the main workflow test, I also added another Appium test for a real UI bug: after closing a project, translational tab menus should become disabled.&lt;/p&gt;
&lt;p&gt;This test is in &lt;code&gt;project_close.py&lt;/code&gt;. It opens a project, closes it, and then checks that menus like &lt;code&gt;Edit&lt;/code&gt;, &lt;code&gt;Go&lt;/code&gt;, and &lt;code&gt;Sync&lt;/code&gt; are disabled.&lt;/p&gt;
&lt;h3 id="fixing-how-the-tests-are-executed"&gt;Fixing how the tests are executed&lt;/h3&gt;
&lt;p&gt;At first, the Appium tests were being discovered and registered individually in CMake. The next task was to run them from a single &lt;code&gt;run_all.py&lt;/code&gt; runner. Now all the tests use a single KWin instance like they do in other projects like Dolphin.&lt;/p&gt;
&lt;p&gt;This also makes writing new tests simpler since adding a test just means adding a new line in the run_all.py. So instead of CMake looping over every Python file, it now calls the runner once.&lt;/p&gt;
&lt;p&gt;There was also one annoying issue here: &lt;code&gt;--run-tests&lt;/code&gt; was reporting success even when one of the Appium tests had failed when run manually. Because of that, I had to return &lt;code&gt;sys.exit(1)&lt;/code&gt; explicitly from the runner when the test result was not successful. Without that, the tests looked successful even after failing.&lt;/p&gt;
&lt;p&gt;Below is a demo of this working:&lt;/p&gt;
&lt;video controls preload="metadata" width="800"&gt;
 &lt;source src="Demo_appium_tests.mp4" type="video/mp4"&gt;
&lt;/video&gt;
&lt;h2 id="outcomes-achieved"&gt;Outcomes achieved&lt;/h2&gt;
&lt;p&gt;By the end of the project, Lokalize had:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a working Appium test setup&lt;/li&gt;
&lt;li&gt;basic tests for startup and opening files&lt;/li&gt;
&lt;li&gt;a full workflow test covering translation editing and saving&lt;/li&gt;
&lt;li&gt;helper files to make tests cleaner and independent of local user config&lt;/li&gt;
&lt;li&gt;integration into the normal test system through CMake&lt;/li&gt;
&lt;li&gt;a single test runner file&lt;/li&gt;
&lt;li&gt;documentation on how to run/write tests.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="final-thoughts"&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;This was a really enjoyable project. I got to work on Appium testing, the KDE build system, and a bit of bug hunting.&lt;/p&gt;
&lt;p&gt;Many thanks to &lt;a href="https://invent.kde.org/finw"&gt;Finley Watson&lt;/a&gt; for his guidance throughout the project and for helping whenever I got stuck.&lt;/p&gt;
&lt;p&gt;The best part for me is that the work is extendible. New Appium tests can be added without rebuilding the whole setup from scratch, which was the main point of the project in the first place.&lt;/p&gt;</description></item><item><title>Season of KDE - Midterm Blog</title><link>https://blogs.kde.org/2026/03/20/sok-midterm-keshav-nanda/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate><author>Keshav-Nanda</author><guid>https://blogs.kde.org/2026/03/20/sok-midterm-keshav-nanda/</guid><description>&lt;p&gt;Hello world!&lt;/p&gt;
&lt;p&gt;My name is Keshav Nanda and I had the opportunity to work with &lt;a href="https://invent.kde.org/sysadmin/l10n-scripty"&gt;Scripty&lt;/a&gt;, a KDE bot that extracts translatable strings from various KDE applications and sends them to KDE translators.&lt;/p&gt;
&lt;p&gt;I worked on the issue of standardizing translation reference paths across all KDE projects and this blog summarizes my progress up until the 4 week mark.&lt;/p&gt;
&lt;h2 id="week-1-and-week-2"&gt;Week 1 and Week 2&lt;/h2&gt;
&lt;p&gt;Couldn't get much work done as I was occupied with university exams.&lt;/p&gt;
&lt;h2 id="week-3"&gt;Week 3&lt;/h2&gt;
&lt;p&gt;Got my feet wet with the actual source code, went through &lt;a href="https://invent.kde.org/sysadmin/l10n-scripty/-/merge_requests/90"&gt;MR 90&lt;/a&gt; and developed a basic understanding of the problem that needed to be solved, that is to ensure that all .po files generated by Scripty are relative to project root.&lt;/p&gt;
&lt;h2 id="week-4"&gt;Week 4&lt;/h2&gt;
&lt;p&gt;Helped my partner Aviral in testing his implementation of &lt;a href="https://invent.kde.org/sysadmin/l10n-scripty/-/merge_requests/116"&gt;merge request 116&lt;/a&gt; and added to the KDE projects he validated. This MR added a docker environment to standardize the testing process and made changes in &lt;code&gt;extract_metainfo.sh&lt;/code&gt; and &lt;code&gt;extract-messages.sh&lt;/code&gt; to enforce relative file paths.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The first 4 weeks have been a great learning experience. I got familiar with Scripty's codebase, understood the core problem of inconsistent translation reference paths, and contributed to validating the fix. The goal going forward is to continue testing and work towards getting the changes merged. I want to thank my partner Aviral Singh and my mentor Finley Watson for the guidance and support throughout!&lt;/p&gt;
&lt;p&gt;Onwards and upwards!&lt;/p&gt;</description></item><item><title>Season of KDE 2026 - Task - 3 Lokalize</title><link>https://blogs.kde.org/2026/03/20/season-of-kde-2026-task-3-lokalize/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate><author>Kumud</author><guid>https://blogs.kde.org/2026/03/20/season-of-kde-2026-task-3-lokalize/</guid><description>&lt;h1 id="progress-report--midterm--sok-26"&gt;Progress Report — Midterm — SOK 26&lt;/h1&gt;
&lt;p&gt;Mentor: Finley Watson&lt;br&gt;
Project: Lokalize&lt;/p&gt;
&lt;h2 id="week-1"&gt;Week 1&lt;/h2&gt;
&lt;p&gt;Week one was basically just ensuring that I have a good understanding of the relevant code in the repository. I suggested a good approach would be to write a summary of the behaviour of the classes and functions involved. This turned out to work really well.&lt;/p&gt;
&lt;h2 id="week-2"&gt;Week 2&lt;/h2&gt;
&lt;p&gt;Now that I knew how things worked in the codebase and the flow of functions, it was the right time to think about solving the issue. I had intuition about that since the entries did not respect the filtering order. This was largely because they used the wrong layer to fetch entries and if we used the proxy model it should work well. However, now the other condition that we had to respect while moving was to only go to unapproved entries. So I had to merge the filtering and condition checking.&lt;/p&gt;
&lt;p&gt;The final approach I thought might work was to add a helper function that just gave the correct index to move to and wow, things started working :smile:&lt;/p&gt;
&lt;p&gt;It was time to test it. Finley helped me with that. And I have to admit that once I resolved one edge case, there was another. This continued for a while and it was irritating, thinking that this will fix everything finally and boom another case appeared 😅.&lt;/p&gt;
&lt;p&gt;We thought about an upgrade in navigation. This was moving to the next entry in navigation in a cyclic order. Finley and navya had a discussion over it on the mailing list and finally concluded that it was not required at all.&lt;/p&gt;
&lt;p&gt;Finally the MR was merged. Nothing felt better than seeing it finally being a part of code that people across the globe are using... so cool 🔥&lt;/p&gt;
&lt;h3 id="results"&gt;Results&lt;/h3&gt;
&lt;p&gt;Final &lt;a href="https://invent.kde.org/sdk/lokalize/-/merge_requests/276"&gt;MR&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="week-3"&gt;Week 3&lt;/h2&gt;
&lt;p&gt;While fixing things up in the previous week, I had already seen many shortcuts that required a fix, and that the behaviour sometimes did not made sense.&lt;/p&gt;
&lt;p&gt;I started with testing the shortcuts that are supposed to go to the first and the last entry, but somehow showed different behaviour each time. This was because of the widget currently in focus, so the behaviour of many shortcuts depends upon the widget you are using.&lt;/p&gt;
&lt;p&gt;This was new information for me, so I researched how widget focusing actually works. Through this, I learned about the order in which applications process keyboard shortcuts and that some shortcuts are handled internally by Qt itself.&lt;/p&gt;
&lt;h2 id="week-4"&gt;Week 4&lt;/h2&gt;
&lt;p&gt;I went ahead and checked the behaviour of other navigation shortcuts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;next/previous fuzzy entry&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;next/previous untranslated&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;next/previous bookmark&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="results-1"&gt;Results&lt;/h3&gt;
&lt;p&gt;Understanding of similarity in the behaviour of these shortcuts.&lt;/p&gt;
&lt;h2 id="weeks-5-and-6"&gt;Weeks 5 and 6&lt;/h2&gt;
&lt;p&gt;I extended the work from the previous weeks and had my semester exams.&lt;/p&gt;
&lt;h2 id="week-7"&gt;Week 7&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I &lt;a href="https://bugs.kde.org/show_bug.cgi?id=517200"&gt;reported a bug&lt;/a&gt; in the behaviour of the next/previous bookmark in navigations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I implemented next/previous bookmark based on navya’s approach&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Season of KDE 2026 - Task - 3 Lokalize</title><link>https://blogs.kde.org/2026/03/20/season-of-kde-2026-task-3-lokalize/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate><author>Kumud</author><guid>https://blogs.kde.org/2026/03/20/season-of-kde-2026-task-3-lokalize/</guid><description>&lt;h1 id="week-0-progress-report--sok-26"&gt;Week 0 progress Report — SOK 26&lt;/h1&gt;
&lt;p&gt;I am Kumud, a third year student at IIT Roorkee, and I am working as a mentee under the guidance of Finley Watson for SOK 26.&lt;/p&gt;
&lt;p&gt;Over the past few weeks, I have been contributing to the Lokalize project and gaining familiarity with the codebase and the underlying architecture.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="initial-setup"&gt;Initial setup&lt;/h2&gt;
&lt;p&gt;The first major task for me was to get the Lokalize code running on my local PC. There were many crashes that I encountered during the setup process. I initially thought that the issue might be related to my operating system, so I decided to try using a different one.&lt;/p&gt;
&lt;p&gt;I installed &lt;strong&gt;KDE Neon&lt;/strong&gt; in a virtual machine on Linux, and finally the code started running. However, I was not very happy with using a VM, since I already had limited storage on my PC and now it was being split with the virtual machine as well.&lt;/p&gt;
&lt;p&gt;Later, when I joined the &lt;strong&gt;Matrix channel&lt;/strong&gt;, Finley and Navya helped me with the setup. I realized that the main issue was simply that my Ubuntu installation needed to be updated. After updating Ubuntu, I was able to run Lokalize directly on my system.&lt;/p&gt;
&lt;p&gt;Finally, I started working on Linux itself, which I was already more accustomed to using.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="getting-familiar-with-the-codebase"&gt;Getting familiar with the codebase&lt;/h2&gt;
&lt;p&gt;Before planning the proposal for Lokalize, I had to gain a good understanding of the code and the tools we were going to use.&lt;/p&gt;
&lt;p&gt;To become familiar with a general codebase and to get comfortable using &lt;strong&gt;Git / GitLab&lt;/strong&gt;, my mentor assigned me a &lt;a href="https://invent.kde.org/sdk/lokalize/-/work_items/28"&gt;task&lt;/a&gt;. The task was a basic one: adding a package to the repository metadata required to build Lokalize.&lt;/p&gt;
&lt;h3 id="results"&gt;Results&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Understanding of the codebase and about using GitLab.&lt;/li&gt;
&lt;li&gt;Used repology to map different package names across different OSes.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://invent.kde.org/sysadmin/repo-metadata/-/merge_requests/671"&gt;MR&lt;/a&gt; approved.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Season of KDE 2026 - Lokalize Glossary Tab Improvements (Midterm)</title><link>https://blogs.kde.org/2026/03/19/season-of-kde-2026-lokalize-glossary-tab-improvements-midterm/</link><pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate><author>Aditya Sarna</author><guid>https://blogs.kde.org/2026/03/19/season-of-kde-2026-lokalize-glossary-tab-improvements-midterm/</guid><description>&lt;p&gt;My name is &lt;a href="https://invent.kde.org/adityasarna"&gt;Aditya Sarna&lt;/a&gt;, and I have been working on &lt;a href="https://invent.kde.org/sdk/lokalize"&gt;Lokalize&lt;/a&gt;, a translation software, as part of Season of KDE 2026. Along with my fellow mentee &lt;a href="https://invent.kde.org/jaimukund"&gt;Jaimukund Bhan&lt;/a&gt;, I have been assigned to work on improvements to the Glossary tab, including both UI/UX enhancements and addressing a substantial list of bugs.&lt;/p&gt;
&lt;h3 id="how-i-got-here"&gt;How I got here&lt;/h3&gt;
&lt;p&gt;I first came across KDE while exploring organizations that had participated in Google Summer of Code (GSoC) in previous years. During this process, I also discovered Season of KDE (SoK), which felt like a great opportunity to get involved. I joined the KDE Mentorship Matrix chat, where Finley Watson was kind enough to guide us. I then explored the list of tasks under Lokalize for SoK in detail and drafted proposals for the first two tasks.&lt;/p&gt;
&lt;p&gt;While researching the first idea, I came across the &lt;a href="https://develop.kde.org/hig/"&gt;KDE Human Interface Guidelines&lt;/a&gt;, which helped form the foundation for the suggestions I put forward in my next proposal. I was delighted to be selected for the second task.&lt;/p&gt;
&lt;h3 id="setting-up"&gt;Setting up&lt;/h3&gt;
&lt;p&gt;We started a little early, getting everything in order. I spent time familiarising myself with the Lokalize codebase and understanding the platform. I also joined an early discussion on the possible direction for creating and saving the glossary file, and that work was subsequently completed by Jaimukund. In the meantime, I began scoping out the necessary UI/UX improvements.&lt;/p&gt;
&lt;h3 id="uiux-improvements"&gt;UI/UX improvements&lt;/h3&gt;
&lt;p&gt;The task involved replacing plain text labels (&amp;quot;+&amp;quot;, &amp;quot;-&amp;quot;) with proper icon buttons and adding tooltips to all the add and remove buttons on the page. &lt;a href="https://invent.kde.org/sdk/lokalize/-/merge_requests/273"&gt;[MR 273]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also created a Figma design for a redesign of the deletion workflow, which had been suggested by the KDE Visual Design Group. The goal was to improve the workflow for translators.&lt;/p&gt;
&lt;h3 id="engaging-with-translators"&gt;Engaging with translators&lt;/h3&gt;
&lt;p&gt;One of the most valuable steps in this project was reaching out to the translators mailing list. The insights we gathered from that discussion helped us uncover more issues and articulate the problems better. The translator's real-world experience gave us a much clearer picture of the pain points in the current Glossary workflow and we subsequently worked through those issues in the weeks that followed.&lt;/p&gt;
&lt;h3 id="a-bump-in-the-road"&gt;A bump in the road&lt;/h3&gt;
&lt;p&gt;Progress slowed for a while as I got caught up with university exams. Balancing coursework alongside an open-source project was challenging.&lt;/p&gt;
&lt;h3 id="simple-yet-useful"&gt;Simple yet useful&lt;/h3&gt;
&lt;p&gt;The first issue I worked on after returning was a simple yet useful change that I had also proposed earlier. This involved moving the add and remove buttons to sit next to the search bar.Grouping them together created a clearer call to action, and the button placement now mirrors the Glossary editor pane, helping standardise the UI and match user expectations.&lt;/p&gt;
&lt;h3 id="acknowledgements"&gt;Acknowledgements&lt;/h3&gt;
&lt;p&gt;A huge thank you to my mentor, &lt;a href="https://invent.kde.org/finw"&gt;Finley Watson&lt;/a&gt;, for his constant guidance, patience, and thoughtful feedback throughout this project. Thanks as well to the Visual Design Group and the translator community for their valuable input, and to the KDE community as a whole for being so welcoming. Contributing to software used by translators all over the world has been an incredibly rewarding experience. I look forward to continuing to give back to KDE long after SoK is complete.&lt;/p&gt;</description></item><item><title>Season of KDE 2026: Transforming mentorship.kde.org into a Complete Onboarding System</title><link>https://blogs.kde.org/2026/03/19/season-of-kde-2026-transforming-mentorship.kde.org-into-a-complete-onboarding-system/</link><pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate><author>Advaith Sathish Kumar</author><guid>https://blogs.kde.org/2026/03/19/season-of-kde-2026-transforming-mentorship.kde.org-into-a-complete-onboarding-system/</guid><description>&lt;p&gt;Eight weeks ago I was nervously setting up a Hugo project I'd never touched before, reading through someone else's merge requests trying to understand what I was supposed to build on top of. Today, mentorship.kde.org is a meaningfully better place for anyone trying to find their way into the KDE community. That's a good feeling.&lt;/p&gt;
&lt;p&gt;I'm &lt;a href="https://invent.kde.org/decimatrix"&gt;Advaith&lt;/a&gt;, a second-year Computer Science student from India. This was my first time contributing to open source and I couldn't have picked a better place to start than KDE.&lt;/p&gt;
&lt;h2 id="the-project"&gt;The project&lt;/h2&gt;
&lt;p&gt;My task for Season of KDE 2026 was to transform &lt;a href="https://mentorship.kde.org"&gt;mentorship.kde.org&lt;/a&gt; into a proper onboarding system for new contributors. The foundation was already there thanks to &lt;a href="https://invent.kde.org/drowsywings"&gt;@drowsywings&lt;/a&gt;'s GSoC 2025 work, but several pages had placeholder content, buttons went nowhere, and there was no real sense of flow.&lt;/p&gt;
&lt;p&gt;I know this because I was that confused visitor. I found this project by experiencing the problem it was trying to solve, which made working on it feel genuinely worthwhile.&lt;/p&gt;
&lt;p&gt;I worked alongside my co-contributor &lt;a href="https://invent.kde.org/askelad"&gt;Aryan Rai&lt;/a&gt;. Aryan handled the /programs and /resources pages, while I focused on the homepage and the /mentees showcase. Splitting things up early was one of the better decisions we made. It kept us from stepping on each other's work and meant we could move independently for most of the program.&lt;/p&gt;
&lt;h2 id="what-got-built"&gt;What got built&lt;/h2&gt;
&lt;p&gt;The homepage work was mostly about making things actually work the way they were supposed to: routing buttons to real pages, filling in content that had been sitting as placeholders, making the news section feel like actual news. A lot of it sounds simple when described but the details add up fast.&lt;/p&gt;
&lt;div style="text-align:center;"&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="Homepage screenshot" src="https://blogs.kde.org/2026/03/19/season-of-kde-2026-transforming-mentorship.kde.org-into-a-complete-onboarding-system/homepage.png"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;The /mentees page was the more interesting challenge. It went from being essentially empty to having
real data, pagination, and client-side filtering by year, program, and technology. The filtering was originally a stretch goal but I'm glad it made it in.&lt;/p&gt;
&lt;p&gt;One decision that took more thought than I expected was how to store the mentee data. I went back and
forth between grouping mentees into cohort files (one file per year/program) versus individual Markdown files per mentee. The grouped approach is simpler to manage at first, but individual files
make filtering far more straightforward, as Hugo can use front matter fields like &lt;code&gt;year&lt;/code&gt;, &lt;code&gt;program&lt;/code&gt;, and &lt;code&gt;technology&lt;/code&gt; directly as filter parameters without any external code. That made the choice clear.&lt;/p&gt;
&lt;div style="text-align:center;"&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="Menteespage screenshot" src="https://blogs.kde.org/2026/03/19/season-of-kde-2026-transforming-mentorship.kde.org-into-a-complete-onboarding-system/mentees.png"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;My mentors &lt;a href="https://invent.kde.org/drowsywings"&gt;Anish Tak&lt;/a&gt; and &lt;a href="https://invent.kde.org/paulb"&gt;Paul Brown&lt;/a&gt; were genuinely great to work with. Paul introduced us to the project and set the direction early on and Anish carried that through the whole program by hosting bi-weekly meets, reviewing all our MRs, and always being available when we we were stuck. I'm really grateful to both
of them for making this such a good first experience in open source.&lt;/p&gt;
&lt;h2 id="what-i-take-away"&gt;What I take away&lt;/h2&gt;
&lt;p&gt;The biggest thing I learned isn't a technical skill, it's how to work inside something that already exists. Reading a codebase you didn't write, making changes that fit the patterns already there, coordinating with someone else so your work doesn't clash with theirs. These things don't come up much when you're building projects on your own, and SoK taught me that in a way no tutorial could. I came in knowing how to write code. I left knowing how to write code that other people have to maintain.&lt;/p&gt;
&lt;p&gt;I also just really enjoyed it. The KDE community is welcoming in a way that makes you want to stick around, and I intend to.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What's next&lt;/h2&gt;
&lt;p&gt;There's still work to be done on mentorship.kde.org. The pathway navigator deserves more attention, not all previous mentee data has been added and there's always more mentee data to add, as new program cycles wrap up. I'd like to be part of it.&lt;/p&gt;
&lt;p&gt;If you're a student sitting on the fence about contributing, &lt;a href="https://mentorship.kde.org"&gt;mentorship.kde.org&lt;/a&gt; (and in the future join.kde.org) exists to help you take that step. Hopefully it's a little easier to navigate now :)&lt;/p&gt;</description></item><item><title>Season of KDE 2026 - Untangling Scripty's File Paths</title><link>https://blogs.kde.org/2026/03/14/season-of-kde-2026-untangling-scriptys-file-paths/</link><pubDate>Sat, 14 Mar 2026 00:00:00 +0000</pubDate><author>Aviral Singh</author><guid>https://blogs.kde.org/2026/03/14/season-of-kde-2026-untangling-scriptys-file-paths/</guid><description>&lt;p&gt;Hi everyone, Aviral here :)&lt;/p&gt;
&lt;p&gt;I have been a past contributor to the KDE ecosystem for a few projects like Okular and Spectacle.
KDE was the first organisation I ever worked with in my open source journey and now I am very excited to share the update of my Season of KDE 2026 project.&lt;/p&gt;
&lt;p&gt;Over the past few months, I worked on KDE localization infrastructure with a focus on Scripty along with my partner &lt;a href="https://invent.kde.org/keshavnanda"&gt;Keshav Nanda&lt;/a&gt;, improving how source file paths are recorded for translators.&lt;/p&gt;
&lt;p&gt;Scripty supports translation workflows across the very large KDE ecosystem. During this project, a lot of fixes were shipped to Scripty and validation was run across more than 600 projects, which made it possible to test improvements at real KDE scale and confirm that the results are dependable.&lt;/p&gt;
&lt;h2 id="why-paths-matter"&gt;Why paths matter&lt;/h2&gt;
&lt;p&gt;For those unfamiliar, Scripty is the backbone of KDE's localization pipeline. It handles the extraction of translatable strings from source code into .pot files, which are then translated by our amazing community.&lt;/p&gt;
&lt;p&gt;Historically, some extraction scripts generated absolute paths or inconsistent relative paths. My mentor, &lt;a href="https://invent.kde.org/finw"&gt;Finley Watson&lt;/a&gt;, originally initiated the effort to fix this in &lt;a href="https://invent.kde.org/sysadmin/l10n-scripty/-/merge_requests/90"&gt;MR 90&lt;/a&gt;. Without full project relative paths, we ended up with &amp;quot;ambiguous&amp;quot; references in PO files that didn't clearly point to a single source file within a repository. This makes it harder for translators to find context without confident reliance on these references.&lt;/p&gt;
&lt;h2 id="why-this-work-mattered"&gt;Why this work mattered&lt;/h2&gt;
&lt;p&gt;We discovered the main issue was not missing files (at least for 99+% of the projects). The real problem was path ambiguity.&lt;/p&gt;
&lt;p&gt;In parts of the extraction pipeline, source references were sometimes recorded as file basenames or as paths that were not consistently project relative, which made references ambiguous in repositories with duplicate file names. Loads of modern KDE repositories often contain many files with the same name (T-T).&lt;/p&gt;
&lt;p&gt;For translators, this creates friction in daily work:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Source navigation in tools such as Lokalize becomes less reliable&lt;/li&gt;
&lt;li&gt;Context gets confusing and unreliable when similar file names exist across multiple components&lt;/li&gt;
&lt;li&gt;Name collisions make it harder to trust where a string truly comes from&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="what-was-improved"&gt;What was improved&lt;/h2&gt;
&lt;p&gt;Building on the direction already present in the project, I have focused on making path handling consistent and easier to validate.&lt;/p&gt;
&lt;h3 id="normalization-and-wrappers"&gt;Normalization and wrappers&lt;/h3&gt;
&lt;p&gt;To fix this systematically across l10n-scripty, I implemented a set of sanitization wrappers.
These extraction wrappers were added and/or improved so source references are kept in project relative form in generated output:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kde_xgettext&lt;/li&gt;
&lt;li&gt;kde_extractrc&lt;/li&gt;
&lt;li&gt;kde_extractattr&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This helps ensure each reference points to a precise location inside a repository.&lt;/p&gt;
&lt;h3 id="metainfo-extraction-flow"&gt;Metainfo extraction flow&lt;/h3&gt;
&lt;p&gt;The metainfo extraction path handling was updated so references are resolved in a project relative way rather than relying on short file name matching. This improves clarity for AppStream and related metadata sources too.&lt;/p&gt;
&lt;h3 id="validation-improvements"&gt;Validation improvements&lt;/h3&gt;
&lt;p&gt;validate_paths.sh -&amp;gt; the prime path verifier script, was strengthened to check not only missing files but also ambiguous references caused by duplicate file names in different directories. This greatly assisted in debugging and understanding where the issues stem from.&lt;/p&gt;
&lt;h2 id="verification-results"&gt;Verification results&lt;/h2&gt;
&lt;p&gt;A full extraction and validation cycle was run in a controlled Docker environment across 600 plus (all) projects. The latest results showed clean and correct path resolution in most projects with just a dozen edge case ambiguities and missing paths not fixed by current improved wrappers.&lt;/p&gt;
&lt;p&gt;Although this might be a good enough fix, it isn't complete - the endgame remains.&lt;/p&gt;
&lt;h3 id="remaining-work"&gt;Remaining work&lt;/h3&gt;
&lt;p&gt;There are several key areas on the checklist like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Completing the coverage for the remaining fixable projects by hardening the metainfo extraction logic for complex projects.&lt;/li&gt;
&lt;li&gt;Communicating with the community regarding the fixes done by me. As I have still not made an actual MR, there is a great chance that this fix isn't optimised and might have some oversights.&lt;/li&gt;
&lt;li&gt;Finalizing the &lt;code&gt;validate_paths.sh&lt;/code&gt; suite along with my mentor for integration into CI to prevent path regressions.&lt;/li&gt;
&lt;li&gt;Getting the fix verified locally by both my mentor and my mentee partner.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="final-thoughts"&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;This project has been a wonderful learning journey through the infrastructure that quietly powers localization for KDE. It was deeply meaningful to contribute improvements that make translator workflows clearer, faster, and more trustworthy.&lt;/p&gt;
&lt;p&gt;A big thank you to my mentor, &lt;a href="https://invent.kde.org/finw"&gt;&lt;strong&gt;Finley Watson&lt;/strong&gt;&lt;/a&gt;, for thoughtful guidance and constant support throughout the project. Thank you as well to everyone in the KDE community who reviewed ideas, shared feedback, and helped move this work forward.&lt;/p&gt;
&lt;p&gt;I have grown in this season with more confidence, more curiosity, and even more appreciation for the people behind free software infrastructure. I am proud that this work would help translators do their best work with better context and fewer obstacles, and I am genuinely excited to keep contributing to KDE.&lt;/p&gt;
&lt;p&gt;Happy translating 💙&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Follow progress and contribute on &lt;a href="https://invent.kde.org/sysadmin/l10n-scripty"&gt;KDE Invent&lt;/a&gt; and join us in making software more accessible for people everywhere.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Making Plasma Setup More Mobile-Friendly: A SoK'26 Midterm Update</title><link>https://blogs.kde.org/2026/03/12/making-plasma-setup-more-mobile-friendly-a-sok26-midterm-update/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><author>Onat Ribar</author><guid>https://blogs.kde.org/2026/03/12/making-plasma-setup-more-mobile-friendly-a-sok26-midterm-update/</guid><description>&lt;p&gt;Hey everyone! I'm Onat, and I'm a bit past the halfway mark of my Season of KDE 2026 journey. Here's what I've been working on!&lt;/p&gt;
&lt;p&gt;For reference, here are some relevant links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://invent.kde.org/teams/mentor-programs/2026/-/issues/51"&gt;Project proposal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.kde.org/SoK/2026/StatusReport/Onat_Ribar"&gt;Status report of progress thus far&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Project repositories of &lt;a href="https://invent.kde.org/plasma/plasma-setup"&gt;plasma-setup&lt;/a&gt; and &lt;a href="https://invent.kde.org/plasma/plasma-workspace"&gt;plasma-workspace&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-project-plasma-setup"&gt;The project: Plasma Setup&lt;/h2&gt;
&lt;p&gt;Plasma Setup is the wizard that greets you on a fresh KDE install and walks you through account creation and basic system configuration. When I started, it was very much built with desktop screens in mind, and this shows when you try to run it on a phone.&lt;/p&gt;
&lt;p&gt;The project is about making Plasma Setup work properly across tablets and mobile phones running Plasma Mobile, without breaking the expected behaviour of Plasma on desktop. My work so far has been focused on UI and UX, making it adaptive with Kirigami.&lt;/p&gt;
&lt;p&gt;Another area of interest was a dependency issue, in which Plasma Setup currently pulls in &lt;code&gt;kcm_keyboard&lt;/code&gt; from &lt;code&gt;plasma-desktop&lt;/code&gt;, which was awkward for mobile systems. Due to time constraints and priorities, we haven't pursued this yet, but I will make sure to comment on it in my next blog post!&lt;/p&gt;
&lt;h2 id="what-ive-done-so-far"&gt;What I've done so far&lt;/h2&gt;
&lt;p&gt;The first couple of weeks were mostly about getting ready: setting up VMs running both KDE Desktop and Plasma Mobile spins, reading through the codebases of &lt;code&gt;plasma-setup&lt;/code&gt; and &lt;code&gt;plasma-mobile&lt;/code&gt;, figuring out just how tightly coupled the &lt;code&gt;kcm_keyboard&lt;/code&gt; dependency actually is, as well as refreshing my knowledge of QML/Kirigami and testing the GUI to spot any troublesome areas.&lt;/p&gt;
&lt;p&gt;One early relief: Plasma Setup already runs on Plasma Mobile without crashing! But &amp;quot;runs&amp;quot; and &amp;quot;looks good&amp;quot; are very different things, and there were plenty of layout issues to address.&lt;/p&gt;
&lt;p&gt;From weeks 3 through 7, the main deliverables were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;General fixes for overlapping, overflowing, and misaligned components.&lt;/li&gt;
&lt;li&gt;Fixed wallpapers not showing in narrow layouts.&lt;/li&gt;
&lt;li&gt;Expanded the wizard overlay to fill the screen on mobile.&lt;/li&gt;
&lt;li&gt;Reworked the Time and Date page. The existing OpenStreetMaps map widget was too fiddly for touchscreens to navigate, so I replaced it with a clean region and timezone dropdown pair. This touched &lt;code&gt;plasma-workspace&lt;/code&gt; as well as &lt;code&gt;plasma-setup&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Disabled auto-capitalize and autocorrect on username and hostname fields, which are annoying on a phone keyboard.&lt;/li&gt;
&lt;li&gt;Hid the landing screen buttons on mobile during wizard navigation to prevent accidental taps.&lt;/li&gt;
&lt;li&gt;Endless rounds of testing and reverting changes that didn't make the cut.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There was also a lot of investigative work early on: checking for tight coupling, testing across virtualized Plasma Desktop and Plasma Mobile environments, and verifying behaviour on different CPU architectures. Not exactly glamorous but it was necessary!&lt;/p&gt;
&lt;p&gt;One thing that really improved my productivity later on: I'd been avoiding the nested Wayland compositor for development because of this warning in the &lt;code&gt;plasma-setup&lt;/code&gt; readme file:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;It is not recommended to install this on your system — you should use a virtual machine instead. Installing this on real hardware will leave behind files not trivially uninstallable and could leave your system in a non-function state.&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That warning genuinely spooked me, and I stayed in VMs longer than I needed to. They're safe, but iterating on UI components in a VM was inconvenient and frustrating. My mentor pointed me toward kde-builder and running the applications on a nested Wayland compositor, which upon adoption really sped things up and built my confidence. I wish I'd made the switch sooner!&lt;/p&gt;
&lt;h2 id="what-hasnt-gone-so-well"&gt;What hasn't gone so well&lt;/h2&gt;
&lt;p&gt;Not everything went to plan, but that's expected in a project like this.&lt;/p&gt;
&lt;p&gt;The virtual keyboard situation is still on hold. How Plasma Setup should interact with on-screen keyboards is a bit of an open question, and I've put that aside to focus on the layout work first.&lt;/p&gt;
&lt;p&gt;The dependency side of things (decoupling &lt;code&gt;kcm_keyboard&lt;/code&gt;) is also not started yet; it's been pushed to the later weeks of the project as a side objective, and not only am I running out of time, but it's the part I'm most uncertain about. Refactoring something that touches both &lt;code&gt;plasma-desktop&lt;/code&gt; and &lt;code&gt;plasma-workspace&lt;/code&gt; without introducing regressions is going to need careful testing. Whether this module should be separated is a different concern as well. I will have more to say about this in my final post.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What's next&lt;/h2&gt;
&lt;p&gt;The remaining weeks will focus on final UI polishing based on feedback and getting MRs across the line. A well-polished Plasma Setup on mobile would be a meaningful step for Plasma Mobile as a whole; first impressions matter, and the setup wizard is literally the first thing a new user sees.&lt;/p&gt;
&lt;p&gt;Special thanks to my mentor Kristen a.k.a. &lt;a href="https://invent.kde.org/merritt"&gt;Merritt&lt;/a&gt; for their guidance. The regular check-ins and assistance outside of that have made a real difference for keeping things on track.&lt;/p&gt;
&lt;p&gt;Cheers!&lt;/p&gt;</description></item><item><title>[SoK 2026] Halfway update: Appium Testing in Lokalize</title><link>https://blogs.kde.org/2026/03/08/sok-appium-testing-lokalize-halfway/</link><pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate><author>Vishesh Srivastava</author><guid>https://blogs.kde.org/2026/03/08/sok-appium-testing-lokalize-halfway/</guid><description>&lt;p&gt;Hey there! I'm Vishesh Srivastava, and we're at the halfway mark of my SoK 2026 project — writing Appium-based UI tests for &lt;a href="https://apps.kde.org/lokalize/"&gt;Lokalize&lt;/a&gt;. I was a bit late for the halfway mark, but we're still on track.&lt;/p&gt;
&lt;h2 id="so-whats-lokalize"&gt;So what's Lokalize?&lt;/h2&gt;
&lt;p&gt;It's KDE's translation tool — the app that translators use to work with PO files and manage translation. It does its job well but it had zero UI tests. None. My job this SoK is to fix that.&lt;/p&gt;
&lt;h2 id="the-starting-days-january"&gt;The starting days (January)&lt;/h2&gt;
&lt;p&gt;My first task was &lt;a href="https://bugs.kde.org/show_bug.cgi?id=514468"&gt;Bug 514468&lt;/a&gt; — where copyright year strings in PO headers would be very long like &lt;code&gt;2006, 2010, 2011, 2012, 2013, 2014, 2015, 2017, 2018, 2019, 2020, 2021&lt;/code&gt; instead of the more concise &lt;code&gt;2006, 2010-2015, 2017-2021&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I was asked to write a failing test first. So I added a &lt;code&gt;simplifyYearString&lt;/code&gt; placeholder function, wrote a unit test that expects the collapsed range output, and marked it with &lt;code&gt;QEXPECT_FAIL&lt;/code&gt; since the actual implementation was going to be done by someone else. It was updated to expect to pass when the bug was fixed.&lt;/p&gt;
&lt;p&gt;More importantly, this got me comfortable with KDE's setup, kde-builder, and how the testing framework works.&lt;/p&gt;
&lt;h2 id="the-main-work-appium-tests-february--march"&gt;The main work: Appium tests (February – March)&lt;/h2&gt;
&lt;p&gt;This is where the real fun began. Lokalize had absolutely no Appium setup, so everything was built from the ground up.&lt;/p&gt;
&lt;h3 id="first-steps"&gt;First steps&lt;/h3&gt;
&lt;p&gt;My first tests were very simple. &lt;code&gt;simple_open.py&lt;/code&gt; literally just opens Lokalize and closes it. That's the whole test. &lt;code&gt;file_open.py&lt;/code&gt; was the next step: open the app, click File, click Open, and confirm the dialog shows up. Not much but you have to crawl before you can walk.&lt;/p&gt;
&lt;h3 id="a-bug-i-encountered"&gt;A bug I encountered&lt;/h3&gt;
&lt;p&gt;Here's something I found: Appium finds UI elements through accessibility properties, and Lokalize's editor text fields didn't have any (found using &lt;a href="https://apps.kde.org/accessibilityinspector/"&gt;accessibilityinspector&lt;/a&gt;). So my test scripts were essentially blind — they could see menus and buttons but couldn't interact with the actual editor. I had to edit &lt;code&gt;editorview.cpp&lt;/code&gt; to add object names and accessible names to the widgets to actually get Appium to see them.&lt;/p&gt;
&lt;p&gt;Other KDE apps with Appium tests (Dolphin, KCalc) already had these, but nobody had needed them in Lokalize before. These were my reference for writing the code.&lt;/p&gt;
&lt;h3 id="the-workflow-test-the-one-im-actually-proud-of"&gt;The workflow test (the one I'm actually proud of)&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;workflowtest.py&lt;/code&gt; is the test that simulates what a translator would actually do:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open a &lt;code&gt;.po&lt;/code&gt; file with two untranslated entries&lt;/li&gt;
&lt;li&gt;Type a translation into the target field&lt;/li&gt;
&lt;li&gt;Hit &amp;quot;Approve and Go Next&amp;quot;&lt;/li&gt;
&lt;li&gt;Do the same for the second entry&lt;/li&gt;
&lt;li&gt;Check if the editor tab UI was updated successfully&lt;/li&gt;
&lt;li&gt;Check that the status bar says &lt;code&gt;Not ready: 0&lt;/code&gt; — meaning everything's translated&lt;/li&gt;
&lt;li&gt;Save the file&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Below is a demo of this working:&lt;/p&gt;
&lt;video controls preload="metadata" width="800"&gt;
 &lt;source src="Demo_appium.mp4" type="video/mp4"&gt;
&lt;/video&gt;
&lt;p&gt;It's a proper end-to-end test.&lt;/p&gt;
&lt;h3 id="integrating-with-cmake"&gt;Integrating with CMake&lt;/h3&gt;
&lt;p&gt;To make it so that these tests run along with all other tests with &lt;code&gt;kde-builder --run-tests&lt;/code&gt;, I added a &lt;code&gt;CMakeLists.txt&lt;/code&gt; for the appiumtests directory and added it into the project's build system behind a &lt;code&gt;BUILD_APPIUM_TESTS&lt;/code&gt; option:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kde-builder --run-tests lokalize --no-include-dependencies --no-src --cmake-options&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-DBUILD_APPIUM_TESTS=ON&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now the tests integrate with the Appium tests just like they do in other KDE apps.&lt;/p&gt;
&lt;h2 id="next-steps"&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Writing failing tests for bugs&lt;/li&gt;
&lt;li&gt;Edge case tests&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="final-thoughts-for-now"&gt;Final thoughts (for now)&lt;/h2&gt;
&lt;p&gt;It's been a enjoyable experience and many thanks to &lt;a href="https://invent.kde.org/finw"&gt;Finley Watson&lt;/a&gt; for offering great help along the way.&lt;/p&gt;
&lt;p&gt;Halfway there. Let's see what happens next.&lt;/p&gt;</description></item><item><title>Season of KDE 2026 - Fixing the Glossary in Lokalize (Midterm)</title><link>https://blogs.kde.org/2026/03/08/season-of-kde-2026-fixing-the-glossary-in-lokalize-midterm/</link><pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate><author>Jaimukund Bhan</author><guid>https://blogs.kde.org/2026/03/08/season-of-kde-2026-fixing-the-glossary-in-lokalize-midterm/</guid><description>&lt;p&gt;Greetings to the KDE community!&lt;/p&gt;
&lt;p&gt;My name is &lt;a href="https://invent.kde.org/jaimukund"&gt;Jaimukund Bhan&lt;/a&gt; and I have been working on &lt;a href="https://invent.kde.org/sdk/lokalize"&gt;Lokalize&lt;/a&gt;, the l10n tool used to translate KDE software, for Season of KDE 2026. Specifically, I have been fixing the Glossary - which is a collection of frequently used words linked to keyboard shortcuts for quick access while translating.&lt;/p&gt;
&lt;p&gt;The following are the changes I have made during the first half of SoK, while learning a lot about developing with the Qt Framework and on KDE software.&lt;/p&gt;
&lt;h3 id="creating--saving-the-glossary-file"&gt;&lt;a href="invent.kde.org/sdk/lokalize/-/merge_requests/268"&gt;Creating &amp;amp; Saving the Glossary file&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;First and foremost, the Glossary file had to exist! At the time, I found out that the file would not load or allow entries to the glossary, because it wasn’t opened inside the function. Crisis was averted when the code for opening the files was added, but now came the saving functionality.
After a long, long (but fruitful) discussion with my mentor, I finalized the file saving logic to trap the user into setting a valid glossary file path for their project. This meant the user had to ensure that they had permission for the directory in which they meant to save the glossary file and should specify an existing file path. In case the user had entered something invalid, this change would return the dialog box back, pre-filled with a default valid path.
I got comfortable with a few Qt features and learned a lot about the user’s workflow through this task.&lt;/p&gt;
&lt;h3 id="autosaving-the-glossary-file"&gt;&lt;a href="https://invent.kde.org/sdk/lokalize/-/merge_requests/283"&gt;Autosaving the Glossary File&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Now that the glossary file could be saved, a feature request was made for autosaving the glossary file. At the time, the only way to save the glossary file was by the keyboard shortcut (Ctrl+S) or when the glossary tab was closed and the user was prompted to save/discard their changes.
To autosave the glossary file, I had to identify when and how the file needed to be saved. This time, I found a relic hiding in the codebase (AuxTextEdit, the KTextEdit I had to override), which was exactly what I needed to catch when the user stopped editing the Definition section of a term in the Glossary tab. Now the file would be saved whenever the user added/deleted terms or stopped editing. I also unearthed another feature which was not working correctly, although this will be covered in the next part.&lt;/p&gt;
&lt;h3 id="removing-the-restore-function"&gt;&lt;a href="https://invent.kde.org/sdk/lokalize/-/merge_requests/284"&gt;Removing the Restore function&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Less code is good code. This change was just removing a feature not a lot of users had a need for, and clearing that up would make it much easier to maintain the codebase.
The Glossary tab had a button to restore the glossary file from disk, which was meant as a way to reset all the unsaved changes made to the glossary file. But with all the new features made for autosaving, it did not make sense to keep it anymore.&lt;/p&gt;
&lt;h3 id="showing-the-first-visible-entry-in-editor"&gt;&lt;a href="https://invent.kde.org/sdk/lokalize/-/merge_requests/290"&gt;Showing the first visible entry in Editor&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Two bugs I found were how the Glossary editor would not clear the editor when all the terms were deleted from the file and that the Subject field would be pre-selected with a term from the combo box, when no actual term was selected if the app started on the Glossary tab. I added the clause to clear the editor whenever all the terms were deleted, and selected the first entry whenever the app started on the Glossary tab.&lt;/p&gt;
&lt;h3 id="acknowledgements"&gt;Acknowledgements&lt;/h3&gt;
&lt;p&gt;A huge thank you to my mentor, &lt;a href="https://invent.kde.org/finw"&gt;Finley Watson&lt;/a&gt;, for being super patient with all the discussions and changes I made, and to the KDE Community for being so welcoming! I’d recently switched to using Linux with Plasma and the biggest reason for applying was to learn how to effectively contribute to KDE software. I’ve truly enjoyed this journey so far, and I hope to keep contributing to the KDE community long after this project is complete.&lt;/p&gt;</description></item><item><title>Mid-SoK Blog</title><link>https://blogs.kde.org/2026/03/04/mid-sok-blog/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><author>Navya Sai Sadu</author><guid>https://blogs.kde.org/2026/03/04/mid-sok-blog/</guid><description>&lt;p&gt;I'm half-way through the Season of KDE 2026 and wanted to share the journey so far.&lt;/p&gt;
&lt;p&gt;I had subscribed to the kde-soc mailing list after I returned from IndiaFOSS'25, where I met KDE contributors who really encouraged me to join the community and told me that one can always learn while building. The first step, always, is to start. Then I got carried away with life until I saw &amp;quot;call to action&amp;quot; in my mailbox in January. It was about SoK'26. I had then recently set up Kubuntu and was in awe about what people can build out of passion and by collaborating with others. I felt mentorship was the way to get started. I explored the projects and found Task-3 under &lt;a href="https://apps.kde.org/lokalize/"&gt;Lokalize&lt;/a&gt; as something that I can contribute to while learning new skills- programming in CPP, debugging, and exploring an old repo.&lt;/p&gt;
&lt;p&gt;Here's everything i did before the season officialy began.&lt;/p&gt;
&lt;h2 id="before-proposal"&gt;Before Proposal&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I installed ==Lokalize== and reproduced the bug.&lt;/li&gt;
&lt;li&gt;Cloned the &lt;a href="https://invent.kde.org/sdk/lokalize"&gt;repo&lt;/a&gt;. Used &lt;em&gt;grep&lt;/em&gt; to find “Approve and go next” in codebase. Turned out &lt;strong&gt;EditorTab::gotoNextFuzzyUntr()&lt;/strong&gt; is the origin of bug. I thought about &amp;quot;Approve and go prev&amp;quot; and tried that. It was buggy too!&lt;/li&gt;
&lt;li&gt;Wrote &lt;a href="https://invent.kde.org/teams/mentor-programs/2026/-/issues/42"&gt;proposal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="after-proposal"&gt;After Proposal&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;kde-builder failed due to missing libraries. So after lot of fixes, i did ubuntu update to 25.10(has qt6). *Created a test branch and added debug log in forementioned method.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="before-23rd"&gt;Before 23rd&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Got myself acquainted with Kate.&lt;/li&gt;
&lt;li&gt;Fidgeted around files to understand architecture.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="got-to-know-about"&gt;Got to know about&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;qDebug()&lt;/li&gt;
&lt;li&gt;why use .h and .cpp files&lt;/li&gt;
&lt;li&gt;LSP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;a href="https://community.kde.org/SoK/2026/StatusReport/Navya_Sai_Sadu"&gt;weekly status reports&lt;/a&gt; contain links to supoorting documents, commits and MRs.&lt;/p&gt;
&lt;h2 id="week-1"&gt;Week 1&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Spent more time understanding the repo, the files,classes and methods which were involved in the bug using debug logs, grep and manual look-over.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wrote a few comments to document better.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Had an introductory call, was nice to know the contributors.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="week-2"&gt;Week 2&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Researched past commit to understand the intent of navigational shortcuts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added SPDX license headers( did not know it was being actively developed in GSOC too). Aided Kumud by sending an email to the KDE i18n mailing list regarding the cyclic traversal on entries for keyboard shortcuts in the Translation Units View. Typically, KDE applications don't use that, as followed from the replies and was not needed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Had a group call for understanding rebase but i still mess up sometimes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="week-3"&gt;Week 3&lt;/h2&gt;
&lt;p&gt;While Kumud's implementation addressed &lt;code&gt;gotoNextFuzzyUntr()&lt;/code&gt;, analyzed their approach to &lt;a href="https://invent.kde.org/sdk/lokalize/-/merge_requests/288"&gt;generalise&lt;/a&gt; it to make it work for &lt;code&gt;gotoPrevFuzzyyUntr()&lt;/code&gt; and added a parameter to move in either direction for which a &lt;a href="https://invent.kde.org/sdk/lokalize/-/commit/178f919c733f0d8dba5c826dfe85812f119134b1"&gt;new Enum&lt;/a&gt; was used instead of magic numbers(they have a name for it T-T). I could see magic numbers used previously in the code and do get it why it isn't preferred.&lt;/p&gt;
&lt;h2 id="week-4"&gt;Week 4&lt;/h2&gt;
&lt;p&gt;Continued with the week-3's work&lt;/p&gt;
&lt;h2 id="week-5"&gt;Week 5&lt;/h2&gt;
&lt;p&gt;Worked on fixing other navigational shortcuts in editortab.cpp which implied generalising the function furthermore to take another parameter for entry state. &lt;a href="https://www.reddit.com/r/Kotlin/comments/w7rcqt/ifthenelse_vs_nonexhaustive_when_what_is_the/"&gt;StackOverflow&lt;/a&gt; is a saviour(Of course, after my mentor). Throughtout this time, it felt as if things were unravelling themselves to me. New bugs were found and worked upon. Looking back, I mostly improvised upon Kumud's solution but still got to learn a lot on the way.&lt;/p&gt;
&lt;h2 id="week-6"&gt;Week 6&lt;/h2&gt;
&lt;p&gt;Will work on other bugs identified on the way or scout for new ones! See if I make past &lt;a href="https://invent.kde.org/sdk/lokalize/-/merge_requests/298"&gt;this&lt;/a&gt; which was primarily the task for SoK.&lt;/p&gt;</description></item><item><title>[SoK 2026] Midterm update for 'Automating promo data collection' task</title><link>https://blogs.kde.org/2026/02/18/sok-2026-midterm-update-for-automating-promo-data-collection-task/</link><pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate><author>CJ Nguyen</author><guid>https://blogs.kde.org/2026/02/18/sok-2026-midterm-update-for-automating-promo-data-collection-task/</guid><description>&lt;p&gt;Hey all! I'm CJ and I'm checking in with a midterm update on the Season of KDE task of automating data collection for the KDE promotional team.&lt;/p&gt;
&lt;p&gt;The first term of the two for this Season of KDE task has mostly been a learning experience of what does and doesn't work when it comes to scraping data from the web, laying down our toolset and approach to data collection.&lt;/p&gt;
&lt;p&gt;Three subtasks have resulted:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a script that collects follower and post counts from several websites housing KDE's social media accounts&lt;/li&gt;
&lt;li&gt;Create a script that processes information from the Reddit Insights page for the KDE subreddit&lt;/li&gt;
&lt;li&gt;Create a script automating the evaluation of articles discussing KDE tools&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first two of those are mostly completed while the last one is in its research and planning phase.
Both finished subtasks came with their own sets of challenges, techniques and tools that I'll detail separately.&lt;/p&gt;
&lt;h2 id="follower-and-post-counts-scraper"&gt;Follower and post counts scraper&lt;/h2&gt;
&lt;p&gt;This is a script I discussed in my &lt;a href="https://blogs.kde.org/2026/02/01/season-of-kde-2026-week-1-progress-for-automating-promo-data-collection/"&gt;first blog post&lt;/a&gt; that scrapes follower and post counts from X (formerly known as Twitter), Mastodon, Bluesky, and Threads.
The major updates to this script made since then are that it employs a more user and server-friendly usage method and that we've tackled a few issues that came up outside of the script's scraping.
On the usage side I've added command-line arguments and an expectation for a JSON file containing the links to scrub from.
This makes swapping out social media links easy as well as adding options for scaling up configuration of the script if any further development is needed.&lt;/p&gt;
&lt;p&gt;At the point of writing the logic of the script has held up well but the data format we were outputting to, Open Document Format (ODF), wasn't friendly for our specific usage, which is something I touched on in that first blog post.
In the end we decided the tools that interface with ODF were too unwieldy to work with from an automation and programmatic standpoint so we're looking into alternatives at the moment.
One promising solution is KDE's &lt;a href="https://labplot.org/"&gt;LabPlot&lt;/a&gt; which has a good looking (but experimental) &lt;a href="https://docs.labplot.org/en/sdk.html"&gt;Python API&lt;/a&gt; and is FOSS.
For now I've set the script up to output to a user-friendly JSON file until we resolve what tool will be leveraged for data analysis in the end.&lt;/p&gt;
&lt;p&gt;Another issue came from the input-side of the script in the X/Twitter scraping portion.
Many public Nitter instances implement bot-prevention I was unaware of that triggered on an attempted headless server run of the script.
With that making simpler scraping methods difficult and also paying respect to those instances' desire not to be botted, I've decided to spin up our own local Nitter instance on the server which is running the script.
Now scraping X/Twitter comes much more easily and with a lot less risk of failure.&lt;/p&gt;
&lt;h2 id="kde-subreddit-insights-scraper"&gt;KDE subreddit Insights scraper&lt;/h2&gt;
&lt;p&gt;Since that first week we've added another task, being the creation of a script that can add up the weekly influx of new visitors, unique page views, and members of the KDE subreddit utilizing the subreddit's Insight page.
This script mostly challenged our ability to automate the login process for Reddit as the usual methods are prevented by browser verification tools.&lt;/p&gt;
&lt;p&gt;Reddit implements some version of reCAPTCHA that utilizes a form of &lt;a href="https://developers.google.com/recaptcha/docs/versions"&gt;invisible reCAPTCHA&lt;/a&gt; on their login page.
The method of implementation changes based off which version they use, but in the end a score grading the likelihood of a user being a bot or a human is returned to the website upon login.
This means that simple HTTP requests are likely not enough to get the job done and that a level of interaction supplied using a browser automation framework is needed to handle the login process.&lt;/p&gt;
&lt;p&gt;To that end, we chose to leverage the long-standing &lt;a href="https://github.com/seleniumhq/selenium"&gt;Selenium&lt;/a&gt; web browser automation framework.
Selenium, and many browser-automation frameworks like it, works by launching a full-featured web browser to run its automated tasks.
This introduces problems in running these scripts on a headless server but greatly simplifies bot-prevention thwarting and the loading of any JavaScript-sensitive page elements.&lt;/p&gt;
&lt;p&gt;With Selenium automating our login process, the only challenge left was to process the HTML data retrieved.
Reddit Insights presents its information in the form of bar charts that visualize the daily page views, unique visitors, and subscribers to a subreddit.
Some small analysis of the page source revealed that the daily data populating the bar charts are stored with millisecond UNIX timestamp representations of those days.
Using &lt;a href="https://www.crummy.com/software/BeautifulSoup/"&gt;BeautifulSoup&lt;/a&gt;, it was very easy for me to grab that daily data using those timestamps and sum up the totals needed for our script.&lt;/p&gt;
&lt;p&gt;The main challenge this script presents now is how we can get it running on a weekly basis in a headless server.
The UI component is non-negotiable so the solution will very likely come in the form of server configuration.&lt;/p&gt;
&lt;h2 id="smaller-updates"&gt;Smaller updates&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Investigated automation of NextCloud data uploads&lt;/li&gt;
&lt;li&gt;Researched how to schedule scripts to run on an interval using systemd unit files&lt;/li&gt;
&lt;li&gt;Wrote technical documentation on the purpose and usage of both scripts developed at the point of writing&lt;/li&gt;
&lt;li&gt;Researched various alternative packages for performing HTTP requests and browser automation tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="future"&gt;Future&lt;/h2&gt;
&lt;p&gt;Since the last two subtasks are complete logic-wise outside of any future issues we run into, a new one has been assigned as part of the data collection automation task.
The KDE promo team collects various articles about KDE and software related to it and evaluates the contents of those articles as they relate to KDE and how they view whichever KDE tool they discuss.
This evaluation process is performed manually which takes up time, so I've been tasked with developing some method of analyzing these articles in an automated fashion.&lt;/p&gt;
&lt;p&gt;Along with that new subtask, solving the issues of running browser automation software on a server and what data evaluation software we'll target will greatly benefit us by expanding our options for deploying scripts made in this task and making their data immediately useful for the KDE promo team.&lt;/p&gt;
&lt;h2 id="lessons-learned"&gt;Lessons learned&lt;/h2&gt;
&lt;p&gt;It's been a lot of fun to tackle the first two tasks.
I've had to pull from past experience with APIs, HTML, and HTTP that have been rotting in deeper parts of my brain as well as learn much more about how modern, full-featured websites deploy those tools.
I'm a bit anxious about the problem of server deployment since I want these scripts to be as useful and maintainable as possible for the KDE promotion team, but I'm confident we'll find a solution and I'm sure it will feel very rewarding to solve.&lt;/p&gt;
&lt;p&gt;Concerning the new subtask, this assignment is a departure from the first two and it's very likely a light and local AI/machine learning method will be looped into this process.
That makes it exciting to tackle since it's so different from the last couple of subtasks and incorporates an entirely separate emerging field.
I'm very much looking forward to rounding my skills with the new challenges this subtask presents.&lt;/p&gt;</description></item><item><title>Season of KDE 2026: My journey with Marknote</title><link>https://blogs.kde.org/2026/02/14/season-of-kde-2026-my-journey-with-marknote/</link><pubDate>Sat, 14 Feb 2026 00:00:00 +0000</pubDate><author>Siddharth Chopra</author><guid>https://blogs.kde.org/2026/02/14/season-of-kde-2026-my-journey-with-marknote/</guid><description>&lt;p&gt;Hey everyone!&lt;/p&gt;
&lt;p&gt;I am Siddharth Chopra, a second year engineering student at the Indian Institute of Technology, Roorkee. I'm really excited to be working on Marknote as a part of the Season of KDE program this year, under the mentorship of &lt;a href="https://invent.kde.org/carlschwan"&gt;Carl Schawn&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Marknote, as it is aptly named, is KDE's own markdown based note taking app. The aim of my project is to improve Marknote by adding the much requested source mode, alongside other enhancements.&lt;/p&gt;
&lt;h3 id="progress-so-far"&gt;Progress so far&lt;/h3&gt;
&lt;p&gt;3 weeks into the project, I have been successful in adding a working source mode functionality to the editor. When source mode is activated, the contents of the source markdown file are allowed to be edited directly, instead of showing the rendered markdown. This is incredibly useful, in cases where the user needs manual control over the contents of the note, or in case there is some glitch in the rendering (which unfortunately still happens often).&lt;/p&gt;
&lt;h3 id="demo-video"&gt;Demo Video&lt;/h3&gt;

 


&lt;figure class="text-center ratio ratio-16x9" style=""&gt;
 &lt;video controls&gt;&lt;source src="%25!s%28%3cnil%3e%29vid.webm" type="video/webm" /&gt;&lt;/video&gt;&lt;/figure&gt;

&lt;h3 id="technical-roadmap--challenges"&gt;Technical Roadmap &amp;amp; Challenges&lt;/h3&gt;
&lt;p&gt;The main editor of Marknote comes from the file EditPage.qml. As part of my initial approach, I added a global property here to check if source mode was enabled, and then conditionally changed components of this editor. Although this worked, but it brought along some of its own issues. First of all it made the code unnecessarily complex. It also meant that components like the formatting bar now needed to be repurposed to work with source mode, which is a challenge in itself.&lt;/p&gt;
&lt;p&gt;So, my mentor suggested to move the raw editor into a new file, to keep the code maintainable. This led to the original &lt;code&gt;EditPage&lt;/code&gt; being split into &lt;code&gt;RichEditPage&lt;/code&gt; and &lt;code&gt;RawEditPage&lt;/code&gt;. Similarly, the respective backends were also split in two, as the needs of both the editors are significantly distinct.&lt;/p&gt;
&lt;p&gt;Additionally, I had to consider specially the source mode for images. Because when loaded, image URL's are not kept intact, instead they are replaced with a hash, that maps to the image in memory. Also, the editor internally uses html for rendering images, which I also had to convert back to markdown for source mode.&lt;/p&gt;
&lt;p&gt;And someone who is not a designer by any means, deciding the form and placement of the mode toggle button was in itself a mini lesson in UI design ;) Initially I went with a toggle switch. But when I shared that for feedback, I learnt that a checkable button is the ideal UI element here.&lt;/p&gt;
&lt;h3 id="future-plans"&gt;Future Plans&lt;/h3&gt;
&lt;p&gt;My &lt;a href="https://invent.kde.org/teams/mentor-programs/2026/-/issues/29"&gt;proposal&lt;/a&gt; mentions features apart from the source mode, which I plan to complete. While working on the current feature, I noticed multiple bugs in the app, which I intend to fix as well.&lt;/p&gt;
&lt;h3 id="overall-experience"&gt;Overall experience&lt;/h3&gt;
&lt;p&gt;It has been a great experience working with the KDE community, and really exciting to be able to contribute to an app that so many users around the world use every day!
I would also like to express my gratitude towards my mentor, for being there for whatever issue I faced!&lt;/p&gt;</description></item><item><title>Season of KDE 2026: Week 1 Progress for Automating Promo Data Collection</title><link>https://blogs.kde.org/2026/02/01/season-of-kde-2026-week-1-progress-for-automating-promo-data-collection/</link><pubDate>Sun, 01 Feb 2026 00:00:00 +0000</pubDate><author>CJ Nguyen</author><guid>https://blogs.kde.org/2026/02/01/season-of-kde-2026-week-1-progress-for-automating-promo-data-collection/</guid><description>&lt;p&gt;Hi all! I'm CJ, and I'm participating in Season of KDE 2026 by automating portions of the data collection for the KDE promo team. This post is an update on the work I've done in the first week of SoK.&lt;/p&gt;
&lt;p&gt;My mentor gave me a light task to help me get set up and familiarize myself with the tools I'll be using for the rest of the project. The task was to automate the population of a spreadsheet that tracks follower and post counts for X (formerly known as Twitter), Mastodon, BlueSky, and Threads.&lt;/p&gt;
&lt;p&gt;The spreadsheet takes the follower and post counts of some of KDE's social media platforms and makes calculations based off that data. Important things to note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;data from the sites is entered manually&lt;/li&gt;
&lt;li&gt;there are a lot of styles and formulas in the sheet&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="fetching-account-data"&gt;Fetching Account Data&lt;/h2&gt;
&lt;p&gt;Grabbing data was mostly no trouble. Mastodon and BlueSky were especially easy to work with. They have a public and well documented API that lets people collect all kinds of data in human-readable formats. One particular endpoint from both sources output account information, including follower and post counts, for a given account in neat JSON files (&lt;a href="https://docs.bsky.app/docs/api/app-bsky-actor-get-profile"&gt;BlueSky&lt;/a&gt;, &lt;a href="https://docs.joinmastodon.org/methods/accounts/#get"&gt;Mastodon&lt;/a&gt;). All it took were GET requests to these endpoints and it was smooth sailing.&lt;/p&gt;
&lt;p&gt;X and Threads proved a bit more finnicky. Both of their APIs limit access to much of their functionality usually meaning webscraping methods are the most accessible for grabbing public account data. Threads shows users' follower counts out directly on an account's landing page, so processing a GET request to the URL of KDE's Threads account made it easy to grab. The problem is that there seems to be no direct way to grab the post count either through their API or with webscraping methods. For now, we've chosen to leave that be and circle back when I explore Threads more in the future. X presents a similar problem but there is an open-source frontend alternative named &lt;a href="https://github.com/zedeus/nitter"&gt;Nitter&lt;/a&gt;, instances of which lay all the stats information out in the open. The reliability of this method depends on public Nitter instances being available so it may be worth coming back around to this in a later part of the project, but for now it's a viable solution for getting follower and post counts.&lt;/p&gt;
&lt;h2 id="inputting-the-data-into-the-spreadsheet"&gt;Inputting the Data Into the Spreadsheet&lt;/h2&gt;
&lt;p&gt;With the data all fetched, all that was left is to add that data to the ODF spreadsheet. I had this down as the easy part of the task but in the end it wasn't so simple. The two major Python packages I found that can interpret and write ODF files: Pandas and pyexcel. Both of these have no problem reading data from the files, but when it comes to saving they don't preserve some elements of the spreadsheet. In the end we went the simple route which is to save the data to a separate ODF file using one of the Python-ODF interfaces and import that into the data sheet. This took a little finagling with formulas to get things working without popping errors into cells the sheet, but in the end we have an output ODF spreadsheet file containing the required data and the original spreadsheet with all the calculations pulling that data into its formulas, removing any requirement of a human interfacing with this portion of data collection.&lt;/p&gt;
&lt;h2 id="learned-lessons"&gt;Learned Lessons&lt;/h2&gt;
&lt;p&gt;I feel like this week's task was a great first step into data collection automation. It was challenging without being too difficult to make progress on and forced me to explore different avenues for gathering data. On the confidence side, getting a (mostly) successful task out the gate helped me feel more comfortable with the tools and processes that will likely appear throughout the entirety of my SoK experience. Things will scale up from here on out though so I'm also keeping myself in check.&lt;/p&gt;
&lt;p&gt;From what I understand some of the most difficult parts of automated data collection come through having to interface with Javascript and not getting banned, both of which I've yet to come face-to-face with in any substantial capacity so far. Along with that I've face unexpected problems, such as the issue with modifying ODF files and that some websites don't play as well with certain browsers, which I don't have an easy way to test for yet. With these in mind I'm trying to tread lightly and be diligent with research and good practice as I continue on.&lt;/p&gt;</description></item></channel></rss>