Skip to content

Friday, 13 November 2026

Let’s go for my web review for the week 2026-46.


From Linux to Wikipedia: How Volunteers Build the Internet

Tags: tech, foss, commons, community

Nice paper about how commons are built. Peer-production is really a powerful way to organise.

https://thereader.mitpress.mit.edu/from-linux-to-wikipedia-how-volunteers-build-the-internet/


Internet Cul-de-sac - a dead end worth visiting

Tags: tech, web, indie, culture

Neat place to discover plenty of other fascinating or quirky websites.

https://culdesac.site/


Blender 5.3

Tags: tech, 3d, blender, foss

This is again a very strong release from Blender. Lots of neat features. Kudos to them!

https://www.blender.org/download/releases/5-3/


The Myth of Neutral Code

Tags: tech, foss, politics, history

A reminder of where Free Software comes from. It’s never been apolitical mind you, claiming the contrary is misreading history.

https://foss.life/notes/2026/the-myth-of-neutral-code/


Weird licenses and the new open source

Tags: tech, foss, licensing, politics

More new licenses are surfacing. It looks like the Free Software licenses ran their course but are not enough anymore.

https://dustri.org/b/weird-licenses-and-the-new-open-source.html


Any Sane Person in Computers Right Now: “Are We the Baddies?”

Tags: tech, politics, history

Or the importance of community and studying other fields. The political landscape around tech has led to a turbocharged dystopia but there are other ways. Any bubble of humanism in the margins is precious and has to be kept. It’ll be needed someday.

https://theinternet.review/2026/02/17/are-we-the-baddies/


Exploit Machina

Tags: tech, innovation, politics, law

Interesting essay. It’s very much attuned to the US context but it’s a timely exploration of the current handling of innovation in our societies. Interestingly we’ve forgot that innovation and progress don’t necessarily go hand in hand. This isn’t without bad consequences.

https://www.andreamm.com/_files/ugd/26d278_b60b4140feb34bf2bfb6ab7405a27e99.pdf


How I accidentally became a millionaire

Tags: tech, ai, machine-learning, gpt, google, search, fake-news

It’s a good illustration of how information channels became very fragile. LLMs based systems reaching for openly available information on the web are very susceptible to being manipulated.

https://lyra.horse/blog/2026/11/disinformation-machine/


Why I will not be using LLMs in my coding

Tags: tech, programming, ai, machine-learning, copilot

Another good balanced post on the reasons to resist using LLMs for development.

https://www.polso.info/why-i-will-not-be-using-llms-coding


Pointer Provenance in Rust vs C++

Tags: tech, compiler, memory, rust

A good introduction on how and why compilers track pointers and memory locations. Also shows what can be used with Rust to handle provenance.

https://sofiabelen.github.io/projects/pointer-provenance-in-rust-vs-cpp/


The port that does not exist

Tags: tech, networking

This is wild! The amount of stuff which happens to listen on port 0 is surprising.

https://acid.vegas/blog/the-port-that-does-not-exist/


Are Emojis Allowed in XMPP Addresses?

Tags: tech, xmpp, standard, unicode, emoji

A deep dive in this funny question. This is a nice tour of a few RFCs around XMPP.

https://op-co.de/blog/posts/emoji_xmpp_address/


Iceberger

Tags: tech, physics, funny

Cool little simulation. Wondering how an iceberg might float? Draw your own.

https://joshdata.me/iceberger.html


I made a film in Excel

Tags: tech, spreadsheets, animation, funny

OK, this is definitely quirky and funny. It shows that any medium can be used if you’re motivated enough to create art. :-)

https://vimeo.com/1241981102


What Actually Happens When You Die?

Tags: science, biology, death

If you ever wonder about what will happen in your body in the end. This gives a good idea of the process and it’s longer than what we usually have in mind.

https://www.youtube.com/watch?v=fEjvSbI_PT4



Bye for now!

Friday, 13 November 2026

KDE today announces the release of KDE Frameworks 6.32.0.

This release is part of a series of planned monthly releases making improvements available to developers in a quick and predictable manner.

New in this version

Attica
  • Remove unimplemented methods. Commit.
Baloo
  • [UnindexedFileIteratorTest] Remove completely empty test. Commit.
  • [TermGenerator] Lowercase characters after stripping markings. Commit.
  • [TermGenerator] Reuse QString buffer for normalization. Commit.
  • [TermGenerator] Avoid rewriting input for underscore splitting. Commit.
  • [TermGeneratorTest] Remove Document dependency. Commit.
  • [TermGeneratorTest] Extend decomposition/normalization tests. Commit.
  • [TermGenerator] Fix incorrect boolean operation. Commit.
  • [baloosearch] Add parameter to limit default search scope. Commit.
  • [Query] Add scope parameter to limit search to filename, content, etc. Commit. See bug #472004
  • [SearchStore] Refactor search scope expansion. Commit.
  • [baloosearch] Fix empty types parameter. Commit.
  • [Extractor] Replace KIdleTime with signal from worker pipe. Commit. See bug #515338
  • [FileContentIndexer] Listen to idle signal and forward to extractor. Commit.
  • [IdleMonitor] Add DBus helper to listen for idle state. Commit.
  • [CommandPipe] Extend to allow passing other commands than index IDs. Commit.
  • [Codecs] Do not copy past the end of the vector in PostingCodec::decode. Commit.
  • [Extractor] Remove "common" properties from the PositionsDB. Commit.
  • [SearchStore] Use DocumentDB data to search for "common" metadata terms. Commit.
  • [Query] Remove deprecated API usage from tests/tools. Commit.
  • [IndexerConfig] Deprecate shouldBeIndexed in favor of canBeSearched. Commit.
  • [Term] Replace value QVariant with QString. Commit.
  • [SearchStore] Create PostingIterator from Query without intermediate Term. Commit.
  • [Query] Move searchstring parsing etc. to SearchStore. Commit.
  • [Query] Clean up signed/unsigned usage of limit. Commit.
  • [Query] Deprecate some redundant/underspecified API. Commit.
  • [SearchStore] Make SearchStore class a namespace. Commit.
  • [balooctl] Use DBus activation to start daemon after enable command. Commit.
  • [balooctl] Use DBus activation to restart daemon after purge command. Commit.
  • [baloo_file] Make the main daemon DBus-activatable. Commit.
  • [FileWatchTest] Remove obsolete FreeBSD QEXPECT_FAIL. Commit.
  • [Query] Remove intermediate JSON document when parsing type URLs. Commit.
  • [QuerySerializationTest] Add tests for type URLs. Commit.
  • [Term] Remove unused serialization/deserialization helpers. Commit.
  • [Query] Remove internal Term member from Query. Commit.
  • [Term] remove unused/unimplemented negation member. Commit.
  • [Query] Fix erroneous example in API documentation. Commit.
  • [TermGeneratorTest] Extend benchmark to longer input. Commit.
  • [TermGeneratorTest] Refactor test data for word segmentation/benchmark. Commit.
  • Service: make sure to order After plasma-workspace.target. Commit.
  • [Extractor] Remove unused capture variable. Commit.
  • [ExtractorCommandPipeTest] Refactor to better match real extractor. Commit.
  • [ExtractorTest] Prefix debug output from test code. Commit.
  • [TermGenerator] Keep textual content blocks adjacent. Commit.
  • [QueryTest] Add content matches for single trailing words. Commit.
  • [Result] Delay text processing to the finish() call. Commit.
  • [Result] Delay property term processing to the finish() call. Commit.
  • [TermGenerator] Drop the property term positions from the DB. Commit.
  • [SearchStore] Use PropertyPhraseQuery for property phrases. Commit.
  • [Transaction] Implement dedicated property phrase query. Commit.
  • [TermGenerator] Separate plaintext and property term indexing. Commit.
  • Service: do not start too early. Commit.
  • [TermGenerator] Drop the mimetype positions from the DB. Commit.
  • [QueryTest] Extend tests for MimetypeQuery. Commit.
  • [SearchStore] Use DocumentDataDB for mimetype phrase searches. Commit.
  • [Document] Store mimetype in the DocdataDB. Commit.
  • [Termgenerator] Add dedicated function for mimetype term generation. Commit.
  • [PropertyData] Modernize code, reject non-numeric keys. Commit.
  • [BasicIndexingBenchmark] Use correct mimetype for directories. Commit.
  • [QueryTest] Cleanup, remove obsolete SortedIdVector helper. Commit.
  • [QueryTest] Cleanup, use array for test document ids. Commit.
  • [QueryTest] Extend test for content with multiple pages. Commit.
  • [DocumentContentTest] Extend coverage to mixed property/text terms. Commit.
  • [Extractor] Free each result once its batch is committed. Commit.
  • [SearchStore] Fix parsing error for property comparison with float values. Commit.
  • [QueryTest] Add tests for integer/double valued properties. Commit.
  • [DocumentContentTest] Check processing of content indexing results. Commit.
  • [QueryTest] Add tests for KFileMetadata property term queries. Commit.
  • [Querytest] Add test for mimetype query. Commit.
  • [Document] Remove remaining filename positions method. Commit.
  • [TermGenerator] Drop the filename positions from the DB. Commit.
  • [SearchStore] Use IdFilenameDB for filename phrase searches. Commit.
  • [BasicIndexingBenchmark] Add more information to the output. Commit.
  • [QueryTest] Use separate test functions for content and filename queries. Commit.
  • [UnindexedFileIndexer] Fix type/mimetype updates without content indexing. Commit.
  • [ModifiedFileIndexer] Fix type/mimetype updates without content indexing. Commit.
  • [ModifiedFileIndexer] Add test cases. Commit.
  • [WriteTransactionTest] Replace test helper with standard QTest::toString. Commit.
  • [baloosearch] Basic test coverage for listTypes/listProperties. Commit.
  • [balooshow] Show property names when "-x" option is set. Commit.
  • [baloosearch] Add option to list supported properties for a query. Commit. Fixes bug #334552
  • [baloosearch] Extend help to provide some more hints about usage. Commit. See bug #334552
  • [baloosearch] Add option to list supported values for type option. Commit. Fixes bug #364078
  • [baloosearch] Modernize QStringList and QStringLiteral usage. Commit.
  • [SearchStore] Better error message for invalid string operator. Commit.
  • [SearchStore] Add debug output for invalid number or date values. Commit.
  • [SearchStore] Avoid over/underflow for less/greater operators. Commit.
  • [SearchStore] Do not crash on invalid user input for "tag" property. Commit.
  • [Searchstore] Improve internalProperties formatting. Commit.
  • [QueryTest] Fix uninitialized values when using isolated tests. Commit.
  • [SearchStore] Fix handling of modification date strings. Commit.
  • [SearchStore] Fix matching of unquoted string with separators like colons. Commit.
  • [QueryTest] Test prases starting with property separator. Commit.
  • [EngineQuery] Remove nesting from EngineQuery. Commit.
  • [SearchStore] Remove EngineQuery indirection for type and tag queries. Commit.
  • [KIO] Modernize deprecated KIO::UDSEntry::reserve() calls. Commit.
  • [ExtractorProcessTest] Avoid crash notification spam. Commit.
