github storytold/photocraft v0.10.0
PhotoCraft v0.10.0

5 hours ago

Scorecard since v0.9.0

From docs/scorecard.md (done / partial / missing):

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

What's Changed

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

New Contributors

Full Changelog: v0.9.0...v0.10.0

Don't miss a new photocraft release

NewReleases is sending notifications on new releases.