User interface
Seven tool views
Merge, split, organize, images, numbers, metadata, password
Technical overviewLocal tooling and enforced privacy
A local PDF toolkit with no hosted version, in a build that cannot reach the network.
Source code
Inspect the implementation, commit history, and project documentation.
01
A local PDF toolkit: one self-contained HTML file that runs on your own machine in a browser, with no hosted version. Merge, split, organize, images to PDF, page numbers, metadata and passwords all run locally, so a resume or a lease never has to be uploaded to a PDF website. The build carries a Content-Security-Policy with default-src and connect-src set to 'none', and a check in CI fails any change that weakens it.
02
User interface
Merge, split, organize, images, numbers, metadata, password
Input
Picked or dropped, held in memory
Application logic
Pure functions over bytes, no DOM
PDF writer
Pages, labels, metadata, AES-256
Renderer
Renders the Organize thumbnails
Output
Written to disk by the browser
Output
Built with fflate when there are several
Packaging
Scripts, styles and worker inlined
Security policy
default-src and connect-src 'none'
CI gate
Fails the build if the policy weakens
03
The policy is written after inlining, with a SHA-256 hash for each inline block. check-build.mjs fails the build unless dist holds one file, both directives are 'none', and no src or href points outside a data: URI.
One file opens locally in a browser with nothing to install and no server to host it. With the scripts, styles and pdf.js worker inlined there is nothing left to fetch, so the policy can refuse every request.
The functions in src/lib run in Node under Vitest against generated fixtures. Each fixture page has its own width, so a test asserts the exact page order after a merge, split or reorder.
@cantoo/pdf-lib left the old cross-reference stream and the Encrypt dictionary behind, so an unlocked copy reloaded as encrypted. Quire deletes those objects, and a test asserts the saved file has no /Encrypt entry.
04
$ npm test
Tests 47 passed (47)
$ npm run build
check-build: dist/index.html is self-contained (2.34 MB) and cannot open network connections.
$ npm audit --omit=dev
found 0 vulnerabilities
✓ CI green on main05

06