Breeze Icons
  • Update preferences-desktop-cursors to current Breeze cursor shape. Commit. Fixes bug #478494
  • Give klipper-symbolic a viewBox. Commit.
  • Move 32px klipper-symbolic to status. Commit.
  • Add "country", "country-state" and "city" icons. Commit. Implements feature #525905
  • Add symlinks for x-audacity-project+sqlite3. Commit. Fixes bug #527329
  • Add a symbolic icon for alligator. Commit.
Extra CMake Modules
  • ECMGenerateQDoc: Fix appending extra index directories. Commit.
  • Add support for QML_IMPORT_PATH. Commit.
  • ECMInstallIcons: document .svg as the scalable icon format. Commit.
  • ECMInstallIcons: install .svg scalable icons with the old form of arguments. Commit.
  • Add find module and macro to update the XDG Intent cache. Commit.
  • Ecm_test_set_dir_properties: fix comparing symlink-resolved path to one not. Commit.
  • Canberra, PulseAudio, UDev find modules: warn when reading deprecated vars. Commit.
  • Docs: add missing Since information to FindWaylandProtocols & Findepoxy. Commit.
  • Drop obsolete FOUND_VAR args to find_package_handle_standard_args. Commit.
  • Canberra, UDev, PulseAudio find modules: drop explicit uppercase FOUND variant. Commit.
  • ECMGenerateQDoc: Add framework path to includes. Commit.
  • Enable /bigobj with MSVC. Commit.
Framework Integration
  • Fix leak in kstyle_unittest. Commit.
KArchive
  • Kzip: set the UTF-8 flag on names that are not ASCII. Commit. See bug #82436
  • Kzip: read legacy names in the Windows OEM code page. Commit. Fixes bug #89051
  • Kzip: read the Info-ZIP Unicode Path extra field. Commit.
  • Kzip: read names without the UTF-8 flag as code page 437. Commit.
  • K7zip: validate the coder graph of each folder. Commit.
  • KTar: Write the end of archive marker. Commit.
  • Clean forward and includes. Commit.
  • CMake config: tag LibZstd properly as REQUIRED when searched. Commit.
  • KTar: Use extension to determine mimetype if contents give default mime. Commit.
  • CI: Use latest cmake via pip for oss-fuzz build job. Commit.
  • K7zip: decode the files on first read, not on open. Commit.
KAuth
  • Clean forward and includes. Commit.
KBookmarks
  • Remove unimplemented methods. Commit.
KCalendarCore
  • .pre-commit-config.yaml - fix indent. Commit.
  • (pre-commit) Give guidance to markdownlint on the nodejs version to check against to keep it happy. Commit.
  • .pre-commit-config.yml - Comment markdownlint-cli. Commit.
  • Clean forward and includes. Commit.
  • Fix reading GEO longitude with libicalv4. Commit.
  • Export the QML plugin target for static builds. Commit. See bug #526728
  • Format/lint all xml files and add pre-commit to enforce that. Commit.
  • Pre-commit autoupdate. Commit.
  • Pre-commit - keep yaml tidy with yamlfmt. Commit.
  • Limit each libical by_ array to its max size and don't double recurrences. Commit.
  • Implement occurrenceiterator exclude exception outside iterator range. Commit.
  • Refactor occurenceiterator setupIterator's handling of thisAndFuture. Commit.
  • Fix far event exception not being returned in iterator. Commit. Fixes bug #447966
  • Refactor occurenceiterator setupIterator function. Commit.
  • Reformat OccurenceIterator::setupIterator. Commit.
  • Autotests/testcalendarobserver.cpp - explicitly unregister observers. Commit.
  • Drop obsolete FOUND_VAR arg to find_package_handle_standard_args. Commit.
  • Correct the QML documentation module name. Commit.
  • Clazy detaching-temporary fixes. Commit.
  • Calendar.cpp - in Calendar::setModified() check if observers are enabled. Commit.
KCMUtils
  • Comment out linux-qt6-next. Commit.
  • AboutPage: Show the plugin's copyright and bug report URL. Commit.
  • Drop custom AboutPlugin in favor of Kirigami.AboutPage. Commit.
  • SimpleKCM, AbstractKCM: Handle a null kcm context property. Commit.
  • CMake config: drop no longer used template variable. Commit.
  • KF6KCMUtilsQuick: use only Qt6QmlIntegration in public interface. Commit.
KCodecs
  • Use latest cmake via pip for ossfuzz build job. Commit.
KColorScheme
  • Clean forward and includes. Commit.
KConfig
  • Remove unimplemented methods. Commit.
  • Fix check for user config files. Commit. Fixes bug #525267
  • KConfigIni: handle non-file devices when readLineInto fails. Commit.
  • KConfigIni: Stop parseConfig loop when readLineInto fails. Commit. Fixes bug #526441
  • Fix KConfig::copyFrom to be non const. Commit.
  • Ensure locale name with language code and country code. Commit.
  • Ossfuzz: Get a newer cmake from pip. Commit.
KConfigWidgets
  • KHelpClient: Apply anchors for handbooks. Commit.
  • Add kf6_entry for nan_TW. Commit.
  • Fix leak in kstandardactiontest. Commit.
KContacts
  • Fix parsePicture. Commit.
  • Port to C++ ranges. Commit.
  • Use ranges for sorting CustomData, LineMap and ParameterMap. Commit.
  • Replace std::find_if with std::ranges::find. Commit.
  • Use default == operator where possible. Commit.
  • Add fuzzer gitlab job. Commit.
  • Fix an infinite loop when parsing QUOTED-PRINTABLE. Commit.
  • Setup ossfuzz. Commit.
  • Remove unimplemented methods. Commit.
  • Clean forward and includes. Commit.
  • Implement sounds for VCard4. Commit.
  • Use default copy constructor. Commit.
  • Vcardparser: Always quote AUTHOR according to RFC 9554. Commit.
  • Vcardparser: Fix parameter handling according to RFC 6350. Commit.
  • Use default copy constructor in Address::Private. Commit.
  • Export the QML plugin target for static builds. Commit. See bug #526728
  • Use own QUICK_TEST_MAIN executable. Commit.
  • Skip failing test on Windows. Commit.
  • Require passing CI. Commit.
  • Doc: Update doc to best practice. Commit.
  • Doc: Fix todo about license. Commit.
  • Vcardparser: Implement RFC 6868 parameter escaping. Commit.
  • Addressee: Fix qml api doc brief and add code example. Commit.
  • Qml: Improve qml integration and add tests. Commit.
