Skip to content

v0.3.0

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 30 Sep 15:01
· 179 commits to main since this release
cc156c8

v0.3.0 — wider native and container platforms

This unstable release expands delivery of the MIT Rust converter. Conversion
formats, bounded input/scratch, sequential output and PDF encoding retain the
v0.2.0 behavior. Browser and Node remain first-class WASM targets.

Downloads

Choose caj2pdf-v0.3.0-<target>.zip on Windows or .tar.gz elsewhere. The exact
required set contains 50 OS/CPU/ABI targets and is recorded in docs/platform-targets.json; docs/platforms.md explains
CPU/ABI, libc and OS baselines. Additions include LoongArch64 GNU/musl, ARMv5TE,
ARMv6, further ARMv7 variants, MIPS32/64 in both byte orders, PowerPC32/64,
SPARC64, i586 musl and additional musl variants, RISC-V32 GNU, NetBSD
x86_64/ARM64, OpenBSD x86_64/ARM64/RISC-V64, illumos x86_64 and Android x86/x86_64 command-line executables. Bootlin musl targets are dynamically linked and need
the matching runtime; other listed musl builds are static. A libc variant is not
counted as a distinct CPU architecture. Unverified candidates are documented
separately and do not appear among release assets.

  • caj2pdf-rust-0.3.0.tgz: browser and Node 22+ JS package, WASM and declarations.
    Install with npm install ./caj2pdf-rust-0.3.0.tgz.
  • caj2pdf_wasm.wasm: standalone module for the ranged-I/O JS adapters.
  • caj2pdf-container.oci.tar: the exact tested multiarch static CLI image.
  • CONTAINER-DIGEST.txt: digest of ghcr.io/rwv/caj2pdf-rust:v0.3.0.
  • SHA256SUMS: hashes for every published asset.

The Docker platforms are linux/amd64, linux/arm64, linux/arm/v5,
linux/arm/v6, linux/arm/v7, linux/386, linux/loong64, linux/riscv64,
linux/ppc64le and linux/ppc64. Images run as non-root on scratch and need
writable output and temporary storage. Large documents should use disk-backed
scratch instead of tmpfs. See docs/docker.md for usage. There is no npm,
crates.io or Docker Hub publication in this release.

Breaking change: browser cleanup errors

OPFS spool removal retries only NoModificationAllowedError, at most three
attempts with 10 ms and 50 ms waits. If removal permanently fails after a spool
error, the promise now rejects with AggregateError; its cause and first
errors entry preserve the original error, and the second entry is the removal
failure. Previously the removal failure was suppressed. Callers matching a
primary error code can migrate with:

const primary = error instanceof AggregateError ? error.cause : error;
if (primary?.code === "LIMIT_EXCEEDED") {
  // Handle the input limit and separately report error.errors when present.
}

A temporary file may
remain after such a reported failure. The exact cause of the single original
Chromium cleanup failure was not reproduced; deterministic error injection and
real-browser tests validate the hardening without claiming a browser root cause.

Limits and evidence

CAJ/PDF/KDH retain their documented profiles. HN/C8 remains experimental with
known viewer-pixel/geometry differences; C8/HN-B requires --no-bookmarks.
No OCR, searchable HN or TEB support is added. Absent optional corpora remain
NOT_RUN. Windows archives are unsigned and macOS archives are not notarized.
User-mode emulation is runtime evidence, not certification of every old kernel,
physical CPU or vendor ABI. Some rare targets build std with a separate pinned
nightly; the normal project compiler remains pinned stable Rust.

Every published target must run its declared tests; build-only success is not
support. Native, WASM/JS, MIT/advisory and exact 100% Linux Rust line-coverage
gates remain mandatory. Other OSes have separate runtime evidence, not a 100%
coverage claim. Release publication checks the complete native inventory and
container manifest, preserves tested binaries and checksums every asset.