Reading the document
When you drop a PDF, the browser hands the application an ArrayBuffer of the raw bytes. Those bytes are kept in a source registry in memory and handed to pdf.js — Mozilla's PDF parser, the same engine Firefox uses to display PDFs — which runs in a Web Worker so parsing does not block the interface.
pdf.js reports the page count and geometry, and renders each page onto a canvas at thumbnail size. Those canvases become the previews in the grid. This is display only: the previews are never what gets exported.
Editing as a description, not a mutation
Nothing is modified while you work. Deleting, reordering, rotating and duplicating all operate on a plain list of page descriptors — a source file, a page index and a rotation. Undo is therefore just a stack of previous lists, and the original bytes stay pristine the whole time.
That indirection is what keeps quality intact. The grid is a plan for the output document rather than a running transformation of it.
Writing the new file
On export, pdf-lib loads the original bytes and copies the requested page objects into a new document. Pages from the same source are copied in one call so shared fonts and resources are stored once instead of per page. Rotation is written as page metadata; images become embedded XObjects drawn onto a page of the chosen size.
The result is a Uint8Array, wrapped in a Blob and handed to the browser as a download. The document is complete before anything touches your disk, and no part of the process has a network dependency — which is why the whole editor keeps working offline.
What the page actually loads
The initial page is a static HTML file plus a small application bundle. The PDF engines — around 280 kB compressed between them — are fetched only when you actually open a file, so a visitor who reads the page and leaves never downloads them.
There is no analytics-driven data collection of document contents, no telemetry about file names, and no upload endpoint in the code to send them to.
Frequently asked questions
Which libraries does it use?
pdf.js for parsing and page previews, pdf-lib for writing the output document. Both run in the browser.
Why are previews rendered but pages copied?
Previews are pixels for the screen; export copies the original page objects, so text and vectors survive intact.
Does it work with encrypted PDFs?
Files with owner restrictions usually open. Password-protected documents that need a password to read are not supported.
How large a document can it handle?
Bounded by device memory rather than a server limit. Several hundred pages is comfortable on a normal laptop.
Related tools
- A PDF editor that never uploads your filesEvery mainstream online PDF tool sends your document to a server. This one cannot, and you can prove it in about thirty seconds.
- Editing confidential PDFs without sending them anywhereContracts, patient records, payslips, case files: documents whose whole point is that they do not get copied onto somebody else's infrastructure.
- How this compares with Smallpdf, iLovePDF and PDF24They are good products with far more features. The difference that matters is where your document is when the work happens.
- Organize PDF pagesDelete, reorder, rotate and duplicate pages in one view, then save the document — without sending it to anyone.