KCoreAddons
  • Fix documentation markup. Commit.
  • Fix documentation comment location. Commit.
  • Docs: Fix since version KFormat::formatDateTime. Commit.
  • Clean forward and includes. Commit.
  • KSDCMapping: unmap the shared memory segment only once. Commit.
  • CMake config file: ensure ECM's Inotify find module w/ static builds. Commit.
  • Fix documentation sentence. Commit.
  • Kformat: skip secsTo() for a date three or more days from today. Commit.
  • Kformat: count the relative day in the time zone of the date. Commit. See bug #525915
  • Autotests: wait for a later timestamp instead of a new second. Commit.
  • Kdirwatch: tell apart two changes made within one second. Commit.
  • Add new methods for formatting QDateTimes. Commit.
  • KDirWatch: use wide Windows stat calls for Unicode paths. Commit.
KCrash
  • Reuse: move autotest fixtures to REUSE.toml. Commit.
  • Coreconfig: support socket patterns. Commit.
KDav
  • Clean forward and includes. Commit.
  • Share the code that turns a DAV href into a URL. Commit.
  • Resolve the Location header after creating an item or collection. Commit.
  • Provide a new implementation for replyErrorString(). Commit.
  • Port away from naked QNetworkReply::errorString. Commit.
  • Add a replyErrorString method to DavJobBase. Commit.
  • Add missing include. Commit.
  • Remove unused include. Commit.
  • Fail the collection fetch when a home set can't be read. Commit.
  • Add DavPushDontNotify to DavMoveJob. Commit.
KDBusAddons
  • Clean forward and includes. Commit.
KDeclarative
  • Doc: Fix import name for kquickcontrolsaddons. Commit.
  • Draganddrop: Mark enabled properties as explicit overrides. Commit.
KDNSSD
  • Remove unimplemented methods. Commit.
KDocTools
  • Updated Dutch user.entities. Commit.
  • Update Turkish entities. Commit.
  • Drop obsolete FOUND_VAR args to find_package_handle_standard_args. Commit.
KFileMetaData
  • Ossfuzz: Fix libzip build. Commit.
  • Ossfuzz: Compile brotli earlier since poppler also needs it. Commit.
  • Ossfuzz: Fix compilation of ebook-tools with newer cmake. Commit.
  • Ossfuzz: Disable harfbuzz in poppler for now. Commit.
  • Oss-fuzz: Get a newer cmake from pip. Commit.
KGlobalAccel
  • Remove unimplemented methods. Commit.
  • Introduce org.kde.kglobalaccel.Component.{pressed,repeated,released}. Commit.
KGuiAddons
  • Fix bug 425562: Edit Identity > Help Button = Wrong URL. Commit.
  • KCountryFlagEmojiIconEngine: Fix HiDPI rendering. Commit.
KHolidays
  • (pre-commit) Give guidance to markdownlint on the nodejs version to check against to keep it happy. Commit.
  • Export QML plugin target and make it linkable in static builds. Commit. See bug #526728
  • Clean forward and includes. Commit.
  • Comment markdownlint-cli. Commit.
  • Pre-commit - autoupdate. Commit.
  • Holidays/holidays.qrc - consistent indentation (whitespace). Commit.
  • Add holiday files for Saudi Arabia. Commit.
  • Format/lint all xml files and add pre-commit to enforce that. Commit.
  • Pre-commit autoupdate. Commit.
  • Pre-commit - keep yaml tidy with yamlfmt. Commit.
KI18n
  • Export the QML plugin target for static builds. Commit.
  • Make KI18nLocaleDataQmlPlugin linkable in static builds of dependants. Commit.
  • Use std::setlocale instead of setlocale. Commit.
  • KF6I18nQml: place headers in separate include dir KI18nQml, not KI18n. Commit.
KIconThemes
  • KIconLoader::loadScaledIcon(): fix default arg size to null, not invalid. Commit.
  • Kiconloader.h: KIconLoader::loadScaledIcon() - Fix ambiguity of. Commit.
  • Drop unneeded and broken reset of QSize argument. Commit.
  • Export the QML plugin target for static builds. Commit. See bug #526728
  • KIconDialog: drop code variant for Qt < 6.10. Commit.
KIdletime
  • Remove unimplemented methods. Commit.
KImageformats
  • Make anitest and pictest load the built plugins. Commit.
  • Autotests: Add JXL lossy RGB test image. Commit.
  • JP2: fix Heap-use-after-free READ. Commit.
  • Heif: remove unnecessary call. Commit.
  • DDS: Limit the maximum number of images to 32. Commit.
  • Fix memory leak of SGI row tables on repeated read()/write(). Commit.
  • Fix qBound. Commit.
  • Update to the OSS-Fuzz test to verify all animations. Commit.
  • EXR: support for lossy HTJ2K quality introduced in OpenEXR 3.5. Commit.
  • Ensure that the palette does not have more than 256 values. Commit.
  • Clean forward and includes. Commit.
  • PSD: Iterate directly over the QHash instead of creating a temporary. Commit.
  • Fix overflow in DBODChunk::strideSize. Commit.
  • IFF: set every pixel of each line. Commit.
  • ANI: bound previousImage in nextImageDelay(). Commit.
  • Increase single test timeout due to continue failure of some CIs. Commit.
  • Fix oss-fuzz compilation error. Commit.
  • DDS: add DX10 BC6H support. Commit.
  • PCX: set every pixel of each line. Commit.
  • RAS: unpack 1-bit images with a color map. Commit.
  • DDS: simply use 0 for blue channel for readATI2(). Commit.
  • DDS: vendoring and using bcdec.h for DDS BC decompression. Commit.
  • IFF: fix stack overflow in PLTEChunk::count(). Commit.
  • MicroExif: fix wrong software tag in MicroExif::fromImage. Commit.
  • Revert "Disable LSAN due to obsolete JXRLIB on CI". Commit.
  • DDS: add DX10 BC4/BC5/BC7 support. Commit. Fixes bug #524495
  • Expose the underlying library version in the image metadata. Commit.
  • Heif: apply all rotation and mirror combinations. Commit.
  • Fix packbits for unsigned-char platforms. Commit.
  • Heif: reject large images prior decoding. Commit.
  • Fix jxrlib detection with vanilla jxrlib. Commit.
  • Ossfuzz: use baseline SIMD for libjxl. Commit.
  • Fix for alpha channel handling and sRGB color profiles. Commit.
  • Ossfuzz: update dependencies. Commit.
  • Oss-fuzz: Get a newer cmake from pip. Commit.
  • Enable perceptiveFuzzer for write tests. Commit.
  • EXIF: always use little-endian for UTF-16. Commit.
  • Avif: increase fuzziness in invalid-exif.avif.json to 44. Commit.
  • IFF: fix BODYChunk::deinterleave on big-endian. Commit.
  • IFF: fix DBODChunk::strideRead on big-endian. Commit.
  • TIM: fix 16BPP on big-endian. Commit.
  • FF: replace broken #if Q_LITTLE_ENDIAN. Commit.
  • Disable LSAN due to obsolete JXRLIB on CI. Commit.
