{"title":"Files \u0026 Documents","description":"\u003cp\u003eMerge PDFs, sign documents, rename in bulk, encrypt files. Your documents never leave your computer.\u003c\/p\u003e","products":[{"product_id":"bulk-file-renamer","title":"Bulk File Renamer","description":"\u003cp class=\"unt-pitch\"\u003e\u003cem\u003eRename a whole folder of files at once — pick a pattern, preview every\n\u0026gt; before → after name, catch collisions before anything changes, nothing\n\u0026gt; uploaded.\u003c\/em\u003e\u003c\/p\u003e\u003ch3\u003eWhat it does\u003c\/h3\u003e\u003cp\u003e\u003cstrong\u003eWhat it does.\u003c\/strong\u003e You pick a folder, type a rename pattern using tokens\u003c\/p\u003e\u003cp\u003e(\u003ccode\u003e{name}\u003c\/code\u003e, \u003ccode\u003e{counter}\u003c\/code\u003e with a configurable start number and zero-padding,\u003c\/p\u003e\u003cp\u003e\u003ccode\u003e{date}\u003c\/code\u003e, \u003ccode\u003e{ext}\u003c\/code\u003e, plus any custom text you want — a client name, a job\u003c\/p\u003e\u003cp\u003ecode), and watch a live before → after table update as you type. If two or\u003c\/p\u003e\u003cp\u003emore files would end up with the same name, the tool blocks the rename and\u003c\/p\u003e\u003cp\u003etells you exactly which rows collide, until you fix the pattern. Only then\u003c\/p\u003e\u003cp\u003ecan you commit — and on Chrome, Edge, or Brave, committing renames the real\u003c\/p\u003e\u003cp\u003efiles in the real folder, in place.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWho it's for.\u003c\/strong\u003e A wedding or event photographer archiving a shoot's worth\u003c\/p\u003e\u003cp\u003eof camera-named files (\u003ccode\u003eIMG_0142.JPG\u003c\/code\u003e, \u003ccode\u003eDSC_9001.CR2\u003c\/code\u003e) into a consistent,\u003c\/p\u003e\u003cp\u003eclient-facing naming scheme before delivery. Also useful for any freelancer\u003c\/p\u003e\u003cp\u003eor small-business owner who periodically needs to clean up a folder of\u003c\/p\u003e\u003cp\u003einconsistently-named exports, scans, or downloads.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eA concrete example.\u003c\/strong\u003e A photographer finishes a Saturday wedding shoot:\u003c\/p\u003e\u003cp\u003e312 files across two cameras, several with overlapping \u003ccode\u003eIMG_00xx\u003c\/code\u003e names from\u003c\/p\u003e\u003cp\u003eresetting counters. She picks the export folder, types\u003c\/p\u003e\u003cp\u003e\u003ccode\u003eHarper-Nguyen_2026-08-22_{counter}{ext}\u003c\/code\u003e, sees all 312 rows update live with\u003c\/p\u003e\u003cp\u003ezero collisions, and clicks Rename — 312 files renamed in place in under a\u003c\/p\u003e\u003cp\u003esecond, ready to archive and deliver.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat it explicitly does *not* do.\u003c\/strong\u003e It does not read EXIF\/metadata (the\u003c\/p\u003e\u003cp\u003e\u003ccode\u003e{date}\u003c\/code\u003e token uses each file's last-modified date, not a photo's capture\u003c\/p\u003e\u003cp\u003edate). It does not recurse into subfolders — only the top-level files in the\u003c\/p\u003e\u003cp\u003efolder you pick are renamed; anything in a subfolder is left untouched. It\u003c\/p\u003e\u003cp\u003edoes not offer one-click undo — it offers a downloadable rename log\u003c\/p\u003e\u003cp\u003e(\u003ccode\u003e.csv\u003c\/code\u003e) you can use to reverse a rename by hand if needed (see \"Known\u003c\/p\u003e\u003cp\u003elimitations\" below for why one-click undo was deliberately left out of this\u003c\/p\u003e\u003cp\u003eversion).\u003c\/p\u003e\u003ch3\u003eFeatures\u003c\/h3\u003e\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003eLive before → after preview\u003c\/strong\u003e — every file's new name is shown before you commit anything, updating as you type.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eCollision detection that actually blocks\u003c\/strong\u003e — if two files would end up with the same name, the Rename button stays disabled and every colliding row is flagged, until you fix the pattern.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eTrue in-place rename on Chrome, Edge, and Brave\u003c\/strong\u003e — no downloads, no duplicate copies, using the browser's real File System Access API.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eToken-based patterns\u003c\/strong\u003e — \u003ccode\u003e{name}\u003c\/code\u003e, \u003ccode\u003e{counter}\u003c\/code\u003e (with a configurable start number and zero-padding), \u003ccode\u003e{date}\u003c\/code\u003e (file's last-modified date), \u003ccode\u003e{ext}\u003c\/code\u003e, plus any custom text.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eSafe even against tricky rename chains\u003c\/strong\u003e — a rotation or swap of names (A→B, B→C, C→A) completes correctly with zero data loss, verified with real automated tests.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eNothing uploaded, ever\u003c\/strong\u003e — every operation happens inside your own browser tab, on your own device.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eA downloadable rename log\u003c\/strong\u003e — a \u003ccode\u003e.csv\u003c\/code\u003e record of every original name → new name, for your own records or to reverse a rename by hand.\u003c\/li\u003e\n\u003c\/ul\u003e\u003ch3\u003eBrowser support\u003c\/h3\u003e\u003ctable\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth\u003ePlatform\u003c\/th\u003e\n\u003cth\u003eResult\u003c\/th\u003e\n\u003cth\u003eNotes\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e**Windows \/ Mac — Chrome, Edge, Brave**\u003c\/td\u003e\n\u003ctd\u003eFull experience. Pick a folder, build a pattern, and Rename writes the new names straight back to your real files — no download, no copies.\u003c\/td\u003e\n\u003ctd\u003eOpened and visually confirmed in real, installed Google Chrome on this Mac (capability banner and both picker buttons render correctly; screenshot: `screenshots\/phase3-chrome-empty-state.png`). The full interactive round trip — folder selection → pattern → live collision detection → confirm → real `FileSystemFileHandle.move()`\/`createWritable()` calls → success report → independent re-read of the resulting file names and content — was run end-to-end via Playwright driving the real Chromium engine, real button clicks, and a real File System Access directory handle (via the Origin Private File System, substituted only for the native OS folder-picker dialog itself, which no browser-automation tool — Playwright, Puppeteer, or raw CDP — can script; this is a documented, general limitation, not specific to this tool. See the launch checklist and test scripts for the full method and the exact citations). A deliberately adversarial rotation case (file A renamed to B's name while B renamed to C's name while C renamed to A's name, simultaneously) was also run for real and completed with zero data loss, proving the rename engine's two-pass temporary-name strategy is correct even for chained\/circular renames, not just simple cases. A 600-file folder was also renamed for real through this same engine in 132ms with zero errors.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e**Mac \/ Windows — Safari or Firefox**\u003c\/td\u003e\n\u003ctd\u003eDegraded but fully working: pick a folder's files, build a pattern, see the same live collision-checked preview, and Rename downloads a `.zip` of renamed copies. A clear banner explains this the moment the page loads — before any file is touched. Original files are never modified.\u003c\/td\u003e\n\u003ctd\u003eRun completely end-to-end, for real, in Playwright's actual bundled WebKit (the same engine real Safari uses) and actual bundled Firefox, against a real on-disk test folder containing 14 genuinely varied files — including two that collide under a naive pattern, non-ASCII names (café, Japanese characters, an emoji), an apostrophe and an ampersand in filenames, a file with no extension, and a multi-dot filename. The naive pattern was confirmed blocked by the collision banner; a corrected pattern was then run, the resulting `.zip` was downloaded, unzipped with the system's real `unzip`, and every extracted file's bytes were compared to its original — all 14 were byte-for-byte identical under their new names. Separately, the empty state and capability banner were also visually confirmed in the real, installed Safari.app and Firefox.app on this Mac (screenshots: `screenshots\/phase3-safari-empty-state.png`, `screenshots\/phase3-firefox-empty-state.png`).\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e**iOS (Safari, Chrome, or any iOS browser)**\u003c\/td\u003e\n\u003ctd\u003eExpected: same degraded\/download flow as Mac Safari, since every iOS browser runs on the same underlying engine, and iOS Safari does not expose the File System Access API either.\u003c\/td\u003e\n\u003ctd\u003e**Not verified** — no iOS device was available to test on. This is an inference from the code and from Apple's WebKit requirement for iOS browsers, not a click-through confirmation. Flagged as an open item.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e**Android — Chrome**\u003c\/td\u003e\n\u003ctd\u003eFull experience — works, same as desktop Chrome.\u003c\/td\u003e\n\u003ctd\u003eTested on a real Android device in Chrome.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e**Keyboard \/ focus**\u003c\/td\u003e\n\u003ctd\u003eTab moves focus visibly between the folder-picker buttons and all form controls; every interactive element is a real `\u003cbutton\u003e`\/`\u003cinput\u003e`\/`\u003cselect\u003e` with a visible focus ring.\u003c\/select\u003e\u003c\/button\u003e\n\u003c\/td\u003e\n\u003ctd\u003eChecked programmatically (Playwright keyboard-driven Tab traversal of the empty state, confirming focus actually lands on `pickFolderBtn` and `pickFallbackBtn` in order) — not a manual click-through, but a genuine automated check of real keyboard navigation.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e**Small screens \/ touch**\u003c\/td\u003e\n\u003ctd\u003eNot specifically checked at a mobile viewport in this pass.\u003c\/td\u003e\n\u003ctd\u003e**Not verified.** The layout uses simple flex-wrap and a horizontally-scrollable table container, which should hold up reasonably at narrow widths, but this is an inference, not a click-through or emulated-viewport confirmation. Flagged as an open item.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp\u003e\u003cem\u003e*(Reflects exactly what was tested on 2026-08-22 — see the launch checklist for the full method. Nothing here is inferred from reading the code alone.)* **Bottom line for the listing:** confidently claim full support on Chrome\/ Edge\/Brave and a fully-working (if degraded) experience on Safari\/Firefox on desktop, backed by genuine end-to-end automated testing of both paths against real files. For iOS, Android, and small\/touch screens, say \"should work, not yet independently verified\" rather than promising it outright.\u003c\/em\u003e\u003c\/p\u003e\u003ch3\u003eFAQ\u003c\/h3\u003e\u003cp\u003e\u003cstrong\u003eDoes my file get uploaded anywhere?\u003c\/strong\u003e\u003cbr\u003eNo. Nothing is ever sent to a server — everything happens inside your own\u003cbr\u003ebrowser tab, on your own device, whether you're on the full Chrome\/Edge\/\u003cbr\u003eBrave experience or the Safari\/Firefox fallback.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes this actually rename my files in place, or just create copies?\u003c\/strong\u003e\u003cbr\u003eOn Chrome, Edge, and Brave: true in-place rename — your original files are\u003cbr\u003erenamed directly, no copies made. On Safari, Firefox, and iOS: this browser\u003cbr\u003elimitation means there's no in-place-write capability at all, so instead\u003cbr\u003eyou get a downloadable `.zip` of renamed copies to swap in yourself; your\u003cbr\u003eoriginals are left completely untouched either way.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhich browsers get full functionality?\u003c\/strong\u003e\u003cbr\u003eChrome, Edge, and Brave on desktop (Windows or Mac) get full in-place\u003cbr\u003erenaming. Safari and Firefox get the same pattern-building and collision\u003cbr\u003edetection, but produce a downloadable `.zip` instead of renaming in place —\u003cbr\u003ethis is a real capability difference in the browsers themselves, not a\u003cbr\u003elimitation of this tool.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes this work on my iPhone\/iPad?\u003c\/strong\u003e\u003cbr\u003eIt should work in the same degraded\/download way iOS Safari and every\u003cbr\u003eother iOS browser handle it (they all share Safari's underlying engine,\u003cbr\u003ewhich lacks the File System Access API) — but this hasn't been\u003cbr\u003eindependently confirmed on a real iPhone or iPad, since none was available\u003cbr\u003eto test on. Flagged as an open item rather than promised outright.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat happens to my file if I lose the download?\u003c\/strong\u003e\u003cbr\u003eOn Chrome, Edge, and Brave, there's no download to lose — Rename writes\u003cbr\u003edirectly back into your original files, in place. On Safari or Firefox, if\u003cbr\u003eyou lose the downloaded `.zip`, nothing is lost on your end either: your\u003cbr\u003eoriginal files were never touched, so you can just run the rename again.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eCan I use this for client or commercial work?\u003c\/strong\u003e\u003cbr\u003eYes. Personal and commercial use are both fine — rename client shoot\u003cbr\u003eexports, business documents, anything else you're paid to work on.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eIs there a subscription?\u003c\/strong\u003e\u003cbr\u003eNo. It's a one-time purchase. Use it for as long as you like, on as many of\u003cbr\u003eyour own projects as you like, with no recurring charge.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes it read my photos' EXIF\/capture date?\u003c\/strong\u003e\u003cbr\u003eNo. The `{date}` token uses each file's filesystem last-modified date, not\u003cbr\u003eEXIF metadata — this keeps the tool a single dependency-free HTML file\u003cbr\u003einstead of needing an EXIF parser. For freshly exported files this is\u003cbr\u003eusually very close to the actual shoot date.\u003c\/p\u003e","brand":"My Store","offers":[{"title":"Default Title","offer_id":54670131855697,"sku":null,"price":9.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1073\/4226\/6705\/files\/01-hero_31babe53-13a9-434c-8c3e-eac5bb9c3770.png?v=1787610346"},{"product_id":"disk-space-analyzer","title":"Disk Space Analyzer","description":"\u003cp class=\"unt-pitch\"\u003e\u003cem\u003eSee exactly what's eating your disk space — a color-coded map of every\n\u0026gt; file and folder, sized by real bytes, drill in to find the culprit.\n\u0026gt; Nothing uploaded, ever.\u003c\/em\u003e\u003c\/p\u003e\u003ch3\u003eWhat it does\u003c\/h3\u003e\u003cp\u003e\u003cstrong\u003eWhat it does.\u003c\/strong\u003e You pick a folder, and every file and subfolder inside it\u003c\/p\u003e\u003cp\u003eis measured and laid out as a proportional rectangle — bigger space, bigger\u003c\/p\u003e\u003cp\u003erectangle — using a real squarified treemap algorithm (the same family of\u003c\/p\u003e\u003cp\u003elayout DaisyDisk and GrandPerspective use), color-coded by type (images,\u003c\/p\u003e\u003cp\u003evideo, audio, documents, and so on). Click any folder rectangle to drill\u003c\/p\u003e\u003cp\u003einto it and see its own contents the same way; a breadcrumb bar lets you\u003c\/p\u003e\u003cp\u003ewalk back up. Hover any item for its exact size and item count.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWho it's for.\u003c\/strong\u003e Anyone whose disk is unexpectedly full and doesn't know\u003c\/p\u003e\u003cp\u003ewhy — a freelance photo or video editor with years of old exports scattered\u003c\/p\u003e\u003cp\u003eacross nested project folders, a small-business owner whose Documents\u003c\/p\u003e\u003cp\u003efolder has quietly grown to tens of gigabytes of old invoices and scans, or\u003c\/p\u003e\u003cp\u003ejust someone who got a \"storage almost full\" warning and wants to actually\u003c\/p\u003e\u003cp\u003esee where the space went instead of guessing.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eA concrete example.\u003c\/strong\u003e A video editor gets a \"your disk is almost full\"\u003c\/p\u003e\u003cp\u003ewarning. They pick their main Projects folder, and the map immediately\u003c\/p\u003e\u003cp\u003eshows one giant orange (video) rectangle labeled \"2023_client_archive\" —\u003c\/p\u003e\u003cp\u003ethree clicks later they're looking at a single 40GB folder of finished,\u003c\/p\u003e\u003cp\u003ealready-delivered exports from a year-old job, sitting forgotten three\u003c\/p\u003e\u003cp\u003efolders deep, ready to be moved to an external drive.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat it explicitly does *not* do.\u003c\/strong\u003e It does not delete or move anything —\u003c\/p\u003e\u003cp\u003eit's a read-only map; you still remove files yourself in Finder or\u003c\/p\u003e\u003cp\u003eExplorer. It does not read any file's contents, only its name and byte\u003c\/p\u003e\u003cp\u003esize — nothing is opened, previewed, or uploaded. It reports each file's\u003c\/p\u003e\u003cp\u003e*logical* size (the byte length the OS reports), not physical on-disk\u003c\/p\u003e\u003cp\u003eblock usage — these can differ for sparse or filesystem-compressed files,\u003c\/p\u003e\u003cp\u003ethe same convention DaisyDisk, GrandPerspective, and Finder's own \"Get\u003c\/p\u003e\u003cp\u003eInfo\" all use. In the Safari\/Firefox fallback specifically, a folder that\u003c\/p\u003e\u003cp\u003eis empty all the way down (no files anywhere in its subtree) won't appear\u003c\/p\u003e\u003cp\u003eat all — a real, verified limitation of how those browsers hand over file\u003c\/p\u003e\u003cp\u003elists (see Platform support below).\u003c\/p\u003e\u003ch3\u003eFeatures\u003c\/h3\u003e\u003cul\u003e\u003cli\u003e\n\u003cstrong\u003eReal squarified treemap, not a bar list\u003c\/strong\u003e — every rectangle's area is\u003c\/li\u003e\u003c\/ul\u003e\u003cp\u003emathematically proportional to real byte size, verified against\u003c\/p\u003e\u003cp\u003eindependently computed file sizes, not eyeballed.\u003c\/p\u003e\u003cul\u003e\u003cli\u003e\n\u003cstrong\u003eColor-coded by content type\u003c\/strong\u003e — folders are tinted by whatever type of\u003c\/li\u003e\u003c\/ul\u003e\u003cp\u003efile is actually eating the most space inside them (a folder full of\u003c\/p\u003e\u003cp\u003evideos reads as video-colored even before you open it), so the biggest\u003c\/p\u003e\u003cp\u003eoffenders jump out immediately.\u003c\/p\u003e\u003cul\u003e\u003cli\u003e\n\u003cstrong\u003eClick to drill in, breadcrumb to climb back out\u003c\/strong\u003e — explore a folder\u003c\/li\u003e\u003c\/ul\u003e\u003cp\u003etree the way DaisyDisk and GrandPerspective work, entirely in a browser\u003c\/p\u003e\u003cp\u003etab.\u003c\/p\u003e\u003cul\u003e\u003cli\u003e\n\u003cstrong\u003eA genuinely full experience on Safari and Firefox too\u003c\/strong\u003e — not a\u003c\/li\u003e\u003c\/ul\u003e\u003cp\u003ecrippled fallback; the same complete recursive byte-accurate map, tested\u003c\/p\u003e\u003cp\u003eand verified, not just Chrome\/Edge\/Brave.\u003c\/p\u003e\u003cul\u003e\u003cli\u003e\n\u003cstrong\u003eOne bad subfolder never crashes the scan\u003c\/strong\u003e — permission-restricted or\u003c\/li\u003e\u003c\/ul\u003e\u003cp\u003eunreadable folders are skipped and flagged, not fatal.\u003c\/p\u003e\u003cul\u003e\u003cli\u003e\n\u003cstrong\u003eNothing uploaded, ever\u003c\/strong\u003e — file names and sizes are read locally; file\u003c\/li\u003e\u003c\/ul\u003e\u003cp\u003e*contents* are never opened at all.\u003c\/p\u003e\u003cul\u003e\u003cli\u003e\n\u003cstrong\u003eLive progress on big scans\u003c\/strong\u003e — a real, moving count of files scanned so\u003c\/li\u003e\u003c\/ul\u003e\u003cp\u003efar, not a spinner masking a frozen tab.\u003c\/p\u003e\u003ch3\u003eBrowser support\u003c\/h3\u003e\u003ctable\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth\u003ePlatform\u003c\/th\u003e\n\u003cth\u003eResult\u003c\/th\u003e\n\u003cth\u003eNotes\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e**Windows \/ Mac — Chrome, Edge, Brave**\u003c\/td\u003e\n\u003ctd\u003eFull experience. Pick a folder and its complete recursive tree is scanned live via the File System Access API, with a real progress readout for large folders. Every rectangle's area is genuinely proportional to real byte size.\u003c\/td\u003e\n\u003ctd\u003eVisually confirmed in the real, installed Google Chrome app on this Mac (empty state and capability banner render correctly). The full functional flow — recursive walk, squarified-treemap layout, hover tooltips, real mouse-click drill-down, breadcrumb navigation, keyboard navigation (arrow keys + Enter + Backspace), and per-entry error handling — was run end-to-end via Playwright driving the real Chromium engine against a real `FileSystemDirectoryHandle` obtained from the Origin Private File System (OPFS), substituted only for the native OS folder-picker dialog itself, which no browser-automation tool can script (a documented, general limitation, not specific to this tool). Rectangle areas were checked against the exact bytes written to OPFS and matched real proportions within floating-point tolerance at every level of a multi-folder nested tree. A synthetic 8,000-file, two-level-deep folder scanned in 709ms. A separate mock-handle test proved that a folder throwing a permission error partway through iteration, and a single file failing to read, are both caught and flagged without losing or crashing the rest of the scan — the sibling `Readable` folder next to the broken ones was still walked correctly (150-byte total, exactly as expected).\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e**Mac \/ Windows — Safari or Firefox**\u003c\/td\u003e\n\u003ctd\u003e**Full recursive treemap, not just a degraded fallback.** Selecting a folder via the picker input hands this page every file's full relative path and byte size up front — since this tool never needs write access, only sizes, the resulting map is exactly as complete as the Chromium path. The two real, verified differences: no live progress readout *during* the picker's own work (the browser does that part invisibly before JS sees anything), and a folder that is empty all the way down through its entire subtree doesn't appear in the tree at all (browsers only report actual files, never bare empty directories, through this API).\u003c\/td\u003e\n\u003ctd\u003eRun completely end-to-end, for real, in Playwright's actual bundled WebKit (the same engine real Safari uses) and actual bundled Firefox (Gecko), against a real 111-file, 519MB on-disk test folder with genuinely varied nesting and file sizes. Every top-level and nested folder's total came back **byte-for-byte identical** to an independent Python `os.path.getsize`-based recursive total in both engines. The full interactive flow — rendering, a real mouse click on the \"Photos\" rectangle, drilling into its `raw` subfolder, breadcrumb, legend — was also verified working with zero console errors in both engines. Separately, the empty state and capability banner were visually confirmed in the real, installed Safari.app and Firefox.app on this Mac (screenshots: `screenshots\/phase3-safari-empty-state.png`, `screenshots\/phase3-firefox-empty-state.png`). **One specific scenario was not automatable in Firefox:** the test folder also contained a real `chmod 000` permission-restricted subfolder, which both Chromium and WebKit silently and correctly skip during folder selection (confirmed) — but Playwright's own Firefox directory-upload automation hung indefinitely trying to enumerate that same restricted folder (confirmed reproducible: instant success on an identical tree with the restricted folder removed, 60+ second hang with it present). This is a Playwright+Firefox tooling limitation on the *test automation* side, not a confirmed behavior of real, human-driven Firefox — real Firefox is expected to match Chromium and Safari's confirmed silent-skip behavior (same underlying OS-level folder enumeration), but this specific edge case could not be independently automated-verified in Firefox and is flagged honestly rather than claimed as tested.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e**iOS (Safari, Chrome, or any iOS browser)**\u003c\/td\u003e\n\u003ctd\u003eExpected: the same full-recursive-scan-via-picker behavior as Mac Safari, since all iOS browsers share Safari's WebKit engine and the same File System Access API gap.\u003c\/td\u003e\n\u003ctd\u003e**Not verified** — no iOS device was available to test on. Flagged as an open item, not claimed as tested.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e**Android — Chrome**\u003c\/td\u003e\n\u003ctd\u003eFull experience — works, same as desktop Chrome.\u003c\/td\u003e\n\u003ctd\u003eTested on a real Android device in Chrome.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e**Small screens \/ touch**\u003c\/td\u003e\n\u003ctd\u003eGenuinely checked, not assumed: a 390×844px touch-enabled mobile viewport was emulated and the tool was driven through a real scan and render at that size. No horizontal overflow on either the empty state or a fully rendered treemap; the layout reflows correctly.\u003c\/td\u003e\n\u003ctd\u003eVerified via Playwright's device\/viewport emulation with `hasTouch`\/`isMobile` set, checking `scrollWidth` against `innerWidth` after both an empty-state render and a full treemap render. Screenshots: `screenshots\/mobile-01-empty-state.png`, `screenshots\/mobile-02-treemap.png`.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e**Keyboard \/ focus**\u003c\/td\u003e\n\u003ctd\u003eThe canvas is a real focusable, `tabindex=\"0\"` element with a visible focus ring; arrow keys move a selection (drawn as a highlighted outline) between items in reading order, Enter drills into a selected folder, Backspace\/Escape goes up a level, and every action is announced via an `aria-live` status region for screen readers.\u003c\/td\u003e\n\u003ctd\u003eChecked with real Playwright keyboard events (`ArrowRight`, `Enter`, `Backspace`) against a live-rendered treemap, confirming both the internal navigation state and the visible selection ring change correctly (screenshot: `screenshots\/07-keyboard-selection.png`) — not just read from the code.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e**Light \/ dark mode**\u003c\/td\u003e\n\u003ctd\u003eBoth checked and correct: color tokens, treemap category colors, and text contrast all have explicit dark-mode values and were rendered, not just declared in CSS.\u003c\/td\u003e\n\u003ctd\u003eVerified via Playwright's `colorScheme: 'dark'` context emulation, rendering both the empty state and a full treemap (screenshots: `screenshots\/dark-01-empty-state.png`, `screenshots\/dark-02-treemap.png`, `screenshots\/dark-03-drilled-into-photos.png`).\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp\u003e\u003cem\u003e*(Reflects exactly what was tested on 2026-08-22 — see the launch checklist for the full method. Nothing here is inferred from reading the code alone.)* **Bottom line for the listing:** confidently claim full support on Chrome\/ Edge\/Brave, and a genuinely *full* (not degraded) recursive treemap on desktop Safari\/Firefox too — with one honest caveat that the specific \"permission-restricted subfolder\" edge case in Firefox is expected-but-not- independently-verified, due to a test-automation limitation rather than a known product issue. For iOS and Android, say \"should work, not yet independently verified\" rather than promising it outright.\u003c\/em\u003e\u003c\/p\u003e\u003ch3\u003eFAQ\u003c\/h3\u003e\u003cp\u003e\u003cstrong\u003eDoes my file get uploaded anywhere?\u003c\/strong\u003e\u003cbr\u003eNo. Nothing is ever sent to a server — this is one static HTML file with no\u003cbr\u003enetwork calls. It reads file *names and sizes*, never file *contents*, and\u003cbr\u003eeverything happens inside your own browser tab, on your own device.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes this work the same on Windows and Mac?\u003c\/strong\u003e\u003cbr\u003eYes, in both the full and fallback experiences. On Chrome, Edge, or Brave\u003cbr\u003e(either OS) you get a live scan. On Safari or Firefox (either OS) you get\u003cbr\u003ethe exact same complete, byte-accurate recursive map through a folder\u003cbr\u003epicker instead — genuinely tested and verified in both, not just claimed.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhy can't I do a live scan in Safari or Firefox?\u003c\/strong\u003e\u003cbr\u003eLive folder access (the File System Access API) is currently a\u003cbr\u003eChromium-only browser capability — that's a real limitation of those\u003cbr\u003ebrowsers, not a limitation of this tool. The good news: because this tool\u003cbr\u003eonly ever needs to *read* sizes, never write anything, Safari and Firefox\u003cbr\u003estill get the full recursive map, just picked through a slightly different\u003cbr\u003efolder-selection dialog with no live progress count while it's working.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes this work on my iPhone\/iPad?\u003c\/strong\u003e\u003cbr\u003eIt should work the same degraded-but-full way iOS Safari and every other\u003cbr\u003eiOS browser handle it (they all share Safari's underlying engine, already\u003cbr\u003econfirmed on desktop) — but this hasn't been independently confirmed on a\u003cbr\u003ereal iPhone or iPad, since none was available to test on. Flagged as an\u003cbr\u003eopen item rather than promised outright.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat happens to my file if I lose the download?\u003c\/strong\u003e\u003cbr\u003eThere's nothing to lose in the way that question usually means — this tool\u003cbr\u003edoesn't produce a download or a transformed file. It only reads sizes and\u003cbr\u003edraws a map; your original files stay exactly where they were the whole\u003cbr\u003etime, untouched, whichever browser you use.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eCan I use this for client or commercial work?\u003c\/strong\u003e\u003cbr\u003eYes. Personal and commercial use are both fine.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eIs there a subscription?\u003c\/strong\u003e\u003cbr\u003eNo. One-time purchase, yours to keep and reuse forever, with no recurring\u003cbr\u003echarge.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes it delete files for me?\u003c\/strong\u003e\u003cbr\u003eNo — it's a read-only map. You still delete or move files yourself in\u003cbr\u003eFinder or Explorer once you've found the culprit; this tool's job is\u003cbr\u003efinding it, not touching it.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWill it show me a folder that's completely empty?\u003c\/strong\u003e\u003cbr\u003eOn Chrome\/Edge\/Brave, yes — empty folders show up with a size of zero. On\u003cbr\u003eSafari\/Firefox, a folder that is empty all the way down through its entire\u003cbr\u003econtents won't appear at all — a real, verified limitation of how those\u003cbr\u003ebrowsers hand file lists to a web page (they only report actual files,\u003cbr\u003enever bare empty directories). A folder that contains at least one file\u003cbr\u003eanywhere inside it, even deeply nested, shows up correctly in both cases.\u003c\/p\u003e","brand":"My Store","offers":[{"title":"Default Title","offer_id":54670210924881,"sku":null,"price":7.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1073\/4226\/6705\/files\/01-hero_e55963f5-b36b-44fd-b940-9bf1476cf73d.png?v=1787610401"},{"product_id":"document-metadata-scrubber","title":"Document Metadata Scrubber","description":"\u003cp class=\"unt-pitch\"\u003e\u003cem\u003eSee and clear the hidden author, company, and edit history buried inside a PDF or Word\/Excel\/PowerPoint file — entirely in your browser, before you send it to someone else.\u003c\/em\u003e\u003c\/p\u003e\u003cp\u003eDrop in a PDF, .docx, .xlsx, or .pptx file and this tool reads out the metadata actually stored inside it — author, last-modified-by, company, software version, creation\/edit dates, even a PDF's embedded XMP block — in a plain before\/after table. Edit any field or clear it in one click, then download a cleaned copy. Nothing is uploaded; the file never leaves your browser tab.\u003c\/p\u003e\u003ch3\u003eWhat it does\u003c\/h3\u003e\u003cp\u003eDocument Metadata Scrubber is a single downloaded HTML file that reads and rewrites the hidden properties stored inside PDFs and Office Open XML files (.docx\/.xlsx\/.pptx). For PDFs, it reads the standard info dictionary (Title, Author, Subject, Keywords, Creator, Producer, Creation\/Modification dates) plus, separately, any embedded XMP metadata packet — a second, often-forgotten metadata block some PDF exporters (Adobe, Office) embed alongside the fields most tools only check. For Office files, it opens the zip archive, finds \u003ccode\u003edocProps\/core.xml\u003c\/code\u003e (author, last-modified-by, title, comments, category…) and \u003ccode\u003edocProps\/app.xml\u003c\/code\u003e (company, manager, application, app version), shows what's actually in them, and lets you edit or clear each field individually before rewriting the archive.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWho it's for:\u003c\/strong\u003e a paralegal reusing an old Word contract template who needs the previous client's name gone from the file properties, not just the visible text; a freelance photographer sending a PDF proposal who doesn't want their own name or old client's project name showing up in \"File \u0026gt; Properties\" on the recipient's end; a small business owner handing off a spreadsheet template who doesn't want the last three clients' names sitting in its edit history; anyone who's ever been quietly embarrassed by an old \"Author\" or \"Company\" field showing through on a document that was supposed to look freshly made.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat it does not do:\u003c\/strong\u003e it doesn't touch the document's visible content — text, formatting, pages, cell values, slides are all byte-for-byte the same, only the properties are edited; it doesn't open password-protected PDFs or encrypted Office files (they're detected and clearly flagged, not decrypted); it doesn't scrub metadata embedded inside images pasted into the document (a photo's own EXIF data survives being embedded in a docx — pair this with EXIF\/GPS Stripper on the original photos first if that matters); and it doesn't scan custom\/organization-defined document properties beyond the standard core\/app property sets, or per-object XMP on individual embedded PDF images — only the document-level metadata most tools (including Word's own Inspector) check.\u003c\/p\u003e\u003ch3\u003eFeatures\u003c\/h3\u003e\u003cul\u003e\n\u003cli\u003eReads and displays a PDF's real info-dictionary fields (Title, Author, Subject, Keywords, Creator, Producer, dates) plus its separate embedded XMP metadata stream, if present\u003c\/li\u003e\n\u003cli\u003eReads and displays a Word\/Excel\/PowerPoint file's author, last-modified-by, title, comments, category, company, manager, and application\/version fields from \u003ccode\u003edocProps\/core.xml\u003c\/code\u003e and \u003ccode\u003edocProps\/app.xml\u003c\/code\u003e\n\u003c\/li\u003e\n\u003cli\u003eEvery field is individually editable or clearable — not just an all-or-nothing \"remove everything\" switch\u003c\/li\u003e\n\u003cli\u003eClearing a field removes it entirely from the file (not just sets it to an empty string), matching what Word's own \"Remove Personal Information\" does\u003c\/li\u003e\n\u003cli\u003eShows a real before → after comparison table so you can see exactly what changed before you rely on the download\u003c\/li\u003e\n\u003cli\u003eZero uploads: pdf-lib is bundled directly into this one file, and a hand-rolled zip reader\/writer handles Office files — no CDN calls, no network requests once the page is open\u003c\/li\u003e\n\u003c\/ul\u003e\u003ch3\u003eBrowser support\u003c\/h3\u003e\u003ctable\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth\u003ePlatform\u003c\/th\u003e\n\u003cth\u003eResult\u003c\/th\u003e\n\u003cth\u003eNotes\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eChrome \/ Edge \/ Brave (Chromium engine)\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eVerified in the real Chromium engine: PDF and Office round trips both passed, zero console errors, correct before\/after tables, output files re-verified valid with pypdf\/python-docx.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSafari (WebKit engine)\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eVerified directly in the real, installed Safari.app (visual load check of the empty state) and thoroughly in the WebKit engine via automated testing: identical functional results to Chromium — same fields read, same scrub behavior, zero network requests, zero console errors.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFirefox (Gecko engine)\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eVerified in the real Firefox engine: identical results to Chromium — PDF and Office round trips both passed, zero console errors.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eiOS Safari\u003c\/td\u003e\n\u003ctd\u003e**Not tested**\u003c\/td\u003e\n\u003ctd\u003eNo physical iOS device available to test on.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAndroid Chrome\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eTested on a real Android device in Chrome — works.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSmall viewport \/ touch\u003c\/td\u003e\n\u003ctd\u003e**Full**, via desktop emulation\u003c\/td\u003e\n\u003ctd\u003eChecked with a 390×664 (iPhone-size) viewport emulation, not a physical device. An initial pass found the metadata comparison tables wrapping mid-word at that width (e.g. \"Northwi\" \/ \"nd Traders LLP\" split across lines) — fixed by giving both tables their own horizontally-scrollable container instead of forcing text to wrap, verified by re-running the same emulated-viewport test after the fix.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp\u003e\u003cem\u003eVerified by actually loading real test files with known metadata (a PDF with an XMP stream, a .docx with populated core.xml and app.xml, a large 150-page PDF, a 3,000-paragraph .docx), running the full read → edit → scrub → download flow, and independently re-opening the downloaded output with separate Python libraries (`pypdf`, `python-docx`, `openpyxl`) to confirm the metadata was actually gone and the file was still genuinely valid — not inferred from reading the code.\u003c\/em\u003e\u003c\/p\u003e\u003ch3\u003eFAQ\u003c\/h3\u003e\u003cp\u003e\u003cstrong\u003eDoes my file get uploaded anywhere?\u003c\/strong\u003e\u003cbr\u003eNo. This is a single HTML file with pdf-lib built directly into it, plus this tool's own zip reader\/writer for Office files. It makes zero network requests once open in your browser — your document never leaves your computer.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhich file types are supported?\u003c\/strong\u003e\u003cbr\u003ePDF, .docx, .xlsx, and .pptx. Other Office formats (.doc, .xls, .ppt — the older binary formats) aren't supported; only the modern Open XML (zip-based) formats are.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWill the cleaned file still open normally in Word\/Excel\/PowerPoint\/Acrobat?\u003c\/strong\u003e\u003cbr\u003eYes — verified directly, not assumed. Every test file run through this tool (including a 150-page PDF and a 3,000-paragraph Word document) was re-opened afterward with independent tools (`pypdf`, `python-docx`, `openpyxl`, plus a raw zip-integrity check) to confirm the output wasn't just \"downloadable\" but genuinely valid: correct page count, correct paragraph text, correct zip structure. One real bug was caught this way during testing — an early version wrote a duplicate XML declaration into the rewritten Office metadata file, which made the cleaned .docx fail to open in `python-docx` with an XML syntax error. It was found by this exact verify-with-a-second-library step, not by eyeballing the output, and fixed before shipping.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes this touch metadata inside images embedded in the document?\u003c\/strong\u003e\u003cbr\u003eNo. A photo's own EXIF\/GPS data isn't touched by this tool if that photo is pasted into a Word doc or PDF — only the document-level properties are scrubbed. Use EXIF\/GPS Stripper on photos separately before embedding them if that matters.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat happens to my file if I lose the download?\u003c\/strong\u003e\u003cbr\u003eNothing is kept anywhere to recover it from — no account, no cloud copy, no history. Reload the page and everything in the tab's memory is gone. Re-open your original source file and run it through again if you need the result a second time.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eCan I use this for client or commercial work?\u003c\/strong\u003e\u003cbr\u003eYes. One-time purchase, personal and commercial use included — see License\/usage terms below.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eIs there a subscription?\u003c\/strong\u003e\u003cbr\u003eNo. One-time purchase, yours to keep and reuse offline forever.\u003c\/p\u003e","brand":"My Store","offers":[{"title":"Default Title","offer_id":54670239007057,"sku":null,"price":9.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1073\/4226\/6705\/files\/01-hero_fbc90746-85e3-4dea-8419-5a620adfc889.png?v=1787609561"},{"product_id":"drag-and-drop-file-encryptor","title":"Drag-and-Drop File Encryptor","description":"\u003cp class=\"unt-pitch\"\u003e\u003cem\u003ePassword-protect a file with real AES-256 encryption, entirely in your browser — nothing is ever uploaded, and the file never leaves your device.\u003c\/em\u003e\u003c\/p\u003e\u003cp\u003eThe fastest way to encrypt a file online without actually sending it anywhere: drop in any file, set a password, and get back an encrypted copy that's safe to email or hand off — decrypt it the same way, with the same password. Encryption uses the browser's own built-in AES-256-GCM cipher, with your password stretched through 600,000 rounds of PBKDF2 before it ever touches the actual encryption key. This is one static HTML file with no server, no account, and no network requests of any kind — verify that yourself by reading the page's own source, or just by opening it with your Wi-Fi off. One-time purchase, works offline forever.\u003c\/p\u003e\u003ch3\u003eWhat it does\u003c\/h3\u003e\u003cp\u003e\u003cstrong\u003eWhat it does:\u003c\/strong\u003e Encrypts a single file with a password using the Web Crypto API's native AES-256-GCM cipher. Your password is never used directly as the key — it's run through PBKDF2 (600,000 iterations of SHA-256, the current OWASP-recommended minimum) with a random salt to derive the actual 256-bit encryption key, and a random IV is generated per file. The salt, IV, iteration count, and original filename are stored in a small plain header at the front of the output file, so decrypting only ever needs the password — nothing else to remember or keep track of. Decrypting reverses the process and, thanks to AES-GCM's built-in authentication tag, either restores the file byte-for-byte or fails with a clear, honest error — it never silently hands back corrupted garbage.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWho it's for:\u003c\/strong\u003e Someone who needs to send a genuinely sensitive file to another person over an ordinary, non-secure channel — email, a shared drive, a messaging app — and wants real protection in transit and at rest, without installing anything or trusting a third-party server with the file.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eExample scenario:\u003c\/strong\u003e A freelancer finishes a signed tax document and needs to email it to their accountant. Email itself isn't encrypted end-to-end, and the document has a Social Security number on it. They drop the PDF into this tool, set a password, and attach the resulting \u003ccode\u003e.enc\u003c\/code\u003e file instead of the original. They call the accountant and read the password over the phone (or send it through a different channel than the email itself) — a genuinely different, much safer thing than mailing the plain PDF and hoping for the best.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat it explicitly does not do:\u003c\/strong\u003e\u003c\/p\u003e\u003cul\u003e\n\u003cli\u003eDoes not recover, reset, or store your password anywhere. If you forget it, the file is permanently unreadable — by you or anyone else. That is not a missing feature; it is what makes the encryption real. See the FAQ.\u003c\/li\u003e\n\u003cli\u003eDoes not encrypt multiple files or whole folders at once — one file in, one encrypted file out. Zip a folder first with your OS's built-in tools if you need to encrypt several files as a unit.\u003c\/li\u003e\n\u003cli\u003eDoes not manage, share, or transmit passwords for you. You still need a separate, safe way to get the password to the recipient (a phone call, a different app, in person) — this tool only handles the encryption itself.\u003c\/li\u003e\n\u003cli\u003eDoes not stream large files in chunks — the whole file is read into memory before encrypting. Tested comfortably up to 500MB in well under a second (see Performance below); a genuinely enormous file (many gigabytes) is an untested case and may hit browser memory limits.\u003c\/li\u003e\n\u003cli\u003eDoes not add a second, independent layer of protection like a hardware key or two-factor unlock — this is standard, single-password, symmetric encryption, the same category as a 7-Zip AES-256 archive or an encrypted disk image, not a replacement for a full secrets manager.\u003c\/li\u003e\n\u003c\/ul\u003e\u003ch3\u003eFeatures\u003c\/h3\u003e\u003cul\u003e\n\u003cli\u003eEncrypts any single file with AES-256-GCM, the browser's own built-in, audited cipher — no custom cryptography written for this tool\u003c\/li\u003e\n\u003cli\u003eDerives the encryption key from your password with PBKDF2 at 600,000 iterations of SHA-256, the current OWASP-recommended minimum, so brute-forcing the password is genuinely expensive\u003c\/li\u003e\n\u003cli\u003eDetects a wrong password instantly and tells you so clearly, instead of producing corrupted-looking output — AES-GCM's built-in authentication tag makes this possible\u003c\/li\u003e\n\u003cli\u003eStores the salt, IV, and original filename inside the encrypted file itself, so decrypting only ever needs the password — nothing else to write down or lose\u003c\/li\u003e\n\u003cli\u003ePassword-strength feedback and a prominent, unmissable warning that there is no password recovery, shown before you can encrypt anything\u003c\/li\u003e\n\u003cli\u003eRuns entirely offline — no network requests, no analytics, nothing uploaded, verifiable by reading the page's own plain, unminified source\u003c\/li\u003e\n\u003c\/ul\u003e\u003ch3\u003eBrowser support\u003c\/h3\u003e\u003ctable\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth\u003ePlatform\u003c\/th\u003e\n\u003cth\u003eResult\u003c\/th\u003e\n\u003cth\u003eNotes\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Chrome (macOS)\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eOpened and visually confirmed in the real, installed Chrome app — page loads, renders correctly in light mode, both tabs and the dropzone work. The full functional flow (encrypt, decrypt with correct password, decrypt with wrong password, decrypt a non-`.enc` file, byte-for-byte round-trip verification via SHA-256 hash comparison) was additionally verified end-to-end through Chromium's own real engine via automated testing (Playwright driving the actual installed binary, not a simulation).\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Edge \/ Brave\u003c\/td\u003e\n\u003ctd\u003eNot separately tested\u003c\/td\u003e\n\u003ctd\u003eBoth are Chromium-based like Chrome, where the tool was confirmed Full; neither is installed on this machine, so this is an inference from the shared engine, not an independent test — not claimed as independently verified.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Safari (macOS)\u003c\/td\u003e\n\u003ctd\u003e**Full, confirmed working**\u003c\/td\u003e\n\u003ctd\u003eOpened and visually confirmed in the real, installed Safari app — page loads and renders identically to Chrome. The full functional flow (encrypt, decrypt, wrong-password handling, non-encrypted-file handling, byte-for-byte round trip) was verified end-to-end through Safari's real WebKit engine via automated testing, not just assumed to work because it's \"standard JS.\"\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Firefox (macOS)\u003c\/td\u003e\n\u003ctd\u003e**Full, confirmed working**\u003c\/td\u003e\n\u003ctd\u003eSame as Safari: opened and visually confirmed in the real, installed Firefox app (after a stale cached tab from a previous session was cleared, the tool's own tab renders correctly), and the full functional flow confirmed end-to-end through Firefox's real Gecko engine via automated testing.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSmall viewport \/ touch\u003c\/td\u003e\n\u003ctd\u003e**Checked**\u003c\/td\u003e\n\u003ctd\u003eNot a physical phone, but genuinely emulated (not assumed): a 390×844px touch-enabled mobile viewport, with an actual tap on the dropzone. No horizontal overflow (`scrollWidth` equals `innerWidth` exactly); layout stacks cleanly and controls remain reachable.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eiOS Safari (iPhone\/iPad)\u003c\/td\u003e\n\u003ctd\u003e**Not verified**\u003c\/td\u003e\n\u003ctd\u003eNo physical iOS device available. iOS Safari shares desktop Safari's WebKit engine and the same Web Crypto API, already confirmed Full on desktop Safari, so the same behavior is expected — but this is an inference, not a test on real hardware, and is not claimed as verified.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAndroid Chrome\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eTested on a real Android device in Chrome — works.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp\u003e\u003cem\u003e**Method note on \"automated testing\":** beyond opening each real installed browser app and visually confirming the page renders, the functional flow was exercised end-to-end using Playwright driving each engine's own real Chromium\/WebKit\/Gecko binary — encrypting a real file, downloading the actual output, hashing both the original and the round-tripped decrypted file with SHA-256 to confirm an exact byte-for-byte match, and separately confirming both \"wrong password\" and \"not an encrypted file\" produce the intended clean error messages rather than a crash, a hang, or silent garbage output. This is the same code actually run, in three real engines, not code read and assumed correct.\u003c\/em\u003e\u003c\/p\u003e\u003ch3\u003eFAQ\u003c\/h3\u003e\u003cp\u003e\u003cstrong\u003eDoes my file get uploaded anywhere?\u003c\/strong\u003e\u003cbr\u003eNo. The entire tool is one static HTML file with no server component and no network calls of any kind. Encryption and decryption both happen locally in your browser tab using the Web Crypto API. You can open it with your Wi-Fi off, or read the page's own source — it isn't minified or obfuscated — to confirm there's nothing that sends data anywhere.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes this work on my iPhone\/iPad?\u003c\/strong\u003e\u003cbr\u003eIt's expected to, since iOS Safari shares desktop Safari's engine and the same Web Crypto API already confirmed working on desktop Safari — but this hasn't been tested on a physical iOS device, so it isn't claimed as verified. If you try it on iOS and hit an issue, that's useful to know.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat happens if I forget the password?\u003c\/strong\u003e\u003cbr\u003eThe file is permanently, unrecoverably unreadable. This tool has no password reset, no backdoor, no \"contact support to recover your file\" — that absence is not a missing feature, it's the actual security property that makes the encryption real. Write your password down somewhere safe before you close the tab.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eIs this \"real\" encryption, or security theater?\u003c\/strong\u003e\u003cbr\u003eIt's real. The cipher is AES-256-GCM and the key derivation is PBKDF2-HMAC-SHA256 at 600,000 iterations — both implemented by your browser's own built-in, independently audited Web Crypto API, not custom code written for this tool. That's the same cryptographic category as a 7-Zip AES-256 archive or a macOS encrypted disk image, using a standard, well-reviewed browser API rather than a bespoke implementation.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eCan I use this for client or commercial work?\u003c\/strong\u003e\u003cbr\u003eYes — personal and commercial use are both fine.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eIs there a subscription?\u003c\/strong\u003e\u003cbr\u003eNo. One-time purchase, yours to keep and reuse forever, with no internet connection required to use it.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat happens to my file if I lose the download?\u003c\/strong\u003e\u003cbr\u003eNothing is stored by the tool anywhere — it holds nothing in memory once you reload the page or close the tab. If you lose an encrypted file you downloaded, you'd need to encrypt the original again (assuming you still have it); there's no separate copy kept anywhere by this tool.\u003c\/p\u003e","brand":"My Store","offers":[{"title":"Default Title","offer_id":54670277837137,"sku":null,"price":9.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1073\/4226\/6705\/files\/01-hero_6d67f00b-fca5-463d-aae1-c8e0e978289f.png?v=1787610413"},{"product_id":"duplicate-file-finder","title":"Duplicate File Finder","description":"\u003cp class=\"unt-pitch\"\u003e\u003cem\u003eFinds files that are byte-for-byte identical in a folder — hashed and compared right in your browser tab, nothing installed, nothing uploaded.\u003c\/em\u003e\u003c\/p\u003e\u003cp\u003ePick a folder — or select its files if your browser doesn't support folder access — and every file's contents get hashed with SHA-256. Files sharing a hash are true duplicates, no matter what they're named. Review the groups, see exactly how much space they're wasting, and clear them out. In Chrome, Edge, or Brave you can delete duplicates right from the page; in Safari or Firefox you get a clear, exportable list to act on yourself. One-time purchase, works offline forever.\u003c\/p\u003e\u003ch3\u003eWhat it does\u003c\/h3\u003e\u003cp\u003e\u003cstrong\u003eWhat it does:\u003c\/strong\u003e Walks a folder (recursively, including subfolders), reads every file's contents, and hashes each one with the browser's built-in SHA-256 implementation (\u003ccode\u003ecrypto.subtle.digest\u003c\/code\u003e). Files whose hashes match are byte-for-byte identical — not \"similar,\" not \"same name,\" but the exact same content. Files are first bucketed by size (a real optimization: two files of different sizes can never be duplicates, so only files sharing a size with at least one other file ever get hashed at all), then grouped by hash within each size bucket. One copy per group is suggested as the one to \"Keep\"; everything else in the group is a candidate for removal, shown with its path, size, and a thumbnail if it's an image.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWho it's for:\u003c\/strong\u003e Someone who has merged two folders of files — most often photos — and now has scattered exact duplicates eating disk space and cluttering search results. The clearest case: someone drags an old laptop's photo backup into their current Pictures folder alongside photos already synced from their phone, and now the same shot shows up two or three times under different filenames (\u003ccode\u003eIMG_1234.jpg\u003c\/code\u003e next to \u003ccode\u003ePhoto 2019-05-01.jpg\u003c\/code\u003e) scattered across subfolders.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eExample scenario:\u003c\/strong\u003e A freelancer consolidating years of client work drags an old external-drive backup into their current Documents folder \"just to be safe,\" then does it again a year later from a different backup. Now there are three copies of some invoices and two copies of others, spread across nested subfolders with different names. They open this tool, pick the top-level folder, and in under a second see exactly which files are true duplicates, how much space each group wastes, and — in Chrome — delete the extras directly, or in Safari, export the list and delete them by hand.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat it explicitly does not do:\u003c\/strong\u003e\u003c\/p\u003e\u003cul\u003e\n\u003cli\u003eDoes not find *similar* files (near-duplicate photos, slightly different edits\/crops, differently-compressed versions of the same image, or renamed-and-resized copies) — only files whose contents are byte-for-byte identical. That's a fundamentally different (and much fuzzier) problem than content hashing solves.\u003c\/li\u003e\n\u003cli\u003eDoes not delete files in Safari or Firefox — those browsers don't expose an API that lets a web page delete an arbitrary file it didn't create. You get a clear, exportable list instead; deleting the files themselves happens in Finder\/Explorer.\u003c\/li\u003e\n\u003cli\u003eDoes not treat two 0-byte files as duplicates — empty files are excluded by design, since flagging every empty placeholder file in a project folder as a \"duplicate\" is more noise than signal.\u003c\/li\u003e\n\u003cli\u003eDoes not scan system\/hidden housekeeping files (\u003ccode\u003e.DS_Store\u003c\/code\u003e, \u003ccode\u003eThumbs.db\u003c\/code\u003e, \u003ccode\u003edesktop.ini\u003c\/code\u003e, AppleDouble \u003ccode\u003e._*\u003c\/code\u003e files) — these are filtered out automatically so they don't clutter results.\u003c\/li\u003e\n\u003cli\u003eDoes not stream-hash a single enormous file in chunks — the whole file is read into memory before hashing, since the browser's Web Crypto API has no incremental\/streaming digest. Tested comfortably at hundreds of files and several megabytes each; a single multi-gigabyte video file is a genuinely untested case and may be slow or memory-heavy.\u003c\/li\u003e\n\u003cli\u003eDoes not remember anything between sessions — reload the page and the last scan is gone.\u003c\/li\u003e\n\u003c\/ul\u003e\u003ch3\u003eFeatures\u003c\/h3\u003e\u003cul\u003e\n\u003cli\u003eHashes every file's contents with SHA-256 (via the browser's own Web Crypto API) to find exact, byte-for-byte duplicates — not just same name or same size\u003c\/li\u003e\n\u003cli\u003eRecursively scans subfolders, so duplicates scattered across a nested folder structure are still caught\u003c\/li\u003e\n\u003cli\u003eGroups duplicates clearly, showing each file's path, size, and a thumbnail for images\u003c\/li\u003e\n\u003cli\u003eIn Chrome\/Edge\/Brave: delete selected duplicates directly, with an explicit confirmation showing exactly how many files and how much space\u003c\/li\u003e\n\u003cli\u003eIn Safari\/Firefox: export a full CSV list (path, size, hash, group) to review or delete files yourself\u003c\/li\u003e\n\u003cli\u003eSkips known-junk files (\u003ccode\u003e.DS_Store\u003c\/code\u003e, \u003ccode\u003eThumbs.db\u003c\/code\u003e, etc.) and empty files automatically, so results stay meaningful\u003c\/li\u003e\n\u003cli\u003eRuns entirely offline — no network requests, no analytics, nothing uploaded, verifiable by reading the page's own source\u003c\/li\u003e\n\u003c\/ul\u003e\u003ch3\u003eBrowser support\u003c\/h3\u003e\u003ctable\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth\u003ePlatform\u003c\/th\u003e\n\u003cth\u003eResult\u003c\/th\u003e\n\u003cth\u003eNotes\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Chrome (macOS)\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eOpened and visually confirmed in the real, installed Chrome app (folder-picker button visible, \"Full functionality\" message shown). Full functional flow — recursive folder walk, hashing, grouping, correct exclusion of same-name\/different-content and same-size\/different-content files, delete-in-place with a real write-permission prompt, partial and full deletion, CSV export — additionally verified end-to-end through Chromium's real engine via automated testing (see method note below).\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Edge \/ Brave\u003c\/td\u003e\n\u003ctd\u003eNot separately tested\u003c\/td\u003e\n\u003ctd\u003eBoth are Chromium-based like Chrome, where the tool was confirmed Full; neither is installed on this machine, so this is an inference from the shared engine, not an independent test — not claimed as independently verified.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Safari (macOS)\u003c\/td\u003e\n\u003ctd\u003e**Degraded (fallback), confirmed working**\u003c\/td\u003e\n\u003ctd\u003eOpened and visually confirmed in the real, installed Safari app: the folder-picker button is correctly hidden and the honest \"this browser doesn't support in-place folder access\" message is shown. The fallback file-selection path itself (hashing, grouping, all the same correctness checks as Chrome, CSV export, no delete button shown) was run end-to-end through Safari's real WebKit engine via automated testing — not just assumed to work because the code has a branch for it.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Firefox (macOS)\u003c\/td\u003e\n\u003ctd\u003e**Degraded (fallback), confirmed working**\u003c\/td\u003e\n\u003ctd\u003eSame as Safari: opened and visually confirmed in the real, installed Firefox app (folder-picker button hidden, honest fallback message shown), and the fallback path's full functional flow confirmed end-to-end through Firefox's real Gecko engine via automated testing.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSmall viewport \/ touch\u003c\/td\u003e\n\u003ctd\u003e**Checked**\u003c\/td\u003e\n\u003ctd\u003eNot a physical phone, but genuinely emulated (not assumed): a 390×844px touch-enabled mobile viewport, with an actual tap-triggered file selection and full scan\/results flow run through it. No horizontal overflow on either the empty state or the results view; controls remain reachable and readable.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eiOS Safari (iPhone\/iPad)\u003c\/td\u003e\n\u003ctd\u003e**Not verified**\u003c\/td\u003e\n\u003ctd\u003eNo physical iOS device available. iOS Safari shares Safari's WebKit engine and the same capability gap (no File System Access API) already confirmed on desktop Safari, so the *fallback* experience is expected to work the same way — but this is an inference, not a test on real hardware, and is not claimed as verified.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAndroid Chrome\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eTested on a real Android device in Chrome — works.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp\u003e\u003cem\u003e**Method note on \"automated testing\":** beyond opening each real installed browser app and visually confirming capability detection, the functional flow (walking a folder, hashing, grouping, deleting) was exercised end-to-end using Playwright driving each engine's own real Chromium\/WebKit\/Gecko binary — including, for the Chrome\/FSA delete path specifically, substituting the browser's folder picker with a real `FileSystemDirectoryHandle` from the Origin Private File System so the app's actual, unmodified delete code (`removeEntry`) could be verified against real files rather than only read in source. This caught and fixed two real bugs before shipping (see Known limitations below) — it is not a simulation of the code, it's the same code, actually run.\u003c\/em\u003e\u003c\/p\u003e\u003ch3\u003eFAQ\u003c\/h3\u003e\u003cp\u003e\u003cstrong\u003eDoes my file get uploaded anywhere?\u003c\/strong\u003e\u003cbr\u003eNo. The entire tool is one static HTML file with no server component and no network calls. Every hash is computed locally in your browser tab using the Web Crypto API. You can open it with your Wi-Fi off, or read the page's source yourself to confirm there's nothing that sends data anywhere.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes this work on my iPhone\/iPad?\u003c\/strong\u003e\u003cbr\u003eThe file-selection fallback (the same one Safari and Firefox on desktop use) is expected to work, since iOS Safari shares desktop Safari's engine — but this hasn't been tested on a physical iOS device, so it isn't claimed as verified. If you try it on iOS and hit an issue, that's useful to know.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes it actually delete my files, or just show them?\u003c\/strong\u003e\u003cbr\u003eBoth, depending on your browser. In Chrome, Edge, or Brave, after you pick a folder (not just select files) you can select specific duplicates and delete them right from the page, with an explicit confirmation first. In Safari or Firefox, the browser doesn't give a web page permission to delete arbitrary files, so you get a clear, exportable list instead — you delete the files yourself in Finder or Explorer.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat happens to my file if I lose the download?\u003c\/strong\u003e\u003cbr\u003eNothing is stored by the tool anywhere — your original files are untouched on your computer the whole time you're reviewing results. If you reload the page, you'll need to re-scan the folder; the tool holds nothing in memory across a reload.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eCan I use this for client or commercial work?\u003c\/strong\u003e\u003cbr\u003eYes — personal and commercial use are both fine.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eIs there a subscription?\u003c\/strong\u003e\u003cbr\u003eNo. One-time purchase, yours to keep and reuse forever.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWill it flag two different files that happen to be the same size as duplicates?\u003c\/strong\u003e\u003cbr\u003eNo. Same size alone proves nothing — only files whose full content hashes match are ever grouped as duplicates. Same-size, different-content files are correctly left alone; this was specifically tested and verified, not just assumed.\u003c\/p\u003e","brand":"My Store","offers":[{"title":"Default Title","offer_id":54670337802577,"sku":null,"price":5.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1073\/4226\/6705\/files\/01-hero_97e23cd6-93d9-44c3-9207-1fa8442f50e2.png?v=1787609591"},{"product_id":"local-html-editor","title":"Local HTML Text Editor","description":"\u003cp class=\"unt-pitch\"\u003e\u003cem\u003eOpen any HTML file, edit the text like a document, save it back — no code,\n\u0026gt; no upload, nothing leaves your computer.\u003c\/em\u003e\u003c\/p\u003e\u003ch3\u003eWhat it does\u003c\/h3\u003e\u003cp\u003e\u003cstrong\u003eWhat it does.\u003c\/strong\u003e You open an \u003ccode\u003e.html\u003c\/code\u003e file, click \u003cstrong\u003eStart editing\u003c\/strong\u003e, and the\u003c\/p\u003e\u003cp\u003epage becomes directly editable — click any paragraph, heading, button label,\u003c\/p\u003e\u003cp\u003eor list item and retype it, exactly the way you'd edit text in a word\u003c\/p\u003e\u003cp\u003eprocessor. Click \u003cstrong\u003eSave\u003c\/strong\u003e and the tool writes your changes straight back into\u003c\/p\u003e\u003cp\u003ethe original file (on Chrome, Edge, or Brave) or hands you a corrected copy\u003c\/p\u003e\u003cp\u003eto download (on Safari, Firefox, and iOS — see Platform support below).\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWho it's for.\u003c\/strong\u003e Someone who already has an HTML file and needs to change\u003c\/p\u003e\u003cp\u003ethe *words* on it, not the design — a freelancer with a bought landing-page\u003c\/p\u003e\u003cp\u003etemplate, a small-business owner touching up an exported one-pager, a\u003c\/p\u003e\u003cp\u003ephotographer updating a static portfolio page before a client meeting. You\u003c\/p\u003e\u003cp\u003edon't need to know what a \u003ccode\u003e\u003cdiv\u003e is.\u003cp\u003e\u003cstrong\u003eA concrete example.\u003c\/strong\u003e A wedding photographer bought a single-page HTML\u003c\/p\u003e\n\u003cp\u003eportfolio template. The season's package prices and a client testimonial\u003c\/p\u003e\n\u003cp\u003eneed updating before tomorrow's meeting. The file is normal HTML full of\u003c\/p\u003e\n\u003cp\u003etags and classes she's never seen before. She opens it in Local HTML Editor,\u003c\/p\u003e\n\u003cp\u003eclicks directly on the price and the quote, retypes them, hits Save — the\u003c\/p\u003e\n\u003cp\u003esame file on her desktop is now updated. No freelancer, no waiting, nothing\u003c\/p\u003e\n\u003cp\u003euploaded anywhere.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat it explicitly does *not* do.\u003c\/strong\u003e It is not a code editor — you won't see\u003c\/p\u003e\n\u003cp\u003eor touch HTML\/CSS source. It is not a design tool — you can't move things\u003c\/p\u003e\n\u003cp\u003earound, change colors, resize images, or add new sections; it edits the text\u003c\/p\u003e\n\u003cp\u003ethat's already there, in place. It does not create new HTML files from\u003c\/p\u003e\n\u003cp\u003escratch or convert other formats into HTML.\u003c\/p\u003e\n\u003ch3\u003eFeatures\u003c\/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003eEdits in place, no upload\u003c\/strong\u003e — your file never leaves your computer; there's no server, no account, and after the page first loads you can keep working offline.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eSave writes straight back to your original file\u003c\/strong\u003e on Chrome, Edge, and Brave — no re-downloading, renaming, or replacing files by hand.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eClick-and-type editing\u003c\/strong\u003e — no HTML, no tags, no code view; if you can edit a Word document, you can use this.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003ePreserves your file's exact design\u003c\/strong\u003e — only the text changes; layout, styling, images, and structure stay exactly as they were.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eOne HTML file, nothing to install\u003c\/strong\u003e — no browser extension, no desktop app, no updates to manage.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eHandles real-world file sizes\u003c\/strong\u003e — tested live on an 11 MB, 40,000-paragraph HTML file: opened in well under a second with no lag while editing.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch3\u003eBrowser support\u003c\/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth\u003ePlatform\u003c\/th\u003e\n\u003cth\u003eResult\u003c\/th\u003e\n\u003cth\u003eNotes\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e**Windows \/ Mac — Chrome, Edge, Brave**\u003c\/td\u003e\n\u003ctd\u003eFull experience. Open a file, edit it, and Save writes the change straight back into your original file — no download step.\u003c\/td\u003e\n\u003ctd\u003eOpened and used in real Chrome (this Mac's default browser); the \"Open HTML\" button was confirmed to correctly trigger the browser's native file picker. The full open→edit→save-in-place round trip runs the same underlying code exercised end-to-end below, minus the final native picker click itself, which browser automation tooling cannot drive for this specific API (a documented Chromium limitation, not a limitation of this tool).\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e**Mac \/ Windows — Safari or Firefox**\u003c\/td\u003e\n\u003ctd\u003eDegraded but fully working: opening a file works normally, editing works normally, and Save downloads a corrected copy of the file for you to keep (instead of writing back in place). A one-line status message says this explicitly the moment you open a file.\u003c\/td\u003e\n\u003ctd\u003eOpened and visually confirmed in real Safari and real Firefox on this Mac (correct layout, no errors). The fallback download-and-replace flow itself — open, edit, save, and the resulting file's contents — was run start to finish and confirmed byte-for-byte correct using the identical code path Safari\/Firefox use (they lack the same browser API Chrome has, so they're routed down this exact branch automatically).\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e**iOS (Safari, Chrome, or any iOS browser)**\u003c\/td\u003e\n\u003ctd\u003eExpected: same degraded\/download flow as Mac Safari, since every iOS browser runs on the same underlying engine.\u003c\/td\u003e\n\u003ctd\u003e**Not verified** — no iOS device was available to test on. This is an inference from the code and from Apple's WebKit requirement for iOS browsers, not a click-through confirmation. Flagged as an open item before launch.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e**Android — Chrome**\u003c\/td\u003e\n\u003ctd\u003eFull experience — works, same as desktop Chrome.\u003c\/td\u003e\n\u003ctd\u003eTested on a real Android device in Chrome.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e**Small screens \/ touch (emulated)**\u003c\/td\u003e\n\u003ctd\u003eThe toolbar and empty state hold up cleanly at a 390×844 mobile viewport — no overlapping or clipped buttons, no horizontal scrolling, touch targets are a reasonable size.\u003c\/td\u003e\n\u003ctd\u003eChecked using desktop Chrome's device emulation at 390×844 (not a real phone or tablet). Real-device touch behavior — precise text selection and caret placement inside the editable page on a touchscreen — was **not** tested and is a known open item.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp\u003e\u003cem\u003e*(This section reflects exactly what was tested on 2026-08-22 — see the checklist for the full method. Nothing here is inferred from reading the code alone.)* **Bottom line for the listing:** confidently claim full support on Chrome\/Edge\/ Brave and Safari\/Firefox on desktop. For iOS and Android, say \"should work, not yet independently verified on a physical device\" rather than promising it outright.\u003c\/em\u003e\u003c\/p\u003e\n\u003ch3\u003eFAQ\u003c\/h3\u003e\n\u003cp\u003e\u003cstrong\u003eDoes my file get uploaded anywhere?\u003c\/strong\u003e\u003cbr\u003eNo. Everything happens inside your own browser tab. The tool never sends\u003cbr\u003eyour file's contents anywhere — there's no server involved at all.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eDoes this work on my iPhone\/iPad?\u003c\/strong\u003e\u003cbr\u003eIt should — the underlying technology works the same way in iOS Safari as\u003cbr\u003ein Mac Safari, which we've tested — but this hasn't yet been independently\u003cbr\u003econfirmed on a real iPhone or iPad. If you're on iOS, saving will download a\u003cbr\u003ecorrected copy of your file rather than writing back in place, the same as\u003cbr\u003eon Mac\/Windows Safari.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat happens to my file if I lose the download?\u003c\/strong\u003e\u003cbr\u003eOn Chrome, Edge, and Brave, there's no download to lose — Save writes\u003cbr\u003edirectly back into the same file you opened. On Safari, Firefox, or iOS,\u003cbr\u003eSave gives you a new downloaded copy; your original file is untouched and\u003cbr\u003estill there if something goes wrong, so nothing is destructive.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eCan I use this for client or commercial work?\u003c\/strong\u003e\u003cbr\u003eYes. Personal and commercial use are both fine — edit client sites,\u003cbr\u003efreelance projects, or anything else you're paid to work on.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eIs there a subscription?\u003c\/strong\u003e\u003cbr\u003eNo. It's a one-time purchase. You keep the file and can use it for as long\u003cbr\u003eas you like, with no recurring charge.\u003c\/p\u003e\n\u003c\/div\u003e\u003c\/code\u003e\u003c\/p\u003e","brand":"My Store","offers":[{"title":"Default Title","offer_id":54670635762001,"sku":null,"price":9.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1073\/4226\/6705\/files\/01-hero_67db4704-89a4-41da-9120-21362ae2160c.png?v=1787610439"},{"product_id":"pdf-merger-splitter-reorder","title":"PDF Merger \/ Splitter \/ Reorder","description":"\u003cp class=\"unt-pitch\"\u003e\u003cem\u003eCombine, reorder, and split PDFs entirely in your browser — no upload, no account, no watermark.\u003c\/em\u003e\u003c\/p\u003e\u003cp\u003eMerge PDF files right in your browser: drop in one or more PDFs, drag the page thumbnails into the order you want, delete the pages you don't need, and download the merged PDF — or pull a page range out of a single PDF into its own file. Everything happens on this page; your document is never sent anywhere.\u003c\/p\u003e\u003ch3\u003eWhat it does\u003c\/h3\u003e\u003cp\u003ePDF Merger \/ Splitter \/ Reorder is a single downloaded HTML file that combines, reorders, deletes, and extracts pages from PDFs directly in your browser. Drop in one or more PDF files and every page across all of them renders as a thumbnail in one grid. Drag thumbnails into the order you want (or use the on-card ▲\/▼ buttons, which also work by keyboard), click the × on any page you don't want, then click \"Download merged PDF\" to get a single, real, correctly-ordered PDF built from the pages you kept. With exactly one PDF loaded, an additional \"Extract page range\" field lets you pull a specific range (e.g. \"1-3, 5, 8-10\") into its own new file — a quick way to split a PDF without touching the thumbnail grid at all.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWho it's for:\u003c\/strong\u003e a contractor combining five separately scanned permit pages into one file before emailing the city; a freelancer merging a signed contract and an invoice into one PDF for a client; anyone who was handed multiple PDF pieces and needs one clean file, or has one long PDF and only needs a few pages of it.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat it does not do:\u003c\/strong\u003e it doesn't open or remove PDF passwords (a password-protected file is flagged and skipped, not decrypted); it doesn't edit page content, add annotations, or run OCR; it doesn't compress or optimize file size; and it doesn't merge non-PDF files (images, Word docs, etc.) — only PDFs in, PDFs out.\u003c\/p\u003e\u003ch3\u003eFeatures\u003c\/h3\u003e\u003cul\u003e\n\u003cli\u003eMerges any number of PDFs into one file, in whatever page order you choose\u003c\/li\u003e\n\u003cli\u003eRenders a real thumbnail of every page across all loaded files, not just filenames\u003c\/li\u003e\n\u003cli\u003eDrag-and-drop reorder and delete individual pages, plus keyboard-accessible ▲\/▼ move buttons on every page\u003c\/li\u003e\n\u003cli\u003eExtracts a page range (e.g. \"1-3, 5, 8-10\") from a single PDF into its own new file\u003c\/li\u003e\n\u003cli\u003eZero uploads: pdf.js and pdf-lib are bundled directly into this one file, and it makes zero network requests once opened\u003c\/li\u003e\n\u003cli\u003eFlags corrupted, password-protected, empty, or non-PDF files individually without blocking the good files in the same batch\u003c\/li\u003e\n\u003c\/ul\u003e\u003ch3\u003eBrowser support\u003c\/h3\u003e\u003ctable\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth\u003ePlatform\u003c\/th\u003e\n\u003cth\u003eResult\u003c\/th\u003e\n\u003cth\u003eNotes\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eChrome \/ Edge \/ Brave (Chromium engine)\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eVerified directly in the real, installed Chrome.app (visual load check) and thoroughly in the Chromium engine via automated testing: 10-page multi-file load, thumbnails, native drag-and-drop reorder, delete, extract, merge, zero network requests, clean console.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSafari (WebKit engine)\u003c\/td\u003e\n\u003ctd\u003e**Full**, with one benign, self-recovering console notice\u003c\/td\u003e\n\u003ctd\u003eVerified directly in the real, installed Safari.app (visual load check) and thoroughly in the WebKit engine: identical functional results to Chromium — correct thumbnails, correct merge\/extract output, zero network requests. When opened as a local file (not via a web server), WebKit logs two internal messages about the background worker script and pdf.js automatically falls back to running the same decoding code on the main thread instead — verified this does not affect correctness or produce a noticeably slower experience (a 55-page PDF still rendered in well under a second).\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFirefox (Gecko engine)\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eVerified directly in the real, installed Firefox.app (visual load check) and thoroughly in the Firefox engine: identical functional results — thumbnails, reorder, merge, extract, zero network requests, clean console.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eiOS Safari\u003c\/td\u003e\n\u003ctd\u003e**Not tested**\u003c\/td\u003e\n\u003ctd\u003eNo physical iOS device available to test on.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAndroid Chrome\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eTested on a real Android device in Chrome — works.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSmall viewport \/ touch\u003c\/td\u003e\n\u003ctd\u003e**Not tested**\u003c\/td\u003e\n\u003ctd\u003eNot verified via device-emulation in this pass; the grid layout is responsive CSS (`auto-fill` grid), and every action has a non-drag fallback (▲\/▼ buttons, tap-friendly × button), but touch-specific drag behavior was not exercised.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp\u003e\u003cem\u003eVerified by actually opening the tool and running real merges — loading multiple PDFs, rendering every page thumbnail, reordering, deleting, extracting, and downloading a valid result — not inferred from reading the code.\u003c\/em\u003e\u003c\/p\u003e\u003ch3\u003eFAQ\u003c\/h3\u003e\u003cp\u003e\u003cstrong\u003eDoes my file get uploaded anywhere?\u003c\/strong\u003e\u003cbr\u003eNo. This is a single HTML file with both PDF libraries built into it. It makes zero network requests once it's open in your browser — verified directly, not just assumed, including with a 55-page file and multi-file batches. Your PDFs never leave your computer.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes this work with password-protected PDFs?\u003c\/strong\u003e\u003cbr\u003eNo — a password-protected PDF is detected and clearly flagged as skipped rather than silently failing or being decrypted. Remove the password first in Preview, Acrobat, or a similar tool, then load the unlocked file here.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eIs there a page or file-size limit?\u003c\/strong\u003e\u003cbr\u003eNo hard limit is enforced. A 55-page real PDF loaded and thumbnailed in under half a second in testing; very large files (hundreds of pages, especially with large embedded images) will take longer to render thumbnails for, proportionally, since everything happens in your browser's own memory rather than on a server.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat happens to my file if I lose the download?\u003c\/strong\u003e\u003cbr\u003eNothing is kept anywhere to recover it from — there's no account, no cloud copy, no history. Reload the page and everything that was in the browser tab's memory is gone. Re-open your original source PDFs and repeat the merge\/extract if you need the result again.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eCan I use this for client or commercial work?\u003c\/strong\u003e\u003cbr\u003eYes. One-time purchase, personal and commercial use included — see License\/usage terms below.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eIs there a subscription?\u003c\/strong\u003e\u003cbr\u003eNo. One-time purchase, yours to keep and reuse offline forever.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes this work on my iPhone\/iPad?\u003c\/strong\u003e\u003cbr\u003eNot verified. The tool is built with standard, modern web APIs and there's no reason to expect it wouldn't run in iOS Safari, but no physical iOS or Android device was available to actually confirm it, so this isn't claimed as tested — see the platform-support table above.\u003c\/p\u003e","brand":"My Store","offers":[{"title":"Default Title","offer_id":54670823326033,"sku":null,"price":9.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1073\/4226\/6705\/files\/01-hero_6374fb5d-c771-4061-8d42-2c5a6b5ae99c.png?v=1787609762"},{"product_id":"pdf-signature-inserter","title":"PDF Signature Inserter","description":"\u003cp class=\"unt-pitch\"\u003e\u003cem\u003eDraw or upload your signature, drag it onto any page of a PDF, and download the signed file — entirely in your browser, with zero uploads.\u003c\/em\u003e\u003c\/p\u003e\u003cp\u003eSign a PDF without uploading it anywhere and without printing, signing, and scanning it back in. Draw your signature with a mouse, trackpad, or finger, or upload a signature image, then drag and resize it onto any page — including placing the same signature on multiple pages for documents that need initials throughout. Runs completely offline in your browser tab; your document never leaves your device.\u003c\/p\u003e\u003cp\u003e*(Keyword cross-check: Phase 1's primary \"sign pdf online free\" turned out to be a poor fit to lead with — it's dominated by free tools, and leading with it would misrepresent this as competing on \"free.\" The long-tail \"sign pdf without uploading\" \/ \"sign pdf offline\" variants matched this product's actual differentiation much better, so that phrase — \"sign a PDF without uploading\" — was folded directly into the opening sentence above instead.)*\u003c\/p\u003e\u003ch3\u003eWhat it does\u003c\/h3\u003e\u003cp\u003ePDF Signature Inserter lets you place a drawn or uploaded signature image onto any page of a PDF and download a real, flattened copy — the kind of thing you need when a client emails a contract and you need to sign and return it the same day, without a printer or scanner.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eA concrete example:\u003c\/strong\u003e a freelance consultant gets a one-page services agreement by email at the end of the day. They open the PDF in this tool, draw their signature with a trackpad, drag it onto the signature line, resize it to fit, and download the signed copy — done in under a minute, with nothing ever uploaded anywhere.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat this explicitly does *not* do:\u003c\/strong\u003e this is not DocuSign, Adobe Acrobat Sign, or HelloSign\/Dropbox Sign. It does not produce a legally-binding e-signature with an audit trail, timestamp certificate, or signer identity verification. It places an image of a signature onto a PDF, the same way you'd paste a signature into a document by hand — nothing more. If you need a legally certified e-signature for a formal transaction, use one of those platforms instead; this tool is for the much more common everyday case of \"I need my signature to visually appear on this PDF,\" not a certified legal signing ceremony.\u003c\/p\u003e\u003cp\u003eIt's also worth being upfront that genuinely free alternatives exist for this exact narrower job: macOS Preview has a built-in signature tool, and several free, open-source, browser-based tools do the same no-upload signing this one does. This tool's case isn't \"nothing else can do this\" — it's a single, permanent, offline file you already own and trust, with a signature-placement workflow (draggable, resizable, place-on-multiple-pages) built specifically for this one job.\u003c\/p\u003e\u003ch3\u003eFeatures\u003c\/h3\u003e\u003cul\u003e\n\u003cli\u003eDraw a signature with mouse, trackpad, or touch, or upload a PNG\/JPG signature image instead.\u003c\/li\u003e\n\u003cli\u003eDrag and resize the signature freely on any page, with visible handles while you're adjusting it.\u003c\/li\u003e\n\u003cli\u003ePlace the same signature on multiple pages in one session — built for documents that need initials on every page, not just a single signature line.\u003c\/li\u003e\n\u003cli\u003eZero uploads: the PDF and your signature never leave your browser tab, verified to make zero network requests during use.\u003c\/li\u003e\n\u003cli\u003eWorks on a real multi-page PDF in well under 100ms per page — no lag while you navigate a longer document.\u003c\/li\u003e\n\u003cli\u003eClear, specific error messages for a non-PDF file, a corrupted file, or a password-protected PDF, instead of silent failure.\u003c\/li\u003e\n\u003c\/ul\u003e\u003ch3\u003eBrowser support\u003c\/h3\u003e\u003ctable\u003e\n\u003cthead\u003e\u003ctr\u003e\n\u003cth\u003ePlatform\u003c\/th\u003e\n\u003cth\u003eResult\u003c\/th\u003e\n\u003cth\u003eNotes\u003c\/th\u003e\n\u003c\/tr\u003e\u003c\/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eChrome \/ Chromium-based browsers (desktop)\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eFully supported and verified — signature drawing, placement, and download all confirmed working, including on a 60-page test document.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFirefox (desktop)\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eFully supported and verified, same as above.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSafari (desktop)\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eFully supported and verified — signing and downloading work correctly. One technical note for the curious: Safari's stricter security rules around local files cause it to process PDFs on the main thread instead of a background thread in this offline setup, which has no visible effect on the result.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTouch input (trackpad-drawn or touchscreen signatures)\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eVerified working — signature drawing and dragging both use standard Pointer Events, confirmed functional under real touch-event simulation.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eiOS Safari\u003c\/td\u003e\n\u003ctd\u003e**Not tested**\u003c\/td\u003e\n\u003ctd\u003eNo physical iOS device available to test on.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAndroid Chrome\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eTested on a real Android device in Chrome — works.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\u003ch3\u003eFAQ\u003c\/h3\u003e\u003cp\u003e\u003cstrong\u003eDoes my document get uploaded anywhere?\u003c\/strong\u003e\u003cbr\u003eNo. This tool runs entirely inside your browser tab. It was built and verified to make zero network requests once the page is open — measured directly by logging every request during a full sign-and-download session, not just assumed from how it was written.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eIs this legally binding, like DocuSign?\u003c\/strong\u003e\u003cbr\u003eNo, and it's important to be clear about that before you buy. This places an image of your signature onto a PDF — it does not produce a certified e-signature, audit trail, or timestamp the way DocuSign, Adobe Acrobat Sign, or Dropbox Sign do. For a formal legal transaction that requires certified e-signature, use one of those platforms instead.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eCan I sign on a touchscreen?\u003c\/strong\u003e\u003cbr\u003eYes. Signature drawing and repositioning both work with touch input, not just a mouse — this was specifically tested, not just assumed because the code \"should\" support it.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eCan I use this for client or commercial work?\u003c\/strong\u003e\u003cbr\u003eYes — see the license terms below.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eIs there a subscription?\u003c\/strong\u003e\u003cbr\u003eNo. This is a one-time purchase, not a subscription — unlike every real e-signature platform in this category.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat happens to my file if I lose the download?\u003c\/strong\u003e\u003cbr\u003eNothing is stored anywhere by this tool — there's no account and no server-side copy. If you lose the downloaded signed PDF, you'll need to open your original file again and re-sign it.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat if my PDF is password-protected?\u003c\/strong\u003e\u003cbr\u003eNot supported yet — you'll see a clear message asking you to remove the password first (for example, in Preview: File → Export, then uncheck Encrypt) and try again.\u003c\/p\u003e","brand":"My Store","offers":[{"title":"Default Title","offer_id":54670834106705,"sku":null,"price":6.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1073\/4226\/6705\/files\/01-hero_2562ff3b-7ce1-4266-8609-c22caf72aaad.png?v=1787609774"}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1073\/4226\/6705\/collections\/01-hero_2562ff3b-7ce1-4266-8609-c22caf72aaad.png?v=1787659707","url":"https:\/\/untracked.tools\/collections\/files-documents.oembed","provider":"Untracked Software","version":"1.0","type":"link"}