{"title":"Popular tools","description":null,"products":[{"product_id":"audio-video-trimmer-and-converter","title":"Audio\/Video Trimmer \u0026 Converter","description":"\u003cp class=\"unt-pitch\"\u003e\u003cem\u003eTrim, convert, and compress audio and video files entirely in your browser — nothing is ever uploaded, and it works with your Wi-Fi off.\u003c\/em\u003e\u003c\/p\u003e\u003cp\u003eA single HTML file that trims a clip to an exact range, converts between common audio\/video formats, or shrinks a file's size for email — all running FFmpeg compiled to WebAssembly, entirely on your own device. No install, no account, no upload, and it keeps working exactly the same way years from now.\u003c\/p\u003e\u003ch3\u003eWhat it does\u003c\/h3\u003e\u003cp\u003eThis tool does three things: \u003cstrong\u003etrim\u003c\/strong\u003e a video or audio file to a start\/end range using a draggable scrubber, \u003cstrong\u003econvert\u003c\/strong\u003e between common formats (MP4, WebM, MOV, MP3, WAV, M4A, OGG, GIF), and \u003cstrong\u003ecompress\u003c\/strong\u003e a file down with a quality slider and optional resolution downscale. It runs the real FFmpeg engine — compiled to WebAssembly — directly in this browser tab, in a background Worker, with genuine progress reporting. Nothing about your file ever leaves your device; there is no server involved at all, and this can be verified by disconnecting from the internet before using it.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWho it's for:\u003c\/strong\u003e anyone who occasionally needs to cut a phone video down to size for email, a client, or a form upload with a file-size limit, without installing a full video editor or trusting a video with client details in it to a third-party upload service.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eConcrete example:\u003c\/strong\u003e a real-estate agent shoots a 380MB, 6-minute phone walkthrough video of a listing. They trim the first 12 seconds of tripod-fumbling, compress it down with the \"Small\" quality preset, and get an MP4 small enough to actually attach to an email — without installing anything or sending the video to a stranger's server.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat this explicitly does not do:\u003c\/strong\u003e it is not a video editor (no multi-clip timelines, transitions, titles, or effects); it does not do batch\/multi-file processing (one file at a time); it does not guarantee real-time speed — WebAssembly FFmpeg is genuinely 5–20× slower than a native app, and a large file will take real, noticeable time; it does not use multi-core\/multi-threaded processing (a deliberate tradeoff, explained in the FAQ, that makes it work from a plain double-clicked file with no server).\u003c\/p\u003e\u003ch3\u003eFeatures\u003c\/h3\u003e\u003cul\u003e\n\u003cli\u003eTrims to an exact start\/end range with a draggable, keyboard-accessible scrubber, using a fast lossless cut when the format allows it and automatically falling back to a full re-encode when it doesn't\u003c\/li\u003e\n\u003cli\u003eConverts between MP4, WebM, MOV, MP3, WAV, M4A, OGG, and animated GIF\u003c\/li\u003e\n\u003cli\u003eCompresses with a 5-step quality slider (CRF-based for video, bitrate-based for audio) and an optional resolution cap (1080p\/720p\/480p)\u003c\/li\u003e\n\u003cli\u003eShows real, per-operation progress from the actual FFmpeg engine — not a fake progress bar\u003c\/li\u003e\n\u003cli\u003eRuns 100% locally: verified with real browser network-request interception that zero requests happen at runtime, including when opened directly as a \u003ccode\u003efile:\/\/\u003c\/code\u003e document\u003c\/li\u003e\n\u003cli\u003eReports the honest original-vs-result file size and processing time after every run\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 (real, installed Google Chrome, via CDP)\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eEngine loads, trim\/convert\/compress all produce valid ffprobe-verified output, zero network requests, real screenshots captured\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop WebKit (Safari's engine, Playwright-driven build)\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eSame full operation suite passed; zero network requests\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Safari.app (the actual shipped browser)\u003c\/td\u003e\n\u003ctd\u003e**Full, visually confirmed; deep interaction not separately scripted**\u003c\/td\u003e\n\u003ctd\u003eOpened via `open -a Safari`, confirmed frontmost via Safari's own AppleScript dictionary (not System Events UI-scripting, per this session's known Accessibility-permission limitation), screenshot shows \"engine: ready\" — i.e., the real WASM engine genuinely boots in real Safari. Full drag\/drop + trim\/convert\/compress interaction was verified on Safari's underlying WebKit engine (row above), not re-driven a second time inside the literal Safari.app process, since this machine cannot grant Accessibility permission for UI-scripting automation\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Firefox (Playwright-driven build)\u003c\/td\u003e\n\u003ctd\u003e**Full, but notably slower**\u003c\/td\u003e\n\u003ctd\u003eSame full operation suite passed; zero network requests; CPU-heavy operations measured ~14× slower than Chrome\/WebKit on this machine (see above)\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Firefox.app (the actual shipped browser)\u003c\/td\u003e\n\u003ctd\u003e**Full, visually confirmed**\u003c\/td\u003e\n\u003ctd\u003eOpened via `open -a Firefox`, screenshot shows \"engine: ready\" and correct layout\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eiOS Safari\u003c\/td\u003e\n\u003ctd\u003e**Not verified**\u003c\/td\u003e\n\u003ctd\u003eNo physical iOS device available. Not inferred as working either — WebAssembly and Worker support is broadly present in modern iOS Safari, but this tool's specific worker-messaging\/Blob-URL approach was found to have real, non-obvious platform-specific edge cases on desktop (see the two bugs above), so an untested \"probably fine\" claim would not meet this project's bar. Left explicitly unverified.\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 (emulated)**\u003c\/td\u003e\n\u003ctd\u003eChromium's iPhone 13 device emulation (`playwright.devices['iPhone 13']`), explicitly not a real device: empty state and loaded\/trim state both screenshot-verified as correctly responsive (no horizontal overflow, readable, properly stacked), and a real trim operation was run and produced a correct, ffprobe-verifiable-shape result through the emulated touch viewport. Actual touch-drag gesture on the trim scrubber's handles was not separately simulated (the trim range was set programmatically in this specific test, then run) — the scrubber's own `touchstart`\/`touchmove`\/`touchend` handlers exist in the code but weren't independently exercised by a simulated touch drag, so that narrow sub-claim is not verified.\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 file get uploaded anywhere?\u003c\/strong\u003e No. Everything happens inside this browser tab. You can turn off your Wi-Fi before using it and it will still work — that's a deliberate design choice, not a claim you have to take on faith.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhy is the download so large (~40MB)?\u003c\/strong\u003e Because it genuinely embeds a real WebAssembly build of FFmpeg — roughly 31MB of that is the compiled decoder\/encoder engine itself, base64-encoded into this one file so nothing has to be fetched from anywhere at runtime. That's a real, necessary cost of doing this fully offline instead of quietly depending on a server like most free online converters do.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhy is it slower than [a native app like HandBrake]?\u003c\/strong\u003e Two real reasons: it's WebAssembly, not native machine code (typically 2–3× slower on its own), and it's single-threaded by design — the faster multi-threaded build of FFmpeg-in-the-browser needs special server security headers that a plain double-clicked file can never provide, so this tool deliberately uses the slower, single-thread build so it keeps working with no server at all. Combined, expect roughly 5–20× slower than a native desktop encoder, depending on the file and operation.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes this work by just double-clicking the file, or does it need a server?\u003c\/strong\u003e Just double-clicking it. This was the central technical risk of building this tool, and it was resolved specifically so that no server is ever required — verified by actually opening the file via `file:\/\/` with no server running.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eCan I use this for client or commercial work?\u003c\/strong\u003e Yes — one-time purchase, personal and commercial use both fine.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eIs there a subscription?\u003c\/strong\u003e No. One-time purchase, yours to keep and reuse.\u003c\/p\u003e","brand":"My Store","offers":[{"title":"Default Title","offer_id":54669155434833,"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.png?v=1787609355"},{"product_id":"chat-export-to-client-summary","title":"Chat Export → Client Summary","description":"\u003cp class=\"unt-pitch\"\u003e\u003cem\u003eClean up and search an exported WhatsApp chat, entirely offline — no upload,\nno AI summary, just a readable thread you can actually search.\u003c\/em\u003e\u003c\/p\u003e\u003ch3\u003eWhat it does\u003c\/h3\u003e\u003cp\u003e\u003cstrong\u003eWhat it does.\u003c\/strong\u003e Drop in (or paste) a WhatsApp chat export — the \u003ccode\u003e.txt\u003c\/code\u003e\u003c\/p\u003e\u003cp\u003efile WhatsApp itself produces via *Export Chat*, or the \u003ccode\u003e.zip\u003c\/code\u003e it makes when\u003c\/p\u003e\u003cp\u003eyou include media. The tool parses every message, attaches the right sender\u003c\/p\u003e\u003cp\u003eand timestamp to each one (including multi-line messages), and renders it as\u003c\/p\u003e\u003cp\u003ea clean scrollable thread grouped by day. Media placeholders, deleted\u003c\/p\u003e\u003cp\u003emessages, and system notices (group changes, the encryption notice, missed\u003c\/p\u003e\u003cp\u003ecalls) are hidden by default but never discarded — a toggle brings them back\u003c\/p\u003e\u003cp\u003eif you want the full unedited record. Search finds and highlights matches\u003c\/p\u003e\u003cp\u003eacross the whole thread with next\/previous navigation; sender chips let you\u003c\/p\u003e\u003cp\u003eshow or hide people one at a time. When you're done, export a cleaned,\u003c\/p\u003e\u003cp\u003ereformatted \u003ccode\u003e.txt\u003c\/code\u003e copy, or use the browser's print function for a tidy\u003c\/p\u003e\u003cp\u003eprinted or PDF record.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWho it's for.\u003c\/strong\u003e A freelancer, consultant, or small-business owner who has\u003c\/p\u003e\u003cp\u003ean exported WhatsApp thread with a client or collaborator and needs to\u003c\/p\u003e\u003cp\u003eactually *use* it afterward — writing a retrospective, handing a project off,\u003c\/p\u003e\u003cp\u003esettling a \"did we agree to that\" question — rather than scrolling a wall of\u003c\/p\u003e\u003cp\u003eraw exported text.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eA concrete example.\u003c\/strong\u003e A freelance designer wraps a five-month client\u003c\/p\u003e\u003cp\u003eproject. Before archiving the relationship, she exports the WhatsApp thread,\u003c\/p\u003e\u003cp\u003edrops the \u003ccode\u003e.txt\u003c\/code\u003e file into the tool, and searches \"invoice\" to confirm\u003c\/p\u003e\u003cp\u003eexactly when and how the final amount was approved — findable in seconds\u003c\/p\u003e\u003cp\u003einstead of scrolling past a dozen \u003ccode\u003eimage omitted\u003c\/code\u003e lines and the encryption\u003c\/p\u003e\u003cp\u003enotice by hand.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat it explicitly does *not* do.\u003c\/strong\u003e This is a v1 formatting and cleanup\u003c\/p\u003e\u003cp\u003etool — it does \u003cstrong\u003enot\u003c\/strong\u003e summarize the conversation, generate an AI-written\u003c\/p\u003e\u003cp\u003erecap, or extract action items automatically. It doesn't recognize export\u003c\/p\u003e\u003cp\u003eformats from other apps (iMessage, Telegram, Signal, email) — WhatsApp's own\u003c\/p\u003e\u003cp\u003e\u003ccode\u003e.txt\u003c\/code\u003e\/\u003ccode\u003e.zip\u003c\/code\u003e export only. It doesn't view or extract media files from a\u003c\/p\u003e\u003cp\u003e\u003ccode\u003e.zip\u003c\/code\u003e (image\/video\/audio content is skipped entirely; only the chat text is\u003c\/p\u003e\u003cp\u003eread). It doesn't sync, save, or remember anything between visits — closing\u003c\/p\u003e\u003cp\u003ethe tab clears everything, by design.\u003c\/p\u003e\u003ch3\u003eFeatures\u003c\/h3\u003e\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003eReads WhatsApp's real export formats\u003c\/strong\u003e — both Android's \u003ccode\u003eDD\/MM\/YY, HH:MM - Name: message\u003c\/code\u003e and iPhone's \u003ccode\u003e[DD\/MM\/YY, HH:MM:SS] Name: message\u003c\/code\u003e, including a \u003ccode\u003e.zip\u003c\/code\u003e export with media (media files are ignored; only the chat text is read).\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eStrips the clutter by default\u003c\/strong\u003e — media-omitted placeholders, deleted-message markers, and system notices (group changes, the encryption boilerplate, missed calls) are hidden automatically, with a one-click toggle to bring them back.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eSearch and filter\u003c\/strong\u003e — find any keyword with next\/previous navigation and highlighting, or show\/hide individual senders with a click.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eExport a cleaned text copy, or print\u003c\/strong\u003e — download a reformatted, decluttered \u003ccode\u003e.txt\u003c\/code\u003e file, or use your browser's print function for a tidy printed or PDF record.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eNothing uploaded, ever\u003c\/strong\u003e — the file is read and processed entirely in your browser; there is no server involved at any point.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eHandles a genuinely large export\u003c\/strong\u003e — tested live on a synthetic 30,000-message thread (parsed and rendered in about 1.4 seconds, with a visible \"Parsing…\" indicator so it never looks frozen).\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**Desktop Chrome \/ Edge \/ Brave (Chromium engine)**\u003c\/td\u003e\n\u003ctd\u003eFull experience — parsing, search, filtering, export, and print all work exactly as described.\u003c\/td\u003e\n\u003ctd\u003eFunctionally verified via Playwright's Chromium engine (34\/34 + 6\/6 checks passing). Also opened and visually confirmed in the real, installed Google Chrome.app. Edge and Brave are not installed on this machine and were not separately opened, but share the same Chromium engine actually tested.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e**Desktop Safari (WebKit)**\u003c\/td\u003e\n\u003ctd\u003eFull experience — this tool uses no Chromium-only API (plain `FileReader`, `DataView`, `Blob`, standard DOM\/CSS), so nothing here is expected to degrade on WebKit, and testing confirmed that.\u003c\/td\u003e\n\u003ctd\u003eFunctionally verified via Playwright's WebKit engine (34\/34 + 6\/6 checks passing, zero console errors). Also opened and visually confirmed in the real, installed Safari.app — correct layout, no errors, empty state renders cleanly.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e**Desktop Firefox (Gecko)**\u003c\/td\u003e\n\u003ctd\u003eFull experience, same reasoning as Safari above.\u003c\/td\u003e\n\u003ctd\u003eFunctionally verified via Playwright's Firefox engine (34\/34 + 6\/6 checks passing, zero console errors). Also opened and visually confirmed in the real, installed Firefox.app.\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\u003e**Small screens \/ touch (390×844, emulated)**\u003c\/td\u003e\n\u003ctd\u003eLayout holds up cleanly: header, search bar, sender chips, and stat grid all reflow to a single column with no horizontal overflow or clipped controls, on both the empty state and a loaded thread.\u003c\/td\u003e\n\u003ctd\u003eChecked using Playwright's mobile-viewport emulation (390×844, touch enabled) — not a real phone. Real-device touch precision (tapping small chips, scrolling the thread) was **not** tested.\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 chat get uploaded anywhere?\u003c\/strong\u003e\u003cbr\u003eNo. Everything happens inside your own browser tab — there's no server this\u003cbr\u003etool talks to, at any point.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes this summarize my conversation, or just clean it up?\u003c\/strong\u003e\u003cbr\u003eJust clean it up. This v1 tool parses, declutters, formats, and makes your\u003cbr\u003eexport searchable — it does not write a summary, extract action items, or\u003cbr\u003euse AI in any way. A heavier v2 with real AI summarization (via a local\u003cbr\u003emodel) is a possible future product, not something this purchase includes —\u003cbr\u003esee below.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes this work with exports other than WhatsApp?\u003c\/strong\u003e\u003cbr\u003eNot yet. This version only recognizes WhatsApp's own `.txt`\/`.zip` export\u003cbr\u003eformat. Chats exported from iMessage, Telegram, Signal, or email aren't\u003cbr\u003esupported.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes this work on my iPhone\/iPad?\u003c\/strong\u003e\u003cbr\u003eIt should — the tool uses no browser-specific features — but this hasn't\u003cbr\u003ebeen independently confirmed on a real iOS device yet.\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.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWill there be an AI summary version?\u003c\/strong\u003e\u003cbr\u003ePossibly, as a separate, heavier future product (local-LLM-powered, running\u003cbr\u003ea model like Ollama on your own machine) — but that is not a promise, and\u003cbr\u003eit is not included in this purchase. This tool is, and will remain, the\u003cbr\u003eplain-text cleanup version.\u003c\/p\u003e","brand":"My Store","offers":[{"title":"Default Title","offer_id":54670138671441,"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_25447c89-c394-4ed7-9fc4-a8c821f0019b.png?v=1787609440"},{"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":"exif-gps-stripper","title":"EXIF \/ GPS Stripper","description":"\u003cp class=\"unt-pitch\"\u003e\u003cem\u003eRemoves hidden location and camera data from a photo before you share it — nothing ever leaves your computer.\u003c\/em\u003e\u003c\/p\u003e\u003cp\u003eDrop in a JPEG and get back a clean copy with the EXIF metadata segment removed — no more hidden GPS coordinates, camera serial number, or timestamp riding along with a photo you post or send. Everything happens in your browser; the file is never uploaded anywhere, and you can verify that yourself by reading the page's source or watching your network traffic. 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 Reads a JPEG file's raw bytes, locates the APP1 marker segment that holds EXIF data (this is where GPS coordinates, camera make\/model, lens info, and capture timestamp live), and removes it — along with Photoshop's APP13 metadata block and any COM comment marker, if present. The compressed image data itself is copied byte-for-byte and never re-encoded, so there is no quality loss, unlike resizing or re-saving a photo through most editors.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWho it's for:\u003c\/strong\u003e Anyone about to post or send a photo who doesn't want the exact GPS coordinates it was taken at (or their camera's serial number) attached to it. The clearest case: a real-estate photographer stripping GPS data from exterior listing shots before they go on a public site — the interior of someone's home is already semi-public once listed, but the *exact coordinates* embedded in the file are a separate and unnecessary exposure. The same need shows up for event photographers delivering shots from a private venue, sellers photographing items for a marketplace listing from their home, and anyone forwarding a phone photo taken at their house.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eExample scenario:\u003c\/strong\u003e A real-estate photographer has just finished shooting a listing. Their camera stamps every JPEG with the exact GPS coordinates of the shoot. Before uploading the gallery to the listing site, they run each file through this tool so the published photos carry no location metadata — only the pixels the buyer is supposed to see.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat it explicitly does not do:\u003c\/strong\u003e\u003c\/p\u003e\u003cul\u003e\n\u003cli\u003eDoes not touch PNG, HEIC, WebP, or any non-JPEG format — JPEG's marker-segment structure is what makes a clean byte-level strip possible without decoding pixels; other formats store metadata differently and would need a different approach.\u003c\/li\u003e\n\u003cli\u003eDoes not remove XMP data carried in a *separate* APP1 segment that isn't EXIF (identified by its own signature) — this tool's job is specifically EXIF\/GPS\/camera metadata, not every possible embedded data block.\u003c\/li\u003e\n\u003cli\u003eDoes not resize, recompress, or otherwise alter the image itself.\u003c\/li\u003e\n\u003cli\u003eDoes not batch-process multiple files at once — one file at a time, by design, to keep the tool a single simple screen.\u003c\/li\u003e\n\u003cli\u003eDoes not store or remember anything between sessions — reload the page and the last file is gone.\u003c\/li\u003e\n\u003c\/ul\u003e\u003ch3\u003eFeatures\u003c\/h3\u003e\u003cul\u003e\n\u003cli\u003eStrips the EXIF\/APP1 segment — GPS coordinates, camera make\/model, lens data, and capture timestamp — from JPEG files\u003c\/li\u003e\n\u003cli\u003eAlso removes Photoshop IPTC metadata (APP13) and comment markers (COM) if present\u003c\/li\u003e\n\u003cli\u003eNo re-encoding: image pixel data is copied byte-for-byte, so there is zero quality loss\u003c\/li\u003e\n\u003cli\u003eRuns entirely offline in your browser — no network requests, no analytics, nothing uploaded, verifiable by reading the page's own source\u003c\/li\u003e\n\u003cli\u003eShows exactly what was found and removed, plus the exact byte count saved\u003c\/li\u003e\n\u003cli\u003eHandles large files instantly — tested clean on an 8000×8000px \/ 5.4MB JPEG with no slowdown\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 Safari (macOS)\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eOpened and visually confirmed in the real, installed Safari app; core file-read\/Blob\/download mechanism additionally verified via Safari's own WebKit engine (drop → strip → download → re-verified with an independent Python EXIF parser, byte-identical result).\u003c\/td\u003e\n\u003c\/tr\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; full functional flow (success state, error states, download) additionally verified via Chrome's own Blink engine.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Firefox (macOS)\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eOpened and visually confirmed in the real, installed Firefox app; full functional flow additionally verified via Firefox's own Gecko engine.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eEdge \/ 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; not independently installed or run on this machine.\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 to test on. The APIs used (FileReader, Blob, `\u003cinput type=\"file\"\u003e`) are standard and supported in iOS Safari, but this is an inference, not a test — 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\u003ctr\u003e\n\u003ctd\u003eSmall-viewport \/ touch\u003c\/td\u003e\n\u003ctd\u003e**Not verified**\u003c\/td\u003e\n\u003ctd\u003eNot checked, even via desktop emulation, in this pass.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003cp\u003e\u003cem\u003eFunctional testing (drag-and-drop equivalent file selection, byte-level strip correctness, download, error states for a non-JPEG file and a corrupted JPEG, a 5.4MB\/8000×8000px large file, light and dark mode, keyboard focus, and console cleanliness) was run end-to-end through each engine's real download and re-verified independently — 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. The entire tool is one static HTML file with no server component and no network calls. 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\u003eAlmost certainly, since iOS Safari supports the same standard browser APIs the tool relies on — but this has not 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 to my file if I lose the download?\u003c\/strong\u003e\u003cbr\u003eNothing is stored by the tool anywhere — your original file is untouched on your computer the whole time, so you can just process it again. If you reload the page before downloading, you'll need to re-drop the file; 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, including client deliverables.\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\u003eDoes it reduce image quality?\u003c\/strong\u003e\u003cbr\u003eNo. Only the metadata segment is removed; the compressed pixel data is copied byte-for-byte, untouched.\u003c\/p\u003e","brand":"My Store","offers":[{"title":"Default Title","offer_id":54670414774609,"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_5772ef1a-cc53-45ad-b8ee-0d65ca0a82f0.png?v=1787610427"},{"product_id":"local-screen-recorder","title":"Local Screen Recorder","description":"\u003cp class=\"unt-pitch\"\u003e\u003cem\u003eRecord your screen and mic, save the video straight to disk — no account, no cloud upload, no 5-minute cap, no browser extension to install.\u003c\/em\u003e\u003c\/p\u003e\u003cp\u003eA \u003cstrong\u003escreen recorder with no upload, ever\u003c\/strong\u003e: click Start, pick a screen\/window\/tab in your browser's own native picker, optionally mix in your microphone, and get a real WebM video file saved straight to your computer when you stop — all inside one self-contained HTML file with zero network requests. No account, no cloud storage limit, no recurring subscription, and unlike Loom's free tier, no 5-minute cap or 25-video ceiling. One-time download, works offline forever.\u003c\/p\u003e\u003ch3\u003eWhat it does\u003c\/h3\u003e\u003cp\u003e\u003cstrong\u003eWhat it does:\u003c\/strong\u003e Uses your browser's own native \u003ccode\u003egetDisplayMedia()\u003c\/code\u003e API to open the OS-level screen\/window\/tab picker, records the resulting video (with an optional live microphone track mixed in via the Web Audio API) using \u003ccode\u003eMediaRecorder\u003c\/code\u003e, and — when you stop — hands you a real WebM file to save, either through Chromium's native save-file dialog or a standard download. A visible timer and recording indicator run the whole time, and pause\/resume works mid-recording if you need to stop talking for a moment without cutting the file. Nothing is uploaded anywhere at any point; this page makes no network requests at all.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWho it's for:\u003c\/strong\u003e A freelancer, consultant, or small-business owner who needs to record a screen walkthrough and hand the file directly to one client or teammate — not build a shareable library of hosted clips.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eExample scenario:\u003c\/strong\u003e A software consultant records a 20-minute walkthrough of a client's dashboard, showing where three settings live. Instead of paying for Loom's Business plan (or bumping into its free tier's 5-minute cap and 25-video ceiling) just to get a file they'll only ever send to one person, they record it here and attach the resulting WebM straight to an email.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat it explicitly does not do:\u003c\/strong\u003e\u003c\/p\u003e\u003cul\u003e\n\u003cli\u003eDoes not host, share, or generate a link to your video — there is no cloud component of any kind. You get a file; distributing it (email, a shared drive, a messaging app) is up to you, same as any other video file.\u003c\/li\u003e\n\u003cli\u003eDoes not edit, trim, or caption the recording — it's a capture tool, not a video editor. Trim the output afterward in your OS's built-in tools (or this product line's own Audio\/Video Trimmer \u0026amp; Converter, once built) if you need to cut it down.\u003c\/li\u003e\n\u003cli\u003eDoes not capture your webcam as a picture-in-picture bubble — audio-only microphone mixing is supported, not a camera overlay.\u003c\/li\u003e\n\u003cli\u003eDoes not work at all on iOS or iPadOS Safari — Apple's WebKit does not expose screen-capture APIs to web pages on those platforms, a platform-level restriction this tool cannot work around. See Platform support below.\u003c\/li\u003e\n\u003cli\u003eDoes not transcribe, summarize, or auto-caption anything — that's Loom's AI-tier upsell; this tool only captures and saves video.\u003c\/li\u003e\n\u003c\/ul\u003e\u003ch3\u003eFeatures\u003c\/h3\u003e\u003cul\u003e\n\u003cli\u003eRecords your screen, a single window, or one browser tab via the browser's own native \u003ccode\u003egetDisplayMedia()\u003c\/code\u003e picker — the exact source selection always happens in trusted browser UI, never on this page\u003c\/li\u003e\n\u003cli\u003eOptional microphone mixing via a real Web Audio pipeline, with a clear on\/off toggle that defaults to off\u003c\/li\u003e\n\u003cli\u003eVisible recording timer and a pulsing recording indicator the entire time, so it's always obvious the tool is (or isn't) capturing\u003c\/li\u003e\n\u003cli\u003ePause and resume mid-recording without losing what's already been captured\u003c\/li\u003e\n\u003cli\u003ePreviews the finished recording in-page before you save anything, so you can confirm it before committing to a file\u003c\/li\u003e\n\u003cli\u003eSaves straight to disk — via Chromium's native save-file dialog where available, or a standard download everywhere else — never to any server; this page makes zero network requests, verifiable by reading its 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, confirmed working end-to-end**\u003c\/td\u003e\n\u003ctd\u003eOpened and visually confirmed in the real, installed Chrome app. The complete functional flow — mic toggle, `getDisplayMedia()` request, `MediaRecorder` start → pause → resume → stop, native save-file-picker fallback to a download, and a valid output file — was verified end-to-end through Chromium's own real engine via automated testing (Playwright driving the actual installed binary). A permission-denied path and a \"recording without microphone\" non-fatal path were separately verified to fail\/degrade gracefully rather than crash or hang.\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.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Firefox (macOS)\u003c\/td\u003e\n\u003ctd\u003e**Full, confirmed working end-to-end**\u003c\/td\u003e\n\u003ctd\u003eOpened and visually confirmed in the real, installed Firefox app. The full record → pause → resume → stop → save cycle was additionally verified through Firefox's real Gecko engine via automated testing, producing a genuinely valid WebM file (VP8 + Opus — Firefox does not support VP9+Opus in `MediaRecorder`, confirmed via `MediaRecorder.isTypeSupported()`, and this tool's own codec-selection logic correctly falls back to VP8 there).\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Safari (macOS)\u003c\/td\u003e\n\u003ctd\u003e**API present, feature-detected correctly; live end-to-end recording not manually completed**\u003c\/td\u003e\n\u003ctd\u003eOpened and visually confirmed in the real, installed Safari 26.5.2 app: the tool's own runtime feature-check ran and rendered the normal \"Start recording\" UI rather than the unsupported-browser fallback, which is direct, empirical confirmation that `navigator.mediaDevices.getDisplayMedia` is a real function in current desktop Safari on this Mac — not assumed from documentation. A full live recording (clicking Start, granting the OS-level Screen Recording permission, completing a capture) could not be completed in this build session: that permission is a one-time, interactive macOS System Settings grant that cannot be authorized non-interactively, and clicking through it wasn't attempted, consistent with this session's constraint against forcing OS permission prompts. Separately, Playwright's bundled WebKit engine (same engine family as Safari, but not Apple's literal shipped binary) was used to exercise the full record → pause → resume → stop → save cycle end-to-end and produced a valid VP9 + Opus WebM file — useful signal that the underlying `MediaRecorder` mechanics work on WebKit, but not proof of Apple's actual Safari runtime behavior, and it does not stand in for a real permission grant. Treat desktop Safari as \"should work for the core flow, unverified live\" until manually confirmed by a person who can grant the permission.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eiOS Safari (iPhone\/iPad)\u003c\/td\u003e\n\u003ctd\u003e**Confirmed not supported — a platform limitation, not a bug**\u003c\/td\u003e\n\u003ctd\u003eNo physical device needed to confirm this: Apple has not implemented `getDisplayMedia` in iOS\/iPadOS Safari at all (unlike desktop Safari, which does expose it) — sourced from multiple 2026 WebRTC\/screen-capture compatibility write-ups, consistent across sources. This tool's own feature-detection was verified (via Chromium's iPhone 13 viewport emulation with `getDisplayMedia` removed) to show a clear, honest \"not available on this device\" message rather than a broken Start button or a silent failure.\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**Checked**\u003c\/td\u003e\n\u003ctd\u003eEmulated (not assumed): a 390×844px iPhone-13-sized viewport. The unsupported-browser message (relevant on that class of device) renders cleanly with no horizontal overflow and readable type — verified via screenshot, not just code review.\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\":** real OS-level Screen Recording permission cannot be granted non-interactively in this environment (the same category of wall as Accessibility permission hit earlier in this project). Rather than skip Phase 2\/3 testing entirely or fake results, `navigator.mediaDevices.getDisplayMedia` was monkey-patched — only inside test harnesses, never in the shipped `index.html` — to return a real `MediaStream` from `canvas.captureStream()` (synthetic video content, but a genuine, spec-compliant MediaStream) plus an oscillator-driven `AudioContext` destination stream standing in for the microphone. This let `MediaRecorder`'s actual start\/pause\/resume\/stop lifecycle, the Web-Audio-based mic-mixing pipeline, the codec-selection logic, and the save\/download path all be exercised for real, producing real output files. Every resulting `.webm` file was independently probed with `ffprobe`\/`ffmpeg` (not just checked for \"did a download happen\") — confirming a valid Matroska\/WebM container with correctly decodable VP8\/VP9 video and Opus audio streams, full frame counts matching the recorded duration, and no decode errors. A ~35-second, 1280×720@30fps recording with mixed mic audio was also run as a heavier\/longer performance check (see Phase 4 notes) — it processed instantly (50ms from Stop click to the review screen being ready) and produced a fully valid 3.35MB file.\u003c\/em\u003e\u003c\/p\u003e\u003ch3\u003eFAQ\u003c\/h3\u003e\u003cp\u003e\u003cstrong\u003eDoes my recording get uploaded anywhere?\u003c\/strong\u003e\u003cbr\u003eNo. This is one static HTML file with no server component and no network calls of any kind. The screen capture, the microphone mixing, and the video encoding all happen locally in your browser tab via `getDisplayMedia()` and `MediaRecorder`. You can disconnect your Wi-Fi before recording and it works exactly the same — or just read the page's own source, which isn't minified or obfuscated, to confirm there's nothing that sends data anywhere.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhy would I use this instead of QuickTime Player \/ Cmd+Shift+5 (Mac) or Xbox Game Bar (Windows)?\u003c\/strong\u003e\u003cbr\u003eHonestly, if you're on one platform and already know where your OS's built-in tool lives, it may well be enough — macOS's screen recording (verified hands-on for this product: `File → New Screen Recording` in QuickTime Player, the same tool Cmd+Shift+5 opens) has no fixed time limit and can record the whole desktop, and it's genuinely good. This tool's real edge is for two situations: (1) you work across both Mac and Windows and want one identical tool and workflow on both, instead of two different native flows to remember, and (2) on Windows specifically, Xbox Game Bar cannot record the desktop or File Explorer at all — it only captures recognized app windows — so a walkthrough that touches the desktop needs a different tool anyway. This one works the same way, everywhere, as a single file you keep.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes this work in Safari?\u003c\/strong\u003e\u003cbr\u003eDesktop Safari does expose the screen-capture API this tool needs (confirmed directly on Safari 26.5.2 during testing), but a full live recording through Safari's actual OS permission prompt wasn't completed during development — see Platform support above for the honest, specific caveat. iOS and iPadOS Safari do \u003cstrong\u003enot\u003c\/strong\u003e support screen capture at all; that's an Apple platform restriction, not something this tool can fix.\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 recording if I close the tab before saving?\u003c\/strong\u003e\u003cbr\u003eIt's gone. Nothing is stored by the tool anywhere outside that browser tab's memory — the review screen says this plainly before you save. If you close the tab, reload the page, or your browser crashes before you click Save, the recording can't be recovered. Save it before you do anything else with the tab.\u003c\/p\u003e","brand":"My Store","offers":[{"title":"Default Title","offer_id":54670671642961,"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_1ad2bbc3-6aa6-4972-ad45-6daa5144e911.png?v=1787609665"},{"product_id":"ocr-scanner","title":"OCR Scanner - Photo to Text Converter","description":"\u003cp class=\"unt-pitch\"\u003e\u003cem\u003eA photo to text converter that runs entirely in your browser — batch-scan a whole folder of photos into real, copyable text, with nothing ever uploaded.\u003c\/em\u003e\u003c\/p\u003e\u003cp\u003eDrop in one or more photos of printed pages and get back real, selectable text you can copy or download — no typing, no account, no upload. This image to text converter runs entirely offline in your browser using a bundled WebAssembly OCR engine, and unlike most free online converters, scans a whole batch of photos at once.\u003c\/p\u003e\u003ch3\u003eWhat it does\u003c\/h3\u003e\u003cp\u003eOCR Scanner reads printed text out of a photo or scan and turns it into plain text you can copy, edit, or save — a stack of paper notes, a printed contract page, a whiteboard photo, a scanned form. Drop in one image or twenty at once; each is scanned in place with a live progress bar, and you get a \"Copy text\" and \"Download .txt\" button per image, plus a \"download all as one file\" option for a whole batch.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWho it's for:\u003c\/strong\u003e a freelancer or small-business owner who has photos of printed documents and wants the text out of them without retyping — especially when the document has anything sensitive in it, since this tool never sends the image anywhere.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eExample scenario:\u003c\/strong\u003e a freelance photographer photographs four pages of printed shoot notes on their phone during a client meeting. Back at their desk, they drop all four photos into OCR Scanner, and two minutes later have plain text they can paste straight into an invoice or a follow-up email — instead of retyping four pages by hand.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat this does not do:\u003c\/strong\u003e it does not extract structured fields (no automatic \"vendor \/ date \/ total\" parsing — that's a separate, purpose-built tool). It does not pre-process images (no auto-crop, no deskew, no contrast correction) — whatever's in the photo is what gets scanned. It only reads English text in this version. It reads printed text; handwriting recognition is not reliable with this engine and isn't claimed here.\u003c\/p\u003e\u003ch3\u003eFeatures\u003c\/h3\u003e\u003cul\u003e\n\u003cli\u003eScans one or many photos in a single batch, each with its own live progress bar.\u003c\/li\u003e\n\u003cli\u003eRuns entirely offline after the file loads — zero network requests during scanning, verified directly, not just claimed.\u003c\/li\u003e\n\u003cli\u003eCopy any result to your clipboard, or download it as a \u003ccode\u003e.txt\u003c\/code\u003e file — individually or all at once.\u003c\/li\u003e\n\u003cli\u003eShows Tesseract's own real confidence score per image, so you know when to double-check a result.\u003c\/li\u003e\n\u003cli\u003eClear error messages for non-image files, corrupted images, and images with no readable text — nothing silently fails.\u003c\/li\u003e\n\u003cli\u003eWorks in both light and dark mode automatically, matching your system setting.\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\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eVerified via the real installed Chrome.app (visual, screenshot) and via Playwright's Chromium engine (functional): correct OCR output, zero network requests, zero console errors on normal runs. A realistic 4200×5440px (22.8MP) document photo OCR'd in 2.8s; a smaller 1700×2200px document in 2.1s.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Safari\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eVerified via the real installed Safari.app (visual, screenshot) and via Playwright's WebKit engine (functional, same rendering engine as Safari): correct OCR output, zero network requests, zero console errors. 1700×2200px document OCR'd in 1.8s.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Firefox\u003c\/td\u003e\n\u003ctd\u003e**Full, but measurably slower**\u003c\/td\u003e\n\u003ctd\u003eVerified via the real installed Firefox.app (visual, screenshot) and via Playwright's Firefox engine (functional): output is fully correct and zero network requests\/console errors, but WASM execution is real and consistently slower than Chromium\/WebKit for this workload — a small 900×400 test image took ~2.9s in Firefox vs. ~0.2s in Chromium\/WebKit, and the 1700×2200px document took ~29s vs. ~2s. This is disclosed honestly in the platform-support copy below rather than smoothed over.\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 iOS device available on this machine. Explicitly left unchecked rather than assumed.\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 (emulated)**\u003c\/td\u003e\n\u003ctd\u003eVerified via Chromium's iPhone 13 device emulation (390×844, touch-enabled): layout stays single-column and readable, OCR runs correctly, zero console errors. Explicitly a desktop emulation, not a real device — noted as such, not claimed as real mobile testing.\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 photo get uploaded anywhere?\u003c\/strong\u003e No. Every image is decoded and scanned entirely inside your browser tab. This was verified directly with network-request interception during testing — zero requests leave the page during OCR, on any image.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhy is the file so large (7.66 MB)?\u003c\/strong\u003e The entire OCR engine — a WebAssembly build of the Tesseract OCR engine, plus the English language training data it needs to recognize text — is built directly into this one HTML file, so it works completely offline with no separate install or download. That's genuinely a few megabytes of engine and language data, not bloat.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eHow accurate is this, really?\u003c\/strong\u003e On a clean, well-lit, right-side-up printed page, accuracy was very high in testing (95%+ confidence, effectively perfect transcription on a full test document). On a photo rotated a few degrees, or blurry, accuracy drops — real testing showed individual words getting misread (e.g. \"brown\" → \"prown\") and confidence scores as low as the mid-50s% on a deliberately rough, blurry-and-rotated test photo. Always read the result before relying on it, especially for numbers.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eCan I use this for client or commercial work?\u003c\/strong\u003e Yes. One-time purchase, personal and commercial use included.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eIs there a subscription?\u003c\/strong\u003e No. One-time purchase, yours to keep and reuse.\u003c\/p\u003e","brand":"My Store","offers":[{"title":"Default Title","offer_id":54670816510289,"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_2a82b7ab-8f76-44a2-ada6-a11900a89eb7.png?v=1787610477"},{"product_id":"receipt-to-expense-report","title":"Receipt → Expense Report","description":"\u003cp class=\"unt-pitch\"\u003e\u003cem\u003ePhotograph a stack of receipts, review the guessed vendor, date, and total for each one, and export a clean expense CSV — with nothing ever uploaded.\u003c\/em\u003e\u003c\/p\u003e\u003cp\u003eDrop in photos of receipts and get back one reviewed, correctable CSV — vendor, date, amount, and category per receipt. This tool runs a real OCR engine and regex heuristics entirely offline in your browser to guess the fields, but every guess is editable and flagged clearly when it's likely wrong; nothing exports until you've checked it.\u003c\/p\u003e\u003ch3\u003eWhat it does\u003c\/h3\u003e\u003cp\u003eReceipt → Expense Report reads a photo of a paper receipt, guesses the vendor, date, and total using an in-browser OCR engine and pattern-matching heuristics, and puts every guess in front of you as an editable field before anything is exported. Drop in one receipt or twenty at once; each is scanned in place with real progress, low-confidence guesses (an ambiguous date, a receipt with no clear \"total\" label) are visually flagged with a plain-language explanation of why, and a raw-OCR-text view lets you double-check any guess against what the engine actually read. Check each receipt off as \"Reviewed\" once its fields look right, and export every reviewed receipt as one clean CSV — date, vendor, amount, category, and which photo it came from.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWho it's for:\u003c\/strong\u003e a freelancer, contractor, or small-business owner who has a stack of receipt photos and wants a clean expense CSV out of them without retyping every line by hand — especially someone who currently hands a bookkeeper a shoebox (or a phone full of photos) and pays for the data-entry time.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eExample scenario:\u003c\/strong\u003e a contractor wrapping a two-week remodel job has photographed 18 job-site receipts on their phone. They drop all 18 into this tool, spend about 15 minutes reviewing the guessed vendor\/date\/amount for each one (fixing the two or three the tool flagged as low-confidence), assign a category to each, and export one CSV to send their bookkeeper — instead of a bag of curled paper receipts and 40 minutes of someone else's billable data-entry time.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat this does not do:\u003c\/strong\u003e it is \u003cstrong\u003enot\u003c\/strong\u003e fully automatic bookkeeping, and it does not claim to be. Vendor, date, and total are OCR-assisted *guesses* from regex heuristics — a receipt with a subtotal\/tax\/tip\/total breakdown and no clear \"total\" label is a genuinely hard case, and this tool's own testing found a real example where its best guess was wrong (documented honestly in the product's own build notes). Every receipt requires a human review step before export; nothing is exported without it. It does not read handwriting reliably, does not pre-process images (no auto-crop, no deskew, no contrast fix), only reads English text, and does not replace a bookkeeper or accountant's judgment — it replaces the *typing*.\u003c\/p\u003e\u003ch3\u003eFeatures\u003c\/h3\u003e\u003cul\u003e\n\u003cli\u003eScans one or many receipt photos in a single batch, each with its own live OCR progress bar.\u003c\/li\u003e\n\u003cli\u003eGuesses vendor, date, and total per receipt, with low-confidence guesses visually flagged and explained in plain language (not just silently presented as fact).\u003c\/li\u003e\n\u003cli\u003eEvery field is editable before export — nothing is exported until you check \"Reviewed\" on that receipt.\u003c\/li\u003e\n\u003cli\u003eA raw-OCR-text view per receipt lets you double-check any guess against what the engine actually read.\u003c\/li\u003e\n\u003cli\u003eRuns entirely offline after the file loads — zero network requests during scanning, verified directly across Chrome, Safari, and Firefox, not just claimed.\u003c\/li\u003e\n\u003cli\u003eExports one CSV (date, vendor, amount, category, source image) built from your reviewed, corrected values.\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\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eVerified via the real installed Chrome.app (visual, screenshot, confirmed frontmost via Chrome's own AppleScript dictionary) and via Playwright's Chromium engine (functional): correct extraction, zero network requests, zero console errors. Two-receipt functional test completed in 1.1s.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Safari\u003c\/td\u003e\n\u003ctd\u003e**Full**\u003c\/td\u003e\n\u003ctd\u003eVerified via the real installed Safari.app (visual, screenshot, confirmed frontmost via Safari's own dictionary) and via Playwright's WebKit engine (functional, same rendering engine as Safari): correct extraction, zero network requests, zero console errors. Two-receipt functional test completed in 1.0s.\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDesktop Firefox\u003c\/td\u003e\n\u003ctd\u003e**Full, but measurably slower**\u003c\/td\u003e\n\u003ctd\u003eVerified via the real installed Firefox.app (visual, screenshot, confirmed frontmost via Firefox's own dictionary) and via Playwright's Firefox engine (functional): output fully correct, zero network requests, zero console errors — but the same two-receipt test took 13.7s vs. ~1s in Chromium\/WebKit, consistent with OCR Scanner's own documented WASM-performance finding for Firefox. Disclosed honestly, not smoothed over.\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 iOS device available on this machine. Explicitly left unchecked rather than assumed.\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 (emulated)**\u003c\/td\u003e\n\u003ctd\u003eVerified via Chromium's iPhone 13 device emulation (390×844, touch-enabled): layout stacks to a single column with no horizontal overflow (`scrollWidth \u0026gt; clientWidth` checked directly and confirmed false), the review card's field grid, low-confidence flag, and reasoning text all remain fully readable, OCR runs correctly. Explicitly a desktop emulation, not a real device — noted as such, not claimed as real mobile testing.\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 receipt photo get uploaded anywhere?\u003c\/strong\u003e No. Every image is decoded and scanned entirely inside your browser tab. This was verified directly with network-request interception during testing across three browser engines — zero requests leave the page during OCR, on any image.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eHow accurate is the extraction, really?\u003c\/strong\u003e On clean, well-lit receipts with an unambiguous \"Total\" line, real testing found vendor, date, and amount all correct. On a receipt with no clear \"total\"\/\"balance\"\/\"amount due\" label — for example one where the only visible numbers are line items plus \"Cash Tendered\" and \"Change\" — real testing found the tool's fallback guess (the largest dollar amount on the receipt) was genuinely wrong, though it was correctly flagged low-confidence rather than presented as fact. Rotated and blurry photos (simulating a real phone photo) still extracted correctly in testing, but engine confidence measurably dropped. Always read the flagged fields, and ideally every field, before exporting.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDo I have to review every receipt, or can I trust it blindly?\u003c\/strong\u003e You have to review each one — this is by design, not a limitation to work around. Nothing is included in the exported CSV until you check \"Reviewed\" on that specific receipt; unreviewed receipts are silently excluded from export (and the tool tells you how many were skipped) rather than exported with unverified guesses.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes this replace my bookkeeper or accountant?\u003c\/strong\u003e No. It replaces the typing, not the judgment — categorization decisions, tax treatment, and the actual bookkeeping are still yours or your bookkeeper's to get right. This tool's job ends at \"here's a clean CSV,\" not \"here's your books.\"\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eCan I use this for client or commercial work?\u003c\/strong\u003e Yes. One-time purchase, personal and commercial use included.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eIs there a subscription?\u003c\/strong\u003e No. One-time purchase, yours to keep and reuse, with no ongoing cost — unlike every cloud-based competitor found during this tool's own research, which all charge monthly or annually.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eDoes this work on my iPhone\/iPad?\u003c\/strong\u003e Not verified. It's built with standard web APIs and a small-viewport layout was checked via emulation, but real iOS\/Android testing wasn't possible on this machine (see Platform support above) — treat mobile as untested, not promised.\u003c\/p\u003e\u003cp\u003e\u003cstrong\u003eWhat happens if I lose the downloaded file?\u003c\/strong\u003e Nothing is stored anywhere but your own device — there's no account or cloud copy to recover it from, so keep the file itself somewhere safe (the same as any other file you buy once and own).\u003c\/p\u003e","brand":"My Store","offers":[{"title":"Default Title","offer_id":54670873264465,"sku":null,"price":15.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1073\/4226\/6705\/files\/01-hero_6ffe5f6a-e78b-4edd-a9eb-eb41b5db66de.png?v=1787610569"}],"url":"https:\/\/untracked.tools\/collections\/popular-tools.oembed","provider":"Untracked Software","version":"1.0","type":"link"}