PhotoCraft v0.10.0

PhotoCraft is an open-source image editor designed as a clean-room reimplementation of Adobe Photoshop, built entirely in Rust. It provides a surprisingly broad set of professional image-editing features, including layers, masks, adjustment layers, filters, vector shapes, editable text, brushes, and native PSD support.

The project is particularly interesting for users who want a local, open-source Photoshop alternative without relying on Electron, cloud services, or proprietary software. However, PhotoCraft is still in early alpha, so it is better viewed as a promising alternative under active development than as a complete replacement for Photoshop.

Features

PhotoCraft offers a substantial collection of image-editing tools:

  • Layer groups, clipping masks, pixel and vector masks

  • Adjustment layers for Curves, Levels, Vibrance, Hue/Saturation, Black & White, Gradient Map, Selective Color and more

  • Layer styles including Drop Shadow, Inner Shadow, Glow, Bevel & Emboss, Stroke, and overlays

  • Brush, Pencil, Mixer Brush, Clone Stamp, Healing Brush and other painting tools

  • Marquee, Lasso, Magic Wand, Quick Selection, Object Selection and Select Subject

  • Editable point and paragraph text

  • Pen and vector shape tools

  • Smart objects and smart filters

  • Free Transform with scale, rotate, skew, distort and perspective

  • History and History Brush

  • Multiple blend modes, opacity, fill and layer controls

  • Color management with RGB, Grayscale, CMYK and Lab

  • 8, 16 and 32-bit-per-channel documents

  • PSD and PSB support

  • PNG, JPEG, TIFF, WebP, GIF, BMP, TGA, ICO, OpenEXR, HDR, AVIF and other formats

  • Export preview with quality, transparency, scale and estimated file size

  • Command palette and recorded actions

Its PSD support is one of its strongest features. The project tests its implementation against real-world PSD files and reports very high rendering compatibility across its test corpora. Unsupported data is designed to be preserved rather than simply discarded when documents are saved.

Another unusual feature is its automation architecture. PhotoCraft exposes its editing engine through the desktop interface, CLI, JSON control channel and MCP, making the application suitable for scripted workflows and AI-agent automation.

Download PhotoCraft v0.10.0 - Software Mirrors

PhotoCraft v0.10.0 for Windows

photocraft-0.10.0-windows-x86.msi | 65.25 MB

photocraft-0.10.0-windows-x86-portable.zip | 76.85 MB

photocraft-0.10.0-windows-x64.msi | 67.47 MB

photocraft-0.10.0-windows-x64-portable.zip | 80.9 MB

photocraft-0.10.0-windows-arm64.msi | 62.78 MB

photocraft-0.10.0-windows-arm64-portable.zip | 76.43 MB

PhotoCraft v0.10.0 for macOS

photocraft-cli-0.10.0-macos-universal.zip | 65.78 MB

photocraft-0.10.0-macos-universal.dmg | 87.94 MB

PhotoCraft v0.10.0 for Linux

photocraft-0.10.0-linux-x86_64.tar.gz | 79.19 MB

photocraft-0.10.0-linux-x86_64.rpm | 79.87 MB

photocraft-0.10.0-linux-x86_64.flatpak | 59.31 MB

photocraft-0.10.0-linux-x86_64.deb | 80.4 MB

photocraft-0.10.0-linux-x86_64.AppImage.zsync | 263.56 kB

photocraft-0.10.0-linux-x86_64.AppImage | 75.23 MB

photocraft-0.10.0-linux-riscv64.tar.gz | 77.05 MB

photocraft-0.10.0-linux-riscv64.rpm | 77.78 MB

photocraft-0.10.0-linux-riscv64.deb | 78.1 MB

photocraft-0.10.0-linux-aarch64.tar.gz | 75.04 MB

photocraft-0.10.0-linux-aarch64.rpm | 76.56 MB

photocraft-0.10.0-linux-aarch64.flatpak | 54.9 MB

photocraft-0.10.0-linux-aarch64.deb | 77.24 MB

photocraft-0.10.0-linux-aarch64.AppImage.zsync | 250.45 kB

photocraft-0.10.0-linux-aarch64.AppImage | 71.49 MB

PhotoCraft v0.10.0 for BSD

photocraft-0.10.0-freebsd-x86_64.tar.gz | 78.65 MB

Others Download related to PhotoCraft v0.10.0

photocraft-web-0.10.0.zip | 10.9 MB

PhotoCraft v0.10.0 Source Code

PhotoCraft v0.10.0 Source code (zip)

PhotoCraft v0.10.0 Source code (tar.gz)

PhotoCraft v0.10.0 Release Notes:

Scorecard since v0.9.0

