Skip to content

Monday, 5 October 2026

Camp KDE at FOSSY 2026: Vancouver Edition

I just got to writing this blog post, regarding FOSSY 2026 in Vancouver, where I co-ran the Camp KDE track, gave a talk, sat on a panel, and spent a decent chunk of the weekend standing behind a table full of stickers. Here’s how it went.

The Camp KDE booth at FOSSY 2026 with everyone who helped out

The Camp KDE booth at FOSSY 2026 with everyone who helped out

Two weeks ago, several of us from Qt Group travelled to Graz for Akademy 2026, KDE's annual summit. The conference was hosted by Graz University of Technology (TU Graz). This year’s conference was extra special: it marked KDE's 30th birthday. Happy birthday, KDE!

Click, drag, and tweak your design in Live Preview before a developer builds it. Ship the same workflow to flagship touchscreens and microcontrollers. And get more of what you draw back as native QML.

I introduce Tagoross Circle of Practice, a safe harbor environment for professionals moving their organizations from reactive open source risk management to open source as strategy. In this post I explain why I created it and where it stands today.

Sunday, 4 October 2026

This one is about the song editor. Harmonicon has a song editor, it’s had one for a while, I just never sat down and explained what all the little buttons do, and there are a lot of little buttons. The game says four hundred and thirty one, but most of those are notes pretending to be buttons, so it’s less than that.

So I’m going to load a song into it and walk around the screen.

The song

The song is O Pulo da Gaita, or “The harmonica’s jump” in english. It’s a folk theme from the Northeast of Brazil, people know it from “O Auto da Compadecida”, and the Northeast is where I’m from, Salvador, so I’m a bit biased.

It’s a good song to show the editor with because it’s busy without being hard. Two hundred and thirty nine notes in a bit over a minute, on a C diatonic, in 2/4, at 100 bpm, and eighteen of those notes are bends. And the whole tune hangs on one move: you bend the 3 draw down half a step and then let it go, back up to the plain B. Bend, release. Remember that, it comes back.

The whole screen

The song editor with O Pulo da Gaita loaded: a tool sidebar on the left, the note grid in the middle with one lane per harmonica hole, and a music staff underneath

There are three things on this screen, and once you know that it stops being four hundred and thirty one things.

Down the left there’s the sidebar, which is two columns. The left column is about the song and the tools: going back, the Edit / Record / Play modes, the lock, undo and redo, copy and paste, the tools for selecting and erasing ranges of time, tempo and meter changes, repeats and endings, the metronome, the legend, save and load. The right column is about the note. The one you have selected, or if you have nothing selected, the next one you’re going to place. Blow or draw, bend, overblow, overdraw, wah, vibrato and how deep, call and response, split, the phrase editor, delete. So the left column is “what am I doing” and the right column is “to which note”.

In the middle is the grid. One lane per hole, ten of them because it’s a ten hole harmonica, numbered down the side. Time goes left to right, and along the top there’s the ruler, counting bars and beats. This song is in 2/4, so the ruler goes “1 & 2 &” and then starts a new bar. Every note is a little block on the lane of the hole you play it on, with an arrow on it, up for blow, down for draw.

Under the last lane there’s a thin strip that says Silence, which shows the gaps between notes so you can spot a rest you didn’t mean. And under that there’s a scrollbar that’s also a tiny map of the whole song, every note drawn as a coloured speck, with a gold bit showing where you’re looking right now. In this screenshot the gold bit is about a fifth of the way along, so the song is roughly five screens long.

Along the bottom is a music staff, the same notes as sheet music. It follows the grid when you scroll, so you can read it as a harmonica player (holes and arrows) or as a musician (dots on lines), or both.

Colours, and how I got them wrong

Now look at hole 3 in that first screenshot. There’s a blue one, then an orange one, then a sort of mauve one, and then another blue. And I looked at that and I thought, the mauve one is the bend, and I wrote a paragraph about it.

Then I opened the Details tab, which has the colour legend in it, and the legend said: orange is the bend. Deeper bends get redder. And the mauve isn’t a technique at all, it’s a red tint, and it means “this note is outside the song’s scale”.

Close-up of the first bars: on hole 3, an orange bent draw note followed by a mauve plain draw note with a gold selection border and two round drag handles

