Feeds
Digging into the Fast Sketch Cleanup Plugin for Krita
We started this project with the intent of providing users a tool helpful in inking sketches. It is based on a research article by Simo & Sierra published in 2016, and it uses neural networks (now commonly called simply AI) to work. The tool has been developed in partnership with Intel and it’s still considered experimental, but you can already use it and see the results.
In the section below there are some real life examples of use cases and the results from the plugin. The results vary, but it can be used for extracting faint pencil sketches from photos, cleaning up lines, and comic book inking.
Regarding the model used in the tool, we trained it ourselves. All the data in the dataset is donated from people who sent their pictures to us themselves and agreed on this specific use case. We haven’t used any other data. Moreover, when you use the plugin, it processes locally on your machine, it doesn’t require any internet connection, doesn’t connect to any server, and no account is required either. Currently it works only on Windows and Linux, but we’ll work on making it available on MacOS as well.
Use casesIt averages the lines into one line and creates strong black lines, but the end result can be blurry or uneven. In many cases however it still works better than just using a Levels filter (for example in extracting the pencil sketch). it might be a good idea to use Levels filter after using the plugin to reduce the blurriness. Since the plugin works best with white canvas and grey-black lines, in case of photographed pencil sketches or very light sketch lines, it might be a good idea to use Levels also before using the plugin.
Extracting photographed pencil sketchThis is the result of the standard procedure of using Levels filter on a sketch to extract the lines (which results in a part of the image getting the shadow):
sketch_girl_original_procedure_comparison_small1843×1209 165 KB
The sketch was drawn by Tiar (link to KA profile)
This is the procedure using the plugin with SketchyModel (Levels → plugin → Levels):
sketch_girl_new_procedure_comparison_small1843×2419 267 KB
Comparison (for black lines):
sketch_girl_procedures_comparison_small1920×1260 215 KB
Another possible result is to just stop at the plugin without forcing black lines using Levels, which results in a nicer, more pencil-y look while keeping the lower part of the page still blank:
sketch_girl_after_plugin_small1536×2016 161 KB
Picture of a man made by BeARToys
Here in the pictures above you can see the comic book style inking. The result, which is a bit blurry compared to the original, can be further enhanced by using a Sharpen filter. The dragon was sketched by David Revoy (CC-BY 4.0).
Cleaning up linesExamples of sketches I made and the result of the plugin, showing the strong and weak points of the plugin. All of the pictures below were made using the SketchyModel.
flower_001_detail681×456 22.1 KB
portrait_man_portrait_2_comparison_2_small1305×505 139 KB
portrait_man_portrait_2_detail646×1023 26.6 KB
All of the pictures above painted by Tiar (link to KA profile)
On the pictures below, on the scales of the fish, you can see how the model discriminates lighter lines and enhances the stronger lines, making the scales more pronounced. In theory you could do that using the Levels filter, but in practice the results would be worse, because the model takes into account local strength of the line.
fish_square_sketchy_comparison_small1920×968 156 KB
Picture of the fish made by Christine Garner (link to portfolio)
How to use it in KritaTo use the Fast Sketch Cleanup plugin in Krita, do the following:
-
Prepare Krita:
-
On Windows:
-
Either in one package: download Krita 5.3.0-prealpha with Fast Sketch Cleanup plugin already included: https://download.kde.org/unstable/krita/5.3.0-prealpha-fast-sketch/krita-x64-5.3.0-prealpha-cdac9c31.zip
-
Or separately:
- Download portable version of Krita 5.2.6 (or similar version - should still work)
- Download separately the Fast Sketch Cleanup plugin here: https://download.kde.org/stable/krita/FastSketchPlugin-1.0.2/FastSketchPlugin1.0.2.zip
- Unzip the file into krita-5.2.6/ folder (keeping the folder structure).
- Then go to Settings → Configure Krita → Python Plugin Manager, enable Fast Sketch Cleanup plugin, and restart Krita.
-
-
On Linux:
- Download the appimage: https://download.kde.org/unstable/krita/5.3.0-prealpha-fast-sketch/krita-5.3.0-prealpha-cdac9c31c9-x86_64.AppImage
-
-
(Optional) Install NPU drivers if you have NPU on your device (practically only necessary on Linux, if you have a very new Intel CPU): Configurations for Intel® NPU with OpenVINO™ — OpenVINO™ documentation (note: you can still run the plugin on CPU or GPU, it doesn’t require NPU)
-
Run the plugin:
- Open or create a white canvas with grey-white strokes (note that the plugin will take the current projection of the canvas, not the current layer).
- Go to Tools → Fast Sketch Cleanup
- Select the model. Advanced Options will be automatically selected for you.
- Wait until it finishes processing (the dialog will close automatically then).
- See that it created a new layer with the result.
Currently it’s better to just use the SketchyModel.xml, in most cases it works significantly better than the SmoothModel.xml.
You need to make sure the background is pretty bright, and the lines you want to keep in the result are relatively dark (either somewhat dark grey or black; light grey might result in many missed lines). It might be a good idea to use a filter like Levels beforehand.
After processing, you might want to enhance the results with either Levels filter or Sharpen filter, depending on your results.
Technology & Science behind it Unique requirementsFirst unique requirement was that it had to work on canvases of all sizes. That meant that the network couldn’t have any dense/fully or densely connected linear layers that are very common in most of the image processing neural networks (which require input of a specific size and will produce different results for the same pixel depending on its location), only convolutions or pooling or similar layers that were producing the same results for every pixel of the canvas, no matter the location. Fortunately, the Simo & Sierra paper published in 2016 described a network just like that.
Another challenge was that we couldn’t really use the model they created, since it wasn’t compatible with Krita’s license, and we couldn’t even really use the exact model type they described, because one of those model files would be nearly as big as Krita, and the training would take a really long time. We needed something that would work just as well if not better, but small enough that it can be added to Krita without making it twice as big. (In theory, we could do like some other companies and make the processing happen on some kind of a server, but that wasn’t what we wanted. And even if it resolved some of our issues, it would provide plenty of its own major challenges. Also, we wanted for our users to be able to use it locally without a reliance on our servers and the internet). Moreover, the model had to be reasonably fast and also modest in regards to RAM/VRAM consumption.
Moreover, we didn’t have any dataset we could use. Simo & Sierra used a dataset, where the expected images were all drawn using a constant line width and transparency, which meant that the results of the training had those qualities too. We wanted something that looked a bit more hand-drawn, with varying line-width or semi-transparent ends of the lines, so our dataset had to contain those kinds of images. Since we haven’t been aware of any datasets that would match our requirements regarding the license and the data gathering process, we asked our own community for help, here you can read the Krita Artists thread about it: https://krita-artists.org/t/call-for-donation-of-artworks-for-the-fast-line-art-project/96401 .
The link to our full dataset can be found below in the Dataset section.
Model architectureAll main layers are either convolutional or deconvolutional (at the end of the model). After every (de)convolutional layer except for the last one there is a ReLu activation layer, and after the last convolution there is a sigmoid activation layer.
Python packages used: Pillow, Numpy, PyTorch and OpenvinoNumpy is a standard library for all kinds of arrays and advanced array operations and we used Pillow for reading images and converting them into numpy arrays and back. For training, we used PyTorch, while in the Krita plugin we used Openvino for inference (processing through the network).
Using NPU for inference
This table shows the result of benchmark_app, which is a tool that’s provided with Intel’s python package openvino. It tests the model in isolation on random data. As you can see, the NPU was several times faster than the CPU on the same machine.
On the other hand, introducing NPU added a challenge: the only models that can run on NPU are static models, meaning the input size is known at the time of saving the model to file. To solve this, the plugin first cuts the canvas into smaller parts of a specified size (which depends on the model file), and then proceeds to process all of them and finally stitch the results together. To avoid artifacts on the areas next to the stitching, all of the parts are cut with a little bit of a margin and the margin is later cut off.
How to train your own modelTo train your own model, you’ll need some technical skills, pairs of pictures (input and the expected output) and a powerful computer. You might also need quite a lot of space on your hard drive, though you can just remove unnecessary older models if you start having issues with lack of space.
Drivers & preparationYou’ll need to install Python3 and the following packages: Pillow, openvino, numpy, torch. For quantization of the model you will also need nncf and sklearn. If I missed anything, it will complain, so just install those packages it mentions too.
If you’re on Windows, you probably have drivers for NPU and dedicated GPU. On Linux, you might need to install NPU drivers before you’ll be able to use it: https://docs.openvino.ai/2024/get-started/configurations/configurations-intel-npu.html .
Moreover if you want to use iGPU for training (which might still be significantly faster than on CPU), you’ll probably need to use something like IPEX which allows PyTorch to use an “XPU” device, which is just your iGPU. It’s not tested or recommended since I personally haven’t been able to use it because my Python version was higher than the instruction expects, but the instruction is here: https://pytorch-extension.intel.com/installation?platform=gpu&version=v2.5.10%2Bxpu .
The sanity check for the installation is as follows:
python3 -c "import torch; import intel_extension_for_pytorch as ipex; print(f'Packages versions:'); print(f'Torch version: {torch.__version__}'); print(f'IPEX version: {ipex.__version__}'); print(f'Devices:'); print(f'Torch XPU device count: {torch.xpu.device_count()}'); [print(f'[Device {i}]: {torch.xpu.get_device_properties(i)}') for i in range(torch.xpu.device_count())];"
It should show more than 0 devices with some basic properties.
If you manage to get XPU device working on your machine, you’ll still need to edit the training scripts so they’ll able to use it: https://intel.github.io/intel-extension-for-pytorch/xpu/latest/tutorials/getting_started.html (most probably you’ll just need to add this line:
import intel_extension_for_pytorch as ipex
to the script on the very top, just underneath “import torch”, and use “xpu” as the device name when invoking the script, and it should work. But as I said, the scripts hasn’t been tested for that.
You’ll need some pictures to be able to train your model. The pictures must be in pairs, every pair must contain a sketch (input) and a lineart picture (expected output). The better quality of the dataset, the better the results.
Before training, it’s best if you augment the data: that means the pictures are rotated, scaled up or down, and mirrored. Currently the data augmentation script also performs an inversion with the assumption that training on inverted pictures would bring the results faster (considering that black means zero means no signal, and we’d like that to be the background, so the models learn the lines, not the background around lines).
How to use the data augmentation script is explained below in the detailed instruction for the training part.
Here’s the dataset that we used (please read the license carefully if you want to use it): https://files.kde.org/krita/extras/FastSketchCleanupPluginKritaDataset.zip
Choice of model and other parametersFor quick results, use tooSmallConv; if you have more time and resources, typicalDeep might be a better idea. If you have access to a powerful GPU machine, you might try original or originalSmaller, which represent the original description of the model from the SIGGRAPH article by Simo-Sierra 2016, and a smaller version of it.
Use adadelta as the optimizer.
You can use either blackWhite or mse as the loss function; mse is classic, but blackWhite might lead to faster results since it lowers the relative error on the fully white or fully black areas (based on the expected output picture).
Training-
Clone the repository at https://invent.kde.org/tymond/fast-line-art (at 33869b6)
git clone https://invent.kde.org/tymond/fast-line-art.git -
Then, prepare the folder:
- Create a new folder for the training.
- In the folder, run:
python3 [repository folder]/spawnExperiment.py --path [path to new folder, either relative or absolute] --note "[your personal note about the experiment]"
-
Prepare data:
- If you have existing augmented dataset, put it all in data/training/ and data/verify/, keeping in mind that paired pictures in ink/ and sketch/ subfolders must have the exact same names (for example if you have sketch.png and ink.png as data, you need to put one in sketch/ as picture.png and another in ink/ as picture.png to be paired).
- If you don't have existing augmented dataset:
- Put all your raw data in data/raw/, keeping in mind that paired pictures should have the exact same names with added prefix either ink_ or sketch_ (for example if you have picture_1.png being the sketch picture and picture_2.png being the ink picture, you need to name them sketch_picture.png and ink_picture.png respectively.)
- Run the data preparer script:
python3 [repository folder]/dataPreparer.py -t taskfile.yml
That will augment the data in the raw directory in order for the training to be more successful.
-
Edit the taskfile.yml file to your liking. The most important parts you want to change are:
- model type - code name for the model type, use tinyTinier, tooSmallConv, typicalDeep or tinyNarrowerShallow
- optimizer - type of optimizer, use adadelta or sgd
- learning rate - learning rate for sgd if in use
- loss function - code name for loss function, use mse for mean squared error or blackWhite for a custom loss function based on mse, but a bit smaller for pixels where the target image pixel value is close to 0.5
-
Run the training code:
python3 [repository folder]/train.py -t taskfile.yml -d "cpu"On Linux, if you want it to run in a background, add “&” at the end. If it runs in a foreground, you can pause the training just by pressing ctrl+C, and if it runs in a background, find a process id (using either “jobs -l” command or “ps aux | grep train.py” command, the first number would be the process id) and kill it using “kill [process id]” command. Your results will still be in the folder, and you’ll be able to resume the training using the same command.
-
Convert the model to an openvino model:
python3 [repository folder]/modelConverter.py -s [size of the input, recommended 256] -t [input model name, from pytorch] -o [openvino model name, must end with .xml] -
Place both the .xml and .bin model files in your Krita resource folder (inside pykrita/fast_sketch_cleanup subfolder) alongside other models to use them in the plugin.
Python Morsels: Merging dictionaries in Python
Merging dictionaries in Python is usually as simple as a single pipe character.
Table of contents
- Merging dictionaries with | in Python
- Merging dictionaries with the update method
- Merging dictionaries with **
- The difference between | and **
- Handling duplicate keys when merging
- The | operator performs a "union" between dictionaries
- Join dictionaries with the | operator
First let's talk about the simplest way to merge dictionaries, which will usually be all that you need.
Here are two dictionaries:
>>> context = {"language": "en", "timezone": "UTC"} >>> more_context = {"title": "Home", "breadcrumbs": ["Home"]}We'd like to make a new third dictionary that combines these two. This new dictionary should contain all the key-value pairs from both dictionaries.
The easiest way to do this is to use the pipe (|) operator:
>>> new_context = context | more_contextThis made a new dictionary that contains all the items from both of the two initial dictionaries:
>>> new_context {'language': 'en', 'timezone': 'UTC', 'title': 'Home', 'breadcrumbs': ['Home']}Using the | operator is basically the same as making a new empty dictionary, and then looping over all the items in the first dictionary and then all the items in the second dictionary, and adding all of them to the new dictionary:
>>> new_context = {} >>> for key, value in context.items(): ... new_context[key] = value ... >>> for key, value in more_context.items(): ... new_context[key] = value ... >>> new_context {'language': 'en', 'timezone': 'UTC', 'title': 'Home', 'breadcrumbs': ['Home']} Merging dictionaries with the update methodWhat if we wanted to …
Read the full article: https://www.pythonmorsels.com/merging-dictionaries/FSF Blogs: The FSF SysOps Team needs your help to secure technological freedom!
The FSF SysOps Team needs your help to secure technological freedom!
Quansight Labs Blog: LAPACK in your web browser: high-performance linear algebra with stdlib
mark.ie: My LocalGov Drupal contributions for week-ending December 20th, 2024
Rewriting a lot of JavaScript and creating a contact component.
Kdenlive 24.12.0 released
We are happy to announce Kdenlive 24.12. This release focuses on bug fixes, improved stability, and usability enhancements across the board. Numerous crashes and glitches have been addressed, including issues with audio capture, effect zones, high DPI display rendering, and subtitle editing. Proxies, rotoscoping, and project management workflows have been significantly refined, resolving lags, incorrect EXIF orientation handling, and archiving problems. We’ve managed to sneak in some little nifty features as well like the ability to resize multiple timeline items, Shift + Del shortcut to extract clips from the timeline, added actions to quickly add Marker/Guides in a specific category and mixes (same track transitions) can be 1 frame long.
Under the hood, we’ve dropped support for Qt5 and now require Qt6, alongside updated dependencies (MLT 7.28 and KF 6.3). This release comes with a lot of code cleanups and refactored Whisper settings. Optimized threading and memory management. Additionally, fail-safe measures have been taken to prevent invalid project profiles and script names.
Subtitles
We’ve added support for Advanced SubStation Alpha (ASS) subtitles, a widely used text-based format renowned for its flexibility in creating highly styled and customizable subtitles. ASS subtitles support advanced features such as font family, size, and color; text outlines and shadows; alignment and positioning; scaling and rotation; margins and spacing; and effects, including masking and other enhancements.
Subtitle Manager
The new subtitle manager is now integrated with style management and has been divided into four sections: Files, Layers and Content, Style, and Info, which correspond to the four main components of ASS subtitles.
Files – create, import and export subtitles
Layers and Content – create/remove subtitle tracks and apply styling
Styles – create and manage styles
Info – displays information about subtitles
Subtitle Style Editor
The new and powerful Subtitle Style Editor allows you to control all the styling capabilities of the ASS format. Animated Subtitles
The ASS format supports three types of effects: Banner, where the text scrolls sideways across the screen; Scroll, where the text moves vertically; and Karaoke, where each word is highlighted in sync with the audio. Currently, only the Banner and Scroll effects are accessible through the user interface, but additional styling, including Karaoke effects, can be applied using ASS tags. Currently, only the Banner and Scroll effects are accessible through the user interface, but additional styling, including Karaoke effects, can be applied using ASS tags. Speech-to-Text
We’ve polished the Speech to Text features ensuring a smoother and more reliable experience. Seamless installation, GPU translation and threading issues have fixed. We’ve also resolved issues with the display of Vosk, Whisper and Seamless model folder sizes on Windows. Added the ability to update all virtual environment packages have updated to the latest version of Whisper. Lastly, the Whisper settings interface has been refactored.
Effects
With this version, we complete the final task of our fundraiser: builtin effects and a redesigned effects interface. Rendering of keyframe types like Bounce, Circular, and Exponential has been improved, alongside fixes for zone-based effects, rotoscoping lag, shape filter rendering, improved precision for time remapping, motion tracker models and prev/next seeking in monitor. It is also now possible to have single-frame mixes (same track transitions).
Interface redesign
The new Effect Stack redesign enhances usability with clearer organization of keyframeable and non-keyframeable parameters, improved layout consistency, more compact and clean. We’ve also added info buttons in effect headers for quick access to documentation. Built-in Effects
To make your workflow much more fluid, the new effects panel gives direct access to effect parameters, allowing to quickly and easily adjust them. Currently built-in effects are Transform and Flip for video clips and Volume for audio clips. Built-in effects can be enabled/disabled in the settings.
New EffectsAs usual there is always room for some eye candy, so we’ve added two color correction effects, HSL Primaries and HSL Range as well as GPS Effects (Images below displaying Distance, Altitude and Speed among many other values).
Other Highlights
- Fix audio capture issues
- Added Shift + Del shortcut to extract clip from timeline
- Fix clip monitor history menu not showing up on audio clips
- Fix spacer tool leaving a few frames after last clip
- Implement resizing multiple timeline items
- Fix Pexels Videos provider
- Fix Alt+click to loop between clips using an effect in project monitor
- Titler: ensure only plain text can be pasted
- Titler: added support for tabulations
- Add Actions to quickly add Marker/Guides in a specific category
Full changelog
- Save extracted frames in project folder is project is supposed to save files in its parent folder. Commit. Fixes bug #496486.
- Fix proxied image messes exif orentation. Commit. Fixes bug #496681.
- Fix audio capture, ensure default monitor scene is active to start recording. Commit. See bug #496263.
- Don’t allow question mark in script names (not supported by MLT). Commit. Fixes bug #496763.
- Fix motion tracker effect link to documentation and create models folder in any case to avoid error message. Commit.
- Allow creating 1 frame mixes. Commit.
- Fix resizing mix to 1 frame duration breaking mix position. Commit.
- Move enable builtin effects from asset panel to Kdenlive Settings dialog. Commit.
- Various built in effect fixes on copy effect. Commit.
- Properly display the full log on missing render file. Commit.
- Ensure we display an error if the render job finishes but rendered file does not exist. Commit.
- Don’t enable keyframes in timeline if an effect is disabled. Commit.
- Disable keep original size feature as it has issues (causes distortion if another transform is added in timeline). Commit.
- Archiving: don’t show two abort buttons. Commit.
- Fix incorrect code change that broke tests. Commit.
- Don’t allow creating invalid project profiles with strange pixel aspect ratio. Commit.
- Don’t change timeline audio/video targets while dragging. Commit. Fixes bug #496354.
- Minor cleanup, ProjectClip cannot be of type Timeline. Commit.
- Fix title widget incorrectly showing text color as gradient if it was once switched to gradient. Commit.
- Fix wrong HW profile selected when transcoding. Commit.
- Add shortcut to extract clip from timeline. Commit.
- Add the new MLT HSL color correction effects to the correct category. Commit.
- Fix guides not appearing in first timeline of newly created projects. Commit.
- Fix corners effect broken and lag. Commit.
- Fix crash in effectstack. Commit.
- Fix disabled built-in effects incorrectly flagged as non built-in. Commit.
- Fix crash trying to remove keyframes when there are none. Commit. Fixes bug #496391.
- Fix merge error in fix for windows crash in file with missing drive. Commit.
- Fix Clip In Project Bin not opening the item’s folder in secondary bins. Commit.
- Fix rotoscoping lag on keyframe change. Commit.
- Fix recent commit breaking tests. Commit.
- Cleanup, fix incorrect invokation of setProducer. Commit.
- Master effects: don’t try to refresh both monitors on each effect param change, simply mark the inactive monitor as needing a refresh on next focus action. Commit.
- Fix render dialog cleanup always disabled. Commit.
- Minor cleanup in renderjob. Commit.
- Disable inactive timeline tabs. Commit.
- Fix abort rendering. Commit.
- Fix Windows crash openening a project with a missing file on a non available drive. Commit.
- Fix fit to width/height when clip sample aspect ratio != 1. Commit. See bug #96404.
- Don’t try opening invalid sequence. Commit.
- Mark sequence clips with 0 tracks as invalid. Commit.
- Gpsgraphics: Fix default value for bg scale and opacity. Commit.
- Fix subtitle style editor scaling. Commit.
- Fix seamless transalation on GPU. Commit.
- Fix vosk model size calculation on Windows. Commit.
- Fix crash loading project with effect zone. Commit.
- Fix display of Whisper/Seamless model folder size on Windows. Commit.
- Fix another missing slash in tag end. Commit.
- Fix missing slash in tag end. Commit.
- Fix clip monitor history menu not showing up on audio clips. Commit.
- Cleanup subtitle edit ui. Commit.
- Fix incorrect param name. Commit.
- Gpsgraphic: fix range and comment. Commit.
- Fix gpsgraphic default values. Commit.
- Disable failing shared_ptr check. Commit.
- Cleanup Subtitles style dialog to better follow the app UI style. Commit.
- Effects XML changes to include keyframes. Commit.
- Remove reference to unused file. Commit.
- Fix crash/corruption in qml after sequence close. Commit.
- Only set timeline context properties once. Commit.
- Cleanup renderjob. Commit.
- Update avfilter_drawgrid.xml. Commit.
- Update avfilter_drawbox.xml. Commit.
- Fix missing change in last commit. Commit.
- Fix highdpi painting of color wheels. Commit.
- Fix colorwheel drawing on highdpi. Commit.
- Add some debug around project close. Commit.
- Fix Lift(Gamma/Gain layout issues. Commit.
- Bump MLT dependency to 7.28. Commit.
- Fix threading issue in seamless install, add context info buttons to settings page. Commit.
- Bump KF dependency to 6.3. Commit.
- Update all venv packages on request. Commit.
- Various fixes for TTS. Commit.
- Don’t include quiet packages in feature_summary. Commit.
- Fix possible concurrency crash in settings caused by pthon deps check. Commit.
- Enforce latest version of whisper. Commit.
- Fix tests and snapping bug introduced in recent spacer tool fix. Commit.
- Refactor whisper settings. Commit.
- Cleaunp. Commit.
- Fix spacer tool leaving a few frames after last clip. Commit.
- Don’t update subtitle edit on each selection change. Commit.
- Fix changing font size in subtitle editor. Commit.
- Add classes for specific clip types (timeline, playlist clips), cleanup. Commit.
- [dev-docs] Remove Qt5 mentions from build instructions. Commit.
- Implement resizing multiple timeline items. Commit.
- Fix Pexels Videos provider. Commit.
- Fix resetting Help shortcuts on each application launch. Commit. Fixes bug #495373.
- Fix replacing bin AV clip with mlt playlist. Commit.
- Fix .mlt playlist files lose audio thumb on project reopen. Commit.
- Dont try to read .mlt playlists as kdenlive project files on reload. Commit.
- Fix shadowed variable causing incorrect clip removal on project opening, fix crash opening project with timeline clip missing in bin. Commit. See bug #493486.
- Fix monitor seek to prev/next keyframe not working in rotoscoping. Commit.
- Fix rendering custom image sequence profile. Commit.
- Fix incorrect string param. Commit.
- QString refactor: replace QString() with QStringLiteral(). Commit.
- Fix mdocument modified on open: don’t try to convert already updated subtitles. Commit.
- Subtitles: fix cut on newline handling after recent change. Commit.
- Fix: A/V Check for avformat files is swapped. Commit.
- Fix newline handling in subtitles, fix crash on delete in simple editor. Commit.
- Fix clip jobs like stabilize creating invalid folders. Commit.
- Fix freeze loading project with invalid folder id. Commit.
- Update packaging instructions. Commit.
- Don’t invalidate timeline preview when replacing an audio clip in bin. Commit.
- Ensure monitor is cleared and ruler hidden when no clip or a folder is selected in bin. Commit.
- Fix title producer update on edit undo. Commit. Fixes bug #494142.
- Revert incorrect change. Commit.
- Fix typo in dance.xml. Commit.
- Fix single item(s) move. Commit.
- Cleanup. Commit.
- Fix cycle effects playling timeline and sometimes broken after reopening project. Commit.
- Fix recent regression breaking all sort of things when opening projects. Commit.
- Fix crash when dragging clip and using mouse wheel. Commit.
- Don’t play when clicking monitor container if disabled in settings. Commit.
- Fix effect zones lost on project reopening. Commit.
- Fix effect zone for timeline clips. Commit.
- Render jobs: differentiate status between waiting and starting. Commit.
- Various fixes for bin clip effects. Commit.
- Disable check for ghost effects that currently removes valid effects. Commit.
- Detect and fix track producers with incorrect effects. Commit.
- Include cleanup. Commit.
- Fix bin effects not deleted from timeline instances. Commit.
- Don’t try to build clone effect it if does not apply to the target. Commit.
- Fix deleting effect does not reset on monitor view and crash applying effect zone to bin clip. Commit.
- Don’t unnecessarily check MLT tractors. Commit.
- Fix crash opening file with missing clips. Commit.
- Remove unused code. Commit.
- Don’t erase temporary playlists in debug mode. Commit.
- Remove dead code. Commit.
- Fix null disconnect error in tests. Commit.
- Disable workaround to better understand failures in test suite. Commit.
- Fix crash on project close. Commit.
- In render debug mode, enforce MLT’s repository to fix AppImage render suite failure. Commit.
- Add more debug output to render log files. Commit.
- Renderer: add debug option to prevent deleting the render log file. Commit.
- Fix possible crash opening an interlaced project. Commit.
- Remember last used zone in effect zone. Commit. See bug #493555.
- Only show system notifications for MLT error messages. Commit.
- Fix builtin effects sometimes appear after normal effects. Commit.
- Ensure clip properties tab icons are not rotated. Commit.
- Fix Shape Alpha filter affecting project audio. Commit.
- Git pushMerge branch ‘master’ of invent.kde.org:multimedia/kdenlive. Commit.
- Fix group effect button displayed in empty effect stack. Commit.
- Drop DBus in favor of QLocalSocket to communicate between renderer and main app. Commit.
- Fix Alt+click to loop between clips using an effect in project monitor. Commit.
- Fix crash on close. Commit.
- Fix copy/paste clip duplicates builtin effect. Commit.
- Add MLT_REPOSITIORY to render log. Commit.
- Add more checks for render progress report. Commit.
- Don’t delete render log file if rendering does not create an output file. Commit.
- Fix possible crash on quit. Commit.
- Fix render job possibly aborting before starting. Commit.
- Correctly handle failure to create venv: give feedback to the user and don’t keep a broken venv setup. Commit.
- [REUSE] Port to REUSE.toml. Commit.
- Fix crash loading audio clip. Commit.
- Subtitle edit: fix character count and editor font size. Commit.
- Fix some warnings, add some debug info if a rendered file is missing or empty. Commit.
- Built-in effects fixes, add option to keep source clip size on import. Commit.
- Don’t try to connect to dbus jobview on command line rendering. Commit.
- Fix recent Qt6 warnings. Commit.
- Add message box informing user we will open a browser window when clicking documentation button in effect/transition. Commit.
- FIx looping through clips in project monitor effect scene. Commit.
- Fix loop selected clip. Commit.
- Effect stack now updates when switching between Project Bin and Timeline, fix a few focus issues. Commit.
- Properly hide “built-in stack” and “group effects” button when needed, add an info link button for compositions. Commit.
- Fix type. Commit.
- Properly hide/show the save stack icon. Commit.
- Fix minor typo. Commit.
- Replace : and ? chars in guides names for rendering. Commit. See bug #492595.
- Don’t trigger timeline scroll when mouse exits timeline on a clip drag, it caused incorrect droppings and ghost clips. Commit. See bug #492720.
- Effect Stack: add info button in effect headers redirecting to our documentation. Commit.
- Fix scolling timeline with rubberband or when dragging from file manager can move last selected clip in timeline. Commit. Fixes bug #492635.
- Fix adding marker from project notes always adds it at 00:00. Commit. Fixes bug #492697.
- Improve the ASS format subtitling support. Commit.
- Correctly draw other Keyframe types in timeline (Bounce, circular, cubic, exponential). Commit.
- Fix blurry widgets on high DPI displays. Commit.
- Fix keyframe param not correctly enabled on first keyframe click. Commit.
- Fix curveeditor crash on empty track. Commit.
- Fix on monitor seek to next/previous keyframe buttons. Commit.
- Ensure rendering with separate file for each audio track keeps the correct audio tag in the file name. Commit.
- Switch time remap to the new precision spin box allowing 6 decimals instead of previous 2. Commit. See bug #492274.
- Fix render project folder sometimes lost, add proper enums instead of unreadable ints. Commit. See bug #492476.
- Fix MLT lumas not correctly recognized by archive feature. Commit. Fixes bug #492435.
- Use custom spin box allowing arbitrary digits for speed dialog. Commit. See bug #492274.
- Fix configure toolbars messing UI layout. Commit.
- Fix mouse wheel changing parameter effect on scroll. Commit.
- Fix effect stack layout issues. Commit. See bug #492314.
- Port away from depreciated qSetGlobalQHashSeed(). Commit.
- Port QCheckBox away from depreciated stateChanged to checkStateChanged. Commit.
- Port depreciated qAsConst to std::as_const. Commit.
- Drop support for Qt5. Commit.
- Effects List: ensure deprecated category is always listed last. Commit.
- Fix tabulations in Titler (requires latest MLT git). Commit.
- Titler: ensure only plain text can be pasted, prepare support for tabulations (needs MLT patch). Commit.
- Disable track / clip effect stack now create an undo entry. Commit.
- Archiving: when archiving used clips only, remove unused clips from Project Bin. Commit.
- Fix archive doesn’t save the video assets when run multiple times. Commit.
- Automatic backup now correctly saves and restores subtitles. Commit. See bug #490459.
- After a crash, recover last subtitle file if possible. Commit. See bug #490459.
- Fix document notes timecode links may be broken after project reload. Commit. See bug #443597.
- Correctly refresh EffectStack when en/disabling built-in effects. Commit.
- Ensure non keyframeable params appear on top of keyframable, fix effect stack layout glitch. Commit.
- Fix some effects like obscure broken in monitor. Commit.
- Fix broken qml font on AppImage. Commit.
- Cleanup Text Based Edit Widget to make it more consistent and use less space. Commit.
- Remove virtual keyword when we use override. Commit.
- Remove incorrect taskmanager unlock. Commit.
- Fix transcode log sometimes empty. Commit.
- Fix various composition parameter layout issues. Commit.
- Minor fixes for MSVC. Commit.
- Update kiss_fft. Commit.
- Revert “Fix checkpackages generating an exception when run”. Commit.
- Fix checkpackages generating an exception when run. Commit.
- Remove duplicate include. Commit.
- Fix some compile warning. Commit.
- Align all job progress to same width in clip monitor. Commit.
- Fix mem leak in asset params and composition view corruption. Commit.
- Improve drag and drop of effects, don’t create 2 separate entries on dropping effect from list. Commit.
- Fix effect stack scroll on drag. Commit.
- Add Actions to quickly add Marker/Guides in a specific category. Commit.
- Redesign effect parameter widgets and introduce built in effects. Commit.
- Add a control uuid to each bin clip to ensure clips can not get mixed on project opening. Commit.
The post Kdenlive 24.12.0 released appeared first on Kdenlive.
CKEditor: CKEditor 5, now with self-service licensing and version override for Drupal
The Python Show: 50 - Imposter Syndrome
Imposter syndrome is a topic that some engineers and developers struggle with. It’s basically a type of self-doubt. WebMD has a good description and some good ideas for fighting self-doubt.
Ways to combat imposter syndrome:
List out your accomplishments on a regular basis (keep it in a Google doc)
Review the list
If you receive compliments, record them (make a copy, write it down, take a screenshot) and store those too
Reminder: you will never stop learning. Embrace it!
🚨 Python devs, this one’s for you. If you’re tired of struggling with context-unaware coding tools, let me introduce you to a game-changer I’ve been exploring: Zencoder.
Here’s why it’s caught my attention:
1️⃣ Python-friendly to its core. Whether you’re building web apps, analyzing data, or automating tasks, Zencoder delivers context-aware suggestions that actually understand your project. No more “guessing” code completions. But don't worry it supports other programming languages as well!
2️⃣ Custom AI agents you can create and tweak. Imagine having a bot that automates your repetitive Python tasks—refactoring, testing, debugging—leaving you free to tackle the fun parts.
3️⃣ Natural language to code magic. Want to build a quick game for fun or a Python script in seconds? Just describe it in plain English, and Zencoder makes it happen. (Yes, it’s that good.)
I’ve also been loving how it seamlessly supports unit testing and bug fixing—a massive time-saver for clean code lovers like me.
Check out Zencoder if you’re looking for an AI assistant that actually gets Python devs:
Droptica: Drupal 11 - Release Date, Features, and What to Expect
This year, we lived to see the release of a new version of Drupal. Drupal 11 brought many new features, such as intuitive menus and ready-made configurations (called recipes), making it an even better choice as a platform for building a dedicated CMS. How does this system differ from previous versions, and how can you take advantage of its capabilities when building your website? Find out why you should consider choosing this system or upgrading to Drupal 11.
Freelock Blog: Add conflict detection on reservation forms
Our Yacht Club client has three workslips that members can reserve for up to 3 days. Using core taxonomy, content types, views, and the Events, Conditions, and Actions (ECA) module, we built a system to allow members to make reservations, and have the system prevent double-bookings.
2024 end-of-year review: policy and standards
As 2024 draws to a close, the Open Source Initiative (OSI) reflects on an eventful year marked by significant achievements in advocating for Open Source principles in policy and standards development worldwide. Below, we highlight key milestones, initiatives and ongoing work from the year.
Global engagementsColumbia Convening on AI: Led by the Mozilla Foundation and the Columbia Institute of Global Politics, OSI participated in this collaboration to build a framework for openness in AI. The convening produced technical and policy memorandums advancing the discourse on open and equitable AI development.
United Nations “OSPOs for Good”: OSI participated in a panel on this NYC event, emphasizing Open Source’s role in defining Open Source AI. Collaborative discussions underscored the growing recognition of Open Source in global governance.
Open Source Congress: OSI participated in the second Open Source Congress, hosted in Beijing by the Open Atom Foundation. This event fostered collaboration among nonprofit leaders in the Open Source ecosystem.
Digital Public Goods Alliance (DPGA): OSI continued its active role as a member of the DPGA, contributing to the Annual Members Meeting held in Singapore. The event highlighted OSI’s involvement in promoting open standards, software and AI models as part of the global ecosystem of Digital Public Goods.
European policy workCyber Resilience Act (CRA): After having successfully helped the community to understand the challenges of the first draft of the Cyber Resilience act, OSI’s focus shifted to implementation in the second half of the year, joining the Eclipse Open Regulatory Compliance Group, a group designed to help Open Source developers implement the CRA. In addition to this, we are preparing to work with European standardization organizations to ensure the standards developed for the CRA are implementable for Open Source developers.
Standardization Advocacy: OSI provided feedback on the Standard Essential Patents Regulation and standardization frameworks, ensuring they align with Open Source principles. Efforts included ensuring software standards can be freely implemented by the community. In parallel to this, OSI is working to find ways to involve Open Source developers in the standardization process. OSI remains a member at ETSI and regularly engages with representatives of other standards bodies.
Collaboration with Eclipse Foundation: A Memorandum of Understanding with the Eclipse Foundation marked a strategic partnership to influence Open Source AI policy and the implementation of the Cyber Resilience Act.
AI Act Advocacy: After the introduction of an exemption for Open Source AI in the AI act, lawmakers have faced an unprecedented wave of openwashing in the AI space. OSI has expanded its educational efforts, meeting with lawmakers and staffers, presenting the Open Source AI Definition, and highlighting cases of openwashing. In addition to this, OSI was selected as one of the stakeholders for the drafting of the Code of Practice on General-Purpose AI, a set of rules designed to help companies comply with the AI act. OSI has used this opportunity to help address some of the challenges Open Source AI developers face, and to clearly differentiate between Open Source and open weight AI.
New Appointments: OSI welcomed Jordan Maris as EU Policy Analyst, strengthening its advocacy presence in Brussels.
Community Outreach: Blogs, workshops and participation in conferences like FOSDEM and CPDP-ai in Brussels ensured robust engagement with diverse stakeholders.
U.S. policy workOpen Policy Alliance: Designed to bring nonprofit organizations together, the OPA focuses on educating and informing U.S. public policy decisions related to Open Source software, content, research and education. OSI’s leadership in the OPA strengthened policy efforts across the U.S., including invited participation roundtables with federal agencies, responding to public calls for comments on security, sustainability and open source AI models, educating policymakers on Open Source’s societal benefits, and securing philanthropic support for Open Source policy initiatives.
AI Policy Development: Partnering with Carnegie Mellon University, OSI co-founded the Open Forum for AI, focusing on human-centered AI development. The initiative reflects OSI’s commitment to ensuring AI policies protect openness and transparency.
Federal Advocacy: OSI contributed responses to Requests for Comments (RFCs) on AI and cybersecurity, emphasizing the value of openness in safeguarding public interest, working together with other organizations like the Mozilla Foundation and the Center for Democracy & Technology.
Community Outreach: Blogs, workshops and participation in events like All Things Open in Raleigh, NC and Open Forum for AI in Washington D.C. fostered strong engagement with a diverse range of stakeholders.
Looking ahead: 2025The year ahead promises continued focus on:
- Implementing AI Act and CRA provisions
- Expanding outreach and educational programs for policymakers
- Strengthening global partnerships
OSI remains committed to championing Open Source principles in the policy landscape, ensuring developers and communities worldwide thrive in an environment of transparency, collaboration and innovation.
We extend our gratitude to our partners, allies and community members for their support in advancing OSI’s mission. Together, we are shaping a more open and equitable future. Please consider donating to or sponsoring the OSI.
Smartbees: Drupal Scheduler Module – What Is It and How Can It Help You Manage Content?
Scheduler is one of many modules that have contributed to facilitating content management on Drupal-based websites. The CMS is highly efficient and widely used by universities, businesses, and others, necessitating additional automated publishing options.
The Drop Times: Drupal Needs to Innovate: Neurodiversity Might be the Answer
CodeLift: Terminology for Drupal Migration Projects
The Drop Times: From Data to Impact: How a Decoupled Drupal & Gatsby Transformation Empowered IDMC’s Global Advocacy
Python Software Foundation: PSF Grants: Program & Charter Updates (TLDR)
The PSF Board and Staff have recently undertaken a review and update of our Grants Program to ensure its sustainability and alignment with the evolving needs of the global Python community. To share the outcome of our review, we are publishing a three-part series that outlines:
- Context and our process (Part 1)
- The program’s newly established Guiding Principles (Part 2)
- Upcoming changes to the Grants Work Group Charter & Program (Part 3)
At their recent retreat, the PSF Board outlined updated priorities for the Grants Program, which PSF Staff translated into guiding principles. Staff conducted extensive scenario analysis using grant data, and after careful consideration, the PSF Board unanimously approved changes to the Grants Work Group Charter on December 11, 2024.
To help the community understand the changes and ensure we keep our
two-way communication strong, we are going to hold two supplementary PSF Grants Program Office Hours on the PSF Discord. The office hours will be at varying times through January and February on top of our regularly scheduled office hours:
- January 7th, 4PM Eastern, 9PM UTC (supplementary)
- January 21st, 9AM Eastern, 1PM UTC (regular)
- February 4th, 4PM Eastern, 9PM UTC (supplementary)
- February 18th, 9AM Eastern, 1PM UTC (regular)
Learn more about the context and our process in Part 1 of the blog series.
The PSF Board, with support from PSF Staff, developed a set of Guiding Principles to provide clear direction for our Grants Program. The principles for the program are:
- Impactful
- Reliable
- Equitable
- Transparent
- Sustainable
The process involved discussions at the Board retreat, refinement by Staff, and final approval by the Board. These principles informed the recent updates to the Grants Work Group Charter.
Learn more about the Guiding Principles for the Grants Program in Part 2 of the blog series.
The PSF Board has approved updates to the Grants Work Group Charter, effective March 1, 2025, to ensure the program's sustainability. To implement the changes across our documentation, application form,
and grant report form, we will be pausing incoming Grants requests for
the entire month of February 2025. While there are a handful of changes, we want to highlight two updates that will be most impactful.
To align with the guiding principles, the PSF is pausing funding for certain grant types. Paused categories include:
- Development work
- Kids Coding Camps
- Sprints
- Training Programs
- Workshops requiring equipment
- Other
To maintain financial sustainability, caps will apply to grant types:
- Conferences: $8,000 USD
- Workshops without equipment: $1,500 USD
- PyLadies/DjangoGirls Workshops: $1,500 USD
- Consolidated requests will be capped accordingly, with a maximum of $15,000 USD per year for any organization or event organizer.
Learn more about all of the updates to the Grants Program & Workgroup Charter in Part 3 of this series.
We recognize the challenges these changes may pose and we’re committed to supporting the community through:
- Aggregating a library of event organizing materials and resources
- Additional Grants Program Office Hours will be held in January and February 2025, alongside regular sessions, to discuss changes and community feedback.
- Monitoring the impact of these updates through quarterly reviews and community feedback.
We have kicked off a thread on Discuss.python.org for those who prefer
asynchronous discussion. Additionally, we welcome you to join the PSF Board Office Hours on the PSF Discord in the upcoming months to discuss these changes. You are also welcome to email psf@python.org to contact the PSF Board, or grants@pyfound.org to reach the Staff who administer the PSF Grants program.
Python Software Foundation: PSF Grants: Program & Charter Updates (Part 3)
The PSF Board has approved a new Grants Work Group Charter, effective March 1, 2025. To implement the changes across our documentation, application form, and grant report form, we will be pausing incoming Grants requests for the entire month of February 2025. Any applications already in the system will be processed normally.
As described in Part 1 and Part 2 of this blog post series, these updates are being made to ensure the sustainability of the PSF and our Grants Program. They are informed by the program's newly established Guiding Principles, which have also been added to the charter. If you want to get a better understanding of why and how these changes have been made, please read the preceding parts of this series.
The last update we made to the Grants Work Group Charter focused on process improvements based on grantee feedback, such as increasing the process time frame, clarifying the purpose and expectations around schedule review, and establishing participation requirements for the Work Group members. Due to the increasing popularity of the PSF Grants Program, the current update is focused on moderating spending. While we wish we could support every Python-related initiative for exactly what they need to be a smashing success, we need to ensure that the program continues supporting Python and Pythonistas for years to come and is balanced with all of the other initiatives and programs the PSF supports.
As of March 1, 2025, we are pausing certain categories of grant types, listed below. We want to share that the number of grants we award in these categories is significantly smaller than the number of conference requests we award (e.g. 3 development grants versus the 50+ conferences grants in 2024). Even still, based on the Guiding Principles we outline in Part 2 of this blog post series, we want to:
- Ensure that we evaluate and fund in our areas of expertise, and
- Prioritize high returns on investment in terms of community impact.
This means prioritizing grant categories that fall squarely within our expertise and which we know have a high community impact.
The grant types that will be paused are:
- Development work
- Kids Coding Camps
- Sprints
- Training Programs
- Workshop with equipment
- Other
You might be thinking, “wait, why pause development work grants? Aren't those squarely in the PSF Grants Program scope?” The PSF already directs both earmarked and general funds to five wonderful full-time Developers-in-Residence to work on things we can confidently say are making a significant impact on the Python programming language in critical areas. While we would love to fund many small Python-related development projects, we feel that we aren’t positioned to adequately measure the impact of these grants. The same applies to sprint-related grants, which are often co-located at Python-related conferences that we fund separately.
Evaluating kids' coding camps and training programs poses different challenges, and we also have a similar issue around understanding the impact of these initiatives. We also feel that our current grants process is not well suited to these requests, and would fit better in a quarterly or yearly review process overseen by educational experts.
The hope long term is to “unpause” these categories with the proper amount of funding and expertise available to the Grants Program and Work Group.
As of March 1, 2025, each category of eligible grant type has a maximum amount, or “cap” that can be awarded. The caps were developed by running scenarios on 2024's grant data to attain a sustainable budget that fits the PSF’s financial guidelines. This approach, instead of limiting awards based on types of spending like travel assistance or catering, reinforces trust in our applicants and community to use grant funds to best serve their respective needs.
The per-event caps are as follows:
- Conferences: $8,000 USD
- Workshop Without Equipment: $1,500 USD
- PyLadies Workshop: $1,500 USD
- DjangoGirls Workshop: $1,500 USD
- Consolidated grant requests will be capped according to the figures above.
- Example: Python Neptune is organizing one PyCon Conference and 3 workshops in 2025. They would be eligible to receive up to $12,500 USD.
- Any organization, event, or individual organizing multiple activities will be granted a maximum of $15,000 USD per year.
- This does not include individuals who participate and submit applications on behalf of multiple organizing committees.
We understand that for some applicants, this won’t make a big difference and for others, this could make a big difference. The thought process for this change is that larger more mature conferences and organizations that take on ambitious efforts should put a significant effort towards fundraising from multiple sources. As mentioned in Part 1 of this series, we intend to aggregate a library of resources for event organizers to help develop skills such as fundraising and negotiating with vendors.
As of March 1, 2025, we will only consider funding for a maximum of 4 days of conferences and 2 days for workshops. For context, the Grants Work Group uses a “per person/day” guideline to help determine how much funding to award. Those amounts are $15 per person/day for conferences, and $25 USD per person/day for workshops. Here’s what that looks like in practice:
- Python Neptune is organizing a 5-day event with conference, tutorial, and sprint days, and they anticipate 125 attendees.
- Under the current guidelines, the Grants Work Group would consider awarding a maximum of $9,375 USD.
- Moving forward, with the 4-day funding limit, the figure the Grants Work Group could consider awarding a maximum of $7,500 USD.
The idea here echoes the reasoning for the grant caps– larger and more ambitious events are typically more mature and should have multiple sources of sponsorship. Additionally, attendance typically isn’t steady across events that include more than just conference days (most people show up for talks, only some stay to sprint). Instead of analyzing attendance forecasts for each day of an event (more work for applicants, administration, and the Grants Work Group), we are establishing caps by number of days.
If you’ve applied for multiple grants through the PSF Grants Program, you are aware that we require reports for prior awards before we consider any subsequent requests, which is stated in the Grants Program documentation. Previously, this was not stated in the Grants Work Group Charter and has now been added to the ‘Grant Application Guideline’ section of the charter.
Under the last update to the Grants Work Group Charter, the threshold for PSF Board review increased to $15K. Now that we have capped our grant awards to $15K, this no longer applies. After rethinking this aspect of our Grants Program, the Board will now review consolidated grant requests, as these are usually comprehensive applications that have region-wide implications.
We want to recognize and note a few things:
- These are not small changes
- They will have a varying degree of impact on Python initiatives and events across the globe
- For those who are not familiar with the ins and outs of how we award grants, parts of these updates may be confusing
- We believe some folks will want to discuss these changes, ask questions, and point out where we can continue to improve
- We plan to monitor the impact these changes have on the Grants Program and will consider additional updates if required
To help the community understand the changes and ensure we keep our
two-way communication strong, we are going to hold two supplementary PSF Grants Program Office Hours on the PSF Discord. The office hours will be at varying times through January and February on top of our regularly scheduled office hours:
- January 7th, 4PM Eastern, 9PM UTC (supplementary)
- January 21st, 9AM Eastern, 1PM UTC (regular)
- February 4th, 4PM Eastern, 9PM UTC (supplementary)
- February 18th, 9AM Eastern, 1PM UTC (regular)
Python Software Foundation: PSF Grants: Program & Charter Updates (Part 2)
The PSF Board, with the support of PSF Staff, has outlined a set of Guiding Principles for the PSF Grants Program, as mentioned in Part 1 of this series of blog posts on updates to the program. The Board has a duty to promote, protect, and advance the Python programming language, and to support and facilitate the growth of a diverse and international community of Python programmers. The Board is comprised of Python-related founders, developers, organizers, and contributors of all stripes, from all over the globe. Not only does the PSF Board have a duty to uphold the mission of the PSF, but any updates made to the PSF Grants Program (or any PSF program) are founded on their diverse, real-life experiences.
As the Grants Program has continued to grow in popularity and we went past the ceiling of its budget, it became clear that it needed strategic guidance. The PSF Board discussed the program and its priorities at their recent retreat. The notes from that discussion were passed to PSF Staff, who translated the priorities into Guiding Principles for the Grants Program. From there, the PSF Board and PSF Staff collaborated on refining the principles, which the Board approved with a vote. The outcome of these exercises that now reside in the Grants Work Group Charter is copied directly below.
The PSF Grants Program supports hundreds of Python-related projects, events, and initiatives globally. To facilitate a sustainable grant program, the PSF Board established guiding principles for the program and funding.
The guiding principles of the PSF Grants Program are:
- Impactful
- Reliable
- Equitable
- Transparent
- Sustainable
The guiding principles behind the PSF Grants Program funding are:
- Strive for geographic equity
- Prioritize underserved communities
- Prioritize high returns on investment in terms of community impact
- Invest in both new and existing communities
- Evaluate and fund in our areas of expertise
- Ensure Python and Pythonistas are supported
These Guiding Principles give the program a well-defined direction and a grounding in where we can commit to being accountable, in a plainly stated manner. This does a couple of things:
- Inform updates to the Grants Work Group Charter
- Serves as a point of reference for the Grants Work Group and PSF Board to consistently make decisions regarding grant requests and the program overall
- Helps the Grants Work Group Chair (currently Marie Nordin, PSF Staff), steward the program and guide the Work Group
- Provides transparency to applicants about why their request may or may not be funded
- Directly answers the community's call for transparency about how decisions are made
- Informs the PSF and its Staff about future improvements to the program
We hope that establishing these Guiding Principles will bring a better understanding to the community about the PSF Grants Program. We welcome you to join either the PSF Board or PSF Grants Program Office Hours on the PSF Discord to discuss these updates, ask questions, and point out where we can continue to improve. Additionally, we have kicked off a thread on Discuss.python.org for those who prefer asynchronous discussion. You are also welcome to email psf@python.org to contact the PSF Board, or grants@pyfound.org to reach the Staff who administer the PSF Grants program.
Python Software Foundation: PSF Grants: Program & Charter Updates (Part 1)
The PSF Board and Staff have continued to work over the past couple of months to improve and steward the PSF Grants Program to fit the changing needs of the Python community. As we mentioned in our November 2024 updates (part 1, part 2), our Grants Program is more popular than ever as grant requests arrive in record numbers. The PSF is thrilled that the program positively impacts so many Pythonistas across the globe (approximately 30,000 in 2024 so far!). That’s what our work at the PSF is all about.
Unfortunately, this puts us in one of those “great problems to have” situations. In 2022, the Grants Program awarded $215K USD and increased to about $400K USD in 2023. In 2024, we estimate grants spending to be around $600K USD. While we were delighted to provide that level of support to the Python community in 2024 and that our community is so active, the PSF has to return grants funding to a more sustainable level that fits with all of the other Foundation programs. The PSF maintains critical community infrastructure, hosts PyPI, produces PyCon US, administers the fiscal sponsoree program, manages several Developers-in-Residence, and much more. Balancing the Grants Program with everything else the Foundation does is critical to both the sustainability of the PSF and the community.
Grants funding requests increased dramatically in 2024, which led the PSF to take a step back and re-evaluate the grants program’s goals and priorities. With this in mind, the PSF Board took time at their recent retreat to outline priorities for the PSF Grants Program. PSF Staff translated the outcome of that discussion into guiding principles for the program, which you can read more about in Part 2 of this series of posts.
The guiding principles for the program informed the most recent updates to the Grants Work Group Charter, which we go into further in Part 3 of this update. PSF Staff devoted many hours running different scenarios based on grant data to understand what impact different changes will have on our community and on our financial sustainability. The PSF Board worked with Staff over the past couple of months weighing the pros and cons of each change, taking extra meetings, reviewing documents, figures, and more. PSF Staff translated the outcome of all this work into proposed changes to the Grants Work Group Charter.
The PSF Board approved updates to the Grants Work Group Charter during the December 11, 2024, PSF Board meeting. Our newly established Grants Program guiding principles commit to transparency and communication. Along those lines, the changes to the Grants Program will take effect on March 1, 2025. To implement the corresponding updates across our documentation, application form, and grant report form, we will be pausing incoming Grants requests for the entire month of February 2025. Any applications already in the system will be processed normally. Make sure to read Part 3 in this series to understand if the changes impact any events or initiatives you organize.
After February, we will regularly monitor how Program changes impact spending, the program overall, and the community, including formal quarterly reviews.
We understand that changes to the PSF Grants Program will have an impact on the Python community, and we do not make these or any workgroup charter updates lightly. We are also experiencing the tech budget crunch alongside you– and we are working to ensure sustainability across all of our work. For example, we are making significant adjustments to how we are producing PyCon US to help cut costs. We are a relatively small Foundation and rely on our members, donors, and sponsors (opportunities can be found in our sponsorship application form!)
Ultimately, the updates are meant to continue to provide support to the area where we see the most impact: conferences and workshops. Bringing all levels of Python folks together to connect, learn, and grow together. Providing Pythonistas the opportunity to have those life-changing experiences and strengthen lifelong friendships at PyCons all over the world. Sparking the love for tech, programming, and Python at workshops where folks code their first website, or meet the mentor that changes the trajectory of their life. The changes are also meant to provide support to new or smaller events- those that need financial support more than mature conferences that can attract sponsorships.
To support the Python community and help work to fill gaps, the PSF Board & Staff intend to aggregate a library of event resources to support our grant applicants and community. Fundraising, negotiating, and organizing are learned skills we can all continue developing together.
To help the community understand the changes and ensure we keep our two-way communication strong, we are going to hold two supplementary PSF Grants Program Office Hours on the PSF Discord. The office hours will be at varying times through January and February on top of our regularly scheduled office hours:
- January 7th, 4PM Eastern, 9PM UTC (supplementary)
- January 21st, 9AM Eastern, 1PM UTC (regular)
- February 4th, 4PM Eastern, 9PM UTC (supplementary)
- February 18th, 9AM Eastern, 1PM UTC (regular)
Additionally, we have kicked off a thread on Discuss.python.org for those who prefer asynchronous discussion. Last but not least, you are welcome to email psf@python.org to contact the PSF Board, or grants@pyfound.org to reach the Staff who administer the PSF Grants program.