The browser does the work.
A metadata cleaner does not need a server. Reading a file's header and writing a copy without it is a few hundred lines of code, and your browser can run them. Here is what happens, step by step.
Steps
- 01
Drop
The browser hands the page a File object.
When you drop, paste or choose a file, the browser gives the page a handle to it, the same interface a web mail client uses before you press send. A handle is not a copy: nothing is read until the page asks, and the page asks by byte range.
- 02
Sniff
The first bytes say what the file is.
JPEG begins FF D8 FF, PNG with an eight-byte signature, PDF with %PDF, an Office document with PK. The extension is not consulted, so a renamed file is refused rather than parsed wrong.
- 03
Read
Only the header bytes are read.
A JPEG parser walks the segment markers and reads EXIF, XMP, IPTC and comments. A PNG parser walks the chunks. An Office file is a zip; only docProps and the thumbnail are inflated, with the browser's own DecompressionStream. A PDF is scanned for its Info dictionary and XMP packet. Each field is listed with the part it sits in.
- 04
Show
Every field, and what happens to it.
The table names the part, the field, the value and its fate: removed, or kept with the reason. Kept rows are the colour profile, which is how the picture is meant to look, and comment authors in a Word document, because removing them edits the document.
- 05
Clean
A new file is assembled from slices of the old.
The clean copy is a Blob made of byte ranges of the original with the metadata parts left out. Office packages are rewritten part for part with their entry timestamps reset. PDF values are blanked in place at the same length, so no offset in the file moves. Nothing is decoded or re-encoded.
- 06
Download
Saved with a -clean suffix.
The browser saves the Blob under the original name with "-clean" before the extension. The before and after sizes and field counts are shown, and the table strikes through what went.
Verify it yourself.
You do not have to take any of this on trust. The browser keeps a record of every request a page makes, and you can watch it while you clean a file.
- 01
Open the developer tools.
Firefox: Ctrl+Shift+E (Cmd+Option+E on a Mac) opens the Network panel directly. Chrome and Edge: F12, then the Network tab. Safari: enable the Develop menu in Settings, then Develop, Show Web Inspector, Network.
- 02
Clear the list, then drop a file.
The page loads its script, its stylesheet and its font once. Clear the list after that so only new requests show.
- 03
Press "Remove all and download".
The clean copy is built and saved. No row appears in the panel. The only URL involved begins with blob:, which is the browser's name for a file that exists only in memory on your machine.
- 04
Check the counter.
Beside your result the page shows "Requests since read", taken from the same browser record through the PerformanceObserver interface. It reads 0.
What it does not do.
It does not change the content. A photo of your street is still a photo of your street; a letter that names you in its first line still names you. Metadata is what the file carries about itself, and that is all FileSanity removes.
It does not reach inside embedded files. A picture pasted into a Word document keeps its own EXIF inside the package, and a PDF's compressed object streams are not opened. Both are listed on the formats page as not yet.
It does not remember. There is no history, no recent files, no account. Close the tab and the page has nothing.
Try it with the network panel open.
Drop a file, watch nothing leave, download the clean copy.