So that’s the bend and the release, right there. The orange one is the 3 draw bent down half a step. The mauve one is the 3 draw let go, back up to B, and B gets the tint because the editor is checking every note against a blues scale on C, and there’s no B in it. It’s not an error, it’s just the editor pointing it out. The tune does it on purpose, fifteen times, I counted: fifteen bends on the 3 draw, fifteen releases. The other three bends, to make up the eighteen, are on the 2 draw, down at the end, where the song answers itself.

And the same two notes show up again in bar 3. And again later. Bend, release.

Picking a note

In that close-up I’ve got the mauve one selected. A selected note gets a gold border and two little round handles, one on each end, and you drag those to make the note longer or shorter. Drag the middle of it and it moves. Click it and you hear it, the editor plays a short blip of exactly that note, bend and all, so you can check a bend sounds like a bend without picking up the harmonica.

The editor with one note selected: the note on the grid has a gold border, the matching note on the staff below is drawn in gold, and the Draw button in the sidebar is lit

The other thing selecting does is it goes and finds the note on the staff and paints it gold too, so you can see where you are in the actual music. And the right column of the sidebar lights up Draw, because that’s what the note is. Click Blow and it would turn into a blow note.

Close-up of the staff: the notation for the opening bars, with the selected note drawn in gold

Phrases

Up in the header, above the lanes, there are these gold labels, “§ A” at the start and “§ A again” at bar 9. Those are phrase markers, and you can click one and it opens a little panel right there.

The phrase panel open at bar 9, titled “Phrase at 9.1”, with Section filled in as “A again” and empty Chord, Groove and Lyric fields

Section is the name of the bit of the song. Chord is the chord under it, if you want the player to know. Groove is how it should feel, something like “laid back”, in words, for humans. And Lyric is the syllable that’s sung when those notes start, which then shows up karaoke style during the game. This chart doesn’t have chords or lyrics filled in yet, which is why those three boxes are empty.

Details

The other tab is Details, and it’s where the song keeps its paperwork.

The Details tab: song metadata on the left, scoring and loop settings in the middle, and the full colour legend on the right

On the left there’s everything about the song itself: the harmonica type, the key (C), the position (1st), the tempo (100), the grid snap, who wrote it (Traditional), the genre, the difficulty, where the transcription came from, and the licence. In the middle there’s how strict the game is when it scores you: how many milliseconds count as perfect, as good, as a miss, how the combo multiplier works, and which phrases loop. And on the right is the legend, which I should have read first.

The status line at the bottom says where the chart was loaded from.

So that’s the editor. Three parts, two tabs, one legend, and a song that bends the 3 draw and lets it go, and bends it and lets it go. You can play it, it’s in the song pack, and it’s on GitHub with everything else.

Bend, release.

Saturday, 3 October 2026

Two weekends ago, I spent around 24 hours in a train to go to and back from Graz to attend Akademy. This year was a bit special since we are celebrating the 30 years of KDE and this was also my first time attending as a member of the KDE e.V. board.

Unfortunately I could only attend the weekend as I was also expected at the Nextcloud Community Conference in Berlin during the week.

I attended a bunch of talks, one of my favorite was “Are we really going to use the same Desktop UX forever?” from Scott Jenson, which I found super interesting and insightful. It really was a call for us to try to innovate and experiment with new UX concepts and he proposed some interesting directions, where we could be going. A good wake up call that now that macOS and Windows are not inventing anything anymore on the desktop we should be driving UX changes forward.

I also very much liked the talk “What Has Been Brewing in KDE PIM Land?” from Dominique Michel and arnaud chirat. As a fellow PIMster, it is great to see some real progress on fixing some longstanding issue in the backend. It’s great to see the Sovereign Tech Agency investing in this core technology. This also motivated me to spend some time on improving Merkuro again (more on that in a separate post).

Aside from that, as always it’s great to meet up with my fellow KDE developers, share some drinks, exchange ideas or just catch up.

On Saturday evening, I attended the sponsors dinner to discuss a bit with our sponsors. Akademy is a free event to attend and we are very grateful about companies sponsoring us to make it happen.

Sunday morning, I went for a short stroll across the city, because while I was only staying for the weekend, I still wanted to discover Graz at least a bit.

The famous clock tower of graz
The famous clock tower of graz
Music
Music
Konqi
Konqi
View from Graz
View from Graz

After a few weeks of work, I am happy to announce that Kirigami Addons 1.15.0 is out. Kirigami Addons is a collection of many useful modules for your QML and Kirigami applications. I have been working more on Merkuro lately (more on that in a separate blog post) and as always when working on an application, it is also the occasion to improve Kirigami Addons even more :)

