DEV Community

Cover image for I built a PDF editor that runs entirely in your browser — no upload, no account, $9 once
Hudson Enterprises
Hudson Enterprises

Posted on

I built a PDF editor that runs entirely in your browser — no upload, no account, $9 once

Every time I merge a contract PDF with a signature page, I'm handed the same bad choice: use a web tool that uploads my files to a server I know nothing about, or fight with a desktop app that costs $80/year and ships features I don't need.

I've watched people paste tax returns, medical records, and NDA drafts into browser-based PDF tools without thinking about where those files go. The upload is the product. The free tier exists because documents are valuable.

So I looked at what the browser can actually do without a server involved. The answer is more than most people assume.


What runs where

pdf-lib handles all the actual PDF manipulation — merge, split, extract pages, delete pages, rotate. It's a JavaScript library that runs entirely in the browser. When you click "Merge," your files go from disk into a Uint8Array in the browser's memory, get processed by pdf-lib, and come back out as a new file downloaded to your disk. The network is never involved in that path.

The extension itself is minimal on purpose. The service worker does one thing:

chrome.action.onClicked.addListener(() => {
  chrome.tabs.create({ url: chrome.runtime.getURL('editor.html') });
});
Enter fullscreen mode Exit fullscreen mode

Click the toolbar icon, get a full-page editor tab. No popup (too cramped for PDF thumbnails), no background process, no telemetry, no account system. The service worker has nothing to phone home to.

PDF.js renders page thumbnails inline. Before you merge or split, you can see the pages you're working with. That's a significant UX difference from tools where you operate on filenames blindly — especially when page order matters or you're not sure which pages you actually need to extract.

License validation talks to Lemon Squeezy's API, but only when you enter a key. The processing path is clean — there's no license check inside the merge or split logic, and the extension runs in a 7-day trial before asking for anything.


What it does

  • Merge — drag PDFs into order, output one combined file
  • Split — choose which pages go into which output file
  • Extract — pull specific pages into a new document
  • Delete — remove pages by number
  • Rotate — rotate individual pages or all pages 90/180/270 degrees

Page thumbnails render inline so you can see what you're working with before committing.


Why not just a desktop app

Desktop apps solve the upload problem but create a different one: most serious PDF tools are subscription-based or require expensive one-time purchases. The lightweight free options have narrow feature sets — typically merge-only or split-only, not the full set you need when you're actually working with documents.

The browser-based approach means it runs on Windows, Mac, and Linux anywhere Chrome runs. One install. No update treadmill — the extension updates through Chrome's normal mechanism, but the processing logic doesn't drift between versions in ways that would break your workflow.

For documents in the dozens-of-pages range, the processing speed is fine. For 500-page books, a native app will be faster. That's an honest tradeoff worth stating clearly.


Where I'm at

The extension is built and working. It's currently in Chrome Web Store review — submissions go through a manual review queue that takes days to a couple of weeks. I'm not publishable yet, which means I can't point you at an install link.

What I've put up in the meantime is a demand page at pdftoolkit.hudsonenterprisesllc.com — you can sign up to be notified when the extension clears review and goes live.

Price: $9 one-time. No subscription. No account required to use the extension after you enter your license key. The 7-day trial starts on first use, so you can evaluate it on your own documents before buying.

If you've dealt with the "upload your sensitive document to our server" problem and built your own workaround, I'm curious what that looked like. Drop it in the comments. And if you're interested in the extension: the demand page is the place to leave your email — I'll send one notification when it goes live, nothing else.

support@hudsonenterprisesllc.com for anything else — async only.


I built this. The link above goes to my product's demand page. I'm disclosing that because I'd want to know.

Top comments (0)