Skip to content

Repository files navigation

Patchy Image Editor

Patchy is a free, open-source image editor for Windows, macOS, and Linux, built for accurate PSD and PSB editing and round trips with Adobe Photoshop. It supports editable text and vectors, masks, layer styles, Smart Objects and Smart Filters, legacy 8BF plug-ins, JavaScript scripting, and command-line automation.

The browser version is the same editor compiled to WebAssembly. It runs entirely on your machine and nothing you open or make is sent online. The desktop builds are the faster and more capable way to use Patchy: they are not limited to a browser tab's 4 GB of memory, and they add printing, scanner and camera import, and command-line automation.

Screenshots

Click a thumbnail for the full-size image.

Levels adjustment dialog over an image with a live histogram and input and output controls
Non-destructive adjustment layers with live preview and editable settings
Layer Style dialog applying bevel, stroke, glow, and shadow effects to text
Layer styles with multiple effects, blending controls, and Photoshop-compatible presets
Brush Tip Manager showing a collection of textured and shaped brush presets
Brush tip presets, import, management, spacing, angle, roundness, and texture controls
Brush Dynamics dialog with pressure and random controls beside a varied brush stroke
Pressure-aware brush dynamics for size, opacity, flow, angle, scatter, and color
Palette editing mode with a limited color palette and indexed-looking pixel art
Palette mode constrains painting and editing to a document color set
Trace Image to Shapes dialog converting a stylized sunset landscape into editable vector shape layers, with anchor points marked on the traced preview
Trace Image to Shapes turns any image into editable vector shape layers, with Illustrator-style presets and a live traced preview
Warp Text dialog with the style list open over a poster with arced rainbow text and flag, fisheye and twist warped words
Warp Text with live preview: all 15 Photoshop warp styles on editable rich text
Pixel-art grass and path tile repeating across the whole canvas in seamless tiling mode, with a painted black line wrapping across every tile edge
Seamless tiling mode for game textures: paint on the canvas and strokes wrap live across every tile
Game title art with a smart object mid warp transform showing the Bezier cage, and its embedded contents open in a second tab
Smart Objects: Warp Transform bends them non-destructively, Edit Contents opens the embedded file in its own tab
Pattern Manager showing the Textures folder with the bundled CC0 Weathered Marble photo texture selected in the large preview
Photo textures in the Pattern Manager, with full-resolution preview, import, organization, and editing
Photo with a Smart Filter stack containing Surface Blur, Dust and Scratches, and Gaussian Blur plus a shared mask
Editable native Smart Filters with one paintable shared mask and per-filter controls
Camera Raw develop dialog showing a snowy mountain photo with white balance, tone, color, and detail controls
16-bit Camera Raw development with white balance, tone, color, demosaic, and denoise controls
Tilt-Shift Blur in the Filter Gallery over a real San Francisco city photograph with draggable focus controls
Tilt-Shift Blur with live on-image focus, angle, and transition controls
Layer Style dialog applying Riveted Steel to large text from the built-in Materials preset folder
Material layer styles backed by bundled CC0 wood, stone, metal, fabric, and ground textures
Quick Mask mode showing a clean feathered portrait-frame selection as a red overlay with the temporary Quick Mask channel visible
Quick Mask turns a selection into a brush-editable red overlay, then back into marching ants
Flat vector sunset poster built from shape layers, with Direct Select showing a mountain ridge's anchors and the Paths panel floating beside the canvas
Vector shape layers: gradient fills, pen paths, anchor editing, and the Paths panel
Shape Appearance dialog editing a rounded-rectangle badge with a Golden Hour gradient fill, dashed stroke, and per-corner radius controls, beside a star with a rust pattern stroke
Shape fills and strokes: solid, gradient, or pattern paint, dashes, and live corner radii
CC0 hot air balloon SVG clip art opened as editable shape layers with group folders in the Layers panel and the big balloon's bezier anchors selected on canvas
SVG files open as editable shape layers: groups become folders, paths stay live vectors
Script Manager running the bundled Breakout script, with breakout.js code, live run status, and stop button beside the game playing on a real document canvas with brick, paddle, and ball layers
Script Manager running the bundled Breakout: the game plays on a real canvas, with live run status and one-click stop
Duotone script options dialog with instructions, shadow and highlight color fields, and a contrast slider over a photo already remapped to navy and amber
Scripts ask with real options dialogs; the same script runs unattended from the command line with the same defaults
Affinity Photo document open in Patchy as a layered file, the Layers panel showing groups, text layers with effect badges, and raster layers
Affinity Photo, Designer, and Publisher files open as layered documents: groups, editable text, effects, and rasters come through