FormCard

The FormCard module received a new component, FormSliderDelegate, which is a form delegate for sliders.

 

Another nice improvement in terms of usability is that FormCard has a new property, autoSeparators, to automatically add and manage separators between delegates. This allows simplifying some code and in particular code involving Repeater. Internally, the AboutPage component already uses it.

Speaking of AboutPage, this component will now indicate when a new version is available and no longer shows “unknown” as the distribution mechanism. Additionally, the links now use FormGridContainer and we fixed the sizing of its internal dialogs.

 

In terms of mobile UI, FormTextFieldDelegate and FormPasswordFieldDelegate now have a special mobile design where the text field is hidden until clicked. On top of being a bit more compact, this also improves the input interaction and scrolling on mobile.

 

Date and time

The date and time popup can now be reset when resettable is set to true. Before, you could only set a new value but not reset it to an unset state. This is useful in Merkuro Contact, where we can unset a birthday or anniversary for a contact.

There are more changes planned around the date and time module, and I have a huge pending merge request for using proper date and time objects instead of JS dates, which should fix a lot of edge cases.

KirigamiApp

KirigamiAppDefaults has a new load() function. It loads your main QML module and, if loading fails, shows the QML errors to the user instead of silently exiting. On desktop the errors are displayed in a native message box, and on Android a Qt Quick dialog is used so you don’t need to depend on Qt Widgets. This makes debugging startup issues a lot easier, especially when the application is launched outside of a terminal.

QQmlApplicationEngine engine;
KLocalization::setupLocalizedContext(&engine);
if (!KirigamiAppDefaults::load("org.kde.myapp", u"Main", &engine)) {
 return EXIT_FAILURE;
}
return app.exec();

Documentation

This release also includes various improvements to the documentation with some module overviews and cleanups of the existing documentation. For example, here are the overview pages for the formcard, actions and settings modules.

We also updated the application templates provided by Kirigami Addons to be up to date with the best practices.

Packager section

Kirigami Addons now requires Qt 6.10 or later.

You can find the package on download.kde.org (kirigami addons) and it has been signed with my GPG key.

KStars v3.8.5 is released on 2026.10.03 for Windows, Linux, and MacOS. We are providing arm64 (Apple Silicon) and x86_64 variants for the MacOS release, but we hope to release a universal binary by the next KStars release.

For Linux users, it's highly recommended to use the official KStars Flatpak hosted at Flathub.

This release brings major stability improvements, a comprehensive AI Guider overhaul with multi-night training and closed-loop fixes, expanded MCP tool coverage for headless automation, multi-camera support in Analyze, and significant enhancements to the scheduler, capture, and guide modules. Here are some highlights:

FITS Viewer Quality of Life improvements

You can now drag and drop any FITS/XISF files directly unto the KStars sky map and it would be automatically opened. If you dragged a folder, it would be opened in Blink mode. Furthermore, when opening FITS files from file manager (e.g. Dolphin), it now re-uses the same KStars instance and does not open a new instance for each new file.

