PrintCraft changelog

PrintCraft changelog

Back to PrintCraft

15 releases since October 2026 · GitHub releases, checked Oct 27, 2026

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 0.1.1

  15. 0.1.0