photocraft Updates & Release Notes

Follow

10 updates curated from 1 source by the Releasebot Team. Last updated: Oct 13, 2026

Get this feed:
  • Oct 12, 2026
    • Date parsed from source:
      Oct 12, 2026
    • First seen by Releasebot:
      Oct 13, 2026
    storytold logo

    photocraft by storytold

    PhotoCraft v0.8.2

    photocraft releases a major update with new creative tools, expanded Photoshop and file-format compatibility, and faster editing. Highlights include advanced selection, transform, text and color features, plus smoother performance, improved automation and broader localization.

    What's Changed
    Adopt shared docking while preserving panel controls and workspaces by @skylartaylor in #3097
    GPU composite: reuse unchanged lower-stack chunks for property edits by @Elvis33LE in #1169
    Design: bounded GPU stack prefix reuse for property edits by @Elvis33LE in #1164
    feat(ui): allow disabling Studio canvas background dots by @Ni-zav in #2317
    File Info shows Camera Data from EXIF/XMP (#2424) by @itrycodinganditsbad in #2692
    fix(canvas): update Move transform-control cursors on first hover by @Ni-zav in #2887
    Releasing a brush stroke no longer freezes: the commit takes the pixels the live stroke already drew (P32: 136 ms → 0.8 ms) by @tanish2k09 in #2131
    fix(brush): interpolate pen pressure across Shift-click connecting strokes by @Ni-zav in #2890
    fix(transform): commit Free Transform on an outside click by @Ni-zav in #2909
    app.save: encode on the save worker, not the UI thread (#2488) by @ahmedhosnypro in #2517
    fix(shortcuts): reject malformed bindings and correctly display Plus by @Ni-zav in #3006
    Favorite themes from the appearance button's right-click menu by @luniiya in #2445
    Render Video: animated GIFs keep their transparency (#3061) by @fabianghe in #3162
    fix(type): exclude text inside hidden groups from automatic hit testing by @Ni-zav in #3173
    Enhanced Controls: wire Zoom with Trackpad Pinch (#204) by @reynold-hu in #2577
    Units & Rulers: wire the Type units preference (#204) by @reynold-hu in #2587
    fix(type): use the correct line at soft-wrap caret boundaries by @Ni-zav in #3174
    fix(masks): preserve off-canvas alpha in From Transparency by @Ni-zav in #3177
    Rulers: keep tick marks and labels out of the origin corner by @arthurdeka in #2617
    fix(psd): Improve interoperability and decoding by @reneleonhardt in #1955
    fix(layers): remap linked-layer groups when copying between documents by @Ni-zav in #3178
    Brush HUD: wire Vary Round Brush Hardness and Brush Preview Color (#204) by @reynold-hu in #2640
    fix(history): preserve an empty layer selection across undo and redo by @Ni-zav in #3179
    Auto-Align Layers: register focus and exposure brackets by intensity when there is nothing to match by @ragtux in #2065
    Double-clicking a mask thumbnail in the Layers panel now opens that mask's settings by @Lyraedan in #2654
    fix(layers): select Shift ranges in visible panel row order (#3041) by @Ni-zav in #3180
    Auto-Blend Stack Images: fuse the merged layer per pyramid level by region energy, with halo control by @ragtux in #2044
    fix(io): preserve group fill opacity in OpenRaster exports by @Ni-zav in #3181
    Control channel: input methods reject bad params instead of using defaults (#2449) by @itrycodinganditsbad in #2656
    fix(vector): pivot explicit path transforms on target layer (#3062) by @Ni-zav in #3183
    General: wire Beep When Done for finished background jobs (#204) by @reynold-hu in #2658
    fix(vector): preserve scaled live-line thickness during endpoint edits by @Ni-zav in #3184
    fix(actions): avoid replaying Browse script edits twice by @Ni-zav in #3190
    i18n test: scan past small test modules; translate what it was missing by @herzer in #2660
    fix(masks): bake feathered coverage when applying a layer mask by @Ni-zav in #3191
    Type: wire Font Preview Size for the font menu samples (#204) by @reynold-hu in #2668
    fix(video): retain original footage for Restore Frame and Show Altered Video by @Ni-zav in #3192
    Improve zoomed Liquify preview detail by @Elvis33LE in #2715
    fix(compose): preserve Dissolve coverage for adjustments, styles and clipping by @Ni-zav in #3195
    Color Replacement tool on the toolbar (#1045) by @itrycodinganditsbad in #2719
    fix(shapes): preserve transformed outline on unchanged live geometry edits by @Ni-zav in #3197
    Crop tool: New / Delete Crop Preset saves and removes user presets (#1919) by @davidmann4 in #2723
    Test Move layer edges across bit depths and view modes by @Skyfuller1303 in #2738
    fix(type): preserve formatting for trailing empty paragraphs by @Ni-zav in #3198
    Keep custom crop ratio fields editable by @imSlicedBread in #3209
    raw: fit non-DNG colour to the camera's embedded JPEG by @switch87 in #2135
    Add Anchor Point and Delete Anchor Point tools (#1044) by @itrycodinganditsbad in #2756
    fix(crop): stabilize resizing and apply ratio changes immediately by @TheTeslak in #3206
    Layers panel: load a fallback font for layer names in other scripts (#2275) by @itrycodinganditsbad in #2758
    Type: ⇧⌘> / ⇧⌘< change the type size (and work on Nordic/German layouts) by @Simonfalentinolesen in #2402
    CLI: batch plays an action from an Actions set with the whole set loaded (#2786) by @vangel76 in #2792
    Droplets: carry the actions their Play Action steps call (#2794) by @vangel76 in #2800
    Spot Healing: Content-Aware dab no longer scans every patch in full (#2771) by @vangel76 in #2805
    Layers: double-click a shape layer's thumbnail to pick its fill colour (#2812) by @vangel76 in #2820
    TGA: targa options asks for 24 or 32 bits/pixel, same as in Photoshop by @Matty-PW in #2760
    Tools: remember tool options between launches (#2814) by @vangel76 in #2822
    Options bar: Reset Tool and Reset All Tools (#2825) by @vangel76 in #2830
    Free Transform: right-click menu with the transform modes, rotate and flip (#2832) by @vangel76 in #2840
    Channels: Edit › Transform works on a targeted alpha channel (#2835) by @vangel76 in #2845
    Free Transform: themed rotate cursor and live angle/size/offset readout (#1767) by @itrycodinganditsbad in #2809
    Move tool: drag a marquee from an empty spot to select the layers it touches (#2844) by @vangel76 in #2852
    View: Pattern Preview tiles the document around the canvas (#1067) by @davidmann4 in #2803
    Tools: Freeform Pen and Curvature Pen (#1054) by @vangel76 in #2856
    Tools: Horizontal and Vertical Type Mask (#1055) by @vangel76 in #2861
    Speed up large feathered mask refreshes by @Elvis33LE in #2417
    Tools: Artboard tool (#2858) by @vangel76 in #2862
    Tools: Perspective Crop (#1043) by @vangel76 in #2864
    Actions: toggle, reorder and delete single steps (#2855) by @vangel76 in #2866
    Text fields: drag-selecting in a single-line field follows the pointer's x (#1946) by @davidmann4 in #2821
    perf: repeated Select Subject answers from the last mask (#2865) by @vangel76 in #2870
    Dropdowns: press, drag onto an option and release to choose it (#2735) by @LloydNicholson in #2854
    perf: Select › Modify › Feather/Smooth on 24 MP within budget (#2873) by @vangel76 in #2882
    Refine gradient stop controls in Properties and Gradient Editor by @Skyfuller1303 in #2859
    perf: duplicating a layer recomposites only where the copy draws (#2883) by @vangel76 in #2884
    Status bar: buttons sit inside the bar with centred labels (#2823) by @davidmann4 in #2876
    perf: keep resident GPU tiles and convert 32-bit tiles directly for brush dabs on large documents (#2900) by @vangel76 in #2902
    Themes: Photoshop's light-gray and light Pro brightness levels (#2661) by @ngrafton2006 in #2892
    scorecard: twenty rows describe work that is already in the tree by @Erica4fr in #2894
    perf: marquee selections on large documents are built row by row (#2888) by @vangel76 in #2907
    Tools: Frame tool (#2914) by @vangel76 in #2915
    Add Photoshop-style guide layout dialog and live preview by @Skyfuller1303 in #2930
    perf: pasting a layer recomposites only where it draws (#2901) by @vangel76 in #2917
    Image Size: Photoshop's resampling, measured by @Unemars in #2451
    Toolbar: Pro themes draw tool glyphs at two thirds of the button (#2665) by @ngrafton2006 in #2932
    MCP bridge: reconnect before idle sockets die, retry reads, actionable timeouts (#2487) by @ahmedhosnypro in #2507
    Dropdowns: type a letter to jump to an item, Enter to choose (#1481) by @davidmann4 in #2948
    Layers: right-click an effect row for the layer style menu (#2846) by @davidmann4 in #2950
    Smart Objects: linked smart objects follow their files while open by @KattKnight in #2510
    Place: wire Always Create Smart Objects When Placing (#204) by @reynold-hu in #2543
    Preferences: wire Tools › Show Transformation Values (#204) by @timothydaly1 in #2953
    Channels: keep RGB off while an alpha or mask is shown, and select from that channel. by @Desayuno64 in #2555
    Tools: wire Enable Flick Panning for the Hand tool (#204) by @davidmann4 in #2964
    app.open: open directory .pcraft through the automation read root (#2490) by @ahmedhosnypro in #2581
    Layers: Pattern Fill dialog for new and edited pattern fill layers (#2908) by @davidmann4 in #2979
    Layer Style: contour picker and Contour Editor (#2912) by @vangel76 in #2949
    Type: wire Show Font Names in English (#204) by @davidmann4 in #2981
    Text fields: right-click edit menu (#2921) by @vangel76 in #2952
    control: allow requests that operate an open Camera Raw dialog by @harrisonoconnorhover in #2988
    Pixel grid: fade the line colour across mid-tones instead of flipping at one luma by @Jeremy8776 in #2990
    Tests: the marquee ellipse check walks several dash periods of the curve by @ahmedhosnypro in #3018
    Fix Shape Stroke controls, popup interactions and paint colours by @optimalbytee in #3019
    Fix canvas context menus closing immediately on trackpad taps by @zi-ger in #3029
    8-bit documents: soft, low-flow brush strokes are dithered instead of banded by @tanish2k09 in #3237
    fix(ui): reduced suffix spacing width in the value field to prevent overflow (#3040) by @peppepol in #3084
    Rulers: remember View › Rulers for new documents; guides as f64 (#2918) by @vangel76 in #2954
    Mirror the shell for right-to-left UI languages (DIST-220-4) by @MathMattTech in #3114
    Type: Edit › Paste, Copy and Select › All work on the text being typed (#2893) by @vangel76 in #2960
    New Document: presets follow Units & Rulers › Preset Resolutions (#204) by @paulo-vc in #3126
    Dialogs: the live dialog stays in front of older ones (stuck stacked profile prompts) by @kayrockscreenprinting in #3140
    Window menu: list the open documents, the active one checked (#2991) by @brennanMKE in #3147
    fix(ui): respect explicit dropdown defaults in schema dialogs (#3056) by @buivanvu94 in #3149
    PSD: don't inflate an over-budget ZIP merged image at parse time (#2926) by @vangel76 in #2967
    i18n(es): native-style review of the Spanish catalog (Dodge/Burn swap, Photoshop terminology, formal register) by @diegozpy in #3154
    Type tool: right-click menu while editing text (#2968) by @vangel76 in #2969
    Preserve HDR range in float adjustments and stack statistics by @grlessa in #2592
    Speed up large Content-Aware Scale operations by @Elvis33LE in #2596
    fix(zoom): Alt-click with the Zoom tool on desktops that take Alt+cli… by @kavishkashehan726-sudo in #3164
    Select and Mask: live preview in Photoshop's view modes (#1754) by @vangel76 in #2970
    Five exact-output speedups: dense Extrude 160s to 0.39s by @excited-raccoon in #2685
    fix(ui): respect native desktop scale under Auto UI scaling (#1278) by @dylanmtaylor in #3165
    fix: macOS Monterey crash on Intel Iris Pro (disable wgpu indirect validation) by @mjohnson7cd in #3171
    fix(engine): allow targeting layer mask and vector mask via channel.target (#2458) by @buivanvu94 in #2705
    Tools: Convert Point tool in the Pen flyout (#3204) by @Sir-Starch in #3211
    fix(ui): unchanged Custom Proof Setup replaces active document proof profile (#3055) by @buivanvu94 in #3213
    PSD: cap the layer tree in psd_to_document; layered TIFF checks group depth (#2940) by @vangel76 in #2975
    Type menu: Anti-Alias › None first and checked; checks follow the edited layer (#2983) by @vangel76 in #2984
    fix(ui): Global Light opens with stale values and overwrites document setting (#3054) by @buivanvu94 in #3217
    Color Sampler tool (#1046) by @roaldosulejmani in #2753
    Clip the checker under rounded colour swatches to their corners (#3208) by @myangaa1 in #3363
    ci: refactor workflows to use storytold/craft-common-actions by @dylanmtaylor in #3432
    Speed up Tilt-Shift with existing per-level halo trimming by @optimalbytee in #2880
    Select and Mask: Refine Edge Brush (#2972) by @vangel76 in #2989
    Layers: Combine Shapes merges the selected shape layers (#2400) by @davidmann4 in #2906
    Move dock tabs between groups individually by @imSlicedBread in #3239
    Add built-in rainbow gradient presets by @Myosh1 in #2916
    Native brush outline and crosshair cursors on macOS, X11 and Wayland (#1343) by @tanish2k09 in #3243
    Menus: a submenu stays open while the pointer heads for it (#1218) by @brennanMKE in #3251
    i18n(pt-br): complete Brazilian Portuguese catalog (+782 missing UI, filter, and tool strings) by @onicafe in #3254
    Zoom and Hand tools: right-click the canvas for the view menu (#3242) by @LloydNicholson in #3255
    Quick Mask: an empty start and Select All stay apart (#2743) by @itrycodinganditsbad in #2922
    raw: charge the lossless-JPEG intermediate and segment-sized buffers against max_alloc (#2925) by @switch87 in #3194
    Prevent white flash when opening the screen color picker by @imSlicedBread in #3256
    Add FITS read/write (astronomy images) by @dmoulton in #2956
    ui: keep the Color panel knob in the corner it was dragged to by @switch87 in #3275
    Rulers: stay level and fully ticked on a rotated view; guides turn with the image (#3233) by @vangel76 in #3282
    ui: Dust & Scratches previews at full resolution, as it applies by @switch87 in #3287
    Open several files in name order, keeping it for background opens (#3248) by @myangaa1 in #3293
    GPU canvas: price the display textures before building them (#2934) by @vangel76 in #3299
    Move tool: double-click type on the canvas to edit it (#1132) by @LloydNicholson in #3300
    Free Transform: right-click W or H to pick their unit (#3235) by @dhiorns15 in #3301
    Type: variable font axis sliders; optical size follows the type size (#2985) by @vangel76 in #2996
    Tests: panic_hunt reruns a timed-out command before calling it hung (#2994) by @vangel76 in #2997
    Cycle Color Lookup LUTs with keyboard and wheel by @imSlicedBread in #3304
    Fix/3144 taskbar maximized by @axlecoffee in #3308
    File Handling: wire Image Previews to embed a PSD thumbnail (#204) by @davidmann4 in #2971
    Select and Mask: Output To New Document, with or without a layer mask (#2998) by @vangel76 in #3007
    Inspect: report each layer's vector mask by @KnottyDyes in #2980
    Pen: Alt breaks a handle while drawing, and close-drag pulls out the first anchor's handles (#3306) by @vangel76 in #3314
    Type: Warp on live type takes the warp styles and stays editable, no prompt (#3004) by @vangel76 in #3008
    feat(ui): Motion Blur and other filter angles get the angle dial (#3152) by @Kartik8Dwivedi in #3407
    Free Transform: ⌘-drag of a corner scales editable type instead of distorting it (#3010) by @vangel76 in #3012
    Color panel: HSB on sRGB values, like Photoshop (#3323) by @LloydNicholson in #3327
    fix(shapes): options bar Fill/Stroke edit the selected shape by @alonfaraj in #3370
    Installed ICC profiles in the profile menus, and Mirror in Print by @Moiztermind in #3011
    Window: a window saved while minimized reopens at the minimum size, not 160 × 64 by @KattKnight in #3380
    i18n: translate the Select and Mask dialog labels (#3014) by @vangel76 in #3015
    Color: honour the EXIF sRGB tag on open; wire Ignore EXIF Profile Tag (#204) by @timothydaly1 in #3026
    Linux: say so when no file dialog can open (#3354); read ldconfig on non-English systems by @DomiLuebben in #3397
    fix(paint): respect Lock All on layer masks (#3094) by @Sir-Starch in #3111
    Transform: Distort, Perspective and Warp keep shape layers live (#3009) by @vangel76 in #3025
    fix(gradient): respect Lock All on Gradient Fills (#3093) by @Sir-Starch in #3120
    fix(ui): focus and select hex field when color picker opens (#3375) by @buivanvu94 in #3408
    Type: scan system fonts off the UI thread (#3021) by @vangel76 in #3030
    fix(type): respect Lock All on text edits (#3092) by @Sir-Starch in #3132
    fix(type): return caret after normalized CRLF insertion (#3074) by @Sir-Starch in #3138
    Toolbox: make the colour swap arrow clearer by @Jeremy8776 in #3416
    fix(type): navigate adjacent line with large leading (#3066) by @Sir-Starch in #3141
    fix(ui): drop doubled options-bar borders reintroduced in UI.9 by @rafi612 in #3425
    Transform Path: Distort, Perspective and Warp apply to paths (#3027) by @vangel76 in #3032
    fix(crop): unlock Background when extending canvas (#3081) by @Sir-Starch in #3158
    Fix Camera Raw preview color management by @imSlicedBread in #3427
    fix(mode): restore indexed pixels after clearing transparency (#3080) by @Sir-Starch in #3153
    Marquee: Single Row/Column Marquee History step names (#3031) by @vangel76 in #3035
    fix(cli): skip recorded view and save steps in batch (#3058) by @Sir-Starch in #3143
    Properties: a new adjustment or fill layer shows its settings, not its mask (#3369) by @davidmann4 in #3429
    fix(filters): process untouched Reveal All masks (#3082) by @Sir-Starch in #3156
    Keep the Color panel selected when switching themes (#3371) by @prekabreki in #3433
    fix(history): read locked history sources (#3076) by @Sir-Starch in #3186
    automation: refuse edit.installedProfiles, it scans the OS profile folders by @Sir-Starch in #3763
    Keep transform controls with moved selected pixels (#3402) by @prekabreki in #3436
    SVG: warn when text has no font to use (fixes the FreeBSD svg test) by @diegochagas in #3168
    Crop tool: switching to another tool commits the pending crop (#3368) by @davidmann4 in #3451
    fix(warp): Perspective Warp moves only the selected part of a linked … by @kavishkashehan726-sudo in #3148
    Paths: Stroke Path with any brush-based tool and Simulate Pressure (#2978) by @vangel76 in #3039
    fix(image): arbitrary canvas rotation moves position-locked children in groups (#3078) by @buivanvu94 in #3155
    i18n(cs): translate the dynamic labels the Czech catalog was missing by @Losminek in #3454
    Artboard tool: '+' buttons add a board beside the selected one; ⇧ keeps proportions (#3033) by @vangel76 in #3046
    fix(transform): identity transform makes feathered selection edges translucent (#3079) by @buivanvu94 in #3159
    Let the Actions step list grow with its panel by @kotulsky in #3460
    Layers: clip groups follow New Layer, Arrange, Reorder and Delete (#2203) by @timothydaly1 in #3090
    Type Mask: Shift/Alt at commit add to or subtract from the selection; no Layers row for the working text (#3036) by @vangel76 in #3069
    Quick-export each selected layer as a separate PNG by @kotulsky in #3462
    scorecard: FILE-216-5 save-path tests are in the tree by @davidmann4 in #3476
    Actions: a command that runs other commands is recorded once (#3067) by @vangel76 in #3072
    Type: triple-click selects a line, quadruple a paragraph, five clicks all text (#3493) by @davidmann4 in #3496
    Layers: the New Layer dialog (Layer › New › Layer…, ⇧⌘N) by @timothydaly1 in #3104
    Color Picker: no bigger than Photoshop's (532 × 376 points, was 682 × 437), buttons sized to their labels by @kayrockscreenprinting in #3500
    Artboards: a board moved past the canvas origin grows the canvas left/up (#3070) by @vangel76 in #3073
    Optimise computed brush coverage and native raster row writes by @optimalbytee in #3098
    fix(crop): the crop box's own Undo/Redo (#3145) by @dottedt in #3510
    Freeform Pen: Alt-clicks draw straight segments; Cmd/Ctrl is Direct Selection with the new pens (#3085) by @vangel76 in #3087
    test(gradient): guard the on-canvas midpoint diamond drag (#3172) by @dottedt in #3512
    Actions: Last Filter is recorded as the filter it repeated (#3089) by @vangel76 in #3091
    Content-Aware Move: Transform On Drop (#3071) by @vangel76 in #3095
    Numeric fields: typed units, scrubby labels, double-click reset (#3099) by @vangel76 in #3100
    Keep fitted Camera Raw colour during tuning and crop Nikon D5100 borders by @optimalbytee in #3201
    Preserve surrounding whitespace in OpenRaster layer names by @imSlicedBread in #3207
    Tests: one GPU harness at a time in every GPU test binary (WARP crash) by @dhiorns15 in #3212
    Content-Aware Scale: transform box with live preview (#3096) by @vangel76 in #3103
    automation: doc.place reads a file through the read root (#2810) by @switch87 in #3215
    Layers panel: Shift+Plus/Minus cycle blend modes; effects dropped on the Trash are deleted (#3102) by @vangel76 in #3106
    Moving type keeps its rendering: Artboards to Files no longer drops PSD text by @fabianghe in #3218
    Shortcuts: layout-independent brush keys, Photoshop's German keys plus a fallback for all layouts (#3109) by @vangel76 in #3112
    Liquify: the brush fades to nothing at its edge at every Density (#2606) by @dhiorns15 in #3241
    test(paint): pin the retouch dab footprint to the Full Size ring by @switch87 in #3258
    Layers panel: a mask dragged onto the Trash asks to apply or delete it (#3113) by @vangel76 in #3118
    PNG export: Indexed Color keeps the document resolution (#3047) by @vangel76 in #3271
    Layers panel: dragging the vector mask to the Trash asks to delete just the mask (#3119) by @vangel76 in #3125
    Interface: an Enable Animations preference (#3273) by @vangel76 in #3276
    Edit > Copy takes a targeted layer mask, so masks travel between layers and documents (#2928) by @vbasky in #3267
    automation: export layers, data sets and CSVs through the granted roots (#3216) by @switch87 in #3230
    Type: fall back to installed Khmer, Lao and Burmese fonts (#218) by @RaccoonPie-314 in #3259
    Curves: pencil mode, Smooth and Edit points (#3088) by @vangel76 in #3108
    fix(io): smooth PSD gradients no longer overshoot their stops (#3028) by @Sir-Starch in #3285
    Codecs: decode PNM straight into the budgeted output buffer (#2938) by @vangel76 in #3291
    Properties: Curves adjustment layers get the black/gray/white eyedroppers (#3110) by @vangel76 in #3115
    Format: admit the declared .pcraft canvas before loading it (#2935) by @vangel76 in #3295
    fix(format): persist the Save As filename in .pcraft manifests (#3312) by @Ni-zav in #3319
    Levels: black, gray and white point eyedroppers (#3116) by @vangel76 in #3128
    Puppet Warp: the mesh follows the object outline (#3105) by @vangel76 in #3117
    Clone Source: W/H link and overlay blend modes (#3298) by @vangel76 in #3310
    Vanishing Point: on-canvas plane editor with Create/Edit Plane, grid and paste (#3122) by @vangel76 in #3133
    Let [ shrink the brush to 1 px (#3229) by @myangaa1 in #3332
    MCP: command_batch says it is not atomic, and the docs explain recovery by @KnottyDyes in #3338
    New Document: a real Recent category of recently created documents (#3131) by @vangel76 in #3135
    Group effects follow their children's effects, not just their pixels (#3274) by @alexanderalber in #3326
    Format: reopening a .pcraft shares deduplicated tiles again (#3315) by @vangel76 in #3339
    fix(presets): never overwrite preset or actions files that failed to load by @tms-h in #3346
    fix(engine): create new layer masks at the document depth by @piero-83 in #3359
    feat(api): add file path to document.inspect by @Mr-Pearce in #3398
    Ctrl-click shape and path thumbnails to load selections by @kotulsky in #3449
    fix(selection): scope Color Range to the active selection (#3313) by @Ni-zav in #3366
    Layer › Duplicate Layer… asks for the copy's name and destination document (#3348) by @prekabreki in #3440
    Copy takes every selected layer, Paste recreates them (#2478) by @DomiLuebben in #3394
    Fix GIMP hole heading name and location by @philipzae in #3517
    Commands check an explicit "layer" instead of whichever layer is active by @fabianghe in #3466
    Brush cursor: shaped tips trace their outline (split from #2516) by @siraxe in #3467
    perf: Edit > Clear works tile by tile on large selections (#3463) by @itrycodinganditsbad in #3482
    Autosave: best-effort cleanup after commit; sweep orphaned recovery bundles (#3489) by @vangel76 in #3502
    Raw: open monochrome LinearRaw DNGs (1 sample per pixel) (#3497) by @davidmann4 in #3503
    PSD gradients: read the interpolation method Photoshop writes; add Smooth by @MrCloudy2 in #3442
    CI: restore tests, catalogs, and web size gate by @skylartaylor in #3923
    Color Balance: Photoshop's per-channel levels and gamma curves by @MrCloudy2 in #3443
    Save: show save progress as Saving NN% in the status bar and tab title (#3389) by @davidmann4 in #3485
    Warp presets: Photoshop's Bezier control grids instead of approximations by @MrCloudy2 in #3444
    Brush and Pencil: hold ~ to erase, and Clear mode (#3439) by @itsF4LCON in #3465
    Content-Aware tools: faster, cancellable at once, same pixels (P21, P22, P49) by @Unemars in #3395
    fix(io): a fresh Metrics type layer writes no empty Txt2 stub (#3514) by @dottedt in #3529
    Brush: show the smoothing string from brush to pointer (#3479) by @vangel76 in #3526
    Security: verify AppImage build inputs by @skylartaylor in #2270
    History panel: snapshots (camera button, snapshot rows, history.*Snapshot) (#2966) by @itsF4LCON in #3545
    feat(ui): Photoshop's New Guide: units and colour by @FinnNk in #3553
    Tools: Shift key switches tools by default, as in Photoshop (#3525) by @vangel76 in #3528
    Use Fontconfig for Linux font discovery (#2330) by @Sir-Starch in #2961
    Use each XRandR output's ICC profile in the screen picker by @Sir-Starch in #2962
    Support automatic monitor ICC profiles on Linux X11 by @Sir-Starch in #2963
    Security: harden document exports and automation inputs by @skylartaylor in #2269
    Animated GIF: every frame loads into video layers (#572) by @Sir-Starch in #2999
    GPU memory budget: read installed RAM on Windows by @dhiorns15 in #3189
    fix(ui): correct the clipping-mask indicator orientation by @Skyfuller1303 in #3037
    Windows installer: refuse Windows 7 and 8 with a clear message (#2310) by @dhiorns15 in #3261
    Format: index ZIP entries by name and use crc32fast (#3474) by @vangel76 in #3488
    psd: harden the standalone binary parsers (fuzz + property tests, gradient/swatch correctness) by @agent-346022 in #3542
    Add Vietnamese localization by @duydev in #2636
    Linux: StartupWMClass is the window's app id by @atoslins in #3481
    M11: ten more MCP acceptance tasks (11-20) for FILE-216-6 by @reynold-hu in #3562
    fix(ui): don't reopen floating Brush Settings on restart by @Ni-zav in #3570
    M11: six rounding-out acceptance tasks (31-36) by @reynold-hu in #3568
    Options bar: the Gradient tool's controls show in every theme (#3601) by @vangel76 in #3607
    fix(ui): one eliding label for fixed-width chrome, so translations can't overrun (#3580) by @dottedt in #3616
    test(ui): marquee shift+alt before the drag intersects the selection (#208) by @agent-346022 in #3624
    Crop tool: a resized frame snaps its handle, not the pointer (#3638) by @davidmann4 in #3640
    fix(transform): keep nearest-neighbor previews on original texels by @Ni-zav in #3688
    fix(engine): image.canvasSize rejects unlisted anchors instead of landing between two (#2946) by @agent-346022 in #3572
    Edit › Transform › Skew: corners and sides move along one axis, like Photoshop (#3437) by @kayrockscreenprinting in #3590
    PSD: alpha channel resources count the merged transparency; 13-byte DisplayInfo by @MrCloudy2 in #3577
    Glows: Photoshop's precise ramp; centre-source glows inverted after the contour by @MrCloudy2 in #3578
    Canvas: wheel/pinch zoom over the pasteboard keeps the image in view (#3720) by @FredApps in #3731
    Select: open the Save Selection and Load Selection dialogs (#3713) by @itrycodinganditsbad in #3738
    Toolbar: the colour chips sit right under the tools again by @Unemars in #3745
    Fix: video frames to layers working using folder dialog request (#3513) by @peppepol in #3718
    Menus: keep clear of the taskbar when Wayland hides the window position (#3737) by @FredApps in #3739
    i18n(it): translate the dynamic labels the Italian catalog was missing by @fabiodalez-dev in #3742
    Chisel bevels: Photoshop's facet slope and ramp ends by @MrCloudy2 in #3595
    Character panel: OpenType feature buttons (TYPE-218-5, #3752) by @davidmann4 in #3757
    Brush: symmetric live strokes update only what changed (#3593) by @xsvm in #3605
    Move: an unlinked layer mask moves alone when targeted (#3604) by @vangel76 in #3611
    fix(ui): drag a document tab off the strip to float it in its own window (#3733) by @bommerts in #3785
    fix(web): keep the canvas steady during preset saves by @zenjabba in #3805
    UI: drag to reorder swatch groups and preset folders (#3658) by @dottedt in #3828
    Keep transform preview visible while panning (#3610) by @Sir-Starch in #3843
    perf: draw marching ants as one mesh instead of a line shape per dash by @JameEnder in https://github.com/storytold/photocraft/pull/3846
    Fail CLI run when recorded action playback fails by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/3861
    Guides: Shift-drag out of a ruler lands on the nearest ruler tick (#3770) by @n-delic in https://github.com/storytold/photocraft/pull/3796
    fix(engine): a PSD type layer names the installed font, not an invented one (#3556) by @dottedt in https://github.com/storytold/photocraft/pull/3564
    Actions: replay tests for crop, filters, selections and styled text on a second document (AUTO-219-4) by @reynold-hu in https://github.com/storytold/photocraft/pull/3566
    feat(psd): Gradient Map stops in CMYK, Lab, Gray and HSB import and round-trip by @echelon in https://github.com/storytold/photocraft/pull/4033
    feat(save): File › Save keeps a JPEG's quality and a WebP's lossy/lossless encoding (#2399) by @echelon in https://github.com/storytold/photocraft/pull/4032
    PSD: descriptor ids warp, list and time are written as strings, as Photoshop writes them by @echelon in https://github.com/storytold/photocraft/pull/4039
    fix(liquify): pointer speed no longer changes the warp (continuous dab spacing) by @echelon in https://github.com/storytold/photocraft/pull/4047
    Update Japanese translations by @coolvitto in https://github.com/storytold/photocraft/pull/3892
    UI: unify plain text inputs on one text_field widget (#3789) by @dottedt in https://github.com/storytold/photocraft/pull/3896
    Layer › Export As exports every selected layer or artboard (#3629) by @fabianghe in https://github.com/storytold/photocraft/pull/3909
    UI: Photoshop-style in-dialog preview for the generic filter dialogs (#3769) by @dottedt in https://github.com/storytold/photocraft/pull/3877
    fix(ui): allow selecting shapes and editing color with path selection (#3915) by @seotarek in https://github.com/storytold/photocraft/pull/3932
    PSD type layers: TySh bounds, AntiAlias numbers and version info written as Photoshop writes them by @echelon in https://github.com/storytold/photocraft/pull/4041
    PSD: rasterized fill and smart layers stay rasterized after save and reopen by @echelon in https://github.com/storytold/photocraft/pull/4034
    Dismiss Home when closing a document tab (#3981) by @vbasky in https://github.com/storytold/photocraft/pull/3984
    fix(ui): show a paint-bucket cursor for the Paint Bucket tool (#3968) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/3989
    fix(ui): Open layer color choices from the visibility icon by @Ni-zav in https://github.com/storytold/photocraft/pull/4001
    fix(ui): Make checkbox labels nonselectable and show pointer cursors by @Ni-zav in https://github.com/storytold/photocraft/pull/4002
    fix(ui): keep filter jobs polling on idle Linux by @rozaqabdul656 in https://github.com/storytold/photocraft/pull/3961
    Add WebP and optional quality to Batch export dialogs by @zenjabba in https://github.com/storytold/photocraft/pull/3956
    feat(compose): Lab documents evaluate Invert, Posterize, Threshold, Brightness/Contrast and Gradient Map on L, a, b by @echelon in https://github.com/storytold/photocraft/pull/4038
    PSD: composite_rgba8 checks the output budget and converts planes fallibly (#3639) by @vangel76 in https://github.com/storytold/photocraft/pull/3651
    PSD: don't preallocate knots from untrusted path length counts (#3635) by @vangel76 in https://github.com/storytold/photocraft/pull/3654
    PSD: bound the zero padding of undersized pattern channels (#3652) by @vangel76 in https://github.com/storytold/photocraft/pull/3686
    PSD: cap descriptor list/object preallocation from untrusted counts (#3636) by @vangel76 in https://github.com/storytold/photocraft/pull/3699
    fix(engine): Displace smart filter ignores its mapPath displacement map (#3670) by @horknfbr in https://github.com/storytold/photocraft/pull/3676
    PSD: smart object Trnf frames the custom warp's control points, not the source rect (#3671) by @horknfbr in https://github.com/storytold/photocraft/pull/3677
    feat(io): import Photoshop Displace smart filters with their embedded map (#3673) by @horknfbr in https://github.com/storytold/photocraft/pull/3680
    Gradient Map: edit color stops on the ramp by @arthurdeka in https://github.com/storytold/photocraft/pull/3982
    Free Transform: a layer's style shows while the box is open, drawn from the transformed layer (#3653) by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/3696
    fix(algo): mesh warps filter their source when shrinking, so thin lines don't alias (#3672) by @horknfbr in https://github.com/storytold/photocraft/pull/3678
    feat(io): open Krita .kra composites as editable raster documents (#3692) by @Ni-zav in https://github.com/storytold/photocraft/pull/3700
    fix(psd): Multichannel alpha channels stay alpha; a save keeps resources and global blocks by @echelon in https://github.com/storytold/photocraft/pull/4031
    fix(layers): identify the Background by structure, never by its English name by @echelon in https://github.com/storytold/photocraft/pull/4036
    Codecs: refuse implausible PNG/WebP headers before allocating (#3691) by @vangel76 in https://github.com/storytold/photocraft/pull/3706
    PSD: avoid cloning layer data when padding and presize the output buffer (#3687) by @vangel76 in https://github.com/storytold/photocraft/pull/3707
    Codecs: bound the TIFF IFD walk by a file-size entry budget (#3683) by @vangel76 in https://github.com/storytold/photocraft/pull/3711
    Select the Normal RGB blend kernel once per buffer by @Streetblock in https://github.com/storytold/photocraft/pull/3715
    Allow empty vector masks in downsampled preview proxies by @Streetblock in https://github.com/storytold/photocraft/pull/3716
    feat(codecs): decode legacy PCX images and palettes (#3692) by @Ni-zav in https://github.com/storytold/photocraft/pull/3701
    fix(text): scale faux bold dilation with glyph scaling (#3705) by @nicolasfalesy in https://github.com/storytold/photocraft/pull/3719
    Answer a repeat auth with "already authenticated" (#3668) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/3723
    Codecs: integer fast paths for Image::convert (#3717) by @vangel76 in https://github.com/storytold/photocraft/pull/3729
    automation: say why a command is disabled in engine.commands (#3664) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/3740
    feat: Photoshop's layer and selection keys (Ctrl+, toggle, Ctrl+, /, Ctrl+Alt+2, Ctrl+Alt+Backspace, Tab rename, Alt-click thumbnail) by @FinnNk in https://github.com/storytold/photocraft/pull/3710
    View: remember Extras, Show and Snap To across restarts (#3762) by @bommerts in https://github.com/storytold/photocraft/pull/3787
    fix(automation): warn when text falls back from a missing font (#3391) by @buivanvu94 in https://github.com/storytold/photocraft/pull/3630
    Satin: Distance 0 draws as 1 px, as in Photoshop by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3744
    Type: editing text keeps its ligatures and OpenType alternates (#3617) by @davidmann4 in https://github.com/storytold/photocraft/pull/3747
    Brushes: Photoshop's texture Height/Subtract modes, Brightness and Contrast (#3340) by @davidmann4 in https://github.com/storytold/photocraft/pull/3749
    Camera raw colour fit: read a Sony Adobe RGB preview as Adobe RGB, not sRGB by @Madcat71 in https://github.com/storytold/photocraft/pull/3760
    Shadows/Highlights: Photoshop's, measured by @Unemars in https://github.com/storytold/photocraft/pull/3765
    Black & White: tint like the Color blend mode, as in Photoshop by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3780
    Hue/Saturation: Photoshop's saturation curve, lightness order and Colorize lightness by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3781
    History: add history.undo and history.redo aliases (#3675) by @dottedt in https://github.com/storytold/photocraft/pull/3786
    Fix straight-path anchor insertion at the hit position by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/3856
    Preserve signed HDR colors during surface transforms by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/3857
    Brushes: drag a brush folder into another folder (#2014) by @davidmann4 in https://github.com/storytold/photocraft/pull/3851
    Keep CMYK ink values when flattening and merging (#3778) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/3855
    Type: wire missingGlyphProtection (script fallback toggle) by @reynold-hu in https://github.com/storytold/photocraft/pull/3863
    io: read version 3 Photo Filter colour as XYZ, not Lab (#3777) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/3790
    Workspace: wire Enable Narrow Options Bar (#204) by @reynold-hu in https://github.com/storytold/photocraft/pull/3870
    Selective Color (Absolute): scale by the room the ink has, as in Photoshop by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3793
    Shift Edge moves by a fraction of a pixel so the slider does not snap by @Desayuno64 in https://github.com/storytold/photocraft/pull/3800
    Image > Mode > 32 Bits/Channel: convert to linear light, as Photoshop does by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3792
    Engine: Flatten All Layer Effects keeps layer and vector masks (#3804) by @dottedt in https://github.com/storytold/photocraft/pull/3835
    fix(gpu): flush every 1000 passes so deep stacks don't pile into one command buffer by @JameEnder in https://github.com/storytold/photocraft/pull/3844
    perf(gpu): a duplicated layer's texture starts as a copy of its source by @JameEnder in https://github.com/storytold/photocraft/pull/3848
    perf: the Navigator redraws only the area an edit changed by @JameEnder in https://github.com/storytold/photocraft/pull/3845
    perf: edits, undo and redo recomposite only where added or removed layers draw by @JameEnder in https://github.com/storytold/photocraft/pull/3847
    Remove tool: Create a new layer, and Remove after each stroke off by @diegochagas in https://github.com/storytold/photocraft/pull/3808
    Workspace: wire Auto-Collapse Iconic Panels (#204) by @reynold-hu in https://github.com/storytold/photocraft/pull/3880
    Camera Raw on raw opens: Clarity, Texture and Dehaze in linear light, measured by @Unemars in https://github.com/storytold/photocraft/pull/3815
    Layer styles: Photoshop's measured contour presets; Satin's contour lookup by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3803
    fix(smart-object): keep pixels when rasterizing smart object layer by @Gotix-eg in https://github.com/storytold/photocraft/pull/3873
    PSD: write kept 8B64 blocks as 8BIM so Photoshop opens PSB-derived files by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3743
    fix(io): preserve indexed BMP color tables (#3802) by @Sir-Starch in https://github.com/storytold/photocraft/pull/3869
    feat: Photoshop's tool keys (arrows turn the brush, Shift-click new type, Space+F canvas colour) by @FinnNk in https://github.com/storytold/photocraft/pull/3725
    PSD type: read styles from the run's sheets and place text at its Txt2 frame (#3795, #1317) by @FredApps in https://github.com/storytold/photocraft/pull/3819
    Merged and stamped layers keep their content bounds in CMYK and Lab by @dgliwa in https://github.com/storytold/photocraft/pull/3886
    Preserve surviving channel targets and visibility on deletion by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/3887
    Layers: Merge Group for a selected group (#3832) by @FredApps in https://github.com/storytold/photocraft/pull/3888
    test(cms): validate profile-specific CMYK endpoints by @FredApps in https://github.com/storytold/photocraft/pull/3890
    Count video footage in history memory budgets by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/3894
    Mix filtered selection edges with premultiplied alpha by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/3895
    Color: convert input-only embedded profiles to the working space on open (#3876) by @HEOJUNFO in https://github.com/storytold/photocraft/pull/3900
    Format: check pattern sizes on load (#3478) by @vangel76 in https://github.com/storytold/photocraft/pull/3484
    Format: overflow-safe blob decode and bounds-checked ZIP reads (#3486) by @vangel76 in https://github.com/storytold/photocraft/pull/3501
    Fuzz: ignore the same build leftovers in every fuzz crate by @s17sh70x2jfl031ag in https://github.com/storytold/photocraft/pull/3585
    HEIF: move the heic-rs pin from 0.1.1 to 0.1.4 by @s17sh70x2jfl031ag in https://github.com/storytold/photocraft/pull/3637
    Codecs: decode only the requested EXR part (#3721) by @vangel76 in https://github.com/storytold/photocraft/pull/3722
    Codecs: decode JPEG and CCITT G3/G4 compressed TIFF (#3712) by @vangel76 in https://github.com/storytold/photocraft/pull/3727
    fix(linux): avoid duplicate AppImage desktop launcher (#3623) by @Korg1ch in https://github.com/storytold/photocraft/pull/3641
    ops: count selection masks in history pixel budget by @Streetblock in https://github.com/storytold/photocraft/pull/3614
    Verify PngSuite archives and cached corpus files by @zenjabba in https://github.com/storytold/photocraft/pull/3973
    feat: Alt+Cancel → Reset for opt-in command dialogs by @seandellis in https://github.com/storytold/photocraft/pull/3871
    i18n(tr): add Turkish UI translation catalog by @yeniufuklar-com in https://github.com/storytold/photocraft/pull/3809
    i18n: add Hungarian (hu) UI translation by @Skaywalker in https://github.com/storytold/photocraft/pull/3831
    Release workflow: pass the Azure signing secrets by @echelon in https://github.com/storytold/photocraft/pull/3794
    Fix main: wasm size cap, Windows Export As test, filter preview window (scope and a crash), CLI duplicate font warnings by @echelon in https://github.com/storytold/photocraft/pull/4147
    Web: wasm back under the 24 MiB gate with ~1 MiB headroom (25.38 → 24.17 MB) by @bommerts in https://github.com/storytold/photocraft/pull/4253
    New Contributors
    @skylartaylor made their first contribution in #3097
    @herzer made their first contribution in #2660
    @Skyfuller1303 made their first contribution in #2738
    @imSlicedBread made their first contribution in #3209
    @TheTeslak made their first contribution in #3206
    @Simonfalentinolesen made their first contribution in #2402
    @Matty-PW made their first contribution in #2760
    @ngrafton2006 made their first contribution in #2892
    @KattKnight made their first contribution in #2510
    @timothydaly1 made their first contribution in #2953
    @Desayuno64 made their first contribution in #2555
    @peppepol made their first contribution in #3084
    @MathMattTech made their first contribution in #3114
    @paulo-vc made their first contribution in #3126
    @diegozpy made their first contribution in #3154
    @grlessa made their first contribution in #2592
    @dylanmtaylor made their first contribution in #3165
    @mjohnson7cd made their first contribution in #3171
    @myangaa1 made their first contribution in #3363
    @Myosh1 made their first contribution in #2916
    @onicafe made their first contribution in #3254
    @dmoulton made their first contribution in #2956
    @axlecoffee made their first contribution in #3308
    @KnottyDyes made their first contribution in #2980
    @Kartik8Dwivedi made their first contribution in #3407
    @Moiztermind made their first contribution in #3011
    @DomiLuebben made their first contribution in #3397
    @Losminek made their first contribution in #3454
    @dottedt made their first contribution in #3510
    @RaccoonPie-314 made their first contribution in #3259
    @tms-h made their first contribution in #3346
    @piero-83 made their first contribution in #3359
    @Mr-Pearce made their first contribution in #3398
    @philipzae made their first contribution in #3517
    @agent-346022 made their first contribution in #3542
    @duydev made their first contribution in #2636
    @atoslins made their first contribution in #3481
    @FredApps made their first contribution in #3731
    @fabiodalez-dev made their first contribution in #3742
    @JameEnder made their first contribution in https://github.com/storytold/photocraft/pull/3846
    @jonathanwxh-cell made their first contribution in https://github.com/storytold/photocraft/pull/3861
    @n-delic made their first contribution in https://github.com/storytold/photocraft/pull/3796
    @seotarek made their first contribution in https://github.com/storytold/photocraft/pull/3932
    @horknfbr made their first contribution in https://github.com/storytold/photocraft/pull/3676
    @nicolasfalesy made their first contribution in https://github.com/storytold/photocraft/pull/3719
    @Madcat71 made their first contribution in https://github.com/storytold/photocraft/pull/3760
    @Gotix-eg made their first contribution in https://github.com/storytold/photocraft/pull/3873
    @dgliwa made their first contribution in https://github.com/storytold/photocraft/pull/3886
    @s17sh70x2jfl031ag made their first contribution in https://github.com/storytold/photocraft/pull/3585
    @Korg1ch made their first contribution in https://github.com/storytold/photocraft/pull/3641
    @seandellis made their first contribution in https://github.com/storytold/photocraft/pull/3871
    @yeniufuklar-com made their first contribution in https://github.com/storytold/photocraft/pull/3809
    @Skaywalker made their first contribution in https://github.com/storytold/photocraft/pull/3831
    Full Changelog: v0.7.0...v0.8.2

    Original source
  • Oct 11, 2026
    • Date parsed from source:
      Oct 11, 2026
    • First seen by Releasebot:
      Oct 13, 2026
    storytold logo

    photocraft by storytold

    PhotoCraft v0.7.0

    photocraft releases a major update with new image-editing tools, richer layer and mask controls, improved selections and transforms, and broader file-format support. It also speeds up key workflows and polishes the interface for a smoother creative experience.

    What's Changed

    • docs: register the MCP server from an installed release by @sawizzle in #2185
    • docs(adjust): align Levels and Curves comments with evaluation order by @coygeek in #2212
    • Preserve unchanged XMP translations in File Info by @Benziza in #2152
    • Smudge: use the Brush Settings spacing for retouch strokes (#2140) by @davidmann4 in #2171
    • Fix layer mask toggle action labels by @optimalbytee in #2156
    • Fix hyperlink in credits panel by @crqch in #2146
    • Layers: mask thumbnails update after Invert and other whole-mask edits (#2117) by @davidmann4 in #2164
    • Keep the selection when smart selection finds nothing by @vbasky in #2235
    • fix(layer style): wrap Make/Reset Default buttons by @kmnkv1 in #2209
    • i18n(ru): translate layer style effects by @kmnkv1 in #2210
    • Layers panel: Opacity and Fill share one right-aligned column (#2085) by @davidmann4 in #2173
    • Ignore hidden RGB when Magic Wand selects transparency by @harrisonoconnorhover in #2273
    • Canvas: clip the Free Transform preview to the canvas (#2027) by @davidmann4 in #2201
    • fix(ui): avoid drawing panel borders twice by @tropicaaal in #2226
    • Layers panel: press-drag-release picks a fill or adjustment layer (#2071) by @davidmann4 in #2172
    • fix(engine): select neighbouring layer after deletion by @kotulsky in #2189
    • Preferences: the dialog grows with the window by @luniiya in #2155
    • scorecard: Marquee modifiers and brush resize drag are done (TOOL-214-2, TOOL-213-10) by @Duke242 in #2261
    • Confirm layer deletion only from the Layers trash button by @kotulsky in #2197
    • Soft brushes paint soft strokes and thin lines stay even: a Gaussian-like tip and area coverage for tiny tips by @tanish2k09 in #2167
    • TGA: save the document's alpha channel as 32-bit alpha (#2124) by @davidmann4 in #2157
    • Preserve quoted multiline variable CSV records by @harrisonoconnorhover in #2242
    • Workspace: wire open_documents_as_tabs preference (#204) by @Hathor875 in #2177
    • Expose Clone Stamp opacity and flow and apply them to strokes by @Ni-zav in #2256
    • Masks: target a new layer mask and keep separate colour pairs for mask and pixels (#2166) by @davidmann4 in #2200
    • Default layered edits of flat images to PSD on Save by @harrisonoconnorhover in #2234
    • Selection cursors: badges for cutting, copying and dragging the selected pixels by @texjer in #2250
    • Tools: double-clicking a layer mask launches Select and Mask with preference (#204) by @Hathor875 in #2161
    • Add pixel mask density and feather controls to Properties by @harrisonoconnorhover in #2240
    • Cmd held is the Move tool with the painting tools (Cmd+Alt duplicates) by @texjer in #2248
    • Hand tool: an open hand and a fist as the pointer on Windows, and the fist while panning everywhere (#2196) by @Sir-Starch in #2221
    • Move tool on a locked layer: Photoshop's message by @texjer in #2249
    • fix(ui): remove the gap beneath Spectrum document tabs by @Ni-zav in #2265
    • Web: leave the JPEG XL DNG decoder out of the wasm (25.1 MB -> 24.3 MB) by @echelon in #2233
    • fix(ui): mode buttons respect two-column toolbar by @tropicaaal in #2241
    • Layer › Rasterize acts on every selected layer; the Layers menu offers "Rasterize Layers" (#2243) by @Sir-Starch in #2253
    • Fix SVG selection and import detection by @alex-ctms in #2224
    • Pen pressure curve: Preferences › Tools shapes how pen pressure reaches every brush by @tanish2k09 in #2195
    • feat(ui): allow toolbar to scroll by @tropicaaal in #2238
    • GPU startup: CPU mode on Linux falls back to Vulkan to present the window (#1337) by @MrCloudy2 in #2206
    • Layers menu and layer commands follow the selection, not the active layer (#2244) by @Sir-Starch in #2254
    • Window edges: easier to grab, theme-safe cursors, and no lost hover after a resize (#1581) by @MrCloudy2 in #2205
    • fix(engine): reject invalid core-filter parameters by @0x6Ason in #2228
    • Keep duplicated Smart Objects linked to shared contents by @harrisonoconnorhover in #2222
    • fix(ui): complete system appearance selection and styling by @coygeek in #2168
    • Add the Remove tool with non-local patch completion by @JohnnYoru in #2193
    • Regenerate docs/scorecard.md after #2193 by @echelon in #2404
    • fix(engine): Image › Adjustments on a smart object records a smart filter (FILE-215-4); strokes honour the document CMYK profile by @kubuntugamer in #2229
    • Expand arithmetic expressions across numeric inputs by @TheSeanLavery in #2252
    • automation: accept absolute paths beneath the automation roots (#2176) by @SBaksa in #2216
    • Filters: preview at the scale OK applies (#2063) by @davidmann4 in #2207
    • Load Thai fallback fonts for native UI text by @harrisonoconnorhover in #2280
    • Content-Aware tools: Photoshop's behaviour, measured by @Unemars in #2202
    • Apply Type formatting to selected text layers by @harrisonoconnorhover in #2266
    • Distance fields on threads: bevel size changes 2-3x cheaper (#2119) by @Sir-Starch in #2162
    • EXR: Cryptomatte layers list, decode and hash to the specification by @Elvis33LE in #2180
    • Expose native shape stroke controls with staged previews by @optimalbytee in #2218
    • Select and Mask: 4x faster CPU refinement with exact octagonal morphology by @excited-raccoon in #2154
    • Addition : Brush popup better UI by @siraxe in #2217
    • kys import: first launch asks before importing; edit.keyboardShortcuts importKys (#1987 review) by @texjer in #2251
    • OpenRaster (.ora) open and save by @scottcampbelldata in #2257
    • automation: test root look-alike siblings and sub/../.. climbs (#2216 follow-up) by @echelon in #2528
    • Canvas: UI Scale must not magnify the image (#2121) by @maxm11 in #2333
    • Free Transform: the Hand tool no longer steals a resize drag (#2302) by @maxm11 in #2327
    • Clip warp tiles at the inverse horizon so steep Distort commits keep every pixel (#2271) by @MarekSpodBiedry in #2500
    • GPU canvas: re-upload a layer or mask texture when its default pixel changes (#2422) by @MarekSpodBiedry in #2446
    • fix(selection): constrain Polygonal Lasso segments with Shift (#2352) by @Ni-zav in #2396
    • fix(properties): expose equal-gap horizontal and vertical distribution (#2349) by @Ni-zav in #2398
    • Fix snapping when drawing a new crop inside the default frame by @harrisonoconnorhover in #2549
    • Capture marquee selection modifiers at mouse press by @harrisonoconnorhover in #2558
    • Marquee: keep one-pixel rows and columns on release (#2391) by @vangel76 in #2562
    • Move tool: outline follows the moved layer (#2413) by @vangel76 in #2565
    • Move tool: Ctrl/Cmd+arrow nudges the layer from any tool (#2474) by @davidmann4 in #2556
    • Move tool: Auto-Select picks a type layer inside its text bounds (#2370) by @vangel76 in #2591
    • Tools: a tool key brings back its group's last-used tool (#2608) by @vangel76 in #2625
    • Zoom tool: double-click zooms to 100% (#2508) by @vangel76 in #2527
    • Canvas: right-click outside the image opens the pasteboard colour menu (#2462) by @vangel76 in #2633
    • Spot Healing: the drag trail shows the dabs the heal covers (#2364) by @vangel76 in #2642
    • Preserve the Zoom drag anchor in rotated views by @harrisonoconnorhover in #2583
    • Selection feather: the radius is the Gaussian's sigma, as in Photoshop by @MrCloudy2 in #2529
    • Select › Modify › Smooth: a hard threshold, as in Photoshop, not soft edges by @MrCloudy2 in #2557
    • Select › Modify › Border: Photoshop's soft band, 2r wide, not a hard r-pixel ring by @MrCloudy2 in #2564
    • Keep surrounding spaces when renaming a layer (#2459) by @MarekSpodBiedry in #2472
    • Layer commands accept an explicit layer with none selected; Deselect Layers is a no-op when nothing is selected (#2457) by @MarekSpodBiedry in #2481
    • fix(engine): list running jobs before ended ones in jobs.list (#2395) by @KausBoss in #2411
    • fix(psd): an unedited save writes Photoshop's Txt2 back unchanged (#2374) by @vivekprojects-GIT in #2427
    • Remove tool: an empty layer is a no-op instead of running the fill (#2435) by @MarekSpodBiedry in #2447
    • fix(vector): Stroke Path refuses pixel-locked and fully locked layers (#2388) by @KausBoss in #2408
    • fix: Preserve CMYK solid and gradient fills through PSD round trips by @reneleonhardt in #2628
    • fix(codecs): exports drop the source's EXIF thumbnail (#2147, #2373) by @vivekprojects-GIT in #2450
    • fix(vector): Fill Path stays inside the active selection (#2387) by @KausBoss in #2410
    • Let Edit > Fill and the fill keys fill an adjustment layer's mask (#2456) by @MarekSpodBiedry in #2471
    • fix(document): restore layer comps when duplicating documents by @Ni-zav in #2429
    • Float the layer mask, not the layer, when the mask is targeted (#2468) by @MarekSpodBiedry in #2486
    • Quit and Close All: answering No closes that document (#2547) by @itrycodinganditsbad in #2610
    • Save As to a flat format keeps the layered original (#2550, #2579) by @itrycodinganditsbad in #2611
    • OpenEXR/HDR export: linearize grayscale documents too (#2386) by @itsF4LCON in #2448
    • TGA: a 32-bit Targa opens with its alpha as "Alpha 1", as in Photoshop (#2225) by @MrCloudy2 in #2482
    • Keep Duotone ink colours when converting to RGB, CMYK or Lab (#2383) by @itrycodinganditsbad in #2614
    • Reject colliding data-set export filenames before writing by @harrisonoconnorhover in #2433
    • Save and export dialogs remember where each document was last saved (#1826) by @bitshiftza in #2421
    • Open file pickers for Replace Contents, Export Contents and Convert to Linked by @fabianghe in #2438
    • Fix current .af artboard recognition and preserve editable boards by @callmeBalloch in #2355
    • fix(blend): keep 32-bit Hue/Saturation/Color/Luminosity above 1 by @hideoneric in #1735
    • Render: Tree and Picture Frame accept whole numbers sent as floats (#2501) by @davidmann4 in #2521
    • Extended filters: an unknown option is a bad-params error (#2228 follow-up) by @xsvm in #2548
    • Legacy Brightness/Contrast: brightness first, then contrast around 128, as in Photoshop by @MrCloudy2 in #2615
    • Bevel contour: drop the glow-style Range stretch by @juswus2000 in #2498
    • Blend modes: Fill below 100% works inside the blend for Photoshop's special eight by @MrCloudy2 in #2552
    • Issue #2326: Hue/Saturation Colorize at 0% saturation gives grey, not a 25% tint by @LloydNicholson in #2343
    • cms: accept ICC DeviceLinks whose output isn't a 3-channel PCS by @kavishkashehan726-sudo in #2348
    • fix(ui): keep menus responsive on documents with thousands of layers by @m6502 in #2454
    • Shift-click New Group groups the selected layers (#2561) by @itrycodinganditsbad in #2613
    • Fix/2361 scrub layer labels s20261010 t083444 z og3kyw by @Ni-zav in #2397
    • Filters: full-resolution preview for Add Noise, Wind, Extrude, Tree, the Filter Gallery and more (#2063) by @davidmann4 in #2494
    • Handle allocation failures in large pixel operations by @Elvis33LE in #2530
    • fix(layers): preserve Background behavior across merge, duplication and canvas resize by @Ni-zav in #2419
    • Fixed a bug where if you select a mask and hit the delete key, it deletes the image by @Lyraedan in #2635
    • fix(ui-egui): ui.key with ctrl does not trigger shortcuts off the Mac by @Erica4fr in #2430
    • Warp Text: the dialog opens with the layer's warp and previews it live (#218) by @skraus2 in #2539
    • Text fields: copy, cut and paste through the Mac menu's key equivalents by @Trade-Mottoes in #2568
    • Filter Gallery: preview at the scale OK applies (#2502) by @davidmann4 in #2524
    • Paste: a web Ctrl/Cmd+V key press and its paste event are one paste (#2638) by @vangel76 in #2643
    • Opening card: a long file name no longer pushes Cancel out of the card (#2423) by @bitshiftza in #2444
    • Windows: keep the custom title bar's window borderless (#2246) by @roaldosulejmani in #2401
    • Image Size and Canvas Size open on Width, selected (#2329) by @alexanderalber in #2357
    • Close a document tab with a middle click (#2570) by @bitshiftza in #2637
    • Dock splitters push the neighbouring groups instead of stopping (#2573) by @itrycodinganditsbad in #2624
    • Dropdowns: open lists start at their widest option's width (#2607) by @vangel76 in #2634
    • DNG: lossy compression 34892 (baseline JPEG tiles) by @Elvis33LE in #2021
    • Command palette: don't list menu separators (#2479) by @itrycodinganditsbad in #2632
    • fix(ui): restore muted text color for disabled Layer Style effects by @Ni-zav in #2321
    • Number fields: centre digits vertically by @rosematcha in #1322
    • Menus: Reveal in Finder names the platform file manager off macOS (#217) by @skraus2 in #2586
    • Enable menu Cut for selected type text by @harrisonoconnorhover in #1448
    • Create new documents by double-clicking presets by @harrisonoconnorhover in #2290
    • Re-render shapes when an artboard move grows the canvas (#2389) by @itrycodinganditsbad in #2623
    • Curved shapes no longer report bounds 1 px too wide (#2537) by @itrycodinganditsbad in #2641
    • Crop tool: W x H x Resolution mode resamples the crop to a size and resolution (#2443) by @davidmann4 in #2483
    • EXR parts: import parts, channel groups and an AOV precomp as layers by @Elvis33LE in #2338
    • fix(ui): toggle color swatches when selecting or deselecting a layer mask by @buivanvu94 in #2560
    • Skip distant TSL-off stroke layers during composition by @Elvis33LE in #2473
    • Ctrl+Tab and Ctrl+Shift+Tab switch to the next and previous document (#2340) by @alexanderalber in #2353
    • Keep plug-in menu rows under Filter › Plug-ins in every language (#2540) by @bitshiftza in #2627
    • Color panel: the field and hue strip fill the panel height by @Jeremy8776 in #2455
    • Speed up Iris Blur without changing output by @optimalbytee in #2578
    • fix(ui): unify Spectrum menu spacing and hover contrast by @Ni-zav in #2323
    • Colour swatches open PhotoCraft's Color Picker: filter dialogs, Preferences, Note, Count, artboard (part of #2144) by @kayrockscreenprinting in #2571
    • Dialogs: Tab walks the text fields only; New Document opens with its name selected by @texjer in #1285
    • Search: an exact name match ranks first by @luniiya in #2160
    • Channels: tint single colour channel views on the canvas with Show Channels in Color (#2385) by @mroxso in #2574
    • Pixelate: CMYK Facet 13.7x faster, Lab halftone 5.0x faster by @excited-raccoon in #2588
    • Tests: line-tables-only dev debuginfo, nextest GPU group, faster loop docs (#2204) by @davidmann4 in #2414
    • Free Transform: refuse a locked layer up front, with Photoshop's message (#2585) by @vangel76 in #2609
    • Crop tool: Photoshop's default mode turns the image behind an upright box; Use Classic Mode (P), Auto Center Preview (#1919) by @davidmann4 in #2545
    • Free Transform: keep the layer's place in the stack (#2439) by @Geljic in #2480
    • Quick Selection: 3.5x faster CPU strokes with hybrid graph cuts by @excited-raccoon in #2436
    • Image warp: grab anywhere on the grid, Ctrl-click to cut, Warp in the transform menu by @Jeremy8776 in #2621
    • Layers panel: a dragged layer copies onto its own row and into the empty space below the stack (#1721) by @switch87 in #2525
    • Properties ▸ Layer Mask: add Photoshop's Refine row (#2425) by @bitshiftza in #2639
    • Ruler units keep their own decimal places (#2434) by @bitshiftza in #2476
    • fix(docs): Linux build prerequisites only name Debian packages by @Erica4fr in #2437
    • i18n(es): translate the Add Noise and Reduce Noise dialog controls by @Erica4fr in #2470
    • Type: wire Use Smart Quotes for typed text (#204) by @reynold-hu in #2522
    • Progress docs standard: ROADMAP, target-app parity, gaps, per-dimension parity docs by @echelon in #2696
    • Keep As Is when reusing variable definitions by @Benziza in #2655
    • File > Scripts > Browse: filter the picker to script files (#2452) by @MarekSpodBiedry in #2499
    • PSD export: pad regenerated fill blocks to 4 bytes, as Photoshop does by @Sir-Starch in #2759
    • PSD: warn on an unreadable Lr16/Lr32 layer block and save one layer list (#2700) by @vangel76 in #2709
    • Channels: Delete with one channel targeted clears only that channel (#2720) by @vangel76 in #2730
    • Fix Windows-only path expectation in save dialog test (#2745) by @itrycodinganditsbad in #2782
    • Channels: Delete with an alpha channel targeted fills that channel (#2734) by @vangel76 in #2741
    • Lasso: Free Transform drags work with the Lasso tool selected (#2153) by @vangel76 in #2766
    • Copy and paste a single channel from the Channels panel (#2307) by @fabianghe in #2695
    • Move tool: the drag's box and snapping follow the Auto-Selected layer (#2666) by @vangel76 in #2675
    • Channels: Cut with one channel targeted clears only that channel (#2698) by @vangel76 in #2712
    • Move tool: ⌘-drag temporary Move gets the drag box and snapping (#2681) by @vangel76 in #2684
    • Smart Objects: converting several layers keeps them at the contents top level (#2648) by @vangel76 in #2651
    • feat(prefs): add intermediate UI scale options from 80% to 95% by @Ni-zav in #2678
    • Smart Objects: stacked layers sit at the contents top level (#2657) by @vangel76 in #2676
    • Selection: moving a selection outline snaps its bounds, not the pointer (#2736) by @vangel76 in #2740
    • Batch: a failed step inside a called action fails the file and the script (#2779) by @vangel76 in #2783
    • fix(ui): make painting symmetry available across all themes by @Ni-zav in #2704
    • Guides: ⌘-drag over a guide moves it with the selection tools too (#2690) by @vangel76 in #2699
    • Keep the blend-mode preview between list rows (#2553) by @itrycodinganditsbad in #2612
    • Lasso: ⌘-drag outside the selection moves the layer (#2725) by @vangel76 in #2737
    • Esc deselects when no active operation needs cancelling by @mroxso in #2765
    • Actions: record File › Save and Save As steps and replay them (#2032) by @vangel76 in #2746
    • Batch: skip recorded view steps in batch and droplets (#2752) by @vangel76 in #2761
    • fix(navigator): zoom the document with the mouse wheel over the preview by @Ni-zav in #2724
    • Home screen: remove individual Recent entries (#2691) by @itsF4LCON in #2731
    • Move tool: ⌘-drag with a painting tool floats the selected pixels from the control channel too (#2768) by @vangel76 in #2776
    • Actions: double-click an action to rename it (#2032) by @vangel76 in #2769
    • Brush cursor: Normal Brush Tip ring on the tip's real 50% contour (#2744) by @vangel76 in #2747
    • fix(ui): prevent Layers opacity controls from overflowing narrow docks by @Ni-zav in #2325
    • Image Size: Resample off keeps the pixel readouts honest (#2393) by @vangel76 in #2533
    • Paint a pen tap at its own pressure, not full or zero (#1798) by @itrycodinganditsbad in #2757
    • i18n: wrap remaining hardcoded UI strings for translation by @seldoms in #2467
    • fix(compose, gpu): round dithered gradient fills to the document dept… by @kavishkashehan726-sudo in #2781
    • Pencil/Eraser: round Pencil cursor and Eraser Pencil mode (#2662) by @vangel76 in #2694
    • Linux: no false missing-library warning when the linker cache can't be read (#1144) by @MarekSpodBiedry in #2503
    • Speed up large group merges (#1561) by @Elvis33LE in #2664
    • Interface: wire Dynamic Color Sliders for the colour tracks (#204) by @reynold-hu in #2531
    • Eraser: Block mode (#2770) by @vangel76 in #2778
    • Smart filter edits: re-render from cached stages, in a background job by @twentymls in #2739
    • Brush: Wet Edges acts on the whole stroke, not each dab (#2088) by @vangel76 in #2721
    • Spot Healing: Create Texture keeps the film grain (#2104) by @vangel76 in #2762
    • wasm: gate native-only constants so wasm32 builds without dead-code warnings (#2808) by @vangel76 in #2813
    • Marquee hinting follows a rotated view like the release does (#2512) by @switch87 in #2732
    • Place: wire Resize Image During Place into the implicit fit (#204) by @reynold-hu in #2538
    • Free Transform frames the whole type layer; Distort/Perspective greyed for type (#2630) by @itrycodinganditsbad in #2701
    • Tests: save-dialog expectations build their paths with Path::join, so they pass on Windows (#2745) by @mroxso in #2853
    • docs: correct Photomerge roadmap status by @Elvis33LE in #2831
    • Crop/marquee readout and Properties W/H/X/Y in the ruler unit (cm, mm, in…) by @llduyll10 in #2334
    • Warp Text: Style and orientation come before Bend and the distortions (#2689) by @vangel76 in #2819
    • Layers: Layer via Copy duplicates every selected layer (#2777) by @vangel76 in #2796
    • Fix brush picker closing immediately on trackpad taps by @zi-ger in #2772
    • Web: File › Open opens every selected file (#2802) by @vangel76 in #2807
    • Status bar: show document dimensions in the ruler unit by @arthurdeka in #2618
    • Workspaces: preserve the embedding host menu and rail flags by @arthurdeka in #2620
    • Canvas honours Pixel Aspect Ratio Correction (#2594) by @itrycodinganditsbad in #2718
    • Control: timeout errors name the likely causes (#2489) by @ahmedhosnypro in #2497
    • Variables: applied text keeps the type layer's style (#2742) by @itrycodinganditsbad in #2785
    • feat(prefs): add search across preference sections and settings by @Ni-zav in #2679
    • ui-egui tests: drop the shadowing joined closure (fixes clippy on main) by @echelon in #2924
    • Filter Gallery: an unknown option is a bad-params error (#2548 follow-up) by @xsvm in #2599
    • Type: tabs advance to tab stops; Tab key types a tab (#1881) by @itrycodinganditsbad in #2733
    • Smart Objects: Copy/Paste with no selection keeps the smart object (#2428) by @vangel76 in #2653
    • Pencil: 1 px lines step pixel by pixel, no doubled corners (#2139) by @vangel76 in #2806
    • ui-egui tests: restore the joined helper (fixes main) by @echelon in #2947
    • Dock: drag a tab to reorder it within its group (#2272) by @itrycodinganditsbad in #2774
    • Edit: Copy/Paste with no selection keeps type, shape and group layers (#2670) by @vangel76 in #2686
    • feat(ui): hold Alt+Space to zoom out, as in Photoshop by @FinnNk in #2877
    • Themes: add Breeze Light and Breeze Dark (#2276) by @Sir-Starch in #2335
    • Move tool: highlight the layer Auto-Select would pick on rollover (#2834) by @vangel76 in #2843
    • Font menus: show an Arabic sample for families that cover Arabic by @diax7 in #2535
    • Layer > New > Background from Layer; the Background stays at the bottom (#2626) by @itrycodinganditsbad in #2663
    • Tools: Single Row Marquee and Single Column Marquee (#2837) by @vangel76 in #2848
    • feat(ui): live font preview on hover by @TssHack in #2431
    • Fix Linux appearance changes lost during startup by @Sir-Starch in #2833
    • Linux: a late first appearance reply repaints the idle window (#2798) by @itrycodinganditsbad in #2941
    • Layer > Rasterize > Layer Style bakes effects; Rasterize Layer converts vector masks (#2245) by @itrycodinganditsbad in #2669
    • Navigator preview fills its group; no scroll fade over dock panels (#2726) by @itrycodinganditsbad in #2818
    • Release prep 0.7.0: Linux riscv64 tarball + version bump by @echelon in #2965

    New Contributors

    • @sawizzle made their first contribution in #2185
    • @Benziza made their first contribution in #2152
    • @crqch made their first contribution in #2146
    • @vbasky made their first contribution in #2235
    • @kmnkv1 made their first contribution in #2209
    • @tropicaaal made their first contribution in #2226
    • @kotulsky made their first contribution in #2189
    • @MrCloudy2 made their first contribution in #2206
    • @JohnnYoru made their first contribution in #2193
    • @scottcampbelldata made their first contribution in #2257
    • @vangel76 made their first contribution in #2562
    • @KausBoss made their first contribution in #2411
    • @vivekprojects-GIT made their first contribution in #2427
    • @reneleonhardt made their first contribution in #2628
    • @itrycodinganditsbad made their first contribution in #2610
    • @itsF4LCON made their first contribution in #2448
    • @bitshiftza made their first contribution in #2421
    • @fabianghe made their first contribution in #2438
    • @callmeBalloch made their first contribution in #2355
    • @juswus2000 made their first contribution in #2498
    • @kavishkashehan726-sudo made their first contribution in #2348
    • @m6502 made their first contribution in #2454
    • @Lyraedan made their first contribution in #2635
    • @Erica4fr made their first contribution in #2430
    • @Trade-Mottoes made their first contribution in #2568
    • @Geljic made their first contribution in #2480
    • @seldoms made their first contribution in #2467
    • @twentymls made their first contribution in #2739
    • @zi-ger made their first contribution in #2772
    • @arthurdeka made their first contribution in #2618
    • @ahmedhosnypro made their first contribution in #2497
    • @FinnNk made their first contribution in #2877
    • @diax7 made their first contribution in #2535
    • @TssHack made their first contribution in #2431

    Full Changelog: v0.6.0...v0.7.0

    Original source
  • All of your release notes in one feed

    Join Releasebot and get updates from storytold and hundreds of other software products.

    Create account
  • Oct 10, 2026
    • Date parsed from source:
      Oct 10, 2026
    • First seen by Releasebot:
      Oct 13, 2026
    storytold logo

    photocraft by storytold

    PhotoCraft v0.6.0

    photocraft adds a broad set of image-editing tools and workflow improvements, including native Affinity import, SVG and camera RAW support, enhanced selection and transform controls, and faster blur and mosaic effects. It also strengthens PSD compatibility, performance, and stability.

    What's Changed
    Motion Blur: 6x to 70x faster (one merged kernel applied over whole rows) by @Ar-maan05 in #902
    Applying a text data set re-renders the type layer instead of blanking it (#990) by @ianswope in #1025
    PSD: a spec-order mask record is not misread as Photoshop's order when that reading is implausible (#949) by @wstock in #1129
    ui.window.open: an invalid document index is an error, not a side effect by @Elvis33LE in #1133
    fix(ui): remember previously applied New Guide Layout values by @Ni-zav in #1261
    fix(ui): allow removing the last polygonal lasso point by @Ni-zav in #1262
    PSD export: write empty layer and mask channels as raw by @DWAA1660 in #1290
    Fix #1286: Delete and Fill Selection on the selection tools' right-click menu by @bflatastic in #1331
    Part of #1275: the Studio themes show the Move tool's Auto-Select toggle by @bflatastic in #1333
    Fix #1323: a Distort corner stops before the box folds over by @bflatastic in #1332
    chore: remove accidentally committed fb-*.log files and ignore *.log by @ArianPashae in #1155
    Filter › Last Filter applies to the active layer, not the layer the filter first ran on (#1270) by @marcardenas in #1307
    Gradient tool: a handle dragged past the 10% scale floor stops; the other handle stays put (#1243) by @marcardenas in #1306
    fix(ui): prevent hidden guides from intercepting canvas input by @Ni-zav in #1268
    fix(ui): display configured Quick Export format in File menu by @Ni-zav in #1269
    fix(export): add WebP quality controls to Export Preferences by @Ni-zav in #1279
    PSD text fill: keep FillFlag so Photopea-edited text keeps its fill, carrying #1240 by @ragedotdev by @bflatastic in #1368
    Free Transform: W/H and X/Y fields reach large documents, carrying #1295 by @marcardenas by @bflatastic in #1340
    Select › Modify: Apply effect at canvas bounds, carrying #1296 by @marcardenas by @bflatastic in #1339
    Layers panel: hovering a blend mode previews it live on the canvas (#970) by @bflatastic in #1081
    docs: craftrules is not public — say so instead of linking it (#493) by @bfenty in #779
    i18n: fix pt-br label collisions (Feather/Diffuse, Liquify/Dissolve) by @RicSchonfelder in #833
    Never crash on hostile numbers: LUT sizes, Quick Selection points, link group ids by @tanish2k09 in #869
    A PSD layer with bounds but no channel data no longer aborts on a 360 GB allocation (#755) by @ianswope in #885
    New Document: a Clipboard preset with the clipboard image's size by @jason4short in #891
    Layer copies are numbered: "Layer 1 copy 2", not "Layer 1 copy copy" by @jason4short in #897
    file.new at 300000x300000 no longer fills ~360 GB of tiles before returning (#705) by @ianswope in #900
    Divide wide slice rectangles without integer overflow by @Ni-zav in #991
    Saturate layer-slice margins at coordinate limits by @Ni-zav in #998
    image.crop rejects an origin or far edge that can't be moved within i32 instead of panicking (#959) by @mnmlyw in #1013
    Place Scale Marker: a document under 8 px tall returns an error instead of panicking (#932) by @mnmlyw in #1014
    Timeline: out-of-range duration and fps are rejected, and stepping never panics (#1009) by @mnmlyw in #1023
    Slices test: as_chunks for the fixed 3-wide rows (follow-up to #991) by @echelon in #1374
    gradient.fill.stop rejects an out-of-range index with BadParams instead of overflowing (#958) by @mnmlyw in #1000
    Link Layers allocates a group id that can't overflow (#961) by @mnmlyw in #1022
    Median, Dust & Scratches: run time grows linearly with the radius, identical output at 8, 16 and 32-bit (#498) by @Ar-maan05 in #901
    docs: refresh implemented tool status in the roadmap by @Streetblock in #1205
    Options bar: the airbrush, smoothing options and symmetry buttons work (#1177) by @ChrisWaldenDev in #1214
    Startup: preserve the GPU backend after windowing errors by @liowald in #1228
    Brush Scatter: out-of-range amounts are rejected and dab rects can't overflow (#977) by @mnmlyw in #1034
    Space untimed stroke segments by distance when Spacing is off by @jason4short in #1036
    Variables: preserve Unicode when importing data-set CSV (#989) by @tiredIsa in #1062
    image.analysis.recordMeasurements: refuse an area too large to measure instead of overflowing by @wstock in #1184
    Edit Contents switches to the already-open contents document by @jason4short in #1037
    Paste into a targeted layer mask (or channel) instead of making a new layer (#1035) by @bflatastic in #1078
    Absolute colorimetric refuses a zero or non-finite media white (#972) by @wstock in #1125
    Clone Stamp / Healing Brush: a far source is a bad-params error, not an out-of-bounds slice (#1111) by @wstock in #1165
    Keep the Background position lock after Flatten Image by @CQMHV in #1238
    Shape gradients: honour midpoints, opacity stops, offset, dither and align by @Elvis33LE in #1321
    Holding a number key sets one digit's opacity, not a two-digit value (#953) by @ianswope in #1030
    Layers panel: Alt-click the line between two layers creates or releases a clipping mask (#967) by @bflatastic in #1066
    ⌘/Ctrl-scroll pans the canvas sideways; scroll bars always shown (#635, #620) by @bflatastic in #1069
    Nearest Neighbor: sample single source pixels on reductions without averaging (#1114) by @MokuLakshithReddy in #1141
    Fix: Resolve issue where various file formats save incorectly as a .psd by @Cyanoxide in #1178
    New adjustment and fill layers take the active selection as their mask (#1250) by @Pathos0925 in #1282
    Tools leave hidden layers alone: painting or moving a hidden layer is refused (#571) by @bflatastic in #872
    CI: ~1.6x faster runs (2.2x on Linux-only PRs), no more out-of-disk failures by @bflatastic in #1075
    feat(ui): edit the Color panel's hex and RGB readouts by @roaldosulejmani in #1016
    Deep EXR: write the flattened pixel by layout, not a fixed RGBA quadruple by @Elvis33LE in #1021
    Eyedropper cursor: a pipette instead of the crosshair when sampling by @jason4short in #1028
    Option flips Dodge/Burn and Blur/Sharpen for a stroke by @jason4short in #1038
    CPU effect maps: key fill layers by their cached pixels, drop opacity/visible by @Elvis33LE in #1059
    fix(cli): report missing font fallbacks in run, info and convert by @Ni-zav in #1299
    Corpus: pin the deep OpenEXR test images and check them in CI (FILE-216-3, part of #216) by @tanish2k09 in #881
    Selection tools: ⌘ moves like the Move tool; ⌘⌥ copies (pixels inside the selection, the layer outside) by @jason4short in #896
    Layer comps: offsets that don't fit i32 are dropped with a warning instead of overflowing (#1017) by @mnmlyw in #1039
    MCP doc_save: bridge mode refuses headless-only options instead of saving with defaults by @Elvis33LE in #1138
    Move tool: layers with effects that overhang the canvas drag ~2x faster (#761, #128) by @bflatastic in #893
    Artboards: coordinates past the 32-bit range are rejected instead of overflowing (#931) by @mnmlyw in #1032
    Autosave: a thread that fails to start is reported, not a silent no-op by @Elvis33LE in #1124
    Desktop: write log records to standard error and a rotating log file by @switch87 in #1143
    fix: resolve edge-case crashes, unbounded allocations, and UI sync defects by @buivanvu94 in #1010
    UI Scale Auto keeps the system's fractional scale on 4K (#1072) by @DWAA1660 in #1237
    raw: decode Nikon compressed NEF (lossless + lossy) by @switch87 in #1310
    Fix Drop Shadow angle synchronization and add a radial dial by @DWAA1660 in #882
    PSD notes: an icon position near i32::MAX saturates on save instead of overflowing (#939) by @wstock in #1176
    Improve Color Picker layout and spacing (#1188) by @shorbank in #1196
    Toolbar: the header chevron switches between one and two columns (#1197) by @prekabreki in #1200
    Find host CJK fonts inside Flatpak by @Ni-zav in #1204
    Select › Color Range: Photoshop's Sampled Colors model, Subtract from Sample and the eyedropper on the image by @Unemars in #1239
    PSD: preflight pattern allocations and reuse decoded buffers by @Streetblock in #1242
    Fix #1271, fix #1316: Preferences › Interface › System Title Bar by @bflatastic in #1344
    A non-Unicode command-line argument is a usage error, not a startup panic (#1108) by @wstock in #1168
    Fix transform cancellation undoing the wrong document by @CQMHV in #1170
    Fit Artboard on Screen: no i32 overflow for a board with large coordinates by @wstock in #1181
    filter.cameraRaw: refuse an area too large to develop instead of overflowing by @wstock in #1183
    PSD plane shuffles in bands; the document histogram computes off the UI thread by @Elvis33LE in #1185
    Add Polish translation by @Powiadomienie in #1192
    Layer style: an Outside stroke at Fill below 100 % leaves the interior clear by @llduyll10 in #906
    Fix(text): keep tiny EngineData reals parseable (#979) by @cold-atom in #1085
    Delete with nothing selected deletes the selected layers, of any kind (#1077) by @metzmehard in #1087
    Keep empty selections empty for subtract and intersect by @Ni-zav in #1190
    Filters respect layer locks; render filters and Fill Path refuse a pixel-locked layer (#1102) by @prekabreki in #1195
    Relight: halo covers the blur reach, no silent no-op above 8 MP, box-Gaussian blur (follow-up to #735) by @mvanhorn in #895
    Help › Search: clicking the search field keeps the menu open by @jason4short in #1027
    Preferences: reset a single shortcut or menu colour override (#988) by @tiredIsa in #1064
    Hand tool: 100%, Fit Screen and Fill Screen buttons, carrying #1314 by @rozaqabdul656 by @bflatastic in #1363
    SVG opens as shape layers and places as a vector smart object (FILE-215-9, part of #215) by @ljkx in #1305
    Show Clone Stamp source preview inside the brush cursor by @Lime-3010 in #1042
    Clear, Cut and Image › Adjustments refuse a pixel-locked layer (#1103) by @prekabreki in #1194
    PSD export parallel layer channels; shared proxy cache; banded CMYK export by @Elvis33LE in #1230
    Optimize Mosaic by averaging each cell once per tile (45-117x speedup) by @optimalbytee in #1294
    Open camera raws in Camera Raw first (Open / Cancel) by @switch87 in #1309
    ORF: a file cut short inside IFD0 is malformed, not the compressed variant (#1008) by @wstock in #1090
    Refuse to save a .pcraft holding a NaN or infinite float, instead of writing one that never opens again (#1101) by @wstock in #1172
    channel.merge: reject a repeated source index instead of closing an unrelated document by @wstock in #1179
    layer.delete keeps a document's last layer (#1107) by @prekabreki in #1189
    Paint Bucket and Gradient keep alpha on a transparency-locked layer (#1104) by @prekabreki in #1193
    Document tabs: elide and overflow into a » menu when they are too many (#1276) by @LordFarquaadtheCreator in #1293
    Embed PhotoCraft CLI Windows icon and version metadata by @mvanhorn in #889
    Fix corrupted reduced canvas previews with separate mip render targets by @GamerWil26 in #892
    Fix Classic Gradient transparency and open the Gradient Editor by @jerrykimo in #905
    i18n(pl): translate the strings that landed alongside the Polish catalog by @echelon in #1426
    Regenerate docs/scorecard.md (139 preferences after #1016) by @echelon in #1435
    Fix #1272: a reassigned shortcut runs its new command by @bflatastic in #1330
    Pen tablets: the pen works on Wayland (through Xwayland), macOS pressure fixes (#639, #759) by @bflatastic in #1070
    Content-Aware Fill: size error instead of a panic for a huge selection, carrying #1024 by @mnmlyw by @bflatastic in #1409
    Fix radial blur sampling density (#515) by @agorevski in #658
    Right-click Brush Preset picker picks presets like Photoshop (#615, #1031) by @bflatastic in #1080
    Brush tests: seams, hard edge, zero scatter and ABR tip colour (#213) by @reynold-hu in #1221
    Feature: Add incrementation with up/down arrow keys on numeric fields by @Cyanoxide in #1326
    codecs README: lossy WebP is written by the built-in VP8 encoder (#1352) by @ragtux in #1396
    Perspective Warp: replacing the planes mid corner drag ends the drag (#952) by @kayrockscreenprinting in #1398
    Puppet Warp: an expansion that empties the mesh is refused, not a panic (#951) by @kayrockscreenprinting in #1410
    Vibrance: Photoshop's Saturation and Vibrance, measured (linear light, 0.288 R + 0.712 G grey) by @Unemars in #1418
    Select › Modify refuses a negative radius instead of clamping it (#993) by @DWAA1660 in #1274
    Rulers: right-click to switch the ruler unit by @jeremyfry in #1235
    Fix/1350 preserve active on save by @shmuelbiller1 in #1416
    Zoom: the Zoom tool's click honours Zoom Clicked Point to Center (#204) by @reynold-hu in #1241
    Preferences: show Zoom Clicked Point to Center now that the Zoom tool reads it (follow-up to #1241) by @echelon in #1480
    feat(ui): auto-scroll Layers panel during layer drag and drop by @Ni-zav in #1298
    Preferences › Performance › Low Resolution Previews: live previews at full resolution when it's off by @Unemars in #1247
    Eyedropper: the comparison ring while sampling (#213) by @reynold-hu in #1227
    Type Tool: Ctrl/Cmd temporary transform handles while editing (#1091) by @remidesbois1 in #1202
    i18n: translate the Fill dialog, layer style contours and Image Size "(was …)" by @ArthurViniciusBA1 in #1291
    Pipette cursor test: Windows draws the precise crosshair itself (main is red on Windows) by @bflatastic in #1437
    Keep the active document when closing another tab by @CQMHV in #1148
    Cancel transforms in their originating document, carrying #1170 by @CQMHV by @bflatastic in #1390
    Move several selected layers into a group in one step, carrying #1297 by @Ni-zav by @bflatastic in #1403
    Regenerate generated docs after the latest community merges by @echelon in #1489
    undo/redo report the step's damage instead of recompositing the whole canvas by @Elvis33LE in #810
    Color Lookup: keep the .cube input domain and reject the ones we cannot apply by @Elvis33LE in #1130
    ui.set validates every field before applying the first one by @Elvis33LE in #820
    Red Eye tool in the J-group flyout by @mvanhorn in #1084
    Layered TIFF: the review changes of #672 (keep unknown blocks with their byte order, io behind the engine, fixture attribution) by @ljkx in #835
    Advanced Blending: knockout, blend as group, transparency shapes, masks hide effects (FILE-215-16, part of #215) by @ljkx in #903
    I18N: Localize startup notices and welcome text by @txiki739 in #1094
    Lasso: Alt clicks add straight segments, releasing Alt closes the outline by @jason4short in #888
    Layers panel: Alt-drag a row to copy the layer there, as in Photoshop by @bani4kaskashka in #1216
    fix(ui): wrap New Document preset titles inside their cards by @SckraT in #1401
    PSD type layers without pixels are rendered on import; PostScript font names resolve to the installed family by @diegochagas in #1406
    Curves: add black, gray, and white point eyedroppers by @mralonsocorona in #873
    GPU startup: windowing errors keep the backend; a failed CPU start doesn't pin CPU, carrying #1228 by @liowald and #1145 by @shovel-kun by @bflatastic in #1342
    Add layer and group color labels (#1283) by @shorbank in #1289
    Color Balance: Photoshop's slider double-click reset, wheel and arrow steps, Alt+Cancel Reset, Properties Reset and history by @Unemars in #1256
    Fix #1248: Create and Release Clipping Mask act on every selected layer by @bflatastic in #1392
    Fix #1288: keep edits to a video frame when the playhead moves by @bflatastic in #1395
    Dropdowns take the arrow keys once open, carrying #1324 by @rozaqabdul656 by @bflatastic in #1341
    Move tool moves the selected pixels when there is a selection (#578) by @bflatastic in #1068
    Fix #1371: read large macOS display ids, keep ICC bytes out of the error by @bflatastic in #1412
    Fix #1354: the macOS menu bar is modal under dialogs, like shortcuts by @bflatastic in #1413
    Fix #1387: the Type tool's font, style and size controls show in every theme by @bflatastic in #1414
    Selection tools: ⌥ with nothing selected draws a new selection (follow-up to #1190) by @bflatastic in #1364
    Fix #1380: the web build asks before leaving the page with unsaved work by @bflatastic in #1424
    Camera Raw opens in a window of its own by @switch87 in #1361
    Export As: a scale that changes only the height is applied (#1353) by @ragtux in #1394
    New Document: a size typed in millimetres or another physical unit keeps its digits (#1147) by @MarekSpodBiedry in #1378
    PNM: the file, not the header, bounds what a decode reserves (#1110) by @kayrockscreenprinting in #1365
    Select › Modify refuses a radius below the dialog's minimum, carrying #1391 by @MarekSpodBiedry by @bflatastic in #1485
    Edit › Toolbar: hidden tools leave the toolbar, carrying #1376 by @MarekSpodBiedry by @bflatastic in #1486
    Paint Bucket: All Layers samples the visible image, carrying #1386 by @harrisonoconnorhover by @bflatastic in #1487
    Swatches: user swatch model with .aco/.ase import and export (FILE-215-14, part of #215) by @ljkx in #886
    Regenerate generated docs after the latest community merges by @echelon in #1518
    Toolbar test: qualify egui::Vec2 (ui-egui tests don't compile on main) by @echelon in #1519
    Large document: a notice explains a slow CPU fallback redraw (#1015) by @ianswope in #1427
    i18n: split "Light" — font weights get their own context, Camera Raw keeps the panel term by @Elvis33LE in #1061
    Pattern Stamp tool in the S-group flyout by @mvanhorn in #922
    Fix #1229: the Polygonal Lasso tool removes its last vertex on Backspace (follow-up to #1262) by @bflatastic in #1338
    Document tabs: elide and overflow into a » menu, carrying #1293 by @LordFarquaadtheCreator by @bflatastic in #1367
    Fix #1381: selecting type on Wayland no longer deletes it by @bflatastic in #1421
    File dialogs no longer freeze or crash the app (#673, #574) by @bflatastic in #1071
    Fix #1357: every Layer Style effect row shows its checkbox by @bflatastic in #1422
    Swatches import/export and the Export As test use the async file dialog (main doesn't compile) by @echelon in #1528
    Color Range: improve previews, sampling and eyedropper responsiveness by @abc2cb in #1377
    Surface Blur: 4x to 20x faster on 16-bit and 32-bit layers, carrying #1095 by @tanish2k09 by @echelon in #1529
    Regenerate generated docs after the latest community merges by @echelon in #1530
    type.create: an unknown or out-of-range kerning is a bad-params error, as in type.edit (#994) by @MarekSpodBiedry in #1303
    Control server: a bad JSON reply carries "id": null like every other unknown-id error (#1006) by @MarekSpodBiedry in #1304
    Show Extras Options: checkboxes read and set the Show flags they name (#957) by @MarekSpodBiedry in #1320
    Numeric fields: arrow-key steps never clamp with a reversed or NaN range (follow-up to #1326) by @bflatastic in #1450
    New Document: preset titles wrap inside their cards, carrying #1401 by @SckraT by @bflatastic in #1452
    Fix startup panic when UI Font Size is not Small by @syd168 in #1467
    Clone Stamp: live stroke, strokes start on the press, source preview under the brush by @jason4short in #1026
    Wayland: drop notice offers paste and the XWayland command for this install (#338, #386) by @bflatastic in #1073
    Live strokes for the History Brush, Healing Brush and the dab tools by @jason4short in #1040
    Non-Unicode arguments: translate the desktop notice (follow-up to #1168) by @bflatastic in #1359
    Fix #1313: Tab hides all panels, Shift+Tab the panel dock, as in Photoshop by @bflatastic in #1388
    Selection tools: arrow keys nudge the selection outline (#1428) by @davidmann4 in #1502
    Mesh warp of a gray surface writes the old and warped regions separately (#995) by @kayrockscreenprinting in #1500
    Apply the transform when another layer is selected (#1400) by @davidmann4 in #1496
    Preserve document depth when splitting stroked vector shapes by @harrisonoconnorhover in #1495
    Puppet Warp: pins that stretch the content too far are refused (#1019) by @kayrockscreenprinting in #1492
    Canvas: checker moves with the image; pixel grid from 500%, over pixels only by @Jeremy8776 in #1491
    Liquify: Alt reverses Twirl and swaps Pucker/Bloat, as in Photoshop (#1442) by @davidmann4 in #1484
    .pcraft: a tile index outside the i32 pixel range is a corrupt file (#938) by @kayrockscreenprinting in #1483
    Camera RAW: a measured Nikon D4 profile (image area, white level, colour matrix, tone curve) by @Unemars in #1475
    fix(psd): write Photoshop-compatible Photo Filter adjustment blocks by @Ni-zav in #1473
    Speed up wide Motion Blur with adaptive FFT convolution by @optimalbytee in #1471
    Crop: an explicit rectangle past 300000 px per side is refused (#960) by @kayrockscreenprinting in #1470
    [P1] Enforce PNG text metadata decode limits by @Streetblock in #1460
    Keep Arbitrary Rotation previews visible on the GPU canvas by @harrisonoconnorhover in #1459
    Fix #1543: oversized Satin and Bevel & Emboss sizes render instead of panicking by @bflatastic in #1563
    Fix #1544: Image Size refuses a resample past the raster budget; resampling writes bands as it goes by @bflatastic in #1569
    Docker web deployment by @fplachecinski in #1334
    macOS DMG: branded window background and icon layout by @XusBadia in #1201
    Fill and adjustment layers take the active path as their vector mask, carrying #1539 by @davidmann4 by @bflatastic in #1570
    docs: MCP tool names and job tools, codec README JPEG metadata and deep EXR by @bflatastic in #1573
    Fix #1531: duplicate artboards beside the original, drag boards with the Move tool by @bflatastic in #1584
    Free Transform: the reference point moves with the box when scaling (#1329) by @davidmann4 in #1535
    MCP bridge: do not replay edits after a lost reply (#1007) by @harrisonoconnorhover in #1527
    Control: reject queued requests after their reply deadline (#1109) by @harrisonoconnorhover in #1525
    Undo: a paint stroke's undo keeps the painted layer active (#1356) by @davidmann4 in #1523
    PSD: warn that Color Lookup tetrahedral interpolation is saved as trilinear (#1347) by @davidmann4 in #1515
    TIFF: alpha after an unspecified extra sample opens transparent (#1349) by @davidmann4 in #1513
    Crop tool: show the pixels past the canvas while a frame is edited, as Photoshop does by @Unemars in #1508
    Help › Search: keep the field focused after a click opens Help (#1447, #1438) by @davidmann4 in #1507
    Font menu keeps its height and focuses its search field (#1369) by @davidmann4 in #1505
    Divide Slice: one division makes at most 10000 parts (#1020) by @kayrockscreenprinting in #1504
    Canvas: a huge view centre draws the selection outline without overflow (#980) by @kayrockscreenprinting in #1441
    Plug-ins: a missing parameter's default is clamped to the declared min..max (#1012) by @MarekSpodBiedry in #1443
    Plug-in names reject bidi controls, zero-width spaces and other invisible format characters (#1011) by @MarekSpodBiedry in #1444
    Opening a file with different horizontal and vertical resolutions says the vertical one is not kept (#1018) by @MarekSpodBiedry in #1445
    Control channel: ui.click rejects a count above 256 instead of queueing unbounded input (#982) by @MarekSpodBiedry in #1446
    Fix Transform Again action playback applying the transform twice by @harrisonoconnorhover in #1440
    MCP previews: reject unsupported document indices (#1005), carrying #1533 by @harrisonoconnorhover by @bflatastic in #1600
    Pen: reshape the final anchor's outgoing handle (#1482); independent rounded-rect corner radii (#1520), carrying #1538 and #1541 by @Ni-zav by @bflatastic in #1601
    Faster blur and resize accumulators; release closed-document textures, carrying #1511 and #1509 by @GamerWil26 by @bflatastic in #1602
    fix(ui): allow Delete and Backspace shortcuts to delete layer when a widget is focused by @buivanvu94 in #1565
    Windows: use native bitmap cursors for brush tips by @mrjeye in #1160
    Add full Type Color Picker and screen eyedropper with magnification by @abc2cb in #1232
    i18n: fix pt-br collisions (View/Preview, Flip/Invert, Light/Thin, Warp/Distort) by @ArthurViniciusBA1 in #1292
    Greek localization by @Camthalion77 in #1562
    Dodge and Burn tone each pixel once per stroke by @jason4short in #1041
    full_res_preview test: wait again when WARP outlasts egui_kittest's 10 s render wait (Windows CI) by @bflatastic in #1593
    i18n(el): translate the screen color picker strings (main red since #1232 + #1562) by @echelon in #1618
    History: count retained tiles incrementally below the byte budget by @Elvis33LE in #1157
    feat: add saved New Document presets by @0x6Ason in #1516
    i18n(el): translate the saved New Document preset strings (main red since #1516 + #1562) by @echelon in #1620
    Improve Actions editing, nested playback, and function-key shortcuts by @GamerWil26 in #1093
    PSD save: stream Lr16/Lr32 layer blocks into the output by @Elvis33LE in #1158
    Speed up exact Shape Blur convolution by @optimalbytee in #1566
    Command lookup: index registered and shell command IDs by @Elvis33LE in #1156
    i18n(el): translate "Pick a screen pixel or press Esc to cancel" (main's xtask i18n test) by @bflatastic in #1623
    Pipette cursor test: Windows reports the precise crosshair with its bitmap (Windows CI red since #1160) by @bflatastic in #1626
    Rotate View tool (#1611 by @mvanhorn) and ui_set describes every field (#1599 by @kubuntugamer), carried by @bflatastic in #1633
    Rotate View tool in the Hand flyout by @mvanhorn in #1611
    Grammatical articles in layer diagnostics (#1549) and invalid document index errors (#1557), carrying #1571 and #1586 by @buivanvu94 by @bflatastic in #1634
    A pathless PSD or PSB save leaves the document clean (#1547), carrying #1589 by @kubuntugamer by @bflatastic in #1635
    fix(io): layered TIFF export warns that retained EXIF will be dropped by @kubuntugamer in #1597
    Open Apply Image and Calculations dialogs by @rozaqabdul656 in #1596
    fix(raw): a DNG with only DefaultCropSize is cropped from the active area's origin (#950) by @SBaksa in #1595
    Layers panel: pop-up sliders for Opacity and Fill by @dhiorns15 in #1592
    Snap the Marquee drag outline to whole pixels by @hideoneric in #1587
    fix(autosave): report background write failures and retry unchanged revisions by @shmuelbiller1 in #1577
    fix(engine): finish background job bookkeeping on its document by @shmuelbiller1 in #1572
    [P2] Invalidate combined masks after pixel edits by @Streetblock in #1645
    Layers panel: ⌥-click on the line between layers, measured against Photoshop (follow-up to #1066) by @Unemars in #1642
    macOS: quit with terminate:, not by closing the window (#1575, #1458) by @brennanMKE in #1624
    Keep legacy PSD text origins visible when editing by @rozaqabdul656 in #1560
    Keep a brush per painting tool, as in Photoshop (#218), carrying #1629 by @agincel by @bflatastic in #1685
    Linux: display server preference (X11 / XWayland) so file drops work, carrying #1319 by @switch87 by @bflatastic in #1686
    fix(scorecard): mark the #204 preference rows done; their readers, allowlist and test exist (#1002) by @MarekSpodBiedry in #1694
    fix(control): ui.inspect reports the documented view preferences (#1003) by @MarekSpodBiedry in #1695
    fix(engine): Layer via Copy and Cut deselect, as Photoshop does (#1096) by @MarekSpodBiedry in #1696
    fix(engine): layer bounds drop the area a selection transform moved pixels out of (#1097) by @MarekSpodBiedry in #1697
    fix(ui): the Photoshop-style status bar shows messages with no document open (#1567) by @MarekSpodBiedry in #1698
    fix(ui): the Navigator keeps its image during a live paint stroke (#1631) by @MarekSpodBiedry in #1699
    fix(engine): Move tool Auto-Select clicks through fully locked layers (#1641) by @MarekSpodBiedry in #1701
    fix(io): a CMYK Channel Mixer using the black source stays raw in CMYK documents (#940) by @MarekSpodBiedry in #1702
    fix(io): keep a PSD Anno block that cannot be read instead of deleting it on save (#944) by @MarekSpodBiedry in #1703
    fix(automation): bridge doc_save without path writes back like headless (#946) by @MarekSpodBiedry in #1704
    fix(xtask): the scorecard's performance summary no longer counts not-run scenarios as tracked (#947) by @MarekSpodBiedry in #1705
    fix(ui): Keyboard Shortcuts dialog rejects a malformed overrides map instead of wiping shortcuts (#956) by @MarekSpodBiedry in #1707
    fix(compose): a Precise inner glow from the centre is no longer blank (#966) by @MarekSpodBiedry in #1708
    fix(engine): prefs.set and prefs.reset apply the text blending gamma (#987) by @MarekSpodBiedry in #1709
    docs: README tool count and list match Tool::ALL (#996) by @MarekSpodBiedry in #1710
    fix(compose): don't clip Add and Divide at 1 in 32-bit documents by @hideoneric in #1722
    Layered TIFF: an Intel-order file opened with every layer hidden (blend-if ranges swapped) by @llduyll10 in #1712
    Fix small caps rendering across fonts by @rozaqabdul656 in #1644
    CR2: read ColorData's as-shot white balance as words by @Elvis33LE in #1640
    AF.3: native Affinity import (layers, artboards, vectors, text, images), carrying #1607 by @callmeBalloch by @bflatastic in #1778
    Clarify that muda is a native menu crate, not Tauri by @bflatastic in #1786
    fix(docs): control-protocol Preferences Apply and OK are refused over control (#1555) by @buivanvu94 in #1678
    docs(control): align method signatures with accepted parameters (#1550) by @Ni-zav in #1674
    docs(mcp): grant scoped file roots in headless registration examples … by @Ni-zav in #1673
    docs: explain Windows source build prerequisites and app-control failures by @yearth in #1692
    fix(i18n): refine 32 German UI translations by @Streetblock in #1791
    Retouch tools: test the stroke-point bound on all eleven commands (#976) by @kayrockscreenprinting in #1784
    CI: no macOS on PRs or main; macOS is built and tested by releases by @echelon in #1820
    Liquify: a stroke segment walks only the dabs that can reach the field (#937) by @kayrockscreenprinting in #1736
    fix(ui): Esc ends a Pen path and keeps it instead of discarding it (#1769) by @Duke242 in #1787
    fix(ui): prevent selection tracing from blocking background job controls by @Ni-zav in #1690
    Equalize, Average and Clouds edit the targeted channel, not the layer (#935) by @kayrockscreenprinting in #1777
    View › Show › Target Path hides the path outlines (part of #1119) by @kayrockscreenprinting in #1794
    fix(canvas): isolate rotation previews to the active document with headless tests by @Ni-zav in #1676
    Gradient Map: pick presets from the gradient library (#1588) by @davidmann4 in https://github.com/storytold/photocraft/pull/1780
    Fix Linux Open filters for uppercase and mixed-case extensions by @AlanRockefeller in https://github.com/storytold/photocraft/pull/1439
    fix(engine): validate coordinates before live stroke updates by @0x6Ason in https://github.com/storytold/photocraft/pull/1652
    Preserve originating plug-in errors across parallel bands by @midasdf in https://github.com/storytold/photocraft/pull/1654
    test(liquify): verify Alt-reversed strokes survive replay and undo/redo by @Ni-zav in https://github.com/storytold/photocraft/pull/1675
    fix(ui): open Layers footer popup menus on secondary click (#1579) by @Ni-zav in https://github.com/storytold/photocraft/pull/1680
    Preferences: show next-launch notice for System Title Bar (#1661) by @midasdf in https://github.com/storytold/photocraft/pull/1677
    fix(ui): open Gradients preset browser from options-bar swatch (#1651) by @Ni-zav in https://github.com/storytold/photocraft/pull/1681
    Selective Color and Color Lookup: a wrong-typed key is an error (#936) by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/1790
    Layers panel: the eyes on effect rows show and hide effects by @Chandirasegaran in https://github.com/storytold/photocraft/pull/1664
    macOS: save to SMB shares that refuse a full flush (#1336) by @brennanMKE in https://github.com/storytold/photocraft/pull/1639
    Save/Close: finish layered TIFF writes before discarding documents (#1098) by @harrisonoconnorhover in https://github.com/storytold/photocraft/pull/1723
    fix(control): respect modal menu policy before invoking commands (#1556) by @Ni-zav in https://github.com/storytold/photocraft/pull/1671
    fix(control): expose open Brush Preset picker in ui.inspect (#1558) by @Ni-zav in https://github.com/storytold/photocraft/pull/1672
    fix(io): preserve PNG text metadata through document saves by @Elvis33LE in https://github.com/storytold/photocraft/pull/1684
    Add shared MCP conventions and cancellable Render Video by @storybored379 in https://github.com/storytold/photocraft/pull/1668
    Update Japanese translations by @coolvitto in https://github.com/storytold/photocraft/pull/1669
    Japanese: command names match the menu terms (follow-up to #1669) by @echelon in https://github.com/storytold/photocraft/pull/1860
    [P2] Bound mask-cache memory and include it in Purge All by @Streetblock in https://github.com/storytold/photocraft/pull/1650
    Toolbar colour chips, Color Picker and panel footers, as in Photoshop by @Unemars in https://github.com/storytold/photocraft/pull/1729
    [P2] Share concurrent cold mask builds by @Streetblock in https://github.com/storytold/photocraft/pull/1653
    Filter › Other › Color to Alpha (#1576) by @switch87 in https://github.com/storytold/photocraft/pull/1683
    fix(indexed-color): integer counts, palette stops and asynchronous previews by @Elvis33LE in https://github.com/storytold/photocraft/pull/1741
    Packaging: Windows MSI setup wizard (folder choice, progress, version, launch on finish) by @bflatastic in https://github.com/storytold/photocraft/pull/1864
    fix(codecs): read the resolution from EXIF, XMP and Photoshop APP13; write it consistently (#1691) by @switch87 in https://github.com/storytold/photocraft/pull/1744
    fix(ui): one Cmd+V pastes one layer (#1638) by @switch87 in https://github.com/storytold/photocraft/pull/1743
    inspect: report each smart object's source by @jmverges in https://github.com/storytold/photocraft/pull/1785
    Patch Tool: say to drag the selection after the lasso and after a click that moves nothing (#1715) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/1720
    fix(ui): keep autoscrolling Layers panel when a layer is dragged past its edge (#1501) by @buivanvu94 in https://github.com/storytold/photocraft/pull/1728
    Canvas zoom: Photoshop's range, ladder and ⌥-wheel step; no slide at the limit by @Unemars in https://github.com/storytold/photocraft/pull/1718
    Eyedropper: Sample Size, Sample layers and Show Sampling Ring (#1745 carry) by @bflatastic in https://github.com/storytold/photocraft/pull/1894
    feat(eyedropper): Sample Size, Sample layers and Show Sampling Ring (#1649) by @switch87 in https://github.com/storytold/photocraft/pull/1745
    Raw corpus: real camera files from raw.pixls.us, oracle-tested (#1636 carry) by @bflatastic in https://github.com/storytold/photocraft/pull/1895
    Raw corpus: real camera files from raw.pixls.us, oracle-tested by @Elvis33LE in https://github.com/storytold/photocraft/pull/1636
    Compose: restore the blend-space flags instead of clearing them after a tile (#1462 carry) by @bflatastic in https://github.com/storytold/photocraft/pull/1896
    xtask: corpus --all --update-manifest refetches every manifest (#1706 carry) by @bflatastic in https://github.com/storytold/photocraft/pull/1897
    Layers panel: drag layer effects onto another layer, Alt-drag copies (#1734 carry) by @bflatastic in https://github.com/storytold/photocraft/pull/1898
    Layers panel: drag layer effects onto another layer to move them, Alt-drag copies (#1719) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/1734
    Scorecard: mark UI-217-2 done; the geometry round trip is tested (#217) by @reynold-hu in https://github.com/storytold/photocraft/pull/1808
    Scorecard: mark the BUG-205 and BUG-207 rows done; the fixes and their tests are on main (#205, #207) by @reynold-hu in https://github.com/storytold/photocraft/pull/1795
    GPU parity tests: give the one-step tolerance f32 slack (#1848) by @Sir-Starch in https://github.com/storytold/photocraft/pull/1852
    camera_raw_scope: serialise the GPU tests with GPU_LOCK (#1855) by @Sir-Starch in https://github.com/storytold/photocraft/pull/1856
    Test the dispatch panic guard end to end; mark REL-3 done by @reynold-hu in https://github.com/storytold/photocraft/pull/1803
    Hue/Saturation: hue-following colour tracks on the Saturation and Lightness sliders (#217) by @reynold-hu in https://github.com/storytold/photocraft/pull/1863
    image.mode.bitmap: an unknown halftone shape is a bad-params error by @xsvm in https://github.com/storytold/photocraft/pull/1842
    Preferences on Cmd+K, Search on Cmd+F (Photoshop's defaults) by @texjer in https://github.com/storytold/photocraft/pull/1900
    File > Open starts in the last-used folder (#217) by @reynold-hu in https://github.com/storytold/photocraft/pull/1889
    fix(format): reject leading '+' in unhex pairs (#1818) by @maxm11 in https://github.com/storytold/photocraft/pull/1832
    Image Size reports the size it applied (#1815) by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/1836
    RAW: check the orientation range before narrowing (#1817) by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/1839
    Add Ukrainian UI translation by @dmatviichuk in https://github.com/storytold/photocraft/pull/1799
    Define Pattern asks for the pattern's name by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/1850
    fix(app): exit with status 2 when --control setup fails (#1816) by @maxm11 in https://github.com/storytold/photocraft/pull/1834
    fix(layers): Layers panel thumbnails of tall documents fill the thumbnail height (#1762) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/1805
    fix(ui): horizontal ruler keeps ticks when View > Flip Horizontal (#1814) by @maxm11 in https://github.com/storytold/photocraft/pull/1835
    Crop tool: Enter crops to the selection's frame (#1789) by @davidmann4 in https://github.com/storytold/photocraft/pull/1806
    Double-click the Hand tool to fit on screen by @stevanmarjanovic in https://github.com/storytold/photocraft/pull/1796
    Fix placed layer disappearing when editing Smart Object contents by @Dazzanova in https://github.com/storytold/photocraft/pull/1831
    Rasterize Vector Mask keeps a feathered edge (#992) by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/1807
    fix: start Save As and export dialogs beside the document by @0x6Ason in https://github.com/storytold/photocraft/pull/1866
    fix(ui): expand collapsed panels when a tab is clicked by @0x6Ason in https://github.com/storytold/photocraft/pull/1868
    Masks: \ toggles the layer mask's rubylith overlay (#1765) by @davidmann4 in https://github.com/storytold/photocraft/pull/1809
    Brush preset grid: centre the columns and indent every row by @dhiorns15 in https://github.com/storytold/photocraft/pull/1883
    Fill: pick the Custom Pattern from its swatches by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/1861
    Add Dutch (nl) UI translation by @nvict-service in https://github.com/storytold/photocraft/pull/1877
    Dialogs: tall filter dialogs scroll; a moved dialog reopens in place by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/1822
    fix(engine): give new adjustment and fill layers a white mask by @0x6Ason in https://github.com/storytold/photocraft/pull/1858
    Filter dialogs: OK keeps the preview until the filter lands by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/1825
    Layers: a new empty layer no longer recomposites every layer (#1771) by @davidmann4 in https://github.com/storytold/photocraft/pull/1846
    Schema dialogs ignore notes after a spec; Selective Color's OK works again by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/1886
    System title bar: hide the in-app mark and title, show the file in the OS title by @rafi612 in https://github.com/storytold/photocraft/pull/1903
    Canvas: edits that change no pixels (a lasso selection) don't recomposite (#1773) by @davidmann4 in https://github.com/storytold/photocraft/pull/1853
    fix(engine): preserve edited layouts before applying layer comps by @0x6Ason in https://github.com/storytold/photocraft/pull/1862
    Ctrl+T on a selected path transforms the path (#1770) by @alonfaraj in https://github.com/storytold/photocraft/pull/1871
    Free Transform: edge handles scale proportionally, ⇧ stretches one axis (as Photoshop CC 2019+) by @kuvshin888 in https://github.com/storytold/photocraft/pull/1873
    GPU canvas: convert changed layer tiles once each, in parallel (#1774) by @davidmann4 in https://github.com/storytold/photocraft/pull/1847
    Canvas: the CPU canvas pixel grid skips empty pixels, like the GPU canvas by @Jeremy8776 in https://github.com/storytold/photocraft/pull/1891
    Image › Adjustments: apply per tile in parallel (#1772) by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/1800
    Web: fonts served next to the app, loaded on demand (fonts/manifest.txt, craft-fonts format) by @kuvshin888 in https://github.com/storytold/photocraft/pull/1875
    New Document starts from the last document's settings (#1810) by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/1869
    feat(pen): undo in-progress points with Ctrl/Cmd+Z by @Ni-zav in https://github.com/storytold/photocraft/pull/1478
    fix(engine): reject invalid new-document parameters by @0x6Ason in https://github.com/storytold/photocraft/pull/1878
    Command palette: recently run commands on an empty query (#217) by @reynold-hu in https://github.com/storytold/photocraft/pull/1824
    feat(ui): add Edit Stroke dialog with shared blending controls by @Ni-zav in https://github.com/storytold/photocraft/pull/1477
    Crop tool: rotate the crop frame by dragging outside it (#1792) by @davidmann4 in https://github.com/storytold/photocraft/pull/1879
    Control: shell dialogs are listed and driven as "shell" (#1004) by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/1811
    MCP: tool schemas without $ref, $defs or boolean schemas (#1782) by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/1845
    Document tabs: Reveal in Finder and drag to reorder (#217) by @reynold-hu in https://github.com/storytold/photocraft/pull/1906
    Add centered and transformable painting symmetry axes (#1648) by @shorbank in https://github.com/storytold/photocraft/pull/1821
    SVG import: refuse deeply nested markup instead of overflowing the stack by @syd168 in https://github.com/storytold/photocraft/pull/1901
    raw: cRAW black level without a tag; measured image areas (D800E, ILCE-7) by @Gotya-OFFCIAL in https://github.com/storytold/photocraft/pull/1902
    Filter previews compute off the UI thread; a stale one is cancelled once the slider settles by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/1899
    Support RAF format used by Fujifilm cameras by @kstppd in https://github.com/storytold/photocraft/pull/1872
    Fix browser Save for Web downloads and stale export dimensions by @harrisonoconnorhover in https://github.com/storytold/photocraft/pull/1857
    Fix style list display issue for certain fonts in Type tool by @quiple in https://github.com/storytold/photocraft/pull/1844
    Allow automation to edit embedded Smart Object contents by @harrisonoconnorhover in https://github.com/storytold/photocraft/pull/1882
    Speed up Mosaic with portable row reads by @optimalbytee in https://github.com/storytold/photocraft/pull/1524
    feat(export): export selected adjustment layer stacks as .cube LUTs by @Ni-zav in https://github.com/storytold/photocraft/pull/1493
    Optimize Radial Blur sampling without changing output by @optimalbytee in https://github.com/storytold/photocraft/pull/1499
    PSD: Optical kerning survives a round trip (Txt2 auto-kern modes) by @shmuelbiller1 in https://github.com/storytold/photocraft/pull/1517
    codecs: PNG export gives the same bytes on any core count by @rossaai in https://github.com/storytold/photocraft/pull/1932
    i18n(uk): refine eyedropper and color picker wording by @dmatviichuk in https://github.com/storytold/photocraft/pull/1974
    Fix/zip deflate unbounded limit by @shmuelbiller1 in https://github.com/storytold/photocraft/pull/1956
    Paste: drop a stale image once the OS clipboard has moved on by @jason4short in https://github.com/storytold/photocraft/pull/1912
    fix(ui): show native macOS labels in unsaved-changes prompts by @Ni-zav in https://github.com/storytold/photocraft/pull/1936
    gpu: write F32_MAX exactly so the compositor shader builds on WebGPU by @joe2643 in https://github.com/storytold/photocraft/pull/1982
    Fill layers keep their colours in the document's mode (#1905) by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/1915
    PSD export: pattern fill layers keep their pattern in CMYK and Lab (#1907) by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/1917
    fix(ui): correct percentage grid spacing and snapping on rectangular canvases by @Ni-zav in https://github.com/storytold/photocraft/pull/1914
    fix(inpaint): bound proximity-match search radii to image dimensions by @Ni-zav in https://github.com/storytold/photocraft/pull/1969
    Print Size honors the Screen Resolution preference (#204) by @reynold-hu in https://github.com/storytold/photocraft/pull/1923
    PSD import: warn when an adjustment layer can't be read (part of #1763) by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/1925
    Smart contents test: match the refused path by file name (Windows CI red since #1882) by @echelon in https://github.com/storytold/photocraft/pull/2042
    fix(smart): preserve pattern resources when converting fill layers by @Ni-zav in https://github.com/storytold/photocraft/pull/1937
    Menus: a submenu with every item disabled is disabled too (#1976) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/1984
    fix(paint): preserve stylus pressure on quick taps by @Ni-zav in https://github.com/storytold/photocraft/pull/1967
    fix(text): render imported PSD tabs as whitespace instead of tofu by @Ni-zav in https://github.com/storytold/photocraft/pull/1942
    Type: wire Fill new type layers with placeholder text (#204) by @reynold-hu in https://github.com/storytold/photocraft/pull/1935
    Type: wire the Use Escape to Commit preference (#204) by @reynold-hu in https://github.com/storytold/photocraft/pull/1927
    Transparent PNG, TIFF and other flat images open as Layer 0, not Background by @LloydNicholson in https://github.com/storytold/photocraft/pull/1913
    File Handling: wire Lowercase Extension through Save As (#204) by @reynold-hu in https://github.com/storytold/photocraft/pull/1941
    fix(retouch): sample Proximity Match from original pixels by @Ni-zav in https://github.com/storytold/photocraft/pull/1968
    feat(ui): show rotation cursor and live angle during Free Transform by @Ni-zav in https://github.com/storytold/photocraft/pull/1948
    fix(ui): expand dialog title drag targets for easier window movement by @Ni-zav in https://github.com/storytold/photocraft/pull/1945
    fix(actions): play the first action when none is selected by @Ni-zav in https://github.com/storytold/photocraft/pull/1990
    Crop tool: a pending crop stays with its document (#1918) by @davidmann4 in https://github.com/storytold/photocraft/pull/1957
    fix(dialogs): remember validated filter settings after successful apply by @Ni-zav in https://github.com/storytold/photocraft/pull/1944
    Crop tool: arrow keys nudge, X swaps orientation, W × H readout (#1919) by @davidmann4 in https://github.com/storytold/photocraft/pull/1958
    PSD import: a pattern-filled shape opens as a pattern fill layer (fixes corpus floor after #1917) by @echelon in https://github.com/storytold/photocraft/pull/2059
    Preferences: wire large_tabs, export_clipboard, and show_channels_in_color (#204) by @Hathor875 in https://github.com/storytold/photocraft/pull/1986
    Crop tool: overlay options (thirds, grid, diagonal, triangle, golden ratio/spiral), O / ⇧O (#1919) by @davidmann4 in https://github.com/storytold/photocraft/pull/2026
    Canvas: zoom is physical at any display scale (#1943) by @maxm11 in https://github.com/storytold/photocraft/pull/1978
    feat(ui): add Close and Close Tab Group to panel tab context menus by @Ni-zav in https://github.com/storytold/photocraft/pull/1924
    fix(canvas): say when the desktop takes an Alt-click (#1658, #1659) by @switch87 in https://github.com/storytold/photocraft/pull/2003
    fix(compose): apply Curves master before per-channel tone records by @Ni-zav in https://github.com/storytold/photocraft/pull/1929
    feat(ui): use native file picker for Color Lookup LUT imports by @Ni-zav in https://github.com/storytold/photocraft/pull/1947
    Quick Selection: Photoshop's behaviour, measured and fitted by @Unemars in https://github.com/storytold/photocraft/pull/1966
    Prefs audit: Export Clipboard reads as wired again by @echelon in https://github.com/storytold/photocraft/pull/2069
    fix(compose): knock out outer glow behind see-through fill by @shmuelbiller1 in https://github.com/storytold/photocraft/pull/1964
    DNG: deflate compression 8 with the TIFF predictors by @Elvis33LE in https://github.com/storytold/photocraft/pull/1971
    fix(gpu): preserve hard gradient stops with CPU fallback by @raghav2005 in https://github.com/storytold/photocraft/pull/2005
    Update document names after successful Save As by @optimalbytee in https://github.com/storytold/photocraft/pull/2018
    Layers panel: the scroll wheel over the blend-mode menu steps through the modes by @skraus2 in https://github.com/storytold/photocraft/pull/1961
    About window: fixed table headers, aligned columns, fitted tabs by @dhiorns15 in https://github.com/storytold/photocraft/pull/2000
    Text: fall back to Thai-capable fonts for missing glyphs (#1909) by @davidmann4 in https://github.com/storytold/photocraft/pull/2030
    Dialogs: open on their first value, selected (#1757) by @davidmann4 in https://github.com/storytold/photocraft/pull/2040
    History: Delete current state and New Document from the panel footer work (#1117) by @davidmann4 in https://github.com/storytold/photocraft/pull/2039
    Smart Clipboard Matching (#2034) by @alex-ctms in https://github.com/storytold/photocraft/pull/2045
    fix(ui): apply distinct workspace presets (#1120) by @zenjabba in https://github.com/storytold/photocraft/pull/2051
    Compose: bound effect memory on large documents (#19

    Original source
  • Oct 8, 2026
    • Date parsed from source:
      Oct 8, 2026
    • First seen by Releasebot:
      Oct 13, 2026
    storytold logo

    photocraft by storytold

    PhotoCraft v0.5.0

    photocraft releases a major update with new editing tools, smarter text and layer workflows, expanded PSD, TIFF, HEIC and WebP support, faster filters, improved automation, and broader language support.

    What's Changed

    • Add rendering modes and CPU fallback recovery by @TheSeanLavery in #434
    • Type layers keep their name in step with their text (#483) by @mnmlyw in #501
    • Unsaved-changes prompt: (D)on't Save / (C)ancel / (S)ave keys, Tab order by @sommerper in #533
    • Layer Style: the shadow/bevel Angle slider now moves the light (#350) by @agorevski in #411
    • Color Picker: sample colours from the image with a pipette by @carterwsmith in #508
    • Polygonal Lasso: double-click closes the polygon; a new polygon replaces the selection in one step by @rosematcha in #361
    • Type: the Color panel, Swatches and Color Picker recolor selected text by @rosematcha in #364
    • Free Transform: Undo steps through the transform; handles are easier to grab by @rosematcha in #365
    • 32-bit documents: Levels don't clip the input and output ranges by @floflo777 in #403
    • rustfmt discard_ui.rs (CI Format step red since #533) by @echelon in #597
    • Smart objects keep their four-corner (Distort / Perspective) placement by @jason4short in #426
    • feat(ui): add bounded Liquify redo history by @agorevski in #435
    • Lasso inside liquify mode , with hotkeys L, alt , ctrl+i, ctrl+h for … by @siraxe in #453
    • Expose the Mixer Brush as a UI tool (#213) by @agorevski in #433
    • Control protocol docs: file.open/file.save are refused over --control (#379) by @floflo777 in #391
    • docs: sync scorecard with implemented behavior by @arpitkjaiswal in #348
    • Focus PhotoCraft for unsaved close prompt by @TheSeanLavery in #547
    • PSD: read/write the artboard lock at Photoshop's lspf bit 3 (#395) by @agorevski in #406
    • Show active ICC profile in the status bar (#321) by @agorevski in #432
    • Clarify integer and float bit-depth labels (#324) by @agorevski in #428
    • Wayland: explain native file drag-and-drop limitation (#386) by @agorevski in #430
    • Preferences › Interface: Show bounding box when dragging layer by @sommerper in #484
    • Hide unconfigured layer effects from Layers panel by @agorevski in #559
    • Paste: a copied image file pastes its pixels (part of #338) by @Ar-maan05 in #384
    • Content-Aware Scale: 13x faster seam removal, bit-identical output (part of #211) by @Ar-maan05 in #385
    • PSD: read smart-filter masks (FEid) with one section per smart object by @EthanSuquet in #396
    • Open documents in bounded reads, with a clear out-of-memory error (#375) by @ljkx in #401
    • Camera Raw: interactive histogram, clipping warnings and scopes (part of #215) by @tiredIsa in #407
    • Add the Patch tool with a live preview (#213) by @alexanderalber in #381
    • Add blend modes to the Gradient tool by @TheSeanLavery in #543
    • Start context-menu parity across canvas, paths, and document tabs by @TheSeanLavery in #556
    • i18n: complete Simplified Chinese catalog and localize brush sections by @flyyangX in #359
    • i18n: add French (fr) UI translation by @leblanc-simon in #410
    • i18n: "id" indonesian translation by @trokute in #449
    • Report per-language UI translation coverage (#220) by @agorevski in #427
    • Add style warp splits and grid presets by @juansebsol in #388
    • Add Edit Contents to the Smart Object context menu by @CQMHV in #599
    • Edit type layers by double-clicking their thumbnails by @CQMHV in #598
    • Monitor profile auto follows each window's display; what is applied is visible (#569) by @ha1des in #591
    • feat(i18n): add Korean and live language switching by @neko233-com in #582
    • Add fixed UI scale steps from 75% to 300% by @Sirsyorrz in #611
    • algo: fix flaky cancel/progress test - tile workers report out of order by @Elvis33LE in #609
    • Apply Image onto a transparent layer no longer turns it black by @cristianmoroaica in #607
    • Remember desktop window and panel sizes across restarts by @Webificio in #587
    • monitor_profile test: Unix only (fixes Windows CI after #591) by @echelon in #633
    • README: remove a stray "ArtCraft" line before Star history by @echelon in #636
    • Open HEIC/HEIF photos (#355) by @ljkx in #372
    • Rename PrintCraft to PdfCraft by @echelon in #766
    • Persist migrated presets with preferences by @CQMHV in #728
    • Select Linked Layers excludes an unrelated active layer by @CQMHV in #764
    • fix(cms): check LUT declared sizes before arithmetic by @agorevski in #725
    • i18n: add German (de) UI translation (#309) by @Elvis33LE in #663
    • fix(ui): search palette: the Enter that opens a dialog no longer closes it by @Mawfyy in #640
    • scorecard: BUG-203 (atomic saves) is done - flip the stale rows (#203) by @Elvis33LE in #687
    • layer.showOnly: ⌥-click a layer's eye to show only that layer by @jason4short in #665
    • Text fields stop resetting the input method every frame, so keys no longer repeat endlessly on Wayland (#585) by @ianswope in #723
    • fix(color): match Photoshop blend corner values by @agorevski in #699
    • Box Blur: up to 26x faster at large radii (same running-sum boxes as Gaussian Blur) by @Ar-maan05 in #628
    • Layers panel: drag down the eyes to show or hide layers; empty eye when hidden by @jason4short in #666
    • Minimum / Maximum (Squareness): up to 37x faster at large radii, bit-identical output by @Ar-maan05 in #630
    • Surface Blur: 13x to 40x+ faster on 8-bit layers (sliding histogram) by @Ar-maan05 in #631
    • Free Transform: picking another tool applies the transform by @rosematcha in #732
    • Layer › Remove Background: one-step subject cutout (layer.removeBackground) by @mvanhorn in #734
    • Brazilian Portuguese UI translation (pt-br) by @gangldiego in #700
    • fix(linux): AppImage registers its desktop entry and icon on launch by @Mawfyy in #617
    • macOS: menus open on press; only the title bar's free gap drags the window by @jason4short in #669
    • Color panel: click a chip to edit that color, double-click to open the Color Picker (#655) by @rosematcha in #664
    • Fix #497: group type edits and renames in undo by @agorevski in #652
    • Numeric fields evaluate typed arithmetic by @rosematcha in #726
    • Transform modes: Skew / Distort / Perspective as real modes; legacy corners as a preference by @jason4short in #671
    • document.pixel: no panic at x or y = i32::MAX, and no wrap-around past it by @Ar-maan05 in #629
    • Fix #570: Shift-click connects brush strokes by @agorevski in #654
    • Type: a forced line break (U+0003) breaks the line instead of drawing a box by @EthanSuquet in #644
    • Fix multi-file open dialog (#595) by @agorevski in #657
    • Fix Hue/Saturation range editor drag panic by @agorevski in #727
    • JPEG export no longer fails when the document's XMP is over 64 KB by @EthanSuquet in #645
    • Improve Korean terminology and dynamic UI translation coverage by @kijoong-kim in #604
    • Image Size keeps the canvas border opaque instead of fading it by @EthanSuquet in #646
    • Fix #695: validate Layer Style effect fields by @agorevski in #729
    • type.edit: a reversed runs range is a bad-params error, not a panic (#714) by @mnmlyw in #754
    • Arbitrary rotation starts at the ruler line's straightening angle by @rosematcha in #660
    • Prevent "Export As" from saving webp files as "*.webp.psd" by @Cyanoxide in #724
    • rustfmt xtask/src/i18n_coverage.rs (Format red on main since #663 + #700) by @tanish2k09 in #798
    • Find and Replace Text: no panic searching a non-type active layer (#703) by @mnmlyw in #762
    • Apply the Interface UI Font Size preference by @CQMHV in #616
    • codecs: decode deep OpenEXR (deepscanline/deeptile), composited flat or structured by @Elvis33LE in #642
    • Selections: drag to move the outline; ⌘-drag floats the selected pixels (engine commands) by @jason4short in #686
    • Filter › Render › Relight: redirect a photo's lighting by @mvanhorn in #735
    • rustfmt crates/codecs/tests/deep_exr.rs (Format red on main since #642) by @tanish2k09 in #804
    • Fix document run and ID overflow (#684, #685) by @agorevski in #749
    • Fix bridge preview PNG budgeting by @agorevski in #753
    • Clamp Variables data-set indices from control input by @Ni-zav in #772
    • Fix ui.set brush size command journaling by @agorevski in #744
    • Fix TIFF WhiteIsZero and BigTIFF orientation by @agorevski in #746
    • Shapes: a hairline vector stroke no longer darkens the shape's edge pixels by @EthanSuquet in #397
    • Spot Healing: Sample All Layers heals onto an empty layer (#731) by @rosematcha in #769
    • fix(i18n): follow native UI languages on first launch by @neko233-com in #661
    • Support Alt-held polygon segments in the freehand lasso by @jerrykimo in #711
    • Type: hitTest, caret and navigate commands so agents can edit text by position (part of #219) by @mvanhorn in #623
    • Korean labels for Relight's Ambient and Warmth options by @tanish2k09 in #811
    • fix(raw): validate DNG default crop bounds by @agorevski in #745
    • Fix vector pixel bounds overflow by @agorevski in #747
    • Layered TIFF: open and save Photoshop layer data in TIFF files, in either byte order (part of #215) by @ljkx in #672
    • Reject overflowing slice rectangles by @Ni-zav in #768
    • Fix hostile PSD pattern geometry by @agorevski in #743
    • Bound paint stroke work (#678, #679) by @agorevski in #751
    • Actions: actions.record/stop/play/list commands for agents and the CLI (part of #219) by @mvanhorn in #622
    • Fix text ink bounds overflow by @agorevski in #750
    • Repair corrupt directory-save objects by @agorevski in #752
    • fix(automation): close ambient filesystem authorization gaps by @agorevski in #763
    • rustfmt crates/ui-egui/src/canvas.rs (Format red on main since #711) by @echelon in #819
    • Flat exports embed no document XMP by default; Export As gains a Metadata choice (#647) by @Elvis33LE in #733
    • pcraft directory saves: re-verify a rolling share of cached objects; stronger file signature by @tanish2k09 in #821
    • rustfmt crates/ui-egui/src/export_dialog.rs (Format red on main since #672 + #733) by @tanish2k09 in #822
    • Follow-ups to #665, #666, #734: Photoshop's mask-only Remove Background, one-step eye sweep, no-clone Show Only by @bflatastic in #824
    • Headless saves write a flat TIFF unless they ask for layers by @tanish2k09 in #825
    • Dialog buttons follow the OS order; Windows/Linux unsaved-changes prompt asks Yes / No / Cancel (#627, #776) by @bflatastic in #826
    • Layers panel: a double-click just above or below a layer name renames it (#651) by @rosematcha in #823
    • Open .psdt templates as new untitled documents by @rosematcha in #807
    • fix(algo): blur small sigmas instead of silently no-oping (#706) by @bfenty in #783
    • fix(algo): gallery colour injection covers Colored Pencil and Neon Glow (#709) by @bfenty in #805
    • fix(algo): HDR Toning gamma follows its documented direction (#710) by @bfenty in #801
    • fix(engine): keyboard shortcut bulk set reports in-call clashes (#719) by @bfenty in #799
    • Auto-Align Layers: the dialog no longer sends reference 0 (#674) by @rosematcha in #795
    • fix(engine): view.newGuideLayout rejects absurd column/row counts (#704) by @bfenty in #797
    • Windows DX12: never load a foreign dxcompiler.dll from PATH (#712) by @bflatastic in #817
    • Cancel stale Warp drags when the mesh changes by @Ni-zav in #774
    • Handle Stack Mode sources with no visible layers by @Ni-zav in #770
    • Camera Raw: read and write settings as a live PSD Smart Filter (part of #215) by @tiredIsa in #459
    • fix(engine): clone source_rect clamps huge mapped coordinates (#716) by @bfenty in #809
    • Geom: Rect::width and height no longer overflow on i32-extreme rects (#675) by @Luna161 in #808
    • New Document: changing Resolution keeps the physical size when a physical unit is shown (#758) by @Luna161 in #818
    • Reject geometry params that would silently wrap through i64->i32 narrowing by @Elvis33LE in #803
    • ⌘⌥⌃-click on the canvas selects the topmost layer under the pointer by @jason4short in #813
    • Help › Search: find any menu command by name by @jason4short in #815
    • i18n(ko): drop the duplicate Ambient and Warmth rows (main red since #811 + #824) by @echelon in #834
    • rustfmt crates/engine/tests/hdr_gamma_direction.rs (Format red on main since #801) by @echelon in #842
    • Copy works on smart object, type and shape layers (#541) by @bflatastic in #841
    • Add the Content-Aware Move tool (#213) by @alexanderalber in #814
    • Rework Camera Raw filter preview and navigation by @abc2cb in #781
    • Bound layer-group nesting at import and Group Layers (stack-overflow guard) by @Elvis33LE in #796
    • fix(photocraft): reject an unparseable --control port instead of silently dropping it (#701) by @bfenty in #777
    • M9: create vertical type from the Type tool flyout by @midasdf in #784
    • Drag-and-drop: place onto the canvas in Free Transform, open at a tab slot by @carterwsmith in #739
    • Large PSBs open with their pixels: decode planes past 2 GiB, plus 4-5 GB PSB fixtures (#375) by @alexanderalber in #782
    • Layer Style: complete multi-instance effects and dialog parity (#157) by @remidesbois1 in #786
    • Italian UI translation (it) by @giallorosso84 in #853
    • Add the Magnetic Lasso tool by @louwers in #864
    • CI: never cancel main's runs; trim per-PR runner time by @tanish2k09 in #800
    • tiff_corpus: ask for layers explicitly (corpus job red since #825) by @tanish2k09 in #876
    • agent_tasks: wait for the MCP server task before removing the test folder (Windows os error 32) by @tanish2k09 in #877
    • Preset store: a store directory that doesn't exist yet reads as empty on Windows too by @tanish2k09 in #878
    • Locking a group locks the layers inside it by @rosematcha in #847
    • fix(engine): Camera Raw clamps the noise amounts to their range (#707) by @bfenty in #839
    • Test: press-drag-release across menu titles and into submenus (#775) by @bflatastic in #837
    • Filter previews stay inside the selection on large documents (#740) by @bflatastic in #836
    • fix(test): find sleep on PATH in monitor profile test by @simonwjackson in #855
    • ui-egui tests: GPU adapter catch_unwind stops swallowing setup-command failures (#760) by @Luna161 in #854
    • Warp: reject extreme rect params with BadParams instead of running a giant warp (#808 follow-up) by @Luna161 in #849
    • fix(algo): Path Blur clamps per-path speeds (#708) by @bfenty in #840
    • fix(io): artboard guide indices follow resource 1032 order (#722) by @bfenty in #845
    • fix(codecs): large PNG exports no longer lose bytes at a band's sync flush by @ajsongpilot in #827
    • PSD: decode the merged composite only when something consumes it by @Elvis33LE in #846
    • Lossy WebP: a pure-Rust VP8 encoder with quality and lossless controls (#648) by @ljkx in #880
    • Gaussian Blur: large radii are fast, live preview included (#464) by @bflatastic in #867
    • Resampling reads a bounded window, however small the target (#713) by @mnmlyw in #860
    • About: contributor and model credits compiled in (grab bag + table, self-submitted names) by @echelon in #898
    • Automation: Apply Data Set works for text and visibility data sets (#806) by @rosematcha in #870
    • Document tab × sits after the title on Windows and Linux, as in Photoshop (#619) by @bflatastic in #832
    • Brush size and hardness keys are remappable in Keyboard Shortcuts (#626) by @bflatastic in #828
    • Menu rows touch, as in native menus: long menus are a fifth shorter (#402) by @bflatastic in #844
    • actionlint: declare the org macos-release runner label by @echelon in #927
    • Slice Options and Divide Slice are one undo step; a rejected one changes nothing (#910, #911, #912) by @echelon in #928
    • Selection tools: Photoshop's full right-click menu (#614, #738) by @bflatastic in #831
    • CI: craft-fonts run uses the Test step's exact build again (Linux runner out of disk since #800) by @tanish2k09 in #955
    • TIFF: BigTIFF, every IFD and SubIFD, banded parallel decode (FILE-215-8, part of #215) by @ljkx in #859
    • Direct Selection tool: reshape pen and shape paths after they're drawn (#790) by @bflatastic in #865
    • Windows and Linux: one title bar with the app icon (no stacked OS bar); long context menus scroll by @bflatastic in #986
    • Filter Gallery: Angled Strokes paints strokes, not a smear; Rough Pastels' texture shows in dark areas (#879) by @echelon in #942
    • Save for Web: slices never overwrite each other; overlapping slices keep their HTML cells (#908, #909) by @echelon in #929
    • Out-of-range slice, layer comp and type style ids are rejected, not wrapped (#914) by @echelon in #930
    • Invert (⌘I) inverts the targeted layer mask (#780) by @bflatastic in #838
    • Drag layers onto another document's tab to copy them there (#589) by @bflatastic in #851
    • Layer › Smart Objects › Convert to Layers (#535) by @bflatastic in #829
    • Photo Filter and gradient glows render like Photoshop (#442, #443) by @bflatastic in #850
    • Fix main: classify the Direct Selection path commands; Czech for "{n} layer" by @echelon in #1074
    • Automation: an allowed command can't run a denied one on its behalf by @tanish2k09 in #861
    • Variables dialog: malformed entries can't crash an edit by @tanish2k09 in #875
    • Layers panel: drop layers on the footer's New Layer, New Group and Delete buttons (#736) by @echelon in #965
    • Crop tool starts with a frame around the canvas (or the selection), as in Photoshop (#668 item 7) by @echelon in #971
    • Type: ⌘/Ctrl+T while typing shows or hides the Character panel (#668 item 15) by @echelon in #983
    • Shape tools: Shift and Alt pressed during the drag constrain it, as in Photoshop (#668 item 12) by @echelon in #984
    • Layer via Copy, Copy and Cut read only the selected area: 33× faster on 24 MP (#668 item 18) by @echelon in #985
    • Windows: selection and other crosshair tools stay visible over grey (#737) by @echelon in #954
    • Clone Stamp / Healing Brush: the source crosshair shows only while painting (#668 item 10) by @echelon in #969
    • Preferences: colour settings take a typed #rrggbb value (#668 item 2) by @echelon in #1001
    • macOS: use the native menu bar instead of the in-window menus (#887) by @brennanMKE in #894
    • README: Downloads section listing every release build by @echelon in #1210
    • README Downloads: where to get it, then builds (Windows first) by @echelon in #1219
    • Release workflow: only signing and draft-release jobs use the release environment by @echelon in #1220

    New Contributors

    • @TheSeanLavery made their first contribution in #434
    • @mnmlyw made their first contribution in #501
    • @rosematcha made their first contribution in #361
    • @jason4short made their first contribution in #426
    • @siraxe made their first contribution in #453
    • @arpitkjaiswal made their first contribution in #348
    • @EthanSuquet made their first contribution in #396
    • @alexanderalber made their first contribution in #381
    • @flyyangX made their first contribution in #359
    • @leblanc-simon made their first contribution in #410
    • @trokute made their first contribution in #449
    • @ha1des made their first contribution in #591
    • @neko233-com made their first contribution in #582
    • @Sirsyorrz made their first contribution in #611
    • @Elvis33LE made their first contribution in #609
    • @cristianmoroaica made their first contribution in #607
    • @Webificio made their first contribution in #587
    • @mvanhorn made their first contribution in #734
    • @gangldiego made their first contribution in #700
    • @kijoong-kim made their first contribution in #604
    • @Cyanoxide made their first contribution in #724
    • @tanish2k09 made their first contribution in #798
    • @jerrykimo made their first contribution in #711
    • @bfenty made their first contribution in #783
    • @Luna161 made their first contribution in #808
    • @abc2cb made their first contribution in #781
    • @remidesbois1 made their first contribution in #786
    • @giallorosso84 made their first contribution in #853
    • @louwers made their first contribution in #864
    • @simonwjackson made their first contribution in #855
    • @ajsongpilot made their first contribution in #827
    • @brennanMKE made their first contribution in #894

    Full Changelog: v0.3.0...v0.5.0

    Original source
  • Oct 7, 2026
    • Date parsed from source:
      Oct 7, 2026
    • First seen by Releasebot:
      Oct 13, 2026
    storytold logo

    photocraft by storytold

    PhotoCraft v0.3.0

    photocraft releases version 0.3.0 with a broad set of improvements, including multilingual support, new editing and automation tools, stronger file compatibility, faster performance, and safer recovery and saving. The update also expands PSD support and refines the interface across platforms.

    Highlights since 0.2.0

    182 commits from 183 merged pull requests, including work from 31 community contributors (thank you!), and 146 issues closed.

    Your work is safer:

    • Recovered unsaved documents survive a second crash.
    • Deeply nested .pcraft files reopen.
    • photocraft-cli batch refuses to overwrite its input folder.
    • Preferences no longer get lost when two windows or tabs save, or when a save fails.

    Languages: the interface is available in 日本語, 简体中文, 繁體中文, Español, Русский and Čeština (Edit › Preferences › Interface › Language), with CJK fonts and IME input in the Type tool.

    Files:

    • JPEG and other no-alpha exports composite transparency over white.
    • Formats without colour profiles get sRGB.
    • Truncated JPEGs and multi-frame files open with a warning instead of silently.
    • TGA is offered in Save As and Export As.

    Editing:

    • Free Transform a Copy and Transform Again on a Copy.
    • Keyboard layer navigation, number keys for opacity, Alt-click colour sampling.
    • New from Clipboard.
    • Undo and redo restore the targeted layer.
    • Shortcuts pressed in quick succession all run, in order.

    Automation (CLI, MCP, control channel):

    • Stricter, clearer parameter and flag errors, and <subcommand> --help.
    • Background jobs that agents can wait for or poll.
    • Recorded actions run in batch.

    Scorecard

    This is the first release with docs/scorecard.md, so these numbers are its baseline. 0.2.0 had no scorecard to compare against. Area counts are done / partial / missing.

    Area Done Partial Missing Measured Performance 3 22 12 46 scenarios: 3 within budget, 22 over budget or failing, 13 tracked only, 4 not run, 8 not yet measurable (baseline 2026-10-05) File compatibility 1 8 18 io corpus oracle ≥ 146/170, round trip ≥ 169/170; psd-tools oracle ≥ 229/309, round trip ≥ 307/309; Photoshop-authored oracles ≥ 130/256, round trip 258/258 Tools 3 14 13 Workspace and UI 0 4 19 settings that do nothing: 60 of 133 (target 0) Type 0 3 6 Automation 1 3 7 626 of 626 menu items live Reliability 3 1 3 never-crash lints on 26 of 26 crates; panic_hunt fuzzes every command Distribution 4 3 4 Open bugs 0 3 29

    What's Changed

    • perf(compose): avoid unnecessary backdrop snapshots by @MikeeI in #109
    • perf(compose): prepare gradient stops outside pixel loops by @MikeeI in #103
    • Fix stale effect maps after default-only mask changes by @MikeeI in #105
    • Preserve HDR samples when importing white-matted PSD composites by @MikeeI in #106
    • Mix pass-through group coverage in premultiplied space by @MikeeI in #108
    • perf(compose): avoid redundant effect-halo rendering by @MikeeI in #110
    • Preserve merged PSD alpha at the exported sample precision by @MikeeI in #111
    • perf(compose): reuse compiled vector masks within each render by @MikeeI in #112
    • perf(compose): reuse bounded pattern preparation across render tiles by @MikeeI in #104
    • fix(ui): pasting an image copied in another app never ran by @tiredIsa in #102
    • fix(ui): make Move transform controls interactive by @Ni-zav in #99
    • Menu overlap and overflow #92 by @Ni-zav in #98
    • PR #96 — Liquify undo by @Ni-zav in #97
    • fix(ui): shape tools show the shape while dragging by @sommerper in #87
    • security: bound automation previews and reply resources by @Gh0stlyKn1ght in #93
    • Japanese support: IME input in the Type tool and CJK glyphs in the UI by @kntrttm in #101
    • Community batch follow-ups: on-demand OS clipboard paste; fmt + egui 0.36 test port by @echelon in #134
    • perf(ui): borrow the active layer from its document snapshot by @MikeeI in #121
    • perf(ui): reuse exact cached content bounds by @MikeeI in #116
    • perf(ui): skip offscreen layer thumbnail generation by @MikeeI in #117
    • perf(ui): retain channel thumbnails across view-only revisions by @MikeeI in #120
    • fix(ui): prune thumbnails for removed layers and documents by @MikeeI in #119
    • fix(ui): prune closed-document display and preview resources by @MikeeI in #118
    • Disambiguate colliding document identities at session admission by @MikeeI in #114
    • Warn when the PSD channel limit drops a Quick Mask by @MikeeI in #115
    • Preserve compositing properties in single-layer flat export by @MikeeI in #122
    • Preserve selected real masks during PSD import by @MikeeI in #130
    • Scale artboard bounds in proxy documents by @MikeeI in #131
    • Crop tool: move and resize the crop frame, Space repositions while drawing by @echelon in #132
    • Fix flaky canvas_geom undo test (process-wide text gamma raced by another test) by @echelon in #135
    • Dock: fixed-height panel groups, splitters, collapse, reorder; panels never vanish by @echelon in #139
    • Brush Settings panel: Photoshop structure and depth, edits through tools.setBrush by @echelon in #136
    • Selecting current bit depth must preserve redo by @MikeeI in #133
    • Detect PhotoCraft archives independent of ZIP entry order by @MikeeI in #137
    • Type tool: caret/selection land on the glyph under the pointer; font size is live, one undo step, ~60x faster (#123, #124) by @echelon in #142
    • Layers groups expand/collapse (#126); every displayed shortcut fires (#127) by @echelon in #141
    • Layers rows: names never run under the indicators; fx triangle; Collapse All Groups; designer PSD for QA by @echelon in #167
    • fix(geom): saturate Rect::translate and inflate on i32 overflow by @kevin9327 in #159
    • fix(ui): make tall menus scrollable on short displays by @Ni-zav in #160
    • PSD type layers: bounds regression tests; #148 is the layer's vector mask, not text bounds by @echelon in #165
    • Flatpak single-file bundles as release artifacts by @echelon in #163
    • Roadmap: honest parity assessment (2026-10-05) by @echelon in #182
    • AGENTS.md: no Tauri, Electron or webview shells by @echelon in #184
    • Menus scroll and navigate by keyboard on small displays; Color Range dialog on the no-GPU path (#145, #138) by @echelon in #168
    • Docs: where we stand and where we're going (roadmap, README, AGENTS.md) by @echelon in #186
    • Brushes: Tilt Scale, Brush Projection, Spacing checkbox, section locks, Mixer Wetness/Mix; Brushes grid + drag and drop; options bar through tools.setBrush by @echelon in #174
    • fix(ui): refresh Liquify preview after undo by @Ni-zav in #175
    • fix(ui): sample eyedropper colours while dragging by @Ni-zav in #176
    • fix(ui): keep Curves endpoint handles inside the graph area by @Ni-zav in #177
    • fix(ui): avoid duplicate sliders for wide filter ranges by @Ni-zav in #179
    • Dock polish: Layers gets the height, Character/Paragraph group, eliding tab strips, reveal the active layer (#147, #150, #151, #152) by @echelon in #181
    • Move/Free Transform modifier keys (#90); sharp full-resolution transform preview (#91) by @echelon in #183
    • CJK UI font fallback: Simplified/Traditional Chinese and Korean, lazily loaded in locale order (#149) by @echelon in #185
    • Layers mask thumbnails + chains; Channels/Paths temporary rows and footers (#153, #154) by @echelon in #191
    • GPU compositor: paged residents and effect maps, so 20k+ documents refresh on the GPU (#49) by @echelon in #187
    • Properties: uniform sections, per-kind Quick Actions, full-width controls (#155) by @echelon in #192
    • PSD corpus: psd-tools set (pinned, verified), an oracle for every file, and the fixes it found by @echelon in #195
    • Tool feedback: selection-mode cursor badges, scrubby zoom, contrasting outlines, Shift lines by @echelon in #188
    • PSD fidelity: 16/32-bit colour modes, Lab, Levels, Exposure, Dissolve oracle (corpus 133 → 140, psd-tools 212 → 222) by @echelon in #202
    • Fix tests on FreeBSD with RADV by @mekanix in #194
    • fix(clipboard): use the wayland clipboard for images by @nuIIpointerexception in #222
    • FreeBSD: build and test the workspace in a FreeBSD VM by @echelon in #223
    • Fix automatic UI scaling on 4K monitors by @john8675309 in #225
    • FreeBSD: serialise canvas GPU tests, CI template, RAM detection, CJK font paths by @echelon in #227
    • Title bar: never draw the window title over the menus or controls by @echelon in #241
    • Packaging: Linux runtime deps + start-up library check (#201); wasm 26.3 -> 18.8 MiB (#198) by @echelon in #237
    • Fix live brush preview drawing a polygon (#189) by @echelon in #240
    • PSD effects fidelity: spread metric, emboss, gradient geometry, text gamma (113 -> 118 oracle passes) by @echelon in #224
    • Scorecard: cargo xtask perf + scorecard, budgets, checklists, nightly perf (#221) by @echelon in #239
    • Layout documents: fix GPU device loss, live Move tool, local damage, no per-frame work (#125, #128) by @echelon in #226
    • PSD export: write tagged blocks other readers can parse (#200) by @echelon in #236
    • CR2: measure the colour filter row phase instead of assuming RGGB (#193) by @echelon in #244
    • Atomic saves: one crash-safe atomic_write for every document write by @echelon in #230
    • Preferences: wire tooltips, Home screen, recent files; hide what nothing reads by @echelon in #245
    • Eraser on locked layers: no lock-out from the simple lock button; Stroke Path erases to the background colour (#76) by @echelon in #229
    • Retouch tools paint the mask/channel target; Sample All Layers for Blur/Sharpen/Smudge; premultiplied Smudge (#207) by @echelon in #234
    • Free Transform: selection moves only its part of a linked mask; masked preview; target masks and channels (#205) by @echelon in #242
    • Vertical type (tategaki): lay out, render, edit and round-trip (#199) by @echelon in #246
    • PSD stroke effects: outlines of filled shapes, vector stroke above interior effects, joined subpaths by @echelon in #233
    • Live gradients: Gradient tool makes editable Gradient Fill layers (on-canvas handles, stops, midpoints) + Classic mode (#180) by @echelon in #197
    • Marquee: Shift squares, Alt draws from the centre, live W × H readout (#208) by @echelon in #247
    • GPU: crash-safe startup and device-loss fallback (#243, #4) by @echelon in #252
    • Text: deterministic font family order; hide private system families (fixes a flaky test) by @echelon in #264
    • Photoshop oracles via storytold/photocraft-corpus: pinned corpora, corpus feature, test-corpus, CI job by @echelon in #190
    • Masks: Alt-click to view mask, Cmd-click vector mask to select, vector-mask target brackets (#196) by @echelon in #256
    • Stylus pressure, tilt, rotation and eraser on macOS and X11 by @echelon in #255
    • Fix Windows MSI advertised shortcut icons by @CQMHV in #238
    • Windows taskbar icon: .exe icon id for the MSI shortcut + icon regression tests (#248) by @echelon in #269
    • Colours: handle non-hex Unicode values without an internal error by @storybored379 in #261
    • Align the CJK fallback font's baseline with Latin text by @kntrttm in #260
    • UI: platform shortcut notation in every label and tooltip (#251) by @tiredIsa in #262
    • New Document: a typed Width/Height reaches Create (#254) by @echelon in #270
    • Menus are as tall as their items; scroll only when the window is too short (#235) by @echelon in #272
    • Portable mode: keep settings beside the exe in the Windows portable zip (#228) by @echelon in #267
    • Brush Settings for every brush: options-bar toggle and real preset picker (#258) by @echelon in #268
    • Ctrl+Alt-drag resizes the brush on the canvas (#231) by @echelon in #271
    • Shift rubber band: preview the straight line before the click (#257) by @echelon in #273
    • Selection drag previews: regression tests for #253 (visible mid-drag, 1x and 2x) by @echelon in #274
    • Shortcuts: rebindable fill keys, D/X and held temporary tools (#249) by @echelon in #275
    • PSD manual and optical kerning: import, export, render, edit (#206) by @echelon in #259
    • Localise the UI: i18n foundation and a Japanese catalog (menus, dialogs, panels) by @kntrttm in #169
    • Pencil tool, Edit › Fill… dialog and "Rasterize?" prompt (#213) by @echelon in #279
    • Fast Select › Modify › Smooth and Feather (part of #211) by @echelon in #280
    • Compositor: effect maps never block inside parallel tiles (fixes #276 deadlock) by @echelon in #281
    • FreeBSD release tarball and README platform lines by @echelon in #284
    • fix: forward document index in bridge inspection by @kuishou68 in #287
    • Marquee: stop the selection at the canvas edge by @Multipad-cyber in #263
    • Background layer: double-click, masks and cut behave like Photoshop by @Multipad-cyber in #266
    • i18n: add Simplified Chinese localization by @CQMHV in #282
    • Enable dictionary segmentation for Japanese type by @midasdf in #250
    • Smart Objects and Smart Filters survive PSD save and open by @echelon in #288
    • Apply EXIF orientation on open, write Orientation = 1 on export (#285) by @echelon in #318
    • PSD export: 32-bit files open in Photoshop (HDR toning Color Mode Data, #291) by @echelon in #327
    • Windows on ARM64: release builds, PE header check, install test on ARM64 hardware by @echelon in #333
    • Fix preference usage scanning on CRLF checkouts by @CQMHV in #331
    • Windows: Alt-click clone hint and Ctrl+N channel errors (#251 follow-up) by @bommerts in #336
    • Move tool: Auto-Select on by default; a click picks and drags the layer under the pointer (#296) by @echelon in #330
    • Cmd+Enter (Ctrl+Enter) loads the path as a selection (#306) by @echelon in #329
    • Layers panel: rename commits on click elsewhere, Enter or Tab; one at a time (#314) by @echelon in #326
    • Keyboard Shortcuts: Ctrl+F records as Ctrl+F, not Ctrl+ControlLeft (#292) by @echelon in #323
    • macOS CLI: verify the shipped CLI is Developer ID signed and notarized in the release workflow (#308) by @echelon in #320
    • fix(ui): feed every pointer move per frame so fast strokes stay smooth by @leonaci in #317
    • Fix logic Show the clone crosshair only while Option is held by @juansebsol in #301
    • i18n: add Traditional Chinese (zh-hant) UI catalog by @WildfootW in #302
    • Add a Spanish catalog (menus, dialogs, panels) by @Mawfyy in #299
    • Localise the UI into Russian: a complete catalog and the missed tl! call sites by @tiredIsa in #298
    • Preferences: add an Apply button by @CQMHV in #325
    • i18n: add Czech (cs) UI translation by @petrleocompel in #328
    • Menus: no menu or submenu covers the menu bar (#319) by @echelon in #337
    • Menus stay above the taskbar; oversized windows open maximized (#315) by @echelon in #343
    • Background jobs: engine job API, progress and cancel (part of #210) by @echelon in #289
    • Background jobs in the app: progress, Cancel, open-as-job (part of #210) by @echelon in #373
    • Harden EXIF orientation: limits after rotation, fallible allocation, strict IFD parsing by @echelon in #345
    • Fonts: use craft-fonts as an optional build input; move the Japanese fonts out by @echelon in #353
    • Stamp Visible (Cmd+Alt+Shift+E) and Stamp Down; Alt+Merge keeps the originals (#217) by @echelon in #356
    • Right-click on the canvas lists the layers under the pointer (#307) by @echelon in #360
    • Canvas scrollbars, and Preferences > Tools > Overscroll works (#300) by @echelon in #367
    • Alt+right-drag resizes the brush and changes its hardness (#297) by @echelon in #370
    • Alt+scroll zooms the canvas in 5% steps around the pointer (#293) by @echelon in #371
    • ui.set: reject unknown fields; the theme error names all five themes (#412, #413) by @bflatastic in #437
    • serve: methods lists jobs.list and jobs.cancel (#414) by @bflatastic in #438
    • MCP command_batch and serve batch honour each step's wait (#415) by @bflatastic in #439
    • Headless saves without path never flatten over the opened file (#416) by @bflatastic in #447
    • Alt-click with the Brush, Pencil, Gradient or Paint Bucket samples a colour (#417) by @bflatastic in #450
    • Layers panel: double-click beside a layer's name opens Layer Style (#350) by @bflatastic in #452
    • Batch runs report inputs that share an output name instead of overwriting (#420, #422) by @bflatastic in #448
    • New from Clipboard, and Paste with nothing open makes a document (#368) by @bflatastic in #458
    • CLI: unknown flags are usage errors, <subcommand> --help prints usage, usage lists --quality (#421, #423) by @bflatastic in #460
    • Liquify remembers its brush settings between uses and launches (#418) by @bflatastic in #461
    • The main window opens centred on the screen (#419) by @bflatastic in #462
    • Keyboard layer navigation: Alt+[ / Alt+] / Alt+, / Alt+. and Shift to add (part of #352) by @bflatastic in #470
    • Transform Again on a Copy (Cmd+Alt+Shift+T): step and repeat (part of #352) by @bflatastic in #474
    • Number keys set opacity, Shift+[ / Shift+] step hardness, Shift+Cmd+A opens Camera Raw (part of #352) by @bflatastic in #473
    • Export: TGA in Save As and Export As (#363) by @Pedroj-64 in #377
    • Docs and MCP schema: use the real Gaussian Blur id (#378) by @floflo777 in #390
    • Image Size shows the one-pixel minimum it applies (#441) by @HEOJUNFO in #468
    • prefs.reset resets a single colorSettings key (#445) by @HEOJUNFO in #467
    • Content-Aware Scale: enlarging a 1 px wide or tall layer no longer panics by @Ar-maan05 in #387
    • Build desktop app by default (#392) by @agorevski in #425
    • fix(engine): use wasm-safe timing for Liquify by @naumanAhmed3 in #393
    • Profile mismatch: compare profiles by colour, not bytes (sRGB vs sRGB prompt) by @ljkx in #394
    • Type: dragging a paragraph box handle resizes the box (#351) by @Pedroj-64 in #376
    • docs: correct VectorCraft sibling name by @agorevski in #429
    • Free Transform a Copy (Cmd+Alt+T); Esc takes the copy back (part of #352) by @bflatastic in #482
    • Raise rust-version to 1.95, the minimum egui 0.36 needs by @carterwsmith in #471
    • docs: add star history chart to README by @coygeek in #469
    • Move drag reveals a larger-than-canvas layer's off-canvas pixels by @sommerper in #526
    • Spanish: add missing tool, filter and path translations by @neversaynv3r in #488
    • Dialogs keep their top-left when their content resizes by @sommerper in #487
    • PSD export selects PSB above size limit (#212) by @agorevski in #431
    • 32-bit documents: Exposure works on the stored linear values by @floflo777 in #400
    • Ctrl+Insert copies and Shift+Insert pastes on Linux; Shift+Insert pastes images on Windows by @sommerper in #531
    • Docs: roadmap, scorecard and README after the 2026-10-07 fixes by @bflatastic in #538
    • CLI batch: recorded-action steps, --format .ext, strict --quality, refuse --out = --in (#489, #490, #491, #492) by @bflatastic in #545
    • Gradients honour explicit transparency stops; smart filter commands accept an explicit layer target (#465, #466) by @bflatastic in #544
    • Recovered documents keep their recovery data until saved or closed (#444) by @bflatastic in #549
    • History: tool and preset names, Frame from Layers as one step, undo/redo restore the targeted layers (#513, #528, #446, #496, #495) by @bflatastic in #551
    • Shortcuts run in the order pressed; Shift+Delete fills on Windows; colour pickers stay put while dragging (#440, #530, #534) by @bflatastic in #552
    • Control channel: menu/dialog requests wait for their job; right-click menus at the point; MCP ui_pointer button (#510, #511, #512, #514) by @bflatastic in #548
    • Automation: non-object params rejected; headless sees finished jobs; serve stdio survives a bad line; MCP batch keeps results (#503, #504, #505, #506, #529) by @bflatastic in #546
    • Formats: deep .pcraft groups reopen; zero-size PSD rejected; JPEG mattes over white; no-ICC formats get sRGB (#517, #519, #521, #522) by @bflatastic in #555
    • Preferences merge with other tabs/windows and retry failed saves; web startup shows a Reload hint (#475, #476, #477) by @bflatastic in #561
    • FreeBSD CI: run the GPU integration tests one at a time by @bflatastic in #576
    • Import warns when it keeps only the first frame or page, or a JPEG ends early (#518, #523) by @bflatastic in #563
    • Linux: AppImage update information and a .zsync beside it (#349) by @ianswope in #399
    • Color Picker and Color panel fields accept typed values by @carterwsmith in #485
    • Release 0.3.0 by @bflatastic in #577

    New Contributors

    • @MikeeI made their first contribution in #109
    • @tiredIsa made their first contribution in #102
    • @Ni-zav made their first contribution in #99
    • @kntrttm made their first contribution in #101
    • @kevin9327 made their first contribution in #159
    • @mekanix made their first contribution in #194
    • @nuIIpointerexception made their first contribution in #222
    • @john8675309 made their first contribution in #225
    • @CQMHV made their first contribution in #238
    • @kuishou68 made their first contribution in #287
    • @midasdf made their first contribution in #250
    • @bommerts made their first contribution in #336
    • @leonaci made their first contribution in #317
    • @juansebsol made their first contribution in #301
    • @WildfootW made their first contribution in #302
    • @Mawfyy made their first contribution in #299
    • @petrleocompel made their first contribution in #328
    • @bflatastic made their first contribution in #437
    • @Pedroj-64 made their first contribution in #377
    • @floflo777 made their first contribution in #390
    • @HEOJUNFO made their first contribution in #468
    • @Ar-maan05 made their first contribution in #387
    • @naumanAhmed3 made their first contribution in #393
    • @ljkx made their first contribution in #394
    • @carterwsmith made their first contribution in #471
    • @coygeek made their first contribution in #469
    • @neversaynv3r made their first contribution in #488
    • @ianswope made their first contribution in #399

    Full Changelog: v0.2.0...v0.3.0

    Original source
  • Similar to photocraft with recent updates:

  • Oct 5, 2026
    • Date parsed from source:
      Oct 5, 2026
    • First seen by Releasebot:
      Oct 13, 2026
    storytold logo

    photocraft by storytold

    PhotoCraft v0.2.0

    photocraft releases a major image-editing update with expanded camera RAW support, color-managed editing, adjustment and eraser tools, Photoshop brush imports, and sandboxed plug-ins. It also strengthens automation security and improves stability for large images and core workflows.

    Upgrade notes

    Automation (MCP / control channel) now needs explicit file roots. File access from automation clients is limited to folders you grant with --automation-read-root <dir> / --automation-write-root <dir> (or PHOTOCRAFT_AUTOMATION_READ_ROOT / PHOTOCRAFT_AUTOMATION_WRITE_ROOT), and paths must be relative to them. Without roots, automation file operations fail closed. The desktop control channel also requires the per-launch token printed at startup. Interactive file dialogs and one-shot CLI commands are unaffected.

    Camera RAW: DNG, Canon CR2, Sony ARW (lossless and compressed), Panasonic RW2 and uncompressed Olympus ORF now decode. Nikon's compressed NEF and other formats still open their embedded full-size preview for now.

    What's Changed

    • Indexed Color: no panic when forced colours fill the palette by @storybored379 in #17
    • MCP: a panicking command no longer wedges the headless session by @storybored379 in #16
    • Layers: Add Layer Mask uses the active selection by @Multipad-cyber in #11
    • feat(ui): add Exit to the File menu by @torstfugl in #10
    • fix(ui): give menu bar labels more breathing room by @torstfugl in #8
    • Eraser on Background layer paints the background colour (fixes #15) by @echelon in #19
    • Open links in the system browser via a platform service (fixes #14) by @echelon in #20
    • Test: Image Rotation rotates every layer (re #1) by @echelon in #21
    • GPU: Rgba16Float fallback when Rgba32Float isn't renderable (fixes #7) by @echelon in #22
    • Add File > Open Recent (fixes #5) by @echelon in #23
    • Licensing: MIT OR Apache-2.0 files, NOTICE, ArtCraft brand terms, attribution by @echelon in #32
    • cms tests: system_profiles skips malformed named-colour profiles by @storybored379 in #24
    • Codecs: camera raw files fail with a clear "not supported" error by @storybored379 in #25
    • Filter › Other › Minimum / Maximum: Preserve Roundness by @storybored379 in #27
    • Layer Style › Blending Options › Blend If (render, PSD round trip, command) by @storybored379 in #26
    • Dialogs can be moved by dragging the title bar by @sommerper in #29
    • Layer Style dialog previews effects live on the canvas by @sommerper in #30
    • Never crash: steering rules, clippy.toml, forbid unsafe by @echelon in #33
    • CI: green on all platforms (rustfmt config, clippy 1.99, FXC-safe adjust shader) by @echelon in #37
    • feat(ui): confirm before discarding unsaved changes by @torstfugl in #31
    • docs: add mdBook and security documentation foundation by @Gh0stlyKn1ght in #35
    • Never crash: psd, codecs, format, io are panic-free by @echelon in #34
    • Never crash: cms is panic-free by @echelon in #36
    • Never crash: text, color, doc, paint, geom, raster, compose, vector by @echelon in #39
    • Never crash: automation (MCP/RPC) and photocraft-cli are panic-free by @echelon in #38
    • Never crash: algo pyramids and ui-egui parity without expect by @echelon in #40
    • Never crash: the engine is panic-free by @echelon in #54
    • Never crash: the GPU compositor is panic-free by @echelon in #55
    • Never crash: algo is panic-free by @echelon in #56
    • Never crash: ui-egui is panic-free by @echelon in #57
    • Never crash: last-resort guard for commands and file import/export by @echelon in #58
    • Never crash: ops denies panicking shortcuts by @echelon in #59
    • security: authenticate control channels and bound transport resources by @Gh0stlyKn1ght in #61
    • PSD round trip: read/write Vibrance, Color Balance, B&W, Photo Filter, Channel Mixer; corpus floors by @echelon in #60
    • UI input: Ctrl+'+' zooms the canvas, dialogs don't cancel on outside click, menu hover-switch by @echelon in #62
    • macOS: open files from Finder/Open With/Dock; file path, recent, warnings and .pcraft fixes by @echelon in #63
    • Camera raw: clean-room pure-Rust decoder (DNG, CR2, TIFF/EP raws) with develop pipeline by @echelon in #65
    • Colour-managed canvas: document profile -> monitor (P3/Adobe RGB/ProPhoto/Gray/CMYK), linear EXR, embedded CMYK by @echelon in #66
    • Sandboxed WebAssembly plug-ins: photocraft-plugins (wasmi), plugin.* commands, Filter › Plug-ins by @echelon in #67
    • Image › Adjustments overhaul: full params, one editor per kind, live-preview dialogs, Curves point deletion by @echelon in #68
    • Magic Eraser and Background Eraser tools; canvas rotation/flip/size move vector geometry by @echelon in #70
    • Photoshop brushes: .abr import, stylus pressure/tilt, 36 grouped presets, .grd import by @echelon in #74
    • security: constrain automation file access to granted roots by @Gh0stlyKn1ght in #72
    • Large images: adapter texture limits, banded compositing/export, proxy thumbnails, history byte budget by @echelon in #71
    • fix(ui): brush and eraser show the real stroke while drawing by @sommerper in #64
    • Select › Color Range: the dialog, Select presets, eyedroppers, Localized Color Clusters, Invert by @storybored379 in #80
    • Persist brush presets (user + imported .abr) in a size-aware preset store by @echelon in #82
    • raw: Sony cRAW, Panasonic RW2 (RawFormat 5), uncompressed ORF + ORF previews; NEF blocked (clean-room) by @echelon in #83
    • GPU canvas: Rgba16Float display texture for 16/32-bit documents (#46) by @echelon in #84
    • Adjustment dialogs: GPU live preview through a clipped adjustment layer (#77) by @echelon in #85
    • Painting: right-click opens the brush picker (or erases), real Smoothing, eraser-on-Background tests by @echelon in #86
    • Release 0.2.0 by @echelon in #113

    New Contributors

    • @storybored379 made their first contribution in #17
    • @Multipad-cyber made their first contribution in #11
    • @torstfugl made their first contribution in #10
    • @echelon made their first contribution in #19
    • @sommerper made their first contribution in #29
    • @Gh0stlyKn1ght made their first contribution in #35

    Full Changelog: v0.1.1...v0.2.0

    Original source
  • Oct 3, 2026
    • Date parsed from source:
      Oct 3, 2026
    • First seen by Releasebot:
      Oct 13, 2026
    storytold logo

    photocraft by storytold

    PhotoCraft v0.1.1

    photocraft publishes its v0.1.1 changelog, marking a new release with no change details provided.

    Full Changelog: v0.1.0...v0.1.1

    Original source
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 13, 2026
    storytold logo

    photocraft by storytold

    PhotoCraft v0.1.1-rc.5

    photocraft publishes a changelog covering updates from v0.1.0 through release candidate 5.

    Full Changelog: v0.1.0...v0.1.1-rc.5

    Original source
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 13, 2026
    storytold logo

    photocraft by storytold

    PhotoCraft v0.1.1-rc.4

    photocraft releases v0.1.1-rc.4, with the full changelog available on GitHub.

    Full Changelog: https://github.com/storytold/photocraft/commits/v0.1.1-rc.4

    Original source
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 13, 2026
    storytold logo

    photocraft by storytold

    PhotoCraft v0.1.0

    photocraft provides the full changelog for version 0.1.0.

    Full Changelog: https://github.com/storytold/photocraft/commits/v0.1.0

    Original source

This is the end. You've seen all the release notes in this feed!

Releasebot

Curated by the Releasebot team

Releasebot is an aggregator of official product update announcements from hundreds of software vendors and thousands of sources.

Our editorial process involves the manual review and audit of release notes procured with the help of automated systems.