<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mentorship on KDE Blogs</title><link>https://blogs.kde.org/categories/mentorship/</link><description>Recent content in Mentorship on KDE Blogs</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Tue, 25 Aug 2026 22:42:32 +0530</lastBuildDate><atom:link href="https://blogs.kde.org/categories/mentorship/index.xml" rel="self" type="application/rss+xml"/><item><title>Redesigning Lokalize's Translation Memory Tab - GSoC Week 9</title><link>https://blogs.kde.org/2026/08/25/week9-gsoc-blog/</link><pubDate>Tue, 25 Aug 2026 00:00:00 +0000</pubDate><author>Navya Sai Sadu</author><guid>https://blogs.kde.org/2026/08/25/week9-gsoc-blog/</guid><description>&lt;p&gt;After working on the UI of TM Tab in Lokalize during the first phase of GSoC, I got back to work on the backend. Currently, only a single TM can be searched in TM Tab. My changes enable querying across multiple selected TMs as per translators' feature request.&lt;/p&gt;
&lt;p&gt;A little about threads and mutexes before I share week-wise updates. The GUI runs on the main thread, while TM operations (querying, opening/closing databases, removing files) run as jobs on a separate worker thread pool, &lt;code&gt;TM::threadPool()&lt;/code&gt;. This pool is explicitly capped to a single worker thread at startup- &lt;code&gt;setMaxThreadCount(1)&lt;/code&gt;. This means TM jobs never actually run concurrently with each other, they queue and execute strictly one at a time (this can be changed given my new changes but will have to be careful).&lt;/p&gt;
&lt;p&gt;QSqlDatabase connections can only be used on the thread that created them, which is why each job looks up or clones a connection specific to the current thread before querying.&lt;/p&gt;
&lt;p&gt;A queued connection is what lets a signal emitted on the worker thread safely invoke a slot on the GUI thread: rather than running the slot's code immediately on the emitting thread.&lt;/p&gt;
&lt;p&gt;A mutex protects shared or concurrently-accessed data.&lt;/p&gt;
&lt;h2 id="week-7"&gt;Week 7&lt;/h2&gt;
&lt;p&gt;I spent week 7 exploring other approaches for quering multiple DBs and merging the results. &lt;a href="https://doc.qt.io/qt-6/qsqlquerymodel.html#details"&gt;QSqlQueryModel&lt;/a&gt; is only useful to get query results from a single db. It just enabled &lt;code&gt;std::move(*job-&amp;gt;query)&lt;/code&gt; and there was no way to append results from other TMs.&lt;/p&gt;
&lt;p&gt;I felt that my proposed approach, to fire N ExecQueryJobs, merge them in an in-memory SQLite db, and then pass it on to the view, was making things unnecessarily complex and somewhat redundant. I'm sharing the discarded ideas as well in case it helps someone in the future.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;a href="https://stackoverflow.com/questions/6824717/sqlite-how-do-you-join-tables-from-different-databases"&gt;ATTACH&lt;/a&gt; to add other db(s) and perform UNION on the search query. There were some concerns over the complexity of ATTACH and also Lokalize supports remote TMs (PostgreSQL) which doesn't have the provision of ATTACH.&lt;/li&gt;
&lt;li&gt;Then, I looked into &lt;code&gt;QConcatenateTablesProxyModel&lt;/code&gt; which some KDE apps already use, but there is some bug with its working with &lt;code&gt;QSortFilterProxyModel&lt;/code&gt;. I could have had &amp;quot;N TMDBModel instances&amp;quot; (which doesn't seem like a good idea) for each TM and later join them.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="week-8"&gt;Week 8&lt;/h2&gt;
&lt;p&gt;I decided upon &lt;code&gt;QAbstractTableModel&lt;/code&gt;. Unlike &lt;code&gt;QSqlQueryModel&lt;/code&gt; (which is a subclass of it), it's more flexible and I had to refactor some of the code. This also meant lazy fetch couldn't be preserved and the results would be stored in &lt;code&gt;QSqlRecords&lt;/code&gt; (to preserve all the existing usage on results).&lt;/p&gt;
&lt;p&gt;Manually tested against a single TM. Rewrote the TMJob Test too. I find it strange that we always write a test for it to pass. Also from one of the &lt;a href="https://medium.com/@mlntdrv/about-them-automated-tests-d4300a59e870"&gt;articles&lt;/a&gt; I read: &amp;quot;Use test driven development. When you write the test just before the production code, you would never write a monster test, would you?&amp;quot;&lt;/p&gt;
&lt;h2 id="week-9"&gt;Week 9&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;setFilter()&lt;/code&gt; is modified such that &lt;code&gt;ExecQueryJob&lt;/code&gt; is fired for each TM. &lt;code&gt;slotQueryExecuted()&lt;/code&gt; accumulates each job's rows into the model as they arrive, and only fires &lt;code&gt;resultsFetched()&lt;/code&gt; once every selected TM's job has reported back. Row count is also reported directly at the end.&lt;/p&gt;
&lt;p&gt;Well, contrary to what I wrote in the last blog, I did end up with an approach quite similar to what TMView does. Are mentors always right?&lt;/p&gt;
&lt;p&gt;The part on which I spent a lot of time was what happens if someone retypes their query, or checks/unchecks a TM, while the previous search's jobs are still mid-flight. Stale results shouldn't be allowed to land on top of a newer search's rows. The fix is a generation counter to keep track.&lt;/p&gt;
&lt;p&gt;After a lot of coding and debugging, seeing the resuts from multiple TMs made the entire hard work finally pay off.&lt;/p&gt;
&lt;p&gt;While testing, the bug mentioned in the previous blog kept pestering me so I fixed it too. I was so fixated on empty/short string that I did not think that the place it was being used could be a problem. It's nice to see the Art of Debugging materialize out of pages of Roger S. Pressman's &lt;a href="https://books.google.co.in/books/about/Software_Engineering.html?id=5fiKo3qfiKYC"&gt;textbook&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I'll begin to work on TM View once these changes are reviewed and merged.&lt;/p&gt;</description></item><item><title>GSoC 2026: Building Join.Kde.Org</title><link>https://blogs.kde.org/2026/08/22/gsoc-2026-building-join.kde.org/</link><pubDate>Sat, 22 Aug 2026 00:00:00 +0000</pubDate><author>Ansh Singhal</author><guid>https://blogs.kde.org/2026/08/22/gsoc-2026-building-join.kde.org/</guid><description>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;Helloooooo,&lt;br&gt;
it’s me again, Ansh! , the mentee who has been working on the Join.kde.org&lt;br&gt;
This is the final update within the official timeline of GSoC 2026 for my project: &lt;strong&gt;Building Join.KDE.org&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A quick summary:&lt;br&gt;
Over the past 12 weeks, I have worked on creating, designing and implementing the join.kde site into a platform that can answer most of the basic questions a new contributor has. In this post, I’ll mainly focus on the progress from Week 6 to Week 12 along with my final thoughts.&lt;/p&gt;
&lt;p&gt;For a short summary, checkout this &lt;a href="https://community.kde.org/GSoC/2026/StatusReports/Ansh_Singhal"&gt;status report&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="week-6-contributesuggest"&gt;Week 6: Contribute/suggest&lt;/h3&gt;
&lt;p&gt;This week I worked on the ADD section which got renamed to contribute,
it includes several sub sections which allows people to contribute based on their interests.&lt;/p&gt;
&lt;p&gt;Routed the explore section to KDE.org for you section so people can explore and find their own use for KDE softwares.&lt;/p&gt;
&lt;p&gt;Created the suggest section which contains the information on how to report bugs/request for features.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="week-7-navbar"&gt;Week 7: Navbar&lt;/h3&gt;
&lt;p&gt;This week was more about improvements on the navbar, I noticed with all the text the nav-bar looked way too cluttered, and simply overwhelming
so with the advice from Anish and how he changed the navbar for the mentorship website, I worked up something similar and made dropdowns for the navbar so it can still have more content when clicked.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="week-8-work-on-projects"&gt;Week 8: Work on Projects&lt;/h3&gt;
&lt;p&gt;For this week I worked on the work on projects section which allows people to find groups of projects in invent based on skillset or the programming languages one knows.&lt;/p&gt;
&lt;p&gt;I added all the groups available in KDE invent in this section which little tags of skillset.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="week-9-incubate-projects"&gt;Week 9: Incubate projects&lt;/h3&gt;
&lt;p&gt;Worked on designing Incubate projects section: which basically explains what kind of projects fit in KDE and what are the benifits of it.
Linked it through a call-to-action button to the relevant resources to incubate project into KDE.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="week-10-read-page-suggest-page-improvement"&gt;Week 10: read page/ suggest page improvement&lt;/h3&gt;
&lt;p&gt;Designed the read page with 3 main blog sites&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;planet&lt;/li&gt;
&lt;li&gt;contributor blogs&lt;/li&gt;
&lt;li&gt;mentorship blogs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This week was something new, the cards for the read page were simple but the new design of dropdown in suggest page took some time figuring out.
added konqi images to the cards because duh it's konqi (but hey we can change them eventually).&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="week-11-divulge-page"&gt;Week 11: Divulge Page&lt;/h3&gt;
&lt;p&gt;Created the Divulge page which is more for people who want to create content for kde whether it be promo material, tutorials or whether help in promotion itself.&lt;/p&gt;
&lt;p&gt;It's kind of a copy of the read page but it can always be changed.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="week-12-events-page"&gt;Week 12: Events Page&lt;/h3&gt;
&lt;p&gt;Created the Events page, which included akademy as the main event and then a section for event's KDE hosts which had some sprints and conf.in
and then added the section for the events KDE participates in which will likely be expanded eventually.&lt;/p&gt;
&lt;p&gt;Fixed some tiny typos and dead link issues.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="related-merge-requests"&gt;Related Merge Requests&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://invent.kde.org/paulb/join-kde-org/-/merge_requests/12"&gt;https://invent.kde.org/paulb/join-kde-org/-/merge_requests/12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://invent.kde.org/paulb/join-kde-org/-/merge_requests/13"&gt;https://invent.kde.org/paulb/join-kde-org/-/merge_requests/13&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://invent.kde.org/paulb/join-kde-org/-/merge_requests/14"&gt;https://invent.kde.org/paulb/join-kde-org/-/merge_requests/14&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://invent.kde.org/paulb/join-kde-org/-/merge_requests/15"&gt;https://invent.kde.org/paulb/join-kde-org/-/merge_requests/15&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://invent.kde.org/paulb/join-kde-org/-/merge_requests/16"&gt;https://invent.kde.org/paulb/join-kde-org/-/merge_requests/16&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://invent.kde.org/paulb/join-kde-org/-/merge_requests/17"&gt;https://invent.kde.org/paulb/join-kde-org/-/merge_requests/17&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://invent.kde.org/paulb/join-kde-org/-/merge_requests/18"&gt;https://invent.kde.org/paulb/join-kde-org/-/merge_requests/18&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="my-own-development"&gt;My Own Development&lt;/h2&gt;
&lt;p&gt;I learned a lot from this project, both in coding and beyond. Here are the things I remember right now, though the list could go longer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Now I am very comfortable with &lt;strong&gt;Hugo&lt;/strong&gt;, semantic maps, and YAML files&lt;/li&gt;
&lt;li&gt;Finally learned how to deal with &lt;strong&gt;SVGs&lt;/strong&gt; (was my first time working with them)&lt;/li&gt;
&lt;li&gt;My &lt;strong&gt;frontend skills improved&lt;/strong&gt;, I think I can design better pages now&lt;/li&gt;
&lt;li&gt;I now want to create more stuff that helps people!&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Overall, GSoC 2026 has been a great experience for me. Over these 12 weeks I got the chance to work on issues that i faced myself and fix them in a way that helps everyone joining KDE.&lt;/p&gt;
&lt;p&gt;Along the way I learned some technical skills, learned how to work across different timezones, to communicate better, and most importantly realized that long discussions are often more necessary than jumping straight into implementation, especially in open source communities.&lt;/p&gt;
&lt;p&gt;Big thanks to my mentors Anish and umm Conulting mentor Paul&lt;/p&gt;
&lt;p&gt;This wraps up my GSoC journey, but I will be sticking around KDE and plan to explore other projects, especially in the mentorship side of things. See you around in the community.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="how-to-reach-me"&gt;How to Reach Me&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;KDE GitLab: &lt;a href="https://invent.kde.org/anshs-lab"&gt;@anshs-lab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Matrix: &lt;a href="https://matrix.to/#/@anshs-lab:matrix.org"&gt;@anshs-lab:matrix.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="mailto:anshsinghal1907@gmail.com"&gt;anshsinghal1907@gmail.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>GSoC Alumni Camp Delhi 2026</title><link>https://blogs.kde.org/2026/07/29/gsoc-alumni-camp-delhi-2026/</link><pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate><author>Ansh Singhal</author><guid>https://blogs.kde.org/2026/07/29/gsoc-alumni-camp-delhi-2026/</guid><description>&lt;h1 id="gsoc-alumni-camp-delhi-2026--my-experience"&gt;GSoC Alumni Camp Delhi 2026 – My Experience&lt;/h1&gt;
&lt;p&gt;I attended the GSoC Alumni Camp in Delhi, it was an amazing opportunity to make people who are already familiar with open source aware of KDE Community
and I was actually able to do that. The event itself was from 8:00 A.M. to 10:30 P.M. at night.
The event started off with a formal opening session.
Soon after was the scavenger hunt (we were hunting people!)
it was a 5x5 grid where you needed to get signatures of people who fit the question in the box.
A few of them were :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I was born in July (I signed a lot of them )&lt;/li&gt;
&lt;li&gt;I have held a koala&lt;/li&gt;
&lt;li&gt;I know 3+ languages&lt;/li&gt;
&lt;li&gt;I can juggle&lt;/li&gt;
&lt;li&gt;I prefer go/Rust
and so on.
In all honesty it was an amazing ice breaker and something to get to know people.
After that there were a few unconferences followed by lunch and then more unconferences till 6:00 P.M. after that lightning talk sessions started and fortunately I got to represent KDE.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="unconference-session--from-gsoc-student-to-maintainermentor"&gt;Unconference Session – From GSoC Student to Maintainer/Mentor&lt;/h2&gt;
&lt;p&gt;I also hosted one of the first unconference sessions titled:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;From GSoC Student to Maintainer/Mentor&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I wasn't expecting a large audience, but at one point the room was at its capacity &lt;strong&gt;around 40 attendees&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The audience included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GSoC Organization Administrators&lt;/li&gt;
&lt;li&gt;Mentors&lt;/li&gt;
&lt;li&gt;Open source employees&lt;/li&gt;
&lt;li&gt;Existing contributors&lt;/li&gt;
&lt;li&gt;Google code-in students&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The discussion focused on contributor retention after GSoC and how organizations can better support contributors beyond the program.
It led to some interesting discussions where we found out what some organisations are doing.&lt;/p&gt;
&lt;h2 id="discussion-points-noted-by-an-org-admin"&gt;Discussion Points (Noted by an org admin)&lt;/h2&gt;
&lt;h3 id="leverage-contributors-as-subject-matter-experts"&gt;Leverage Contributors as Subject Matter Experts&lt;/h3&gt;
&lt;p&gt;GSoC contributors naturally become subject matter experts for the components they build. When new issues, bug reports, or pull requests relate to their work, proactively invite them to participate in the discussion or review. This helps contributors feel that their expertise is valued and keeps them engaged with the project beyond GSoC.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="improve-communication-around-pull-request-reviews"&gt;Improve Communication Around Pull Request Reviews&lt;/h3&gt;
&lt;p&gt;Complex pull requests often require focused reviews and may take longer than isolated bug fixes. While taking the necessary time for a thorough review is important, mentors should acknowledge review requests and, where possible, communicate an expected timeline. Even a brief acknowledgment improves the contributor experience.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="using-organization-stipends-for-contributor-retention"&gt;Using Organization Stipends for Contributor Retention&lt;/h3&gt;
&lt;p&gt;Explore using the GSoC organization stipend to support promising contributors after the program ends. This could fund continued maintenance or feature development through a transparent platform such as Open Collective, allowing contributors to invoice for their work and remain actively involved with the project.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="recognizing-mentor-contributions"&gt;Recognizing Mentor Contributions&lt;/h3&gt;
&lt;p&gt;Mentoring requires a significant investment of time in reviewing code, guiding contributors, and providing technical support. Consider allocating a portion of the organization stipend to compensate mentors, recognizing their efforts and encouraging long-term participation.&lt;/p&gt;
&lt;h2 id="kdes-community-support"&gt;KDE's Community Support&lt;/h2&gt;
&lt;p&gt;Another topic that generated considerable interest was KDE's support for its contributors.&lt;/p&gt;
&lt;p&gt;I talked about how KDE sponsors some students to attend Akademy, and how I was also sponsored to attend the event, which a lot of people agreed organizations should've done (some did, a lot didn't) but a lot of people agreed that when an organization consider these things contributors stay.&lt;/p&gt;
&lt;p&gt;After all the unconferences ended a lot of people came up to me saying mine was the best and I managed and engaged everyone in the best way possible ( I was on cloud 9).&lt;/p&gt;
&lt;h2 id="lightning-talk"&gt;Lightning Talk&lt;/h2&gt;
&lt;p&gt;One of the highlights was being selected to give a lightning talk. Only &lt;strong&gt;18 participants&lt;/strong&gt; were chosen, and I was one of them.&lt;/p&gt;
&lt;p&gt;My GSoC project &lt;strong&gt;Join KDE&lt;/strong&gt; is an advertisement for KDE itself, so the project itself became an easy conversation starter. It was a great opportunity to introduce KDE and make more people aware of the organization.&lt;/p&gt;
&lt;p&gt;Although I did fumble the last part of my presentation it was more of me being confused where my slide went (some slides were misplaced) aside from that it went as any other informative talk but hey I was funny on the stage (refer to the pics) so people remember me! You win some you lose some, oh well.&lt;/p&gt;
&lt;h2 id="conversations-throughout-the-event"&gt;Conversations Throughout the Event&lt;/h2&gt;
&lt;p&gt;Outside the sessions, I had some interesting discussions with contributors from different organizations. Some contributors showed interest in working wwith us while some showed interest in our eduction/science side but honestly it's hard to bring contributors over as they're in different domains, org admins/mentors or they're busy with their careers.&lt;/p&gt;
&lt;h3 id="su2-foundation"&gt;SU2 Foundation&lt;/h3&gt;
&lt;p&gt;I had a conversation with a maintainer from the &lt;strong&gt;SU2 Foundation&lt;/strong&gt;, whose work focuses on computational fluid dynamics.&lt;/p&gt;
&lt;p&gt;We discussed KDE's scientific and educational initiatives, including KDE for Scientists and several education-related projects. I also shared the &lt;strong&gt;KDE For You&lt;/strong&gt; website as an introduction to the wider KDE ecosystem.&lt;/p&gt;
&lt;h2 id="after-party"&gt;After Party&lt;/h2&gt;
&lt;p&gt;The conversations continued during the after-party on the following day.&lt;/p&gt;
&lt;p&gt;I met a group of students who had become interested in open source after interacting with contributors throughout the event. They had originally attended as friends of another contributor.&lt;/p&gt;
&lt;p&gt;One of them is now actively looking for a project to begin contributing to within KDE. YAYYY!&lt;/p&gt;
&lt;h3 id="new-contributors"&gt;New Contributors&lt;/h3&gt;
&lt;p&gt;Several first-time contributors approached me asking about projects suitable for beginners.&lt;/p&gt;
&lt;p&gt;I introduced them to a number of KDE projects and explained possible contribution paths.&lt;/p&gt;
&lt;p&gt;But the same issue they're busy with the beginning of their careers.&lt;/p&gt;
&lt;h2 id="overall-thoughts"&gt;Overall Thoughts&lt;/h2&gt;
&lt;p&gt;The Alumni Camp was one of the best ways to make people aware of KDE and I tried my best while i had fun ( we played uno there! Will bill the cards to the organization jkjk), a lot of people seemed intrigued and asked me to share some stuff about KDE to them or they'll try it on their own. Met someone from GNOME (they didn't get any lightning talk HA! I know, I know no inter project fighting that's bad) had some good conversations, teased the person from GNOME, had breakfast with them, and tried to make the most of the unconference session and the lightning talks to at least get people to know the name KDE!&lt;/p&gt;
&lt;h2 id="event-gallery"&gt;Event Gallery&lt;/h2&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="Solo Photo" src="https://blogs.kde.org/2026/07/29/gsoc-alumni-camp-delhi-2026/first.jpeg"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="cakes" src="https://blogs.kde.org/2026/07/29/gsoc-alumni-camp-delhi-2026/second.jpeg"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="Gifts" src="https://blogs.kde.org/2026/07/29/gsoc-alumni-camp-delhi-2026/third.jpeg"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="Group photo" src="https://blogs.kde.org/2026/07/29/gsoc-alumni-camp-delhi-2026/fourth.jpeg"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="after party" src="https://blogs.kde.org/2026/07/29/gsoc-alumni-camp-delhi-2026/fifth.jpeg"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="Lightning talks" src="https://blogs.kde.org/2026/07/29/gsoc-alumni-camp-delhi-2026/sixth.jpeg"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="card" src="https://blogs.kde.org/2026/07/29/gsoc-alumni-camp-delhi-2026/seventh.jpeg"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;</description></item><item><title>Redesigning Lokalize's Translation Memory Tab - Mid-GSoC</title><link>https://blogs.kde.org/2026/07/13/mid-gsoc-blog/</link><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><author>Navya Sai Sadu</author><guid>https://blogs.kde.org/2026/07/13/mid-gsoc-blog/</guid><description>&lt;p&gt;The past three weeks were a mix of cleanup, debugging, completing the work concerning UI and understanding &lt;em&gt;TMView&lt;/em&gt;( since I did not look into it during proposal period) and &lt;em&gt;TMTab&lt;/em&gt; again to review my design choices and see if I'm going in the right direction.&lt;/p&gt;
&lt;h2 id="cleaning-up-tmmanager-and-getting-checkboxes-working"&gt;Cleaning up TMManager and getting checkboxes working&lt;/h2&gt;
&lt;p&gt;First up was cleaning &lt;code&gt;TMManagerWin&lt;/code&gt;, reformatting, removing now obsolete references and code. With that done, I resumed work on the per-project TM selection checkboxes.&lt;/p&gt;
&lt;p&gt;The checkboxes are backed directly by DBFilesModel rather than a separate proxy layer. Overriding &lt;code&gt;flags()&lt;/code&gt;, &lt;code&gt;data()&lt;/code&gt;, and &lt;code&gt;setData()&lt;/code&gt; on the existing model was the way to go. Qt's view renders the checkboxes automatically once &lt;code&gt;Qt::ItemIsUserCheckable&lt;/code&gt; is set and &lt;code&gt;Qt::CheckStateRole&lt;/code&gt; returns a value. Check state persists to &lt;code&gt;ProjectLocal::selectedTMs()&lt;/code&gt; immediately on every toggle via &lt;code&gt;saveCheckedState()&lt;/code&gt;, and reloads on project open via a &lt;code&gt;Project::loaded&lt;/code&gt; connection.&lt;/p&gt;
&lt;p&gt;One non-obvious issue I stumbled into and fixed myself was &lt;code&gt;cleanupSelectedTMs()&lt;/code&gt;, which removes stale entries for TMs that no longer exist on disk, was being called immediately when &lt;code&gt;Project::loaded&lt;/code&gt; fired. But &lt;em&gt;DBFilesModel&lt;/em&gt; populates asynchronously via &lt;em&gt;QFileSystemModel&lt;/em&gt; scanning the TM directory. The fix was deferring &lt;code&gt;cleanupSelectedTMs()&lt;/code&gt; using &lt;code&gt;QTimer::singleShot()&lt;/code&gt;, the same pattern used elsewhere in the codebase for async model population. &lt;code&gt;loadCheckedState()&lt;/code&gt; itself runs immediately since it only reads from config and doesn't need the model to be populated. This was a subtle timing issue that only surfaced when testing with an actual project and multiple TM databases. In fact, &lt;code&gt;cleanupSelectedTMs()&lt;/code&gt; itself wasn't thought of when planning.&lt;/p&gt;
&lt;p&gt;After testing this end-to-end and verifying the &lt;em&gt;.local&lt;/em&gt; config file was being written and read correctly, I merged this in.&lt;/p&gt;
&lt;h2 id="studying-tmviews-querying-and-why-it-cant-help-tmtab"&gt;Studying TMView's querying and why it can't help TMTab&lt;/h2&gt;
&lt;p&gt;Before touching TMTab's query logic, I spent time understanding how TMView (the suggestions dock widget in the editor) does its querying since my mentor suggested that it's querying might help designing something similar for TMTab's multi-TM quering.&lt;/p&gt;
&lt;p&gt;TMView uses &lt;em&gt;SelectJob&lt;/em&gt; which operates on &lt;em&gt;TMEntry&lt;/em&gt; structs, it does fuzzy word-level matching, scores results, and is designed specifically for the suggestions workflow. It fires secondary DB queries only when the primary project DB scores below a threshold.&lt;/p&gt;
&lt;p&gt;This is fundamentally different from what TMTab needs, it uses &lt;em&gt;ExecQueryJob&lt;/em&gt; which runs SQL query against a DB and hands the cursor to &lt;em&gt;QSqlQueryModel&lt;/em&gt;. The two systems aren't interchangeable, so the multi-DB approach for each has to be designed separately I guess. For TMView, the change is relatively small, loop &lt;code&gt;selectedTMs()&lt;/code&gt; and fire one SelectJob per DB. For TMTab, it might turn to be little complex.&lt;/p&gt;
&lt;h2 id="removing-the-dbname-combobox"&gt;Removing the dbName combobox&lt;/h2&gt;
&lt;p&gt;With the TM list in TMManagerWin now showing checkboxes for selection, the &lt;code&gt;dbName&lt;/code&gt; KComboBox in the search panel is redundant, users select which TMs to query via checkboxes, not a dropdown. I removed it from queryoptions.ui and cleaned up all references in tmtab.cpp, but some of them need workaround. The &lt;code&gt;openFile()&lt;/code&gt; (RemoveFileJob) gets a TODO, to be fixed properly once multi-DB results carry their source DB name.&lt;/p&gt;
&lt;h2 id="debugging-with-gdb-and-dr-konqi"&gt;Debugging with GDB and Dr Konqi&lt;/h2&gt;
&lt;p&gt;My mentor reported a crash when opening the QA dock widget in the TM tab. This was a good opportunity to learn proper debugging with GDB, Dr Konqi, and reading backtraces.&lt;/p&gt;
&lt;p&gt;After investigating, this appeared to be a preexisting bug unrelated to my changes. It's probably data-dependent and only triggers with specific content in the TM results view at the moment the QA dock repaints. It didn't reproduce on my machine. I might work on it later when I have time.&lt;/p&gt;
&lt;p&gt;The years old chats on QtForum and StackOverflow were helpful throughout. Qt itself is so well documented!&lt;/p&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="TM Tab Redesigned" src="https://blogs.kde.org/2026/07/13/mid-gsoc-blog/TMTabRedesign.png"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;p&gt;I'm looking forward to see how translators would like the TMTab's glow up when the project is completed and all the changes get merged.&lt;/p&gt;</description></item><item><title>Redesigning Lokalize's Translation Memory Tab - GSoC Week 2 and 3</title><link>https://blogs.kde.org/2026/06/20/week2-3-gsoc-blog/</link><pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate><author>Navya Sai Sadu</author><guid>https://blogs.kde.org/2026/06/20/week2-3-gsoc-blog/</guid><description>&lt;p&gt;The past two weeks went by fast. The learnings I gained while building the toy project I experimented around with Qt during Contribution Period are quite useful now. In the second week of GSoC, I ported the TM Manager from a separate dialogbox to TM Tab. It was done mainly for ease and with the reasoning that everything related to TMs can be in a single place. I kept most of the things as is. A lot of thought went into the UI Design.&lt;/p&gt;
&lt;p&gt;The TM Manager is currently a standalone window which is accesible from any tab.&lt;/p&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="TM Manager Before" src="https://blogs.kde.org/2026/06/20/week2-3-gsoc-blog/tm_manager_before.png"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;p&gt;The &amp;quot;Manage Translation Memories&amp;quot; option is already available in the Tools Menu and again in the ToolBar of TM Tab since it's specific to it.&lt;/p&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="Menu Options" src="https://blogs.kde.org/2026/06/20/week2-3-gsoc-blog/menu_options_before.png"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;p&gt;After the changes, pressing F7 or &amp;quot;Translation Memory&amp;quot; option from Tools menu will directly lead to TM Manager too as it is set on the left of TM Tab with a QSplitter. I believe this takes away a little redundancy in the design. This change is also justified pertaing to the future changes regarding Multi-TM selection and quering.&lt;/p&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="TM Manager After" src="https://blogs.kde.org/2026/06/20/week2-3-gsoc-blog/tm_tab_after.png"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;p&gt;The buttons restrict resizing the splitter horizontally. Intially I put all the actions in a QToolButton as I thought putting them in a right-click context menu might render them undiscovered. But such menus were already being used in some other parts of the app( and obviously other KDE apps).&lt;/p&gt;
&lt;p&gt;From coding perspective, all I had to do was instantiate it in TM Tab instead. Since, it was no longer being used as a window( which would also have worked), it no longer inherits from KMainWindow. It used Grid Layout which I think is not exactly needed and just used a VBoxLayout for simplicity.&lt;/p&gt;
&lt;p&gt;The splitter state is saved and restored using existing methods.&lt;/p&gt;
&lt;p&gt;The obsolete references and methods for TM Manager are cleaned up.&lt;/p&gt;
&lt;p&gt;During Week 3, I added checkboxes to DBFilesModel for TM selection which will be used in querying later in TM View for suggestions, autofill etc. and TM Tab for search. In th beginning of the project, I proposed adding another proxy layer over DBFilesModel for the checkboxes to not to disturb other things. But for ease of work, consistent architecture( couldn't find multiple proxy layers being used in the codebase) and with the solace that it won't impact other methods using DBFilesModel for their specific purpose, I went ahead to add checkboxes directly to it.&lt;/p&gt;
&lt;figure&gt;
 &lt;img class="img-fluid" alt="Multi-TM Selection" src="https://blogs.kde.org/2026/06/20/week2-3-gsoc-blog/checkboxes.png"
 style="max-width: 100%; height: auto"
 /&gt;
&lt;/figure&gt;
&lt;p&gt;This is a deviation from my GSoc Proposal wherein I proposed to replace Combo Box with a List Widget having entries with checkboxes for Multi-TM selection. Since there would be TM dbs on the left of the tab anyways, I thought of enabling selection there itself, than to have two places(TM Manager and the List Widget) listing all the TMs.&lt;/p&gt;
&lt;p&gt;Setting new flag for checking, showing checked state with &lt;code&gt;data()&lt;/code&gt; and storing selected TM names to a set is done. The checked state persistence is to be worked upon. This is where I got stuck. TM names were to be saved and loaded from global and local config based on user's selection but when my mentor reviewed that this complex setup probably is not the best, we reached back to translators who originally requested the feature.&lt;/p&gt;</description></item><item><title>Redesigning Lokalize's Translation Memory Tab - GSoC Week 1</title><link>https://blogs.kde.org/2026/05/31/week1-gsoc-blog/</link><pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate><author>Navya Sai Sadu</author><guid>https://blogs.kde.org/2026/05/31/week1-gsoc-blog/</guid><description>&lt;p&gt;Hi! I'm Navya and am working on &lt;em&gt;Redesigning Lokalize's Translation Memory Tab&lt;/em&gt;. Lokalize was created during Google Summer of Code several years ago. This also implies that the conventions to be followed are quite old.&lt;/p&gt;
&lt;p&gt;The first week of GSoC was full of learnings and experiments as I had expected. There was no hassle of setting things up and all because I worked on Lokalize during Season of KDE. Things are going as per the plan and I am starting to gain momentum. The weeks ahead require more effort and time. I'm gonna share some of the knowledge gained and used as it might benefit me (to remember or come back to when needed) and other new contributors.&lt;/p&gt;
&lt;p&gt;The project essentially resolves the &lt;a href="https://bugs.kde.org/show_bug.cgi?id=497653"&gt;bug&lt;/a&gt; and integrates the separate TM Manager Window into the TM Tab for ease.&lt;/p&gt;
&lt;h2 id="kconfig"&gt;KConfig&lt;/h2&gt;
&lt;p&gt;KDE provides devs with KConfig classes to auto generate methods to use for app's configuration settings. This &lt;a href="https://develop.kde.org/docs/features/configuration/kconfig_xt/"&gt;site&lt;/a&gt; might also be of some help. Lokalize has &lt;em&gt;lokalize.kcfg&lt;/em&gt; for app-wide configuration and &lt;em&gt;projectbase.kcfg&lt;/em&gt; and &lt;em&gt;projectlocal.kcfg&lt;/em&gt; for project-specific configuration. The latter one appeared to me more apt for user's personal settings such as per-project selection of TMs. A new entry was added to &lt;em&gt;lokalize.kcfg&lt;/em&gt; for global default TMs.&lt;/p&gt;
&lt;p&gt;There are also &amp;quot;.kcfgc&amp;quot; files which apparently act as config for the config files. So, the property of the entry added can be controlled there. In my case, it was to have mutators so as to be able to change the selection of TMs.&lt;/p&gt;
&lt;p&gt;The setters and getters generated were used to write a method that returns a list of TMs to query across. These will also be used in the upcoming weeks when I finally create a UI for checking and selecting TMs.&lt;/p&gt;
&lt;h2 id="git"&gt;Git&lt;/h2&gt;
&lt;p&gt;I always get to know something new and cool in the git world while working. My mentor told that &lt;em&gt;master&lt;/em&gt; is like any other branch, it's just us that we treat it differently. I created a new branch to direct my &lt;a href="https://invent.kde.org/navyasai/lokalize/-/merge_requests/1"&gt;MRs&lt;/a&gt; there since it'll be a long time till everything is ready to be merged into upstream.&lt;/p&gt;
&lt;h2 id="testing"&gt;Testing&lt;/h2&gt;
&lt;p&gt;The example provided &lt;a href="https://doc.qt.io/qt-6/qtest-overview.html"&gt;here&lt;/a&gt; is a basic template which the rest of the tests present also follow. An article on the internet said that there's no point in writing tests for getters and setters (another discussion forum had - especially if those are auto generated) so I just took it as a chance to learn something new and get the hang of those methods.&lt;/p&gt;
&lt;p&gt;I wasted quite some time only to figure out that I need to run the test from the build dir instead.&lt;/p&gt;</description></item><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>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></channel></rss>