KIO
  • Remove superfuous comments. Commit.
  • KUrlNavigator: Draw a panel, not frame. Commit.
  • Listjob: only build the url of a folder to recurse into. Commit.
  • Kioglobal_p: reject the MS-DOS characters in local folders on Windows. Commit. See bug #414478
  • Knewfilemenu: refuse a name that the file system of the folder rejects. Commit. See bug #414478
  • Copyjob: move the MS-DOS file name checks to kioglobal_p. Commit.
  • Kcoredirlister: keep an update job on the folder it updates. Commit. Fixes bug #507185
  • Kmountpoint: add isOnRemoteStorage and deprecate probablySlow. Commit.
  • Kfileitem: add isOnRemoteStorage and deprecate isSlow. Commit.
  • KFileWidget: Allow providing a custom state config. Commit.
  • Core/job: Don't squeeze the job url for its description. Commit.
  • FileUndoManager: Set total/processed file counts. Commit.
  • Openurljob: treat x-ms-dos-executable as a native binary only if binfmt_misc is enabled. Commit.
  • Remove unimplemented methods. Commit.
  • File_unix_copy: align copy_file_range calls on 8 MiB. Commit. Fixes bug #458001
  • Core/copyjob: Fix job tracker missing title when moving files. Commit.
  • File_unix_copy: copy with sendfile() between two filesystems. Commit.
  • Jobtest: skip chmodFileSetAcl where the system cannot set its ACL. Commit.
  • PasteDialog: Disable OK button when filename is empty. Commit. Fixes bug #438519
  • File: write back the data of put() as it arrives. Commit.
  • File_unix_copy: stop waiting for a window when the copy is cancelled. Commit.
  • File_unix_copy: give every slow mount a writeback window. Commit. See bug #423187
  • Jobtest: test a copy that writes back window by window. Commit.
  • File_unix_copy: flush a large file copied to a removable device. Commit. See bug #281270
  • File_unix_copy: write back copies to slow destinations as they go. Commit. See bug #281270. See bug #423187
  • Copyjob: show which source a move deletes after the flush. Commit. See bug #281270
  • Copyjob: flush a removable device when the copy fails or is cancelled. Commit. Fixes bug #281270
  • Jobtest: test a move to a destination with a local target URL. Commit. See bug #281270
  • Copyjob: record a kept source for undo once it is deleted. Commit. See bug #281270
  • Copyjob: delete moved sources after the flush of a removable device. Commit. See bug #281270
  • Copyjob: write a copy to a removable device before reporting success. Commit. See bug #281270
  • Improve presentation of url in "Create New Folder" dialog. Commit. Fixes bug #527768
  • PasteDialog: add icons for unregistered formats. Commit.
  • PasteDialog: Replace mismatched initial suffixes. Commit.
  • Kde-ci.yaml: use-ccache. Commit.
  • Filecopyjob: keep the metadata that the worker sent for the copy. Commit. See bug #281270
  • File: add a command that flushes a folder on a removable device. Commit. See bug #281270
  • File: report a copy to a removable device. Commit. See bug #281270
  • Kmountpoint: tell whether a mount is on a removable device. Commit.
  • Filepreviewjob: try again to remove a local copy that is still open on Windows. Commit.
  • Copyjob: stat a source folder that is cached only as a listing root. Commit. Fixes bug #527143
  • Kfileitemactions: use the plural for several selected folders. Commit. Fixes bug #527485
  • Filepreviewjob: remove the local copies of remote files that previews leave. Commit. Fixes bug #527064
  • DropJob: Actually copy QMimeData formats. Commit.
  • DropJob: Only consider hasArk when DBus is available. Commit.
  • File_unix: replace a symlink in one rename. Commit.
  • File: set the owner and the times of a put on the open file. Commit.
  • File: set the modification time to the millisecond. Commit.
  • File: replace the destination of a put in one rename. Commit.
  • Filesystemfreespacejob: report sizes no filesystem has as unsupported. Commit. See bug #431050. See bug #503640
  • Copyjob: give a copied folder the user extended attributes of its source. Commit. See bug #527182
  • Kdirmodeltest: report a lost rename instead of failing the tests after it. Commit.
  • File_unix: let the kernel refuse an existing destination of a rename. Commit.
  • Kfileitem: find the mount of a listed item by its mount id. Commit.
  • File: only send a unique mount id as UDS_MOUNT_ID. Commit.
  • Kmountpoint: read a mount by its unique id with statmount(). Commit. Fixes bug #272361. See bug #513176
  • Jobtest: let safeOverwrite see dest.part during the copy. Commit.
  • Kmountpoint: compile the mount id cache only with STATX_MNT_ID_UNIQUE. Commit.
  • File_unix_copy: remove unused s_maxIPCSize variable. Commit.
  • File: read the free space without the volume label. Commit.
  • KEmailClientLauncherJob: Forward to Qt when sandboxed. Commit.
  • KEmailClientLauncherJob: Remove wrong documentation. Commit.
  • Filepreviewjobtest: test a standard thumbnailer with quotes in the file name. Commit.
  • Standardthumbnailjob: give the thumbnailer each file path as one argument. Commit.
  • FilePreviewJob: Override doKill and kill subjobs. Commit. Fixes bug #526997
  • KMountPoint: avoid path canonicalization before mount-ID lookup. Commit.
  • Renamefiledialog: Show inline warnings in Rename File dialog for file type change and hidden files. Commit.
  • Favicontest: use a local http server instead of web sites. Commit.
  • Faviconscache: find the icon of a site on a non-default port. Commit.
  • Trash: fix the crash when a full trash deletes a directory. Commit. Fixes bug #520794
  • KDirModel: update the folder icons when the samba shares change. Commit.
  • Hold KSambaShare's private class in a std::unique_ptr. Commit.
  • Add a benchmark for the samba usershare load. Commit.
  • Do not resolve the samba interfaces when listing usershares. Commit. Fixes bug #466195. See bug #526668
  • Load samba usershares with asynchronous processes. Commit. Fixes bug #446923. Fixes bug #513329. Fixes bug #526668
  • DeleteOrTrashJob: make the confirmation transient for the window of the job. Commit.
  • Kpasswdserver: test that a wallet which never answers is given up on. Commit.
  • Kpasswdserver: stop waiting 24 days for the wallet to open. Commit. Fixes bug #526368
  • Kpasswdserver: do not ask a wallet that is switched off. Commit. See bug #526368
  • Open With: remember an unknown file under a type made for its extension. Commit. See bug #425154
  • File_unix: read a directory before deleting from it. Commit.
  • Kpropertiesdialog: Report progress and properly cancel checksum calculation. Commit.
  • File: create the destination of a copy before looking at it. Commit.
  • File: adapt the copy_file_range chunk size to how long a call takes. Commit.
  • Filewidgets/KUrlNavigatorMenu: close when drag operation leaves menu or button. Commit. Fixes bug #526048
  • Kmountpoint: Update fstypes from util-linux. Commit.
  • KFileDialog::getStartUrl(): Support the "kfiledialog:///keyword/filename" case. Commit.
  • KDirModel: show the modification time in local time. Commit. Fixes bug #525915
  • Add commit-checks to kde-ci.yml. Commit.
  • Drop obsolete FOUND_VAR args to find_package_handle_standard_args. Commit.
  • Filepreviewjobtest: check that the empty files are created. Commit.
  • Kemailclientlauncherjob: remove the unused addString lambda. Commit.
  • Kio_help: stop setting the libxml2 parser defaults. Commit.
  • Workerinterface: remove readFilesize_t. Commit.
  • Kmountpoint: put parentheses around the fuse check in probablySlow. Commit.
  • Filewidgets/kurlnavigatorbutton: drop to UDS_TARGET_URL when protocol provides it. Commit. Fixes bug #440941
  • Autotests: give kfilewidgettest three minutes. Commit.
  • Kdirlistertest: give testSFTPRedirect two seconds to complete. Commit.
  • Kfileitemactions: allow plugins to receive a QObject parent for their actions. Commit.
  • Autotests: run the delete-or-trash job test on Windows. Commit.
  • Trash: add a Windows recycle-bin worker test. Commit.
  • Trash: implement the recycle-bin worker on Windows. Commit. Fixes bug #441218
  • Autotests: build deletejobtest on Windows. Commit.
  • Deliver the kill of a job to its worker process on Windows. Commit.
  • File_win: remove a directory as soon as it is empty. Commit.
  • BatchRenameJob: don't drop the tail of a name after a non-extension dot. Commit. Fixes bug #492660
  • Deletejobtest: kill the recursive deletion only after a byte report. Commit.
  • Drop code variants for Qt < 6.10. Commit.
  • File_unix: stat listed entries relative to the directory. Commit.
  • File_unix: stat entries with an unknown d_type in a basic listing. Commit.
  • KFilePlacesViewTest::testUrlChanged: fix memory leakage of model. Commit.