AI Guider: Major Reliability & Performance Overhaul

  • Fixed closed-loop RLS divergence in Active mode — the online phase/amplitude tracker in WormGearGuider (WORM_GEAR mounts like the EQ8) could re-learn its own leftover prediction error once its output started influencing the applied pulse, making RA guiding measurably worse under Active mode than Standard. The tracker now freezes whenever the applied pulse contains the AI's own prediction, preventing contamination. Confirmed live: RA RMS improved from 3.06" (diverging Active) to 2.41" (frozen Active) vs. a 3.56–5.38" Standard baseline.
  • Per-axis confidence — RA and DEC now maintain independent confidence scores instead of sharing one across both axes. A bad prediction on one axis no longer drags the other axis's trust up or down. Verified live: DEC RMS improved 4.75"→1.26" same-session A/B after the split.
  • Shadow Mode now stays in Shadow Mode — applyFingerprintToOptions() was unconditionally switching the guide algorithm to AI on every weights load, defeating Shadow Mode's purpose. Verified live: a 1500+s Shadow session held Standard/SHADOW throughout with zero AI-influenced pulses.
  • Multi-night pooling and neural Shape Net for RA — new offline training scripts (pool_sysid_data.py, train_shape_net.py, loocv_shape_net.py) pool free-drift data across multiple nights, phase-aligning each night to its own fitted period before combining. A small neural net (phase, altitude → predicted RA drift) trained on pooled data beats a fixed 4-harmonic Fourier baseline by a statistically real margin (95% CI excludes zero), winning in 7 out of 7 held-out nights. LOOCV-validated with a night-level cluster bootstrap.
  • DEC online drift tracker — adds a 1-state recursive Kalman filter tracking residual DEC rate against the existing physics baseline (refraction + polar drift). First live test achieved r=0.65 then r=0.55 physics_dec vs actual DEC error — the strongest correlation of the investigation. Matched-altitude live A/B testing found real altitude-dependent patterns (~29% DEC RMS improvement at low altitude, reversing to ~22% worse at mid altitude). Per-mount opt-in via weights.json's new residual_filter section.
  • Multi-harmonic PE model — extended from a single sinusoid to 4 independently-tracked harmonics (RA), mirrored in the offline trainer's physics model. Real free-drift data shows significant power through the 4th harmonic that a single-sinusoid model structurally cannot represent.
  • Safer AI/PID pulse blending — fixed a chronic RA under-correction bug where proportional gain was backed off by a flat confidence-scaled fraction regardless of whether the AI's feed-forward term was large enough to replace the P-authority being removed. Replaced with a capped backoff that only removes as much P as the AI term demonstrably reinforces, proven via unit tests to never weaken the blend below plain P+I when the AI term doesn't justify it.
  • PID Auto-Tune improvements — cold vs. warm pulses now distinguished (3 consecutive pulses per direction instead of alternating), and Andreas R. added a short-exposure switch during pulse_response phases (0.25s) so the default ~2s guide cadence can actually sample the dead-time transient the fitter needs. DEC auto-tune timing tightened (12 response frames/10s settle → 6/2s) to keep the axis closer to continuously engaged.
  • PE period detection fixed — train_worm_gear.py was picking a 2nd-harmonic peak (~100s) over the true fundamental (~198–201s) via a bare argmax() over one Lomb-Scargle periodogram. Now walks toward longer periods when a comparably-strong harmonic relationship exists, gated on ≥2.5 cycles resolved.
  • Fixed k_ref (RA refraction term) loaded from weights.json but never read by physicsRA()
  • RLS cold-start now warm-starts from the offline-trained physics fit instead of zero, with anisotropic covariance
  • AI Guide Wizard slew-skip bug fixed — a restarted session could silently skip its slew by matching a stale target position
  • Data-collection phases now target a frame COUNT (with wall-clock as a 3x backstop) instead of fixed duration, so slower Debug-build cadence doesn't silently halve the frame count
  • AI debug CSV logging added for dark-guiding pulses (previously only visible via verbose qCDebug)

Scheduler & Observatory Automation

  • Fixed scheduler not shutting down when a safety alert outlasts the job — with the weather grace period set to wait indefinitely, an alert lasting past a job's completion constraint left the observatory open (reported in daylight in one incident). The monitoring branch now releases the active job when a soft shutdown starts, re-evaluates jobs before any post-startup task, and runs the full shutdown when no job is left.
  • Fixed internal guider not guiding after the scheduler restarts it while suspended — when a scheduler job repeats and its sequence ends with non-light frames (e.g. flats), guiding is still suspended when the next iteration starts. The cgmath suspend flag set by suspend() was never cleared, so every guide frame was skipped for the rest of the night. BUG: 526397
  • Fixed scheduler retrying autofocus on an optical train without focuser — when a Focus tab switched to an optical train without a focuser, canAutoFocus() kept reporting the capability of the previously selected focuser. The scheduler then started autofocus on the train without focuser, which aborted and was retried until the job aborted and rescheduled, oscillating between Scheduled and Running.
  • Fixed scheduler double-counting captured frames for targets with a dot in the name — Wolfgang Reissenberger fixed PlaceholderPath::getCompletedFiles() deriving its file-matching pattern by stripping everything from the last . onward. A target like SNR_G108.2-0.6 got truncated right after that dot, discarding camera, filter, exposure, date tokens. Two optical trains capturing the same target into a shared directory each reported the combined frame count instead of its own.
  • Fixed UI test startup D-Bus service name and location — locationNamed("Greenwich") returns Greenwich, Connecticut with US DST rules while tests expect Greenwich, UK
  • Fixed greedy scheduler tests using the standard-time UTC offset instead of DST
  • Fixed scheduler not creating the Ekos Manager while loading sequence files (crashed testschedulerunit)
  • Added scheduler and test pitfalls to AGENTS.md — notes for AI agents from the scheduler weather work
  • Thomas Nemer added MCP scheduler tool family: scheduler_status, scheduler_jobs, scheduler_current_job, scheduler_start/scheduler_stop, scheduler_load

