Skip to content
CAI
Software that uses CAICheck a score

storytold/pdfcraft

65.1

Adequate · 7 November 2026

325.5k

lines of production code

Rust

primary language

2

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, 150 files: “Rename PrintCraft to PdfCraft (\#174)” (refs \#174). Also in this area: 1 commit (1 fix) fixing crates/cos/examples; 3 commits (0 fixes) modifying crates/cos.

crates/cos/examples, crates/filters/tests · low confidence · unverified

1 commit (0 fixes) modifying apps/pdfcraft-cli

A change to existing behaviour in apps/pdfcraft-cli — 1 commit, 1 file: “CLI: pdfcraft-cli.exe carries a Windows version resource (\#598)” (refs \#598).

apps/pdfcraft-cli · medium confidence · unverified

1 commit (0 fixes) modifying crates/compare, crates/engine

A change to existing behaviour in crates/compare, crates/engine — 1 commit, 3 files: “Add Pages range field to Compare Files dialog (\#6336)” (refs \#6336). Also in this area: 15 commits (0 fixes) modifying crates/engine.

crates/compare · low confidence · unverified

1 commit (0 fixes) modifying crates/js/fuzz

A change to existing behaviour in crates/js/fuzz — 1 commit, 1 file: “Fuzz target for the JavaScript engine's script runner (\#6304)” (refs \#6304).

crates/js/fuzz · medium confidence · unverified

1 commit (0 fixes) modifying crates/oracle, crates/testkit

A change to existing behaviour in crates/oracle, crates/testkit — 1 commit, 3 files: “Never-crash gate on the oracle and testkit crates; oracle find() no longer panics on an empty needle (\#3435)” (refs \#3435).

crates/testkit · low confidence · unverified

1 commit (0 fixes) modifying crates/preflight/fuzz

A change to existing behaviour in crates/preflight/fuzz — 1 commit, 2 files: “Fuzz targets for PDF/A verify and convert (\#6308)” (refs \#6308).

crates/preflight/fuzz · medium confidence · unverified

1 commit (0 fixes) modifying crates/redact/fuzz

A change to existing behaviour in crates/redact/fuzz — 1 commit, 1 file: “Fuzz target for redaction apply (\#6305)” (refs \#6305).

crates/redact/fuzz · medium confidence · unverified

1 commit (0 fixes) modifying vendor/hayro-syntax

A change to existing behaviour in vendor/hayro-syntax — 1 commit, 49 files: “M2.6: vendor hayro-syntax 0.7.2 with a page-tree cycle guard (stack overflow on /Kids loops in object streams)”. Also in this area: 3 commits (1 fix) modifying vendor/hayro-syntax; 2 commits (2 fixes) fixing vendor/hayro-syntax/src/content; 3 commits (0 fixes) modifying vendor/hayro-interpret.

(repo-wide) · low confidence · unverified

10 commits (2 fixes) modifying crates/forms

A change to existing behaviour in crates/forms — 10 commits (2 fixs), 6 files: “M6.3/M6.6: Form formats, validation and calculation without a JavaScript engine: Acrobat's AF calls (AFNumber/AFPercent/AFDate/AFTime/AFSpecial format and keystroke, AFRange\_Validate, AFSimple\_Calculate, simplified field notation) recognised and run natively in Acrobat's event order (keystroke on commit, validate with Acrobat's messages, calculate in /CO order, format for display); Field Properties Format/Validate/Calculate tabs write the same scripts; form\_set\_props format/validate/calculate, form\_fields reports them”; “M6.1/M6.2: form filling: new fonts (L2) and forms (L3) crates; field tree with inheritance, widgets, options; set\_value with validation and regenerated appearances (auto-size, comb, multiline, password, quadding, /MK, combo, list selection), check/radio states (own AP when missing), reset to /DV; engine SetFieldValue/ResetForm with fill-forms permission; UI in-place editor (Enter/click-away commit, Escape, Tab with select-all), check/radio toggle, choice popup, Clear form; tools form\_fields/form\_fill/form\_reset. Perf: named destinations indexed once (190 MB manual opens in 1.8 s instead of 172 s); comment and form edits refresh view data from the object graph instead of a full re-inspection (6x faster per edit on large files; equivalence-tested). annot uses the shared fonts helpers. Docs, parity, roadmap”; “M6.6/M6.8: Field Properties Appearance tab (border/fill colour, thickness, solid/dashed/beveled/inset/underline, text colour, Helvetica/Times/Courier); tab order by rows/columns/structure (page /Tabs) honoured by Tab; push buttons run Reset form, Named (print, page navigation), URI, Go to and common one-line scripts (this.print, this.resetForm, app.alert, pageNum) without a JS engine; form\_tab\_order tool and appearance in form\_set\_props (67 tools)”; and 7 more. Also in this area: 1 commit (0 fixes) modifying crates/forms; 1 commit (1 fix) fixing crates/forms; 12 commits (1 fix) modifying crates/forms; 5 commits (3 fixes) fixing crates/forms.

(repo-wide) · low confidence · unverified

15 commits (0 fixes) modifying crates/engine

A change to existing behaviour in crates/engine — 15 commits, 28 files: “M6: Acrobat JavaScript: sandboxed boa engine with the forms object model (printcraft-js); custom keystroke/validate/calculate/format scripts, button scripts, document JavaScripts, JavaScript console (⌘J), Preferences ▸ Enable JavaScript; js\_run, js\_document\_scripts, js\_set\_document\_script, form\_set\_script, js\_enabled tools”; “M7: Format existing text: font family, bold/italic, size, colour and alignment for a paragraph (Format text panel live while editing; text\_edit formatting arguments); centred and right-aligned paragraphs are detected”; “M11: PDF/A (new preflight crate): verify PDF/A-2b/3b structural rules, Save as PDF/A (XMP identification, generated sRGB output intent, forbidden actions, annotation flags, interpolation, encryption), PDF/A dialog; pdfa\_verify, pdfa\_convert tools”; and 12 more. Also in this area: 1 commit (0 fixes) modifying crates/js, crates/xfa; 24 commits (1 fix) modifying crates/automation; 9 commits (7 fixes) fixing crates/js.

(repo-wide) · low confidence · unverified

16 commits (0 fixes) modifying crates/automation, crates/ui-egui/src

A change to existing behaviour in crates/automation, crates/ui-egui/src — 16 commits, 24 files: “M6: Acrobat JavaScript: sandboxed boa engine with the forms object model (printcraft-js); custom keystroke/validate/calculate/format scripts, button scripts, document JavaScripts, JavaScript console (⌘J), Preferences ▸ Enable JavaScript; js\_run, js\_document\_scripts, js\_set\_document\_script, form\_set\_script, js\_enabled tools”; “M7: Format existing text: font family, bold/italic, size, colour and alignment for a paragraph (Format text panel live while editing; text\_edit formatting arguments); centred and right-aligned paragraphs are detected”; “M11: PDF/A (new preflight crate): verify PDF/A-2b/3b structural rules, Save as PDF/A (XMP identification, generated sRGB output intent, forbidden actions, annotation flags, interpolation, encryption), PDF/A dialog; pdfa\_verify, pdfa\_convert tools”; and 13 more. Also in this area: 6 commits (1 fix) modifying crates/ui-egui/src/workflows; 12 commits (9 fixes) fixing crates/ui-egui/src/canvas.

crates/a11y, crates/ui-egui/src · low confidence · unverified

16 commits (0 fixes) modifying crates/automation, crates/ui-egui/src

A change to existing behaviour in crates/automation, crates/ui-egui/src — 16 commits, 24 files: “M6: Acrobat JavaScript: sandboxed boa engine with the forms object model (printcraft-js); custom keystroke/validate/calculate/format scripts, button scripts, document JavaScripts, JavaScript console (⌘J), Preferences ▸ Enable JavaScript; js\_run, js\_document\_scripts, js\_set\_document\_script, form\_set\_script, js\_enabled tools”; “M7: Format existing text: font family, bold/italic, size, colour and alignment for a paragraph (Format text panel live while editing; text\_edit formatting arguments); centred and right-aligned paragraphs are detected”; “M11: PDF/A (new preflight crate): verify PDF/A-2b/3b structural rules, Save as PDF/A (XMP identification, generated sRGB output intent, forbidden actions, annotation flags, interpolation, encryption), PDF/A dialog; pdfa\_verify, pdfa\_convert tools”; and 13 more. Also in this area: 8 commits (1 fix) modifying crates/automation; 1 commit (0 fixes) modifying crates/automation; 7 commits (4 fixes) fixing crates/automation.

crates/automation/src, crates/engine/src, crates/fonts/src/pdf · medium confidence · unverified

17 commits (1 fix) modifying crates/annot

A change to existing behaviour in crates/annot — 17 commits (1 fix), 11 files: “M5: Fill & Sign typed signatures and initials (Type or Draw; script-font outlines drawn as filled paths); fill\_sign\_add signature/initials”; “M5: Text boxes write rich text (/RC XHTML and /DS) in step with their text and style”; “M8: Redaction Properties: overlay text font (Helvetica, Times, Courier), size or auto-size, colour, alignment and repeat, written as /DA, /Q and /Repeat and drawn on apply; overlay fonts are added to the page only when used”; and 14 more. Also in this area: 1 commit (0 fixes) modifying crates/xfdf; 15 commits (0 fixes) modifying crates/engine; 8 commits (8 fixes) fixing crates/xfdf; 1 commit (1 fix) fixing crates/xfdf.

crates/xfdf/src · low confidence · unverified

197 commits (57 fixes) modifying vendor

A change to existing behaviour in vendor — 197 commits (57 fixs), 275 files: “M2: a DeviceN colour with twelve inks paints, and a colour that can't be evaluated no longer blanks the page (\#4260)”; “M2: a JBIG2 region located past i32::MAX is off the page”; “vendor/README.md: one Test cell in the hayro-jbig2 row”; and 194 more (refs \#4260, \#581, \#2946, \#3169, \#3170, …).

vendor · medium confidence · unverified

3 commits (0 fixes) modifying crates/cos

A change to existing behaviour in crates/cos — 3 commits, 15 files: “M1.9: full saves write object streams + xref stream (PNG Up predictor); encrypt-dict closure kept outside; reader authenticates before validating the catalog”; “M1.3: number parser cut a multi-byte token mid-character and panicked (found by fuzzing)”; “Session 4: M1.6 encryption (crypt crate R2-R6), M4 command registry, combine/extract/split, autosave + crash recovery, asset policy + xtask assets, README screenshots”. Also in this area: 1 commit (1 fix) fixing crates/crypt; 3 commits (1 fix) modifying crates/crypt; 1 commit (0 fixes) modifying (repo-wide).

crates/crypt/src · low confidence · unverified

3 commits (0 fixes) modifying vendor/hayro-interpret

A change to existing behaviour in vendor/hayro-interpret — 3 commits, 16 files: “M2, \#1060: axial and radial shadings draw as native gradients (backport of hayro 0.8) (\#1061)”; “Heavy pages: cull off-tile images, cache decodes, preview backdrops, calmer queues (\#1117)”; “M2: stream page content past the 256 MiB cap (item 1 of storytold/pdfcraft\#623) (\#797)” (refs \#1060, \#1061, \#1117, \#797). Also in this area: 1 commit (0 fixes) modifying vendor/hayro-syntax; 1 commit (1 fix) fixing crates/cos, vendor/hayro-syntax/src/object; 16 commits (1 fix) modifying vendor.

vendor/hayro-syntax/src/filter, vendor/hayro-syntax/src/object · low confidence · unverified

4 commits (1 fix) modifying crates/print

A change to existing behaviour in crates/print — 4 commits (1 fix), 5 files: “Security: print jobs, new digital IDs and the --control file no longer write through planted links (\#338)”; “M10.5: add cut-and-stack page order for single-sided printing (\#197)”; “fix: print: read lpstat untranslated so printers show on non-English macOS (\#101)”; and 1 more (refs \#338, \#197, \#101, \#296). Also in this area: 1 commit (0 fixes) modifying crates/print; 57 commits (7 fixes) modifying crates/engine; 3 commits (3 fixes) fixing crates/print; 1 commit (1 fix) fixing crates/print.

(repo-wide) · low confidence · unverified

5 commits (0 fixes) modifying assets/app-icon

A change to existing behaviour in assets/app-icon — 5 commits, 19 files: “app icon: lion (owner's ArtCraft drawing), Dock/taskbar/launcher wiring, palette docs”; “docs: tidy agent, contributor and asset docs”; “M14: give Windows PDF files a dedicated document icon (\#890)”; and 2 more (refs \#890, \#5245, \#174).

assets/app-icon · medium confidence · unverified

5 commits (0 fixes) modifying crates/annot

A change to existing behaviour in crates/annot — 5 commits, 9 files: “Comments without an appearance stream are drawn (display only, never saved) (\#371)”; “M5: ink strokes are drawn as smooth curves through their points (\#374)”; “Measure: add distance, perimeter and area tools (\#208)”; and 2 more (refs \#371, \#374, \#208, \#355, \#335). Also in this area: 13 commits (1 fix) modifying crates/ui-egui; 4 commits (4 fixes) fixing crates/measure; 1 commit (0 fixes) modifying crates/measure, crates/redact, crates/testkit.

crates/measure/src · medium confidence · unverified

5 commits (0 fixes) modifying crates/edit

A change to existing behaviour in crates/edit — 5 commits, 7 files: “M7: Format existing text: font family, bold/italic, size, colour and alignment for a paragraph (Format text panel live while editing; text\_edit formatting arguments); centred and right-aligned paragraphs are detected”; “M7: Edit text works on paragraphs: detection, in-place editing with rewrap to the box, original spacing, colour and font (or Helvetica); text\_paragraphs and text\_edit paragraph”; “M7: Edit text & images: select existing page images to move, resize, rotate, flip, replace, save or delete; page\_images, image\_edit, image\_save tools”; and 2 more. Also in this area: 1 commit (0 fixes) modifying crates/create; 1 commit (1 fix) fixing crates/create; 5 commits (1 fix) modifying crates/create; 6 commits (6 fixes) fixing crates/create.

crates/create/src, crates/model/src · low confidence · unverified

5 commits (0 fixes) modifying vendor/winit/src/platform\_impl/macos

A change to existing behaviour in vendor/winit/src/platform\_impl/macos — 5 commits, 3 files: “macOS: an unfinished composition doesn't come back in the next text field (winit\#4745) (\#677)”; “macOS: emoji from the emoji picker reach text fields (winit\#4749) (\#678)”; “macOS: the first Apple Korean key in a fresh PdfCraft composes (winit\#4744) (\#680)”; and 2 more (refs \#677, \#678, \#680, \#679, \#676). Also in this area: 2 commits (1 fix) modifying vendor/winit; 1 commit (0 fixes) modifying vendor/winit.

vendor/winit · medium confidence · unverified

6 commits (0 fixes) modifying apps/printcraft-cli

A change to existing behaviour in apps/printcraft-cli — 6 commits, 2 files: “Community links: Discord button in the title bar, ArtCraft community card on Home, About dialog with ArtCraft mark/wordmark and links, Help menu commands (help.discord/app\_page/github/website), CLI --version and MCP websiteUrl, README Community section; 4 Lucide icons (attributed); regenerated screenshots with honest brand attribution”; “Session 4: M1.6 encryption (crypt crate R2-R6), M4 command registry, combine/extract/split, autosave + crash recovery, asset policy + xtask assets, README screenshots”; “fuzzing”; and 3 more.

apps/printcraft · medium confidence · unverified

714 commits (72 fixes) modifying (repo-wide)

A change to existing behaviour in (repo-wide) — 714 commits (72 fixs), 17 files: “M9: validate a document timestamp that sits in a signature field (\#621)”; “Sync with main: the 80 new strings in all four new catalogs”; “M4: rename colliding form field names when combining (organize.field-name-conflicts) (\#1155)”; and 693 more (refs \#621, \#1155, \#567, \#1319, \#1305, …).

(repo-wide) · low confidence · unverified

9 commits (1 fix) modifying packaging/web

A change to existing behaviour in packaging/web — 9 commits (1 fix), 4 files: “pdfcraft-web: speak the host messages through craft-web-host”; “packaging/web: say that ?host=parent takes precedence over data-host="page"”; “Signed release pipeline (macOS/Windows/Linux/Web); README community note”; and 6 more (refs \#583, \#174, \#4731).

packaging/web · medium confidence · unverified

Fixes

1 commit (1 fix) fixing assets

A fix in assets — 1 commit (1 fix), 1 file: “fix(demo): showcase font-display, distinct link text, SVG accessible names (Sonar) (\#4402)” (refs \#4402). Also in this area: 1 commit (0 fixes) modifying (repo-wide); 3 commits (0 fixes) modifying assets.

_assets/demo, vendor/hayro-postscript, vendor/vello\cpu · low confidence · unverified

7 commits (6 fixes) fixing vendor/hayro

A fix in vendor/hayro — 7 commits (6 fixs), 2 files: “fix(render): images and nested groups knock out in a knockout group too (\#2971)”; “fix(render): a knockout clear follows a shading's /BBox and skips images that don't decode (\#2971)”; “fix(render): the one-cell tiling renderer starts outside any knockout group (\#2971)”; and 4 more (refs \#2971, \#2970, \#3349, \#3356). Also in this area: 11 commits (2 fixes) modifying vendor; 1 commit (0 fixes) modifying vendor, vendor/hayro, vendor/lopdf; 6 commits (1 fix) modifying vendor; 1 commit (1 fix) fixing vendor/hayro.

(repo-wide) · low confidence · unverified

Test coverage

1 commit adding/updating tests in apps/pdfcraft-cli; 1 commit adding/updating tests in crates/engine/tests; 1 commit adding/updating tests in crates/fonts/tests; 2 commits adding/updating tests in crates/cos/tests; 2 commits adding/updating tests in crates/organize/tests; 3 commits adding/updating tests in crates/preflight/tests; 60 commits adding/updating tests in crates/ui-egui/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 65.

Lenses

  • Code Health 83
  • Architecture 96
  • Maturity 70
  • Readiness 71
  • Security 55
  • Event Sourcing 72
  • Performance 100

Changes since last survey

  • 300 commits — 219 feature/other, 81 fixes

By area

  • (repo) — 90 commits
  • crates/ui-egui — 87 commits
  • crates/automation — 14 commits
  • (root) — 12 commits
  • crates/prc — 12 commits
  • crates/cos — 8 commits
  • crates/redact — 8 commits
  • crates/sign — 8 commits
  • crates/edit — 6 commits
  • crates/prc-render — 6 commits
  • vendor/hayro-jbig2 — 6 commits
  • crates/render — 5 commits
  • crates/annot — 4 commits
  • apps/pdfcraft-web — 3 commits
  • crates/filters — 3 commits
  • crates/preflight — 3 commits
  • crates/create — 2 commits
  • crates/engine — 2 commits
  • crates/forms — 2 commits
  • crates/js — 2 commits

Notable commits

  • fix: Feat/unify hotbar quick tools (Fixes #5890) (#5909)
  • fix: Fix Matrix::invert rejecting valid matrices with a small scale (#5703)
  • fix: M12: prc-render review fixes (missing tessellations, vertex ceiling, seams, perspective shade)
  • fix: M12: prc-render: scale-safe lengths, a render work ceiling, fit fixes
  • fix: M12: review fixes from the renderer PR's review of the reader
  • fix: M4: bookmark tree round-trips what real files hold; review fixes (#6018)
  • fix: Merge branch 'main' into fix/fill-sign-quick-bar-controls
  • fix: Merge branch 'storytold:main' into fix/panel-resize-scrollbar-5730
  • fix: Merge feat/prc-reader: the reader's review fixes
  • fix: Merge main into fix/format-text-fields-fit-pane
  • fix: Merge main into fix/jbig2-page-refinement-area
  • fix: Merge main into fix/quick-bar-centred-in-margin
  • fix: Merge main into fix/rail-page-zoom-fields
  • fix: Merge origin/main into fix/ocr-edit-under-scan
  • fix: Merge pull request #3858 from Kronbii/fix/scan-image-resampling
  • fix: Merge pull request #5250 from KenM76/fix/cleared-max-len-stays-cleared
  • fix: Merge pull request #5396 from KenM76/fix/ocr-edit-under-scan
  • fix: Merge pull request #5476 from KenM76/fix/xfa-check-button-width
  • fix: Merge pull request #5487 from KenM76/fix/file-dialog-extension-case
  • fix: Merge pull request #5637 from RiceDee/fix/format-text-fields-fit-pane
  • …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/pdfcraft 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 f42fda734243b66f54db87923d7c981d5221419e — 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.