Skip to content

Saturday, 8 April 2023

It’s been a month since my first post about my work as KDE Software Platform Engineer, so let’s have a look at what I have been doing since then.

The scope of what falls under “Software Platform” work is arguably quite wide. I like to describe it as “Taking care of everything needed so that people can build and enjoy awesome software”. Of course that often means hacking on source code, but that is by no means the only thing I do. A significant part of what I do is talking to other people, discussing ideas, reviewing code, making architecture decisions, documenting things, triaging bugreports, and just generally being useful to others. A lot of this work is strategic in nature and the benefits will only show in the long term, but some short-term improvements happend this month also.

My main area of focus was working on polishing the Plasma 6 and Frameworks 6 stability. This means staying on top of things that happen throughout the stack as well as squashing remaining issues. As a result several more projects now have CI builds against the latest development branches of frameworks. Furthermore, I fixed several places where coexistence of Qt5/KF5-based and Qt6/KF6-based software was causing issues.

Qt is an vital part of our software stack, so an important part of being KDE Software Platform Engineer is being involved in its development. Last month I submitted a patch to Qt, fixing a build issues affecting our code. Besides that I have also reported some bugs that were affecting KDE and participated in code review. Another important piece of our stack is our Qt5 Patch Collection that collects bugfix patches for Qt5. I contributed two such patches by backporting them from upstream.

In terms of documentation I have published two blog posts recently. The first explains how to build the development version of Plasma using kdesrc-build. While doing that I have also fixed some related issues in kdesrc-build to make sure building things is as smooth as possible. The second one is explaining some technical details about how theming and platform integration works in Qt/KDE apps. I hope this helps with some of the discussions around this topic that are coming up once in a while.

Besides these “Bigger Picture” topics I have also worked on some concrete enhancements for KDE software. With a series of changes various system windows no longer display an internal and technical application name like “Portal” or “KDE Daemon” in their window title. I have also restored the ability to configure the time interval for determining whether two mouse clicks should be interpreted as a double click. This was present in the legacy mouse settings, but got lost in the transition to libinput. Another thing that got improved was the VPN support in our network settings. When importing a VPN configuration fails Plasma now shows the relevant error message, giving you at least some indication about what’s wrong. Futhermore I fixed a crash when importing VPN configurations when the relevant NetworkManager plugin is missing.

Another area I was working on is our powermanagement settings. Currently they are quite complex, both in terms of UX and implementation. We are working on improving this, which involves quite a bit of technical ground work.

A month from now the Plasma team will meet in Augsburg, Germany for the first in-person Plasma Sprint since 2019. I have been planning and organizing this event. This will be an important opportunity to plan for an awesome Plasma future. However, such meetings are not cheap, so please consider donating to KDE e.V. to support it.

 

Commit: https://invent.kde.org/qt/qt/qt5/-/commit/4c0d35b0991216766ca301de205599d1daa72057


Commercial release announcement: https://www.qt.io/blog/commercial-lts-qt-5.15.9-released


OpenSource release announcement: https://lists.qt-project.org/pipermail/announce/2023-April/000406.html

 

As usual I want to personally extend my gratitude to the Commercial users of Qt for beta testing Qt 5.15.9 for the rest of us.

 

The Commercial Qt 5.15.9 release introduced one bug that have later been fixed. Thanks to that, our Patchset Collection has been able to incorporate the fix for the issue [1] and the Free Software users will never be affected by it! 

 

P.S: Special shout-out to Andreas Sturmlechner for identifying the fix of the issue, since I usually only pay attention to "Revert XYZ" commits and this one is not a revert but subsequent improvement

Friday, 7 April 2023

Let’s go for my web review for the week 2023-14.


If we lose the Internet Archive, we’re screwed – The Statesman

Tags: tech, copyright, law, history

This lawsuit and the first ruling are indeed very concerning. Let’s hope we keep the Internet Archive alive, their work is invaluable.

https://www.sbstatesman.com/2023/04/04/if-we-lose-the-internet-archive-were-screwed/


