Plugins
JFPainter grows in three ways: with plugins made for it, with the filter collection of G'MIC-Qt, and with many of the paint.net plugins you may already have.
Plugins are a desktop feature. They work on Windows and Linux, not in the browser and not on Android.
Plugins made for JFPainter
JFPainter has its own plugin interface. A plugin is a small library file, a .dll on Windows and a .so on Linux, that you put into one of three folders next to the program: Effects, FileTypes or Shapes. After a restart, what it brings shows up where it belongs.
JFPainter checks every plugin file before it loads it and refuses files that break the rules. A plugin that crashes is switched off with a message instead of taking the app down, and the settings page Plugin errors lists what was loaded and what was not.
- EffectsWith settings of their own: numbers, angles, on and off, choices, colours, a position and a random seed. JFPainter builds the dialog for them.
- AdjustmentsListed in the Adjustments menu after the built-in ones, and used the same way.
- File formatsOpen and save formats JFPainter does not know yet. QOI is one, and comes as an example.
- ShapesNew shapes for the shape tool, next to the built-in ones.
G'MIC-Qt, a large collection of filters
Install the standalone version of G'MIC-Qt separately; the version that lives inside another image editor is not enough. If it is on your system's search path, or you tell JFPainter where it is, Effects › G'MIC-Qt opens its filter window. JFPainter waits with a Cancel button that stops it at any time.
A result of the same size comes back through your selection, as one step you can undo. Several results, or one of a different size, open as a new picture with one layer each. Windows and Linux.
Works
- The filters of G'MIC-Qt on the active layer
- The result through the selection, as one undo step
- Several results as a new picture with layers
- Cancel at any time, the picture stays as it was
Not yet
- More than one layer at a time as input
- More than 8 bits per channel, colour profiles or HDR
- G'MIC-Qt is not part of JFPainter; you install it yourself
paint.net plugins
The Windows setup of JFPainter brings a helper that runs existing paint.net plugins unchanged: effects of both generations, including GPU effects, and file types. It uses your own installation of paint.net 5.1 and its runtime, so you need nothing else, and no part of paint.net is shipped with JFPainter.
Unpack a plugin, copy effects into Effects and file types into FileTypes, and restart. JFPainter also finds the plugins you already use in paint.net. Effects appear under Effects › Paint.NET plugins, and if something cannot run, that menu says why.
On Linux, JFPainter runs the same helper through Wine, which takes a setup of its own. It was tested with WineHQ 11.21 and an experimental paint.net package for Wine.
Works
- Classic and newer effects, on the processor and on the graphics card, with selection, cancel, undo and redo
- File type plugins: open and save their formats
- Plugins in folders of their own, with the libraries they bring
- Tried by hand in November 2026: all 47 effects of BoltBait's plugin pack, the 20 published GPU effect samples and a WebP file type plugin
Not yet
- paint.net's own sliders and colour wheels: a plugin's settings appear in a plain list with its labels
- A live preview: the dialog comes first, then the result
- Effects that read other layers see only the active one
- The save dialogs of file type plugins
- 8bf filters: a plugin that hosts them opens its dialog, but no filter has run yet
- After a paint.net update, GPU effects may stop until the helper is updated
A plugin runs with your rights, like any other program. Install only plugins you trust.
Write your own plugin
JFPainter plugins are written in Rust. A plugin is a small no_std library with a single export, pn_plugin_query, and it depends on one crate only: jflib-plugin, which brings the records JFPainter expects and safe views of the pixels.
The documents in the JFLib repository still use the app's working name, PaintCraft.
- Read the plugin guide and look at the example plugins: Swap channels, Sepia strength, a QOI file type, two shapes and two demo effects.
- Describe what your plugin adds: effects with their settings, file types with open and save, or shapes.
- Build it with
python build_rs.py plugin NAMEfor Windows, Linux or both. The build checks the result the way JFPainter's loader does. - Copy the .dll or .so into Effects, FileTypes or Shapes, or start the app with
--plugins=DIRwhile you test.
// plugins/NAME/lib.rs, from the plugin guide #![no_std] #![deny(unsafe_code)] use plugin::*; struct Invert; impl Effect for Invert { type Aux = (); fn render(fx: &mut Fx<'_>, _: Option<&()>) -> Result<(), i32> { for y in fx.y0..fx.y1 { if fx.cancelled() { return Err(ERR_CANCEL); } let (src, dst) = fx.rows(y); for (d, &p) in dst.iter_mut().zip(src) { *d = p ^ 0x00FF_FFFF; } } Ok(()) } } // then the descriptors and plugin::entry!(query)
The plugin guideThe plugin interface in detailThe example plugins
Try it in the browser
Soon JFPainter opens right here, in a window on this page, with nothing to install. The browser version has the built-in tools and effects; plugins need the desktop app.