Kirigami
  • Primitives: Stabilize icon alignment during window resizing. Commit.
  • Dialog: Hide footer separator if there is no footer. Commit.
  • Make the Card version of From Entry work better when used in a normal ColumnLayout. Commit.
  • Layouts: only accept forward mouse button when such page exists. Commit. Fixes bug #494216
  • Mateial: Use non interactive scroll indicator with Material. Commit.
  • Primitives: Align node rect position of Icon to device pixel grid. Commit. Fixes bug #522336
  • FormAction: Don't fire twice on click. Commit.
  • Improve the look of switchs in Forms when using card mode. Commit.
  • Remove unimplemented methods. Commit.
  • Fix property documentation in TitleSubtitleWithActions. Commit.
  • Add Material implementation for OverlayDrawer. Commit.
  • Material: Fix background in AbstractApplicationHeader when using a dark theme. Commit.
  • AboutItem: Add showLibraries. Commit.
  • AboutItem: Hide the copyright separator and License card when empty. Commit.
  • AboutItem: Fix the "Report a bug" link. Commit.
  • AboutItem: Keep author names next to their avatar. Commit.
  • AboutItem: Reflow license texts. Commit. See bug #486305
  • InlineMessage: Update material design implementation. Commit.
  • Doc typo fix. Commit.
  • PageRow: Use application modality on macOS for dialogs. Commit.
  • Avatar: Put back the Avatar component in Controls. Commit.
  • Allow to trigger MenuDialog actions via AT-SPI. Commit.
  • WheelHandler: don't transpose the delta on wayland as well. Commit. Fixes bug #526317
  • WheelHandler: don't transpose the delta on wayland as well. Commit. Fixes bug #526317
  • Fix double action triggering when activating toolbar buttons via AT-SPI. Commit.
  • Material: Fix background color. Commit.
  • AbstractApplicationHeader: Provide an implementation for the Material style. Commit.
  • Material: Improve styling of the page header. Commit.
  • Add material version of Badge component. Commit.
  • Material: Fix disabled text color. Commit.
  • Provide implementation of NavigationTabBar for material. Commit.
  • Remove the no longer needed/used polyfill module. Commit.
  • Fix binding loop for y in Dialog.qml. Commit.
  • PageRow: Remove warning, null is an object. Commit.
  • Controls: use toolTipDelay in ActionTextField. Commit.
KItemModels
  • Remove unimplemented methods. Commit.
  • Clean forward and includes. Commit.
  • KRearrangeColumnsProxyModelTest: give shouldNotNestReset's connection a context object. Commit.
KMime
  • Oss-fuzz: Get a newer cmake from pip. Commit.
KNewStuff
  • Httpworker: let the compiler do the literal concatenation. Commit.
  • KNewStuffQuick::CommentsModel: drop code variant for Qt < 6.10. Commit.
KNotifications
  • Add support for reciving an activation token with the portal backend. Commit.
KPackage
  • CMake config: drop no longer used template variable. Commit.
KParts
KPeople
  • Remove unimplemented methods. Commit.
KQuickCharts
  • Controls/LegendDelegate: don't override default font features. Commit.
KRunner
  • Remove unimplemented methods. Commit.
  • Clean forward and includes. Commit.
  • Add test for the DBus runner desktop metadata fields. Commit.
  • DBusRunner: expose full plugin metadata from the desktop file. Commit.
  • Fix flaky ThreadingTest::testDeletionOfRunningJob. Commit.
  • Revert "Enable LSAN in CI". Commit.
KService
  • Remove unimplemented methods. Commit.
  • Add cli test for KApplicationTrader. Commit.
  • Ensure consistent sorting of KServiceOffer. Commit. Fixes bug #525989
KSVG
  • SvgItem, FrameSvgItem, ImageSet: cache colors lookup result in ImageSet itself. Commit.
  • SvgItem, FrameSvgItem: look up colors once per image set. Commit. Fixes bug #501406
KTextEditor
  • Fix use-after-free when an edit removes a nested folded range. Commit.
  • Fix out of range reads in the script document API. Commit.
  • Fix leak of the line layout of the bracket match preview. Commit.
  • Fix marks getting lost or moved twice when joining lines. Commit.
  • Fix double delete of a view when deleting a document with views. Commit.
  • Remove unimplemented methods. Commit.
  • Clean forward and includes. Commit.
  • Fix Kate snippet templates with empty tabstops and selection overwrite. Commit. Fixes bug #478303
  • Explicitly ignore return value from sonnet. Commit.
  • Vi-mode: Keep existing selection when entering Visual Mode. Commit. Fixes bug #526924
  • Fix minimap overflow with ranges ending behind the line end. Commit.
  • Refuse to save as a file that is open in another document. Commit. See bug #521546
  • Check for an already open file in all save as dialogs. Commit. See bug #521546
  • Ask to close the other document when saving as a file that is open. Commit. Fixes bug #521546
  • Clear the undo history before auto reloading a file changed on disk. Commit. Fixes bug #523615
  • Tests with ASAN on FreeBSD are very slow. Commit.
  • Don't iterate the group lists while modifying them. Commit.
  • Rendering: fix caret rendering for line height scaling. Commit. Fixes bug #524760
  • Drop obsolete FOUND_VAR arg to find_package_handle_standard_args. Commit.
  • Fix -Wunnecessary-virtual-specifier warnings. Commit.
  • Simplify the match code a bit for the selection highlighting. Commit.
  • Fix compile by adding missing default search flags to call. Commit.
  • View: match exact character sequences for selection occurrence highlights. Commit. Fixes bug #487095
  • Autotests: don't use single view mode. Commit.
  • Autotests: remove unused var. Commit.
  • Autotests: fix compile warnings. Commit.
  • Autotests: simplify setup. Commit.
  • Autotests: more explicit cleanups. Commit.
  • Autotests: more explicit cleanups. Commit.
  • KateViewEncodingAction: simplify code. Commit.
  • Autotests: more explicit cleanups. Commit.
  • Autotests: better permission reset before cleanup. Commit.
  • KateScrollBar::contextMenuEvent: drop no longer needed Qt version check. Commit.
  • Drop no longer needed Qt < 6.10 operator""_sv polyfill. Commit.
KTextTemplate
  • Remove unimplemented methods. Commit.
  • Use default locale rather than system locale by default. Commit.
KTextWidgets
  • Remove unimplemented methods. Commit.
  • Fix LSAN failure in kreplacetest. Commit.
KUnitConversion
KUserFeedback
  • SingleRowFilterProxyModel: drop code variant for Qt < 6.10. Commit.
KWallet
  • Ksecretd: exit session-scoped instances when their logind session closes. Commit.
  • Remove unimplemented methods. Commit.
  • Improve new wallet onboarding. Commit. Fixes bug #353960
  • Drop obsolete FOUND_VAR arg to find_package_handle_standard_args. Commit.
KWidgetsAddons
  • Remove unimplemented methods. Commit.
  • KMessageWidget: Draw the border 1px wide in all positions. Commit.
  • Update kcharselect-data to Unicode 18.0. Commit.
  • Kdatetable use en_US. "colour" -> "color". Commit.
  • Set KPageWidget's layout content margins to 0. Commit. Fixes bug #527178
  • KFontChooser: fix font feature setting. Commit. Fixes bug #523757
  • Kselectaction: Delete menu immediately. Commit.
  • KCapacityBar: Remove direct painter, use CE_ProgressBar instead. Commit.
  • High-contrast color scheme check helper: drop code variant for Qt < 6.10. Commit.
KWindowSystem
  • Clean forward and includes. Commit.
  • Platforms/wayland: Don't set a toplevel tag without the tag manager. Commit.
  • Platforms/wayland: Don't create a background effect to remove the blur. Commit. Fixes bug #522547
KXMLGUI
  • Add a test for dock state not being saved during startup. Commit. See bug #430969
  • KMainWindow: don't persist dock state until the window has settled. Commit. Fixes bug #430969
  • Restore KConfig shortcuts after refresh. Commit. See bug ##429743
Network Manager Qt
  • Remove unimplemented methods. Commit.
Prison
  • Drop obsolete FOUND_VAR args to find_package_handle_standard_args. Commit.
Purpose
  • Plugins/clipboard: make the name follow HIG. Commit.
QQC2 Desktop Style
  • Use SmoothPixmapTransformation for controls painting. Commit. Fixes bug #527335
  • Clean forward and includes. Commit.
Solid
  • Clean forward and includes. Commit.
  • Remove unimplemented methods. Commit.
  • Fstab: Add backend support for ceph and fuse.ceph. Commit.
  • Solid/UDisks2: read HintIconName from UDisks properties. Commit.
  • Drop obsolete FOUND_VAR args to find_package_handle_standard_args. Commit.
Sonnet
  • Core/settings: Add restore function to revert changes. Commit.
  • Fix outdated comment. Commit.
  • Unexport, devirtualize and de-pimpl Sonnet::TextBreaks. Commit.
  • Remove unimplemented methods. Commit.
  • Use a dedicated trigram type for language detection. Commit.
  • Add view-based speller API overloads. Commit.
  • Use QStringView in the spell checker plugin interface. Commit.
  • List dictionary languages only once when guessing language. Commit.
  • Aspell: Reduce allocation by half during spellchecking. Commit.
  • Make plugins findable prior to installation. Commit.
  • Don't leak Voikko instance. Commit.
  • Actually build manual tests. Commit.
  • Add missing docs. Commit.
  • Quick: Don't use red text when we can have squiggly line. Commit.
  • Unify static and dynamic plugin loading. Commit.
Syndication
  • Lazily initialize QCryptographicHash. Commit.