Chrome ships WebGPU - Chrome Developers

Tags: tech, gpu, 3d, browser, web

This is a big milestone for 3D and computation on GPUs from the browser. I suspect it will have interesting security implications though, we’ll see.

https://developer.chrome.com/blog/webgpu-release/


Safari releases are development hell - Ashley’s blog

Tags: tech, apple, web, criticism

This ecosystem suffers from the same warts and doesn’t seem to make any progress… lack of transparency, “we know better” mentality, tight coupling, lack of communication. This is especially problematic for something like a browser.

https://www.construct.net/en/blogs/ashleys-blog-2/safari-releases-development-1616


Saying Goodbye to GitHub | Ersei ‘n Stuff

Tags: tech, github, ethics, gpt

Good reasons to leave indeed. Better host your projects somewhere else.

https://ersei.net/en/blog/bye-bye-github


Own Your Work | Jose M.

Tags: tech, self-hosting

Indeed, it’s important. You should own your content, you can eventually syndicate on trendy platforms but keep your own base for your own content.

https://josem.co/own-your-work/


Catch-23: The New C Standard Sets the World on Fire - ACM Queue

Tags: tech, c, c++, standard, criticism

This is a very concerning for C… and it drifts apart from C++ further. The old “C as a subset of C++” position is less and less valid. Very unfortunate.

https://queue.acm.org/detail.cfm?id=3588242


C++17 creates a practical use of the backward array index operator - The Old New Thing

Tags: tech, c++, programming, funny

Well, this is a bit obscure but we have to know it’s there somehow. Better not rely on it too much though.

https://devblogs.microsoft.com/oldnewthing/20230403-00/?p=108005


mockneat home - mockneat

Tags: tech, java, tests

Looks like a nice Faker alternative for Java projects. Turns out I was looking for something like that.

https://www.mockneat.com/


Writing a Fast C# Code-Search Tool in Rust — John Austin

Tags: tech, parsing, static-analyzer, rust

Really nice little tool, this is indeed surprising how little code is needed for something like this. Treesitter is definitely a huge help there.

https://johnaustin.io/articles/2022/blazing-fast-structural-search-for-c-sharp-in-rust


Slint 1.0: The Next-Generation Native GUI Toolkit Matures — Slint Blog

Tags: tech, rust, gui

Very nice milestone and interesting tech for sure. Congrats to them!

https://slint-ui.com/blog/announcing-slint-1.0.html


GraphQL: From Excitement to Deception | by Raphael Moutard | Mar, 2023 | Better Programming

Tags: tech, graphql, api, web

Nice balanced post on the pros and cons of GraphQL.

https://betterprogramming.pub/graphql-from-excitement-to-deception-f81f7c95b7cf


Is your Postgres ready for production?

Tags: tech, production, databases, postgresql

A sound list of advises, applicable to most database systems of course.

https://www.crunchydata.com/blog/is-your-postgres-ready-for-production


Pipes-and-Filters - ModernesCpp.com

Tags: tech, design, architecture, pattern, c++

A nice pattern to know and master in my opinion. At least I turn to it on a regular basis.

https://www.modernescpp.com/index.php/pipes-and-filters


Polars for initial data analysis, Polars for production

Tags: tech, data-science, pandas, polars, performance

Polars really looks like a nice alternative to Pandas with a nice upgrade path from data exploration to production.

https://pythonspeed.com/articles/polars-exploratory-data-analysis-vs-production/


Datapane - Build data products in 100% Python

Tags: tech, python, data-visualization

Looks like an interesting new building block to publish data visualizations.

https://datapane.com/


An On-Ramp to Flow

Tags: tech, programming, productivity

I definitely used this trick from time to time. In the right context it definitely work. Leaving some easy mess on purpose is a good way to get back into a task the next day.

https://census.dev/blog/an-on-ramp-to-flow


Follow-ups to “Incompetent but Nice” - Jacob Kaplan-Moss

Tags: management

Lots of nice advices in the followups. The previous article clearly lead to a good conversation around it.

