What's Changed
- Grant network access so update checks can reach GitHub by @dylanmtaylor in #9982
- Correct update_transport comment: Flatpak sandbox now has network by @dylanmtaylor in #9983
- Honor CARGO_BUILD_TARGET in FreeBSD packaging for aarch64 release builds by @dylanmtaylor in #9989
- Engine: a pixel change damages only the tiles that changed (#9329) by @brennanMKE in #9942
- Perf: every frame records its stages; slow frames are kept, logged and reported (#9328) by @brennanMKE in #9943
- Arabic interface language, combined from the community catalogs (#10005) by @davidmann4 in #10006
- ADDED ARABIC TRANSLATION by @azizr12 in #2505
- Add Arabic (ar) as the first right-to-left UI language by @hicbest in #4520
- Add Arabic (العربية) interface translation with RTL alignment by @hasan-sdaif in #4569
- i18n: Arabic interface with RTL display order by @NibrasAz7 in #5593
- Add Arabic (ar) interface translation catalog by @vfggf95565 in #5915
- i18n(ar): stage Arabic catalog and add user guides by @syrrevshin4202-prog in #6092
- i18n(ar): add complete Arabic UI translations by @test-bit-sys in #6287
- Actions: an Arrange step that can't move the layer plays on instead of stopping (#8453) by @wanikhawar in #8457
- Reduce Noise: reuse guide statistics with bit-identical output by @wanikhawar in #9639
- Median stacking: select the middle values without fully sorting by @wanikhawar in #9628
- perf(stack): cache bounded entropy terms across pixels by @wanikhawar in #9622
- perf(algo): row-parallel local_sharpen with fast-path protect_detail (#5426) by @wanikhawar in #9651
- perf(retouch): avoid duplicate rasterization while drawing by @wanikhawar in #9532
- Save for Web: WebP, lossy at its Quality or lossless (part of #6391, #2415) by @wanikhawar in #6421
- Free Transform moves every selected layer (#6501, #3384, #6096) by @wanikhawar in #6590
- Select and Mask: Photoshop's full-window workspace (#7069, #8148) by @wanikhawar in #8896
- i18n(ar): the Select and Mask workspace strings; main is green again (#10173) by @davidmann4 in #10174
- Enable update checks in Flatpak by @dylanmtaylor in #10206
- Integration test: 24 parity PRs together by @FedeOlivares in #9166
- CLI: run and batch skip Deselect with nothing selected, as playback does by @switch87 in #8807
- Layers: a new fill or adjustment layer drops the selection it took as mask by @switch87 in #8811
- Indexed Color: keep Brush strokes inside the colour table (#8669) by @xwize in #8823
- ui: larger Align icons and overflow button; Save for Web keeps its width on an invalid Matte by @batuhangozegu in #8892
- fix: File > Import > Variable Data Sets opens a file picker (#8816) by @MarekSpodBiedry in #8901
- Raise the Define Pattern size cap from 4000 to 8000 px per edge (#8820) by @MarekSpodBiedry in #8902
- Box-filter minified patterns in the CPU and GPU samplers (#8831) by @MarekSpodBiedry in #8903
- fix(ui): Clone Source overlay for the Healing Brush, soft with the brush (#8907, #8908) by @hnoerenberg in #8912
- fix(ui): the brush resize HUD previews the engine's soft falloff (#8930) by @hnoerenberg in #8935
- fix(ui): the options-bar brush chip draws the brush's own tip (#8936) by @hnoerenberg in #8963
- Fix keyboard shortcut set names with '/' or '=' being truncated by @Silvertree2010 in #8548
- Keep a bare '+' key when saving a keyboard shortcut set by @Silvertree2010 in #8640
- Read layer-record blend keys in PSD layer effects by @mercuryVM in #8685
- Export As: a remembered pixel size keeps the proportions of the image being exported by @marcoarnulfo in #8791
- fix(text): write a style-only type edit into the PSD's Txt2 style runs by @jturnbach in #8888
- Tests: a missing translation never fails CI by @aiongg in #10212
- Swedish, Finnish, Danish and Norwegian interface languages, combined from the community catalogs (#10020) by @davidmann4 in #10021
- Add Finnish language by @metuuu in #6961
- i18n: add Danish interface translation by @pechnikov2026-star in #7267
- i18n: add Norwegian Bokmal (nb) interface language by @Bolla76 in #9025
- i18n(sv): add Swedish interface language catalog by @davvarn in #9536
- i18n: Swedish (sv) interface translation by @kler in #5985
- Tests: the autosave outcome test waits up to 5 minutes for a real write (#10198) by @davidmann4 in #10199
- packaging: Flatpak finds and prints to CUPS printers by @dylanmtaylor in #10196
- History: trimming to the memory budget after Clear History keeps the History Brush source by @dotCooCoo in #8715
- Integrate 16 reviewed performance and UI fixes by @FredApps in #10157
- PNG export: documents over 256 MiB of pixels are encoded a band of rows at a time (#8456) by @wanikhawar in #8472
- fix(engine): convert Image › Mode › Bitmap in bands so huge images don't abort (#8477) by @wanikhawar in #8488
- Select Inverse: invert shared tiles without full-canvas buffers by @wanikhawar in #9793
- Smooth and Feather: crop to the selection, up to 395× faster on small selections by @wanikhawar in #9809
- perf(selection): use sparse combination for marquee Add and Subtract by @wanikhawar in #9813
- perf(selection): crop Color Range sampling to the active selection by @wanikhawar in #9814
- perf(selection): combine GRAY8 masks directly in tiles by @wanikhawar in #9822
- perf(curves): sample graphs directly and cache channel polylines by @wanikhawar in #9826
- perf(paint): keep circular tips on the fast path with angle jitter by @wanikhawar in #9847
- perf(paint): cache round-tip geometry per dab by @wanikhawar in #9850
- perf(algo): solve Adaptive Wide Angle's mesh with a factor-once direct solve by @wanikhawar in #9921
- Mixer Brush: dry strokes up to 2× faster with identical output by @wanikhawar in #9924
- perf(segment): solve GrabCut and the band re-cut with Boykov-Kolmogorov by @wanikhawar in #9961
- Smart objects: re-render without full-size float buffers, and bound the caches that held decoded sources by @wanikhawar in #10080
- perf(paint): accumulate serial dabs in place with packed tile keys by @wanikhawar in #9852
- CI: workflows only call craft-common-actions at @main (AGENTS.md; windows-arm64 unpinned) by @dylanmtaylor in #10228
- Update prompt shows the app icon and accent color instead of a letter by @dylanmtaylor in #10243
- Fix pretend-version testing for update prompts by @dylanmtaylor in #10254
- test: partition long parity matrices without dropping cases by @FredApps in #10223
- Integrate 87 reviewed bugfix and Photoshop-parity PRs by @FredApps in #10204
- feat(algo): describe the Gaussian blur as data for other devices by @FinnNk in #8931
- Color panel and Color Picker: clip the round cursor to the colour field by @marcoarnulfo in #8985
- Path tools: edit the saved path selected in the Paths panel (#8478) by @switch87 in #8986
- fix(ui): enlarge Move tool alignment icons for legibility by @ersoynarin-code in #9004
- fix(xtask): reject unknown performance benchmark selections by @Lucenx9 in #9019
- Gradient Fill layer: default to Foreground to Transparent (#8708) by @hectorviov in #9172
- fix(export): embed requested sRGB profile for untagged sources (#9325) by @vanvo in #9339
- fix(io, engine): Embed Color Profile writes sRGB for an untagged document (#9325) by @hectorviov in #9342
- Color Lookup: honour the .3dl Mesh header's cube edge and output depth (#9078, #9073) by @mroxso in #9418
- raw: faster tone stage (Shadows, Highlights, Clarity, Texture, Dehaze), same bytes by @vangel76 in #9457
- fix(io): import a Displace smart filter that names its map file without embedding it (#9162) by @dark13b in #9472
- fix(text): vertical type sets roman letters upright, one per em, as Photoshop does (#9470) by @hectorviov in #9478
- fix(ui): new layer effects start from the Make Default values by @hectorviov in #9481
- fix: an edit at full coverage keeps its result over huge 32-bit values by @hectorviov in #9509
- fix(compose, gpu): adjustment layers apply Fill inside the special eight blend modes by @hectorviov in #9512
- Fix Type on a Path wrapping and caret positioning across closed-path seams by @FartmanAndBurps in #9523
- fix(io): PSD layer-effect contours keep at most 16 points by @hectorviov in #9590
- fix(io): drop a kept Txt2 once no type layers are left by @hectorviov in #9596
- fix(ui): Liquify's Twirl Counterclockwise gets a mirrored twirl icon by @hectorviov in #9598
- fix(ui): the Color panel remembers its options across restarts by @hectorviov in #9606
- Pencil: keep a 1 px freehand line connected where it turns by @Silvertree2010 in #9623
- Fix adjustment layer name clicks targeting masks by @vanvo in #9703
- Layer Style: one dialog size on every page, and it fits short screens by @OctaNebula in #4938
- Preserve Dissolve coverage when compositing clipped layers by @Ni-zav in #4992
- fix(mixer-brush): Alt-click samples the foreground colour like the Brush (#4873) by @MarekSpodBiedry in #5082
- Actions: add editable PhotoCraft Essentials starter presets by @harrisonoconnorhover in #5090
- Selecting subject now automatically applies to selected layer, and us… by @stevanmarjanovic in #5515
- fix(ui): keep detached documents in one interactive window by @mostyk in #5744
- fix(format): reject duplicate native layer identities by @0x6Ason in #5870
- fix(paint): scale blur sigma with brush size (#5892) by @seotarek in #5939
- Marquee: Fixed Size selects exactly the entered width and height (fixes #6015) by @itsF4LCON in #6026
- Fix painting workflows, File Info and layer selection by @channelramble in #6139
- Shift+Alt+right-click opens Photoshop's HUD Color Picker (#6098) by @mroxso in #6236
- Windows releases ship a symbols zip: the release build's PDBs for profilers (#688) by @Higgs32584 in #6383
- Fail control startup promptly when its port is occupied by @denstu473 in #6492
- Automation: resolve configured root aliases for absolute paths (#6426) by @PerchAnton in #6510
- Crop: right-click on the pending crop opens the crop menu (#6561) by @mroxso in #6621
- Smart Filters: double-clicking a Liquify filter reopens it in the Liquify workspace by @dotCooCoo in #7153
- fix(engine): guard trim and duplicate merged against documents exceeding render limits (#7223) by @seotarek in #7255
- Actions: a fractional setting an integer field cannot hold is refused, not rounded by @Hamza0101 in #7742
- packaging: the portable zip holds the files, not a folder with the files in it by @Hamza0101 in #7743
- fix(retouch): preserve Smudge pickup with live-pixel stroke commits by @skylartaylor in #7848
- Transform: remember selected interpolation (#8067) by @Sir-Starch in #8074
- Filter Gallery › Cutout 2/4: regions stage by @andeecollard in #8192
- Type: Roman Hanging Punctuation (trailing marks hang, don't steer the alignment) by @VladimirPozdnyakov in #8347
- Startup: a failed launch says why in a dialog instead of closing silently (#7643) by @ebosido444-ai in #9436
- fix(ui): Keyboard Shortcuts records ⌘Z instead of undoing the capture by @hectorviov in #9504
- fix(ui): Layer Style scrolls on a short window so OK stays on screen by @hectorviov in #9517
- fix(compose, gpu): Blend If hard points match Photoshop at 16 bits and for Gray by @hectorviov in #9584
- feat(actions): import and export reusable Actions JSON files by @Ni-zav in #1991
- Scroll the viewport while outlining with Polygonal Lasso by @harrisonoconnorhover in #2300
- Draw right-to-left layer names in visual word order by @MathMattTech in #3139
- Add grouped gradient presets and selectable style icons by @Skyfuller1303 in #3345
- feat(codecs): add lossless JPEG XL export for 8/16-bit images by @Ni-zav in #3387
- Undo and redo action definition edits from the Actions panel by @kotulsky in #3455
- fix(vector): target selected saved paths and own Pen gestures by @Skyfuller1303 in #3464
- fix(ui): restore square color chips in Studio Dark theme by @Ni-zav in #3520
- fix(packaging): launch bundled CLI directly from AppImage by @haranishi in #3554
- control: suggest near matches for unknown command ids and methods (#3674) by @itrycodinganditsbad in #3748
- Add move and delete actions to Smart Filter rows by @zenjabba in #3967
- i18n(es): add 548 missing rows, fix five filter and video terms by @diegozpy in #4023
- fix(cmyk): Flatten Image and merges keep the inks of a tagged CMYK document (#3778) by @echelon in #4035
- Treat Dissolve as a per-pixel choice by @vbasky in #4711
- refactor(liquify): reuse native brush resizing and anchored HUD feedback by @Ni-zav in #4763
- feat(ui): show selection and active-layer bounds in the status bar by @Ni-zav in #4883
- Prevent control-channel engine commands from editing behind modal dialogs by @Ni-zav in #4993
- Fix: brush section selection by @Ni-zav in #5165
- Layer Style: Gradient Overlay takes any number of colour stops (#5177) by @FabioLissi in #5270
- Guides: ⌥ turns a dragged guide; dropping one on either ruler deletes it (#5034) by @LloydNicholson in #5650
- fix(plugins): bound a run's total plug-in memory, not just each instance by @jturnbach in #8905
- test: GPU tests honour WGPU_BACKEND, so they run on Windows with an Intel GPU (#4) by @drunkeninja42 in #9110
- fix(ui): Full Screen Mode needs a document (#9349) by @hectorviov in #9354
- fix(format): a save on macOS keeps the file's creation time (#9388) by @hectorviov in #9401
- Affinity reader: contiguous curve records and a cheaper object tag index by @vangel76 in #9416
- fix(vector): a mask feather continues the mask past the canvas edge by @hectorviov in #9493
- fix(compose, gpu): an adjustment layer's This Layer range judges its result before Opacity by @hectorviov in #9589
- fix(engine): copied type keeps its size across resolutions after an edit by @hectorviov in #9594
- fix(compose, gpu): a Pass Through group with Blend If renders isolated by @hectorviov in #9595
- fix(ui): the layer list doesn't move with no layer selected by @hectorviov in #9597
- Read applied Sony RAW metadata and crop ILCE-6000 images by @optimalbytee in #3142
- Replay recorded layer visibility on the intended named layer by @kotulsky in #3461
- feat(export): optionally trim transparent margins from layer files by @Ni-zav in #3519
- fix(layer-style): support Blend If Alt-split handle feathering and throttle live preview by @Gotix-eg in #3874
- feat(canvas): rotate view with Shift + middle-mouse drag by @Ni-zav in #4042
- Filter > Other > Frequency Separation (#1714) by @marcoarnulfo in #4305
- fix(icons): PhotoCraft icon corner radius matches other Craft apps (#4478) by @mjohnson7cd in #4547
- fix(macos): bundle photocraft-cli and resolve it from droplet scripts by @Ni-zav in #4742
- Fix/4758 type extreme finite geometry 20261013s1215 by @Ni-zav in #4783
- Layer Style: Photoshop's layout (three columns, OK/Cancel/New Style/Preview on the right, one-line rows) [depends on #4938] by @OctaNebula in #5010
- Video Frames to Layers: every page of a multi-page TIFF (part of #6379) by @itsF4LCON in #6387
- Pen: Path Operations menu, as in Photoshop (#1397) by @wanikhawar in #7648
- Compose: Extend Softer outer glows past Size (#7899) by @Sir-Starch in #8039
- Filter Gallery › Cutout 1/4: colour and palette stage by @andeecollard in #8191
- Filter Gallery › Cutout 3/4: edges and curves stage by @andeecollard in #8193
- fix(io): read linked smart objects for PSD export as regular files only by @jturnbach in #8897
- fix(xtask): reject leading zeroes in numeric prerelease identifiers by @Lucenx9 in #9015
- feat(ui): Preset menus for Levels, Exposure, Black & White and Channel Mixer by @hectorviov in #9282
- Play CopyCat, AJ and Line and Color action sets; keep patterns across restarts; Shift Edge scale by @VegaEX in #5176
- Shapes: independent fill and stroke paints (solid, gradient, pattern), part 1 by @Skyfuller1303 in #5453
- Hand tool: Cmd held zooms in and Alt zooms out, as in Photoshop by @marcoarnulfo in #6449
- Filter Gallery › Cutout 4/4: trace the image into flat paper shapes by @andeecollard in #7903
- Extra windows share the main window's app id, so Wayland docks and window rules see them (#6697) by @TaylorBurke in #9894
- Screen picker: a Wayland desktop picks through the portal when the window runs on Xwayland (#8977) by @TaylorBurke in #9893
- fix(flatpak): allow reading launcher version pins by @dylanmtaylor in #10393
- Follow-up to #10204: match the reference application in ten places (#10327) by @davidmann4 in #10328
New Contributors
- @azizr12 made their first contribution in #2505
- @hicbest made their first contribution in #4520
- @hasan-sdaif made their first contribution in #4569
- @NibrasAz7 made their first contribution in #5593
- @vfggf95565 made their first contribution in #5915
- @syrrevshin4202-prog made their first contribution in #6092
- @test-bit-sys made their first contribution in #6287
- @FedeOlivares made their first contribution in #9166
- @xwize made their first contribution in #8823
- @metuuu made their first contribution in #6961
- @pechnikov2026-star made their first contribution in #7267
- @Bolla76 made their first contribution in #9025
- @davvarn made their first contribution in #9536
- @kler made their first contribution in #5985
- @mostyk made their first contribution in #5744
- @channelramble made their first contribution in #6139
Full Changelog: v0.17.0...v0.18.0