Remove EXIF and GPS data from photos
Photos from phones and cameras record where and when they were taken, and with which device. Pick a folder of photos and exifstrip removes that metadata from every JPEG, PNG, WebP and HEIC file in it, without re-encoding a single pixel. It runs in this tab; your photos are never uploaded.
Run it on your folder
Nothing is downloaded until you press Run. Works in current Chrome, Edge, Firefox and Safari; saving straight back into the folder needs Chrome or Edge.
What you can do
Remove metadata, save clean copies
Writes a metadata-free copy of every photo into a cleaned/ folder (subfolders are kept). Your originals stay as they are.
exifstrip strip --keep-orientation --keep-icc -o cleaned .
Remove metadata in place
Removes the metadata from the photos themselves. Saving overwrites the originals in your folder.
exifstrip strip --keep-orientation --keep-icc .
Check what your photos reveal
Lists, per photo, whether it carries GPS coordinates, the camera model and the capture date. Changes nothing.
exifstrip show .
How it works
- Pick a folder. Choose the folder that holds your photos. The browser copies them into a sandbox in this tab; nothing is sent to a server.
- Choose what to do. Save clean copies into a new folder, clean the photos in place, or just check which ones carry GPS data.
- Run exifstrip. Press Run. exifstrip removes the EXIF, GPS, XMP and IPTC blocks from each photo without re-encoding the image.
- Save the results. Save the cleaned photos back into your folder, or download them as a zip file.
Under the hood the page boots NanoVM, a Linux userland compiled to WebAssembly, in this tab. Your folder is copied into its in-memory filesystem at /work, and a BusyBox shell runs the command, which starts exifstrip on the WebAssembly (WASI) runner. The Terminal tab opens the same folder in an interactive shell, for anything the presets don’t cover.
Your files stay on your device
Your photos are read by your browser and copied into an in-memory filesystem inside this tab. exifstrip, compiled to WebAssembly, processes them there. Nothing is uploaded: the page has no server-side component to upload to.
The only network requests the tool makes are for the exifstrip program itself, a signed and content-hashed package fetched from the jsDelivr CDN the first time you press Run. The counter next to the Run button lists every request that leaves this site while the page is open.
When you save, the browser writes the new files into the folder you picked, after asking for permission. Files are never deleted.
Questions
Which metadata does it remove?
EXIF (including GPS coordinates, camera make and model, serial numbers and capture time), XMP, IPTC and embedded comments. With the defaults it keeps two things that change how a photo looks: the orientation tag and the color profile. Untick them to remove those too.
Does removing metadata reduce image quality?
No. exifstrip removes metadata blocks from the file container and copies the compressed image data unchanged, so the pixels are bit-for-bit identical. The file gets a little smaller.
Does it work with iPhone HEIC photos?
Yes. For HEIC, HEIF and AVIF files the Exif and XMP items are overwritten in place, because removing them would mean rewriting the file's index. The location and camera data are gone either way.
Are my photos uploaded anywhere?
No. They are processed inside your browser tab by a WebAssembly build of exifstrip. You can watch the request counter on the page, or disconnect from the internet after the tool has loaded and it keeps working.
Why does my browser ask for permission to edit files?
Saving the results back to the folder uses the File System Access API, which asks before a page may write to a folder. In Firefox and Safari, which don't offer it, you download a zip file instead.
Is there a limit on the number of photos?
The folder is copied into the tab's memory, so the limit is 512 MB per run. Pick a subfolder if yours is larger.
The software
- program
- exifstrip (userland.run)
0.1.0 - license
AGPL-3.0-only OR LicenseRef-UEL- source
- github.com/userland-run/nano/tree/main/apps/core/build/exifstrip
- runs on
- WebAssembly (wasm32-wasip1) on the host wasm engine
- delivered as
- a signed, content-addressed package from the NanoVM app catalog (Ed25519 + SHA-256, verified in the browser)
- this page
AGPL-3.0-only OR LicenseRef-UEL· source
Build the same thing into your page
This tool is the <nano-tool> web component from the public NanoVM SDK (@userland-run/nano-sdk/tools), with the built-in exif definition. The same element runs on any page:
<script type="module">
import { defineNanoTool } from "@userland-run/nano-sdk/tools";
defineNanoTool();
</script>
<nano-tool tool="exif" wasm-url="/nano.wasm" terminal url-params></nano-tool>Or headless, with the folder bridge (@userland-run/nano-sdk/folder). Definitions are plain data — presets, form fields and quoted command templates — so you can write one for any catalog app.
import { createNano } from "@userland-run/nano-sdk";
import { mountFolder } from "@userland-run/nano-sdk/folder";
import { runTool } from "@userland-run/nano-sdk/tools";
const nano = await createNano({ image: { wasm: "/nano.wasm" }, ramMB: 512 });
const dir = await showDirectoryPicker({ mode: "readwrite" });
const folder = await mountFolder(nano, dir, { at: "/work" });
// installs exifstrip from the signed catalog, then runs:
// exifstrip strip --keep-orientation --keep-icc -o cleaned .
const r = await runTool(nano, { tool: "exif", preset: "strip-copy", folder });
if (r.exitCode === 0) await folder.writeBack(); // new and changed files only; never deletes