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.

File
New Canvas
Ctrl+N
Open File
Ctrl+O
Save
Ctrl+S
Save As
Ctrl+Shift+S
Export As
Ctrl+E
Print
Ctrl+P
Quit
Ctrl+Q
Edit
Undo
Ctrl+Z
Redo
Ctrl+Y
Cut
Ctrl+X
Copy
Ctrl+C
Paste
Ctrl+V
Select All
Ctrl+A
Deselect
Ctrl+D
Paint Tools
Brush
B
Pencil
P
Eraser
E
Fill Tool
F
Gradient
G
Line Tool
L
Select Tools
Rect Select
S
Lasso
J
Magic Wand
W
Move Pixels
M
Utility Tools
Color Picker
I
Text Tool
T
Zoom Tool
Z
Pan Tool
H
View
Zoom In
Ctrl++
Zoom Out
Ctrl+-
Fit to Screen
Ctrl+0
Toggle Pixel Grid
Ctrl+G
Scroll Wheel Zoom
Scroll
Pan (while on tool)
Space drag

Supported File Formats

PaintFE reads a broad set of formats and exports to the most common ones.

Open (Read)
PNG JPEG WebP BMP TIFF TGA GIF (animated) APNG (animated) PFE (project) CR2 / CR3 / NEF / ARW / DNG (RAW) ORF / RW2 / SRW / PEF / RAF
Export (Write)
PNG JPEG WebP BMP TIFF TGA ICO GIF (static + animated) APNG (animated) PFE (layered project)
Animated Export Options
Animated GIF Animated PNG (APNG)

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.

🇬🇧
English
🇩🇪
Deutsch
🇫🇷
Français
🇪🇸
Español
🇵🇹
Português
🇮🇹
Italiano
🇷🇺
Русский
🇵🇱
Polski
🇳🇱
Nederlands
🇹🇷
Türkçe
🇯🇵
日本語
🇨🇳
简体中文
🇹🇼
繁體中文
🇧🇾
Беларуская
🌐
Fandom (FE)

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.

⚠️ Honest disclaimer

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.

Step 1: Download ONNX Runtime from github.com/microsoft/onnxruntime. Get the version matching your OS (Windows: onnxruntime.dll, Linux: libonnxruntime.so).
Step 2: Download a supported model: BiRefNet, U²-Net, or IS-Net (DIS). These are open-source research models. Links available in Preferences → AI tab.
Step 3: Open PaintFE → Edit → Preferences → AI. Set the ONNX Runtime path and the model path. Click Test to verify.
Step 4: The Filter → Remove Background menu item will become active. Select a layer and run it.
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.

paintfe --input "photos/*.png" --script effects.rhai --format webp --quality 85 --output-dir ./out/
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

Why is it called PaintFE?
Two reasons: it does what it says (it's a paint and image editor), and FE is the periodic table symbol for Iron. Since the whole thing is built in Rust, it felt like a fitting nod to the language. If you want to read the FE as an acronym for something else, go for it; nobody is going to stop you.
Was AI used to build PaintFE?
Yes, and it's part of the origin story. Kyle (the developer) was gifted a GitHub Copilot trial and used it as an excuse to learn Rust, building this project as an experiment. That experiment got out of hand in the best possible way. Having AI speed up the initial boilerplate meant the focus could stay entirely on design and architecture, turning a small test into a fast, free tool worth releasing. The architecture, GPU pipeline, rendering logic, and every design decision were driven by a human. All generated code was reviewed, tested, and understood before it was committed. We're being upfront about this because we think you deserve to know.
Is PaintFE really free? No catch?
Yes. Free, no subscription, no account, no telemetry, and no catch. PaintFE is MIT-licensed open source software. You can use it commercially, fork it, and redistribute it. We don't collect any usage data.
Why does PaintFE use Rust instead of C++?
Honestly, the lead developer wanted to learn Rust and built this project as an experiment with the language and some new coding tools. It turned into something worth shipping. The language choice ended up being a good one: memory safety without a garbage collector means no GC pauses mid-stroke on a 4K canvas, and idiomatic Rust patterns like rayon, zero-cost Arc clones, and bytemuck transmutes make the performance work feel natural rather than dangerous.
Does PaintFE work on macOS?
PaintFE is developed and tested on Windows and Linux. macOS support is technically possible via wgpu's Metal backend, but it has not been tested or released. Community builds are welcome; see the GitHub repo.
How does undo work? Will it eat all my memory?
PaintFE uses a tiered undo system. Brush strokes store a PixelPatch of only changed pixels, a small delta. Most filter/adjustment ops store a single-layer snapshot using copy-on-write Arc tiles: a snapshot of an unmodified 4K canvas costs ~36KB instead of ~64MB. Only canvas-wide operations (resize, flatten) take full snapshots. A history memory limit is enforced and visible in the History panel.
Can I contribute a new language / translation?
Yes! Copy 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.
The script I wrote is running slowly. What should I do?
Prefer 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.

Report Bugs
Open an issue on GitHub with steps to reproduce, OS, GPU, and a screenshot if possible.
Request Features
Open a feature request issue describing the use case and what you'd expect the feature to do.
Edit the Docs
Spot a mistake in the docs? PRs for fixes are always welcome on GitHub.
Open GitHub →