https://jacobian.org/2023/mar/31/incompetent-but-nice-follow-ups/



Bye for now!

Flatpaks are amazing and all that. But application sandboxing, so an application cannot do anything it wants, is a challenge - even more so when you have two applications that need to talk to each other. Perhaps it shouldn’t come as a surprise that native-messaging sandboxing support for Flatpak has been in development for over a year. To celebrate its anniversary I thought I’d write down how to drill a native-messaging sized hole into the sandbox. This enables the use of native messaging even without portal integration, albeit also without sane degrees of sandboxing.

First off, please understand that this undermines the sandbox on a fairly fundamental level. So, don’t do this if you don’t keep your Firefox updated or visit particularly dodgy websites.

For the purposes of this post I’m assuming Firefox and KeePassXC are installed as Flatpaks in user scope.

First order of business is setting up KeePassXC so it writes its definition file in a place where Firefox can read it. Fortunately it has a setting for this:

~/.var/app/org.mozilla.firefox/.mozilla/native-messaging-hosts/ is the path inside Firefox’ home where the defintion file will be written. Naturally we’ll also need to adjust the Flatpak permissions so KeePassXC can write to this path.

flatpak override --user --filesystem=~/.var/app/org.mozilla.firefox/.mozilla/native-messaging-hosts org.keepassxc.KeePassXC

At this point Firefox knows about the native messaging host but it won’t be able to run it. Alas. We need some rigging here. The problem is that Firefox can’t simply flatpak run the native messaging host, it needs to spawn a host process (i.e. a process outside its sandbox) to then run the KeePassXC Flatpak and that then runs the NMH.

Fortunately the NMH definition files are fairly straight forward:

{"allowed_extensions":["keepassxc-browser@keepassxc.org"],
"description":"KeePassXC integration with native messaging support",
"name":"org.keepassxc.keepassxc_browser",
"path":"/home/me/.local/share/flatpak/exports/bin/org.keepassxc.KeePassXC",
"type":"stdio"}

The problem of course is that we cannot directly use that Flatpak bin but need the extra spawn step in between. What we need is a way to manipulate the definition file such that we can switch in a different path. systemd to the rescue!

systemctl edit --user --full --force keepassxc-native-messaging-mangler.path

# SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
# SPDX-FileCopyrightText: 2023 Harald Sitter <sitter@kde.org>

[Path]
PathChanged=/home/me/.var/app/org.mozilla.firefox/.mozilla/native-messaging-hosts/org.keepassxc.keepassxc_browser.json

[Install]
WantedBy=default.target

and the associated service file…

systemctl edit --user --full --force keepassxc-native-messaging-mangler.service

# SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
# SPDX-FileCopyrightText: 2023 Harald Sitter <sitter@kde.org>

[Unit]
Description=keepassxc mangler

[Service]
ExecStart=/home/me/keepassxc-native-messaging-mangler

lastly, enable the path unit.

systemctl --user enable --now keepassxc-native-messaging-mangler.path

Alright, there’s some stuff to unpack here. KeePassXC on startup writes the aforementioned definition file into Firefox’ NMH path. What we do with the help of systemd is monitor the file for changes and whenever it changes we’ll trigger our service, the service runs a mangler to modify the file so we can run another command instead. It’s basically an inotify watch.

Here’s the mangler (~/keepassxc-native-messaging-mangler):

#!/usr/bin/env ruby
# frozen_string_literal: true

# SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
# SPDX-FileCopyrightText: 2023 Harald Sitter <sitter@kde.org>

require 'json'

file = "#{Dir.home}/.var/app/org.mozilla.firefox/.mozilla/native-messaging-hosts/org.keepassxc.keepassxc_browser.json"
blob = JSON.parse(File.read(file))
blob['path'] = "#{Dir.home}/Downloads/keepassxc"
File.write(file, JSON.generate(blob))

It simply replaces the path of the executable with a wrapper script. Here’s the wrapper script (~/Downloads/keepassxc):

#!/bin/sh

# SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
# SPDX-FileCopyrightText: 2023 Harald Sitter <sitter@kde.org>

exec /usr/bin/flatpak-spawn --host --watch-bus "$HOME/.local/share/flatpak/exports/bin/org.keepassxc.KeePassXC" "$@"

flatpak-spawn is a special command that allows us to spawn processes outside the sandbox. To gain access we’ll have to allow Firefox to talk with the org.freedesktop.Flatpak DBus session service.

flatpak override --user --talk-name=org.freedesktop.Flatpak org.mozilla.firefox

And that’s it!

➡️ KeePassXC writes its NMH definition to Flatpak specific path ➡️ systemd acts on changes and starts mangler ➡️ mangler changes the path inside the definition to our wrapper ➡️ Firefox reads the definition and calls our wrapper ➡️ wrapper flatpak-spawns KeePassXC flatpak ➡️ Firefox (flatpak) talks to KeePassXC (flatpak)

Thursday, 6 April 2023

Buttons are a fundamental element in user interfaces, but it’s easy to make some accessibility mistakes when using icon-only buttons in QML.

First, please avoid icon-only buttons and only use then, when the icon is very well known (e.g. arrows, delete or favorite icons) and the space is limited.

In case you still want to use an icon-only button. Make sure to set the text: property and that it is also translatable. Otherwise, a screen reader won’t know that to say about the button. This is because the text: property is used as default value for the Accessible.name: property, so when it is not set Accessible.name is empty and the screen reader can only say that the currently focused control is a button. The trick to have both the text: property set and an icon-only button is to use the display: property and assign it to the AbstractButton.IconOnly.

This gives us the following code:

import QtQuick 2.15
import QtQuick.Controls 2.15

Button {
 text: i18n("Favorite")
 icon.name: 'favorite'
 display: AbstractButton.IconOnly
}

Finally, another essential part is that an icon-only button requires a tooltip. We need the tooltip in case the user is unsure about the meaning of the icon and we need more details.

import QtQuick 2.15
import QtQuick.Controls 2.15

Button {
 text: i18n("Favorite")
 icon.name: 'favorite'
 display: AbstractButton.IconOnly

 ToolTip.text: text
 ToolTip.delay: Kirigami.Units.toolTipDelay
 ToolTip.visible: hovered
}

Note that this used the ToolTip attached property instead of a separate item ToolTip {} as it is more memory efficient. With the attached property, we share the tooltip instance across the entire application instead of instanciating a ToolTip popup for each button.

Sunday, 2 April 2023

The KDEPIM team like most got impacted by the pandemic and had to let go of lovely traditions. One of those being to meet in Toulouse at the beginning of spring. The last one was in 2019 so reviving that meeting was long overdue.

Since the last time, quite a few things changed in Toulouse of course… for instance the old venue wasn’t available anymore. Luckily, with a couple of friends we revived the local C++ Workshops a few months back in a new venue as well. Since it is a cool fablab very well situated in the town center we asked them if they’d be ready to host Free Software hackers for a whole week-end and they happily agreed to it.

Thanks to this nice conjunction of events, we organized the KDEPIM Sprint 2023 the first week-end of April

The Warm-up

Some of the team (namely Ingo and Volker) arrived early before the official start. Of course, we planned for that and had access to the venue from the Friday afternoon.

But before heading there, we had to visit the now mythical Cake Place™ for lunch. With a pair of happy hackers fully loaded with fat and sugar, the work could start.

Happy Ingo and Volker

We thus finished preparing and planning what would happen during the week-end once we would be joined by Laurent and Carl. We also managed to get started on some of the explorations around KCalendarCore which would end up being a recurring theme for some of us.

Day 1

After a quick breakfast at the venue, we started listing the topics we wanted to discuss during the sprint. Most of it was already captured on the wiki before we arrived but a couple more appeared at that point.

We basically identified two types of conversations:

  • those for which we needed bigger discussions with everyone to set the overall direction;
  • those for which we already had agreement on the direction but needed a finer grained look at them to actually have a proper battle plan, they didn’t require everyone and we did break out groups for those.

