Skip to content
CAI
Software that uses CAICheck a score

storytold/photocraft

60.2

Adequate · 7 November 2026

702.9k

lines of production code

Rust

primary language

3

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Behavioural changes

1 commit (0 fixes) modifying (repo-wide)

A change to existing behaviour in (repo-wide) — 1 commit, 4 files: “Reuse large buffers so returning freed memory to the OS doesn't slow filters (\#10479) (\#10514)” (refs \#10479, \#10514). Also in this area: 4 commits (0 fixes) modifying crates/testkit.

crates/testkit · low confidence · unverified

1 commit (0 fixes) modifying crates/plugins/examples, crates/plugins/src, examples/plugins/invert-rs

A change to existing behaviour in crates/plugins/examples, crates/plugins/src, examples/plugins/invert-rs — 1 commit, 11 files: “Sandboxed WebAssembly plug-ins: photocraft-plugins (wasmi), plugin.\* commands, Filter › Plug-ins (\#67)” (refs \#67).

crates/plugins/examples, examples/plugins/invert-rs · medium confidence · unverified

1 commit (0 fixes) modifying crates/tablet

A change to existing behaviour in crates/tablet — 1 commit, 2 files: “Pen tablets: Xwayland for a pen on Wayland, macOS monitor after NSApp (\#639, \#759) (\#1070)” (refs \#639, \#759, \#1070). Also in this area: 2 commits (1 fix) modifying crates/tablet; 1 commit adding/updating tests in crates/tablet; 34 commits (8 fixes) modifying crates/engine.

crates/algo/benches, crates/tablet, scripts · low confidence · unverified

1 commit (0 fixes) modifying crates/ui-egui/src/input/blend\_keys, crates/ui-egui/src/input/spring\_tools

A change to existing behaviour in crates/ui-egui/src/input/blend\_keys, crates/ui-egui/src/input/spring\_tools — 1 commit, 2 files: “refactor(ui-egui): move input modules under input/”.

_crates/ui-egui/src/input/blend\_keys, crates/ui-egui/src/input/spring\tools · low confidence · unverified

15 commits (2 fixes) modifying crates/algo

A change to existing behaviour in crates/algo — 15 commits (2 fixs), 33 files: “fix(algo): mesh warps filter their source when shrinking, so thin lines don't alias (\#3672) (\#3678)”; “Vanishing Point: on-canvas plane editor with Create/Edit Plane, grid and paste (\#3122) (\#3133)”; “fix(liquify): dab spacing runs on along the whole stroke, so pointer speed no longer changes the warp (\#2606) (\#4047)”; and 12 more (refs \#3672, \#3678, \#3122, \#3133, \#2606, …). Also in this area: 1 commit (0 fixes) modifying crates/geom; 3 commits (2 fixes) fixing crates/geom; 1 commit (1 fix) fixing crates/geom; 2 commits (1 fix) modifying crates/geom.

crates/geom · medium confidence · unverified

15 commits (6 fixes) modifying crates/compose

A change to existing behaviour in crates/compose — 15 commits (6 fixs), 16 files: “PSD effects fidelity: spread metric, emboss, gradient geometry, text gamma (113 -\> 118 oracle passes) (\#224) (\#224)”; “Fix flaky canvas\_geom undo test: isolate the text-gamma test in its own binary (\#135)”; “PSD fidelity: 16/32-bit colour modes, Lab, Levels, Exposure, Dissolve oracle (corpus 133 → 140, psd-tools 212 → 222) (\#202) (\#202)”; and 12 more (refs \#224, \#135, \#202, \#105, \#195, …). Also in this area: 1 commit (0 fixes) modifying (repo-wide); 4 commits (1 fix) modifying crates/vector; 3 commits (2 fixes) fixing crates/vector; 1 commit (1 fix) fixing crates/vector.

crates/vector · medium confidence · unverified

15 commits (7 fixes) modifying crates/io/src

A change to existing behaviour in crates/io/src — 15 commits (7 fixs), 15 files: “PSD export: write tagged blocks other readers can parse (\#200) (\#236) (\#236)”; “Brushes: Tilt Scale, Brush Projection, Spacing checkbox, section locks, Mixer Wetness/Mix; Brushes grid + drag and drop; options bar through tools.setBrush (\#174)”; “PSD effects fidelity: spread metric, emboss, gradient geometry, text gamma (113 -\> 118 oracle passes) (\#224) (\#224)”; and 12 more (refs \#200, \#236, \#174, \#224, \#137, …). Also in this area: 1 commit (1 fix) fixing crates/io/src/abr\_map; 13 commits (1 fix) modifying crates/io/src; 9 commits (5 fixes) fixing crates/io; 1 commit (0 fixes) modifying crates/io/src/abr\_map.

(repo-wide) · low confidence · unverified

15 commits (7 fixes) modifying crates/io/src

A change to existing behaviour in crates/io/src — 15 commits (7 fixs), 15 files: “PSD export: write tagged blocks other readers can parse (\#200) (\#236) (\#236)”; “Brushes: Tilt Scale, Brush Projection, Spacing checkbox, section locks, Mixer Wetness/Mix; Brushes grid + drag and drop; options bar through tools.setBrush (\#174)”; “PSD effects fidelity: spread metric, emboss, gradient geometry, text gamma (113 -\> 118 oracle passes) (\#224) (\#224)”; and 12 more (refs \#200, \#236, \#174, \#224, \#137, …). Also in this area: 3 commits (2 fixes) fixing crates/io/examples; 1 commit (0 fixes) modifying crates/io/examples; 13 commits (1 fix) modifying crates/io/src.

crates/engine/examples, crates/io/examples · low confidence · unverified

2 commits (0 fixes) modifying crates/engine/src/filters/validation

A change to existing behaviour in crates/engine/src/filters/validation — 2 commits, 1 file: “refactor(engine): move filters/validation.rs tests to filters/validation/tests.rs”; “refactor(engine): move the error, document state and Session impl out of lib.rs”.

crates/engine/src/filters/validation · medium confidence · unverified

206 commits (19 fixes) modifying (repo-wide)

A change to existing behaviour in (repo-wide) — 206 commits (19 fixs), 16 files: “Tools: Perspective Crop (\#1043) (\#2864)”; “Type Color Picker opens the full Color Picker; screen eyedropper with a pixel loupe (\#1232)”; “CI: workflows only call craft-common-actions at @main (\#10228)”; and 200 more (refs \#1043, \#2864, \#1232, \#10228, \#1045, …).

(repo-wide) · low confidence · unverified

3 commits (0 fixes) modifying apps/photocraft-cli

A change to existing behaviour in apps/photocraft-cli — 3 commits, 3 files: “CLI batch: skip shell-only Save and view steps inside played action sets (\#6860)”; “docs(cli): write product name as PhotoCraft in USAGE and description (\#5449)”; “Windows: start without Windows.Data.Pdf.dll; delay-load it for printing (\#5884)” (refs \#6860, \#5449, \#5884).

apps/photocraft · medium confidence · unverified

3 commits (0 fixes) modifying crates/cms

A change to existing behaviour in crates/cms — 3 commits, 8 files: “HEIF: read the nclx colour description; HLG/PQ HEICs open as linear BT.2020 32-bit (\#6752)”; “Color Lookup: PSD save keeps a .3dl/.look LUT file as loaded (\#6544)”; “docs: write product name as PhotoCraft in crate module docs (\#5455)” (refs \#6752, \#6544, \#5455). Also in this area: 1 commit (1 fix) fixing crates/heif; 7 commits (1 fix) modifying crates/codecs.

crates/heif · medium confidence · unverified

6 commits (0 fixes) modifying crates/codecs

A change to existing behaviour in crates/codecs — 6 commits, 47 files: “Clippy 1.99: chunks\_exact with a constant size -\> as\_chunks; drop a no-op Option filter”; “Camera raw: clean-room pure-Rust decoder (DNG, CR2, TIFF/EP raws) with develop pipeline (\#65)”; “Never crash: psd, codecs, format, io are panic-free (Rule 9) (\#34)”; and 3 more (refs \#65, \#34, \#25, \#71). Also in this area: 9 commits (1 fix) modifying crates/raw.

crates/raw/examples, crates/raw/fuzz · medium confidence · unverified

6 commits (0 fixes) modifying crates/ui-egui/src/panels/actions

A change to existing behaviour in crates/ui-egui/src/panels/actions — 6 commits, 1 file: “Actions: Check Spelling opened again keeps the waiting action's continuation”; “Actions: Check Spelling records and saves as the spellCheck event”; “Integration: the SVG clipboard service doc says ordinary paste reads it too; the bulk-load test checks the sets that stay loaded (\#10704, \#10601)”; and 3 more (refs \#10704, \#10601). Also in this area: 16 commits (1 fix) modifying crates/ui-egui/src.

crates/ui-egui/src/panels · medium confidence · unverified

6 commits (2 fixes) modifying assets/app-icon

A change to existing behaviour in assets/app-icon — 6 commits (2 fixs), 16 files: “app icon: nine-tailed kitsune (owner's ArtCraft drawing), Dock/taskbar/launcher wiring, palette docs”; “Release pipeline id renames and PhotoCraft branding”; “Windows taskbar icon: .exe icon id for the MSI shortcut + icon regression tests (\#248) (\#269) (\#269)”; and 3 more (refs \#248, \#269, \#4478).

assets/app-icon · medium confidence · unverified

7 commits (1 fix) modifying crates/algo

A change to existing behaviour in crates/algo — 7 commits (1 fix), 9 files: “Color Range presets: weigh dark colours like Photoshop (\#5243) (\#5293)”; “Free Transform: solid pixel stretch (edge-repeat sampling, selected-pixel bounds) (\#3867)”; “Fibers: fill an empty layer, as Photoshop does (\#5241) (\#5289)”; and 4 more (refs \#5243, \#5293, \#3867, \#5241, \#5289, …). Also in this area: 1 commit (0 fixes) modifying crates/color, crates/io/src/ora; 8 commits (0 fixes) modifying crates/compose; 1 commit (1 fix) fixing crates/color.

crates/color · low confidence · unverified

87 commits (24 fixes) modifying crates/engine

A change to existing behaviour in crates/engine — 87 commits (24 fixs), 82 files: “test(raw): a developed raw takes the Raw Defaults resolution on every open path; other files keep theirs (\#7789)”; “Fix up the merges of \#3535, \#3567 and \#6088: one catalog line per string, purge test as in \#3567”; “Layers: per-layer XMP metadata, as Photoshop's layer.xmpMetadata”; and 84 more (refs \#7789, \#3535, \#3567, \#6088, \#8302, …). Also in this area: 1 commit (0 fixes) modifying crates/doc, crates/ops; 1 commit (1 fix) fixing crates/doc; 5 commits (1 fix) modifying crates/doc.

crates/affinity/src, crates/doc, crates/paint · medium confidence · unverified

9 commits (1 fix) modifying crates/codecs/src

A change to existing behaviour in crates/codecs/src — 9 commits (1 fix), 7 files: “Codecs: refuse implausible PNG/WebP headers before allocating (\#3691) (\#3706)”; “feat(codecs): support full X11 rgb.txt color names in XPM (\#4263)”; “feat(save): File › Save keeps a JPEG's quality and a WebP's lossy/lossless encoding (\#2399) (\#4032)”; and 6 more (refs \#3691, \#3706, \#4263, \#2399, \#4032, …). Also in this area: 7 commits (2 fixes) modifying crates/codecs/src; 4 commits (3 fixes) fixing crates/codecs; 1 commit (0 fixes) modifying crates/codecs, crates/color, crates/testkit.

(repo-wide) · low confidence · unverified

Fixes

3 commits (3 fixes) fixing crates/gpu

A fix in crates/gpu — 3 commits (3 fixs), 6 files: “Fix-up for \#9182: build jobs carry their vertex entry point, and the test rules out a shared vs”; “fix(gpu): saturate effect band edges at the coordinate ceiling (\#11057)”; “Fix-up for \#9979, \#9182 and \#10837: review findings on the batch” (refs \#9182, \#11057, \#9979, \#10837). Also in this area: 11 commits (2 fixes) modifying crates/gpu.

crates/gpu/src/fx · medium confidence · unverified

Test coverage

1 commit adding/updating tests in apps/photocraft/tests; 1 commit adding/updating tests in apps/photocraft/tests/fixtures; 1 commit adding/updating tests in crates/io/tests; 12 commits adding/updating tests in crates/engine/tests; 2 commits adding/updating tests in crates/affinity/tests, crates/cms/tests.

Written by cca.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Baseline

  • First survey — no prior run to compare against. CAI 60.

Lenses

  • Code Health 87
  • Architecture 95
  • Maturity 70
  • Readiness 72
  • Security 65
  • Accessibility 48
  • Performance 91

Changes since last survey

  • 300 commits — 237 feature/other, 63 fixes

By area

  • (repo) — 116 commits
  • crates/ui-egui — 85 commits
  • crates/engine — 60 commits
  • apps/photocraft-cli — 6 commits
  • crates/algo — 5 commits
  • crates/io — 5 commits
  • crates/automation — 4 commits
  • crates/codecs — 4 commits
  • crates/compose — 3 commits
  • crates/paint — 3 commits
  • .github/workflows — 2 commits
  • crates/raster — 2 commits
  • (root) — 1 commit
  • docs/atn.md — 1 commit
  • docs/development.md — 1 commit
  • docs/parity-checklist.md — 1 commit
  • docs/scorecard.md — 1 commit

Notable commits

  • fix: Fix Paint Bucket target with Gradient-style crosshair (#7994)
  • fix: Fix content-aware crop targets and history labels
  • fix: Fix imported gradient presets sharing selection names (#10521)
  • fix: Fix-up #10360: only a click in the committing document waits for the commit
  • fix: Fix-up #10396: Esc in crop_beyond_canvas hides the frame
  • fix: Fix-up #10788 + #10612: build the merged batch
  • fix: Fix-up #10965 (review): a continuation resumes once; a layer target checks its receiver
  • fix: Fix-up #10986 with #10965: a play that changes nothing adds no history entry
  • fix: Fix-up #11011: choosing Selection makes a live crop; a picked ratio fits the canvas
  • fix: Fix-up #11077 (review): say that pixels past the canvas count for Empty
  • fix: Fix-up #11165, #11247: the press decides a pasteboard click; a small box's centre moves it
  • fix: Fix-up #11235 (review): a filter already on at the row's first draw deselects
  • fix: Fix-up #11243 (review): Free Transform a Copy of a targeted mask still copies
  • fix: Fix-up #11243: Free Transform a Copy of a linked layer makes no copy
  • fix: Fix-up #11243: a lone copy of a linked layer joins its link group
  • fix: Fix-up #9739: Reset under W x H x Resolution leaves nothing to reset
  • fix: Keep unsupported Shape Blur origin in preservation regression
  • fix: Merge PR #10360: fix(ui): a click during a background Free Transform commit runs when it lands (#9974)
  • fix: Merge fix-up: check entity markup in main's bounded embedded-SVG parse too
  • fix: Merge fix-up: the turned crop's hidden pixels after Layer 0 replaces the Background
  • …and 280 more

Written by cca.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

storytold/photocraft was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 7 November 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit b837027c417fa92fa3579e663eac20126e48d6d8 — the exact code this score is about.
  • Scored under rubric-2026.11.2 — the same rubric and the same method as every other entry in this index.
  • Measured by Canine Code Analyzer (cca.canine.dev) using cca measure-2026.11.3+preprod-5f8314471808.