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.
Local AI agents can use the native MCP connector to draw, inspect previews, revise layers, and save editable files. In the desktop app, Help > Set up AI Control gives you a short text to paste into your AI assistant, which then configures itself. Agents can work in a separate workspace or connect to your open desktop app, where you can watch edits, choose Slow playback, pause to make changes yourself, and stop an operation. Desktop packages include an installable skill and JavaScript examples. See AI control setup.
Click a thumbnail for the full-size image.
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.
Latest release: 0.99 · September 25, 2026 · Release notes · All releases
Windows releases are code signed by Seth A. Robinson; the macOS app is signed and notarized (Robinson Technologies Corporation). Every release is published on the GitHub Releases page with SHA-256 checksums, and mirrored at rtsoft.com.
| Platform | Package | Download |
|---|---|---|
| Windows 10/11 (64-bit) | Installer | PatchyWindowsInstaller.exe (59 MB) |
| Windows 10/11 (64-bit) | Portable ZIP (no installer) | PatchyWindowsNoInstaller.zip (59 MB) |
| macOS 12+ (Apple Silicon) | DMG - drag to Applications | PatchyMacOS.dmg (64 MB) |
| Linux | Flatpak bundle | PatchyLinux.flatpak (31 MB) |
| Any modern browser | Nothing to install | patchyimageeditor.com or rtsoft.com/patchy |
Mirror: the same files are also at rtsoft.com/files
(PatchyWindowsInstaller.exe, PatchyWindowsNoInstaller.zip, PatchyMacOS.dmg, PatchyLinux.flatpak).
Linux one-line install (paste into a terminal; fetches the bundle and installs it for your user, pulling the shared KDE runtime from Flathub automatically, no root needed):
curl -L -o /tmp/PatchyLinux.flatpak https://github.com/SethRobinson/Patchy/releases/latest/download/PatchyLinux.flatpak && flatpak install --user -y /tmp/PatchyLinux.flatpakOptional: 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 --user -y flathub org.freedesktop.Platform.ffmpeg-full//24.08- 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
- Dynamic Vector Preview keeps native shapes and vector masks sharp when zoomed in, alongside pixel layers, masks, adjustments, and effects. Merge Layers can preserve editable vectors and keep bitmap runs separate, with options for merging within groups or making a merged copy
- Move tool layer selection: drag a rectangle to select overlapping layers, Shift-click to toggle individual layers, or right-click to choose among the layers under the pointer, with a selected-layer count in the status bar
- 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, Photoshop-style Tile and Cascade arrangement, a Window menu that lists every open document, and layers that drag or duplicate between documents. Open a whole folder of images as tabs (or drop the folder on the window), and export every open document as a numbered image set to a folder
- 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, editable on the selected text layer without entering text-editing mode
- 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)
- Named palette colors appear in the Palette panel, color picker, Info panel, and eyedropper readout. Rename swatches, preserve names through GPL, PSD, and indexed PNG round trips, and manage palettes through scripts
- 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 an Export Flat Image dialog with nearest-neighbor scaling (2x-8x), smooth resize, transparent-edge trimming, and background fill
- 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 with a Natural rendering profile, ISO-based noise reduction, and per-photo settings saved beside the original, 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)
- Local AI control through the bundled MCP connector: native pressure-aware brush strokes, reusable brush presets, editable vector shapes and paths, palette controls, image previews, and persistent document sessions. Help > Set up AI Control provides setup instructions and example prompts; see the AI control guide
- 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, German, Spanish, French, Italian, Japanese, and Chinese (Simplified and Traditional); the language follows your system or can be changed in File->Preferences
- Automatic document recovery: a recovery copy of every modified document is written every 10 minutes (Preferences > Application sets the interval or turns it off). After a crash, a kill, or a power cut, the next launch reopens them as "(Recovered)" documents. Saving also writes to a temporary file first and swaps it in, so a crash or a full disk mid-save can no longer damage the original
- Files as Layers: drop image files on the Layers panel, use File > Import > Files as Layers, or paste copied files, and each file becomes its own layer, with a cancellable progress dialog for big batches (issue 25)
- Fill (paint bucket) tool: Tolerance and Contiguous options in the options bar, and Opacity and Soft now actually apply to the fill (issue 30)
- Remove Object: the Reroll button, Tone match slider, and Edge feather setting the 0.98 notes described ship in this build (they missed the 0.98 packages), plus a Duplicate to New Layer option, and the fill runs on a worker thread so the dialog stays responsive and cancels cleanly
- Layers panel: F2 or a double-click on the name renames a layer in place, and double-clicking a shape layer's row opens Layer Style like every other row
- Imported Photoshop text renders pixel-exact against Photoshop on all three font engines, and glyph ink that overhangs the advance box is kept, so an unchanged edit of imported PSD text no longer shifts it (issue 20)
- Scripting: setting layer.text keeps the first character's formatting, so retyped Photoshop layers commit at their interactive size
- Downloads come from GitHub Releases now, with rtsoft.com as a mirror, and the in-app update check points there (issue 26)
- The user-data folder moved from "Seth A. Robinson" to "RTsoft" (migrated automatically on first launch); the About dialog shows where it is
- Options bar number boxes size themselves to their widest value, so the Fill tool's Tolerance no longer clips at 255
- The right mouse button now opens context menus on the canvas instead of panning. (middle mouse button or holding space bar still pans)
- Edit > Remove Object fills a selection with content-aware texture taken from its surroundings. It's slow as shit but seems to work pretty well. Its dialog has a Reroll button (each variation is a different fill), a Tone match slider (0 keeps the raw fill), and an Edge feather setting.
- Move tool alignment: magenta guides show when a dragged layer snaps to another layer's edges or center or to the canvas, a Snap checkbox in the options bar turns it off, also a bunch of new alignment buttons are on the Move tool's options bar, and the Align and Distribute commands in the Layer menu work on multiple selected layers
- Changing the pivot point in the free transform affects rotation now, it was always supposed to but it was broken. Should probably make the pivot point draggable, hrm.
- Free Transform numeric fields (and a few other places) accept typed units (px, in, cm, mm, pt, %, deg)
- New Continuous (long shadow) option for Drop Shadow with a Fade control. Photoshop has no equivalent, so it saves in a way Photoshop ignores and the layer style dialog marks it as Patchy-only
- Shape tools: a click without a drag opens a Create Shape dialog for exact sizes, and the options bar's W and H resize the active shape. The Shape Appearance dialog adds layer, fill, and stroke opacity, Photoshop-compatible Feather and Density, linked Width/Height and corner radii, a Reset button, and -/+ steppers, and opens from the options bar, Layer > Shape, the Properties panel, or a right-click on a shape layer
- Right-click a tool palette button to open its tool flyout, and edit a vector shape's width and height from the Properties panel (@ifloppy). Flyouts also open with a double-click or a shorter press-and-hold
- PDF: multi-page PDFs open each page as its own document, with a progress dialog and pages appearing as they load. File > Export > Multi-Page PDF saves open documents or top-level groups as pages, and PDF export is much faster and smaller, with quality presets and grayscale detection; pages that came from an imported PDF and were not edited keep their original image data. The print dialog gains a paper size setting... I need to work on this more, we really need full Artboard support but that's a big job, but at least it's possible to round-trip editing multipage pdfs in a somewhat reasonable way now.
- File > Open Folder opens every image in a folder as tabs (dropping a folder on the window does the same), and File > Export > Documents to Folder saves open documents as numbered images, layered PSDs, or Aseprite files. The export commands now live together in a File > Export submenu
- Rectangular and Elliptical Marquee selections can be resized after they are drawn: with the marquee tool active, drag a handle on an edge or corner (Shift on a corner keeps the proportions, and holding Space mid-drag slides the whole selection, as it does while drawing one), or drag inside the selection to move it as before. Feathered and rounded selections are redrawn at the new size, and Undo steps back through each resize
- Text positioning between Patchy->Photoshop is more accurate
- Square brush preset added, square brush 'tip' is now handled programmatically, not with a bmp
Build the dependency-light core and tests without the Qt app:
cmake --preset dev -DPATCHY_BUILD_APP=OFF
cmake --build --preset dev
ctest --preset devBuild the Qt desktop app:
cmake --preset qt-local
cmake --build --preset qt-localThe local Qt app preset writes patchy.exe under build/app.
Run the standard local test script:
powershell -ExecutionPolicy Bypass -File scripts/run-tests.ps1Install 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-releasemacOS 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).
Create local Windows release artifacts:
scripts\release\build-release.batThe 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.
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, 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 any GPU acceleration. (Like, layer styles being done in pixel shaders, etc) However, being CPU only helps with porting, consistent output, 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.
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
Patchy is released under the MIT License. Third-party runtime notices are tracked in NOTICE-THIRD-PARTY.md.
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.
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
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's 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 2200+ regression and benchmarking tests. AGENTS.md links agents to the testing guide that explains how to select and run them. Due to the size of some of the test files I use they aren't all included, it will skip tests that require missing files.
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!
If you have a bug fix or feature you think fits this project's scope please open an issue or tweet/etc at me. If you want to submit a pull request, please look at the actual code and fully TEST IT YOURSELF before submitting, and if possible include screenshots of the actual changes so it's clear what you're doing. If you're using AI, use a good one (Fable/Astra+ class), we don't want barely working slop.
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...
Created by Seth A. Robinson - Homepage | Blog | Twitter | Bluesky | Mastodon
Code contributions from mcapogna, csbun, and ifloppy
Photo "akiko_cycling_okinawa" (seen in the screenshots) by Seth A. Robinson




















