Your photo knows where you stood. Wipe that, not the pixels.
Metawipe pins every EXIF, GPS and IPTC field over your photo, then strips them with a byte-for-byte copy that leaves the image bit-identical. No upload, no re-encode.
The photo you posted to a marketplace listing quietly carries the GPS coordinates where you shot it, accurate to a few meters, plus your phone model, the lens, sometimes a serial number and the timestamp down to the second. None of that is in the pixels. It rides along in a separate slab of bytes bolted onto the front of the file, and every app that reads photos knows how to find it. So does anyone who downloads the picture.
The upload paradox
Search "remove EXIF online" and you get a wall of sites that ask you to upload the photo first. Think about what that means: to hide the coordinates of your house, you hand them to an anonymous server that may log, cache, or resell the file. A privacy tool that transmits your data is a data-collection funnel wearing a helpful mask.
Metawipe does the whole job in the browser tab. You drop a JPEG on the page and it never leaves your machine: no upload, no backend, no telemetry. You can pull your network cable and it works exactly the same, and a test in the repo audits the source so no stray egress call can sneak back in. Parsing the metadata and rewriting the file both happen in JavaScript on the hardware in front of you.
How the strip stays lossless
Here is the part worth knowing even if you never open the app. A JPEG is not one blob. It's a
sequence of marker segments, each introduced by a two-byte marker. The metadata lives in the
application segments, APP0 through APP15: EXIF and TIFF data sit in APP1, JFIF thumbnails
in APP0, and so on. The actual compressed image, the thing your eye cares about, comes after
the start-of-scan marker (FFDA) and runs to the end of the file.
Most "cleaners" decode the whole image and re-encode it without the metadata. That works, but re-encoding a lossy format throws away a little more quality every pass and can introduce subtle artifacts. Metawipe never touches the pixels. It walks the marker list, copies the file byte-for-byte, and skips only the metadata segments on the way through. The compressed scan data lands in the output bit-identical to the input. What you download is your exact photo minus its dossier, provably, because those bytes were never decoded in the first place.
Reading the metadata to show it is the harder half, and it's a from-scratch parser rather
than a dependency you can't inspect: an endian-aware reader for the TIFF header, the nested
EXIF and GPS image-file directories (IFDs), and IPTC and XMP block detection. GPS latitude
arrives as three rational numbers, degrees, minutes and seconds, plus a N/S reference byte, so
the parser does the deg + min/60 + sec/3600 conversion and, if there's a fix, hands you a
map link to the exact spot the photo claims you were standing.
Show first, then wipe
The design decision I'm most attached to is that Metawipe shows you the leak before it removes it. Every field gets pinned over the image, with location and identity fields flagged amber and a live "14 fields, 5 leaking" counter at the top. Seeing your own coordinates painted on your own photo is the moment the abstract risk turns concrete. The counter is honest, too: what the report shows is exactly what the wipe removes, so a photo carrying only XMP or IPTC still reads as leaking rather than falsely "clean."
The honest limitation: v1 is JPEG only. PNG, WebP and HEIC all carry their own metadata in different containers, and those are on the list, not in the build. A non-JPEG gets handled gracefully instead of crashing, but it won't get scrubbed yet.
Try it
Open Metawipe, drop in any photo straight off your phone, and watch the fields fill in over the image within a second. If there's a GPS tag, click the map link and see how close it lands to where you actually took the shot. Then hit Wipe, download the clean file, and drop that back onto the page to confirm it re-parses to zero metadata fields while looking pixel-for-pixel identical. The whole round trip runs with your network panel empty, which is the entire point. The code is on GitHub if you'd rather read the parser than trust me about it.
This post is part of the build log: every app my automated factory ships gets written up here, honestly. Browse everything at apps.charliekrug.com. Comments are open below.
Loading comments…