PrintCraft changelog
Back to PrintCraft15 releases since October 2026 · GitHub releases, checked Oct 27, 2026
0.14.0LatestBig update
- fix(cos): one decode budget per page walk, so repeated stream references cannot multiply decoding
- fix(cos, content, filters, crypt, model, render, print, a11y): bound the work that repeated keys, streams and page values multiply
- fix(limits): bound the decoding and listing work that repeated references and small inputs multiply
- fix(js, xfa): bound the text and work that form scripts and XFA data can multiply
- fix(edit,organize,create): bound the work hostile files cause in editing, page organizing and image import
- chore(sonar): exclude vendored crates and the spec-mandated MD5/RIPEMD-160 (SonarCloud rust:S4790)
- fix(packaging): use [[ tests and name positional parameters (SonarCloud shelldre:S7688, S7679, S7682, S131)
- fix(audit): find covers the audit missed, bound its work and honour the copy permission
- fix(xfdf, sign, preflight, engine, forms, measure, annot): bound repeated work in form exchange, preflight and export, and check what imports and time stamps claim
- M14: update ctutils to 0.4.5 for RUSTSEC-2026-0385
- Fix FormCalc Str() printing small negative numbers as "-0"
- Accept long unit names in FormCalc UnitValue
- test(sign): serialize the Keychain search-list tests
- M9: sign_list lists a hidden or NoView signature field as not visible
- M6: scripts see xfa_version, and xfa_installed in XFA forms
- Regression tests for #246, #843 and #2028
- fix(optimize): keep a destination referenced only through an indirect /Dest
- CI: the workflow token is read-only
- ci(deps): bump Swatinem/rust-cache from 2.9.2 to 2.9.3 in the actions group by @dependabot[bot] in
- FreeBSD: package the aarch64 cross build (craft-common-actions#39)
- Reject non-hex characters in XFDF colour parsing
- fix(edit): setting a paragraph's width no longer panics on text larger than a page
- fix(redact,sign,cos): close the still-open high-severity scan findings
- fix(docs): one row per crate in the vendor README table and remove duplicates
- M10: odd and even pages are page numbers, as Acrobat counts them
- fix: Issue #4017. Flattening removes empty fields it cannot draw
- M11: Convert to PDF/A needs the owner's permission on an encrypted document
- M5: stamp_custom places a picture fitted inside a rect
- M5: sticky notes draw the icon they name (ISO 32000-2 Table 175)
- M3: a Launch link that names a PDF opens it in PdfCraft (ISO 32000-2 §12.6.4.6)
- ui: prevent top item clipping under panel header separators
- fix(ui): keep colour popups open when "+" opens the custom colour picker
- M6: calculations read their notation only from a comment, and a regex after a condition as a regex
- Accessibility: set a table's Summary and a header cell's Scope
- M4: bookmarks show and set their title colour and style (ISO 32000-2 Tables 151, 152)
- Cancel stale Organize page drags after document changes
- M2: text extraction finishes a column before the next one across a paragraph gap
- fix: Issue #4076, pdfcraft --help prints usage instead of opening the app.
- Open Save As and export dialogs in the document's own folder
- M9: visible signatures read upright on rotated pages
- G14: Romanian: translate the 64 catalog rows still in English
- Packaging: pin the signing client and appimagetool, and check their hashes
- fix(links): resolve remote document paths with craft-docpath's resolve_absolute
- Allow OFL typefaces, Noto CJK and Source Han included (AGENTS.md §1.1)
- CI: nextest, line tables only, one wasm check
- CI: shared gate workflow; nightly fuzzing in its own workflow
- test(automation): give sign_document a real digital ID and document in the hostile-arguments sweep
- release: the git-sources gate moves into craft-common-actions (storytold/craft-common-actions#78)
- Translations: a missing string never fails; xtask ci prints the gaps
- Assets: don't hash translation catalogs in ATTRIBUTION.toml
- ci(sonar): stop cancelling main-branch runs so coverage is published
- fix(render): bound xref streams, JBIG2 referred-to counts, saved graphics states and /W2 runs
- chore: resolve SonarCloud maintainability issues
- fix(deps): bump crypto-bigint to 0.7.6 (RUSTSEC-2026-0387)
- Tests: UI tests wait for background work by time, not frame count
- fix(demo): resolve SonarCloud web/css issues in showcase.html
- Integration batch 3: 47 contributor PRs (editing, forms, XFA, rendering)
- fix(xfa): skip PDF fallback scripts while XFA layout is active
- M6: dotted field names make parent fields
- fix(edit): batch styled paragraph fallback glyphs
- fix(ui): the header, footer and watermark previews show the page under the marks
- M12: laying out a dynamic XFA form takes off the usage rights it voids
- fix(forms): write each /DR font as its own object, so Acrobat keeps typed text
- Save commits the open Edit Text boxes before writing the file
- M6: util.scand reads dates as another viewer does
- Edit text: keep Tr, stroke, line width and gs set inside BT when rewriting a paragraph
- M12: a date typed by another of an XFA field's edit patterns is kept in its first
- M6: form buttons show the side panels (app.execMenuItem)
- Redaction: follow nested forms as deep as the readers do
- M6: values typed into Password fields are written to no file
- M6: a document script that throws no longer stops the form's other scripts
- fix: Issue #4018, form_fill warns when a value does not fit its field
- M4: a save prompt that opens in the background asks for the user's attention
- M2: a symbolic TrueType font reads its (3, 0) cmap before its (1, 0) one
- fix(ui): the added-text editor keeps the box's alignment
- M11: PDF Optimizer ▸ Clean Up stores LZW streams with Flate (optimize.flate-unencoded)
- fix(audit): covered_text reports the words under the cover, not the whole line
- M7: edited text keeps the spaces typed, except at the edges of a stretched justified row
- M7: paste added text boxes and images in the engine and through content_copy
- M7: a batch of content edits refreshes the added content and page marks
- M7: added text takes character spacing from Format text
- M12: XFA text is measured at its standard-14 font's own widths
- Check boxes and radio buttons draw their mark in the field's text colour
- Omit minus sign when FormCalc Format() rounds to zero
- M6: Field Properties ▸ Actions: Edit opens an existing script
- M11: honor page UserUnit when measuring image resolution
- M10: write DOCX cell widths from their grid columns
- M7: a bold paragraph's stand-in font no longer turns earlier edits bold
- M12: round XFA check buttons draw a round background and border
- M12: links in XFA rich text become clickable links
- M12: XFA borders and rectangles with rounded corners are drawn rounded
- M10: preserve table text from covered export slots
- M8: redact labelled Italian international slash numbers
- M10: apply soft-mask Decode intervals to image exports
- M12: flowed XFA subforms are drawn with their border and fill
- M6: fields that don't scroll stop taking text when full
- M6: the date picker has a Today button
- M2: a DeviceN colour with twelve inks paints, and a colour that can't be evaluated no longer blanks the page (ISO 32000-2 §8.6.6.5)
- M6: check boxes, radio buttons and push buttons without an appearance are drawn, and comb fields show their cells (ISO 32000-2 Table 192, 12.7.5)
- M2: Invisible annotations of unknown types and popups don't paint their appearance on the page (ISO 32000-2 Table 167)
- M2: a stand-in for a non-embedded font keeps its glyph shapes at wider /Widths advances (Arial,Bold no longer draws i and l as blocks)
- M2: a non-embedded CIDFont's fallback request carries its descendant's font descriptor (ISO 32000-2 §9.7.4, §9.8)
- fix(edit): Delete removes the selected paragraph or objects in Edit text
- Integration batch 4: 26 contributor PRs (comments, viewer, pages, printing), after #4390
- M5: sticky notes stay upright where they are placed on rotated pages (NoRotate, #2583)
- feat(organize): Extract pages takes typed page ranges
- M5: the arrow keys move the selected comment
- Leave the page grid when the Crop tool is chosen
- fix(automation): guard MCP dispatch and bound line and file reads
- M12: type or pick an architect's 1:N drawing scale in the Measure panel, applied at once
- i18n(fi): translate the 64 labels left in English after #2210
- feat(ui): the secured-document notice can be turned off for good
- fix(sign): judge a page's indirect /Annots array by the annotations it gains
- fix(sign): let an LTV update declare the ESIC extension in the catalog
- Flatten comments from the page's right-click menu and the Comments panel's menu
- M10: every paper size reaches the printer, from the dialog and doc_print
- feat(ui): add 'Split document...' to page thumbnail context menus
- M3: a link without a position keeps the reader's place (ISO 32000-2 §12.3.2.2)
- M10: preserve page artwork when printing annotations
- test(ui): recovery idle tests make folders that never share a name
- M5: stamps without an appearance draw the stamp they name (ISO 32000-2 Table 184)
- Reject open-ended page range on a document with no pages
- M3: a fresh install follows the desktop's appearance
- M3: restore last view settings when reopening documents
- organize: split a combined field/widget so every copied page owns its widget
- M10: a booklet decides two-sided itself, as Acrobat does
- cli: the argument bugs photocraft#7071 lists are live here too
- M3: resize and move the window again right after a resize or move (Wayland)
- Comments: the composer hides while its comment is scrolled away
- M5: comments without an appearance draw their /Border dashes, Ink dashes and the caret's ¶ (ISO 32000-2 Tables 166, 168, 183)
- Integration batch 5: 9 contributor PRs (OCR, attachments, documents, selection), after #4391
- M10: recognize a scanned page when Edit is turned on for it
- Attachments: attach a file and delete one (panel, edit, tools); duplicate names numbered as text
- M3: Document Properties shows a title and author stated only in XMP
- M11: Optimize keeps a JPEG's colour transform
- fix(ui): the back arrows leave Edit as the Edit tab does
- Select All takes the whole document's text while scrolling continuously (fixes #2639)
- Refuse an OCR batch whose inputs would write one output file
- fix: Issue #4020, Extract keeps the bookmarks of the pages it copies
- OCR: a recognizer panic or a dead worker ends the run
- fix(forms): a multiline field rejects a glyph wider than the field
- fix(render): vendor hayro-postscript so a run of << in a CMap can't overflow the stack
- Fixed broken link to nFPM installation site
- Redaction keeps images still drawn through a form without /Resources
- fix(optimize): a GoToR or GoToE /D no longer keeps a local named destination
- refactor(xtask): reduce cognitive complexity in parity and layers
- refactor(a11y): reduce cognitive complexity in autotag and alt
- refactor(engine): reduce cognitive complexity in camera_edges and word_count
- refactor(ui): split field-table divider input (Sonar S3776)
- fix(ui): seven tools take the page zoom from the side the page's width is on in a turned view
- M2: tiling pattern cells sit at their XStep/YStep multiples at every scale (ISO 32000-2 8.7.3.1)
- fix(automation): roots-only mode refuses other shares and devices by name
- M12: XFA check boxes sit where their margins, caption and alignment put them
- M5: line comments draw their leader lines and caption (ISO 32000-2 Table 178)
- M3: a document opens at its /OpenAction destination, position and named destinations included (ISO 32000-2 Table 149, 12.3.2.4)
- M4: Document Properties has a Custom tab for custom properties
- M3: a closed top-level bookmark opens closed (ISO 32000-2 Table 151 /Count)
- fix(ui): header, footer and watermark previews step through the pages
- Reject non-finite numbers in XFDF coordinate lists on import
- refactor(xfa): explicit model imports (Sonar S2208)
- M2: Type 3 text in rendering mode 7 is not rendered and adds no clip (ISO 32000-2 9.3.6)
- M2: a Separation /All colour paints every colourant, gray 1 − tint on screen (ISO 32000-2 8.6.6.4)
- Remember the annotation tool pin across restarts
- M6: an editable combo box takes a typed value (ISO 32000-2 Table 233 Edit)
- chore: order the render integration-test modules (fmt)
- fix(ui): text typed into a new text box counts as unsaved work
- Integration batch 6: 6 contributor PRs (All tools view, page pointer, comments, redaction, Properties, Home)
- M3: All tools expands to a full, searchable view
- fix(ui): Document Properties layout, Space Audit tab, no page cursors under dialogs
- M3: the community card on Home can be closed for the rest of the run
- fix(ui): one page pointer per frame, so taps work and nothing over a page lets it through
- fix(comments): thread replies by their /IRT reference, count comments like Acrobat
- fix(redact,cos): cleared redaction marks leave nothing behind
- fix(xfa): require full save when stripping XFA packets
- fix(forms): align has_password_flag traversal depth with field enumeration
- fix(redact): remove AcroForm on Hidden::FormFields even when field count is zero
- forms: clear typed XFA password field values from datasets on save
- fix(ui): the page ignores the pointer while a panel is being dragged
- @Matoo125 made their first contribution in
- @zuujiscom made their first contribution in
- @piyushgoel2808 made their first contribution in
- @agent-reed made their first contribution in
- @pat26-dotcom made their first contribution in
- @aalbertiarchitecte made their first contribution in
- @vjeko2404 made their first contribution in
- @vioreltus made their first contribution in
- @cadelass made their first contribution in
- @RiceDee made their first contribution in
- @mercuryVM made their first contribution in
- @lev-n made their first contribution in
- @KyleKassen made their first contribution in
- @meethere made their first contribution in
- @thesilvjurado made their first contribution in
- @so-sai made their first contribution in
- @roopeshor made their first contribution in
- @dotCooCoo made their first contribution in
0.13.0Big update
> [!NOTE] > FreeBSD aarch64 is dropped from this release. We had to cut releases, and we cannot build this target within the 5-hour CI limit for any of the Craft apps, so we are dropping it for now. This is a known blocker, flagged for a future fix in storytold/craft-common-actions#39. FreeBSD x86_64 and every other platform are included.
- M14: recover existing macOS PDF associations after open and save
0.12.0Big update
> [!NOTE] > FreeBSD aarch64 is dropped from this release. We had to cut releases, and we cannot build this target within the 5-hour CI limit for any of the Craft apps, so we are dropping it for now. This is a known blocker, flagged for a future fix in storytold/craft-common-actions#39. FreeBSD x86_64 and every other platform are included.
- M7: lay out the Edit panel as Acrobat's
- fix(engine): PNG export writes opaque pages as RGB at deflate level 3 (3–5× faster, same size)
- M3: the mode bar has no Read tab, as in Acrobat
- fix(render): read each object stream's index once (vendored hayro-syntax patch 22)
- M4: Organize pages remembers its page size, as Acrobat does
- M3: the Tools panel has no tab strip while docked alone
- M7: lay out Format text as Acrobat's panel
- M6: renaming a field renames it in the calculations that read it
- Use chrono instead of hand-rolled UTC conversion
- M6: calculation order: read, check, fix and set the order fields calculate in
- security: enforce HTTPS on curl downloads (SonarCloud S6506)
- ci: pin GitHub Actions to full commit SHA (SonarCloud S7637)
- M6: Prepare a form ▸ Calculation order: a page to reorder, check and fix the order fields calculate in
- M6: Prepare a form ▸ Text field table: rows and columns of text fields as one edit
- M14: add Norwegian Bokmål interface and date language
- Integration batch: 218 PRs on main
- Fill & Sign marks stay upright on rotated pages
- M5: drag a line's ends (and a polygon's corners) to change its length and angle
- Preferences: list the languages alphabetically by their own name
- M14: complete Brazilian Portuguese catalog
- M6: hovering a form field shows its tooltip
- M7: keep a word on its line when its spacing differs by less than a thousandth of an em
- M7: open the paragraph editor without a fade-in
- M7: keep an applied paragraph's look until its page is drawn again
- M4: a new bookmark goes to where the reader is
- M7: keep a paragraph open with its typing when its edit fails
- M7: an added picture resized by a corner shows only at its new size
- Give the print preview's grayscale tag a bit of its own
- M14: the Preferences OK button stays in reach below the scrolling settings
- M14: Italian catalog: the 8-character digital ID password message
- M9: closing a half of a side-by-side comparison keeps the app running
- M7: a text editing session for one paragraph
- M14: JPEG and TIFF export refuse a raster of the wrong length instead of panicking
- Reject rounded page rasters beyond the pixel budget
- M7: opening a paragraph leaves the page as it is until it changes
- M5: a Replace text comment is named Replace text, not Strikethrough
- perf(render): read PDFCRAFT_TEXT_DEBUG once instead of per glyph
- perf(render): look CFF glyph names up in a map (vendored hayro-interpret patch 44)
- fix(engine): guard undo and redo refresh and roll back on failure
- M5: a stamp grows and shrinks with its handles before release
- Render: radial luminosity fades have regression coverage
- M12: XFA labels and buttons without a size grow to their content
- M9: read .p7b/.p7c certificate bundles for trust import
- fix: read the last array of a surplus-operand TJ, not the first
- M12: showing an XFA subform leaves its unnamed hidden objects hidden
- Forms: Highlight fields marks only the fields that can be filled
- M7: paint a new background over older ones
- fix(print): restore previous paper size after leaving Label mode
- M14: find Apple's Devanagari faces in the folders current macOS uses
- M14: Spanish catalog covers the bundled key union
- Page-tree walks in annot, forms and organize skip repeated children
- The image scan skips a path segment before any m instead of panicking
- Fix #3507: preserve content boundaries when merging image fragments
- Decode JavaScript hex and control escapes in AF script strings
- fix(forms): preserve comments across content streams
- Render: a doubled sign is one number, so a cm with it still has a matrix
- Control channel: wait after a failed accept instead of retrying at once
- fix(print): retain existing appearances without Subtype
- Fix named properties in forms without resources
- Pair /ActualText correctly past 256 levels of marked content
- fix(render): draw missing spacing glyphs in Japanese CID substitutes as spaces
- Keep filtered inline images whole when their data contains EI
- fix(xtask): wait for Chrome child processes to settle PDF after launcher exits
- Accept a delimiter after EI when ending an inline image
- M8: applying redactions drops structure-tree references to the comments and fields it removes
- M2: text extraction keeps doubled letters in text condensed to 20 Tz and below
- fix(a11y): resolve /MarkInfo /Marked when it is an indirect reference
- M3: let Escape close an open menu before it clears the selection
- Edit text: keep a line together across subsets of the same font
- M3: fix multiline comment hover bounds and paint order
- Parse a bare trailing "a" as AM in AcroForm date/time parsing
- fix(sign): embed the issuers of macOS Keychain identities
- Stop Std14::recognise mapping sans-serif font names to Times
- Return empty WordNum result when cents rounding carries to 1e12
- Keep zero annotation flags through XFDF export/import
- fix(render): hit-test selection against the glyph quad, not its bounding box
- M12: accept Identity CJK Unicode mappings in accessibility checks
- Redact: count shared outline items once so the walk ends
- Join /Contents pieces with a space in measure snap
- Refuse redaction marks with no readable area instead of skipping them
- M4: resolve indirect initial-view boolean preferences
- fix(comments): the eraser's size sets how wide it rubs
- feat(edit): Header & Footer can be drawn in Times or Courier
- Print: keep the picked printer for the next print
- fix(organize): imports find the objects they added when new numbers fill gaps
- fix(xfdf): a field name full of periods no longer overflows the stack on export
- fix(annot): a comment listed many times gets one display appearance
- Add thumbnail size controls to the Pages inspector
- fix(ui): the Read mode command leaves Edit as the Edit tab does
- fix(render): draw device colour in the resources' /DefaultGray, /DefaultRGB and /DefaultCMYK (vendored hayro-interpret patch 38)
- fix(ui): Fill & Sign font size resizes the selected text
- fix(save): preserve destination extended attributes on macOS
- M3: layer_set shows or hides a layer, and page_render draws with the document's view settings
- M7: the paragraph editor draws on its page only
- docs(roadmap): record #2662, the audit's one-word cover
- test: the image-drag pixel test waits for the page raster (flaky on windows-latest)
- feat(viewer): add optional gapless continuous page display
- fix(render): emit clip-only text (7 Tr) to devices for text extraction
- fix(render): apply the JP2 palette of a JPX image with no /ColorSpace
- Prevent overflow when rotating added images through automation
- fix(forms): an XFA form whose config forbids dynamic rendering is static
- Vendor and patch hayro-cmap for tolerant CMap parsing
- M8: phone pattern finds slashed and labelled unseparated numbers
- M3: extract text from glyph names outside the Adobe Glyph List
- Draw a note without an appearance as a fixed-size icon at the corner of its Rect
- Shading patterns use the stroke or fill alpha current at paint time
- fix(content): accept inline image EI without preceding whitespace
- Lay out vertical (Identity-V) text as columns in the edit layer
- Renderer: sample a mesh shading over its triangles alone, not the whole path
- Keep text rows in other layers, gs states or Tz out of a paragraph
- fix(organize): prune named destinations without recursive calls
- M6: Optimize AcroForm JavaScript snapshots and diffs
- M6: Treat AcroForm /MaxLen 0 as unlimited
- Rail: scroll the panel buttons above the page navigation in short windows
- Render: a five-point polyline is no longer painted as its bounding box
- M2: preserve word spaces around TOC leaders
- fix(a11y): join and splice page content streams with cross-stream rules
- fix(windows): present Direct3D 12 through a composition visual, so resizing doesn't stretch
- M12: an XFA script that fails partway keeps what it changed before the error
- Honor single-page redaction selections
- M5: centre selected inspector comments without changing zoom
- fix(render): use unfiltered inline image byte length before EI heuristic
- fix(engine): a reload keeps reading colours and hidden comments
- fix(edit): keep a superscript footnote marker in its paragraph's row
- fix(forms): draw fields the file leaves to the viewer, for display only
- M2: Type 0 fonts with /ToUnicode /Identity-H read their codes as Unicode
- i18n: add Central Kurdish (Sorani) as an interface language
- M12: XFA text honors its horizontal font scale
- M12: a space at the end of a line doesn't count when fitting XFA text
- M3: snapshot tests of every side panel
- M6: a push button's caption uses the font, size and color of its /DA
- M7: let a list marker open an item and a hanging indent continue it
- fix(xfa): run click scripts for every repeated print button
- feat(forms): nudge the selected field with the arrow keys in Prepare a form
- Print ▸ Properties…: the driver's options in the UI language
- fix(comments): Add a text box takes a drag that sizes the box
- i18n: add Lao (lo) translation support
- fix(automation): tools on a file the viewer reads fewer pages of answer instead of panicking
- fix(edit): keep a one-row centred title centred when it grows
- fix(print): disable Print on documents whose security forbids printing
- Layers panel: Reset to Initial Visibility
- M7: a paragraph number keeps naming the paragraph text_paragraphs listed
- M14: complete and review the Czech catalog
- M5: reduce Comments panel scans on large reviews (#2669 item 5)
- fix(cli): info, text, render and audit take the owner password of R2–R4 files
- M7: Header & footer: shrink the page content out of their way
- M6: detected form fields get no border or fill
- fix(print): offer the US #10 envelope as a paper size
- Redaction audit: an opaque filled Square annotation over text is a cover
- Treat CRLF as a single line break in fonts::wrap
- fix(ui): Korean (Hangul) file names and tab titles draw as boxes
- M3: the "Save changes?" prompt opens on Save and moves between buttons by keyboard
- M9: rewriting a certified form's XFA data is a form fill
- Forms: measure a field's own simple font, not Helvetica, when laying out its text
- fix(render): draw comma-below letters in non-embedded standard fonts …
- Fix/cli option value errors
- fix(ui): keep a closed right panel closed when a PDF asks to open on its outline
- M2: a post table version with swapped halves doesn't make a font unusable
- Keep seconds in FormCalc Time2Num/IsoTime2Num for ISO 8601 times
- fix(render): blend modes over an empty part of the page keep their colour
- fix(render): knockout transparency groups knock out
- fix(render): a stencil mask is drawn at the fill opacity once
- fix(render): a visibility expression decides what an OCMD shows
- fix(sign): explain 0x8009001D and 0xC0000225 when a store key's provider fails
- Render month and weekday names in XFA date patterns
- M10: Export to Word keeps the page background colour
- Zero-pad required integer digits in FormCalc Format()
- fix(cos): write whole reals past the 32-bit integer range as reals
- fix(ui): the password prompt takes typing on Linux again
- fix(edit): a paragraph's width handle rewraps it from its whole handle, not just the inner half
- fix(ui): the mode tabs keep the hand over a page scrolled under them
- M12: the page side of a measuring scale takes a unit, so 1:50 is 1 mm = 50 mm
- fix(forms): renaming a nested field checks the full name it would take
- fix(comments): the note editor takes the keyboard once, so V and H pick tools again
- fix(render): draw each ICC profile through itself when two have the same stream dictionary (vendored hayro-interpret patch 40)
- fix(ui): on-page text editors leave the mode tabs their pointer when scrolled under them
- fix(render): mesh triangles that share an edge leave no seam
- Ita Translate
- Hebrew file names: draw them with an installed Hebrew face when the build has none
- XFA: decode BMP and TIFF pictures
- Open: opening an already-open document focuses its tab
- fix(sign): render Unicode characters in visible signatures using bundled Inter font
- docs: keep one copy of the catalog paragraph in localization.md
- M10: keep dotted-leader contents entries together
- M11: remove PDF/A or PDF/X identification (optimize.remove-standards-id)
- fix(cos): check object-stream member numbers and offsets
- M9: read DocMDP permissions from the signed revision
- i18n: add Indonesian, Vietnamese, Hindi and Korean interfaces
- Edit images: rotate an image by any angle with a knob
- fix(ui): respect reading background while pages load
- M3: full screen shows one fitted page at a time, as Acrobat's Full Screen Mode
- cos: property tests for save fidelity (part of #1187)
- i18n: add Albanian (sq) interface language
- i18n: add Thai (th) interface language
- fix(ui): a second file dialog waits for the open one instead of being refused
- fix(docs): correct spelling of "Formatting" in comments
- Print: remember selected paper size across restarts (fixes #2156)
- Add Finnish interface and date language
- fix(cos): find objects a broken cross-reference table leaves out
- M14: add Catalan interface and date localization
- fix(forms): Tab and Space reach check boxes and radio buttons, and a click focuses them
- Preferences: field highlights on by default, toggle in Appearance
- Draw the widget border inside /Tx BMC so Acrobat keeps it on focus changes
- Keep Auto font size in the field properties Appearance tab
- fix(optimize): reject hostile image dimensions safely
- crypt: authenticate against encryption numbers qpdf wrote (plus one hand-derived vector)
- Issue #2365: a rebuilt file keeps the /Info and /ID of its cross-reference stream
- Issue #2366: a trailer whose /Prev is a reference still reaches the earlier sections
- M14: Polish says what a signature says, and the rest of the interface
- M5: year-first slash dates (yyyy/mm/dd, yyyy/m/d) for Fill & Sign and headers
- macOS: bring the window forward when a file is opened in the running app (fixes #1928)
- M7: show a shaped run in one text object instead of one per glyph
- M7: drop the fallback fonts a text edit leaves unused
- Ctrl+V pastes a picture from the system clipboard onto the page
- fix(sign): fill typed signature outlines with non-zero winding
- docs(claude): check for existing issues and PRs before starting a fix
- Signatures: signed attributes must carry the message digest and the data content type
- Signatures: the message bar shows a problem before "Certified by"
- M10: Two-sided starts at Printer default, so the printer's own duplex applies
- fix(combine): let the cards zoom to 500%
- M12: Compare panel filters text changes and visual differences (gap 21)
- fix(edit): draw the Cyrillic the Japanese faces lack with the bundled Inter face
- fix(xfa): enforce maxLength on rich-text fields
- fix(xfa): reflow growable multiline fields after filling
- Wake idle windows for pending recovery snapshots
- fix(ui): show the physical page position under a labelled page box
- M14: complete the French interface catalog (267 entries)
- Preferences: always use my default zoom and page layout
- README: the app icon above the title
- fix: add generic font-family fallbacks (SonarCloud css:S4649)
- Build each crate's integration tests as one binary
- fix(cos, sign): close encryption and signature-validation gaps from a security scan
- fix(engine, automation, js, platform): enforce copy, print and removal limits and check code compiled from strings
- fix(xfdf, create, optimize): keep imported comments off form fields, draw imported redaction marks, neutralise CSV formulas and bound two parsers
- fix(redact): remove hidden information completely or refuse, and bound its scan
- fix(a11y, fonts, export, optimize): bound the work that repeated page, font and export structures multiply
- fix(redact): redact what the page draws, check every input stream, and bound redaction's work
- @AdrianTM made their first contribution in
- @ohagmann made their first contribution in
- @nikolainyegaard made their first contribution in
- @johnpetersa19 made their first contribution in
- @eliets2 made their first contribution in
- @narain1 made their first contribution in
- @ffishman made their first contribution in
- @MichaelMuClaude made their first contribution in
- @hazeliscoding made their first contribution in
- @jpeskov made their first contribution in
- @rahul05ranjan made their first contribution in
- @Jayesh-Prajapati9 made their first contribution in
- @amanmprojects made their first contribution in
- @MatrixMagician made their first contribution in
- @Lombardi2003 made their first contribution in
- @petarlaf made their first contribution in
- @robertobulltech made their first contribution in
- @DjPeepjay made their first contribution in
- @Ozt-y made their first contribution in
- @djmushin made their first contribution in
- @majidninja made their first contribution in
- @Lcoding15 made their first contribution in
- @Nyanpasuwu made their first contribution in
- @Dubblbindong made their first contribution in
- @fanyzp made their first contribution in
- @bounkirdni-2025 made their first contribution in
- @qwerin made their first contribution in
- @boneyland made their first contribution in
- @brian-moon made their first contribution in
- @Harrison-Booth made their first contribution in
- @TiagoCK made their first contribution in
- @Bode512 made their first contribution in
- @Nai-ITA made their first contribution in
- @PINYOPATTANAWASANPORN made their first contribution in
- @Saimirbaci made their first contribution in
- @mixlnwuu made their first contribution in
- @arpan-star made their first contribution in
- @Janiz-zzz made their first contribution in
- @guillemvela made their first contribution in
- @marcintrojnacki made their first contribution in
- @Atalantis made their first contribution in
0.11.0Big update
- Skip CodeRabbit reviews on Dependabot PRs
- fix(redact): evaluate OCMD visibility during sanitization
- ci: switch to shared nix workflow from craft-common-actions
- Release: PdfCraft v0.11.0
0.10.1Big update
> [!NOTE] > FreeBSD aarch64 is dropped from this release. We had to cut releases, and we cannot build this target within the 5-hour CI limit for any of the Craft apps, so we are dropping it for now. This is a known blocker, flagged for a future fix in storytold/craft-common-actions#39. FreeBSD x86_64 and every other platform are included.
- Tests: make timing-dependent render and UI tests deterministic
- Clear replacement text
- Prevent oversized GPU textures after page replacement
- i18n: Turkish section titles and in-sentence labels keep İ and ı
- fix(engine): printing keeps layers hidden in the Layers panel hidden
- fix(ocr): the text layer restores the rendering mode it sets
- Control channel: don't lose the refusal reply to a TCP reset (fixes deadline test flake)
- fix(ui): the Hand tool moves the page with the pointer
- fix(i18n): the web build's Auto language follows the browser
- Fix overflow panic for i64::MIN index in content_update/delete
- Apply JPEG EXIF orientation when creating PDFs from images
- M6: a box drawn with points along its sides is detected as a box
- Extract RTL lines with numbers and punctuation in logical order
- M8: redaction removes the replies of the annotations it removes
- Edit text: a loaded font is applied to the paragraph being edited
- Comments: an attachment comment's menu saves or opens its file
- M7: keep the text blocks cache after the document is edited
- M7: fold repeated group moves of a cropped image into one clip cm
- fix(engine): a new or recovered document stays unsaved through undo
- M8: measure fonts without /Widths with their embedded program
- Issue #2367: an object stream whose entry cannot place it is found by its header
- Save As to another file writes a clean copy without earlier revisions
- M4: reverse page order (organize.reverse-pages)
- M6: detect a row of comb boxes as one comb text field
- Redact email addresses whose local part starts with punctuation
- M7: never encode typed text with CID 0
- M5: flattening comments leaves 3D, multimedia and print-production annotations
- Keep a subscript or superscript in its line when extracting text
- Find credit card numbers followed by an expiry, year or CVV
- fix(i18n): zh-hant catalog uses Taiwan vocabulary consistently
- M10: keep the OCR scan fixture at its original page size
- Fix GPU startup requests exceeding adapter limits
- M7: the Edit text caret is as tall as the row it is on
- M3: the Pages panel follows the current page
- M3: type an exact zoom into the rail's zoom field
- fix(cli): use laid-out pages for dynamic XFA forms
- fix(engine): Save writes a repaired file in full even without edits
- M4: custom document properties through the engine and the tools
- Integration batch: 38 PRs on main
- Keep leading spaces and tabs when wrapping plain text into a PDF
- fix(ui): Save asks where to keep an Apple Mail attachment
- M10: preserve component Decode in lossless image export
- fix(ui): Read mode hides the quick toolbar
- M10: running text is not a table row in Word, HTML and PowerPoint export
- M4: respect indirect page rotations when reading and editing
- fix(cos): an incremental save of a file with bytes before its header counts from the header
- fix(redact): removed links and comments leave the structure tree too
- A save keeps the permissions of the file it replaces
- M7: rewrap a paragraph at a slant at the width its rows have
- Encryption: /Perms limits what an edited /P allows in AES-256 files
- M3: single-page view turns pages without a blank frame
- fix(edit): keep overlapping watermarks and distinct paragraphs on text edit
- M7: write a full font program compressed and find it again on any page
- M3: a page jumped to in single-page view no longer hops into place
- Shorten over-long part file names in doc_split by bookmarks
- Web: host mode needs a parent page on the same origin
- Don't treat a date ending in "Sep" as PM in AFDate/AFTime parsing
- fix(xfa): a page area without <occur> has no limit, and occur min gets its pages (fixes #2574)
- M14: no PdfCraft lion over PDF thumbnails and the preview pane
- fix(ui): Reveal in File Explorer selects files whose path has a space
- fix(ui): Copy in the selection action bar closes the bar
- Let the page range select page 1 alone
- Round FormCalc Str and Format exact ties away from zero
- fix(annot): percent-encode non-ASCII bytes written into link /URI
- Replace Text: give the caret its own /NM
- fix(inspect): report /OpenAction JavaScript in document info
- M6: distinguish CSV header tabs from TSV delimiters
- M1: saving refuses to replace a read-only file
- Remove security also from files with /Encrypt inline in the trailer
- Go to page brings the page into view horizontally too
- M3: ⌘G and ⇧⌘G step through matches from the find field
- fix(edit): wrap single turned rows at the page margin
- M1: read an xref table numbered from 1 that begins with object 0
- M3: closing PdfCraft while minimized no longer saves a 0 x 0 window
- Fix wrapped revision buttons overlapping Binding
- fix(select): a picked picture that is edited away no longer leaves its highlight behind
- fix(edit): emit rewritten paragraph after backgrounds between its rows
- docs: drop references to competing commercial software
- M4: Ctrl-drag copies pages in the Organize grid
- ci: configure Dependabot for Cargo and GitHub Actions
- M2: copy Flate back-references in runs
- fix(forms): edit button labels in field properties
- Keep added marks visible after unfinished marked content
- ci(deps): bump cachix/install-nix-action from 31.11.1 to 31.11.2 in the actions group by @dependabot[bot] in
- Drop U+FFFE and U+FFFF from XFDF/XML form-data export
- Render weekday letters in FormCalc date pictures
- cli: info names the standard a document declares
- M10: exported TIFF and JPEG pages record the resolution they were drawn at
- Read doubled-sign integers like --280 in the COS lexer
- docs: one hayro-interpret row in vendor/README, with the three patches lost to number collisions
- The recovery folder is owner-only on Unix
- M7: work out each font's space width once per paragraph rewrite
- Read /ActualText from named property lists in edit text and export
- Find and edit images whose Do or cm spans two content streams
- M1: a saved file keeps its creation date
- M2: a fax image with fewer /Rows than its /Height is decoded to its height
- M3: Accelerate coarse wheel scrolling
- Make form properties byte comparisons independent of the clock
- Clamp the zoom-anchor scroll to the content so zooming out no longer jolts the page
- Keep the current page when switching viewer modes
- Clear image pixels intersected by redaction marks
- fix(preflight): identify PDF standards by XML namespace
- Keep long menus usable in short windows
- fix(windows): name the single-instance socket by the session id, so a launch without SESSIONNAME finds its session's window
- fix(sign): offer only certificates that may sign documents from the Windows store
- M2: a tiling pattern drawn once shows its cell at full scale
- fix(parse): accept spaces between stream and its line break
- M2: a JP2 image in a colour space the decoder refuses is drawn by its component count
- M8: redaction's structure-tree walks start from the parent and ID trees too
- Docs: install the CLI and register it with MCP clients
- Text: tracked glyphs retain their word boundaries
- M6: a secured form's notice bar still says it is a form
- M6: the date picker follows a whole date typed while it is open
- M6: a date typed without separators fills a yyyymmdd field
- Never-crash gate on oracle and testkit; oracle find() no longer panics on an empty needle
- Fix shaded Type 3 glyphs at translated positions
- Keep save shortcuts behind other dialogs
- M10: Office export follows forms 50 deep and up to 50 000 a page and says where it stops
- docs: base the XFA page area Acrobat observations on a synthetic form
- Tests: the parser-cancel test guards against a hang, not a 2 s limit
- Add fills and border widths to text boxes and callouts
- Edit text: refuse a rewrite of text that is a clipping path
- M5.6: preserve nested annotation values in FDF exports
- docs: add SonarCloud and CodeRabbit badges to README
- @PerchAnton made their first contribution in
- @ogzhnklvz made their first contribution in
- @kgemici made their first contribution in
- @Erry91 made their first contribution in
- @hms5232 made their first contribution in
- @IanHollow made their first contribution in
- @Bortlesboat made their first contribution in
- @Arakmar made their first contribution in
- @bennyboer made their first contribution in
- @enesoglu made their first contribution in
- @aiongg made their first contribution in
- @ahmadmuj made their first contribution in
- @oracola91 made their first contribution in
- @jcnnik made their first contribution in
- @hcchung1 made their first contribution in
- @Mateusindev made their first contribution in
- @outragedevs made their first contribution in
- @charan-rathore made their first contribution in
- @saad-mughal435 made their first contribution in
- @hade0ntema made their first contribution in
- @dependabot[bot] made their first contribution in
- @Hamza0101 made their first contribution in
- @MortenHusted made their first contribution in
- @Tomcatt made their first contribution in
- @pedrocaluiz made their first contribution in
- @KnottyDyes made their first contribution in
- @EricKaden made their first contribution in
- @gsilano made their first contribution in
- @Faabyy made their first contribution in
0.9.0Big update
- Make a missing external oracle loud instead of a silent pass
- One way to write a synthetic PDF fixture
- Measure rendering against Poppler, and turn the pixel test on
- Say what the render-oracle score does and does not mean
- Pin that every JBIG2 conformance fixture decodes to the same picture
- The fonts README still called the standard-14 widths an estimate
- The text oracle scored us zero for honouring a no-copy document
- Fix oracle Clippy failure for four-byte pixel chunks
- Preserve precision when writing page transforms
- Printing: a layer that is off in the document stays off on the sheets
- Clear image leftovers
- Tests: use 300 DPI synthetic scan for OCR searchability
- M8: Bound and reuse repeated redaction overlays
- M4: keep the last saved revision across undo
- M5: add comment and reply submission shortcuts
- M12: mark leaf tags as artifacts
- COS: index cross-reference entries on demand
- feat(ui): drop files on the Pages panel to insert pages
- Clamp extracted Indexed image samples to the declared palette range
- Keep page labels and focused navigation consistent across reloads
- Keep the full final spread reachable with unequal page heights
- Text selection: dragging to the top or bottom edge of the view scrolls it
- Edit text & images: a dragged image's pixels follow its frame instead of waiting for the release
- Text selection: a drag after a double- or triple-click extends by whole words or lines
- fix(render, ui): form-heavy documents draw and fill fast (spot-colour images, widget placement, Fields panel)
- i18n(pt-br): fix 6 Brazilian Portuguese strings
- Sinhala and Tamil interface: draw with an installed font (part of #1688)
- M5: Fill & Sign text reads across on rotated pages
- M14: add Vietnamese interface and date localization
- Edit text: the four-way arrow wherever a drag moves, and a sharp page while editing
- macOS: the standard About panel shows the website and Discord links
- M6: detect form fields on scanned pages
- M2: Make literal text search linear and tolerate missing layout metadata
- fix(ui): clicking a theme card in Preferences picks that theme
- Issue #1676: put fallback faces on the interface baseline
- M7: fold repeated image transforms into one cm instead of nesting q
- i18n: Taiwan vocabulary and the missing entries in zh-hant
- M7: keep the source operators of rows a text edit doesn't reach
- M7: draw new characters with the source font's own embedded program
- Automation: tell a tool name or an unknown id from a command without a tool in command_run
- M7: reuse a page's font resource and program when embedding again
- M2: Add word and character counts with optional content exclusions
- M7: read the page once per keystroke when measuring a text draft
- M11: merge image fragments, and the Standard and Mobile optimizer presets (closes #1783)
- M7: rewrap Chinese and Japanese text between characters
- M7: justify paragraphs whose font shows the space with another code
- Edit image: give each flip button the icon of its own mirror axis
- M10: A6 paper in the print dialog and doc_print
- M7: Add / Update / Remove menu on Header and footer, Watermark, Background
- fix(a11y): mark_decorative no longer panics on an unpaired ParentTree key
- M2: a /Rotate that isn't a quarter turn counts as 0, as the page is drawn
- fix(cos): a nonpositive crypt-filter /Length no longer overflows
- fix(audit): find rectangle covers closed with h or painted with b/b*
- fix(sign): an unreadable extendedKeyUsage allows no purpose
- audit: harden finding classes with golden tests and docs
- fix(audit): an applied redaction at the end of a line is not a faux redaction
- fix(a11y): bookmarks from structure keep the words of glyph-by-glyph headings
- fix(audit): report faux-redaction rectangles in top-left page points
- fix: render CCITT Group 4 images that declare /Rows 0
- fix(automation): a missing path under --root says where it was looked for
- M3: touchpad swipes glide on after the fingers lift on Wayland
- fix(redact): the tail of a longer number is not a phone number
- fix(forms): new text and date fields take Acrobat's Auto font size
- feat(ui): a middle click closes a tab
- fix(organize): bound how deep an import follows the object graph
- M2: Bound page-tree traversal memory for repeated children
- Compare files: side by side, scrolled and zoomed together
- M11: measure every use of an image drawn through deeply nested forms
- fix(edit): flattening keeps a widget it cannot draw and an undrawn reply
- fix(control): a deadline and a cap for connections that have not authenticated
- Issue #305: an update keeps the File Explorer menu choices, and the image menu gets a switch
- fix(sign): a signed revision of a password-protected file opens with the document's key
- feat(organize): Insert pages from file brings the file's bookmarks
- XFA: flatten a form into a plain PDF, or convert it to a static form
- feat(cli): page lists take ranges, and a missing page is named as typed
- M9: signature labels follow the interface language, and one the font can't draw is refused, never written as ?
- Keep native open replies queued while dialogs and pickers are active
- M2: bound ASCII85 decoding by the stream's output limit
- M4: write each page label dictionary as an indirect object
- M6: auto-size text fields shrink and wrap typed text on screen, as on the page
- Print: print as image (Advanced), with grayscale pictures
- fix(automation): no top-level oneOf in form_set_props input schema
- CLI: run --script --report prints one JSON document for the run
- Issue #1910: Organize opens on the current page
- Signature pad: Undo button and Ctrl/Cmd+Z take back the last stroke
- View: show page size when hovering the bottom-left of the page view
- Export to Word: show pictures on positioned pages, bound the pictures
- M2: keep the raw crop minimum in physical points
- Comments: font size for text boxes in Comment Properties
- Viewer: a press on a page makes it the current page
- View: Single Page wheel turns to the next page at the edge of a zoomed-in page
- Draw: a released pen stroke stays on screen until the page raster has it
- Forms: simplified field notation written as real JavaScript, not AFMakeNumber(0)
- Edit: crop an existing page image with its handles
- Redaction Tool Properties: the mark's appearance, and Make properties default
- fix(ui): wrap long filenames and metadata in Document Properties
- M2: clip intersection starts its row walk at the first shared row
- fix(render): a Multiply highlight inside a transparency group keeps the text
- M7: list Edit text & images first under Modify page
- Linux/BSD: open files from later launches in the running PdfCraft
- fix(forms): read each JavaScript name tree node once
- Wait for remote-link errors before asserting in UI tests
- M2: heavy-sheet generator and page timing harness (item 8 of storytold/pdfcraft#623)
- perf(xfa): make som index lookup linear
- i18n(es): translate the new print and Add text strings, Type on the signature pad, tú register
- fix(ui): preserve Ctrl+Alt+Q during digital ID creation
- chore(contributors): credit mtlcl410 by display name
- M4: read page transitions and display times (/Trans, /Dur) into DocInfo
- M4: set page transitions and display times (/Trans, /Dur) through the engine and the tools
- M12: the geometry of page transitions (ISO 32000-2 table 164)
- M3: a document that asks to open in Full Screen mode asks first (/PageMode /FullScreen)
- chore(packaging): give test-msi.ps1 a UTF-8 BOM so Windows PowerShell 5.1 parses it
- fix(organize): keep page labels on their pages when pages are deleted
- fix(ui): check boxes over text should show the pointing hand, not the I-beam
- M3: preserve coordinate clicks across slow frames
- fix(a11y): mark_decorative finds MCIDs in named property lists
- fix(ui): header, footer and watermark dialogs refuse undrawable text …
- M7: Hebrew in Add text
- fix(sign): a signed page's resources are page content whatever keys a later revision writes
- fix: Space Audit lines up its columns and counts form fonts as fonts
- test(ui): wait for the save to write the file instead of a fixed frame count
- fix(render): a soft mask fades a gradient fill again
- OCR: Downsample to shrinks a page box given in pixels
- Fix multi-select choice index ordering
- M3: Improve Back/Forward page navigation (fixes #2080)
- fix(fonts): keep a subset Type 0 font for glyphs /W leaves to /DW
- M1: every PDF leaves the engine checked, and every writer uses one staging-file writer
- M9: harden .p12 digital IDs
- packaging: RPM requires library sonames, so openSUSE can install it
- fix(edit): keep the runs of untouched text between two edits
- Forms: fields that share a name take the same value
- M3: Save asks before writing over a changed file, one tab per file, locked autosaves
- fix(redact): size image clearing with checked arithmetic
- fix(forms): open a text field on press so dragging over it selects text
- fix(test): reload tests pin the English interface like every other harness
- M7: the Edit tab turns on Edit text & images, as in Acrobat
- fix(edit): keep Edit text & images boxes drawn while page input waits
- fix(organize): draw a rotated page large and centred in its grid cell
- M4: lay out Organize pages as Acrobat's panel
- feat(ui): Shift on a corner handle keeps proportions for comments, stamps, and form fields
- Refuse header/footer Bates numbers that would overflow u64
- fix(preflight): read device colour from content operators, not whitespace-split bytes
- docs: catalog hashes in ATTRIBUTION.toml are updated by hand
- Tabs: show the drop line in front of the first tab
- M0: the every-command test never opens a real file dialog
- Export All Images: zero-pad the page number so files sort in page order
- edit: commit the open paragraph when a click switches text boxes
- Read WinAnsi 0xAD as a hyphen, so search and redaction can see it
- fix(engine): give a host with no clock or time zone a real one (Session::with_wall_clock)
- feat(automation): Automation::render_pixels returns a page as RGBA, without the PNG round trip
- M14: Italian catalog: complete the missing entries
- fix(ui): stop dropping cached tiles when zooming away and back
- test(ui): wait for the text layer by state, not for a fixed second
- fix(print): the Print dialog waits for the printer list instead of offering Save as PDF
- M3: arrow keys follow the Scroll speed preference
- Requeue render requests after parse cancellation
- feat(automation): accessibility_tags lists tags a page at a time, with filters
- feat(automation): bookmarks and links say where on the page they go
- fix(ui): on macOS, dragging a tab moves the tab, not the window
- M10.5: convert print previews to grayscale
- Preserve literal spaces in page-label prefixes
- crypt: property tests for encrypted content, crypt filters and damaged ciphertext
- fix(ui): a shape just drawn resizes from its handles without the Select tool
- fix(cli): render comments the app renders when /AP is missing
- Fix util.printd panic on an escaped multi-byte character
- Reject impossible dates such as Feb 30 in FormCalc Date2Num and Parse
- M5: Make Properties Default in Comment Properties
- M1: keep unknown trailer entries on a full save
- Tests: viewer find test waits by a deadline (flaky under load)
- Add permission-aware selected-text Copy to Edit and context menus
- M6: expose dropdown and list-box field alignment
- M14: correct localization and installer parity statuses (gap 24)
- M1: repair exhausted xref hints without object-number overflow
- M10: Windows print jobs show per-sheet progress; printers list faster (follow-up to #944)
- Keep selected form values and page content through later edits
- M7: keep line breaks when editing a multi-line paragraph
- MCP: confine file access with --automation-read-root and --automation-write-root
- fix(macos): Cmd+Q asks about unsaved changes
- M3: scroll the view when drawing at an edge; take back a polygon's last point
- M2: preserve inline-image pixels when rewriting page content
- Perf: defer marker and link index scans until first use
- M12: tag unstructured AcroForm widgets
- M12: find untagged accessibility content
- feat(ui): preference to hide author-only highlight hover previews
- Print: 4 x 6 in label paper and a Label layout for shipping labels
- M12: show structure tag content
- Keep added text selectable over form fields
- M7: Cut, Redact, Create Link and Recognize Text in the picture menu; keep the menu open
- M6: preserve XFDF field text around XML comments
- M14: store XDG preferences in configuration directory
- M7: grow text boxes and edit existing text
- M6: make list boxes directly selectable and scroll to selection
- Complete the Arabic (العربية) catalog: every missing row translated
- M1: edit finds the pages a damaged file's readers find
- M14: Fix(nixos): discover installed UI fallback fonts on NixOS
- M6: preserve carriage returns in form CSV exports
- M6: export valid XML tags for Unicode field names
- Keep annotations readable under reading colours
- Comments panel: page groups fold from their chevron
- M3: Wayland: stop retaining Ctrl zoom for pixel-only wheel input
- Tests: the signing test's password meets the 8-character minimum
- fix(parity): merge the keys concurrent merges left twice in acrobat-features.toml
- fix(i18n): zh-hant had two keys twice after concurrent merges
- Tests: repair stale save and search regressions without weakening validation
- Fix main UI regressions in paging, fonts and test expectations
- i18n: fill Vietnamese and Lithuanian coverage gaps on main
- Read the Annex D.2 alias codes as the ink they draw, in both tables
- Score reading order in the text oracle, which word F1 cannot see
- Record the day's two changes in the roadmap and gap 12
- fix(render): faster sampled functions, image decodes across zoom levels and patch meshes (vendored hayro-interpret patches 31–33)
- fix(ui): validated signature display, snapshot tab reuse
- ci: add nix check workflow
- test: retain open regressions and deterministic fixtures
- M8: the redaction audit finds a cover over one word of a long line
- Resolve remote links and document-supplied output names safely
- M6: preserve complete plain XML form values
- deny: acknowledge the new zbus unmaintained advisories
- M6: preserve whitespace in XML and XFDF attributes
- fix(filters): preserve output-limit errors in raw Flate fallback
- Read stream-boundary comments as the renderer does, and isolate new marks from appended graphics state
- @Luchsen made their first contribution in
- @tylerstoltz made their first contribution in
- @s17sh70x2jfl031ag made their first contribution in
- @manchitmr made their first contribution in
- @alexanderalber made their first contribution in
- @duydev made their first contribution in
- @ehinderer made their first contribution in
- @regendorf-ux made their first contribution in
- @andreero0 made their first contribution in
- @vangel76 made their first contribution in
- @alehel made their first contribution in
- @Osaym made their first contribution in
- @lava made their first contribution in
- @tydude001 made their first contribution in
- @Dev-next-gen made their first contribution in
- @osaidahmed made their first contribution in
- @txiki739 made their first contribution in
- @sampaiodias made their first contribution in
- @jonathanwxh-cell made their first contribution in
- @michaelsh1 made their first contribution in
- @lhymes made their first contribution in
- @atahabilder1 made their first contribution in
- @abc2cb made their first contribution in
- @adrianiglesiass made their first contribution in
- @Silvertree2010 made their first contribution in
- @abszar made their first contribution in
- @midasmatterhorn made their first contribution in
- @bonfim6P made their first contribution in
- @kcobelli-pixel made their first contribution in
- @tisca26 made their first contribution in
- @amoisttowe1 made their first contribution in
- @cortenburg28-arch made their first contribution in
- @DCM4711 made their first contribution in
- @TKIPisalegacycipher made their first contribution in
- @isaac-levine made their first contribution in
- @Ace40063 made their first contribution in
- @hasan-sdaif made their first contribution in
- @tomasmark79 made their first contribution in
0.8.0Big update
- Add a PR template, and record the review practice and external-PR bar
- F1 + F2: exact standard-14 metrics, and code-to-Unicode completeness
- Retire inherited resources
- Fix Lab Bradford adaptation to use LMS white-point ratios
- M7: keep a neighbouring line when replacing text
- fix(render): Type 3 text ignores rendering modes other than invisible (vendored hayro-interpret patch 27)
- fix(edit): flattening form fields also drops the ones whose widgets are on no page
- fix: allow links beneath highlight annotations
- M12: move tags in the order panel
- Desktop: prepare large PDFs off the UI thread
- fix(ui): dragged added text follows the pointer before release
- fix(organize): normalize rotations before adding so large quarter turns cannot overflow
- Allow mouse-wheel scrolling during text selection
- fix(audit): a rectangle drawn as an m/l path is a cover like re
- docs: merge the duplicated Auto paragraph in localization.md
- M0: label local builds in --version, About and the package release
- fix(xfdf): preserve quoted empty CSV values
- Issue #1058: an update keeps the desktop shortcut only if it is still there
- Name the failing option and page count when a chained edit page is out of range
- Fill & Sign: don't show the comment hover popup over placed text
- XFA: a script's time starts when its context is ready, and a value reaches every field bound to its data node
- Detect rectangular form fields drawn with closed line paths
- Fix single-click freehand drawing
- fix(edit): move existing text by its frame, and selections with the arrow keys
- fix(ui): keep a closed right panel closed when opening a document
- M13: Run conversion, OCR and optimization over folder trees
- Telugu interface: draw with an installed Telugu face when the build has none (part of #1531)
- Save: fall back to a plain fsync where a volume refuses the full flush
- macOS: start on wgpu on Intel Metal by skipping indirect-call validation
- Sanitize suggested attachment save filenames
- Security: fix three audit findings in redaction and signature validation
- M4: Add open documents leaves out the documents already in the Combine list
- M4: copied pages keep the resources they list only up the page tree
- Preserve IME composition in command search
- XFA: place positioned objects by their anchorType
- Export all images: CMYK JPEGs keep their colours instead of coming out as negatives
- CLI: text refuses a document that doesn't allow copying
- control: cap line length before auth
- Render: a soft mask shrunk below its size is filtered, so thin strokes drawn through it survive
- fix(organize): Document Properties also change the XMP title and author
- M13: Bound automation text caching and preserve partial search results
- fix(ui): a rule skipped by hand stays with its document
- fix(ui): ui.click and ui.drag refuse coordinates that overflow
- Windows: open a path a launcher passed unquoted and split at its spaces (closes #1455)
- fix(ui): Combine flags the same converted file added twice
- fix(text): keep doubled narrow letters in condensed text
- fix(print): custom pages-per-sheet counts no longer overfill sheets
- fix(ui): the accessibility check keeps a saved page range inside the document
- fix(ui): the PDF/A dialog shows a declared PDF/UA
- M12: write reviewable tags for text-only PDFs
- Keep undrawn comments and accurate search hits
- M10: BigTIFF and strict GIF detection in Create PDF; XDP data in format parity
- M5: keep stamps upright on rotated pages
- M7: keep Arabic ActualText ligatures in their word
- fix(text): read a TrueType font without an encoding as WinAnsi
- M3: confirm before opening absolute GoToR paths
- M2: keep byte boundaries in packed TIFF-predictor rows
- M4: preserve shared Type 3 glyph resources during extraction
- M13: scan each directory once in CLI checks
- Issue #1396: remove an imported digital ID
- M3: draw a GNOME-style title bar on Wayland
- fix(ui): preserve native open actions and password prompts
- Pick up craft-print's native Windows printing
- F3: one documented font-substitution chain, and report what it chose and why
- M3: drag tabs to reorder them, and Ctrl+Tab to switch between them
- M10: Sync automation saves before replacing the destination
- fix(ui): a file version found before a save is not applied over it
- M1: a save that doesn't reopen is refused before it replaces the file
- @webdevtodayjason made their first contribution in
- @Mahmud-Baspehlivan made their first contribution in
- @bmh129 made their first contribution in
- @UmbertoCimmino made their first contribution in
- @fabian-co made their first contribution in
- @CouchRiv made their first contribution in
- @MrPranklin made their first contribution in
- @ThatGhost made their first contribution in
- @mtlcl410 made their first contribution in
0.7.1Big update
- Adopt shared panel docking with document-aware visibility
- Print: Windows lists its printers and spools jobs
- M10: Windows printing prints at actual size, off the UI thread (follow-up to #847)
- ci: refactor workflows to use storytold/craft-common-actions
- Text extraction: word gaps follow position on the line, not drawing order
- M7: watermark offset from the page centre (edit.watermark-appearance)
- M12: XFA script time limits start when the engine is ready
- Linux: draw on the GPU the Wayland compositor draws with
- doc_create from text refuses characters Helvetica can't draw
- Linux: StartupWMClass is the window's app id
- M4, #569: Combine files takes images and text files
- Return renderer initialization errors to the OpenGL startup fallback
- Forms: encode appearances with the existing simple font
- Forms: keep the accepted value when Tab wraps to the same field
- CLI: reject malformed --root options before dispatch
- Edit images: moving or resizing a clipped image moves its own clip too
- M2: stream page content past the 256 MiB cap (item 1 of storytold/pdfcraft#623)
- XFA: single-block forms paginate, open in their saved state, and show their signatures
- UI: a tool chosen with no document open asks for a file and runs on it
- M14: Enumerate form fields once on open
- Top bar: the Save button names its shortcut instead of "(M4)"
- M14: correct Taiwan Traditional Chinese accessibility and form terms
- M10: Enhance camera image finds the document's edges; rotate, crop or organize after Enhance page (part 3 of #1008)
- M9: stream structure-tree checks without a total-element cutoff
- fix(macos): close the empty main window with Command-W
- fix(xfdf): combine imported annotation flags with bitwise OR
- feat(macos): declare document icon file for PDFs in Info.plist
- macOS: the tab strip is the 28 pt band the traffic lights are centred in
- Issues #444, #186: a mouse wheel scroll speed preference, faster by default on Windows and Linux
- fix(ui): bookmark, comment and command filters match Turkish İ/ı in any case
- fix(annot): create mailto links for bare email addresses
- Fix/noissue hyphenated print label ranges s20261010 t220019 z f82d4
- macOS: "Reopen the files that were open" starts from the system reopen-windows setting
- Keep Border and Fill color palettes independent in field Properties
- M2, #1060: axial and radial shadings draw as native gradients (InDesign fades 10× faster)
- UI: theme picker with light and dark theme cards
- Docs: sync the progress docs with issues closed on 2026-10-10
- Fix plural forms for recent document page counts
- Read mode: the rail's Bookmarks and other pane buttons open their panels
- Issue #948: the root-confinement test tries the symbolic-link escape only when the link was made
- fix(measure): include closing edges of every filled PDF subpath
- demo-pdf: two fixes so xtask demo-pdf and xtask screenshots work on Windows
- M7: shard Japanese Type 3 fallback fonts across large edits
- Typed signatures draw Cyrillic and Greek letters
- M7: shard Arabic generated glyph fonts instead of rejecting large text
- M9: sign with CAC/PIV smart cards through the macOS Keychain
- M10: stream Create Multiple sources without a fixed file-count cutoff
- M11: strip redundant ASCII stream wrappers during optimization
- text_find stops reading pages once its limit is reached
- M14: a chosen interface size is absolute, as in PhotoCraft
- docs(ocr): add model download step to build instructions
- M2: keep non-interpolated minified images sharp
- docs: register the MCP server from an installed release
- M12: add deterministic snap property tests to the measure crate
- Windows: Save asks where to keep an Outlook attachment instead of writing its temporary copy
- Chinese UI: draw with an installed Chinese face when the build has none
- fix(ui): preserve scroll position when collapsing or resizing sidebars
- render: don't let a hostile page-tree /Count abort inspection
- xfa, xfdf: refuse XML nested past 1024 levels instead of aborting the process
- M2: overlapping text runs stay whole; placement in arrange, bounded checks
- pt-BR: lowercase month names in the date picker
- M9: visible digital signatures can show a drawn, typed or image graphic
- Issue #568: honour the document's copy permission (Table 22, bit 5)
- Viewer: Continuous scrolling is an independent checkbox over the base layout
- M4: open Organize Pages as a selectable thumbnail overview
- Add an opt-in low-disk Cargo profile
- Select tool: trigger multi-click text selection on pointer press
- M14: scan PdfCraft page-content markers once per document refresh
- Open dialog: allow selecting several files at once
- Issue #431: reload a document when its file changes on disk
- fix(annot): validate finite link areas before add or edit
- Add faux-redaction audit (paint-order and colour-aware, fail-closed)
- fix(ui): prevent translated tool labels from overflowing and align German terminology
- chore: bump github actions to fix Node 20 deprecation warnings
- On-page text boxes keep a dark caret on their white backgrounds in the dark theme
- Render visible pages before thumbnails and text extraction
- Print: start PowerShell on Windows by its full path
- Comments: line breaks saved as CR show in comment text
- Cap unbounded editing and text caches; index form fields once
- Fix text selection cursor on all tools toggle(View More - View Less Button)
- Print: architectural paper presets and PDF scale controls (#599 follow-up)
- M10: Enhance camera image cleans the photo up and chooses its look (part 4 of #1008, closes #1034)
- Security: fix 10 verified audit findings in redaction, signature validation, and untrusted-input handling
- feat: Scale down large signature images instead of rejecting
- Forms: keep tiles and render unbaked field values during page re-render
- Issue #995 & #1077: unlock a restricted document with its permissions password
- Tests: consolidate safe ui-egui integration targets
- fix(theme): complete Linux System appearance tracking
- Issue #432: global Units preference (mm, cm, in, pt), defaulting to the system region
- Give dialogs roomier text fields and padding
- i18n: let the layers below hand their sentences over, so they can be translated
- Improve PDF Navigation with Cursor-Anchored Zoom and Mouse Panning
- M14: complete the Czech (cs) interface catalog
- M14: Italian catalog review: meaning, agreement, consistency (47 entries)
- M14: Slovenian (Slovenščina) interface language
- Add Greek (el) interface localization
- M14: Kazakh interface language
- feat(i18n): add complete Turkish interface language support
- Content edits on heavy documents: narrow refresh, cached appearances, per-page invalidation
- M7: Hebrew in Edit text (reading order, writing order, Hebrew glyphs)
- Heavy pages: cull off-tile images, cache decodes, preview backdrops, calmer queues
- M14: text the fonts can't draw is kept and reported, never written as ? silently
- M7: support shaped Thai text in Add Text and UI fallback fonts
- M7: preserve overlapping text when dragging paragraphs
- Bound materialized text search matches
- XFA: import and export data files, and pictures for image fields
- docs(contributors): add Ufuk Efe to people.toml
- Issue #1185: Protect refuses passwords that encryption would make empty or equal
- M14: keep structural page order through inspection
- Raise workspace rust-version to 1.95 to match the UI crate
- M5: preserve comment identities during partial XFDF and FDF imports
- Test PDF viewer trackpad pinch zoom
- M4: replace selected pages from organize toolbar and context menus
- UI: checkboxes and radio buttons are outlined, and checkboxes are square
- M14: "Edit with PdfCraft" on the File Explorer menu of PDF files
- M2: bound the total size of page-label prefixes
- Windows printing: two-sided binds on the chosen edge; note drivers that ignore Two-sided
- Issue #1028: OCR can read pictures on pages that already have text
- M14: choose Tools panel side in Preferences
- Show annotation actions beside selected text
- i18n(es): add 84 missing rows, consistent tú register
- Linux: prefer server DPI over panel physical DPI in vendored winit
- M2: keep doubled short text runs from interleaving
- docs: sync Earl Co contributor name from GitHub
- Accessibility: identify structure objects in checker findings
- Accessibility: edit structure tag properties through tools
- Accessibility: export before-and-after review record
- M10.5: Adopt craft-print spooler with Windows printing fixes
- Preserve source fonts in text editing and resize clipped artwork
- Polish chrome hover, press, and selection
- Edit text: support Devanagari system font fallback and Indic pre-base matra reordering
- Fix Word invoice layout and pagination
- M5.7: Fill & Sign Scan tab for photographed signatures
- M4: rename colliding form field names when combining (organize.field-name-conflicts)
- M10: Create separate PDFs from multiple files
- Comments panel: show Persian and Arabic comments in reading order
- M10: Presentation (.pptx) export
- Add editable page-range selection to Organize Pages
- M14: edits let go of the previous working file before writing the next (gap 13)
- Accessibility: show figure findings on the page
- Fix viewport jitter when annotating with search active
- Automation tests: isolate workdirs by call site
- M0: validate the committed parity manifest in xtask tests
- M7: report unsupported document link actions accurately
- M5: Insert text snaps its caret to the text
- Accessibility: compare checker results after each recheck
- M5: quick-bar colour recolours the selected comment
- Redaction: add case-sensitive and whole-word search options
- control: close the connection on malformed input before auth
- M10.5: load driver options for CUPS printer instances
- Units: read the Windows measurement system from the registry, not reg.exe
- Accessibility: reorder sibling structure tags through an undoable tool
- Accessibility: export before-and-after review as HTML
- Refine Greek localization and May abbreviation
- Resize exclusive image crops across nested states and content streams
- honour the /Lab colour space /WhitePoint
- Accessibility: persist human review decisions for an exact PDF revision
- Accessibility: add visual tag properties panel
- M10: print from the web build through the browser's print dialog (gap 4)
- M7: open local GoToR PDF links natively
- M3: follow Windows' Animation effects setting; add an Animation effects preference
- Reading colours: replace document colours for reading comfort
- Accessibility: keep manual review visible in checker summaries
- Tests: normalize generated streams in Arabic output golden
- Comments: "Other colour…" picker and recent custom colours under the swatches
- M3: add PDF tab context menu (fixes #1233)
- M14: tune Windows low-DPI JetBrains Mono hinting
- Text extraction: honour /ActualText, so Thai from Chrome PDFs is searchable
- feat(edit): remove all links command and context menu
- M12: say when a form's scripts were turned off
- XFA: one script thread per event, and the live form kept up to date in place
- xtask: stop headless Chrome leaving macOS code-sign clones
- Issue #1296: hayro-syntax applies SASLprep to AES-256 passwords (PdfCraft patch 16)
- M3: match Greek final sigma in case-insensitive search
- Clean form tag references
- M12: accept literal digits in date formats (dd.mm.26)
- CI: keep craft-fonts enabled across Linux Rust gates
- CI: run dependency layering once per workflow
- CI: keep line tables instead of full workspace debug info
- test(cli): reject unknown MCP options
- Refine search match selection and text failure jitter handling
- Fill & Sign: choose text and date font size
- fix(xfdf): text data from a one-field form keeps its commas
- CLI: audit rejects unknown options before reading the file (fixes #1332)
- fix(preflight): find colour operators after any PDF whitespace
- fix(sign): a signature field with a null /V can be signed by name
- fix(redact): removing comments keeps non-comment annotations
- fix(print): refuse huge posters at the sheet limit instead of overflowing
- M7: preserve Arabic text order in copy, search and editing
- M2: snap shrunk interpolated images to whole pixels so scans stay sharp
- M14: Preserve recovery snapshots without readable metadata
- fix(fonts): a composite /W run past the last CID stops there
- fix(ui): the Fields panel lists a field on a missing page as unplaced
- fix(automation): content_update refuses text styling on an image
- fix(forms): a whole look keeps the rest of an indirect /MK
- fix(forms): a literal Off value reads as Off outside buttons
- fix(fonts): a /Differences code past 255 no longer encodes as its last byte
- Issue #1368: keep text a dragged paragraph passed over
- M7: Preserve explicit page ranges across dialog redraws
- M3: select an image on the page and copy it
- fix(cli): edit refuses move/insert destinations past the end
- fix(sign): refuse to sign a field whose /V is not a signature
- fix(forms): keep a whitespace-only value in a text field without a format
- fix(content): skip an inline image with an unreadable key to its EI
- fix(automation): doc_save reports a required full rewrite as not incremental
- fix(audit): an identity cm between re and fill no longer hides a cover
- fix(ui): Current page prints the viewed page, not a page labelled with its number
- fix(render): draw Turkish Ğ İ Ş ğ ş in non-embedded fonts
- M10: edit OCR text on scanned pages so the change shows
- Edit text: support per-font visual-order Indic text and nukta reordering
- M12: preview text structure proposals for auto-tagging
- M10: Test current-page print previews and saved output
- fix(content): count an unreadable inline image with no EI as skipped
- feat(ui): add command palette arrow-key navigation
- M4: Fix Combine duplicate warnings and cache their computation
- feat(preflight): verify image resolution and bleed without rewriting the file
- M14: add Lithuanian interface and date localization
- M1: write a valid xref when an incremental save has no objects
- Release workflow: pass the Azure signing secrets
- @dylanmtaylor made their first contribution in
- @arcanii made their first contribution in
- @atoslins made their first contribution in
- @sibrash4 made their first contribution in
- @huferyliu made their first contribution in
- @piero-83 made their first contribution in
- @EULArule made their first contribution in
- @michelleDeko made their first contribution in
- @MaxTheHaters made their first contribution in
- @magdale76 made their first contribution in
- @Totopo27 made their first contribution in
- @luniiya made their first contribution in
- @Ridzzz0Alam made their first contribution in
- @neronek22 made their first contribution in
- @pechnikov2026-star made their first contribution in
- @sfv9 made their first contribution in
- @mjohnson7cd made their first contribution in
- @sawizzle made their first contribution in
- @art804 made their first contribution in
- @YingQiu0871 made their first contribution in
- @omarelders made their first contribution in
- @pkibiego made their first contribution in
- @WladmirJunior made their first contribution in
- @kestrel99 made their first contribution in
- @lukashold made their first contribution in
- @krinry made their first contribution in
- @LucasT-dev made their first contribution in
- @ejbarraza made their first contribution in
- @nicholasyoannou made their first contribution in
- @durtyrobbin made their first contribution in
- @JeremyYao made their first contribution in
- @Piohrun made their first contribution in
- @coygeek made their first contribution in
- @mhadidi06 made their first contribution in
- @Losminek made their first contribution in
- @spacekomet made their first contribution in
- @Camthalion77 made their first contribution in
- @yeniufuklar-com made their first contribution in
- @tzagim made their first contribution in
- @kekeandzeyu made their first contribution in
- @PuemMTH made their first contribution in
- @FredApps made their first contribution in
- @rp6186030 made their first contribution in
- @MMexicann made their first contribution in
- @earlvanze made their first contribution in
- @ymote made their first contribution in
- @diegozpy made their first contribution in
- @komo1iddin made their first contribution in
- @lollinoo made their first contribution in
- @Bjorneseth made their first contribution in
- @itrycodinganditsbad made their first contribution in
- @srt8hellcat2-ui made their first contribution in
- @SteamSmith made their first contribution in
- @ngrafton2006 made their first contribution in
- @git-monchiant made their first contribution in
- @nevicia2010-hub made their first contribution in
- @not-a-feature made their first contribution in
- @aparcar made their first contribution in
- @mhmdeve made their first contribution in
- @marcoarnulfo made their first contribution in
- @umesh429 made their first contribution in
- @YouseifUS made their first contribution in
- @philip-tam made their first contribution in
- @LabDennis made their first contribution in
- @FrancescoClemeno made their first contribution in
- @TheLastRoadRunner made their first contribution in
- @TanguAchilis made their first contribution in
- @Morpheus004 made their first contribution in
- @Baltsar made their first contribution in
- @tdslot made their first contribution in
0.6.0Big update
- M3: tiles skip paths that can't paint them (item 5 of #623)
- M3: harden render and CLI failure surfaces
- Print: list driverless CUPS destinations, not only permanent queues
- Wayland: IME keeps working after a seat loses a capability (winit#4747)
- Windows: the Korean IME composition caret sits after the syllable (winit#4746)
- Windows: a window closed maximized reopens without a white flash (winit#4587)
- X11: the input method follows the text field that has focus (winit#4727)
- macOS: IME text committed after the marked text is cleared isn't lost (winit#4650)
- macOS: an unfinished composition doesn't come back in the next text field (winit#4745)
- macOS: emoji from the emoji picker reach text fields (winit#4749)
- macOS: Space in Apple Korean with no syllable in progress types one space (winit#4478)
- macOS: the first Apple Korean key in a fresh PdfCraft composes (winit#4744)
- M3: document why fixed-zoom sizes differ from Acrobat (no runtime change)
- Desktop: log renderer details for display-scaling diagnosis
- M7: normalize PDF font descriptor flags to u32
- About dialog test: wait for each control to stop moving before clicking it
- M3: cover suspended raster resource ownership
- M4: audit that undo and redo never replay field scripts
- M2: pin output across worker counts
- M2: cover inherited form resource contexts
- M6: reject out-of-domain field flags
- M5: unify annotation flag parsing
- M3: make multi-document raster allowance test deterministic
- Sign: long digital ID names stay inside the picker
- Issue #727: tell the user when GitHub rate-limits update checks
- M2: decouple content tokenization from slices
- M2: key soft-mask cache by inherited resource context
- create: lift TIFF decoding buffer limit to allow print-sized images
- Windows: declare Per-Monitor V2 DPI awareness in the executable manifest
- CI: require Windows executable resources in Windows builds
- Close the command palette on outside click
- M2: cover form recursion cycles
- M3: test stitched render partitions against whole-page output
- M2: cover tiling pattern recursion cycles and finite nesting
- M5: preserve strokes with malformed interior colors
- Sign: decide Windows store keys in code every platform builds (follow-up to #646)
- Issue #666: images made into a PDF keep their ICC profile
- M14: side panels keep their width after a resize
- Sign: smart cards and tokens in the Windows store ask for their PIN
- M2: pages with /UserUnit are shown at their size in points, as in Acrobat
- M2: text turned at any angle reads as lines along its own baseline
- M2: cancel obsolete in-flight requests
- PDF/A: no sRGB output intent for CMYK documents, and pdfa_verify checks the intent's colour space
- Windows: single instance, launches started together share one window
- M8: redaction code sets (U.S. FOIA, Privacy Act) as overlay text
- M14: View menu, tooltips and Keyboard shortcuts show Ctrl, not ⌘, off macOS
- M14: Arabic interface language
- M4: keep the render pool across metadata edits
- M9: the signer's certificate must allow document signing (key usage, EKU, critical extensions)
- M9: sign and timestamp encrypted documents
- Extract pages: a File name field names the extracted files
- M4: bookmarks from tagged headings (organize.bookmarks-from-structure)
- M8: redact lists of words or phrases (protect.redact-word-lists)
- M3: make render watchdog regressions deterministic
- Progress docs: re-measure against Acrobat Pro 26.002, adopt the progress-docs standard
- Measure: snap to the implicit closing edge of filled paths
- fix(organize): reject rotation angles that are not multiples of 90
- Autosave: snapshot a new unsaved document before its first edit
- OCR: Recognize text in multiple files refuses paths outside the root
- fix(text): match phrases across repeated whitespace
- fix(edit): keep a comment whose appearance is missing when flattening
- fix(comments): keep a reply to a reply in the comment listing
- Issue #774: keep the catalog out of object streams in encrypted files (Acrobat)
- fix(edit): refuse a header start number that would wrap the next page
- OCR: a scanned euro sign reads as €, not E
- fix(comments): include replies to replies in the comment summary
- fix(xfdf): drop the replaced note's popup when re-importing a comment
- fix(view): check Shift-Command-G before Command-G for find navigation
- fix(editing): recognize paragraph drafts as unsaved work
- fix(automation): retain batch results with identical filenames
- M13: preserve desktop Action Wizard batch results
- Fit to width fits the shown page in single-page view
- fix(links): find URLs when lowercasing changes the text length
- organize: deleting the opening page drops the catalog OpenAction
- fix(text): Turkish dotted and dotless i match in case-insensitive search
- XFDF comment exchange keeps polygon and polyline vertices
- XFDF keeps a callout's leader, text-box inset, intent and arrowhead
- Web: warn before reloading a document with unsaved changes
- Issue #813: a cancelled recovery password no longer attaches to the next unlocked document
- Viewer: touchpad scrolling tracks the finger 1:1
- Keep every part when bookmark titles repeat in doc_split
- Windows: add reproducible security diagnostics for storytold/pdfcraft#747
- Security notice wraps beside its buttons instead of running under them
- M10.2: scan JPEG metadata beyond frame headers
- Issue #878: Combine stores an image once when its colour space is an indirect name
- organize: drop named destinations and their links when a page is deleted
- JavaScript: limit util.printf widths and output, and array arguments
- Linux: "Use system setting" asks the desktop, not winit
- Extract/Combine: a page repeated in one selection gets its own annotations
- Fill & Sign tools pick up placed signatures to move and resize them
- Web: opt-in embedding bridge for host pages (?host=parent)
- Print: a scaled annotation appearance no longer prints larger than its rectangle
- Single instance: enable tab handoff in Windows portable mode
- Issue #390: build the DMG with hdiutil create so the app passes codesign --strict
- M4: make page-label generation lazy across large documents
- lopdf: bound compressed-object lookups and object-stream members
- hayro-syntax: cap the nesting of direct arrays and dictionaries
- M11: Reduce file size shrinks office scans, and never saves a bigger copy (refs #490)
- M11: Reduce file size and Optimize PDF drop images nothing draws, such as a deleted image
- M9: name the Windows store certificates that can't sign
- M12: XFA rows in areas get their instances
- Exported images keep their transparency, JPEG cut-outs included
- Fill colour for rectangle, oval and polygon comments
- M14: localize displayed shortcut key names
- M3, #740: column select (Alt/Option-drag, or Edit ▸ Column select)
- Combine files: a thumbnail grid, card sizes and card actions (1 of 3, refs #611)
- Combine files: expand a file into its pages (2 of 3, refs #611)
- Combine files: move and remove single pages before combining (3 of 3, closes #611)
- M14: Add Polish interface language
- Issue #870: keys leave the document under a dialog alone
- fix(redact): Turkish, German, French and Italian month names in the Dates pattern
- fix(redact): the Email pattern finds internationalized addresses
- fix(create): read UTF-16, byte-order-marked and Windows code page text files
- fix(crypt): R2–R4 passwords with non-ASCII characters open (PDFDocEncoding)
- M14: interface size preference; Auto follows GNOME text scaling
- M7: keep embedded CMap ranges compact instead of truncating expansion
- M4: traverse large bookmark trees lazily without dropping later items
- M14: give Windows PDF files a dedicated document icon
- Edit PDF: select and move multiple objects together
- Edit text: white or pale text is edited on a dark box instead of vanishing on white
- Fill & Sign: Add text keeps what was typed on click-away, and its box grows
- Select tool picks up a signature placed over a form field
- Drawn signatures and drawings resize from their handles
- Bump to 0.6.0; add a Linux riscv64 release build
- @mmmaarian03-crypto made their first contribution in
- @Hathor875 made their first contribution in
- @oussama-dalhi made their first contribution in
- @Toddpe made their first contribution in
- @benimaru327 made their first contribution in
- @abdelhaqelamraoui made their first contribution in
- @silverhadch made their first contribution in
- @muraa-p made their first contribution in
- @ch0kemeister made their first contribution in
- @Ni-zav made their first contribution in
- @snipeTR made their first contribution in
- @gyurix made their first contribution in
- @CyberFox-81 made their first contribution in
- @A-viral-dev made their first contribution in
- @taylorandrew07-lab made their first contribution in
- @80aa08 made their first contribution in
- @jay-tau made their first contribution in
- @mitul72 made their first contribution in
- @joeabouserhal made their first contribution in
- @dsskaggs-ai made their first contribution in
0.5.0Big update
- Issue #166: Save, Print and Export include the text still being typed in a form field
- V, H and Space pick the Select and Hand tools
- M14: Arabic and Hebrew file names render in the tab strip, recent files and Properties
- M3: find text in mixed horizontal and vertical PDFs
- Add a complete French UI catalog
- Run set-layer-visibility actions from links and push buttons
- M10: select pages in the Pages panel and print the selection
- Issue #159: open .p12 files with trailing whitespace, PEM armour or base64
- Issue #173: a failed ?file= startup fetch is reported in the app
- Sign with digital IDs from the Windows certificate store
- Validate discard_changes before closing clean documents
- XFA: run FormCalc scripts
- M7: preserve ideographic spaces when rewriting paragraphs
- M14: complete Simplified Chinese About credits and multiline guidance
- Windows MSI: reject per-user overrides and retain progress text
- Security: create save staging files with create_new (follow-up to #164)
- M4: Combine files in its own tab, with a sortable table and unlocking of protected files
- Issue #236: the Save-changes prompt shortens very long names to fit the window
- Reject invalid page selector types before combining PDFs
- Issue #263: combine, extract and split keep the PDF/X output intent and identification
- Security: print jobs, new digital IDs and the --control file no longer write through planted links
- Security: refuse mailto attachments, show link hosts in punycode (follow-up to #104)
- Issue #124: a long page label no longer overlaps its bookmark title
- Add image signatures with placement preview and resize controls
- Issue #290: File ▸ Open Recent lists the recent files
- M13: pdfcraft-cli mcp --compact lists 12 tools and finds the rest by search
- M14: Telugu (తెలుగు) interface language
- Platform: one save-staging helper for automation and the desktop app (follow-up to #319)
- Clippy: as_chunks in the signature image test (follow-up to #335)
- Update image signatures live during resize and movement
- Issue #157: the Windows portable zip keeps settings, logs and recovery beside pdfcraft.exe
- M10.2: Create PDF from multiple files, edited as pages in the Organize grid
- Add my contributor name (cyfung1031)
- render: apply W/W* clipping after every path-painting operator
- View: page rasters map texel for texel onto the screen (sharp text at any zoom)
- M11: Optimize PDF and Reduce File Size run in the background with a progress bar
- Forms: round required-field border on radio buttons; Highlight fields is remembered
- Ink strokes are drawn as smooth curves through their points
- Fix toast wrapping and the Linux search shortcut hint
- i18n: add Russian (ru) interface translation
- render: draw non-embedded Japanese CID fonts with a craft-fonts face
- Comments without an appearance stream are drawn (display only, never saved)
- Home: pin folders and list their newest PDFs
- Issue #295: three clicks select the line, four clicks the page
- Linux: accept file:// URI args so desktop launchers recognise pdfcraft as PDF default
- M7: report Japanese Type 3 fallback font names
- FDF: replies and review status keep their parent comment (fixes #333)
- Preserve CLI results when diagnostics fail and validate page arguments
- Keyboard shortcut to enter page number to jump to
- M7: preserve Japanese Gothic fallback family and weight
- M3: render pool renders each request once when the caller re-sends it
- CI: no macOS on PRs or main; macOS is built and tested by releases
- M1: enforce decoded limits on unfiltered COS streams
- M2: handle Unicode dates and preserve inspection fallback pages
- M7: pick a Japanese fallback face that has every glyph of the edited text
- Never crash: CMap parsing can't panic, overflow or run away; tokens need no spaces
- tests: pin the interface language so the suite passes outside English
- Issue #225: a closed Comments panel stays closed when picking comment tools
- Export to Word: detect tables of at most 63 columns, Word's limit
- Comments: a new highlight opens its note for typing
- M2.6: non-embedded Mincho fonts draw half-width katakana
- Phone photos follow EXIF orientation; image signatures stay upright on rotated pages
- Issue #425: long file names and paths on Home end in "…" before the row's details
- Keep document view state consistent when closing tabs and reverting
- Edit text: fast drags on a paragraph's edge no longer get dropped; add a left-edge handle
- M4.6: search bookmark titles
- M3: keep overflowed document tabs reachable
- sign: read the .p12 files Windows writes (BER, not DER)
- Never crash: dash patterns can't exhaust memory or hang the renderer
- M3: renders of a dropped render pool stop at the next operator
- M3: rendered pixels are moved out of the pixmap, not copied
- M1: incremental saves are allocated once at their exact size
- Issue #442: reopen the files that were open when PdfCraft last closed
- M14: Bulgarian (Български) interface language
- M2: bound lopdf predictor scratch to available samples
- M5.7: keep natural-size image stamps upright on rotated pages (#434, partial)
- macOS DMG: branded window background and icon layout
- Tests: serialize wgpu rendering in fill_sign.rs (Windows ARM64 crash)
- Never crash: JBIG2 symbol dictionaries can't loop without end
- M7: Arabic in added text (shaping, bidi order, searchable Type 3 glyphs)
- M14: German interface catalog (de)
- Redact pattern: international phone numbers match whole (refs #525)
- Encode the full WinAnsi 0x80–0x9F range: Š š Ž ž Œ œ Ÿ … (refs #347)
- Keep text colour in Word, HTML and RTF export (fixes #526)
- Pen strokes stay unselected and show no author popup (fixes #429)
- ↓ / ↑ turn pages in single-page view (fixes #273)
- Dependencies keep only line tables in dev builds (fixes #454)
- Shift+click extends the text selection (refs #527)
- Issue #430: clear the recent-files list, or remove one file from it
- Typed and drawn signatures stay upright on rotated pages (fixes #299)
- Linux: prefer the discrete GPU on desktops with a monitor on each GPU (fixes #445)
- M1: full saves are allocated at their exact size
- M3: the watchdog stops the render it gives up on
- A newly opened document starts at the top, not where the last session scrolled
- Bookmarks and links go to their destination's position and zoom
- M7: Type 3 fallback glyphs get a well-formed d1, so Acrobat draws edited text instead of bullets
- Never crash: fall back to OpenGL when wgpu can't start
- Issue #537: pdfcraft-cli --help prints the full usage
- Forms: radio groups and check boxes accept their /Opt export values
- Issue #324: on Windows 11, a window dragged to another monitor takes its scale
- de: translate labels that reach tl!() through variables; fix name collisions and wrong meanings
- M14: Hungarian interface catalog (hu)
- M1: stream data read from a file points into the file instead of being copied
- M3: rasters reach egui without a copy on the UI thread
- M14: refine German labels and prevent translated UI text overlap
- i18n: add complete Ukrainian interface translation
- M6.2: check boxes with non-UTF-8 state names show their mark when clicked
- M6.2: form fields in Unicode CID fonts show Japanese instead of "?"
- M7: edit text: Cyrillic/Greek replacement text no longer fails in serif lines, and is spaced proportionally
- Forms: rotate field widgets with /MK /R
- M5: draw all ten PDF line-ending styles
- Issue #125: page text the standard fonts can't draw is refused, not written as ?
- M2: normalize JPEG2000 samples without overflowing
- Never crash: decompression bombs can't exhaust the renderer's memory
- Never crash: mesh shadings can't exhaust memory or run for minutes
- Fix: High-precision float mantissa overflow in hayro-syntax, causing warped display of some PDFs
- M2: bound page-label traversal and output
- View: keep earlier tiles on screen while a zoom's new tiles render
- Fix main CI: move the rotated-field render test out of pdfcraft-forms (layering)
- View: the middle button pans instead of drawing with markup tools
- Pages panel: keep a short page current; context menu and drag to reorder
- M4: zoom the Organize page grid
- Flatten Fill & Sign marks when saving
- Fill & Sign: date format and date language in Preferences (refs #158)
- M10: Print ▸ Properties… opens the printer driver's own settings
- Reduce large-PDF memory growth
- pdfcraft-cli --help lists mcp only when the build has it
- M14: honor Windows display language with neutral launcher locales
- D5: READMEs for cos and engine
- Preserve alternate appearances and indirect push-button values on redraw
- M7: select and edit grouped PDF figures (Form XObjects)
- XFA: choice lists, signature, password, image and barcode fields; PNG and GIF pictures
- MCP: common command tools, session resources and client hints
- D2, D3: fuzz every tool's arguments, and prove root confinement
- Fix main CI: remove duplicated forms redraw tests (E0428)
- Parity: cite the MCP resources test by its merged name
- Release: standalone Linux CLI archive (fixes #423)
- Decode outline titles with BOMs and raw UTF-8 consistently (refs #142)
- No form bar for push-button-only documents; Screen annotations aren't comments (refs #169)
- Edit text: lines split across content stream pieces are listed and edited (fixes #155)
- Export to Word/HTML/RTF: read text and images drawn by form XObjects (fixes #314)
- tests: pin the interface language in the harnesses added since #502
- M14: clarify Ukrainian wording and restore CI
- M14: correct Hungarian Windows Store and saved-signature labels
- M9: chain building checks CA constraints, key usage, path length and validity
- Ship the OCR models in the desktop release packages (refs #103)
- M9: validate a document timestamp that sits in a signature field
- M9: read BER signatures (DocuSign, Documenso); classify later changes narrowly
- M9: more signature validation algorithms (SHA-3, RIPEMD-160, Ed25519, P-521, brainpool, PSS, rsa_sha1)
- M14: complete the French (fr) catalog
- i18n: complete the Japanese catalog (105 missing strings) and check it like fr/de/ru/zh-hans
- Tell the user when PdfCraft draws without a GPU
- M5: name line endings in the comment properties combo
- M3: preserve local work when a startup URL arrives late
- M2: bound PDF functions and reject invalid calculator operations
- M2: bound image resampling buffers before allocation
- Windows: a window larger than the GPU's texture limit can't close PdfCraft
- Windows: a GPU that can't set up the window falls back to OpenGL
- Tab strip: shrink tabs before scrolling, keep Open in sight; ignore about:blank titles
- CLI: pdfcraft-cli ui refuses a control file another user could plant
- CLI: pdfcraft-cli.exe carries a Windows version resource
- Fix #378: draw on the GPU that drives the primary display on Windows
- Fill & Sign: remove white background from imported signature images
- Pages panel: delete pages from the thumbnails
- Fix non-exhaustive match in Windows signing path
- i18n: add Italian (it) interface translation
- i18n: complete Brazilian Portuguese (pt-BR) interface catalog
- Never crash & persist: Make Current Properties Default and page-display choices survive a restart
- View: draw page previews at the resolution they are shown
- D1: pin and verify the pdf.js corpus
- macOS: add native document integration diagnostics
- Forms: fields listed only as page widgets join the form
- M6: bulk form-field properties and selection
- M2: a ligature stays one glyph in the text layer, in every writing direction
- M2: a character a substitute font lacks draws .notdef, not an unrelated glyph
- M2: kanji that Adobe-Japan1 maps to a variation sequence draw in non-embedded fonts
- @samehelhawary made their first contribution in
- @iMhack87 made their first contribution in
- @EpsilonLLC made their first contribution in
- @sanyamsingh001 made their first contribution in
- @Flowershangfromthebranches made their first contribution in
- @mlkonrad made their first contribution in
- @Fazmin made their first contribution in
- @remesis made their first contribution in
- @Oldrich333 made their first contribution in
- @MarekSpodBiedry made their first contribution in
- @MaksPV made their first contribution in
- @amitabhthakur made their first contribution in
- @bunakalya made their first contribution in
- @SBaksa made their first contribution in
- @aus10d made their first contribution in
- @Streetblock made their first contribution in
- @feraremag2680 made their first contribution in
- @Erige005 made their first contribution in
- @chent11 made their first contribution in
- @kremit made their first contribution in
- @bulgariamitko made their first contribution in
- @XusBadia made their first contribution in
- @fares111111122 made their first contribution in
- @schiffer-soft made their first contribution in
- @LloydNicholson made their first contribution in
- @martinjohuber made their first contribution in
- @bartalos86 made their first contribution in
- @dmatviichuk made their first contribution in
- @philkwek made their first contribution in
- @codyvogt made their first contribution in
- @max1e6 made their first contribution in
- @kisst made their first contribution in
- @skylartaylor made their first contribution in
- @tanish2k09 made their first contribution in
- @thorstenhirsch made their first contribution in
- @Byxis made their first contribution in
- @haranishi made their first contribution in
- @Tevinhead made their first contribution in
- @rschuerer made their first contribution in
- @mrme2tiri-hash made their first contribution in
- @Dammy196 made their first contribution in
- @w-valzelli made their first contribution in
0.4.0Big update
- Windows on ARM64: release builds, tested on ARM64 hardware
- Windows ARM64: fix the intermittent WARP crash in tests, remove the diagnostic job
- Fonts: use craft-fonts as an optional build input; move the Japanese fonts out
- View: next page in two-page view moves a whole spread
- Export to Word: files open in Word again
- ROADMAP: session 14 log
- UI: sharper, higher-contrast text, most visible on Windows
- macOS: open PDFs from Finder, Open With and the Dock
- Add text: clicking elsewhere keeps the text and starts a new box
- ROADMAP: session 15 log
- Prepare a form: Detect form fields in the panel, delete several fields at once
- Forms: check box and radio button styles
- Docs: automation README, internal craftrules links, docs/releasing.md
- Windows: register PrintCraft as a PDF handler, so it can be the default
- Rename PrintCraft to PdfCraft
- Redact: operators split across a page's content streams are redacted whole
- Security: --root confinement leaks and escapes
- Security: ask before opening links from documents
- M1: validate object-number ranges before reading cross references
- fix: print: read lpstat untranslated so printers show on non-English macOS
- macOS: declare PDF by UTI so Open With recommends PrintCraft
- Issue #96: on Linux, draw on the GPU that drives the monitors
- Edit text: the graphics state carries over between a page's content streams
- Edit text: keep the tokens a content stream shares with its neighbours
- Automation: file-writing tools no longer advertise read-only
- CLI: text exits non-zero when a selected page cannot be read
- Checkboxes with an indirect /AP /N state dictionary are drawn
- Select all pages with Ctrl+A in Organize Pages
- Render: round page rasters up so the last partial row and column are drawn
- M3: Add middle-click autoscroll on Linux
- Persist default workspace mode for newly opened PDFs
- macOS: File ▸ Open and file pickers no longer crash the app
- Fix saved signature replacement and long-name clipping
- Forms: run show/hide-a-field button actions
- #143: Windows MSI desktop shortcut checkbox, Start Menu fix and install-complete dialog
- Print: add cut-and-stack page order
- CI: ARM64 smoke test writes its page render inside --root
- About: contributor and model credits compiled in (grab bag + table, self-submitted names)
- CI: tell actionlint about the macos-release runner label
- CLI: exit cleanly when stdout pipe closes
- M14: translation catalogs, same system as PhotoCraft
- i18n: add Brazilian Portuguese (pt-br) UI translation
- i18n: Czech interface language
- M14: complete Japanese dialogs, panels, shortcuts and diagnostics
- M14: expand Traditional Chinese UI, dialogs and language preferences
- i18n: Simplified Chinese UI language option
- Signatures: RFC 3161 timestamps, document timestamps, DSS/VRI and revocation verification (non-network half)
- Add DPI choices when creating PDFs from images
- #161: keep the Save-changes prompt inside the screen
- XFA: lay dynamic forms out from their template and keep their data in step
- M14: complete Simplified Chinese translation catalog
- Measure: add distance, perimeter and area tools
- fix(i18n): follow Windows display language for Chinese UI
- Fix theme controls with shared System, Light and Dark preferences
- Fix flaky picker tests: join the worker instead of polling
- #211: guard the macOS PDF file association with a packaging test
- Restore #196, #202, #203 and the macOS release-runner change, reverted by the i18n chain
- CLI: edit rejects unknown options instead of writing an unchanged copy
- Split: keep only the resources each part draws
- XFA: run the forms' JavaScript: calculations, validation, rows, visibility
- CLI: text fails when the document cannot be opened
- README: install on Gentoo from the ::snakebyte overlay
- Desktop: write log records to standard error and a rotating log file
- #214: wheel paging, Page display menu, default layout and zoom
- Automation: doc_info reports annotation and link rects in displayed-page coordinates
- Automation: doc_protect restrictions need a permissions password — say so, and refuse them without one
- Pin mixed-size Fit page behavior with regression tests
- Desktop: no eprintln! on the log and panic paths
- Add Spanish (es) interface catalog
- Issue #253: comment_add anchors note and attachment icons at the displayed top-left on rotated pages
- Issue #248: pdfcraft-cli render writes the format its --out name says (.png, .jpg, .tif or .pam)
- Issue #249: pdfcraft-cli split creates --out-dir when it does not exist
- Issue #189: each document tab keeps its own scroll position
- Issue #185: arrow keys and Page Down / Up move through a scrolling document
- macOS: every file picker is non-blocking (Save As, exports, folders, Browse…)
- Add my contributor name (viator1969)
- Issue #188: page steps in two-page view take every spread when several fit on screen
- Fix flaky CLI text tests: separate files per protected-PDF test
- Web: Insert/Replace edit the document they started on; Print ▸ Save as PDF downloads
- render: guard degenerate annotation appearance transforms
- render: synthesize missing Highlight appearances
- fonts: keep later widths and the embedded font when /Widths or /FirstChar is malformed
- render: map annotation appearance boxes onto /Rect corner to corner
- Release: Flatpak bundles, AppImage zsync updates, README Downloads
- README Downloads: where to get it, then builds (Windows first)
- @bflatastic made their first contribution in
- @EthanSuquet made their first contribution in
- @jcl-bit made their first contribution in
- @rutkk made their first contribution in
- @ShauryaSwarup made their first contribution in
- @cmoro-deusto made their first contribution in
- @Checkov23 made their first contribution in
- @itsmunzir made their first contribution in
- @ebastos made their first contribution in
- @Frumpy9 made their first contribution in
- @HEOJUNFO made their first contribution in
- @mjshfrvstj-sys made their first contribution in
- @DWAA1660 made their first contribution in
- @pauliusiv123-rgb made their first contribution in
- @excited-raccoon made their first contribution in
- @leblanc-simon made their first contribution in
- @RicSchonfelder made their first contribution in
- @petrleocompel made their first contribution in
- @sakamoto824 made their first contribution in
- @shuiyue-cmyk made their first contribution in
- @Mawfyy made their first contribution in
- @ysrdevs made their first contribution in
- @CQMHV made their first contribution in
- @neavo made their first contribution in
- @chiranjeevi-max made their first contribution in
- @switch87 made their first contribution in
- @viator1969 made their first contribution in
- @cyfung1031 made their first contribution in
0.2.1
- Updates: check only when asked (no check at start)
- Docs: honest parity assessment, gap list and direction
- Never crash: the fuzz job's eleven hangs finish (parser retries, inline images, Type 3 fan-out)
- Fix text editing layout and preserve source PDF font styles
- docs: point agents to the shared test corpora
- Never crash: JBIG2 images can't decode billions of pixels
- FreeBSD: build and test the workspace in a FreeBSD VM
- Never crash: Type 1 font programs can't hang or overflow the stack (skrifa 0.47)
- FreeBSD: release tarball, packaging check and docs (builds on #45)
- XFDF: gracefully ignore invalid Unicode annotation colours
- Add persisted English/Japanese interface language
- Tests: full screen and the About dialog get their own tests (parity evidence)
- UI: share the Japanese fallback font (one 8.7 MB copy, not two)
- Issue #37: on Windows, draw with Direct3D 12 (OpenGL fallback), never load Vulkan drivers
- ROADMAP: log session 13's later work
- Tests: drag-and-drop open and comment hover (two features now shipped)
- Comments: Squiggly underline tool
- Comments: opacity control in the quick bar
- Preferences ▸ Identity: the name on new comments, remembered
- Windows: no console window, and the Start Menu shortcut gets its icon
- Identity test: wait for the page's text before selecting it
- Edit text: move and resize existing text boxes
- Forms: say so when a document is an XFA form
- Export detected tables to office formats
- Release: PrintCraft v0.2.1
- @justinjohn0306 made their first contribution in
- @midasdf made their first contribution in
0.2.0Big update
- Redaction: drop /PCAdded from rewritten content streams so redacted added text does not stay in the file
- Organize: deleted pages leave the file even when something still points at them
- Licensing: standard LICENSE files, NOTICE, ArtCraft brand terms
- CI: as_chunks instead of constant-size chunks_exact (clippy 1.99)
- Optimizer: Audit space usage counts images PrintCraft added as images
- Forms: CSV import keeps values that span lines
- Edit text: a paragraph's new colour no longer spills into the text after it
- Forms: multi-select list values survive XML, CSV and text import
- Edit text: a rewritten paragraph keeps its place in the text object it shares
- Never crash: agent rules, clippy.toml, forbid unsafe
- Never crash: forms scripts can't overflow the stack or the date arithmetic
- Never crash: hostile form scripts can't overflow the stack
- Never crash: last-resort guard around edits, opens, saves and UI commands
- Never crash: crypt has no panic paths
- Never crash: filters, fonts, js, optimize and a11y deny the panic lints
- Never crash: sign has no expect/unreachable
- Never crash: organize has no expect/unreachable
- Never crash: render has no expect/unreachable
- Never crash: engine denies the panic lints
- Never crash: the automation (MCP/script) tools have no expect/unreachable
- Never crash: UI and app shell have no expect/unreachable
- Never crash: create has no expect calls
- Never crash: deny the panic lints in crates that are already clean
- Never crash: edit and xfdf have no expect calls
- Tests: frame budgets take turns and keep the best of three rounds
- Nightly fuzz: stop the runner's out-of-memory deaths (and the fuzzer's false passes)
- Never crash: absurd image-mask and CCITT sizes are refused before decoding
- Never crash: predictor rows and stroke widths from the input can't exhaust memory
- Issue #8: prefer the integrated GPU; the save prompt answers to the keyboard
- Issue #28: Help ▸ Check for updates (opt-in check at start)
- Release: PrintCraft v0.2.0
- @storybored379 made their first contribution in
- @echelon made their first contribution in
0.1.1
0.1.0