PaintFE Docs
Everything you need to use, extend, and contribute to PaintFE. Start anywhere; the docs are designed to be skimmable.
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.
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.