All of this was time boxed with proper debrief and capturing notes on the wiki to try to avoid loosing too much context. This pretty much filled up our day but we managed to have a few patches done during that time.

Processing discussions

As for the conversations they covered mostly the following topics:

  • decoupling KDAV from KIO
  • easing the use of KCalendarCore::Calendar for asynchronous code (since it exposes a synchronous API)
  • overall shrinking KCalendarCore::Calendar’s API, it’s fairly large and unfocused currently, we want to focus it on an easy to use core
  • deciding on a new custom properties API for KCalendarCore
  • retiring the mixed maildir and the kolab resources which is easier said than done, since we want to ensure minimal disruption for the users using those resources
  • improving the Windows compatibility, especially important for Kalendar at the moment
  • retiring the Kross based account wizard for a modern QML one
  • fixing important dependencies in akonadi-contacts to reduce reliance on widgets (necessary for Kalendar and mobile)
  • using QtKeychain in KMailTransport properly
  • removing the KMailTransportAkonadi API
  • eliminating Kalendar’s reliance on some of the KOrganizer settings
  • improving our APIs for QML consumption and factoring out some of Kalendar internals for reuse
  • and of course, planning and the overall timeline towards a “PIM 6” release

The KDEPIM team being currently fairly small, one of the constant concern which forced some of the choices we made was to keep it realistic. It’s no use to make grand plans we can’t execute on the large codebase we have to maintain with only a handful of people.

Now if more contributors are coming in (hint hint) we could of course be more ambitious at places in the future. We definitely have the ideas, so if you want to have fun and help, get in touch!

Day 2

We managed to conclude the last discussion we planned before Laurent had to head back home. This means we successfully covered all of the 15 topics we had to deal with while everyone was around. We tried to make sure they all led to actionable items.

All done... creating actions

That’s why to plan and drive the effort, we created a new project on Gitlab. This already got filled with the results of our discussions. Some of the issues being actively worked on as I’m typing this. Merge requests are already pouring in various PIM related repositories!

I’m looking forward to running my scripts on said repositories in a couple of weeks to see how noticeable the uptick of activity will be. ;-)

Last but not least

I’d like to thank Artilect and KDE e.V. to make this event possible. This wouldn’t be possible without a venue and without at least partial support in the travel expenses.

Also, I’d like to give a special thanks to Sébastien Dinot who has been my partner in crime pulling this off. He’s been a big help with some of the logistics and a very patient key master.

Finally, if you like such meetings to happen in the future so that we can push forward your favorite software, please consider making a tax-deductible donation to the KDE e.V. foundation or contacting Artilect for a donation as well (they unfortunately don’t have a donation page up yet but that’s coming).

Friday, 31 March 2023

Let’s go for my web review for the week 2023-13.


The Twitter API is now effectively unmaintained | snarfed.org

Tags: tech, fediverse, twitter

Twitter continues its slow death… That likely explains why the Mastodon to Twitter bridge I’m using has become so unreliable. I’ll just keep ignoring it I guess.

https://snarfed.org/the-twitter-api-is-now-effectively-unmaintained


Cerebras-GPT: A Family of Open, Compute-efficient, Large Language Models - Cerebras

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

Clearly aims to demonstrate the superiority of their specialized hardware for training. That said it’s nice to have proper open models available (architecture, training data, weights… it’s all in the open).

https://www.cerebras.net/blog/cerebras-gpt-a-family-of-open-compute-efficient-large-language-models/


What is the origin of model-view-controller? - Quora

Tags: tech, architecture, design, history

Nice historical perspective from Alan Kay about the MVC architecture pattern.

https://www.quora.com/What-is-the-origin-of-model-view-controller


Biscuit authorization

Tags: tech, cryptography, security

This looks like an interesting new authorization scheme.

https://www.biscuitsec.org/


Making Python 100x faster with less than 100 lines of Rust

Tags: tech, rust, python, profiling, performance