Camera & Capture

  • Fixed follower camera hanging after focusing — Wolfgang Reissenberger fixed a multi-camera bug where a follower camera could get stuck after re-focusing if the camera was paused while the lead camera dithered and a re-focus became due at the moment the sequence continued. Resuming a paused sequence now retries pending actions instead of giving up after the first attempt.
  • Fixed capture status label stuck at "Focus Offset" — Wolfgang Reissenberger fixed the status label over the capture preview keeping "Focus Offset" while the frame is being exposed instead of switching back to "Capturing".
  • Capture: do not restart an aborted sequence when dithering ends — Wolfgang Reissenberger fixed capturing that was stopped while a dithering run is still in progress restarting on its own as soon as the dithering finishes. Only capturing that was paused for the dithering itself is now resumed.
  • Unified Temperature with Gain/Offset "no value" semantics — removed the separate enforce checkbox (could fall out of sync with the spinbox's own value) and gave Temperature the same special-value convention Gain/Offset already use: the spinbox itself carries a "--" sentinel (min - step) for "no target temperature".
  • Fixed dark frame matching to use the target chip's camera, not the dialog's — DarkLibrary::findDarkFrame() read gain/temperature from the camera tied to the optical train selected in the Dark Library dialog, not the camera that owns the chip being matched. For setups with a dedicated guide camera, this caused valid dark frames to be rejected on a gain mismatch that never existed.
  • Multi-camera bug fixed: disconnect from old camera device if device changes — Wolfgang Reissenberger fixed the camera tab not disconnecting from its former device if the device has been changed (e.g. optical train switched). Turning off cooling on the first camera appeared to turn off cooling on the second camera as well (the INDI driver showed cooling was still on).
  • jc tk added camera name and optical train placeholders for filename generation: %opticaltrain/%o and %cameraname/%c
  • Andreas R. added stream depth selector for video sequences — a combo box (Stream OFF / 16-bit / 8-bit) in the capture sequence editor for video frame type, allowing users to specify bit depth directly in the sequence file
  • Thomas Nemer added MCP capture sequence tool family: capture_status, capture_get_jobs, capture_start/capture_stop/capture_abort, capture_suspend/capture_pause/capture_resume, capture_load_sequence, capture_set_target

Guide

  • Warn when mount stops tracking while guiding is active — if the mount reports MOUNT_IDLE or MOUNT_ERROR while guiding/dithering is running, Guide now fires a loud GuideFailed notification instead of silently guiding into a wall (e.g. AM5N mounts spontaneously losing tracking mid-session per user reports).
  • Andreas R. added reset calibration when the field rotates — an opt-in option that invalidates a completed/stored guide calibration when the field has rotated (detected via the Align module's plate-solved position angle), so a fresh calibration is measured on the next guide start instead of guiding on a stale, rotated one. Handles both electronic rotator moves and manual camera rotation. Works with the internal guider and PHD2. Meridian flip changes are explicitly excluded via pier-side tracking and a 180° magnitude fallback.
  • Andreas R. added a Stream OFF/16-bit/8-bit selector (per optical train) — replaces the guide module's Stream checkbox with a stream mode combo box offering three choices. The selection is saved per optical train. Includes Camera::setStreamDepth(int) helper (0 = 8-bit, 1 = 16-bit).
  • Andreas R. fixed GUI freeze on streaming guide + normal dither (self-join deadlock) — a hard GUI freeze with the internal guider in streaming mode when the capture module requests a normal (multi-pulse) dither. Ekos locks up the instant "Dithering…" is logged. Root cause: a stream frame processed on the GUI thread spins a nested QEventLoop during star extraction, which dispatches the imaging camera's queued newImage → dither → synchronous InternalGuider::dither() → findStars on the same FITSData whose extraction future is still running inline → deadlock. Streaming normal dither now uses the same deferred path as single-frame guiding.
  • Andreas R. made calibration always run single-frame; stream only while guiding — streaming guide calibration produces erratic results (scattered plots, mis-estimated pulse rates, "Lost track of the guide star" aborts) because calibration is frame-driven and assumes each frame reflects a completed, settled pulse. With the default 1000 ms calibration pulse longer than the exposure, pulses overlap and the mount never settles. Guide::calibrate() now stops any active stream before buildOperationStack(), so the whole calibration runs on the single-frame path; the stream starts automatically when active guiding begins.
  • Andreas R. applied dark/defect-map correction to streaming guide frames — in streaming mode the GUIDE_DARK operation step is skipped, so the "Dark" checkbox was a no-op. The correction is now applied inline in processData() for streaming frames via new DarkProcessor::denoiseSynchronous() before the frame is loaded into the guide view or handed to the guider. Verified on real hardware (PlayerOne Xena 585M): glow pedestal and gradient removed, edge-spread 5.0 → 0.2/0.7.

Alignment & Mount Modeler

  • Lower the default align check threshold to 10 arcminutes and improve logging to identify if the actual mount moved between checks
  • Account for declination when calculating total alignment error
  • Properly display annotated objects after plate-solving an image from Sky Map objects
  • Fixed align hang when a slew completes without an observable IPS_BUSY — some mount drivers finish very short corrective slews within a single status tick and never emit an intermediate IPS_BUSY for EQUATORIAL_EOD_COORD. Align's ALIGN_SLEWING handler only trusted an IPS_OK once it had witnessed IPS_BUSY, and the elapsed-timer fallback is only re-evaluated when a new property update arrives. Snapshot the mount's reported RA/DE right before Slew() commands the move, and also accept an IPS_OK whose position differs from that snapshot as proof

Last week I attended this year’s KDE Akademy in Graz, Austria, my 20th in-person Akademy.

Group photo of the KDE Akademy attendees.
KDE Akademy 2026 group photo (source)

Akademy

Akademy for me is mainly about meeting the people I otherwise just work with online, and hanging out with old and new friends. And even 22 years after the first one I’m still excited about that. This year also happened to be KDE’s 30th anniversary, making this extra special.

KDE e.V. president and vice-president cutting a cake in the shape of KDE's cute mascot Konqi with a large knife while visibly enjoying what they are doing.
Lydia and Aleix stabbing poor little cake-Konqi (source)

Recordings of the talks are available on media.ccc.de, recordings of the BoF wrap-up sessions are on KDE’s PeerTube channel, and BoF notes should be in the wiki. There are also a couple of reports from other attendees already on Planet KDE.

Topics

QA and CD

On Saturday I spoke about how continuous delivery (CD) builds help with QA, based on the experience with using those for Itinerary.

While we see very little testing on pre-releases (betas, release candidates), getting people to daily-drive the latest CD builds from the main development branch turned out to be the single biggest improvement to overall quality in recent years.

It was great to see this was just one in several talks that focused on different aspects of QA this year.

New contributor experience

Daily-driving CD builds already turns people from users into contributors, becoming part of the QA team, maybe without even realizing this. A possible next step, sending a first merge request, even if just for something very small, is currently made way harder than it needs to be though.

As part of my talk I demonstrated a possible alternative workflow, getting to a modified and fully isolated version of Alligator within a few minutes, without requiring any modification on the host system or involving any risk of otherwise interfering with that.

Kirigami Addons about page with a new 'Edit Application' action.
Edit Application action on the about page

This prototype involved a small modification to Kirigami Addons to add an “Edit Application…” action to the about dialog, and a custom URI handler to also make this work for fully sandboxed applications. It’s also currently only working with GNOME Builder, as none of our editors/IDEs so far have the Flatpak handling integrated seamlessly enough. Changing that was dicussed with the Kate later during Akademy then.

Assuming all that would be integrated, the only thing needed on the application side then is adding a link to the source code repository in the AppStream metadata file (and of course having a Flatpak manifest in its Git repository).

Plasma Mobile

For NFC support there’s now an agreement on where the integration code for Plasma should live eventually, very similar to how the Bluetooth code is organized. There was also the chance to test the existing code with a few more NFC-enabled cards/devices, which found a few more (usability) issues to address.

Shortly before Akademy, support for the xx-cutout-v1 Wayland protocol landed in Qt 6.13. This makes Qt’s SafeArea API work with Wayland compositors supporting that protocol as well, allowing us to benefit from all the work on supporting that in applications for Android.

An unmodified KWeather running in Phosh's compositor with simulated display cutouts and rounded display corners, with all relevant UI elements staying clear of those areas.
KWeather with simulated display cutouts.

What we were missing still is the compositer-side part of this in KWin, and I expected that to be much more work than the client part in Qt. An expectation the KWin team defied though, I got to see a prototype for cutout support in KWin already, so this looks very much in reach now.

We also discussed support for the XDG camera portal with the Qt MultiMedia team. We need that for accessing the camera from a sandboxed Flatpak application without giving it full device access. It’s something they want to have as well at least, but there’s no specific timeline yet (ie. we might have to implement it ourselves).

PIM

There was a talk about the Sovereign Tech Agency (STA) funded PIM work, as well as plenty discussion about this in the two-part PIM BoF, which was good to see.

Something I’m particularly excited to see being implemented is UnifiedPush support for CalDav, something which started at a meeting two years ago at a NextCloud conference. That’ll not only make calendar syncing faster and more efficient, it could also make synchronized reminder states viable, so dismissing an reminder on one of your devices would also dismiss it on all other devices.

Another exciting aspect is work on making calendar and contact data accessible to and from Flatpak applications. That’s currently an unsolved problem for GNOME and KDE, as both our PIM APIs were designed as platform APIs at a time before sandboxed applications were a thing. The ultimate goal here would be an XDG portal API for contact and calendar access, closing a gap that Linux currently still has compared to most proprietary platforms. This is a huge task though, but there’s several publicly funded efforts currently addressing parts of this.

As usual we also talked about the next steps in the repository consolidation work. KMime finally made the move to KDE Frameworks earlier this year, and we are almost done with dissolving kcalutils with a mix of up- and downstreaming its content. The likely next target would then be getting KIMAP to Frameworks as well.

Itinerary

Akademy is also the time of some of the most intensive Itinerary usage during the year, and thus lots of feedback coming in, causing a few improvements:

  • Fixed the unreachable transfer warning not being shown.
  • Fixed currency exchange rates shown in the wrong direction.
  • Fixed a crash in online post-processing of reservation data commonly observed on Sentry but not easily reproducable.
  • Fixed inaccessible entries in the country combo box due to an outdated qqc2-breeze-style in the APK.

Despite efforts following a previous Akademy to avoid a certain unnamed member of the community ending up at the wrong airport, said person got apparently lost entirely this time and didn’t make it to Akademy at all. So we still have a lot of work ahead of us to make travel David-proof.

More conferences

Akademy was the second in a close series of three major conferences for me now, following SotM 2026 and ending with the Open Transport Community Conference 2026 starting on Tuesday. That’s also why the bi-monthly Itinerary update post that would usually appear at this point has to wait a bit.

Welcome to a new issue of This Week in Plasma!

This week, Plasma 6.8 continues to pass through the bug-fixing process in preparation for its release on October 14th, including the release of a second beta version. So far we still don’t have many reported regressions, so again either Plasma 6.8 is amazing already, or else people aren’t testing it enough!

In addition to bug fixing and polishing, Plasma contributors also began landing some features and UI improvements for Plasma 6.9. Check it out:

Notable new features

Plasma 6.9

The context menu for Task Manager tasks now includes a “Move to Screen” feature, mirroring the similar one already accessible from windows’ titlebar context menus. (Kai Uwe Broulik, KDE Bugzilla #465058)

System Settings’ Firewall page can now display comments associated with custom firewall rules made with the ufw firewall backend. (Arie Miller, plasma-firewall MR #109)

Comment field on the “Create A New Firewall Rule” dialog

Notable UI improvements

Plasma 6.8

Tiled windows now have square corners, so they fit together nicely. (Ethan Chappel, KDE Bugzilla #490716)

Tiled windows with square corners

The Dictionary widget now fully adjusts its colors when the active color scheme or Plasma style changes, and looks more “Plasma-style” in general. (Christoph Wolk, kdeplasma-addons MR #1141)

New New
Old Old

System Monitor’s Processes and Applications pages no longer sometimes show double scrollbars. (Christoph Wolk, plasma-systemmonitor MR #466)

Plasma now sends fewer notifications about the screen configuration changing — particularly for cases where they offer no real value. (Kai Uwe Broulik, plasma-workspace MR #7094 and plasma-workspace MR #7148)

Plasma 6.9

System Settings’ Touchpad page now expresses the available options for right- and middle-clicking in a more natural way. (Jakob Petsovits, plasma-desktop MR #4041)

On System Settings’ Notifications page, some icons on the list items for configuring individual notifications now have tooltips to explain what they do, in case their icons aren’t comprehensible enough. (Tobias Fella, plasma-workspace MR #6785)

If you’ve configured any custom clipboard actions in the Clipboard widget’s settings, they’re now placed above the standard MIME type actions, rather than below them. (Paul Wise, plasma-workspace MR #6107)

The “In rows” and “In columns” arrangement options for desktop icons now arrange icons the way they say they will, rather than according to the opposite option. (Daniel Pflager, KDE Bugzilla #512993)

Notifications with speed graphs no longer redundantly show the current speed twice while expanded. (Méven Car, plasma-workspace MR #7050)

Notable bug fixes

Plasma 6.6.7

Fixed an issue that could make Plasma freeze on systems where the Wi-Fi adapter is disabled and re-enabled frequently. (Jay Fleischer, plasma-nm MR #669)

Fixed an issue in the Comics widget that could make it occasionally get stuck in an infinite loop and waste system resources. (Tobias Fella, KDE Bugzilla #525856)

Plasma 6.7.6

Fixed a case where KWin could crash on systems with NVIDIA GPUs using version 610.57.04 or later of the proprietary driver. (Xaver Hugl, KDE Bugzilla #524840)

Fixed a case where Plasma could crash when you dragged a widget to a panel. (David Edmundson, KDE Bugzilla #501289)

Fixed a case where Plasma could crash while trying to fetch weather data from Environment Canada. (Bohdan Onofriichuk, KDE Bugzilla #512054)

Fixed a memory leak in the Process Table widget. (David Edmundson, KDE Bugzilla #525978)

Worked around an upstream issue in version 9.12 or later of the coreutils library that prevented KWallet from being unlocked at login as expected. (Omid Kordbache, KDE Bugzilla #525805)

Fixed a recent regression that made the names of touchpads vanish from the device chooser combobox on System Settings’ Touchpad page. (Kai Uwe Broulik, KDE Bugzilla #521800)

Plasma 6.8

Fixed a case where Plasma could crash in response to apps closing or crashing in very specific ways. (David Edmundson, KDE Bugzilla #506562)

Fixed an issue that made Spectacle sometimes fail to save screen recordings. (Zhora Zmeykin, KDE Bugzilla #516848)

Spectacle’s “Share” feature once again works. (Tobias Fella, KDE Bugzilla #525413)

When you drag the thumbnail of a file or screenshot from a notification to somewhere else, the drop menu once again includes “Move” as an option. (Christoph Wolk, KDE Bugzilla #508520)

Remote desktop authentication now works with version 3.32 or later of the freerdp library. (Ben Marshall, krdp MR #248)

Fixed an issue that could cause remote desktop sessions closed remotely while in progressive mode to get stuck and block starting new sessions. (Oliver Beard, krdp MR #246)

The Brightness & Color widget is now fully screen-reader-friendly. (Christoph Wolk, KDE Bugzilla #508485)

Fixed a bizarre clipboard issue that mis-rendered certain Unicode characters in the 100th position of a piece of copied text. (Tomáš Hnyk, KDE Bugzilla #508224)

Plasma 6.9

Text in a right-to-left language that you copy to the clipboard while using a left-to-right language is no longer covered up by the hover buttons in the clipboard history. (Tomáš Hnyk, KDE Bugzilla #440349)

Fixed a visual glitch affecting notifications with speed graphs that could appear when you sent them to the history, and then restored them. (Méven Car, KDE Bugzilla #514677)

Notable in performance & technical

Plasma 6.8

The Task Manager widget’s feature to filter tasks by virtual desktop has been made compatible with the “per-screen virtual desktops” feature. (Kai Uwe Broulik, plasma-workspace MR #7147)

System Monitor and its widgets now measure GPU memory usage more accurately. (Roan Bukaci, KDE Bugzilla #525481)

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.

Would you like to help put together this weekly report? Introduce yourself in the Matrix room and join the team!

Beyond that, you can help KDE by directly getting involved in any other projects. 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.

You can also help out by making a donation! This helps cover operational costs, salaries, travel expenses for contributors, and in general just keeps KDE bringing Free Software to the world.

To get a new Plasma feature or a bug fix mentioned here

Push a commit to the relevant merge request on invent.kde.org.