Syntax Highlighting
  • Tests with ASAN on FreeBSD are very slow. Commit.
  • C++: add #embed, __has_embed, contract_assert and indeterminate attribute. Commit.
  • Used same skipOffsetId for identical keyword list. Commit.
  • SkipOffsets cache now shares the same identifier for identical regexps. Commit.
  • Share QRegularExpression across all rule instances. Commit.
  • Groups all the rules into a single container to eliminate the shared_ptr. Commit.
  • Rename HighlightingContextData to HighlightingData. Commit.
  • JSON5: add Unquoted Key and fix unicode regex. Commit.
  • JSON: fix unicode regex. Commit.
  • CSV: auto detect separator and merge all contexts to have only one theme configuration. Commit.
  • Add optional counter with #pop in a context. Commit.
  • Drop no longer needed Qt < 6.10 operator""_sv polyfill. Commit.
Threadweaver
  • En_gb -> en_us. "behaviour" -> "behavior". Commit.

Kwi has continued to mature at a fast clip over the past week, with many a bug slain and a significant amount of UI refinement.

Exciting news also from our important upstream, the Ghostty project: Earlier than we had anticipated, libghostty-vt was released in version v1.0 on the weekend. This provides Kwi with a stable API/ABI from our headless terminal emulation backend, which will greatly aid distros and packaging efforts in particular.

For the Ghostty project this is the culmination of a solid half-decade of work - congratulations to mitchellh and many other contributors over there!