PSD compatibility, measured

Patchy is tested against Adobe Photoshop 2026 on a mixed PSD corpus. In the completed August 7, 2026 Testy run, Patchy had the strongest non-Adobe render result, Photoshop reopened all 64 Patchy saves, and all 312 text objects remained editable.

Tested editor Files opened Perceptual render match PSD saves rejected by Photoshop Text still editable in resaved PSD
Patchy 879a3a8 64 / 64 98.83% (n=63) 0 / 64 312 / 312
Photopea, web build 63 / 64 97.13% (n=62) 0 / 64 306 / 312
Affinity 3.2.3.4646 61 / 64 88.30% (n=60) 0 / 64 0 / 305
GIMP 3.2.4 62 / 64 88.11% (n=61) 0 / 64 0 / 312
PhotoDemon 2026.01.0251 64 / 64 81.97% (n=63) 0 / 64 0 / 312
Krita 5.3.2.1 56 / 64 81.17% (n=56) 9 / 64 187 / 205

The text column counts original text objects that Photoshop still recognizes as editable text after reopening the editor's PSD save. It does not identify whether conversion happened during import or export.

These are corpus-specific results, not universal product ratings. See the full results and methodology, including the image-free per-file run data, tested versions, native PSD data preservation, Photoshop round-trip rendering, and known limitations.

Download

Windows releases are code signed by Seth A. Robinson; the macOS app is signed and notarized (Robinson Technologies Corporation).

Platform Package Download
Windows 10/11 (64-bit) Installer PatchyWindowsInstaller.exe (35 MB)
Windows 10/11 (64-bit) Portable ZIP (no installer) PatchyWindowsNoInstaller.zip (35 MB)
macOS 12+ (Apple Silicon) DMG - drag to Applications PatchyMacOS.dmg (44 MB)
Linux Flatpak bundle PatchyLinux.flatpak (14 MB)
Any modern browser Nothing to install rtsoft.com/patchy (slower and less capable)

The browser version is the same editor compiled to WebAssembly, and everything runs locally: nothing you open or make is sent online. Use a desktop build if you can. The browser version is slower, it is capped at a browser tab's 4 GB of memory so large documents run out of room sooner, and it leaves out printing, scanner and camera import, and command-line automation.

Linux one-line install (paste into a terminal; fetches the bundle and installs it, pulling the shared KDE runtime from Flathub automatically):

curl -L -o /tmp/PatchyLinux.flatpak https://rtsoft.com/files/PatchyLinux.flatpak && flatpak install -y /tmp/PatchyLinux.flatpak

Optional: opening iPhone HEIC photos on Linux uses the shared Freedesktop codec extension, which bundle installs do not fetch on their own. Patchy will show this command if it is needed:

flatpak install -y flathub org.freedesktop.Platform.ffmpeg-full//24.08