Nice walk through for a use of PyO3 to make some Python code much faster. Nice to see how useful py-spy turn out to be in such scenarii as well.

https://ohadravid.github.io/posts/2023-03-rusty-python/


Make your own Optionals

Tags: tech, programming, java, type-systems

There are nice mechanism in the Java type system nowadays to no rely on Optional all the time. This is a good reminder of the main alternative.

https://mccue.dev/pages/3-28-23-custom-optional


The Ambiguous Zone - Ben Northrop

Tags: tech, team, craftsmanship, organization

We might start in a software career attracted by the “perfection of the machines” (already debatable) but indeed to make anything meaningful we need to interact with other people. I often say it but I’ll say it again: it is a team sport.

https://www.bennorthrop.com/Essays/2023/the-ambiguous-zone.php


Why Engineers Need To Write - by Ryan Peterman

Tags: tech, craftsmanship, writing, remote-working

Indeed, this is the most important skill we need next to coding. Especially in a remote work culture.

https://www.developing.dev/p/why-engineers-need-to-write


The Definition of Senior: A Look at the expectations for Software Engineers

Tags: tech, career, management, leadership, engineering

Nice (even though a bit long) explanation of the skills needed for a senior software engineers. Definitely a bunch of good advises in there.

https://loige.co/the-senior-dev/


Incompetent but Nice - Jacob Kaplan-Moss

Tags: management

Note it’s not about impostor syndrome, I guess lots of us think we’re in this category, that doesn’t make it real.

Anyway, from the management point of view this is indeed a baffling situation when you encounter someone like this. What to do? Definitely not always easy, sometimes induced by the organization as well so it would be too easy to blame on the person alone. We need to pay more attention to those and there’s clearly no magical recipe to handle them.

https://jacobian.org/2023/mar/28/incompetent-but-nice/


The age of average — Alex Murrell

Tags: culture, architecture, design

This is indeed a phenomenon which I find odd. Everywhere you look, culture seems like it became homogeneous… I don’t like this much, but indeed it means it’s easy to be distinctive if you want to.

https://www.alexmurrell.co.uk/articles/the-age-of-average


Bicycle – Bartosz Ciechanowski

Tags: science, physics, bike

Once again an excellent deep dive… We’re getting into the physics of biking, and there are some surprises along the way! In any case this is fascinating all the thinking which went into such an object, the wheels alone are a very clever system.

https://ciechanow.ski/bicycle/


Treat your to-read pile like a river | Oliver Burkeman

Tags: culture, productivity

Good advice to fight against FOMO as far as reading material is concerned… just pluck things as they pass by. There’s so much content there’s likely redundancy anyway, hopefully. Yeah… I’m not cured.

https://www.oliverburkeman.com/river



Bye for now!

Wednesday, 29 March 2023

Another month in the year, another collection of bugfixes and features I contributed to KDE!

Documentation Improvements

Something I want to improve for KDE Frameworks 6 is the API documentation, it’s pretty bad sometimes:

How do I even import this component?

[Bugfix] For plasma-framework, we started marking private QML types as internal. I’m in the process of manually fixing up the custom QQuickItem types in plasma-framework too, although I haven’t gotten around to opening up a merge request for that.

[Feature] I opened a doxyqml1 merge request to make it’s output more useful, by automatically adding import statement hints to the page:

Example of the new doxyqml output

Plasma 6 Porting

[Feature] Early this month, I ended up porting most of our applets to Plasma 6! The current hitlist is:

Screenshot of the applets running on Plasma 6!

The two I’m still working on and need further testing and reviewing:

I also fixed activity switching, and fixed KRunner’s broken layout.

For those who are building Plasma 6 for the first time, extragear modules are now built by default!

PlasmaTube

[Feature] I started using PlasmaTube which is KDE’s Youtube Client, to replace FreeTube. I started by cleaning up and overhauling the account management, so it flows better.

The new login page

[Bugfix] I also made the info chips non-interactable, fixed the spacing on video grid text, added more loading placeholders and stop desktop users from being able to drag the video page.

Ruqola

