# Changelog — pdfluent

All notable changes to the `pdfluent` crate are documented here.

Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

---

## [1.0.0-beta.4] — 2026-05-05

### Documentation

- Removed the "A note on prior versions" banner from the crate README.
  The yanked beta.1/beta.2 licensing correction is documented in this
  changelog (see `1.0.0-beta.3` entry) and does not need to be surfaced
  on every crates.io visit indefinitely.
- Fixed all 9 broken intra-doc links in `pdfluent` (paths in document.rs,
  encrypt.rs, error.rs). `cargo doc -p pdfluent` is now warning-free.
- Documented the **determinism contract** explicitly on `SaveOptions` and
  in `tests/determinism.rs`: byte-deterministic output for unencrypted
  documents under unchanged input/options. Encryption (random IVs) and
  caller-introduced timestamps remain non-deterministic by design.

### Tests

- New integration test file `tests/determinism.rs` with 4 tests:
  - `determinism_to_bytes_is_idempotent`
  - `determinism_multi_open_roundtrip`
  - `determinism_write_to_in_memory_cursor` (CI-safe, in-memory)
  - `determinism_to_bytes_matches_save_with` (disk-vs-memory parity)
  All passing on `1.0.0-beta.3` codebase as of 2026-05-03.

### Internal — workspace lints

Enabled `#![warn(missing_docs)]` across 14 commercial crates that did not
have it (the `pdfluent` facade already had it). Two crates
(`pdfluent-sign`, `pdf-compliance`) ship `#![deny(missing_docs)]` — no
change. `pdf-engine` upgraded from `#![allow]` → `#![warn]`. The
upstream-fork crates `pdf-render` and `pdf-font` still inherit Hayro's
permissive doc policy and are not yet at warn — left for a future pass.

This produces a baseline of ~895 doc-coverage warnings to address
incrementally; no compile errors. Customer-facing surface
(`pdfluent::*`) remains 0-warning.

### Public API

- No breaking changes vs `1.0.0-beta.3`. The audit (#1383) confirmed the
  facade is well-curated: 233 public items across 18 modules, no
  `#[doc(hidden)]` leakage, prelude is selective. No renames, no removals.

---

## [1.0.0-beta.3] — 2026-05-03 (license model correction)

### Status

- Beta software — public API surface is stabilizing for 1.0.
- Not all features are fully complete; capability-gated via Cargo features.
- **XFA support is experimental and under active development.** Visual
  fidelity and feature coverage are improving steadily but not yet
  recommended for production XFA workflows.
- Other features (PDF parse/save, AcroForms, signatures, PDF/A,
  redaction, text extraction, rendering) have completed their quality
  gates and are production-grade.


### Changed — BREAKING (LICENSE)

- **Licensing model updated to `PDFluent Commercial License`.** The
  `pdfluent` crate and the proprietary engine, manipulation, signing,
  compliance, redaction, extraction, forms, annotation, conversion, render,
  font, and XFA crates that it depends on now ship under a custom commercial
  license. Free for evaluation; production use requires a valid commercial
  license. See the `LICENSE` file at the crate root and `pdfluent.com/terms`.
- **Open-source foundation crates remain MIT or MIT/Apache-2.0:**
  `pdfluent-lopdf`, `pdfluent-cff`, `pdfluent-ccitt`, `pdfluent-jbig2`,
  `pdfluent-jpeg2000`, `pdf-syntax`, `pdf-interpret`. These are forks of
  upstream open-source libraries and may continue to be used under those
  terms.
- Per-crate license matrix is documented in the repository-root `NOTICE`
  file.

### Note on prior releases

**Earlier beta versions were published under permissive licenses and have
been yanked.** Specifically, `1.0.0-beta.1` and `1.0.0-beta.2` of `pdfluent`
(and the corresponding beta releases of the other commercial crates listed
above) were briefly published on crates.io under MIT or MIT-OR-Apache-2.0
before the licensing model was finalized. All 21 such versions across 19
commercial crates were yanked on 2026-05-02 to prevent new installations.

Crates.io versions are immutable: anyone who downloaded those versions
before the yank holds an MIT-licensed copy of those specific bytes
permanently. From `1.0.0-beta.3` onward, all production use of the
proprietary crates requires a valid commercial license under the terms of
the `LICENSE` file in this crate.

This release contains **no functional changes** versus the yanked beta.2 —
this is a license-correction release only.

---

## [1.0.0-beta.2] — 2026-05-02

### Changed
- Crate metadata only — no API or behavior changes.
- `repository`, `homepage`, `documentation` URLs corrected to point at
  `pdfluent.com` and the PDFluent GitHub organization.
- Keywords and categories aligned with PDF SDK discoverability conventions.

---

## [1.0.0-beta.1] — 2026-05-02

### Added
- `PdfDocument::open` / `save` / `save_to` — full read+write round-trip
- Page operations: rotate, extract, split, merge via `pdf-manip`
- Digital signatures: PAdES B-B / B-T / B-LT / B-LTA via `pdfluent-sign`
- PDF/A validation and conversion (PDF/A-1b, 2b, 3b) via `pdf-compliance`
- Content redaction (search-based + region-based) via `pdfluent-extract`
- Text extraction with ligature decomposition via `pdf-engine`
- Thumbnail and image rendering via `pdf-render` (native only)
- DOCX export via `pdf-docx` (native only)
- Evaluation mode: SDK fully functional without a licence; output stamped with
  `Producer: PDFluent (Unlicensed Evaluation — pdfluent.com/trial)` in PDF Info
  dict plus a one-time `stderr` warning on first use. No functionality is
  restricted. See `pdfluent.com/trial` to obtain a 30-day clean-trial key.
- Licence validation: offline Ed25519 signature verification; no network calls;
  works air-gapped. Licence file loaded from `PDFLUENT_LICENCE` env var or
  adjacent `pdfluent.licence.json`. Supported types: `trial` (30-day, expires)
  and `paid` (perpetual, `exp: null`).
- Stripe-backed purchase flow: perpetual licences (Lite / Plus / Professional /
  Unlimited) available at `pdfluent.com/pricing`; key delivered automatically
  after checkout via Cloudflare Worker webhook.
- `pdfluent::prelude::*` re-export for ergonomic imports
- Cargo features: `signing` (default), `pdfa` (default), `redaction` (default),
  `async-tokio`, `tracing`

### Known Limitations
- **Non-deterministic PDF output (#1308):** PDF byte streams may differ between
  runs due to non-deterministic object IDs or internal ordering. CI pipelines
  that compare file checksums will see spurious failures. Fix targeted for
  1.0.0-beta.2. Workaround: compare semantic content, not raw bytes.
- WASM target: `to_images` and `to_docx` are not available on
  `wasm32-unknown-unknown`; calls return `Error::UnsupportedOnWasm`.
- OCR, HTML-to-PDF, XLSX/PPTX export: behind feature flags, not wired in beta.

---

## [1.0.0-alpha.1] — 2026-04-02

Initial scaffold release. API surface frozen per RFC 0001. Method bodies wired
progressively; not suitable for production use.