Features

  • Open and save layered PSD and PSB files with groups, masks, clipping masks, saved alpha and spot channels, text objects, Fill Opacity, the full Photoshop blend mode set, layer styles and more
  • Common raster editing tools, including Brush with Flow and timed Airbrush buildup, Healing Brush, Spot Healing, Patch, Clone Stamp, Dodge, Burn, Sponge, Blur, Sharpen, Smudge, Eraser, selections, transforms, gradients, and shapes
  • Vector tools: Pen paths, editable shape layers (Rectangle, Ellipse, Line, Polygon, Custom Shape) with solid, gradient, or pattern fills and strokes, vector masks, path selection and anchor editing, and a Paths panel with fill, stroke, and make-selection commands, all round-tripping through PSD files that open correctly in Photoshop
  • Trace Image to Shapes: converts a pixel layer (logo, scan, photo) into a group of editable shape layers, one per color, with Illustrator-style presets, color, grayscale, and black-and-white modes, abutting or overlapping shapes, noise removal, and a live preview; export the result as SVG
  • Non-destructive adjustment layers (Levels, Curves, Hue/Saturation, Color Balance, Brightness/Contrast, Invert, Posterize, Threshold) with live preview, editable settings, native Photoshop PSD data, and .acv Curves preset import and export
  • Smart Objects: place or convert layers to embedded or linked smart objects, edit or replace their contents, transform them non-destructively, and build editable native Smart Filter stacks (13 filter types) with paintable shared masks and per-filter blending
  • Filter Gallery with 32 effects, live full-resolution preview, ordered effect stacks, favorites, and reusable Saved Looks, plus a manual Liquify workspace with warp, twirl, pucker, bloat, and freeze brushes
  • Photoshop-compatible layer style, pattern, and gradient preset libraries, including .asl, .pat, and .grd import/export, 39 built-in styles, and 20 bundled CC0 photo textures
  • Warp Transform tool and Warp Text with all 15 Photoshop warp styles and live preview
  • Multiple document interface: tabbed documents that can float in their own windows, with Photoshop-style Tile and Cascade arrangement
  • Rich text with per-run color, font, size, and style, plus a searchable font picker and Character controls for leading, tracking, and horizontal or vertical glyph scaling
  • Palettized (indexed color) editing mode for pixel art: paint constrained to a palette, quantize with optional dithering, built-in retro palettes (NES, C64, Game Boy, PICO-8, and more), palette files (.pal/.gpl/.hex/.act/.aco/.ase), and exact indexed PNG-8 and 2/4/8-bit BMP export. Layers, layer styles, and effects all keep working (Photoshop's indexed mode flattens and disables them)
  • Pixel-art and game-dev extras: seamless texture authoring (live tile preview window, in-canvas tiling mode, seam shifting), sprite sheet export/import, image sequence export/import (numbered files become layers and back), animated GIF import/export (frames become layers with their timings in the layer names, visible layers save back as a looping animation, and the layers panel's film button previews the animation in-app), and nearest-neighbor scaled export (2x-8x)
  • Reads and writes a wide range of formats: PSD/PSB, PNG, JPEG, TIFF, WebP, BMP, TGA, GIF, PCX, Amiga IFF/LBM, Windows icons and cursors (ICO/CUR), Aseprite files, JPEG XR (.jxr, on Windows), Proton SDK textures (.rttex), and SVG (opens as editable shape layers, exports with vectors preserved)
  • Imports Affinity documents as layered files: the current .af format, Affinity 2 .afphoto/.afdesign/.afpub, and most Affinity 1.x-era files, bringing across rasters, groups, masks, clipping, blend modes, editable text layers, vector shapes, adjustment layers, layer effects, and placed images (which become embedded Smart Objects)
  • Opens camera raw files (CR2/CR3/NEF/ARW/RAF/DNG and more) through a 16-bit develop dialog, and HEIC/HEIF photos through platform codecs
  • Opens HDR screenshots saved as JPEG XR (.jxr), the format NVIDIA's in-game capture uses, tone mapping the high dynamic range down to 8-bit so highlights keep their detail instead of clipping to white
  • Photoshop-compatible document resolution, physical measurement units, rulers, image sizing, and printing
  • Pen/stylus pressure and size dynamics, GUI scaling, scanner import (Windows and macOS), camera import (Windows), legacy .8bf plugins, and command line options
  • JavaScript scripting: a built-in Script Manager (File > Scripts) with a folder tree over the bundled and user scripts, a code editor with live run status, a documented API covering documents, layers, text, selections, pixels, filters, form dialogs, file pickers, and batch processing, bundled examples ranging from CSV data merge, contact sheets, icon export, and versioned saves to glitch/duotone effects and playable Breakout and Pong (scripts can call other scripts), safe editing of bundled scripts (your saved copy overrides the original and can be reverted), and a --run-script command line flag with script arguments so external tools and AI agents can drive Patchy (add --headless to run with no display, on a server or in CI). See the scripting guide (also under Help inside the app)
  • Cross-platform: Windows is the lead platform, with native macOS (Apple Silicon) and Linux (Flatpak) builds
  • Built with C++ and Qt for a native desktop experience. No GPU used, should run on a potato
  • Privacy: YES! Absolutely no telemetry, no tracking, no data collection (if update checks are enabled, it contacts GitHub only to check for a newer version). Settings live in a plain local file, and the installer doesn't screw with your file extension preferences
  • Localized in English and Japanese (change language in File->Preferences)

What's New

0.91 - September 3, 2026

  • JPEG XR (.jxr) opens and saves on Windows through the codec built into Windows. HDR captures such as NVIDIA's in-game screenshots, stored as floating-point scRGB, tone map down to 8-bit with a knee curve that keeps standard-range colors exact and rolls the highlights off instead of clipping them to white
  • Proton SDK textures (.rttex) open at their true image size rather than the padded power-of-two texture size, and save through an RTPack-style options dialog: raw RGBA8888/RGB888, RGBA4444/RGB565, or an embedded JPEG with a quality setting, all inside the RTPACK zlib wrapper. A plain Save keeps a texture's existing encoding and Save As prefills the dialog with it
  • File > Open accepts several files at once and opens each as its own document, and the Open Recent Folder entries use the same multi-select dialog
  • Hint text names modifier keys for the platform it runs on, so macOS reads Command and Option instead of Ctrl and Alt
  • Fixes: Photoshop CS6 stroke-only shape layers (a stroke with no fill block) import as editable shapes instead of arriving vector-locked, which also lets Free Transform work on any folder or multi-layer selection containing one

0.90 - August 26, 2026

  • PDF is now a first-class format. Opening a PDF imports its pages as editable shape, text, and image layers by default, with a flat-image option, reads password-protected files, and converts shadings to gradient fills and spot colors through their tints. Saving as PDF works everywhere, with a choice of flattened pages or editable layers that keep paths, text, and images as real objects, and imported Photoshop text layers export as real selectable PDF text, substituting missing fonts unless you ask for images
  • Trace Image to Shapes converts a raster image, or just the selected area, into editable shape layers. Photo-quality palettes up to 256 colors with exact color assignment, a Merge Colors option that collapses near-duplicate colors, smoothing and anchor-budget sliders, saveable presets, and a size warning before heavy traces
  • Animated GIFs open as layers, with each frame's delay kept in its layer name, and the visible layers export back as a looping animation. The Layers panel's film button opens an Animation Preview that plays those layers as frames and can set or clear the per-frame timings
  • File > Import > Photocopy scans a page and prints it at actual size in one step, using the scanner's true DPI, with a movable crop and a preview that shades anything the printable area cuts off. Divide Scanned Photos splits a scan or photo into straightened per-photo images, with an up-direction picker, the output folder, prefix, and format chosen right in the dialog, and a prompt to scan another batch
  • Path point editing is discoverable: dedicated anchor tools with status-bar hints and a live selected-point count, a right-click path menu, and Auto Add/Delete on the Pen, plus Simplify Path and Combine Shapes commands for existing shape layers
  • Direct Select edits points across every shape layer selected in the Layers panel, drags a whole selection by any of its segments, and Shift constrains point drags to horizontal, vertical, or 45 degrees; marquees can be repositioned with Space or squared with Shift, and Ctrl+E keeps shape-layer merges vector
  • The Mixer Brush has calibrated continuous pickup, Sample All Layers, and a Useful Combinations dropdown with Photoshop-verified presets, and its options bar follows Photoshop's order
  • Photoshop-style stroke Smoothing steadies the Brush, Mixer Brush, and Eraser
  • The Print dialog adds a Copies field and a Print Using System Dialog button, and printing no longer crashes on a printer whose device context fails
  • Ungroup Layers and Copy as SVG join the menus
  • The Move tool's Ctrl+click toggles a layer in the current selection, and Ctrl+Shift+click in the Layers panel adds a whole range
  • Web build: the Clone tool's brush outline no longer vanishes at large sizes, a bare Alt tap no longer steals browser focus, dialogs open with keyboard focus on the intended widget, the expanded tool palette stays open, and opening a PDF explains that import is desktop only and offers a download button instead of a generic unsupported message
  • Fixes: 600 DPI flatbed scans load again instead of failing to read their image data, File > Place Embedded greys out when no document is open instead of doing nothing, files with Unicode names save and reopen correctly instead of being mangled by the ANSI code page, Ctrl+H also hides path anchors, handles, and outlines, path anchors appear as soon as the active layer changes, and entry fields use the accent color for text selection

Older releases

Building it yourself

Build the dependency-light core and tests without the Qt app:

cmake --preset dev -DPATCHY_BUILD_APP=OFF
cmake --build --preset dev
ctest --preset dev

Build the Qt desktop app:

cmake --preset qt-local
cmake --build --preset qt-local

The local Qt app preset writes patchy.exe under build/app.

Run the standard local test script:

powershell -ExecutionPolicy Bypass -File scripts/run-tests.ps1

macOS and Linux

Install Qt 6.8.3 into .deps/Qt (for example pip install aqtinstall && aqt install-qt mac desktop 6.8.3 -m qtimageformats qtpdf -O .deps/Qt, or linux desktop 6.8.3 linux_gcc_64 on Linux), then build the matching preset. The qtpdf module is optional: without it Patchy still exports PDF, it just cannot open one.

cmake --preset mac-release      # or linux-release
cmake --build --preset mac-release

macOS produces build/mac-release/Patchy.app; Linux produces build/linux-release/patchy. packaging/macos/make-dmg.sh and packaging/linux/make-flatpak.sh create the distributable artifacts. Both test suites run offscreen on all three platforms (QT_QPA_PLATFORM=offscreen).

Windows Release Package

Create local Windows release artifacts:

scripts\release\build-release.bat

The script configures and builds the release preset, signs build\release\patchy.exe, the installer helper executables, and the installer when the local signing environment is available, deploys the minimum Qt runtime needed by the current app, copies third-party notices, and creates:

build\package\PatchyWindowsNoInstaller.zip
build\package\PatchyWindowsInstaller.exe

The zip contains a top-level Patchy folder so it can be dragged anywhere and does not include installer-only helpers. The installer is a local per-user installer that installs to %LOCALAPPDATA%\Programs\Patchy, creates a Start Menu shortcut, offers a desktop shortcut, and registers an uninstall entry. latest_version.json is the update metadata file.

Current Status

Patchy is not Photoshop-compatible across the full PSD surface yet, but a round-trip from/to Photoshop mostly works with RGB/RGBA 8-bit documents that use basic pixel layers, text objects, groups, masks, blend modes, layer styles, and the currently supported adjustment layers.

Important Photoshop features that are not supported yet, or are only partially supported:

  • Editable Smart Filters cover 13 filter types with paintable shared masks and per-filter opacity and blend modes; unsupported imported filter types (including the Blur Gallery and Liquify smart filters) remain preview-locked and byte-preserved
  • Full Photoshop adjustment-layer compatibility beyond Patchy's current adjustment support
  • CMYK/Lab editing and export, editable spot separations and RGB component channels, multi-channel overlays, 16/32-bit editing, HDR/EXR, and full color-management parity (Patchy converts CMYK/Lab to RGB on open, but does not edit or save in those color modes)
  • Layer comps, timeline/video/animation workflows, content-aware tools, and generative tools
  • Photoshop's own automation surfaces: Actions (.atn), UXP/JSX panels, and scripts written for Photoshop (Patchy has its own JavaScript scripting and batch processing instead, see above)
  • High-fidelity PSD/PSB edge cases, including layered PSB writing and byte-perfect preservation of every Photoshop-only metadata block
  • Patchy is slower than Photoshop, especially on large documents and it doesn't support GPU acceleration at all. However, being CPU only helps with porting and stability so kind of a trade-off that makes sense, for now. That said, certain operations have been optimized for multicore - canvas compositing and image flattening are multithreaded, splitting large images (4 Mpx+) into strips rendered on all CPU cores.

Affinity import

Patchy opens Affinity documents read-only: the current .af format ("Affinity by Canva"), the Affinity 2 formats (.afphoto, .afdesign, .afpub), and most Affinity 1.x-era files. Raster layers (including 16-bit, float, CMYK, and Lab documents), groups, masks (raster and vector), clipping, blend modes, opacity, editable text with per-run styles, vector curves, parametric shapes (rectangles, ellipses, polygons, stars, triangles, diamonds, trapezoids, pies, segments, crescents, hearts, tears, arrows, double and square stars, cogs, clouds), compound-shape booleans, Designer symbols, artboards, layer effects, supported adjustment layers, and placed images (which become embedded Smart Objects) all import, verified against Affinity's own renders and a wild-file corpus that includes real Affinity 2 documents from all three apps. Vector fills and strokes keep their width, alignment, dash pattern, and miter limit, crop-to-shape containers come in as masked groups, and the Erase blend mode imports as an isolated group with an inverse-alpha mask, which is how PSD stores that construction natively. If a file can't be imported as layers, Patchy falls back to its embedded preview instead of failing the open, and an import notice explains what was skipped.

Affinity features that are not supported yet, or are only partially supported:

  • Saving to Affinity formats (import only; save your edits as PSD)
  • A few parametric shape kinds (callouts, spirals, QR codes, circle-rounded stars, and exotic arrow ends) import as named placeholders
  • Adjustment layers beyond the eight kinds Patchy models, and live filters, import as named empty placeholders; Brightness/Contrast and Color Balance import approximately
  • Affinity-only blend modes render through their closest Photoshop-compatible equivalent with a notice (Average matches exactly at half opacity; Negation, Reflect, Glow, and Pigment approximate; Contrast Negate falls back to Normal)
  • Bevel/Emboss and glow effects are approximated; Gaussian blur layer effects bake into the layer pixels (they render correctly but are no longer live)
  • Rotated or sheared frame text renders without its rotation (artistic text rotates correctly)
  • Multi-page documents open the first page only
  • Affinity 1.x-era files: embedded-document placement can land slightly off

License

Patchy is released under the MIT License. Third-party runtime notices are tracked in NOTICE-THIRD-PARTY.md.

Trademark Notice

Adobe and Photoshop are either registered trademarks or trademarks of Adobe in the United States and/or other countries. Patchy is an independent project and is not authorized, endorsed, or sponsored by Adobe. References to Photoshop and its file formats (PSD, Smart Objects, Smart Filters) are only there to describe compatibility.

AI Disclosure

This project was developed with significant assistance from AI tools. I mean, you can still blame me (Seth) for bugs, but I just wanted to mention it.

Note: All included textures/materials are real images taken by humans, not AI generated

Missing features?

AI has reached the point where you can use your favorite AI to add the missing feature you want.

Just give it the link to this repo and say "Add .tiff support" and in about 10 minutes it will be done and working on your computer. Amazing, right?

I mean, that's kind of the power of open source.

Whatever AI you use, tell it (or more likely, it is reading this right now) to read AGENTS.md before doing anything else. It contains the build and repository-wide rules, then routes feature work to the relevant document under docs/.

There are 1000+ regression and benchmarking tests. AGENTS.md links agents to the testing guide that explains how to select and run them.

If you have a bug fix or feature you think should be in this repo, please look at the actual code and fully TEST IT YOURSELF before submitting the PR. If you're using AI, use a good one (Fable+ class), we don't want barely working slop.

I probably don't want any major features coming from outside, as there are wrong and right ways to do things, some of it a bit subjective. Remember, you can always go crazy in your own fork, have some fun!

Don't trust AI to create and submit PRs with no oversight, I'll delete ones that have too much AI smell. Smell human. This is starting to sound weird but you know what I mean.

Also, note that certain features are crippled or not included due to Adobe patents. For example, our "quick select" tool doesn't update in realtime, you have to finish the stroke. We can revisit this around 2030 when the patents expire...

Credits

Created by Seth A. Robinson - Homepage | Blog | Twitter | Bluesky | Mastodon

Code contributions from Michael Capogna

Photo "akiko_cycling_okinawa" (seen in the screenshots) by Seth A. Robinson

About

Open-source image editor focused on PSD compatibility and workflows familiar to Adobe Photoshop users.

Topics

Resources

Stars

43 stars

Watchers

4 watching

Forks

Contributors

Languages