I'm Ajay Chauhan (Matrix: hisir:matrix.org), currently in my third year of undergraduate studies in Computer Science & Engineering. I'll be working on improving Kdenlive timeline markers for my Google Summer of Code project. I have previously worked on Kdenlive as part of the Season of KDE '24.
What am I working on for this year's GSoC?
Kdenlive currently supports single-point timeline markers, which limits efficiency for workflows that require marking time ranges, such as highlight editing or collaborative annotations. This project proposes enhancing Kdenlive's marker system by introducing duration-based markers that define a clear start and end time.
The project will extend the marker data model to support a duration attribute while maintaining backward compatibility. The UI will be updated to visualize range markers as colored regions on the timeline, with interactive handles for resizing and editing.
These markers will be integrated with key features like zone-to-marker conversion, search and navigation, rendering specific ranges, and import/export capabilities.
The problem that this project aims to solve is the need for efficient range-based marking functionality in Kdenlive's timeline (see issue #614). By implementing duration-based markers, the project will ensure that video editors can work more efficiently with time ranges for various workflows like highlight editing, collaborative annotations, and section-based organization.
My mentor for the project is Jean-Baptiste Mardelle, and I appreciate the opportunity to collaborate with and learn from him during this process.
Work Completed
Duration Handling in CommentedTime Class
The CommentedTime class, which represents individual markers, has been extended to support duration information. This change enables the range marker functionality throughout the application.
Implementation Approach
I added several new methods and properties to the CommentedTime class:
duration(): Returns the marker's duration as a GenTime object
setDuration(): Sets the marker's duration
hasRange(): Boolean check to determine if a marker is a range marker (duration > 0)
endTime(): Calculates and returns the end position (start + duration)
The class now includes a new constructor that accepts duration as a parameter, while maintaining backward compatibility with existing point marker creation.
// New constructor with duration support
CommentedTime(const GenTime &time, QString comment, int markerType, const GenTime &duration);
// New member variable
GenTime m_duration{GenTime(0)}; // Defaults to 0 for point markers
Previously, Kdenlive only supported point markers - simple markers that existed at a specific timestamp without any duration. I've now implemented range marker support, allowing users to create markers that span across time intervals.
Implementation Approach
The core changes involved extending the MarkerListModel class with several new methods:
addRangeMarker(): A new public method that creates markers with both position and duration
addOrUpdateRangeMarker_lambda(): An internal helper function that handles both creating new range markers and updating existing ones
Extended editMarker(): Added an overloaded version that preserves duration when editing markers
The implementation uses a lambda-based approach for undo/redo functionality, ensuring that range marker operations integrate seamlessly with Kdenlive's existing command pattern. When updating existing markers, the system intelligently determines whether to preserve the current duration or apply a new one.
// New method signature for range markers
bool addRangeMarker(GenTime pos, GenTime duration, const QString &comment, int type = -1);
// Extended edit method with duration support
bool editMarker(GenTime oldPos, GenTime pos, QString comment, int type, GenTime duration);
The model now emits appropriate data change signals for duration-related roles (DurationRole, EndPosRole, HasRangeRole) when range markers are modified, ensuring the UI stays synchronized.
Flexible Marking: Users can now create markers that represent time ranges, not just specific points
Better Organization: Range markers help users mark sections like "intro," "main content," or "outro" with clear visual boundaries
Preserved Workflows: Existing point marker functionality remains unchanged, ensuring no disruption to current users
Backward Compatibility
All existing marker functionality continues to work exactly as before. Point markers are simply range markers with zero duration, ensuring a smooth transition for existing projects and workflows.
Next Steps
In the upcoming weeks, with the core range marker backend in place, the next phase will focus on:
Integration with export and rendering workflows
UI components for creating and editing range markers
Visual representation of range markers in the timeline
Pride Month, better MobiPocket performance and progress in Chessament
Welcome to a new issue of "This Week in KDE Apps"! Every week we cover as much as possible of what's happening in the world of KDE apps.
This week issue is a bit special as it is also covering the past week as last Sunday some other contributors and me were busy at the KDE booth at the Umweltfestival in Berlin.
Additionally, as it is the beginning of Pride Month, I would like to take this opportunity to celebrate and acknowledge the invaluable contributions of LGBTQIA+ members within the KDE community. Their work, creativity, and dedication continue to enrich our project and foster a more inclusive and diverse environment for all.
This celebration is especially important at a time when many large tech corporations are rolling back their visible support for the LGBTQIA+ community. KDE and other grass roots organisations have your back!
Getting back to all that's new in the KDE App scene, let's dig in!
Stefan Brüns speed up the parsing of MobiPocket files considerably (25.08.0 - link 1, link 2 and link 3) and also fixed some parsing issues (link1 and link 2). These changes were implemented in QMobiPocket and improve the rendering speed in Okular for MobiPocket documents but also speed up Baloo indexing of these files and the creation of thumbnails in Dolphin.
Carl Schwan did some further improvements and reduced the number of temporary allocations (link 1, link 2 and link 3)
Carl Schwan fixed the detection of HTML inside mobipocket files (25.04.3 - link).
Sune Vuorela improved the scaling of stamps for annotations (25.08.0 - link). Now, when using a non-default sized stamp, the stamp won't appear pixelated anymore.
Volker added a departure details dialog. This dialog contains service alerts, occupancy information, vehicle amenities and the operator information when available (link), and published his bi-monthly blog post about all the changes in Itinerary, KTrip, Transitous and co.
Johannes Krattenmacher added ticket extractors for Stena, Viking and IHG (link).
Victor Blanchard added an off-by-default setting to automatically switch to icons view mode in folders with a lot of image or video files (25.08.0 - link).
Kai Uwe Broulik simplified how locations in window and tab titles for search results pages are displayed (25.08.0 - link).
Vladislav Kachegov fixed an incorrect view reset when unmounting similarly-named devices (link).
Joshua Goins made it possible to boost your own private post (25.04.03 - link), improved the tooltips for disabled polls and attachment buttons (25.08.0 - link) and did some small improvements to the multi account handling (link).
Joshua also limited the number of poll choice using the limit defined by the server (25.08.0 - link) and fixed a crash when clicking on "Mark as Read" on the notifications page (25.04.3 - link).
Anyone familiar with my blog will know that I like to write about incense. A reader wrote to me some time ago asking about what sticks I’ve been enjoying lately, and it occurred to me that it might be a nice thing to have a “now listening” type feature on my website, so that fellow incense heads could get a sense of the types of incense I like. After all, while I write plenty of incense reviews, they represent only a small percentage of the sticks, cones, powders, woods, and resins I’m burning or heating from day to day. (If you’re here for my incense content, feel free to skip this one and head to /now-burning to see the new feature!)
While it would have been simple enough for me to build a microblogging feature into my Eleventy website, the trouble was wanting to use it after it was built. Unlike using a CMS such as WordPress to make a website, I knew of no nice interface for Eleventy, or for that matter any SSG, that would help me create a post and publish it online without opening an IDE[1] and using the command line. Instead, the process looks something like this:
I don’t necessarily want to feel like a hackerman every time I decide to make a tiny status update. Also, I just noticed that I totally screwed up the frontmatter for that post.
As big of a nerd as I am, I’m just not going to want to do that multiple times a day for what amounts to a status post. This lead me to scour the internet looking for a solution: something that I could run on my own desktop or laptop that could build my site locally and push changes to my website, hosted the old fashioned way: as a bunch of text files sitting on a server accessible via SFTP. No needless complexity like running Eleventy on the server, or using a host like Netlify.[2] Surely there’d be something, right? Surely, the realm of SSGs can’t be without at least one nice, local user interface that people can use without being a web developer?
In the end, I did find one answer to the problem: Publii. Publii seems to be made predominantly with end-users in mind, however. It’s not just a local[3] CMS, it’s an SSG in its own right, which does me no good as I can’t make it work with my website[4]. So after coming up with nothing I could use, I gave the idea a rest for a while until I had the epiphany that I could solve the problem with a simple script using KDE’s KDialog to provide a rudimentary UI. So that’s what I did.
The idea was simple: a wizard-like experience that guides the user through the creation of a microblog / status post. Post types and the data they collect should be customized by the user via a JSON configuration file. After the post data is collected from the user, the script should execute a user-defined build command as well as a user-defined command to sync the static files to the server.
For some reason, I decided to write my script in Ruby, a language for which I once completed a course before promptly forgetting everything I knew about it. I would have had a much easier time using JavaScript and Node, which I am much more familiar with and have successfully used for similar purposes. Why I did not is anyone’s guess. All this to say: please do not make (too much) fun of my shitty little script, which I have dubbed “Poaster.”
I started with the JSON configuration file, /Poaster/config/config.json:
Here, the user can specify as many post types as they like, each with their own output directory. Each post type can also collect as many pieces of frontmatter as the user cares to specify.
The first thing the script needed to do was ask the user which post type they want to create, so I referenced the KDialog tutorial and wrote a method to handle that /Poaster/lib/spawn_radio_list.rb:
I wrote a few more methods in /Poaster/lib to spawn toast notifications, input boxes, create directories if they don’t exist, and write files:
/Poaster/lib/spawn_toast.rb:
defensure_dir_exists(directory_path)unlessDir.exist?(directory_path)
FileUtils.mkdir_p(directory_path)
spawn_toast 'Directory Created',%(Poaster created #{directory_path}.),10endend
/Poaster/lib/write_file.rb:
defwrite_file(directory, name, extension, content)
post_file =File.new(%(#{directory}/#{name}.#{extension}),'w+')
post_file.syswrite(content)
post_file.close
end
All I had to do then was tie it all together in /Poaster/poaster.rb:
#!/usr/bin/env rubyrequire'json'require'fileutils'require'./lib/spawn_input_box'require'./lib/spawn_radio_list'require'./lib/spawn_toast'require'./lib/ensure_dir_exists'require'./lib/write_file'
config_data =JSON.parse(File.read('./config/config.json'))
dialog_title_prefix ='Poaster'# Populate types_arr with post types
post_types_arr =[]
config_data['postTypes'].eachdo|type|
post_types_arr.push(type['name'])end# Display post list dialog to user
post_type = config_data['postTypes'][Integer(spawn_radio_list(dialog_title_prefix,'Select a post type:', post_types_arr))]# Set the word we will use to refer to the post
post_unit = post_type['postUnitName']# Collect frontmatter from user
frontmatter =[]
post_type['frontMatter'].eachdo|item|
frontmatter.push({ item['name']=> spawn_input_box(%(#{dialog_title_prefix} - Enter Frontmatter'),%(Enter #{post_unit}#{item['name']}:))})end# Collect post content from user
post_content = spawn_input_box %(#{dialog_title_prefix} - Enter Content),%(Enter #{post_unit} content:)# Make sure the output folder exists
post_directory = post_type['postDirectory']
ensure_dir_exists(post_directory)# Create post string
post =%(---\n)
post_id =''
frontmatter.each_with_index do|item, i|
post +=%(#{item.keys[0]}: #{item[item.keys[0]]})
post_id +=%(#{item[item.keys[0]].chomp}#{i == frontmatter.length -1?'':'_'})end
post +=%(---\n#{post_content})# Write post string to file and notify user
post_file_name =%(#{post_type['name']}_#{post_id.chomp})
post_extension ='md'
write_file post_directory, post_file_name, post_extension, post
spawn_toast 'File Created',%(Poaster created #{post_file_name}#{post_extension} at #{post_directory}.),10# Run build and upload commands`cd #{config_data['siteDirectory']} && #{config_data['buildCommand']} && #{config_data['uploadCommand']}`
There is a lot that this script should do that it doesn’t, but for now, it’s still a handy wee utility for SSG users on GNU/Linux systems running KDE who want to make creating quick status-type posts a little less painful. Just make sure KDialog is installed (as well as Ruby, naturally), clone the repo, create /Poaster/config/config.json to meet your needs using the example as a reference and you’re off to the races! I’ve even made a silly little toaster icon using assets from some of the KDE MimeType icons that you can use if you want to make a .desktop file so that you can click an icon on your app launcher to start the script.
Isn’t that nice?
My poaster.desktop file looks something like this:
[Desktop Entry]Exec=/path/to/poaster.rb
GenericName[en_US]=Create a post with Poaster.
GenericName=Create a post with Poaster.
Icon=/path/to/poaster_icon.svg
Name=Poaster
NoDisplay=false
Path=/path/to/repo/
StartupNotify=true
Terminal=false
Type=Application
Here’s the script in action:
The ease! The convenience!
To build the new “now burning” incense microblog feature, I created two new pages. /now-burning shows the latest entry:
---
layout: layouts/base.njk
title: "Nathan Upchurch | Now Burning: What incense I'm burning at the moment."
structuredData: none
postlistHeaderText: "What I've been burning:"
---
{% set burning = collections.nowBurning | last %}
<h1>Now Burning:</h1><articleclass="post microblog-post"><imgclass="microblog-icon"src="/img/censer.svg"><divclass="microblog-status"><h2class="">{{ burning.data.title }}{% if burning.data.manufacturer %}, {{ burning.data.manufacturer }}{% endif %}, {{ burning.date | niceDate }}, {{ burning.data.time }}</h2>
{% if burning.content %}
<divclass="microblog-comment">
{{ burning.content | safe }}
</div>
{% endif %}
</div></article><ahref="/once-burned/"><buttontype="button">Previous Entries »</button></a>
---
layout: layouts/base.njk
title: "Nathan Upchurch | Once Burned: Incense I've burning in the past."
structuredData: none
---
{% set burning = collections.nowBurning | last %}
<h1>Previous “Now Burning” Entries:</h1>
{% set postsCount = collections.nowBurning | removeMostRecent | length %}
{% if postsCount > 0 %}
{% set postslist = collections.nowBurning | removeMostRecent %}
{% set showPostListHeader = false %}
{% include "incenseList.njk" %}
{% else %}
<p>Nothing’s here yet!</p>
{% endif %}
<ahref="/now-burning/"><buttontype="button">Latest »</button></a>
…using a post-listing include built specifically for microblogging:
<sectionclass="postlist microblog-list">
{% if postlistHeaderText %}<h2>{{ postlistHeaderText }}</h2>{% endif %}
<divclass="postlist-item-container">
{% for post in postslist | reverse %}
<articleclass="postlist-item"><divclass="post-copy"><h3>
{% if post.data.title %}{{ post.data.title | safe }}{% else %}?{% endif %}{% if post.data.manufacturer %}, {{ post.data.manufacturer | safe }}{% endif %}
</h3><divclass="post-metadata"><divclass="post-metadata-copy"><p><timedatetime="{{ post.date | htmlDateString }}">{{ post.date | niceDate }}{% if post.data.time %}—{{ post.data.time }}{% endif %}</time></p></div></div>
{% if post.content %}
<divclass="microblog-comment">
{{ post.content | safe }}
</div>
{% endif %}
</div></article><hr>
{% endfor %}
</div></section>
And that’s about it! There’s a lot to do to make the script a little less fragile, such as passing along build / upload error messages, allowing for data validation via regex, et cetera. I’m sure I’ll get to it at some point. If Poaster is useful to you, however, and you’d like to submit a patch to improve it, please do let me know.
Yes, I am aware that Kate isn’t technically
an IDE. ↩︎
At risk of sounding crabbit and behind the times, I don’t know why web
development has to be so damned complicated these days. Like, an entire fancy
for-profit infrastructural platform that exists just to host static websites?
It seems nuts to me. ↩︎
Thank christ. Why does everything need to run in the cloud when we
already have computers at home? ↩︎
I did however use it to very quickly set up a nice looking blog site for
my partner. ↩︎
The first week of my Google Summer of Code journey with the KDE community has nearly come to an end, and it’s been an exciting start. As a quick reminder, my project — “Merkuro – Porting Away from QtWidgets” — focuses on making Akonadi components leaner by decoupling their UI from core logic and reducing dependencies on QtWidgets.
Choosing Where to Begin
Originally, I planned to begin with the KMail agents. However, after discussing it with one of my mentors, Claudio, we realized that these agents may benefit from more than just UI decoupling — they are prime candidates to be moved into the kdepim-runtime repository. This would help consolidate Akonadi agents and resources for better maintainability and cohesion.
Because this is a larger architectural change, we agreed it would be more effective to tackle it later in the project.
Refocusing on Resources Within kdepim-runtime
I shifted my focus to the agents and resources already in kdepim-runtime. I was pleased to see that some groundwork for decoupling had already been laid for resources like DAV, Google, and IMAP, giving me a solid reference to work from.
With a clear direction, I chose the EteSync resource as my first decoupling target.
Decoupling the EteSync Resource
This week, I carried out three main tasks:
Refactoring the Core Code I modified etesyncresource.cpp/.h and etesyncclientstate.cpp/.h to remove all UI-related logic previously embedded in the core functionality.
Updating the Build System I adjusted the CMakeLists.txt to ensure the resource no longer compiles or links against any QtWidgets-based code.
Creating the UI Plugin I created a dedicated configuration plugin consisting of etesyncconfig.cpp and its corresponding .json metadata file. All UI-related code now lives in this separate plugin.
Testing with Akonadi Console
To verify my changes, I’ve been using the Akonadi Console, a powerful tool that lets developers inspect and manage Akonadi agents and resources in real time. My goal is to ensure the refactored EteSync resource functions correctly in Merkuro, Kontact, and any other application that uses Akonadi.
What’s Next?
Before submitting a merge request, I plan to carry out thorough initial testing to ensure everything is stable and there are no regressions. Once the EteSync resource is confirmed to work cleanly with the plugin, I’ll move on to the next target in the decoupling process.
It’s been a productive first week, and I’m looking forward to building on this momentum in the weeks to come!
Welcome to a new issue of This Week in Plasma! Every week we cover the highlights of what’s happening in the world of KDE Plasma and its associated apps like Discover, System Monitor, and more.
This week we continued to focus on bug fixing and user interface polish for Plasma 6.4, which will be released next Thursday. As a result, a lot of impactful changes were merged! Check it out:
Notable UI Improvements
Plasma 6.4.0
On System Settings’ Wi-Fi & Internet page, the networks list is now fully keyboard-navigable, and uses KDE’ s standard list item styling. (Christoph Wolk, link)
The Kicker Application Menu widget’s favorites list is now fully keyboard-accessible. (Christoph Wolk, link)
Disabled the ability to drag screens on top of other screens on System Settings’ Display & monitor page, because this would produce a screen arrangement that isn’t supported and would trigger many very strange bugs throughout the system. (David Redondo, link)
Waking up a sleeping computer by pressing the power button no longer causes the logout screen to be shown after the system waked up and you unlock it. (Niccolò Venerandi, link)
Did some UI polishing on the Digital Clock widget’s config window, resulting in better alignments overall. (Christoph Wolk, link)
When you have a complex panel arrangement with variable-length panels on adjacent screen edges, the horizontal panels now always take priority for filling the empty space, so you never run into a situation where multiple panels are fighting for the same space and sometimes overlap. (Marco Martin, link)
Increased the visibility of the System Monitor’s per-process CPU line charts for selected list items. (Arjen Hiemstra, link
Plasma 6.5.0
Switching the time span on Info Center’s Energy page now smoothly animates the graph view to show the new time span. (Ismael Asensio, link)
System Settings’ Fonts page now prevents you from breaking your system entirely by setting the fonts to something below 4pt. Also if you set a font size between 5 and 6 pt, it now also warns you that Plasma was really not designed to handle this, and that screen scaling may be a better approach. (Nate Graham, link)
Made the text of the “Your disk is in trouble” notification fit into the header. (Harald Sitter, link)
Notable Bug Fixes
Plasma 6.3.6
System Monitor once again lets you see the current table columns while the table column configuration dialog is open. (Nate Graham, link)
Plasma 6.4.0
Putting a Sticky Note widget on a very thick panel can no longer cause Plasma to freeze; now you can use a thick panel with a sticky note on it as a sort of notes sidebar! (Christoph Wolk, link)
Fixed the most common System Monitor crash. (Arjen Hiemstra, link)
Fixed another crash in System Monitor, this time a divide-by-zero. (Arjen Hiemstra, link)
Fixed a case where xdg-desktop-portal-kde could crash after you choose a video source to start streaming. (David Redondo, link)
Fixed a bug that caused Discover to crash if you close it immediately after it launched. (Wendi Gan, link)
Fixed multiple subtle bugs with the screen chooser widget and OSD that caused it to do the wrong thing on rotated screens or when mirroring screens. (David Redondo, link)
Fixed a bug that caused System Settings’ search field to not be focused properly when pressing Ctrl+F while any UI elements in a settings page already had focus. (Marco Martin, link)
Fixed the root cause of multiple issues involving windows disappearing when you disconnect the screen they’re on! (Xaver Hugl, link)
Clicking a button on a desktop widget that opens a menu no longer inappropriately makes the widget enter Widget Edit Mode. (Christoph Wolk, link)
Files with a # or ? character in their name or full path are no longer unexpectedly missing from the history lists in Kicker/Kickoff/etc launchers. (Christoph Wolk, link 1 and link 2)
Fixed a bug that caused the screen chooser window to sometimes not appear as expected when OBS was launched. (David Redondo, link)
Fixed a bug that caused tiled windows on a multi-screen setup to lose their tiling settings when the system went to sleep and woke up again. (Xaver Hugl, link)
The “Move window to [activity]” feature now works properly when invoked from the Task Manager widget. (Christoph Wolk, link)
Fixed a bug in the Kicker Application Menu that caused keyboard navigation to not work if the popup opened with an item under the pointer. (Christoph Wolk, link)
In the Overview effect’s grid view, dragging windows tiled on one virtual desktop over to a different virtual desktop now keeps them tiled as expected. (Vlad Zahorodnii, link)
Plasma 6.5.0
Fixed a bug that caused the Networks widget to sometimes incorrectly think you had a hotspot enabled after you disconnect from the active Wi-Fi network. (Niccolò Venerandi, link)
Frameworks 6.15
Fixed a bug that caused certain list items throughout Plasma and KDE apps with inline buttons to sometimes mis-position their buttons. (Efe Çiftci, link)
Improved cursor smoothness and reduced flicker associated with the use of the variable refresh rate feature. (Xaver Hugl, link)
Reduced unnecessary CPU usage on System Monitor’s Processes page even more. (David Edmundson, link 1 and link 2)
Prevented a ton of ignorable but scary-seeming “Page flip failed!’ warnings from appearing in the journal log while watching a full screen video in MPV. (Xaver Hugl, link)
Plasma 6.5.0
If you modify the keyboard layout using the kwriteconfig command-line tool, those changes now take effect immediately. (Bojidar Marinov, link)
How You Can Help
KDE has become important in the world, and your time and contributions have helped us get there. As we grow, we need your support to keep KDE sustainable.
You can help KDE by becoming an active community member and getting involved somehow. 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 us by making a donation! Any monetary contribution — however small — will help us cover operational costs, salaries, travel expenses for contributors, and in general just keep KDE bringing Free Software to the world.
Hi all! My name is Ross Rosales. I am a self-taught Software Engineer and former Registered Nurse with a background in the Emergency Deparment. Through the great community of KDE and Open Source I gained so much valuable experience that I apply in my everyday career and life. As I continue learning everyday, I want to share what I'll be working on over the next 12 weeks.
About Krita
Krita is an amazing open source and free painting program with countless growing features. Although I may not paint or draw very well myself, I've always admired how artists are able to create anything they can put their mind to with the tools at their disposal. My goal is to contribute to Krita and support all artists by helping their ideas become reality.
Proposal
To make artists' workflow easier, this GSoC I plan to create a floating toolbar that will contain common selection actions artists frequently switch between. The idea is to improve accessibility to tools that may not be intuitive to new or experienced users. Link to my proposal
Plans
In addition to sharing my progress on the Selection Action Bar for GSoC, I also plan to write about how new contributors can join the KDE community and reduce the barrier to entry for Krita. I’ll do this through personal walkthroughs covering environment setup, writing code for the first time, engaging with the community, and providing quick links to helpful resources—all in one place.
Special Thanks
Thank you to the KDE and Krita communities for giving me the opportunity to join such an amazing group of individuals. Special thanks to Dmitry, Emmet, Halla, Tiar, Wolthera, and everyone I interact with in Krita Chat!
Contact
To anyone reading this, please feel free to reach out to me. I’m always open to suggestions and thoughts on how to improve as a developer and as a person. Email: ross.erosales@gmail.com Matrix: @rossr:matrix.org
For the June Art Challenge, @Mythmaker has passed the honor of choosing the topic to regular participant @Corentin, who has chosen "Wrath of the Sun" as the theme. Interpret this title however you want, optionally include some sort of decorative design, and have fun with the sun!
Take a look at the nominations for next month, and suggest your favorite latest artworks to be featured. Don't forget to vote when the poll opens on June 11th!
Ways to Help Krita
Krita is Free and Open Source Software developed by an international team of sponsored developers and volunteer contributors. That means anyone can help make Krita better!
Support Krita financially by making a one-time or monthly monetary donation. Or donate your time and Get Involved with testing, development, translation, documentation, and more. Last but not least, you can spread the word! Share your Krita artworks, resources, and tips with others, and show the world what Krita can do.
Other Notable Changes
Other notable changes in Krita's development builds from May 8 - June 6, 2025.
Stable branch (5.2.10-prealpha):
General: Fix a crash when autosaving heavy images with lots of compositions and an adjustment layer with vector selection. (Change, by Dmitry Kazakov)
File Formats: TIFF: Fix TIFF file size bloating after each overwrite. (Change, by Igor Danilets)
General: Change Resize Canvas's 'Constrain proportions' toggle to not reset the canvas size. (bug report) (Change, by Halla Rempt)
Linux: Upgrade AppImage base to Ubuntu 2204. (Change, by Dmitry Kazakov)
Unstable branch (5.3.0-prealpha):
Bug fixes:
Android: Fix the Text Properties Docker being blank. (bug report) (Change, by Dmitry Kazakov)
General: Fix floating toolbars disappearing on restart. (bug 504463) (Change, by Freya Lupen)
Python Plugins: Workflow Buttons Docker: Fix Pan and Text Tool buttons. (bug report) (Change, by Freya Lupen)
Features:
Text Properties Docker: Allow configuring when each property should be shown in the list; always, never, when set, or when relevant (inherited or set). (Change, by Wolthera van Hövell)
Text Properties Docker: Add Text Rendering property, for antialiasing/hinting options. (Change, by Wolthera van Hövell)
SVG: Handle SVG title and desc metadata. (Change, by Wolthera van Hövell)
Shortcuts/Toolbars: Add Force Palette Colors action to limit color selection to colors in the palette. (Change, by Halla Rempt)
Python Plugins/Scripting: Add and use FileDialog class, which uses Krita's wrapper around QFileDialog in order to respect Krita's "Don't use native file dialogs" setting. (bug report, bug report) (Change, by Freya Lupen)
Nightly Builds
Pre-release versions of Krita are built every day for testing new changes.
I’ve written a small Neovim plugin which might be useful to people
who often work on several projects in parallel.
It activates a specific theme based on the project you are working on
(the current directory you start Neovim from).
It allows you to define which themes should be used for which
projects. The configuration is simple and allows specifying patterns for
matching project names (not full regex, but what Lua supports).
My configuration looks something like this (this is in Fennel, for
the Lua version, check out the readme):