[Feature] Because of $work, I discovered that we have a Rocket.chat client! I miss being able to quickly switch my presence via the tray icon, so that’s the first thing I opened a merge request for.

Screenshot of the presence context menu

Dr. Konqi

[Feature] Someone pointed out that the margins in the bug reporting wizard was terrible, so I started a redesign of the whole UI trying to update it to look similar to our modern applications:

WIP Bug Context Page WIP Backtrace Page

Tokodon

In preparation for the 23.04 gear release, I added a slew of new features and bugfixes!

Screenshot of the inline reply previewScreenshot of the newly added notification filter types

And of course, there are of course many bugfixes:

[Feature] As a treat for people who manage popular accounts - like our great KDE and Krita promo teams - I have a work-in-progress merge request to allow you to group notifications! I expect to find time next month to finish and polish this feature, but no promises yet.

Screenshot of the notification grouping (work in progress)

Miscellaneous


  1. Doxygen doesn’t support QML natively, so doxyqml is a plugin to help generate doxygen pages for QML types. ↩︎

Tuesday, 28 March 2023

gcompris 3.2

Today we are releasing GCompris version 3.2.

This new version contains some bug fixes on multiple activities such as "Discover the International Morse code", "Control the hose-pipe" and music activities.

It also contains new graphics for all memory activities and for "Baby puzzle".

A new command-line argument (--difficulty {value|min-max}) has been added which allows users to force the difficulty filter at a given value or range.

The Andika font has been updated to its latest version (6.200).

It is fully translated in the following languages:

  • Breton
  • Catalan
  • Catalan (Valencian)
  • Greek
  • UK English
  • Spanish
  • Basque
  • French
  • Croatian
  • Italian
  • Lithuanian
  • Malayalam
  • Dutch
  • Norwegian Nynorsk
  • Polish
  • Portuguese
  • Brazilian Portuguese
  • Romanian
  • Slovenian
  • Turkish
  • Ukrainian
  • Chinese Traditional

It is also partially translated in the following languages:

  • Azerbaijani (99%)
  • Belarusian (79%)
  • Czech (88%)
  • German (99%)
  • Estonian (99%)
  • Finnish (94%)
  • Hebrew (99%)
  • Hungarian (99%)
  • Indonesian (99%)
  • Macedonian (94%)
  • Russian (99%)
  • Slovak (77%)
  • Albanian (99%)
  • Swedish (98%)

Thank you all,
Timothée & Johnny

I’m happy to announce KTechLab release version 0.51.0. KTechLab is an IDE for microcontrollers and electronics. This new release contains the following changes:

  • updated and improved translations
  • the Serial Port component, for better compatibility, uses Qt’s QSerialPort, instead of operating-system specific library calls
  • experimental support for Windows; it requires MSVC 2019 compiler
  • various stability fixes
  • modernisation of the codebase, porting away from some deprecated APIs

The release tarball of version 0.51.0 can be downloaded from KDE servers. Its checksums are:

SHA256Sum: 046b9ce1f2c2a93e1da734a416674a5bb5da3203ac773d49ed693b8492f6d212
SHA1Sum: 7729b67050caee5b65fe4dd1dfbfce213cea44ac
MD5Sum: 2853c6867535995c1ead598e98fce6e3

KTechLab has a mailing list at KDE called ktechlab-devel: https://mail.kde.org/mailman/listinfo/ktechlab-devel

On IRC, developers are mostly reachable on freenode.net, on #ktechlab channel.

The source code of KTechLab is available in KDE Git, at https://invent.kde.org/sdk/ktechlab

Instructions for building and running KTechLab are available in the README file from the source code; online version of that file is available at https://invent.kde.org/sdk/ktechlab/-/blob/master/README ; The very short instructions are: run sh build-simple.sh and then sh run-simple.sh.

The notes from joining KDE: https://community.kde.org/Incubator/Projects/KTechLab

KTechLab bugs at KDE bugtracker: https://bugs.kde.org/buglist.cgi?quicksearch=ktechlab