From docs/scorecard.md (done / partial / missing):
  • Tools: 29 / 13 / 1 → 33 / 11 / 0. Done: per-control pressure curves, image files as brush tips, Pen Shift 45° constraints, arrow-key nudges bundled into one History state.
  • File compatibility: 7 / 13 / 7 → 7 / 14 / 6; PDF save went from missing to partial (one flattened page with ICC).
  • Corpus floors raised: Photoshop oracles 145 → 188 / 256, psd-tools 236 → 249 / 309, io corpus 146 → 148 / 170 (round-trip floors unchanged).
  • Reliability: never-crash lints on 30 of 30 crates (was 28 of 28).
  • Workspace and UI: unchanged at 13 / 6 / 4; settings that do nothing 26 of 168 (157 before, after new settings landed).
  • Performance: two new scenarios tracked (P60/P61, layer opacity and visibility among 150 layers), not run yet; budgets met unchanged at 3 (baseline 2026-10-05).

What's Changed

  • Keep channel pastes transactional when memory allocation fails by @vbasky in #4588
  • Bound selection sampling and report layer-buffer allocation failures by @vbasky in #4594
  • Gradient Map is driven by the W3C luminosity, as in Photoshop by @timothydaly1 in #5018
  • fix(layers): merging layers keeps pixels that lie outside the canvas (#5067) by @MarekSpodBiedry in #5124
  • Map .atn duplicate-into-new-document (Mk) to layer.duplicate by @abdul-karim-mia in #5371
  • Text: non-finite numbers and negative indices from PSD files are sanitized (#4429) by @vangel76 in #4433
  • feat(commands): find the Elliptical Marquee by 'ellipse' or 'marquee' by @switch87 in #5140
  • Linux: a virtual keyboard claiming BTN_TOOL_PEN no longer sends the window through Xwayland (#5284) by @dutraroberto in #5295
  • Fix/scale marker rollback layer state 4975 by @shmuelbiller1 in #5391
  • affinity: decoded layers are admitted against an aggregate pixel budget (#4960) by @lu123bing in #5266
  • ICC parser: checked arithmetic on offsets and counts from the file (#4976) by @Higgs32584 in #5227
  • GPU compositor: pattern textures are freed on close, when idle and over a budget (#4971) by @Higgs32584 in #5232
  • Performance: the lower-stack cache follows an edit up the stack (P9 / P11, #5286) by @davidmann4 in #5288
  • Expose shared Smart Object instances in inspection and replacement results by @jonathanwxh-cell in #4832
  • Free Transform: solid pixel stretch (edge-repeat sampling, selected-pixel bounds) (#3773) by @itrycodinganditsbad in #3867
  • feat(engine): layer.list, a read-only listing of the layer tree by @switch87 in #5148
  • PSD import: flat fallback respects the decode budget; checked sizes (#5200, #5202) by @vangel76 in #5206
  • Actions: record layer selections by name and display the target by @GamerWil26 in #2441
  • Color Balance: fold the tones into one Levels per channel (#3423) by @davidmann4 in #5339
  • IO: smart-object source sizes from WebP/GIF/BMP/EXR headers, not a full decode by @vangel76 in #5216
  • Compose: build effect-map layer identity once per render, not per tile (#4437) by @vangel76 in #4438
  • fix(brush): preserve Dual Brush tip spacing and scale its size with the primary brush by @Ni-zav in #4856
  • Font preview test: skip installed fonts whose Arabic glyphs are blank (#5259) by @zkm in #5261
  • ui: remove the title-bar Discord button by @mroxso in #1737
  • fix(windows): prefer WARP over GL to avoid black window (#5191) by @mjohnson7cd in #5309
  • fix(ui): make Preferences modal resizable on desktop by @Ni-zav in #5170
  • Color Range: sample colours outside the active selection (#5244) by @switch87 in #5296
  • fix(transform): keep masked objects visible during transform (#5239) by @mjohnson7cd in #5319
  • Canvas: themes without a dot pattern draw no dots texture (#4542) by @Higgs32584 in #5093
  • fix(ui): remove empty right column from Curves dialog by @VanTan666 in #5160
  • Frame tool: take type, shape and smart object layers into the frame (#4435) by @MarekSpodBiedry in #4441
  • perf(gpu): keep the DX12 mip scratch textures for Intel adapters only by @FinnNk in #5354
  • Display profile notice: one card for all displays without a usable profile by @nicolasfalesy in #5312
  • Type: hovering a font previews it with the Character section shown too (#5152) by @prekabreki in #5222
  • Number fields: centre the number in its box (#5150) by @prekabreki in #5226
  • fix(ui): Color Picker hex field accepts repeated pastes by @Pharbi in #5398
  • Edit › Menus: Menus, Keyboard Shortcuts, Preferences, Save and Exit can't be hidden (#5096) by @vangel76 in #5183
  • perf(ui): the Info panel composites its Color Sampler readouts once per revision (#4528) by @FinnNk in #4753
  • Show feathering in layer mask views by @imSlicedBread in #5342
  • fix(ui): give the Quick Selection tool its own icon (#5116) by @mroxso in #5184
  • fix(puppet-warp): drop open Puppet Warp and other distort sessions when the active document changes (#5092) by @MarekSpodBiedry in #5123
  • fix(ui): swatches touch with no padding, as in Photoshop (#5103) by @sabbirshawon in #5253
  • fix(ui): show brush tip thumbnails while dragging presets by @VanTan666 in #5203
  • Interface: hide the Home screen's recent files (#4382) by @vangel76 in #4387
  • Large document: large damage over the GPU budget redraws in the background; open warms layer bounds (#4024) by @syncroot in #5083
  • Layer styles: editing effects no longer re-enables a disabled effect list (#3648) by @notdezzi in #3799
  • Actions: a recorded File › Save of a flat file saves the file it is played on (#3531) by @vangel76 in #3537
  • fix(ui): guides draw over the Free Transform preview, under its box (#5086) by @sabbirshawon in #5214
  • Undo and redo Camera Raw adjustments from the keyboard. by @vbasky in #4136
  • Fix custom-frame maximization with a top taskbar by @FredApps in #5237
  • Start Free Transform after placing an image from the file picker by @jonathanwxh-cell in #5390
  • raster: a shifted surface copies in one pass per row without pre-filled tiles by @Elvis33LE in #2667
  • i18n(it): translate the 103 labels other catalogs added since #3742 by @fabiodalez-dev in #4860
  • History panel: the trash deletes the selected snapshot (#5324) by @davidmann4 in #5325
  • ACEScg: File Handling option opens colour-less EXR renders in the ACES working space by @Elvis33LE in #4908
  • Layer Style: Bevel & Emboss Technique dropdown (#5147) by @vangel76 in #5181
  • feat(ui): Darken and Lighten Interface (Ctrl/Cmd+Shift+F1, F2) by @FinnNk in #3709
  • Actions: Button Mode by @Zer0C00L01 in #5213
  • Embedded Profile Mismatch: profile names on the choices, and Remember this choice by @texjer in #5208
  • Posterize: 16-bit documents bin the 16-bit sample, as Photoshop does (two oracles pass) by @timothydaly1 in #5267
  • Groups: a pass-through clipping base with an adjustment renders isolated (passthrough_clipping_mask_adjustment passes) by @timothydaly1 in #5272
  • Threshold: split on Photoshop's luminosity of whole samples (threshold_rgb, threshold_16bits_rgb pass) by @timothydaly1 in #5263
  • Masks: feathers blur with exactly the feather's variance (mask-parameters-no-real-channel passes) by @timothydaly1 in #5163
  • 32-bit: legacy Brightness/Contrast, Channel Mixer, Photo Filter and B&W tint unclipped, as in Photoshop by @timothydaly1 in #5011
  • Free Transform: the box is the selection, and the marching ants follow it (#5297) by @Higgs32584 in #5337
  • Layers panel: filter-type dropdown with Kind, Name and Mode (#5048) by @zkm in #5268
  • Batch: Include All Subfolders (AUTO-219-5, #3753) by @davidmann4 in #3758
  • fix(ui): remember the selected tool between launches (Photoshop parity) by @david419kr in #5043
  • Brushes: import an image file as a brush tip (#3279) by @vangel76 in #3292
  • Brush Settings: a response curve per dynamic control (#3294) by @vangel76 in #3302
  • Pen tool: Shift constrains segments and handles to 45° (TOOL-214-10, #3751) by @davidmann4 in #3756
  • Levels: whole levels at every step and Photoshop's shadow toe (levels_rgb + stack oracle pass) by @timothydaly1 in #5143
  • Layers panel: Clip Thumbnails to Layer Bounds (#4281) by @badaaif in #4312
  • Lab: adjustment layers composite on the stored L, a and b (seven Lab oracles pass) by @timothydaly1 in #5171
  • feature(ui): added brushes panel dockable with floating option (#4262) by @peppepol in #4603
  • Modern Brightness/Contrast: Photoshop's brightness curve (six oracles pass) by @timothydaly1 in #4722
  • Resize cursors turn with the box and with a rotated or flipped view by @deadmeu in #5188
  • CMYK: Brightness/Contrast curves each ink, as Photoshop does by @timothydaly1 in #4930
  • CMYK: adjustment layers composite on the document's own inks (14 oracles pass) by @timothydaly1 in #4945
  • CMYK: Hue/Saturation and Color Balance keep the black ink by @timothydaly1 in #5000
  • fix(ui): snap distorted corners to visible guides by @zenjabba in #3928
  • feat(psd): editable Filter Gallery smart filters (Chrome) by @the-unknown in #3426
  • Curvature Pen: edit finished paths (drag, add, smooth/corner) with an adaptive cursor by @bazmarth in #5197
  • Blur Gallery: Iris Blur's pins and handles on the image (#3373) by @timothydaly1 in #3822
  • Posterize and Threshold commands use the 16-bit rules on 16-bit layers (fixes main) by @echelon in #5711
  • Shapes: on-canvas corner radius widgets for live rectangles (TOOL-214-12) by @bazmarth in #5276
  • Crop tool: Content-Aware fill of the area a rotated or extended crop uncovers (#3823) by @davidmann4 in #3827
  • Add Shift+scroll snap zoom to Photoshop zoom ladder levels by @cwshields in #3695
  • Menu bar from the keyboard: Alt / F10 focus, Alt+letter, underlined mnemonics (#4988) by @FabioLissi in #5091
  • Shortcuts: a command can answer a second key (F2/F3/F4, Shift+F7, Cmd++) (#3665) by @davidmann4 in #3746
  • feat(ui): select guides, the guide context menu and Edit Selected Guides by @FinnNk in #3734
  • Export As: exact pixel size, named presets, and profile options by @Zer0C00L01 in #5344
  • Arrow-key nudges: a run of nudges is one History state, with Tools preferences (#2259) by @Sir-Starch in #2764
  • Blur Gallery: Tilt-Shift and Spin Blur on the image (#3373) by @timothydaly1 in #3829
  • i18n(es): complete dynamic UI translations by @gorevyoneticisi in #4306
  • Vector: bound flattening memory, keep over-budget dashes, cheaper edge build (#5195) by @vangel76 in #5204
  • fix: limit Render Video timeline and GIF staging allocations by @Ni-zav in #5670
  • fix(export): prompt for a Render Video output directory (#3365) by @Ni-zav in #3378
  • fix(ui): avoid overflow when allocating layer style instance IDs by @Ni-zav in #4884
  • fix(doc): variable definitions follow layer id remapping on copy and load by @mroxso in #5023
  • fix(raw): reject truncated or oversized Deflate tiles in DNG import (#4977) by @MarekSpodBiedry in #5072
  • fix(history): count fill caches and smart filter masks in undo memory (#4972) by @MarekSpodBiedry in #5075
  • fix(ui): keep the close prompt up when a Save Document script edits the document after saving (#4953) by @MarekSpodBiedry in #5081
  • fix(geom): clamp huge sizes in Rect::from_xywh instead of wrapping, and saturate TileCoord::rect by @saadkhantareen in #5161
  • Fix integer overflow in clipped warp bounds by @Skyfuller1303 in #5451
  • fix(linux): install the AppImage menu entry when AppImageLauncher skips it by @nrq6993-a11y in #5551
  • FITS: clamp 32-bit saves to 0..1 and warn, so they reopen as saved (#5627) by @davidmann4 in #5628
  • Properties / New Document: tiny sizes in physical units no longer resize the document (#5661) by @davidmann4 in #5662
  • fix(psd): write the layer block after a kept merged-transparency marker by @FinnNk in #5673
  • Options bar: Brush and Eraser size go to 5000 px in every theme (#5708) by @davidmann4 in #5709
  • Smart Objects: Curves preview no longer zooms in on a reduced proxy (#5766) by @Higgs32584 in #5779
  • Fix Nikon NEF lossy levels, packed decoding and metadata crops by @optimalbytee in #3238
  • Curves: apply to masks, alpha, and Quick Mask (#5335) by @vbasky in #5448
  • perf(ui): bound transform outlines and stabilize perspective clipping by @LabDennis in #5699
  • fix(heif): a grid's ICC profile is inherited from its tiles by @sidney in #5553
  • fix(ui): expose toolbar column toggle in all themes by @Ni-zav in #3538
  • Double-clicking the empty workspace shows File › Open (#5367) by @Daktyl198 in #5429
  • fix(ui): a held arrow key keeps stepping the focused value field (#5474) by @JuanAntonioRC in #5497
  • fix(ui): ⇧ marquee square keeps equal sides on the pixel grid (#5472) by @sabbirshawon in #5506
  • fix(engine): validate bounded extended filter parameters by @0x6Ason in #5586
  • Guide Layout: the disabled Rows field no longer turns Rows on (#5625) by @davidmann4 in #5626
  • Fix filter preview live during drag by @agent-346022 in #5549
  • Fix #5414: Keep created paths visible and editable by @Ahmeddouhm in #5424
  • fix(ui): widen tool-options drag targets by @haranishi in #5135
  • fix(cms): write the product name as PhotoCraft in built-in profile descriptions by @wwewtech in #5614
  • Format five files on main (fmt break from #5448, #5670, #5135) by @tanish2k09 in #5873
  • Document layerFilter in the ui_set MCP schema by @FredApps in #5776
  • i18n(hu): align six rows with the catalog conventions by @Skaywalker in #5434
  • UI: centre text vertically in shared text fields by @stevanmarjanovic in #5550
  • fix(ui): the Move tool keeps Photoshop's arrow pointer by @midasmatterhorn in #5814
  • fix(pen): keep unfinished paths in their original document by @Ni-zav in #5460
  • Drag and drop: PhotoCraft comes to the front after a drop (#5687) by @Higgs32584 in #5894
  • Options bar: Show Transform Controls in every theme (#5740) by @vangel76 in #5802
  • Preserve Layers scroll per document (#5522) by @FredApps in #5540
  • Rulers: Alt-drag makes a guide of the other orientation (#5698) by @Higgs32584 in #5885
  • Adjustment layers: a live preview is never coarser than the screen (#5764) by @Higgs32584 in #5778
  • UI: unsaved-changes buttons show every key in one style (#5564) by @nrq6993-a11y in #5603
  • macOS: a bundled app keeps its own Dock icon (#5849) by @Higgs32584 in #5879
  • Title bar: dialogs no longer stop the window dragging on macOS (#5826) by @Higgs32584 in #5860
  • fix(path): Shift locks a Direct Selection anchor drag to 45° (#5475) by @JuanAntonioRC in #5498
  • Type: keep text selection highlight visible while Command/Ctrl is held by @safvanedge in #5542
  • Filter dialogs: a Random button for seeds (#5710) by @Higgs32584 in #5886
  • Brushes: dragging a preset to the list's edge scrolls the list (#5741) by @Higgs32584 in #5862
  • fix(ui): smart filter adjustments open their own editor on double-click by @midasmatterhorn in #5812
  • Canvas: no scroll glide with Enable Animations off (#5721) by @Higgs32584 in #5883
  • Scaling around reference point no longer snaps center of image to ref… by @stevanmarjanovic in #5510
  • Type: a scaled type layer keeps its size when the Character fields show it (#5717) by @davidmann4 in #5718
  • fix(ui): restore previous tool when committing or canceling text edit (#5527) by @safvanedge in #5528
  • File › Scripts › Browse: reject Photoshop ExtendScript (#5406) by @vbasky in #5435
  • Channels: load the targeted layer mask as selection by @envy-ai in #5562
  • Type: Swap and Default Colors recolour the selected text (#5690) by @davidmann4 in #5808
  • Image Size, Canvas Size: points and picas follow the Point/Pica Size preference (#5756) by @davidmann4 in #5757
  • Pen and Path Selection: Delete deletes the finished work path (#5702) by @Higgs32584 in #5732
  • Layer Style: drag on the image to move a drop or inner shadow (#5701) by @Higgs32584 in #5893
  • Free Transform: shapes and paths stay on whole pixels (#5751) by @Higgs32584 in #5841
  • Snapping: snap edges of Marquees / Object Selection box / shapes while repositioning with Spacebar by @WendelVolm in #5748
  • Move: Show Transform Controls frames every selected layer by @bazmarth in #5917
  • Warp: a thin layer stretched and bent keeps its curve on commit (#5793) by @vangel76 in #5810
  • Dialogs: a close box in the title bar cancels like Cancel (#5496) by @davidmann4 in #5505
  • Commit text editing when selecting a Layers-panel row (#5584) by @FredApps in #5612
  • Info panel: show guide coordinates while dragging outside the canvas (#5728) by @nrq6993-a11y in #5768
  • fix(ui): brush outline matches the stroke on Wayland at fractional scales by @wanikhawar in #5796
  • Raw: measure the Nikon D90 image area (4288x2848 at (10, 10)) by @vbasky in #4323
  • Codecs: open Cineon (.cin) film frames read-only by @vbasky in #4691
  • PSD: write tiff blocks without copies, inflate merged ZIP once by @vangel76 in #5221
  • Content-Aware Fill: no ghost edges or object colour around thin removed objects by @switch87 in #5290
  • Select Subject: keep subject parts coloured like the backdrop, leave enclosed gaps open by @diegochagas in #4462
  • perf: keep effect-cache pins and History snapshots inside the memory budgets by @FinnNk in #5336
  • TIFF: read and write CIE Lab* (CIELab, ICCLab); Lab documents stay Lab by @switch87 in #4949
  • PSD: cap pattern memory across a parse, reject mixed-depth pattern channels (#5198) by @vangel76 in #5207
  • DNG: decode lossy (JPEG-compressed) DNG tiles (FILE-215-11) by @FabioLissi in #5112
  • PSD: a smart object's filter mask shows when the file opens by @timothydaly1 in #5005
  • File > Save As / Save a Copy / CLI can write PDF (#3401) by @vbasky in #3441
  • CI: fix the tests that keep main red, and ship the wasm as compressed parts (#5926, #5302) by @zuujiscom in #5941
  • fix(compose): serialize effect identity cache misses by @skylartaylor in #6060
  • psd: write PSB foreign-order long-key blocks with the correct big-endian length by @midasmatterhorn in #5600
  • ci: add comfortable runtime limits to unbounded jobs by @skylartaylor in #5931
  • CI: run clippy, layers and scorecard checks before the tests (#6119) by @davidmann4 in #6124
  • Quick Mask: ⌘I inverts the whole mask, unstored black included (#6095) by @zuujiscom in #6108
  • Pen: Auto Add/Delete on the path being drawn (#6140) by @wanikhawar in #6172
  • Dependencies: require ruzstd 0.9.1 for RUSTSEC-2026-0344 (#4952) by @Higgs32584 in #5225
  • Control channel: connections must authenticate within 10 s, however active (#4965) by @Higgs32584 in #5229
  • Check deep EXR tile count tables against max_alloc by @jonathanwxh-cell in #5632
  • Clip groups: Release Clipping Mask takes the layers above; merges keep clipping; Delete Hidden settles by @tanish2k09 in #5868
  • Paste Layer Style carries Blend If and channels; align to an active selection with several layers by @tanish2k09 in #5881
  • Paste Layer Style: a group's Pass Through lands on other layers as Normal by @tanish2k09 in #6310
  • Keyboard Shortcuts: Accept and Go to Conflict / Undo Changes, and reserved keys (K4a) by @tanish2k09 in #5349
  • Layers panel: blend mode, Opacity, Fill and locks change every selected layer; Photoshop's History names by @tanish2k09 in #5856
  • CI: run the tests with cargo nextest (#6117) by @davidmann4 in #6118
  • CI: run only the font tests in the craft-fonts pass (#6120) by @davidmann4 in #6127
  • Low-Latency Drawing preference (vsync off, opt-in), plus present-mode overrides for testers (#1343) by @tanish2k09 in #5274
  • Shortcuts without the UI: shell commands and tools in the engine, reserved keys, set files by @tanish2k09 in #5801
  • Free Transform: New Layer applies the transform first; tests for switching tool, layer or New Layer (#5665, #5667) by @tanish2k09 in #5859
  • Follow-ups to #5801 and #5859: precheck docs and tests, translated refusals, stranded-backup test by @tanish2k09 in #6365
  • Security: enforce the automation read boundary on stored smart-filter params by @skylartaylor in #5684
  • PSD: recover available layers when merged image data is damaged by @PerchAnton in #6170
  • ci: delegate FreeBSD workflow to craft-common-actions and add nix check by @dylanmtaylor in #6381
  • CI: cut wall time, starting with the Windows test job by @1Git2Clone in #2933
  • Canvas textures fit the device's texture limit; GPU tests use the app's device and the GPU lock by @tanish2k09 in #5954
  • perf(gpu): cap the GPU memory budgets by a discrete GPU's own memory by @FinnNk in #5234
  • GPU memory: discrete cards aren't charged for the document; GPU Memory preference; GPU Memory Full status by @tanish2k09 in #5973
  • GPU memory follow-ups: indicator after device loss and document switches, notice wording by @tanish2k09 in #6458
  • Save As on Linux: the file type picked sets the extension (#6121, #4328, #4394) by @zuujiscom in #6151
  • Tests: canvas_16f and rotation preview run on the app's wgpu device by @tanish2k09 in #6454
  • Windows/Linux: open files in the running PhotoCraft instead of a second instance (#3708) by @bommerts in #3755
  • perf(camera-raw): Shadows/Highlights 1.9× faster, bit for bit the same (#5964) by @nicolasfalesy in #6247
  • Histogram: scale bar heights to the tallest bin instead of the 251st smallest by @midasmatterhorn in #6638
  • fix(linux): avoid duplicate AppImage desktop launcher when managed by AM / AppMan (#6392) by @Korg1ch in #6394
  • Paragraph text: a word wider than the box breaks at the box edge (#6694) by @diegochagas in #6696
  • Pen: the path in progress stays visible while panning with Space by @marcoarnulfo in #6625
  • Crop tool: custom ratios keep three decimals, 1.414 : 1 no longer becomes 1.4 : 1 by @marcoarnulfo in #6503
  • fix(codecs): respect PAM ENDHDR line boundaries by @0x6Ason in #5874
  • docs(cli): write product name as PhotoCraft in USAGE and description by @wwewtech in #5449
  • fix(engine): prevent colliding artboard export filenames by @PerchAnton in #6655
  • docs: write product name as PhotoCraft in crate module docs by @wwewtech in #5455
  • docs: write product name as PhotoCraft in package descriptions and comments by @wwewtech in #5615
  • perf(testkit): RSS sampler reads /proc/self/statm, not smaps, on Linux by @xsvm in #5399
  • test(io): cover mixed-region CMYK TIFF composites by @0x6Ason in #5588
  • fix(io): preserve linear grayscale profiles for selected EXR parts by @0x6Ason in #5867
  • fix(io): honor version-aware OpenRaster group isolation by @0x6Ason in #5872
  • fix(io): color-manage grayscale WebP exports by @0x6Ason in #5875
  • Unsaved-changes prompt: the default answer takes keyboard focus, so arrows and Enter work by @marcoarnulfo in #6466
  • fix: open new solid fill picker by @Ni-zav in #5166
  • Color Picker: Only Web Colors snaps every edit (#4995) by @vbasky in #5442
  • fix(ui): reset caret blink phase on navigation and typing (#5511) by @safvanedge in #5512
  • fix(engine): reserve the define-brush tip buffer fallibly (#212) by @wwewtech in #5469
  • Bound shared numeric input before text layout by @harrisonoconnorhover in #2258
  • README: install on Gentoo from the ::snakebyte overlay by @switch87 in #1149
  • Face detection: libfacedetection's CNN in pure Rust, and image.detectFaces by @switch87 in #4513
  • fix(engine): list the document's layers when a layer id or name is unknown by @switch87 in #5133
  • Layers panel and title: Arabic and Hebrew names read right to left (#5159) by @Higgs32584 in #5385
  • fix(web): enable Place Embedded with browser file picker by @zi-ger in #5585
  • chore: fix workspace Clippy warnings by @VanTan666 in #5190
  • README: put Community packages after the Get started status note (follow-up to #1149) by @tanish2k09 in #6886
  • Filters: the live preview is never coarser than the screen (fixes #6326) by @itsF4LCON in #6351
  • fix(io): keep transforms on imported SVG text by @ahmed0magdy in #5334
  • GPU composite: lower-stack cache chunks have no texture view by @mcsantiago in #5423
  • Text: break paragraph lines at the horizontally scaled width (#5565) by @nrq6993-a11y in #5611
  • Engine: load each persisted preset set independently (#5602) by @nrq6993-a11y in #5616
  • Targa: RLE packets end with their scanline (fixes #6382) by @itsF4LCON in #6386
  • perf(stack): Stack Mode 8–17× faster, deterministic Entropy by @nicolasfalesy in #6462
  • PSD type: clamp warp bend and distortion before the f32 cast (#6856) by @davidmann4 in #6857
  • Linked smart objects: don't refresh a document while a background job runs on it (#4973) by @MarekSpodBiedry in #5074
  • Close All, Close Others and Quit ask again about documents dirtied during the prompt (#4954) by @MarekSpodBiedry in #5079
  • fix(windows): keep crash-recovery autosaves out of the roaming profile (#5648) by @Korg1ch in #6412
  • Save: ask before overwriting a file another app changed (#6596) by @zuujiscom in #6652
  • fix(automation): refuse a group/world-readable control-token file (#4966) by @wwewtech in #5459
  • perf(panorama): Photomerge 4× faster, bit for bit the same by @nicolasfalesy in #6489
  • Fix the build: restore export_presets in load_presets_json (#5344 x #5616) by @00xJS in #6906
  • algo: gate the recorded-hash test's helpers with the test by @Hamza0101 in #7053
  • Quick Export: Same Folder asks before replacing the document's own file (#6599) by @zuujiscom in #6632
  • Opening a file that is already open shows its tab instead of a second copy by @marcoarnulfo in #6630
  • Duotone: ink curve points must be finite (#7049) by @davidmann4 in #7050
  • Save: refuse to replace a read-only file (#6600) by @davidmann4 in #6643
  • Image Assets: two layers naming the same file no longer overwrite each other (#6614) by @zuujiscom in #6668
  • Desktop app: photocraft --help prints usage; unknown options are usage errors (#6431) by @wanikhawar in #6435
  • Logging: a second launch leaves the running instance's log alone (#6432) by @switch87 in #6478
  • Follow linked paths only on this computer or the document's share by @skylartaylor in #7149
  • CI: run panic_hunt in the Linux test job by @1Git2Clone in #2863
  • Web: Place Embedded and canvas drops place images (#5749) by @Higgs32584 in #5817
  • Print through CUPS over IPP and the print portal: File › Print works in the Flatpak by @diegochagas in #3017
  • Package: report its paths with / on Windows too by @skylartaylor in #7184
  • Release 0.10.0 by @echelon in #7192

New Contributors

  • @dutraroberto made their first contribution in #5295
  • @lu123bing made their first contribution in #5266
  • @zkm made their first contribution in #5261
  • @Pharbi made their first contribution in #5398
  • @sabbirshawon made their first contribution in #5253
  • @notdezzi made their first contribution in #3799
  • @david419kr made their first contribution in #5043
  • @badaaif made their first contribution in #4312
  • @the-unknown made their first contribution in #3426
  • @cwshields made their first contribution in #3695
  • @gorevyoneticisi made their first contribution in #4306
  • @saadkhantareen made their first contribution in #5161
  • @nrq6993-a11y made their first contribution in #5551
  • @LabDennis made their first contribution in #5699
  • @sidney made their first contribution in #5553
  • @Daktyl198 made their first contribution in #5429
  • @JuanAntonioRC made their first contribution in #5497
  • @Ahmeddouhm made their first contribution in #5424
  • @midasmatterhorn made their first contribution in #5814
  • @envy-ai made their first contribution in #5562
  • @WendelVolm made their first contribution in #5748
  • @wanikhawar made their first contribution in #5796
  • @PerchAnton made their first contribution in #6170
  • @1Git2Clone made their first contribution in #2933
  • @ahmed0magdy made their first contribution in #5334
  • @mcsantiago made their first contribution in #5423
  • @00xJS made their first contribution in #6906
  • @Hamza0101 made their first contribution in #7053
Full Changelog: v0.9.0...v0.10.0

Performance and Compatibility

PhotoCraft is built as a native Rust application rather than a web wrapper or Electron application. Its rendering architecture uses wgpu for GPU compositing with support for graphics APIs including Metal, Vulkan, DirectX 12 and WebGPU.

The application also uses multithreaded filters and copy-on-write sparse tiles. This design is intended to reduce unnecessary copying and make large layered documents more manageable.

The project reports extensive automated testing, including PSD round-trip tests, compositor comparisons and multi-depth testing. Its architecture also includes a CPU compositor used as a reference against the GPU compositor.

PhotoCraft can run natively on Windows, macOS, Linux and FreeBSD, with a WebAssembly build for browser use.

The main limitation is maturity. The developers explicitly describe the project as early alpha and acknowledge that it is not yet suitable as a complete replacement for Photoshop in professional daily workflows. Missing areas include AI and generative features, some tools, deeper typography and professional workflows, and plugin compatibility.

System Requirements

PhotoCraft supports:

  • Windows

  • macOS

  • Linux

  • FreeBSD

  • WebAssembly/browser

Linux distributions can use AppImage, DEB, RPM, tarball or Flatpak packages.

Hardware requirements are not presented as a simple minimum specification. Because PhotoCraft uses GPU acceleration, actual performance will depend heavily on the graphics hardware and the size and complexity of the documents being edited.

Pros and Cons

Pros

  • Open-source and available under permissive MIT or Apache-2.0 licensing

  • Native Rust application

  • No Electron or embedded web browser required

  • Excellent focus on PSD compatibility

  • Extensive layer and adjustment-layer support

  • GPU-accelerated rendering

  • Supports CMYK, Lab and high-bit-depth documents

  • Strong brush and vector capabilities

  • Windows, macOS, Linux and FreeBSD support

  • Can also run through WebAssembly

  • Powerful CLI and automation capabilities

  • MCP support makes it interesting for AI-assisted workflows

  • Offline-first approach

Cons

  • Still early alpha

  • Not yet a complete Photoshop replacement

  • Missing some tools and professional workflows

  • No Photoshop plugin compatibility

  • AI and generative editing features are limited or absent

  • Typography capabilities are not yet as mature as established professional editors

  • Some rough edges should be expected

How to Install

The easiest approach is to download the appropriate package from the project's GitHub releases.

Linux users have several packaging options, including AppImage, DEB, RPM, tarball and Flatpak. Windows has a portable package, while macOS has a universal disk image.

Developers can also build PhotoCraft directly from source using Rust:

git clone https://github.com/storytold/photocraft
cd photocraft
cargo run --release -p photocraft -- image.psd

The repository also provides CLI functionality for automated editing and batch processing.

Final Verdict

PhotoCraft is one of the more ambitious open-source Photoshop alternatives currently available. Its combination of native Rust performance, extensive layer support, serious PSD compatibility work and an unusually capable automation architecture makes it much more than a basic image editor.

The strongest reason to watch PhotoCraft is its engineering approach. The project is building a real image-editing engine rather than simply creating a Photoshop-like interface, and its extensive PSD testing provides a useful foundation for compatibility.

The biggest problem is maturity. The project itself acknowledges that it is still early alpha and lacks several areas required for professional Photoshop replacement workflows. Users who depend on plugins, advanced typography, AI features or highly polished production workflows should not switch completely yet.

For enthusiasts, developers, Linux users, open-source advocates and anyone interested in building automated image-processing workflows, however, PhotoCraft is particularly compelling.

PhotoCraft v0.10.0
Free
Software Informations:
Developer:

Operating System:
Windows / macOS / Linux / BSD
Date Added:
2026-10-18T21:07:22.016Z
Categories:

Post a Comment/Report Broken Link: