The timestamp tool requires a CORS proxy: none of the built-in TSA endpoints send Access-Control-Allow-Origin, so the browser blocks the RFC 3161 POST. The runtime only used a proxy when VITE_CORS_PROXY_URL was set, and the official build never set it, leaving timestamping broken on www.bentopdf.com and on the published Docker images.
Fall back to the project-operated proxy on the official domains only (bentopdf.com, www.bentopdf.com), matching the origin already allowed in the generated CSP. Self-hosted instances keep requiring their own proxy.
Adds a node-side harness that drives the engine wasm directly, fixtures
that build PDFs in-memory, and cases for font fallback and flattening.
The engine loader now tolerates a runtime without import.meta.resolve so
the suite can load it outside a browser.
Clears the previous document before opening a new one, keeps the
selection when clicking the dock or rotating a box, refreshes the glass
overlay so style changes preview every time, adds double-click word
selection, and widens the Windows font stacks for Indic scripts. The
dock now publishes its own height so the swatches lay out correctly on
small screens.
Exported annotations stayed as live FreeText objects, so viewers that
ignore appearance streams showed nothing and the text was not part of
the page. Flattening draws them into the content stream with an
embedded subset of the font, falling back to the old embed path for
anything the flattener cannot place.
Both vendored packages now come from a single build of the engine fork.
The viewer tarball ships without its own copy of pdfium.wasm and loads
the shared engine through EmbedPDF.init({ wasmUrl }), which drops it
from 7.1 MB to 2.1 MB and removes the second WebAssembly instance.
Standardize product and file-format names, remove duplicate SEO
keywords, align related-tool descriptions with their headings, and
restore incomplete phrases in search and social metadata.