The idea
Photos taken on a phone or camera embed EXIF metadata in the file: GPS coordinates, device model, timestamp, lens settings, and sometimes the serial number of the camera. Most social platforms strip this on upload, but Slack, email attachments, direct links from cloud storage, and file shares do not. The metadata travels with the file.
This is a single-screen web tool. You drop in JPEG, PNG, or WebP files; it reads and displays the metadata it finds; you click to strip and download. Everything runs in the browser via JavaScript. No file is ever sent to a server. The page is a static build that works offline after the first visit.
Why build this
The audience is specific and real: journalists who photograph sources in the field, developers sharing screenshots that happen to include system metadata, designers sending assets to clients, and anyone sending photos to strangers who does not want to include their home address in the file.
Existing options all have a meaningful friction point. ExifTool is the gold standard but requires command-line comfort. Online services that strip EXIF upload your file to do it, which defeats the purpose if the content is sensitive. Browser extensions only strip metadata on upload to specific platforms. Nothing exists as a clean, zero-install, zero-upload web tool you can bookmark and send to a non-technical person.
The technical surface is genuinely small. piexifjs modifies the EXIF segment in JPEG files without re-encoding image data. PNG metadata lives in ancillary chunks that can be stripped by rewriting the file with only the required IHDR, IDAT, and IEND chunks. The entire v1 can ship as a static HTML file served from GitHub Pages or Cloudflare Pages with no backend and no ongoing cost.
Stack sketch
- Frontend: Vanilla JS with Vite for bundling — no framework needed for a single-screen tool with no routing
- EXIF read and strip for JPEG:
piexifjs— modifies only the APP1 metadata segment, does not re-encode image data, so pixel quality is unchanged - EXIF read for reporting:
exifrfor parsing a human-readable summary of GPS, timestamp, device model, and software fields before the strip step - PNG metadata removal: read raw bytes with a
DataView, iterate chunks, copy only IHDR and IDAT chunks into a newUint8Array, reconstruct a valid PNG binary; no third-party library needed - File output:
URL.createObjectURLfor individual downloads;JSZipto bundle multiple cleaned files into a single ZIP download - Hosting: Cloudflare Pages — static build, zero cost, edge-cached globally
- Offline support: a Workbox-generated service worker that caches the JS bundle and WASM dependencies after first load
Scope for v1
- Drop or select JPEG, PNG, and WebP files; up to 50 files per session
- Display a summary of detected metadata per file: GPS coordinates (with a map preview if present), camera model, timestamp, software tag, and a count of remaining fields
- Strip all EXIF, IPTC, and XMP metadata and offer cleaned files for download individually or as a ZIP
- Show file size before and after (metadata segments are small but the delta is visible and reassuring)
- All processing client-side; zero network requests after page load; a banner confirms offline status via the service worker
- Deliberately out of scope for v1: HEIC/HEIF support, selective tag removal (keep timestamp, strip GPS), lossless JPEG re-compression, batch rename, or any server-side fallback path
Where it could go
HEIC is the native capture format on iPhones running iOS 11 and later, which makes it the most common photo format in the real world even if web tooling treats it as an afterthought. Adding HEIC support via libheif compiled to WebAssembly is the highest-leverage follow-on. The compiled WASM binary is large — around 5 MB — but a service worker that pre-caches it on first load hides that cost for return visits. Supporting HEIC would make the tool complete for the iPhone-heavy audience most likely to care about location privacy.
The second expansion is a URL input mode: paste an image URL, the tool fetches it, strips its metadata, and offers the cleaned file. Combined with a short bookmarklet, this becomes a one-click stripper for any image encountered while browsing. Many images are served with open CORS headers; for those that are not, a minimal CORS proxy deployed on Cloudflare Workers handles the gap without a standing server.
Watch out for
Some JPEG encoders embed color profile data in the same APP2 segment as extended EXIF. A naive strip that removes all non-image segments will discard ICC color profiles and cause visible color shifts in files that rely on them — typically photos from newer iPhones using Display P3. Read and preserve ICC profile chunks explicitly; they contain no identifying information and dropping them silently produces wrong-looking photos with no obvious cause.