PaintFE Docs
Guides for using, extending, and contributing to PaintFE. Start anywhere — these pages are meant to be skimmed.
Keyboard Shortcuts
These are default shortcuts. All keybinds can be customized in Edit > Preferences > Keybinds.
Supported File Formats
PaintFE reads a broad set of formats and exports to the most common ones.
Each layer becomes one frame. Set FPS and loop settings in the Export dialog. GIF includes per-frame palette quantization.
15 Languages, Built In
PaintFE ships with full UI localization in 15 languages. Switch via View → Language. No restart required.
To add a new language, copy locales/en.txt, translate the strings, and submit a pull request on GitHub.
Setting Up AI Background Removal
PaintFE's AI background remover is entirely local. No cloud, no data leaves your machine. You bring your own ONNX Runtime and model. This is intentional: we want you to stay in control.
AI tools affect the livelihoods of many creators. PaintFE's AI feature removes backgrounds. It does not generate images or art. We believe these are meaningfully different, but we still want you to know exactly what it does and where the model file comes from. You choose the model. You can also simply not use it.
onnxruntime.dll, Linux: libonnxruntime.so).
| Model | Input Size | Quality | Speed |
|---|---|---|---|
| BiRefNet | 1024×1024 | Excellent | Slow (GPU recommended) |
| U²-Net | 320×320 | Good | Fast |
| IS-Net (DIS) | 1024×1024 | Excellent | Moderate |
Headless Batch Processing
PaintFE runs headlessly from the command line. Point it at one file or a glob of thousands, apply a script, convert formats, and get output back, all without opening the GUI.
| Flag | Short | Description |
|---|---|---|
| --input | -i | Input file path or glob pattern. Required. Triggers CLI mode. |
| --script | -s | Path to a .rhai script to apply to each file. |
| --output | -o | Output file path. Used for single-file processing. |
| --output-dir | Output directory for batch processing. Created if it does not exist. | |
| --format | -f | Output format: png, jpg, webp, bmp, tiff, gif, pfe. |
| --quality | -q | JPEG/WebP quality 0–100. Default is 90. |
| --tiff-compression | TIFF compression: none, lzw, deflate. |
|
| --flatten | Merge all layers to a single flat image before saving. | |
| --verbose | -v | Print per-file progress and result summary. |
PaintFE exits with code 0 if all files succeeded and 1 if any file failed (processing continues on failure). Existing format handling, script canvas-ops, and all supported file formats work exactly as they do in the GUI.
Frequently Asked Questions
rayon, zero-cost Arc clones, and bytemuck transmutes make the performance work feel natural rather than dangerous.
.exe can be run from anywhere (USB drive, network share) without installation. If you need the CLI / headless batch mode, use the portable download. For everyday use on Windows, the Store version is the easiest option.
locales/en.txt, translate each value (keep the key names unchanged), name it using the BCP-47 language code (e.g. ko.txt for Korean), and open a pull request on GitHub. That's all there is to it.
map_channels() or for_each_pixel() over manual nested loops; the built-in iterators are optimized.
Use apply_* effect functions instead of reimplementing effects in Rhai; they call optimized Rust code.
If you need to process a specific area, use for_region() instead of checking coordinates inside for_each_pixel().
Avoid unnecessary type conversions in tight loops.
Contribute to PaintFE
PaintFE is open source and welcomes contributions. Whether it's a bug fix, a new filter, a new language, or documentation improvements. All help is appreciated.