Progress Tracker

  • Terminal:
    • Shift-click now extends selections, just like in Konsole (feature request #528514)
    • Sharper, better rendering of geometric symbols at fractional scales
    • Improved grid size calculations at fractional scales
    • Improved font baseline placement
    • Additional performance improvements in text rendering
    • Configured SSH aliases/hostnames are now used in tab titles instead of resolved IPs; this was filed as a regression defect against Konsole we fixed in Kwi (bug #524673)
    • Fixed a greyscale glyph placement bug that caused e.g. Noto Sans Mono's i character to act up when LCD filtering was disabled in the text renderer (bug #528550)
  • Tab bar:
    • New output causes background tabs to get colorful title text to communicate activity, à la Konsole (feature request #528658)
    • Dragging files, URLs and similar over tabs now raises them after a brief delay, to make it easy to drop those contents into the tab (feature request #15)
    • On popular request, the tab bar is now overall significantly more compact (on Matrix and reddit, and in other places)
    • Tab button contents are laid out more pleasingly
    • Ditto for tool buttons on the tab bar
    • As a small cleanup, the typically redundant default tab icon is no longer shown; special status icons remain (by popular request on Matrix)
    • Icons that are line art (e.g. many symbolic Breeze icons) are now colorized to match the tab title text (which goes nicely with the above activity coloring)
    • If the window is fullscreen, care is taken that tab buttons are proper click targets at the screen edge (c.f. good old Fitts' law) (bug #528546)
    • Default tab switching shortcuts now match Konsole's (both primary and alternate; requested on Matrix)
    • The bottom divider below the tab bar now looks better and more consistent with other KDE apps at fractional scale
    • A window's terminal grid size is now preserved correctly when the window is moved between screens with different fractional scales (bug #528515)
  • Other UI:
    • Kwi now supports the "Find Action" dialog that many other KDE apps offer (similar to a Command Bar in other apps), available via the standard Ctrl+Alt+I shortcut (requested on reddit)
    • The background opacity slider now uses a less granular tick step to make it look less busy, and space for its label is reserved so the slider doesn't change width during use
    • All windows now share a single QML engine, slightly improving resource usage
  • Portability:
    • Sandboxed Kwi (Flatpak) now works on certain NixOS, and potentially other, systems with unusual PATH/filesystem setups (bug #528754)
    • Kwi now works on BusyBox-based systems (by using the portable timeout -s instead of timeout --signal=; reported on Matrix)
  • Dependencies:
    • Bumped our libghostty-vt dependency first to v1.0, then to v1.0.1
  • Project bits:
    • Updated the example screenshot for Kwi's KDE apps listing (note: the CDN updates these only very slowly)

Additionally, because Kwi is built on KDE's latest technologies, we sometimes get to find and fix bugs upstream of the project, or contribute new features needed by Kwi.

Upstream This Week - by Kwi, for everyone:

  • We fixed a bug in KDE's KDBusAddons library so that running Kwi from a terminal will open the new window in the terminal's current working directory, even if Kwi is already running (MR #75, bug #528661).
  • We fixed a bug in KDE's Kirigami UI library that made it impossible to configure Alt+Arrows as shortcuts in Kwi (MR #2234, bug #528659).
  • We worked on components in KDE's Kirigami Application Components UI Library to allow the "Find Action" action dialog to work in apps which can open multiple windows, along with enabling some code cleanups/reductions in Kwi (MR #27).
  • Further in Kirigami Application Components, we fixed a bug that made it hard to search for certain actions using the search field in the "Find Action" dialog (MR #26).
  • One more in Kirigami Application Components, we have a contribution remaining in flight that will fix invoking actions in the dialog using the Enter/Return keys (MR #29).
  • In KDE's Breeze UI theme we fixed the rendering of slider tickmarks at fractional scale (MR #649), as seen in Kwi's Settings dialog.

Update on Release

As mentioned last week, Kwi continues to undergo the "KDE Review" process at the moment, a community quality gate through which it will graduate to become an official KDE project. While we have already completed the required checklist, the minimum mandatory duration is two weeks. Kwi will complete this on November 18th.

Shortly thereafter we plan to tag a v0.1 release and publish to Flathub!

Outlook

Also mentioned last week, we're working on a way to make it easy to switch classic KDE apps such as Yakuake and Dolphin to embed Kwi.

While the Kwi-side bits have been in place since its initial publication, this is mainly about providing a central setting to make this easier for users (currently it requires fiddling in the filesystem). We now have a prototype implementation, and plan to submit a merge request to the relevant KDE project (roughly in the dependency stack of System Settings) soon.

Now the bad news: Expect Kwi development to move a bit slower in coming weeks, and focus mainly on important bug fixes. There may even be a brief interruption in this newsletter! The reason is brief interruption by work on other projects related to things nearly as old as UNIX terminals.

Once we are back to full capacity, we plan to begin work in earnest on the implementation of the much-requested Split Panes.

Thursday, 12 November 2026

KDE e.V., the non-profit organisation supporting the KDE community, is looking to hire a software engineer to help improve the software stack that KDE software relies on. Please see the call for proposals for more details about this contract opportunity. We are looking forward to your application.

The full call for proposals has more details.

Wednesday, 11 November 2026

It has been brought to the attention of the KDE security team that NeoNova Animated Wallpaper (https://github.com/abbygraceton1992/NeoNova-KDE-Wallpaper) is shipping malware.

This report came from Serg Star who spotted it reviewing this code. It's great that we have people spotting this stuff, though it may be too late for some.

The Malware

The package looks very legit, its an animating wallpaper that works as advertised, they even did later commits on top adding configuration options!

However since the initial commit the code has been shipping hidden malware.

A script (hidden in a base64 string in a base64 string) makes a web request to download an "image", which is another bash script which in turn downloads a libary .so file into ".config/Plasma6Library.so" and launches it via LD_PRELOAD=~/.config/Plasma6Library.so sleep 999999
The payload thus far looks like this: https://github.com/BishopFox/sliver which is designed to allow remote control.

If you have installed this wallpaper, a good test would be checking for .config/Plasma6Library.so and I would suggest starting anew.

What Happens Now

There is only so much we can do with 3rd party content. We have reported it to all relevant places including Pling and OpenDesktop who have taken swift action within hours of us getting the report.

It it a stark reminder to be vigilant and wary when installing external content from other sources especially those that run in unsandboxed contents, and a reminder to those of us working on the Linux desktop to continue working on technologies that allow for safer and better distribution.

New release for plank-player, aura-browser and bigscreen-ui

Wow, new releases! We are releasing applications and a new UI framework this month.

Bigscreen UI is a library of shared Qt Quick components to build applications for TV, built on Kirigami.

Plank Player and Aura Browser were originally released as part of the Plasma 5 release schedule. We have updated them to use Bigscreen UI, and released them independently for now. The eventual goal is to move them to the KDE Gear release schedule.

LocationSha256 Sum
plank-player-26.11.02cea69c6790546c1e4d19cf6a8320be28c780f5856993e78683fe1640eb49d66
aura-browser-26.11.00f5007e4e665874020c3042a2c7a914898516e91a385be20144f437ea7ef77be
bigscreen-ui-0.1.0c19186dd22c3c4e9fa7dcc76e87ef995d1a78f5d0d79f4788f85e221ce6a1ca3

Bigscreen UI

bigscreen-ui is a new library of UI components to build applications for Plasma Bigscreen, with a focus on making it easy to implement arrow navigation for remote control. The components were extracted out of the ones used in the Plasma Bigscreen shell, now decoupled for application development purposes.

Learn more about it on GitLab, and see the example application. We plan on introducing official documentation as the API stabilizes.

Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>

Aura Browser

Aura Browser is a web browser for Plasma Bigscreen, with a focus on making it easy to navigate pages with a remote.

Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>

Plank Player

Plank Player is a media player for Plasma Bigscreen. Users can either browse media via the homescreen, or invoke the application directly on the media. It is built on Qt Multimedia, which brings support for other features such as subtitles and audio tracks.

Screenshot of <nil>
Screenshot of <nil>
Screenshot of <nil>

Tuesday, 10 November 2026

One of the big things I wanted to achieve during this HDR project is to have a decent tone and gamut map filter, something Krita never had all these years, in spite of us having unbounded floating point editing as well as color management via LCMS that works with this unbounded floating point.

The unbounded floating point allows us to have values that might be (0.0, 0.5, 1.0) in linear rec2020, and then when converted to linear sRGB this becomes (-0.37, 0.56, 1.0). Now, the range of each channel here is [0 1], so if we try to represent that as an inbounds sRGB colour (which we need to do if we want to save for web), the default behaviour is to clip the out-of-bounds values, so we get (0.0, 0.56, 1.0). This changes the proportion between the blue and the red and green channels, meaning the hue and saturation will shift. In some cases, it can cause colours to gradually shift to values like (0.0, 1.0, 1.0). This is, for example, why your phone camera won’t shoot that lovely orange sunset just right: The colors are too colourful and get pushed towards yellow due clipping. So to combat this, you do gamut mapping: you shift the colour in bounds by a certain algorithm before or after doing the conversion.

Gamut Mapping

The most common gamut mapping algorithm is chroma-reduction. This assumes that the target space and the source space have their greys at the same location (taking into account white point adaptation). Then, the colors are converted to a third space, a opponent color space that also has its greys in the same location.

Opponent color spaces are spaces where the luminosity are separate from the chromacity and hue, and the chromacity and hue themselves are expressed as a red-green and a yellow-blue contrast, following the opponent theory of human color vision. A typical example of an opponent color space is LAB, but there’s many others, like YCbCr, ICtCp and OkLAB. These opponent colorspaces can then be translated to a Hue, Chroma and Luminosity space by treating the red-green and blue-yellow contrasts as Carthesian coordinates, and converting those to polar coordinates, giving us hue as the angle, and chroma as the length.

Then, for chroma reduction, you do a binary search to find the edge of the gamut, with each iteration, increasing the chroma or decreasing it, until the difference between the desaturated color, and the clipped version of the color is below a significant difference. That significant difference is called the minimum delta E, E being the name given to color difference by itself.

Shown above: a slice of LAB chromacity plane, with a black-to-white gradient diagonally. The first image is plain clipping to sRGB, while the second uses chroma reduction gamut mapping. In the first image, the chroma of the colors bottomleft and topright are so bright that when clipping they end up way with the wrong luminosity than they should have in reality. By doing chroma reduction, we pull these colours so far back in that their luminosity is preserved.

Krita implements CSS-4’s chroma reduction method, and offers it with 3 different opponent spaces: LAB, ICtCp and OkLAB.

This is because the delta E calculation for LAB is a little off, in particular, LAB is known to give weird results with the blue, with bright blues looking a little purple in LAB. ICtCp and OkLAB are much more modern and are particularly designed to have much better handling of the blue hues, which is visible in the gamut mapping:

3 pictures of a very blue cityscape. The first is slightly puplish and marked "LAB", the second is a bit more cyanish, and marked "ICtCp", the final is more blue and marked as "OkLAB".

ICtCp and OkLAB also had the advantage of being possible to implement in an ad-hoc manner starting from XYZ, so I didn’t need to integrate them directly into our color management system yet.

Besides binary search, there’s the cusp method. Here, you figure out the luminosity and maximum chroma of a given hue (the cusp), and use that to approximate the gamut boundary. There’s two ways to calculate the cusp:

The first is to use 6 polynomials, but that method only works with OkLAB as the opponent space and target RGB spaces that are matrix shapers. This in turns had to do with the simplicity of OkLAB as a colour space compared to other opponent spaces.

The second is to create a look up table of cusps per hue. Here, you take the known cusps in the target colour space and convert them to the opponent space to get their chroma and luminosity. This works for both CMYK and RGB spaces, as we know the likely cusps for those: Red, Yellow, Green, Cyan, Blue and Magenta and the interpolations between those. It also works with LAB, ICtCp and OkLAB equally. I went with this second method for now, but the first method is going to be more precise, and is worth investigating.

With the cusp for a given hue, you can then draw a triangle, going from black, to the cusp, to the reference white of the target space (important to keep in mind when combined with ICtCp-pq!), and back to black. The maximum chroma for a given lightness can then be derived by calculating the intersection between the current chroma and luminosity, and the zero chroma (grey) version of said luminosity.

Both the CSS4 gamut edge seeker algorithm and Ottoson’s algorithm use a curved top (cusp to reference white) section for the triangle here, but I am skeptical that this is strictly necessary. The colour only needs to be pushed into gamut enough so that once you clip it doesn’t cause massive hue and luminosity changes.

The interesting thing about the cusp method is that with the location of the cusp, you can decide to not just intersect with the grey of a given luminosity, but instead draw the line slightly towards the luminosity of the cusp. Bjorn Ottoson has a blogpost with experiments demonstrating this, and while not right now implemented in Krita, I would like to give it a go in the future as it can give more chromatic results.

There’s other methods. Scaling (“chroma compression”) methods, for example, generate a histogram of chromacity and lightness at a given hue-angle in the input image, and then the same for the target gamut. The resulting algorithm then doesn’t need to do any binary search, but can just scale the chromacity of the input by taking the maximum source chroma and scaling it by the maximum target chroma. This is also not yet implemented in Krita, but it might be interesting for CMYK output. Technically this is what ICC’s perceptual and saturation intents are all about, but those suffer from being too generic: a desaturated image that is fully in-gamut for the target space will get treated with the same lookup table as a fully saturated image, leading to odd results. A image-specific filter might give much better results.

Finally, when the target space is greyscale, we don’t bother with either method and just set the saturation to 0.

A sparkly orb in greyscale. At the top it shows the gamut mapping filter set to a greyscale profile.

Tone Mapping

Tone mapping is a subset of gamut mapping, where we only try to get the full range of tones (luminosity) into a target range. This is used to prepare HDR images for SDR output.

This is typically done by applying a so-called “filmic” curve. The name “filmic” derives from these curves mimicking real world chemical film’s tone properties, which when mapped onto a graph somewhat resembles a flattened “S”. The top part of this S-shape is referred to as the “shoulder” and the bottom part the “knee”, or, because it is quite tiny compared to the “shoulder”, the “toe”.

Two pictures of a HDR image of a blue orb with sparkles. The first image is overlit, the second underlit, each showing different parts of the image more correctly.

In the following section I’ll be using a picture of a blue orb on a grey background with some sparkles. I drew the original image on an HDR display, and it’s brightest highlights are around 8.0 (8 times higher than the reference white). Because most people don’t own a HDR display, I’m not going to try and share the image. Instead, I’m sharing the above image with two different exposures: The first is 0 exposure, it just clips all the colors. The second is with -2 exposure, showing how the highlights are supposed to look, but now the shadows are too dark. What we are looking for in the following images is that the sparkles are distinct from the highlight on the orb. That the blues look nice and don’t hue shift too much and that the shadows are not too light or too dark.

When looking for curves to implement, I wanted to have curves that were user configurable. So the first curve I implemented was the extended Reinhard curve. This is a pretty well known solution and the curve allows selecting the maximum white that gets mapped to 1.0. While it has a nice shoulder, it doesn’t have a knee or toe of any kind, which means it loses the contrast that is present in the HDR image.

The blue orb with reindhard tonemapping applied. The highlights are a little too bright, but the sparkles are distinct from the rest of the orb and the shadows not too dark. Filter is visible at the side.

I then briefly looked at the Hermetic Filmic Curve as described by bt 2390-8, which has both a shoulder and knee. However, that one is applied in the PQ transfer instead of linear light, and the PQ transfer requires decisions about the brightness of the reference white, so I wasn’t sure how to do that one properly.

Then, I came across John Hable’s Piecewise Filmic Curve: A very configurable curve which has various parameters for editing the shoulder and toe. It takes a bit to configure, but as you can see, once configured, it preserves the contrast quite well:

The blue orb with the piecewise filmic tone map filter applied. The filter window is visible at the side with the precise inputs.
The orb itself now had much better contrast between the highlights of the orb and it's sparkles.

I implemented both curves on top of LAB, and xyY. This means that they’re applied to the luminance channel only.

Frequently, you will see the discussion on whether to apply the tone mapping to individual channels, or to apply it to a Luminance channel only. The base argument for using individual channels is that it’ll give chroma reduction as the colour will get lighter. The argument for applying it on a luminance channel is that it is more radiometrically correct. Though, it is correct that the bright colors now become more chromatic.

This is because to get the luminance channel, the colors need to be converted to a opponent space (typically, xyY, for easy conversion). But, when dealing with ‘hdr’ colours, like (3.0, 2.0, 0), it is not just the brightness that is high, but also the chroma. When tone mapping in an opponent space, the chroma is untouched. This leads to overly chromatic colours near the bright highlights, and these chromatic colours differ per opponent color model:

The orb with only reinhard tonemapping applied in xyY and no gamut mapping. The sparkles now look vaguely cyanish.
The orb with only reinhard tonemapping applied in LAB and no gamut mapping. The sparkles now look very cyanish.

However, we already have a solution to reduce chroma: chroma reduction gamut mapping. So if you apply that after applying the tone mapping, the chromatic highlights get fixed:

The orb with both tone and gamut mapping applied. The sparkles are now white.

Is this better than per-channel tone mapping? I think it depends on the application. Gamut mapping can be quite slow, and isn’t exactly shader friendly, so I can imagine why real-time applications (game engines), would prefer per-channel tone mapping (which more or less does its own form of gamut mapping). Meanwhile, the results of luminance channel tone mapping plus gamut mapping afterwards gives much more chromatic results, which might be more interesting for illustrative works.

Similarly, per-channel mapping only works in a RGB context, and Krita has more models than that to support. By doing our tone mapping in an opponent space, we get the same results regardless of what colour space the image is in, which should make it nice and predictable to work with.

This is one of the reasons that Krita’s tone and gamut mapping filter share the same dialog (they can still be applied separately). The other reason is that we can reduce the amount of colour space conversions if we clump together the two transforms. Furthermore, experience tells me that illustrative artists tend to prefer a single filter here.

OCIO Lut baking

While I was pretty happy with the tone and gamut mapping filter, we were still missing something:

OCIO is the colour management library used by the vfx industry, and it’s strength lies in a big portable configuration that can be much more easily designed that a library of icc profiles. Due this, a well made OCIO configuration often has its own tone mapping solutions, and it would be good if Krita could use these too.

The first thing to decide is what we’re exactly baking. OCIO can be quite flexible, but the way it is implemented in Krita is that we have the standard pipeline provided by OCIO, where we…

  1. start off in the assigned color space
  2. go to the config’s preferred linear color space
  3. Apply the exposure.
  4. Apply the looks.
  5. Go to the display color space, apply the view transform.
  6. Apply the channel swizzle.
  7. Apply the gamma.

This made things a little tricky, as it is impossible to go from the display colour space back to the assigned image colour space. Furthermore, ideally we’d apply all transforms, including the view transform, so that we get an image that looks exactly like the one you see.

Initially I thought of reducing the scope, and creating a baking transform that applies everything in the config’s preferred linear space, except the view transform. This didn’t work out, as the gamma transform being applied linearly was too unintuitive.

So then, the next attempt was to apply the whole pipeline. This in turn means that the result is in the display color space. This too has some issues, as it requires the display space to be the exact same as the one selected in the preferences. Now, this is required anyway on wayland, as we have no way to determine from a given ocio display what we need to tag the wayland output as. But on the flip side, the default OCIO PQ transform is tied to 100 nits, and we do not yet have the ability to configure the nits level of Krita’s rec2100 PQ surfaces, so the look will remain a little off when using HDR output until we do have that kind of support.

For this reason though, we ask whether you want to convert from the display colour space to the image colour space, or keep the display colour space. That way, the baked result can be quickly saved as an untagged image, like png, and then wrangled by some external script.

The orb is now tone mapped with blenders' OCIO config. The image is overall more desaturated.

Above: Image baked with blender’s current ocio config, using the sRGB display device and the ‘aces 2.0’ view transform.

We’ve had this “Baking” of the config on our wishlist since OCIO was first integrated, so I’m pretty pleased we managed to get it in, even though it still has some papercuts.

Further Work

So, right now, Krita has a built-in tone and gamut mapping filter, which works on luminance, and OCIO lut baking, where the tone mapping generally works per channel. Overall, the OCIO lut baking is probably going to be best for film workflows, while the built-in filter is going to be useful for non-ocio workflows, or when the artist prefers the more chromatic results of the built-in filter.

Because the colourfulness is going to be the key quality of the built-in filter, it’ll be interesting to look at the other gamut mapping options, especially the adjustment-towards-the-cusp.

For CMYK workflows, the gamut mapping filter isn’t too useful right now, as most artists work in sRGB, and the clipping errors towards CMYK there are very rare. Chroma compression might be interesting to experiment with here, but that requires generating a histogram of the chroma over hue, and I’ll need to figure out how to do that while keeping the UI performant.

The built-in filter also doesn’t have adjustment layers enabled just yet. This is because once we allow it as an adjustment layer, we’ll need to always support it. And because there’s a ton of tone-mapping curves out there, and I want to have a period of experimentation before we commit to a particular set.

In the future, I might need to seriously look at splitting up the gamut and tone mapping filters. Benefits here are for example allowing per-channel filter anyway (which is now impossible because the filter tries to find a space that can both gamut and tone map). From further experimentation, I get the feeling that the desaturated results I got tie in strongly with the configuration of the curve, so with a user configurable curve it might get better results. Other things to consider is to allow other models for tone mapping besides LAB and xyY, as that leads to different chromatic colors being applied. At the same time, I don’t want to make this initial filter too complicated.

There’s also some image-aware tone mapping techniques out there. I haven’t investigated them enough though, so I have no idea if they’re useful for Krita’s purposes.

As for which of these is the correct one? That depends on the artist. Tone and gamut mapping are generally considered to be artistic operations, because there’s always trade-offs and only the artist can tell which trade-offs and qualities are acceptable. Hence why I am trying to find a good set of tools for artists to work with.

Appendix

Manually tone mapping.

So, you can sort of manually tone map in Krita, because it supports unbounded workflows. It is a little annoying however, with some pitfalls.

Firstly, you will want to take an HDR image, and scale it’s range into a [0 1] range. You do this by first color picking or using the HDR metadata tab to find the brightest pixel.

Then, you go into the select-a-color dialog by clicking the dual color button at the top. There, you type in the brightest channel value into each channel input. With your HDR color in hand, create a new layer, and fill it with this color. Then set the layer’s blending mode to “divide”. Now the whole image is in a [0 1] range. Then, you can either use the color adjustment filter or the levels filter to make everything visible again, but you will need to use the RGB adjustment, and not the lightness one, as the later goes through lab, and somehow that means everything gets desaturated.

The blue orb is now manually tone mapped. To the right of it is the layers docker, showing the different operations.

The mapping is quite successful with distinct sparkles from the orb's highlights and not too dark shadows. The hue of the highlights it s a little too cyanish however.

This generally desaturates the whole image a little, as it is a form of per-channel tone mapping, so I personally pump up the saturation after my levels corrections.

The other pitfall here is that it becomes really hard to get a good curve the higher the brightest white is, because the curve needs to be fine-tuned more and more to both get nice shadows and nice highlights at the same time. The tone mapping filter is easier to use, in this case.

Tagoross released AI Openness: How The Terms Relate, package 3 of 5. Its document and diagram show how AI openness terms differ, conflict and build on each other. It helps non-experts evaluate vendor lock-in and sovereignty risks of AI models.

Today KDE releases a bugfix update to KDE Plasma 6, versioned 6.8.3.

Plasma 6.8 was released in October 2026 with many feature refinements and new modules to complete the desktop experience.

This release adds two weeks’ worth of new translations and fixes from KDE’s contributors. The bugfixes are typically small but important and include:

View full changelog

Monday, 9 November 2026

Dear Qt community!

With only seven weeks left before 2026 gets branched into maintenance mode, we are pleased to open the nomination period for the Qt Champion 2026 award.

It has been one of those years! We've launched Qt Bridges, held an inspiring Qt Contributor Summit in Oslo and released Qt 6.12 - our first fully CRA compliant release. Through all of it, our community kept answering questions, reviewing patches, sharing knowledge, and generally holding the Qt universe together while the rest of us were busy rearranging the furniture.

Please help us recognize those outstanding contributors by nominating your favorite candidates:

https://wiki.qt.io/Qt_Champions_2026

We look forward to reading your nominations!

Cheers,
Axel