A surprising long time passed since my last status update about KJournald. So it’s time again to shed some light on the recent changes.
KJournald is a KDE project that provides graphical browsing UI for journald log databases. For those who never heard the term “journald”, journald is the system logging service of systemd and it is found in most modern Linux systems. This means, in the journald databases one can find all the system log messages about important incidents happening on a system, which make it very important for system admins but also for all technical users who want to analyze when something is not working correctly on their systems.
The kjournald-browser provides a Qt and Kirigami based UI to efficiently browse and filter those logs (note: there exist different tools for that, even systemd provides its own command line tool “journalctl”). The focus of kjournald-browser are the following use cases:
ease filtering of log messages in order to efficiently reduce huge logs to sizes that a human can analyze
ease analysis of interactions of different processes / systemd units by colorizing and other graphical helps
provide a simple but powerfull UI/UX that focuses on log analysis
support access for local, collected and remote journald logs (and do this only for journald)
Since my last blog post, the kjournald-browser application became part of the regular KDE gear releases and nowadays is packages by e.g. Fedora and Suse; unfortunately, it is still not packaged on Debian or Ubuntu yet — if you want to do it and need support please reach out to me! At the moment, also the packaging as Flatpak application on Flathub is ongoing. But already since a long time though, the KDE Flatpak nightly builds provide the latest state of the app.
With the last major release 25.12.0, a few new cool features were added:
systemd differentiates between system service and user service and log messages are split. With the last release User Journals can be accessed in addition to System Journals.
The search bar was reworked (more compact UI, additional case-insensitive search)) and now a history of recent search subjects is stored for faster access.
KJournald-browser can not only used to load the log files from the local system but also to access arbitrary journald databases (e.g. collected from embedded devices for post-mortem analysis or from servers). For this loading mechanism, an improved UI database loading errors feedback is now available the validates access to loaded files.
One feature was slightly too late for this release, but is already ready for the next:
systemd provides the feature to use service templates, which means that every service instance has its own ID. Especially for user services that is a much used feature and this clutters the UI much. A new service grouping feature allows to group service logs by template name (this is also the default, but behavior can be selected in UI).
Since 2026 is still young, there are a few features on the roadmap of this year. The two most important ones in my opinion are:
adding access to the journald remote access protocol, which will be important to live-monitor servers or embedded devices that have a systemd-journal-remote service running
introduce pre-filtering of processes and units for the selected boot id, which will improve usability for very long journals
A short but sweet note to say I am coming out of my short retirement to help with snaps again. My time is extremely limited, however we are working hard on getting snaps on CI and I have some newer snaps in –beta trickling in for testing. You must install kf6-core24 from beta as well to test them ( this will likely break older kde snaps in the process so beware. ) This is slow going as I work on them during my hour lunch at day job and spare stolen moments. KDE is coming up on its 30th birthday!!! How cool is that!
Almost all of these posts end with “KDE has become important in the world…” and I think this is a good reminder that it’s true, not just some empty platitude. KDE is important. And all of you building or using KDE’s software are important, too.
But KDE is not only important to cars; we’re incredibly important to computers! And on that subject, some really nice features and user interface improvements landed for the upcoming Plasma 6.6 release. The hard feature freeze is coming up soon, at which point we’ll move into full bug-fixing and polishing mode.
But until then, enjoy some juicy new goodies! Check it out:
Notable New Features
Plasma 6.6.0
You can now save your current visual settings as a new global theme! (Vlad Zahorodnii, plasma-desktop MR #6097)
Added a “Forget device” action to the Bluetooth system tray widget, allowing users to remove paired devices without opening System Settings. (Andrew Gigena, KDE Bug #434691)
You can now search for processes in System Monitor based on their full command-line invocation when the “Command” column is visible. (Alexey Rochev, KDE Bug #448331)
On supported systems, the logout screen now mentions when the system will restart into a different operating system or boot option after it reboots. (Nikolay Kochulin, plasma-workspace MR #5469)
Notable UI Improvements
Plasma 6.6.0
The Power and Battery widget now tells you what specific power management actions apps are blocking, instead of assuming that they’re all blocking both sleep and screen locking. (Jakob Petsovits, KDE Bug #418433)
System Settings’ Thunderbolt page now hides itself when the device doesn’t support Thunderbolt. (Alexander Wilms, plasma-thunderbolt MR #47)
When there are many windows open, the Task Manager widget will now scroll to the active one when you open its window thumbnail list. (Christoph Wolk, KDE Bug #499716)
Notifications no longer waste space showing the same icon in two places. (Kai Uwe Broulik, plasma-workspace MR #6151)
Spectacle now remembers the size (and on X11, also the position) of its main window across launches. (Aviral Singh, KDE Bug #499652)
Made multiple UI improvements to the “Configure Columns” dialog in System Monitor. (Arjen Hiemstra, plasma-systemmonitor MR #405)
In the Weather Report widget, when a weather station isn’t reporting the current wind speed, the widget now says it doesn’t know the wind speed, rather than claiming it’s “calm”. (Tobias Fella, kdeplasma-addons MR #969)
The Kickoff Application Menu widget now does a better job of handling a huge number of favorite apps. Now the favorites column eventually becomes scrollable, instead of letting icons overlap. (Christoph Wolk, KDE Bug #424067)
You can now find System Settings’ Wallpaper page by searching for “desktop background” and some other related terms. (Shubham Arora, plasma-workspace MR #6152)
Frameworks 6.23
Made it possible to see more items at once in the “Get New [thing]” dialogs. (Nate Graham, frameworks-knewstuff MR #380)
Open/Save dialogs now use relative-style date formatting for recent dates and times, which matches how Dolphin shows them. (Méven Car, frameworks-kio MR #2103)
Folders that show thumbnails of their contents now refresh the thumbnail immediately when any of those files are removed. (Akseli Lahtinen, KDE Bug #497259)
Notable Bug Fixes
Plasma 6.5.5
Fixed a strange issue that broke key repeat only in the Brave web browser. (Nicolas Fella, KDE Bug #513637)
Fixed an issue that could make the panel configuration dialog appear on the wrong screen with certain panel and screen arrangements. (Aleksey Rochev, plasma-workspace MR #6140)
Fixed two issues with the “Show Alternatives” popup: one that made it get cut off outside of the screen area for widgets positioned on certain areas of the desktop, and another that made it not disappear when it lost focus. (Aleksey Rochev, KDE Bug #511188 and KDE Bug #511187)
Plasma 6.6.0
Fixed an issue that made Plasma quit when you disconnected the last screen. (Xaver Hugl, KDE Bug #513003)
Fixed an issue with the Applications table on System Monitor’s Overview page being blurry with certain scale factors. We had already previously fixed this, but it turned out there were more remaining cases where it still happened, so this should take care of the rest! (Arjen Hiemstra, KDE Bug #445759)
Fixed a hilarious issue that caused the wallpaper to bounce a tiny bit with certain fractional scale factors on secondary screens using direct scan-out while on a very recent kernel version. (Xaver Hugl, KDE Bug #513277)
How You Can Help
KDE has become important in the world, and your time and contributions have helped us get there. As we grow, we need your support to keep KDE sustainable.
You can help KDE by directly getting involved. Donating time is actually more impactful than donating money. Each contributor makes a huge difference in KDE — you are not a number or a cog in a machine! You don’t have to be a programmer, either; many other opportunities exist.
For example, helping out to write these posts is warmly appreciated. Anyone interested in getting involved should check out the evolving documentation on the topic.
You can also help out by making a donation! This helps cover operational costs, salaries, travel expenses for contributors, and in general just keep KDE bringing Free Software to the world.
Email encryption is indeed still an open issue. There’s no fix in sight for it. It’s mostly a lack of political will though, so none of the big players are going to change anything.
Error handling is still not a properly solved problem in my opinion. At least the Rust community discusses the topic quite a bit. This is good inspiration for other ecosystems as well I think.
This looks like an interesting way to frame problems. It can give an idea of how likely they can be tackled with LLMs. It also shows that the architecture and the complexity greatly matter.
Indeed, the terminology has been greatly confused. I think I’ll die on this particular hill though. I think it’s important to name things properly. That said the trick of going through a verb might just work?
Stop Guessing, Start Improving: Using DORA Metrics and Process Behavior Charts
Tags: tech, processes, metrics, data
Interesting short article. Shows the use of DORA metrics and process behavior charts. This is a good way to test hypothesis and see the impact of processes changes or introduction of new practices. It needs to be done over time and be patient of course.
QtNat is a lightweight C++ library built with Qt 6 that simplifies NAT port mapping using UPnP (Universal Plug and Play). It is designed to help developers easily expose local services to external networks without requiring manual router configuration for users.
By leveraging UPnP, QtNat automatically communicates with compatible routers to create port forwarding rules at runtime. This makes it particularly useful for peer-to-peer applications, multiplayer games, remote access tools, and any software that needs reliable inbound connectivity behind a NAT.
QtNat provides a simplified API to do all steps automatically: discovery and mapping. This has been tested on my local device. Feel free to test it and improve it.
Use it
UpnpNat nat;
QObject::connect(&nat, &UpnpNat::statusChanged, [&nat, &app]() {
switch(nat.status())
{
case UpnpNat::NAT_STAT::NAT_IDLE:
case UpnpNat::NAT_STAT::NAT_DISCOVERY:
case UpnpNat::NAT_STAT::NAT_GETDESCRIPTION:
case UpnpNat::NAT_STAT::NAT_DESCRIPTION_FOUND:
break;
case UpnpNat::NAT_STAT::NAT_FOUND:
nat.requestDescription();
break;
case UpnpNat::NAT_STAT::NAT_READY:
nat.addPortMapping("UpnpTest", nat.localIp(), 6664, 6664, "TCP");
break;
case UpnpNat::NAT_STAT::NAT_ADD:
qDebug() << "It worked!";
app.quit();
break;
case UpnpNat::NAT_STAT::NAT_ERROR:
qDebug() <<"Error:" <<nat.error();
app.exit(1);
break;
}
});
nat.discovery();
We create the object (l:0)
We connect to statusChanged signal to get notified (l:2)
When status is NAT_FOUND, we request the description (l:11)
When status is NAT_READY, we request the port mapping (l:14)
When status is NAT_ADD, It means the port mapping request has been added, It worked! The application quits.(l:17)
When status is NAT_ERROR, Error occured and display the error text. The application exits on error. (l:21)
We connect to error changed in order to detect errors. (l:14)
We start the discovery. (l:28)
Technical explainations
The discovery
Basically, we need to know if there is a upnp server around.
To do so, we send an M-SEARCH request on the multicast address.
Here is the code:
#define HTTPMU_HOST_ADDRESS "239.255.255.250"
#define HTTPMU_HOST_PORT 1900
#define SEARCH_REQUEST_STRING "M-SEARCH * HTTP/1.1\n" \
"ST:UPnP:rootdevice\n" \
"MX: 3\n" \
"Man:\"ssdp:discover\"\n" \
"HOST: 239.255.255.250:1900\n" \
"\n"
void UpnpNat::discovery()
{
setStatus(NAT_STAT::NAT_DISCOVERY);
m_udpSocketV4.reset(new QUdpSocket(this));
QHostAddress broadcastIpV4(HTTPMU_HOST_ADDRESS);
m_udpSocketV4->bind(QHostAddress(QHostAddress::AnyIPv4), 0);
QByteArray datagram(SEARCH_REQUEST_STRING);
connect(m_udpSocketV4.get(), &QTcpSocket::readyRead, this, [this]() {
QByteArray datagram;
while(m_udpSocketV4->hasPendingDatagrams())
{
datagram.resize(int(m_udpSocketV4->pendingDatagramSize()));
m_udpSocketV4->readDatagram(datagram.data(), datagram.size());
}
QString result(datagram);
auto start= result.indexOf("http://");
if(start < 0)
{
setError(tr("Unable to read the beginning of server answer"));
setStatus(NAT_STAT::NAT_ERROR);
return;
}
auto end= result.indexOf("\r", start);
if(end < 0)
{
setError(tr("Unable to read the end of server answer"));
setStatus(NAT_STAT::NAT_ERROR);
return;
}
m_describeUrl= result.sliced(start, end - start);
setStatus(NAT_STAT::NAT_FOUND);
m_udpSocketV4->close();
});
connect(m_udpSocketV4.get(), &QUdpSocket::errorOccurred, this, [this](QAbstractSocket::SocketError) {
setError(m_udpSocketV4->errorString());
setStatus(NAT_STAT::NAT_ERROR);
});
m_udpSocketV4->writeDatagram(datagram, broadcastIpV4, HTTPMU_HOST_PORT);
}
The whole goal of the discovery is to get the description file from the server with all available devices and services.
The result is stored in m_describeUrl.
Your physical network device may act as several Upnp devices.
You are looking for one of these device type:
urn:schemas-upnp-org:device:InternetGatewayDevice
urn:schemas-upnp-org:device:WANDevice
urn:schemas-upnp-org:device:WANConnectionDevice
Those type are followed with a number (1 or 2), It is the Upnp protocol version supported by the device.
void UpnpNat::processXML(QNetworkReply* reply)
{
auto data= reply->readAll();
if(data.isEmpty()) {
setError(tr("Description file is empty"));
setStatus(NAT_STAT::NAT_ERROR);
return;
}
setStatus(NAT_STAT::NAT_DESCRIPTION_FOUND);
/*
Boring XML parsing in order to find devices and services.
Devices:
constexpr auto deviceType1{"urn:schemas-upnp-org:device:InternetGatewayDevice"};
constexpr auto deviceType2{"urn:schemas-upnp-org:device:WANDevice"};
constexpr auto deviceType3{"urn:schemas-upnp-org:device:WANConnectionDevice"};
Services:
constexpr auto serviceTypeWanIP{"urn:schemas-upnp-org:service:WANIPConnection"};
constexpr auto serviceTypeWANPPP{"urn:schemas-upnp-org:service:WANPPPConnection"};
*/
m_controlUrl = /* Most important thing to find the controlUrl of the proper service.*/
setStatus(NAT_STAT::NAT_READY);
}
Send mapping Request
Sending a request is just sending HTTP request with the proper data.
December was quite an eventful month for me, with over 4,000 km travelled by
train. This was in part caused by the holidays and visiting family, but also by the
KDE PIM sprint in Paris and the 39th Chaos Communication Congress.
KDE PIM sprint in Paris
From the 12th to the 14th of December, I was in Paris. It was actually my first time
there for more than a day trip, so I arrived a day earlier to explore the city
a bit. I went on a walk across the city with Tobias and Nicolas, and I took
some photos.
The weekend was also very productive. We advanced our goal of making
KMime a proper KDE Framework; made
Message-IDs in emails more privacy-conscious; and discussed various important
topics such as the retirement of the Kolab resource and the switch to SQLite as the
default backend for Akonadi.
The sprint being in Paris also allowed me to afterward go visit my grandma, 350 km
further south of Paris, so this was particularly convenient.
39th Chaos Communication Congress (39c3)
Another event I went to was 39c3, which is the third year in a row that I attended,
and this year again we had an assembly as part of the Bits und Bäume umbrella,
thanks to Joseph.
I love the vibe of this event. It’s not very dry or only tech-focused, but also has
a big artistic and political aspect to it. And while the number of attendees is
very large, at the same time it’s very chill and I don’t feel overwhelmed, unlike
at FOSDEM.
At the KDE assembly, we met a lot of interested users, some GNOME friends, and since
a bunch of KDE devs were there, we managed to work on a few productive things, like
switching the map backend from Itinerary to MapLibre.
And this year, I even managed to go on national TV for a few seconds to speak
about Nextcloud. My German grandma called me the day afterward, very happy to have
seen me.