jfreundJFPainter
JFPainter

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.

  1. Read the plugin guide and look at the example plugins: Swap channels, Sepia strength, a QOI file type, two shapes and two demo effects.
  2. Describe what your plugin adds: effects with their settings, file types with open and save, or shapes.
  3. Build it with python build_rs.py plugin NAME for Windows, Linux or both. The build checks the result the way JFPainter's loader does.
  4. Copy the .dll or .so into Effects, FileTypes or Shapes, or start the app with --plugins=DIR while 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)
An effect runs on many threads at once, and each pixel may depend only on the picture, the settings and the effect's own preparation, never on how the work is split.

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.

JFPainter's web build in Chrome, in its dark theme, with the same drawing opened: the word Hello, a blue square, a green circle, an orange star and a pink brush stroke, and the Tools, Colors, History and Layers panels.
The web build today, in Chrome. The button opens it here once it is online.
Part of jfreund.orgBuilt with JFLibLegal noticePrivacy