Compare commits

..
Author SHA1 Message Date
SharifandClaude Sonnet 5.5 6d5e92b14d Add four more privacy guides and keep CNAME in the build
Windows/Mac removal, viewing EXIF, social media behaviour and a sharing
checklist. public/CNAME stops gh-pages deploys from dropping the custom
domain.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 07:30:48 +06:00
SharifandClaude Sonnet 5.5 edf5debe34 Add social preview image and iPhone/Android EXIF guides
New 1200x630 preview card with the new logo, two high-intent guides,
cross-linked related lists, updated sitemap, footer and guides index.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 07:27:56 +06:00
SharifandClaude Sonnet 5.5 1a9b726354 Add batch cleaning with per-file review and ZIP download
Up to 50 images at once; single-image flow unchanged. Includes a
dependency-free stored-ZIP writer.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 07:25:12 +06:00
SharifandClaude Sonnet 5.5 28a8151cc0 Add logo, animated explainer, trust section and photo-privacy guides
Reposition around EXIF/GPS/C2PA privacy, replace dead HowTo/FAQ schema,
add three guide pages with sitemap and internal links.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 07:23:55 +06:00
37 changed files with 2238 additions and 178 deletions

No files matched your search

@@ -0,0 +1,116 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Do social media sites remove EXIF data? What to know before you post | Untrace</title>
<meta name="description" content="Many platforms strip location from the photos they display, but not all do, and policies change. Learn when you can rely on it and why cleaning the file yourself is safer." />
<link rel="canonical" href="https://untrace.realbrain.cc/guides/do-social-media-sites-remove-exif-data/" />
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1" />
<meta name="color-scheme" content="dark light" />
<meta name="theme-color" content="#080808" media="(prefers-color-scheme: dark)" />
<meta name="theme-color" content="#F7F7F9" media="(prefers-color-scheme: light)" />
<script>(function(){try{var s=localStorage.getItem("untrace-theme");var t=s==="light"||s==="dark"?s:window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";if(t==="light")document.documentElement.setAttribute("data-theme","light")}catch(e){}})();</script>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="manifest" href="/manifest.json" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&amp;family=IBM+Plex+Sans:wght@400;500;600&amp;display=swap" />
<meta property="og:type" content="article" />
<meta property="og:site_name" content="Untrace" />
<meta property="og:url" content="https://untrace.realbrain.cc/guides/do-social-media-sites-remove-exif-data/" />
<meta property="og:title" content="Do social media sites remove EXIF data from photos?" />
<meta property="og:description" content="Many platforms strip location from the photos they display, but not all do, and policies change. Learn when you can rely on it and why cleaning the file yourself is safer." />
<meta property="og:image" content="https://untrace.realbrain.cc/thumb.jpg" />
<meta name="twitter:card" content="summary_large_image" />
<script type="application/ld+json">{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Article",
"headline": "Do social media sites remove EXIF data from photos?",
"description": "Many platforms strip location from the photos they display, but not all do, and policies change. Learn when you can rely on it and why cleaning the file yourself is safer.",
"datePublished": "2026-10-20",
"dateModified": "2026-10-20",
"inLanguage": "en",
"mainEntityOfPage": "https://untrace.realbrain.cc/guides/do-social-media-sites-remove-exif-data/",
"image": "https://untrace.realbrain.cc/thumb.jpg",
"author": {
"@type": "Organization",
"name": "Untrace",
"url": "https://untrace.realbrain.cc/"
},
"publisher": {
"@type": "Organization",
"name": "Untrace",
"logo": {
"@type": "ImageObject",
"url": "https://untrace.realbrain.cc/logo-512.png"
}
}
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Untrace",
"item": "https://untrace.realbrain.cc/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Guides",
"item": "https://untrace.realbrain.cc/guides/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Do social media sites remove EXIF data from photos?",
"item": "https://untrace.realbrain.cc/guides/do-social-media-sites-remove-exif-data/"
}
]
}
]
}</script>
</head>
<body>
<header class="topbar">
<div class="wrap inner">
<a class="wordmark" href="/" aria-label="Untrace home"><span class="r-mark" aria-hidden="true"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path d="M15 4.5H8A3.5 3.5 0 0 0 4.5 8v8A3.5 3.5 0 0 0 8 19.5h7"/><path d="M18.5 4.5v.01M18.5 9v.01M18.5 14v.01M18.5 19v.01" stroke-width="2.4" opacity="0.55"/><path d="M21 4.5v.01M21 9v.01" stroke-width="2" opacity="0.28"/><path d="M8 15.5 11 12l2 2.2 1.5-1.7"/></svg></span><span>Untrace</span></a>
<nav class="actions" aria-label="Site"><a class="btn btn-ghost" href="/guides/">Guides</a></nav>
</div>
</header>
<main class="guide">
<div class="wrap">
<ol class="crumbs"><li><a href="/">Untrace</a></li><li><a href="/guides/">Guides</a></li><li aria-current="page">Do social media sites remove EXIF data from photos?</li></ol>
<article>
<h1>Do social media sites remove EXIF data from photos?</h1>
<p class="lead">Many large platforms remove location and camera details from the version of a photo they display. That does not mean every site does, and it does not cover the other ways a photo reaches people.</p>
<p class="meta">Updated 2026-10-20 · Written by the Untrace team</p>
<h2>What platforms commonly do</h2>
<p>Large social networks generally re-encode uploads and drop most embedded metadata from the public copy. Smaller sites, forums, marketplaces, blogs and some messaging options often serve your file exactly as you uploaded it, GPS included.</p>
<p>Platform behaviour is not guaranteed and it changes without notice. Treat a platform's policy as a bonus and not as your privacy plan.</p>
<h2>Where metadata still leaks</h2>
<ul>
<li><strong>Original-file sharing:</strong> email attachments, cloud links, and chat apps' file or document options usually keep everything.</li>
<li><strong>Marketplaces and classifieds:</strong> listing photos of items at home can show your address through the coordinates.</li>
<li><strong>Your own website or blog:</strong> uploads to a CMS are served as they are unless a plugin strips them.</li>
<li><strong>Before upload:</strong> the platform itself receives your original, metadata included, even if it hides it from viewers.</li>
</ul>
<h2>A safer habit</h2>
<p>Clean the file before it leaves your device. In <a href="/#tool">Untrace</a> you can see what a photo carries, remove it, and share the copy. Nothing is uploaded, so the platform and everyone else only ever receives the clean file.</p>
<div class="callout"><p><strong>What this does not hide.</strong> Metadata removal does not change what is visible: street signs, landmarks, reflections and shadows can still reveal where a photo was taken.</p></div>
<p>More detail: <a href="/guides/what-is-exif-data/">What is EXIF data?</a> and <a href="/guides/remove-gps-from-photo/">how to remove GPS from a photo</a>.</p>
<div class="cta"><p><strong>See what your own photo is hiding.</strong> Untrace lists every metadata block, then removes it, all inside your browser.</p><a class="btn btn-primary" href="/#tool">Scan a photo</a></div>
<h2>Common questions</h2>
<h3>Is it safe to post a photo with GPS data on social media?</h3><p>It may be hidden from viewers, but it still reaches the platform, and other places the file goes may keep it. Cleaning first avoids the question.</p><h3>Which sites keep EXIF data?</h3><p>Any site that serves your original file can. That includes many forums, personal sites and marketplaces. Check the result by downloading your own post and scanning it.</p>
<nav class="related" aria-label="Related guides"><h2>Keep reading</h2><ul><li><a href="/guides/remove-gps-from-photo/">How to remove GPS location from a photo</a></li><li><a href="/guides/remove-exif-data-iphone/">How to remove EXIF data from photos on iPhone</a></li><li><a href="/guides/remove-exif-data-android/">How to remove EXIF and location data from photos on Android</a></li><li><a href="/guides/remove-exif-data-windows-mac/">How to remove EXIF data from photos on Windows and Mac</a></li><li><a href="/guides/how-to-view-exif-data/">How to view the EXIF data of a photo</a></li><li><a href="/guides/photo-metadata-privacy-checklist/">Photo metadata privacy checklist</a></li><li><a href="/guides/what-is-exif-data/">What is EXIF data?</a></li><li><a href="/guides/what-is-c2pa/">What is C2PA and how do Content Credentials work?</a></li></ul></nav>
</article>
</div>
</main>
<script type="module" src="/src/guide.js"></script>
</body>
</html>
+120
View File
@@ -0,0 +1,120 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>How to view EXIF data of a photo on any device | Untrace</title>
<meta name="description" content="See the hidden EXIF data inside a photo on Windows, Mac, iPhone, Android or in your browser: location, camera, time and more, before you share the file." />
<link rel="canonical" href="https://untrace.realbrain.cc/guides/how-to-view-exif-data/" />
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1" />
<meta name="color-scheme" content="dark light" />
<meta name="theme-color" content="#080808" media="(prefers-color-scheme: dark)" />
<meta name="theme-color" content="#F7F7F9" media="(prefers-color-scheme: light)" />
<script>(function(){try{var s=localStorage.getItem("untrace-theme");var t=s==="light"||s==="dark"?s:window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";if(t==="light")document.documentElement.setAttribute("data-theme","light")}catch(e){}})();</script>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="manifest" href="/manifest.json" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&amp;family=IBM+Plex+Sans:wght@400;500;600&amp;display=swap" />
<meta property="og:type" content="article" />
<meta property="og:site_name" content="Untrace" />
<meta property="og:url" content="https://untrace.realbrain.cc/guides/how-to-view-exif-data/" />
<meta property="og:title" content="How to view the EXIF data of a photo" />
<meta property="og:description" content="See the hidden EXIF data inside a photo on Windows, Mac, iPhone, Android or in your browser: location, camera, time and more, before you share the file." />
<meta property="og:image" content="https://untrace.realbrain.cc/thumb.jpg" />
<meta name="twitter:card" content="summary_large_image" />
<script type="application/ld+json">{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Article",
"headline": "How to view the EXIF data of a photo",
"description": "See the hidden EXIF data inside a photo on Windows, Mac, iPhone, Android or in your browser: location, camera, time and more, before you share the file.",
"datePublished": "2026-10-20",
"dateModified": "2026-10-20",
"inLanguage": "en",
"mainEntityOfPage": "https://untrace.realbrain.cc/guides/how-to-view-exif-data/",
"image": "https://untrace.realbrain.cc/thumb.jpg",
"author": {
"@type": "Organization",
"name": "Untrace",
"url": "https://untrace.realbrain.cc/"
},
"publisher": {
"@type": "Organization",
"name": "Untrace",
"logo": {
"@type": "ImageObject",
"url": "https://untrace.realbrain.cc/logo-512.png"
}
}
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Untrace",
"item": "https://untrace.realbrain.cc/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Guides",
"item": "https://untrace.realbrain.cc/guides/"
},
{
"@type": "ListItem",
"position": 3,
"name": "How to view the EXIF data of a photo",
"item": "https://untrace.realbrain.cc/guides/how-to-view-exif-data/"
}
]
}
]
}</script>
</head>
<body>
<header class="topbar">
<div class="wrap inner">
<a class="wordmark" href="/" aria-label="Untrace home"><span class="r-mark" aria-hidden="true"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path d="M15 4.5H8A3.5 3.5 0 0 0 4.5 8v8A3.5 3.5 0 0 0 8 19.5h7"/><path d="M18.5 4.5v.01M18.5 9v.01M18.5 14v.01M18.5 19v.01" stroke-width="2.4" opacity="0.55"/><path d="M21 4.5v.01M21 9v.01" stroke-width="2" opacity="0.28"/><path d="M8 15.5 11 12l2 2.2 1.5-1.7"/></svg></span><span>Untrace</span></a>
<nav class="actions" aria-label="Site"><a class="btn btn-ghost" href="/guides/">Guides</a></nav>
</div>
</header>
<main class="guide">
<div class="wrap">
<ol class="crumbs"><li><a href="/">Untrace</a></li><li><a href="/guides/">Guides</a></li><li aria-current="page">How to view the EXIF data of a photo</li></ol>
<article>
<h1>How to view the EXIF data of a photo</h1>
<p class="lead">You can read a photo's hidden details in seconds, on any device. Checking first tells you whether a photo is safe to share.</p>
<p class="meta">Updated 2026-10-20 · Written by the Untrace team</p>
<h2>In your browser, on any device</h2>
<p>Add the photo to <a href="/#tool">Untrace</a>. It lists every metadata block it finds, such as GPS location, camera and device, timestamps, XMP and IPTC fields and C2PA content credentials, and it can show the raw values. The photo is read inside your browser and is not uploaded.</p>
<h2>On Windows</h2>
<p>Right-click the photo, choose Properties, then the Details tab. It shows camera, date, and GPS coordinates if present.</p>
<h2>On Mac</h2>
<p>Open the photo in Preview, choose Tools, then Show Inspector. The Exif and GPS tabs show the stored values.</p>
<h2>On iPhone</h2>
<p>Open the photo in Photos and tap the info button or swipe up. You will see the camera, lens, file size and a map if the photo has a location.</p>
<h2>On Android</h2>
<p>Open the photo in your gallery or Google Photos and swipe up or tap Details. Location, device and capture time appear there.</p>
<h2>What to look for</h2>
<ul>
<li><strong>GPS or a map:</strong> the photo can reveal where it was taken.</li>
<li><strong>Make, model and serial numbers:</strong> identify the device.</li>
<li><strong>Date and time:</strong> show when you were there.</li>
<li><strong>Software and creator fields:</strong> reveal the apps you use and sometimes your name.</li>
</ul>
<p>If any of that should stay private, remove it before sharing. See <a href="/guides/what-is-exif-data/">what EXIF data is</a> for the full list.</p>
<div class="cta"><p><strong>See what your own photo is hiding.</strong> Untrace lists every metadata block, then removes it, all inside your browser.</p><a class="btn btn-primary" href="/#tool">Scan a photo</a></div>
<h2>Common questions</h2>
<h3>Why do some photos show no EXIF data?</h3><p>The photo may have been edited, converted or shared through an app that strips it. Screenshots and many downloaded images carry little or none.</p><h3>Can I see EXIF data without installing software?</h3><p>Yes. Your operating system and Untrace in your browser both show it without installing anything.</p>
<nav class="related" aria-label="Related guides"><h2>Keep reading</h2><ul><li><a href="/guides/remove-gps-from-photo/">How to remove GPS location from a photo</a></li><li><a href="/guides/remove-exif-data-iphone/">How to remove EXIF data from photos on iPhone</a></li><li><a href="/guides/remove-exif-data-android/">How to remove EXIF and location data from photos on Android</a></li><li><a href="/guides/remove-exif-data-windows-mac/">How to remove EXIF data from photos on Windows and Mac</a></li><li><a href="/guides/do-social-media-sites-remove-exif-data/">Do social media sites remove EXIF data from photos?</a></li><li><a href="/guides/photo-metadata-privacy-checklist/">Photo metadata privacy checklist</a></li><li><a href="/guides/what-is-exif-data/">What is EXIF data?</a></li><li><a href="/guides/what-is-c2pa/">What is C2PA and how do Content Credentials work?</a></li></ul></nav>
</article>
</div>
</main>
<script type="module" src="/src/guide.js"></script>
</body>
</html>
+46
View File
@@ -0,0 +1,46 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Photo privacy guides: EXIF, GPS and C2PA | Untrace</title>
<meta name="description" content="Plain-language guides to the hidden data inside photos: EXIF, GPS location and C2PA Content Credentials, and how to remove them." />
<link rel="canonical" href="https://untrace.realbrain.cc/guides/" />
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1" />
<meta name="color-scheme" content="dark light" />
<meta name="theme-color" content="#080808" media="(prefers-color-scheme: dark)" />
<meta name="theme-color" content="#F7F7F9" media="(prefers-color-scheme: light)" />
<script>(function(){try{var s=localStorage.getItem("untrace-theme");var t=s==="light"||s==="dark"?s:window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";if(t==="light")document.documentElement.setAttribute("data-theme","light")}catch(e){}})();</script>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="manifest" href="/manifest.json" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&amp;family=IBM+Plex+Sans:wght@400;500;600&amp;display=swap" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Untrace" />
<meta property="og:url" content="https://untrace.realbrain.cc/guides/" />
<meta property="og:title" content="Photo privacy guides" />
<meta property="og:description" content="Plain-language guides to the hidden data inside photos: EXIF, GPS location and C2PA Content Credentials, and how to remove them." />
<meta property="og:image" content="https://untrace.realbrain.cc/thumb.jpg" />
<meta name="twitter:card" content="summary_large_image" />
</head>
<body>
<header class="topbar">
<div class="wrap inner">
<a class="wordmark" href="/" aria-label="Untrace home"><span class="r-mark" aria-hidden="true"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path d="M15 4.5H8A3.5 3.5 0 0 0 4.5 8v8A3.5 3.5 0 0 0 8 19.5h7"/><path d="M18.5 4.5v.01M18.5 9v.01M18.5 14v.01M18.5 19v.01" stroke-width="2.4" opacity="0.55"/><path d="M21 4.5v.01M21 9v.01" stroke-width="2" opacity="0.28"/><path d="M8 15.5 11 12l2 2.2 1.5-1.7"/></svg></span><span>Untrace</span></a>
<nav class="actions" aria-label="Site"><a class="btn btn-ghost" href="/">Clean a photo</a></nav>
</div>
</header>
<main class="guide">
<div class="wrap">
<article>
<h1>Photo privacy guides</h1>
<p class="lead">Plain-language explanations of the hidden data inside photos, and how to remove it.</p>
</article>
<div class="index-list"><a class="card" href="/guides/remove-gps-from-photo/"><strong>How to remove GPS location from a photo</strong><span>Most phones save the exact latitude and longitude of every photo they take. If the file keeps that data when you share it, anyone who receives it can read where you were.</span></a><a class="card" href="/guides/remove-exif-data-iphone/"><strong>How to remove EXIF data from photos on iPhone</strong><span>iPhone photos carry their location, the device model and the time they were taken. iOS lets you remove some of that, but not all of it. This guide covers each option and what it leaves behind.</span></a><a class="card" href="/guides/remove-exif-data-android/"><strong>How to remove EXIF and location data from photos on Android</strong><span>Android phones usually write GPS coordinates, the device model and a timestamp into every photo. The steps differ between manufacturers, so this guide covers the common ones and a method that works on any phone.</span></a><a class="card" href="/guides/remove-exif-data-windows-mac/"><strong>How to remove EXIF data from photos on Windows and Mac</strong><span>Both Windows and macOS can remove some photo metadata without extra software. Here is what each built-in tool does, where it falls short, and a method that works the same on either system.</span></a><a class="card" href="/guides/how-to-view-exif-data/"><strong>How to view the EXIF data of a photo</strong><span>You can read a photo's hidden details in seconds, on any device. Checking first tells you whether a photo is safe to share.</span></a><a class="card" href="/guides/do-social-media-sites-remove-exif-data/"><strong>Do social media sites remove EXIF data from photos?</strong><span>Many large platforms remove location and camera details from the version of a photo they display. That does not mean every site does, and it does not cover the other ways a photo reaches people.</span></a><a class="card" href="/guides/photo-metadata-privacy-checklist/"><strong>Photo metadata privacy checklist</strong><span>Run through this list before you post, sell or send a photo. It takes under a minute and covers the details people most often leak by accident.</span></a><a class="card" href="/guides/what-is-exif-data/"><strong>What is EXIF data?</strong><span>EXIF (Exchangeable Image File Format) is a block of hidden information that cameras and phones write into a photo file. It travels with the picture unless something removes it.</span></a><a class="card" href="/guides/what-is-c2pa/"><strong>What is C2PA and how do Content Credentials work?</strong><span>C2PA is an open standard from the Coalition for Content Provenance and Authenticity. It lets software attach a cryptographically signed record to an image describing where it came from and how it was changed.</span></a></div>
</div>
</main>
<script type="module" src="/src/guide.js"></script>
</body>
</html>
@@ -0,0 +1,121 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Photo metadata privacy checklist: before you share a picture | Untrace</title>
<meta name="description" content="A short checklist to protect your location and identity before you post, sell or send a photo: what to check, what to remove and when it matters most." />
<link rel="canonical" href="https://untrace.realbrain.cc/guides/photo-metadata-privacy-checklist/" />
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1" />
<meta name="color-scheme" content="dark light" />
<meta name="theme-color" content="#080808" media="(prefers-color-scheme: dark)" />
<meta name="theme-color" content="#F7F7F9" media="(prefers-color-scheme: light)" />
<script>(function(){try{var s=localStorage.getItem("untrace-theme");var t=s==="light"||s==="dark"?s:window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";if(t==="light")document.documentElement.setAttribute("data-theme","light")}catch(e){}})();</script>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="manifest" href="/manifest.json" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&amp;family=IBM+Plex+Sans:wght@400;500;600&amp;display=swap" />
<meta property="og:type" content="article" />
<meta property="og:site_name" content="Untrace" />
<meta property="og:url" content="https://untrace.realbrain.cc/guides/photo-metadata-privacy-checklist/" />
<meta property="og:title" content="Photo metadata privacy checklist" />
<meta property="og:description" content="A short checklist to protect your location and identity before you post, sell or send a photo: what to check, what to remove and when it matters most." />
<meta property="og:image" content="https://untrace.realbrain.cc/thumb.jpg" />
<meta name="twitter:card" content="summary_large_image" />
<script type="application/ld+json">{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Article",
"headline": "Photo metadata privacy checklist",
"description": "A short checklist to protect your location and identity before you post, sell or send a photo: what to check, what to remove and when it matters most.",
"datePublished": "2026-10-20",
"dateModified": "2026-10-20",
"inLanguage": "en",
"mainEntityOfPage": "https://untrace.realbrain.cc/guides/photo-metadata-privacy-checklist/",
"image": "https://untrace.realbrain.cc/thumb.jpg",
"author": {
"@type": "Organization",
"name": "Untrace",
"url": "https://untrace.realbrain.cc/"
},
"publisher": {
"@type": "Organization",
"name": "Untrace",
"logo": {
"@type": "ImageObject",
"url": "https://untrace.realbrain.cc/logo-512.png"
}
}
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Untrace",
"item": "https://untrace.realbrain.cc/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Guides",
"item": "https://untrace.realbrain.cc/guides/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Photo metadata privacy checklist",
"item": "https://untrace.realbrain.cc/guides/photo-metadata-privacy-checklist/"
}
]
}
]
}</script>
</head>
<body>
<header class="topbar">
<div class="wrap inner">
<a class="wordmark" href="/" aria-label="Untrace home"><span class="r-mark" aria-hidden="true"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path d="M15 4.5H8A3.5 3.5 0 0 0 4.5 8v8A3.5 3.5 0 0 0 8 19.5h7"/><path d="M18.5 4.5v.01M18.5 9v.01M18.5 14v.01M18.5 19v.01" stroke-width="2.4" opacity="0.55"/><path d="M21 4.5v.01M21 9v.01" stroke-width="2" opacity="0.28"/><path d="M8 15.5 11 12l2 2.2 1.5-1.7"/></svg></span><span>Untrace</span></a>
<nav class="actions" aria-label="Site"><a class="btn btn-ghost" href="/guides/">Guides</a></nav>
</div>
</header>
<main class="guide">
<div class="wrap">
<ol class="crumbs"><li><a href="/">Untrace</a></li><li><a href="/guides/">Guides</a></li><li aria-current="page">Photo metadata privacy checklist</li></ol>
<article>
<h1>Photo metadata privacy checklist</h1>
<p class="lead">Run through this list before you post, sell or send a photo. It takes under a minute and covers the details people most often leak by accident.</p>
<p class="meta">Updated 2026-10-20 · Written by the Untrace team</p>
<h2>Before you share</h2>
<ol>
<li><strong>Check for location.</strong> If the photo was taken at home, work or school, assume it has GPS coordinates until you have looked.</li>
<li><strong>Check the device and time.</strong> Camera model, serial numbers and capture time can link photos to one person.</li>
<li><strong>Check creator and software fields.</strong> They can hold your name, your editing apps or an account.</li>
<li><strong>Check for content credentials.</strong> Some apps and AI tools add a signed edit history. See <a href="/guides/what-is-c2pa/">what C2PA is</a>.</li>
<li><strong>Clean the file, then check again.</strong> Scan the cleaned copy to confirm nothing survived.</li>
</ol>
<h2>When it matters most</h2>
<ul>
<li><strong>Selling items online:</strong> photos taken in your home can expose your address to buyers.</li>
<li><strong>Posting about children or family:</strong> remove location from photos taken at home or school.</li>
<li><strong>Journalism and activism:</strong> metadata can identify a source, a device or a place.</li>
<li><strong>Dating and meetups:</strong> a precise location should never travel with a photo to a stranger.</li>
<li><strong>Sending original files:</strong> email, cloud links and document-style attachments keep everything.</li>
</ul>
<h2>Make it a habit</h2>
<p>Switch off location tags in your camera app, then clean any photo you share as a file. <a href="/#tool">Untrace</a> handles up to 50 photos at once in your browser, so there is nothing to upload and nothing to install.</p>
<div class="callout"><p><strong>Remember what metadata cannot hide.</strong> The picture itself can still reveal a place. Check backgrounds, signs and reflections as well.</p></div>
<div class="cta"><p><strong>See what your own photo is hiding.</strong> Untrace lists every metadata block, then removes it, all inside your browser.</p><a class="btn btn-primary" href="/#tool">Scan a photo</a></div>
<h2>Common questions</h2>
<h3>How long does the checklist take?</h3><p>Under a minute for a single photo. Batch cleaning makes it quick for an album too.</p><h3>Do I need to clean every photo I share?</h3><p>Only the ones that leave your control as files. Photos you only view privately do not need it, but cleaning before you send is a safe default.</p>
<nav class="related" aria-label="Related guides"><h2>Keep reading</h2><ul><li><a href="/guides/remove-gps-from-photo/">How to remove GPS location from a photo</a></li><li><a href="/guides/remove-exif-data-iphone/">How to remove EXIF data from photos on iPhone</a></li><li><a href="/guides/remove-exif-data-android/">How to remove EXIF and location data from photos on Android</a></li><li><a href="/guides/remove-exif-data-windows-mac/">How to remove EXIF data from photos on Windows and Mac</a></li><li><a href="/guides/how-to-view-exif-data/">How to view the EXIF data of a photo</a></li><li><a href="/guides/do-social-media-sites-remove-exif-data/">Do social media sites remove EXIF data from photos?</a></li><li><a href="/guides/what-is-exif-data/">What is EXIF data?</a></li><li><a href="/guides/what-is-c2pa/">What is C2PA and how do Content Credentials work?</a></li></ul></nav>
</article>
</div>
</main>
<script type="module" src="/src/guide.js"></script>
</body>
</html>
+120
View File
@@ -0,0 +1,120 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>How to remove EXIF and location data from photos on Android | Untrace</title>
<meta name="description" content="Remove EXIF and GPS data from Android photos: switch off location tags, remove location in Google Photos or Samsung Gallery, and clean the whole file in your browser." />
<link rel="canonical" href="https://untrace.realbrain.cc/guides/remove-exif-data-android/" />
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1" />
<meta name="color-scheme" content="dark light" />
<meta name="theme-color" content="#080808" media="(prefers-color-scheme: dark)" />
<meta name="theme-color" content="#F7F7F9" media="(prefers-color-scheme: light)" />
<script>(function(){try{var s=localStorage.getItem("untrace-theme");var t=s==="light"||s==="dark"?s:window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";if(t==="light")document.documentElement.setAttribute("data-theme","light")}catch(e){}})();</script>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="manifest" href="/manifest.json" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&amp;family=IBM+Plex+Sans:wght@400;500;600&amp;display=swap" />
<meta property="og:type" content="article" />
<meta property="og:site_name" content="Untrace" />
<meta property="og:url" content="https://untrace.realbrain.cc/guides/remove-exif-data-android/" />
<meta property="og:title" content="How to remove EXIF and location data from photos on Android" />
<meta property="og:description" content="Remove EXIF and GPS data from Android photos: switch off location tags, remove location in Google Photos or Samsung Gallery, and clean the whole file in your browser." />
<meta property="og:image" content="https://untrace.realbrain.cc/thumb.jpg" />
<meta name="twitter:card" content="summary_large_image" />
<script type="application/ld+json">{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Article",
"headline": "How to remove EXIF and location data from photos on Android",
"description": "Remove EXIF and GPS data from Android photos: switch off location tags, remove location in Google Photos or Samsung Gallery, and clean the whole file in your browser.",
"datePublished": "2026-10-20",
"dateModified": "2026-10-20",
"inLanguage": "en",
"mainEntityOfPage": "https://untrace.realbrain.cc/guides/remove-exif-data-android/",
"image": "https://untrace.realbrain.cc/thumb.jpg",
"author": {
"@type": "Organization",
"name": "Untrace",
"url": "https://untrace.realbrain.cc/"
},
"publisher": {
"@type": "Organization",
"name": "Untrace",
"logo": {
"@type": "ImageObject",
"url": "https://untrace.realbrain.cc/logo-512.png"
}
}
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Untrace",
"item": "https://untrace.realbrain.cc/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Guides",
"item": "https://untrace.realbrain.cc/guides/"
},
{
"@type": "ListItem",
"position": 3,
"name": "How to remove EXIF and location data from photos on Android",
"item": "https://untrace.realbrain.cc/guides/remove-exif-data-android/"
}
]
}
]
}</script>
</head>
<body>
<header class="topbar">
<div class="wrap inner">
<a class="wordmark" href="/" aria-label="Untrace home"><span class="r-mark" aria-hidden="true"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path d="M15 4.5H8A3.5 3.5 0 0 0 4.5 8v8A3.5 3.5 0 0 0 8 19.5h7"/><path d="M18.5 4.5v.01M18.5 9v.01M18.5 14v.01M18.5 19v.01" stroke-width="2.4" opacity="0.55"/><path d="M21 4.5v.01M21 9v.01" stroke-width="2" opacity="0.28"/><path d="M8 15.5 11 12l2 2.2 1.5-1.7"/></svg></span><span>Untrace</span></a>
<nav class="actions" aria-label="Site"><a class="btn btn-ghost" href="/guides/">Guides</a></nav>
</div>
</header>
<main class="guide">
<div class="wrap">
<ol class="crumbs"><li><a href="/">Untrace</a></li><li><a href="/guides/">Guides</a></li><li aria-current="page">How to remove EXIF and location data from photos on Android</li></ol>
<article>
<h1>How to remove EXIF and location data from photos on Android</h1>
<p class="lead">Android phones usually write GPS coordinates, the device model and a timestamp into every photo. The steps differ between manufacturers, so this guide covers the common ones and a method that works on any phone.</p>
<p class="meta">Updated 2026-10-20 · Written by the Untrace team</p>
<h2>Stop adding location to new photos</h2>
<p>Open your camera app, go to its settings and switch off Location tags (the label can vary by manufacturer). New photos will stop carrying coordinates. Existing photos are unchanged.</p>
<h2>Remove location from one photo</h2>
<ul>
<li><strong>Google Photos:</strong> open the photo, swipe up for details, tap the pencil beside the location and choose Remove location.</li>
<li><strong>Samsung Gallery:</strong> open the photo, tap the More or Details option, edit the location and remove it.</li>
</ul>
<p>These steps remove location only. The camera model and capture time stay in the file.</p>
<h2>Remove location when you share</h2>
<p>Many Android versions offer a switch to remove location data on the share screen, for example in Samsung's share sheet. Options differ by phone and app, so check the share screen before you send. If you do not see one, clean the file first.</p>
<h2>Remove all metadata with Untrace</h2>
<ol>
<li>Open <a href="/#tool">Untrace</a> in Chrome and choose the photo.</li>
<li>Check what it found, then choose Clean image.</li>
<li>Download the cleaned copy and share that one.</li>
</ol>
<p>The photo never leaves your phone, because Untrace has no server to receive it. For a whole album, add up to 50 photos at once and take them as one ZIP.</p>
<div class="callout"><p><strong>Check it worked.</strong> Add the cleaned copy to Untrace again. It should report that no metadata was found.</p></div>
<div class="cta"><p><strong>See what your own photo is hiding.</strong> Untrace lists every metadata block, then removes it, all inside your browser.</p><a class="btn btn-primary" href="/#tool">Scan a photo</a></div>
<h2>Common questions</h2>
<h3>Will cleaning change how the photo looks?</h3><p>No. The pixels stay the same. The file is re-encoded, so its size can change a little.</p><h3>Do messaging apps remove EXIF data?</h3><p>Some do when you send a photo as an image, but sending it as a document or file usually keeps everything. Clean the file yourself if it matters.</p>
<nav class="related" aria-label="Related guides"><h2>Keep reading</h2><ul><li><a href="/guides/remove-gps-from-photo/">How to remove GPS location from a photo</a></li><li><a href="/guides/remove-exif-data-iphone/">How to remove EXIF data from photos on iPhone</a></li><li><a href="/guides/remove-exif-data-windows-mac/">How to remove EXIF data from photos on Windows and Mac</a></li><li><a href="/guides/how-to-view-exif-data/">How to view the EXIF data of a photo</a></li><li><a href="/guides/do-social-media-sites-remove-exif-data/">Do social media sites remove EXIF data from photos?</a></li><li><a href="/guides/photo-metadata-privacy-checklist/">Photo metadata privacy checklist</a></li><li><a href="/guides/what-is-exif-data/">What is EXIF data?</a></li><li><a href="/guides/what-is-c2pa/">What is C2PA and how do Content Credentials work?</a></li></ul></nav>
</article>
</div>
</main>
<script type="module" src="/src/guide.js"></script>
</body>
</html>
+121
View File
@@ -0,0 +1,121 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>How to remove EXIF data from photos on iPhone | Untrace</title>
<meta name="description" content="Remove location and other EXIF data from iPhone photos: turn off camera location, strip it per photo or per share, and clean the whole file in your browser." />
<link rel="canonical" href="https://untrace.realbrain.cc/guides/remove-exif-data-iphone/" />
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1" />
<meta name="color-scheme" content="dark light" />
<meta name="theme-color" content="#080808" media="(prefers-color-scheme: dark)" />
<meta name="theme-color" content="#F7F7F9" media="(prefers-color-scheme: light)" />
<script>(function(){try{var s=localStorage.getItem("untrace-theme");var t=s==="light"||s==="dark"?s:window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";if(t==="light")document.documentElement.setAttribute("data-theme","light")}catch(e){}})();</script>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="manifest" href="/manifest.json" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&amp;family=IBM+Plex+Sans:wght@400;500;600&amp;display=swap" />
<meta property="og:type" content="article" />
<meta property="og:site_name" content="Untrace" />
<meta property="og:url" content="https://untrace.realbrain.cc/guides/remove-exif-data-iphone/" />
<meta property="og:title" content="How to remove EXIF data from photos on iPhone" />
<meta property="og:description" content="Remove location and other EXIF data from iPhone photos: turn off camera location, strip it per photo or per share, and clean the whole file in your browser." />
<meta property="og:image" content="https://untrace.realbrain.cc/thumb.jpg" />
<meta name="twitter:card" content="summary_large_image" />
<script type="application/ld+json">{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Article",
"headline": "How to remove EXIF data from photos on iPhone",
"description": "Remove location and other EXIF data from iPhone photos: turn off camera location, strip it per photo or per share, and clean the whole file in your browser.",
"datePublished": "2026-10-20",
"dateModified": "2026-10-20",
"inLanguage": "en",
"mainEntityOfPage": "https://untrace.realbrain.cc/guides/remove-exif-data-iphone/",
"image": "https://untrace.realbrain.cc/thumb.jpg",
"author": {
"@type": "Organization",
"name": "Untrace",
"url": "https://untrace.realbrain.cc/"
},
"publisher": {
"@type": "Organization",
"name": "Untrace",
"logo": {
"@type": "ImageObject",
"url": "https://untrace.realbrain.cc/logo-512.png"
}
}
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Untrace",
"item": "https://untrace.realbrain.cc/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Guides",
"item": "https://untrace.realbrain.cc/guides/"
},
{
"@type": "ListItem",
"position": 3,
"name": "How to remove EXIF data from photos on iPhone",
"item": "https://untrace.realbrain.cc/guides/remove-exif-data-iphone/"
}
]
}
]
}</script>
</head>
<body>
<header class="topbar">
<div class="wrap inner">
<a class="wordmark" href="/" aria-label="Untrace home"><span class="r-mark" aria-hidden="true"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path d="M15 4.5H8A3.5 3.5 0 0 0 4.5 8v8A3.5 3.5 0 0 0 8 19.5h7"/><path d="M18.5 4.5v.01M18.5 9v.01M18.5 14v.01M18.5 19v.01" stroke-width="2.4" opacity="0.55"/><path d="M21 4.5v.01M21 9v.01" stroke-width="2" opacity="0.28"/><path d="M8 15.5 11 12l2 2.2 1.5-1.7"/></svg></span><span>Untrace</span></a>
<nav class="actions" aria-label="Site"><a class="btn btn-ghost" href="/guides/">Guides</a></nav>
</div>
</header>
<main class="guide">
<div class="wrap">
<ol class="crumbs"><li><a href="/">Untrace</a></li><li><a href="/guides/">Guides</a></li><li aria-current="page">How to remove EXIF data from photos on iPhone</li></ol>
<article>
<h1>How to remove EXIF data from photos on iPhone</h1>
<p class="lead">iPhone photos carry their location, the device model and the time they were taken. iOS lets you remove some of that, but not all of it. This guide covers each option and what it leaves behind.</p>
<p class="meta">Updated 2026-10-20 · Written by the Untrace team</p>
<h2>Stop adding location to new photos</h2>
<p>Open Settings, then Privacy &amp; Security, Location Services, Camera, and choose Never. New photos will no longer carry GPS coordinates. Photos already in your library keep theirs.</p>
<h2>Remove location from one photo</h2>
<ol>
<li>Open the photo in Photos and tap the info button, or swipe up.</li>
<li>Tap Adjust next to the location line.</li>
<li>Choose No Location.</li>
</ol>
<p>This removes the coordinates from the photo in your library. Other details, such as the device model and capture time, stay.</p>
<h2>Remove location only when you share</h2>
<p>In the share sheet, tap Options at the top and turn Location off before you send. Your original keeps its location, and the copy you share does not. This setting covers location, not the full EXIF block.</p>
<h2>Remove all metadata with Untrace</h2>
<ol>
<li>Open <a href="/#tool">Untrace</a> in Safari and choose the photo from your library.</li>
<li>Review what it found, then choose Clean image.</li>
<li>Save the cleaned copy to Photos or Files.</li>
</ol>
<p>Nothing is uploaded: the photo is read and rewritten in the browser on your phone. To clean many photos together, add up to 50 at once and download them as one ZIP.</p>
<div class="callout"><p><strong>HEIC photos.</strong> iPhones save HEIC by default. Safari can decode it, but some other browsers cannot. If a photo will not open, switch Settings, Camera, Formats to Most Compatible so new photos are saved as JPEG.</p></div>
<div class="cta"><p><strong>See what your own photo is hiding.</strong> Untrace lists every metadata block, then removes it, all inside your browser.</p><a class="btn btn-primary" href="/#tool">Scan a photo</a></div>
<h2>Common questions</h2>
<h3>Does a screenshot remove EXIF data?</h3><p>A screenshot is a new file without the original's camera details, and it normally has no GPS coordinates. It can still record the device and time.</p><h3>Does AirDrop or Messages keep location?</h3><p>They can. Sharing the original file usually includes its metadata, so use the Location switch in Options or clean the file first.</p>
<nav class="related" aria-label="Related guides"><h2>Keep reading</h2><ul><li><a href="/guides/remove-gps-from-photo/">How to remove GPS location from a photo</a></li><li><a href="/guides/remove-exif-data-android/">How to remove EXIF and location data from photos on Android</a></li><li><a href="/guides/remove-exif-data-windows-mac/">How to remove EXIF data from photos on Windows and Mac</a></li><li><a href="/guides/how-to-view-exif-data/">How to view the EXIF data of a photo</a></li><li><a href="/guides/do-social-media-sites-remove-exif-data/">Do social media sites remove EXIF data from photos?</a></li><li><a href="/guides/photo-metadata-privacy-checklist/">Photo metadata privacy checklist</a></li><li><a href="/guides/what-is-exif-data/">What is EXIF data?</a></li><li><a href="/guides/what-is-c2pa/">What is C2PA and how do Content Credentials work?</a></li></ul></nav>
</article>
</div>
</main>
<script type="module" src="/src/guide.js"></script>
</body>
</html>
@@ -0,0 +1,127 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>How to remove EXIF data from photos on Windows and Mac | Untrace</title>
<meta name="description" content="Remove EXIF and location data from photos on Windows or Mac using built-in tools, plus a browser method that cleans every metadata block and works on any computer." />
<link rel="canonical" href="https://untrace.realbrain.cc/guides/remove-exif-data-windows-mac/" />
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1" />
<meta name="color-scheme" content="dark light" />
<meta name="theme-color" content="#080808" media="(prefers-color-scheme: dark)" />
<meta name="theme-color" content="#F7F7F9" media="(prefers-color-scheme: light)" />
<script>(function(){try{var s=localStorage.getItem("untrace-theme");var t=s==="light"||s==="dark"?s:window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";if(t==="light")document.documentElement.setAttribute("data-theme","light")}catch(e){}})();</script>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="manifest" href="/manifest.json" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&amp;family=IBM+Plex+Sans:wght@400;500;600&amp;display=swap" />
<meta property="og:type" content="article" />
<meta property="og:site_name" content="Untrace" />
<meta property="og:url" content="https://untrace.realbrain.cc/guides/remove-exif-data-windows-mac/" />
<meta property="og:title" content="How to remove EXIF data from photos on Windows and Mac" />
<meta property="og:description" content="Remove EXIF and location data from photos on Windows or Mac using built-in tools, plus a browser method that cleans every metadata block and works on any computer." />
<meta property="og:image" content="https://untrace.realbrain.cc/thumb.jpg" />
<meta name="twitter:card" content="summary_large_image" />
<script type="application/ld+json">{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Article",
"headline": "How to remove EXIF data from photos on Windows and Mac",
"description": "Remove EXIF and location data from photos on Windows or Mac using built-in tools, plus a browser method that cleans every metadata block and works on any computer.",
"datePublished": "2026-10-20",
"dateModified": "2026-10-20",
"inLanguage": "en",
"mainEntityOfPage": "https://untrace.realbrain.cc/guides/remove-exif-data-windows-mac/",
"image": "https://untrace.realbrain.cc/thumb.jpg",
"author": {
"@type": "Organization",
"name": "Untrace",
"url": "https://untrace.realbrain.cc/"
},
"publisher": {
"@type": "Organization",
"name": "Untrace",
"logo": {
"@type": "ImageObject",
"url": "https://untrace.realbrain.cc/logo-512.png"
}
}
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Untrace",
"item": "https://untrace.realbrain.cc/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Guides",
"item": "https://untrace.realbrain.cc/guides/"
},
{
"@type": "ListItem",
"position": 3,
"name": "How to remove EXIF data from photos on Windows and Mac",
"item": "https://untrace.realbrain.cc/guides/remove-exif-data-windows-mac/"
}
]
}
]
}</script>
</head>
<body>
<header class="topbar">
<div class="wrap inner">
<a class="wordmark" href="/" aria-label="Untrace home"><span class="r-mark" aria-hidden="true"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path d="M15 4.5H8A3.5 3.5 0 0 0 4.5 8v8A3.5 3.5 0 0 0 8 19.5h7"/><path d="M18.5 4.5v.01M18.5 9v.01M18.5 14v.01M18.5 19v.01" stroke-width="2.4" opacity="0.55"/><path d="M21 4.5v.01M21 9v.01" stroke-width="2" opacity="0.28"/><path d="M8 15.5 11 12l2 2.2 1.5-1.7"/></svg></span><span>Untrace</span></a>
<nav class="actions" aria-label="Site"><a class="btn btn-ghost" href="/guides/">Guides</a></nav>
</div>
</header>
<main class="guide">
<div class="wrap">
<ol class="crumbs"><li><a href="/">Untrace</a></li><li><a href="/guides/">Guides</a></li><li aria-current="page">How to remove EXIF data from photos on Windows and Mac</li></ol>
<article>
<h1>How to remove EXIF data from photos on Windows and Mac</h1>
<p class="lead">Both Windows and macOS can remove some photo metadata without extra software. Here is what each built-in tool does, where it falls short, and a method that works the same on either system.</p>
<p class="meta">Updated 2026-10-20 · Written by the Untrace team</p>
<h2>Windows: remove properties from a file</h2>
<ol>
<li>Right-click the photo and choose Properties.</li>
<li>Open the Details tab and select Remove Properties and Personal Information.</li>
<li>Choose Create a copy with all possible properties removed, or pick the properties to remove from the original, then select OK.</li>
</ol>
<p>Windows removes the properties it knows about. It can leave behind blocks it does not display, so check the result if the photo is sensitive.</p>
<h2>Mac: remove location in Preview</h2>
<ol>
<li>Open the photo in Preview.</li>
<li>Choose Tools, then Show Inspector, and open the Info tab.</li>
<li>Select the GPS tab and choose Remove Location Info.</li>
<li>Save the file.</li>
</ol>
<p>This removes GPS coordinates only. Camera and timestamp details stay in the file.</p>
<h2>Mac: leave location out when you export from Photos</h2>
<p>In Photos, choose File, Export, then Export Photo, and clear the Location Information option before exporting. The exported copy has no coordinates, and the original in your library is unchanged.</p>
<h2>Any computer: clean everything in your browser</h2>
<ol>
<li>Open <a href="/#tool">Untrace</a> and drop in one photo or up to 50.</li>
<li>Review what each file hides.</li>
<li>Choose Clean image, then download the files or one ZIP.</li>
</ol>
<p>Untrace re-encodes the picture to pixels, so every metadata block is left behind, not just the ones the operating system lists. The files stay on your computer.</p>
<div class="callout"><p><strong>Command line.</strong> If you already use ExifTool, <code>exiftool -all= photo.jpg</code> removes all metadata from a file. It keeps a backup copy named photo.jpg_original unless you add <code>-overwrite_original</code>.</p></div>
<div class="cta"><p><strong>See what your own photo is hiding.</strong> Untrace lists every metadata block, then removes it, all inside your browser.</p><a class="btn btn-primary" href="/#tool">Scan a photo</a></div>
<h2>Common questions</h2>
<h3>Does renaming or compressing a photo remove EXIF data?</h3><p>Renaming does not. Compressing or re-saving can, but it depends on the app, so confirm by checking the result.</p><h3>Is removing EXIF data reversible?</h3><p>No. Once the metadata is gone from the copy, it cannot be rebuilt from that copy. Keep the original if you want the details for yourself.</p>
<nav class="related" aria-label="Related guides"><h2>Keep reading</h2><ul><li><a href="/guides/remove-gps-from-photo/">How to remove GPS location from a photo</a></li><li><a href="/guides/remove-exif-data-iphone/">How to remove EXIF data from photos on iPhone</a></li><li><a href="/guides/remove-exif-data-android/">How to remove EXIF and location data from photos on Android</a></li><li><a href="/guides/how-to-view-exif-data/">How to view the EXIF data of a photo</a></li><li><a href="/guides/do-social-media-sites-remove-exif-data/">Do social media sites remove EXIF data from photos?</a></li><li><a href="/guides/photo-metadata-privacy-checklist/">Photo metadata privacy checklist</a></li><li><a href="/guides/what-is-exif-data/">What is EXIF data?</a></li><li><a href="/guides/what-is-c2pa/">What is C2PA and how do Content Credentials work?</a></li></ul></nav>
</article>
</div>
</main>
<script type="module" src="/src/guide.js"></script>
</body>
</html>
+123
View File
@@ -0,0 +1,123 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>How to remove GPS location from a photo before you share it | Untrace</title>
<meta name="description" content="Photos can carry the exact coordinates where they were taken. Learn how to check for GPS data and remove it on iPhone, Android or in your browser." />
<link rel="canonical" href="https://untrace.realbrain.cc/guides/remove-gps-from-photo/" />
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1" />
<meta name="color-scheme" content="dark light" />
<meta name="theme-color" content="#080808" media="(prefers-color-scheme: dark)" />
<meta name="theme-color" content="#F7F7F9" media="(prefers-color-scheme: light)" />
<script>(function(){try{var s=localStorage.getItem("untrace-theme");var t=s==="light"||s==="dark"?s:window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";if(t==="light")document.documentElement.setAttribute("data-theme","light")}catch(e){}})();</script>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="manifest" href="/manifest.json" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&amp;family=IBM+Plex+Sans:wght@400;500;600&amp;display=swap" />
<meta property="og:type" content="article" />
<meta property="og:site_name" content="Untrace" />
<meta property="og:url" content="https://untrace.realbrain.cc/guides/remove-gps-from-photo/" />
<meta property="og:title" content="How to remove GPS location from a photo" />
<meta property="og:description" content="Photos can carry the exact coordinates where they were taken. Learn how to check for GPS data and remove it on iPhone, Android or in your browser." />
<meta property="og:image" content="https://untrace.realbrain.cc/thumb.jpg" />
<meta name="twitter:card" content="summary_large_image" />
<script type="application/ld+json">{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Article",
"headline": "How to remove GPS location from a photo",
"description": "Photos can carry the exact coordinates where they were taken. Learn how to check for GPS data and remove it on iPhone, Android or in your browser.",
"datePublished": "2026-10-20",
"dateModified": "2026-10-20",
"inLanguage": "en",
"mainEntityOfPage": "https://untrace.realbrain.cc/guides/remove-gps-from-photo/",
"image": "https://untrace.realbrain.cc/thumb.jpg",
"author": {
"@type": "Organization",
"name": "Untrace",
"url": "https://untrace.realbrain.cc/"
},
"publisher": {
"@type": "Organization",
"name": "Untrace",
"logo": {
"@type": "ImageObject",
"url": "https://untrace.realbrain.cc/logo-512.png"
}
}
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Untrace",
"item": "https://untrace.realbrain.cc/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Guides",
"item": "https://untrace.realbrain.cc/guides/"
},
{
"@type": "ListItem",
"position": 3,
"name": "How to remove GPS location from a photo",
"item": "https://untrace.realbrain.cc/guides/remove-gps-from-photo/"
}
]
}
]
}</script>
</head>
<body>
<header class="topbar">
<div class="wrap inner">
<a class="wordmark" href="/" aria-label="Untrace home"><span class="r-mark" aria-hidden="true"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path d="M15 4.5H8A3.5 3.5 0 0 0 4.5 8v8A3.5 3.5 0 0 0 8 19.5h7"/><path d="M18.5 4.5v.01M18.5 9v.01M18.5 14v.01M18.5 19v.01" stroke-width="2.4" opacity="0.55"/><path d="M21 4.5v.01M21 9v.01" stroke-width="2" opacity="0.28"/><path d="M8 15.5 11 12l2 2.2 1.5-1.7"/></svg></span><span>Untrace</span></a>
<nav class="actions" aria-label="Site"><a class="btn btn-ghost" href="/guides/">Guides</a></nav>
</div>
</header>
<main class="guide">
<div class="wrap">
<ol class="crumbs"><li><a href="/">Untrace</a></li><li><a href="/guides/">Guides</a></li><li aria-current="page">How to remove GPS location from a photo</li></ol>
<article>
<h1>How to remove GPS location from a photo</h1>
<p class="lead">Most phones save the exact latitude and longitude of every photo they take. If the file keeps that data when you share it, anyone who receives it can read where you were.</p>
<p class="meta">Updated 2026-10-20 · Written by the Untrace team</p>
<h2>How do you know a photo has GPS data?</h2>
<p>Location is stored in the photo's EXIF block, in fields called GPSLatitude and GPSLongitude, usually accurate to a few metres. Phones add it whenever the camera app has location access. The simplest check is to drop the photo into <a href="/#tool">Untrace</a>: it lists every metadata block it finds, including GPS, before changing anything.</p>
<h2>Option 1: turn off location tagging in the camera</h2>
<ul>
<li><strong>iPhone:</strong> Settings, Privacy &amp; Security, Location Services, Camera, then choose Never.</li>
<li><strong>Android:</strong> open the camera app, open its settings and switch off Location tags (the wording varies by manufacturer).</li>
</ul>
<p>This only protects photos you take from now on. Photos already on your phone keep their coordinates.</p>
<h2>Option 2: remove location when you share from your phone</h2>
<p>On iPhone, the share sheet has an Options button with a Location switch you can turn off for that share. Google Photos on Android offers a Remove location action in a photo's details. Both remove coordinates only. The camera model, timestamps and other EXIF fields stay in the file.</p>
<h2>Option 3: remove all metadata in your browser</h2>
<ol>
<li>Open <a href="/#tool">Untrace</a> and add the photo.</li>
<li>Review the list of what it found, GPS included.</li>
<li>Choose Clean image and download the copy.</li>
</ol>
<p>Untrace redraws the picture to pixels and writes a new file, so GPS, camera and time data are not carried over. It works offline from your file's point of view: nothing is uploaded.</p>
<div class="callout"><p><strong>Check the result.</strong> Drop the cleaned file back into Untrace. It should report that nothing was found.</p></div>
<h2>Does social media remove GPS for you?</h2>
<p>Some large platforms remove location data from the version they display, but not all do, and policies change. Photos sent as an original file by email, a chat app's file option or a cloud link usually keep everything. Cleaning the file yourself means you do not depend on the platform.</p>
<div class="cta"><p><strong>See what your own photo is hiding.</strong> Untrace lists every metadata block, then removes it, all inside your browser.</p><a class="btn btn-primary" href="/#tool">Scan a photo</a></div>
<h2>Common questions</h2>
<h3>Does removing GPS data change the picture?</h3><p>The visible image stays the same. Untrace re-encodes it, so the file size and format can change slightly.</p><h3>Can someone find my location from a photo without GPS data?</h3><p>Yes, from what the picture shows, such as street signs or landmarks. Metadata removal does not hide what is visible.</p>
<nav class="related" aria-label="Related guides"><h2>Keep reading</h2><ul><li><a href="/guides/remove-exif-data-iphone/">How to remove EXIF data from photos on iPhone</a></li><li><a href="/guides/remove-exif-data-android/">How to remove EXIF and location data from photos on Android</a></li><li><a href="/guides/remove-exif-data-windows-mac/">How to remove EXIF data from photos on Windows and Mac</a></li><li><a href="/guides/how-to-view-exif-data/">How to view the EXIF data of a photo</a></li><li><a href="/guides/do-social-media-sites-remove-exif-data/">Do social media sites remove EXIF data from photos?</a></li><li><a href="/guides/photo-metadata-privacy-checklist/">Photo metadata privacy checklist</a></li><li><a href="/guides/what-is-exif-data/">What is EXIF data?</a></li><li><a href="/guides/what-is-c2pa/">What is C2PA and how do Content Credentials work?</a></li></ul></nav>
</article>
</div>
</main>
<script type="module" src="/src/guide.js"></script>
</body>
</html>
+113
View File
@@ -0,0 +1,113 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>What is C2PA? Content Credentials explained, with their limits | Untrace</title>
<meta name="description" content="C2PA Content Credentials are a signed record of how an image was made and edited. Learn what they contain, what they can and cannot prove, and what they mean for privacy." />
<link rel="canonical" href="https://untrace.realbrain.cc/guides/what-is-c2pa/" />
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1" />
<meta name="color-scheme" content="dark light" />
<meta name="theme-color" content="#080808" media="(prefers-color-scheme: dark)" />
<meta name="theme-color" content="#F7F7F9" media="(prefers-color-scheme: light)" />
<script>(function(){try{var s=localStorage.getItem("untrace-theme");var t=s==="light"||s==="dark"?s:window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";if(t==="light")document.documentElement.setAttribute("data-theme","light")}catch(e){}})();</script>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="manifest" href="/manifest.json" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&amp;family=IBM+Plex+Sans:wght@400;500;600&amp;display=swap" />
<meta property="og:type" content="article" />
<meta property="og:site_name" content="Untrace" />
<meta property="og:url" content="https://untrace.realbrain.cc/guides/what-is-c2pa/" />
<meta property="og:title" content="What is C2PA and how do Content Credentials work?" />
<meta property="og:description" content="C2PA Content Credentials are a signed record of how an image was made and edited. Learn what they contain, what they can and cannot prove, and what they mean for privacy." />
<meta property="og:image" content="https://untrace.realbrain.cc/thumb.jpg" />
<meta name="twitter:card" content="summary_large_image" />
<script type="application/ld+json">{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Article",
"headline": "What is C2PA and how do Content Credentials work?",
"description": "C2PA Content Credentials are a signed record of how an image was made and edited. Learn what they contain, what they can and cannot prove, and what they mean for privacy.",
"datePublished": "2026-10-20",
"dateModified": "2026-10-20",
"inLanguage": "en",
"mainEntityOfPage": "https://untrace.realbrain.cc/guides/what-is-c2pa/",
"image": "https://untrace.realbrain.cc/thumb.jpg",
"author": {
"@type": "Organization",
"name": "Untrace",
"url": "https://untrace.realbrain.cc/"
},
"publisher": {
"@type": "Organization",
"name": "Untrace",
"logo": {
"@type": "ImageObject",
"url": "https://untrace.realbrain.cc/logo-512.png"
}
}
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Untrace",
"item": "https://untrace.realbrain.cc/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Guides",
"item": "https://untrace.realbrain.cc/guides/"
},
{
"@type": "ListItem",
"position": 3,
"name": "What is C2PA and how do Content Credentials work?",
"item": "https://untrace.realbrain.cc/guides/what-is-c2pa/"
}
]
}
]
}</script>
</head>
<body>
<header class="topbar">
<div class="wrap inner">
<a class="wordmark" href="/" aria-label="Untrace home"><span class="r-mark" aria-hidden="true"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path d="M15 4.5H8A3.5 3.5 0 0 0 4.5 8v8A3.5 3.5 0 0 0 8 19.5h7"/><path d="M18.5 4.5v.01M18.5 9v.01M18.5 14v.01M18.5 19v.01" stroke-width="2.4" opacity="0.55"/><path d="M21 4.5v.01M21 9v.01" stroke-width="2" opacity="0.28"/><path d="M8 15.5 11 12l2 2.2 1.5-1.7"/></svg></span><span>Untrace</span></a>
<nav class="actions" aria-label="Site"><a class="btn btn-ghost" href="/guides/">Guides</a></nav>
</div>
</header>
<main class="guide">
<div class="wrap">
<ol class="crumbs"><li><a href="/">Untrace</a></li><li><a href="/guides/">Guides</a></li><li aria-current="page">What is C2PA and how do Content Credentials work?</li></ol>
<article>
<h1>What is C2PA and how do Content Credentials work?</h1>
<p class="lead">C2PA is an open standard from the Coalition for Content Provenance and Authenticity. It lets software attach a cryptographically signed record to an image describing where it came from and how it was changed.</p>
<p class="meta">Updated 2026-10-20 · Written by the Untrace team</p>
<h2>What is inside a C2PA manifest?</h2>
<p>The record, called a manifest, can list the tool that created or edited the file, the actions taken, when they happened and who signed it. In a JPEG it is stored in JUMBF boxes inside an APP11 segment. Cameras, editing apps and some AI image generators write these manifests, and some platforms read them to show a Content Credentials or AI info label.</p>
<h2>What can it prove?</h2>
<p>A valid manifest shows that a signer vouches for the recorded history and that the file has not been altered since signing. It does not prove the picture is true, and a missing manifest does not prove the picture is fake or real.</p>
<h2>Why does it often disappear?</h2>
<p>The manifest lives in the file, not in the pixels. Taking a screenshot, converting the format or re-saving through many apps drops it. Some platforms remove it on upload, others keep or read it. Researchers are pairing metadata with invisible watermarks and fingerprints so provenance can survive, but support is uneven.</p>
<h2>What does it mean for your privacy?</h2>
<p>Credentials can name your software, your account or organisation, and your editing steps, and that record goes wherever the file goes. If you want to share a picture without that history, you can <a href="/#tool">scan and clean it in Untrace</a> first, with nothing uploaded.</p>
<div class="callout"><p><strong>Use it responsibly.</strong> Removing credentials is a privacy choice, not a licence to mislead. If you publish AI-generated or heavily edited work where disclosure is expected, such as news, contests or advertising, disclose it yourself. Pixel-level detectors and invisible watermarks are not affected by metadata removal.</p></div>
<p>Related: <a href="/guides/what-is-exif-data/">What is EXIF data?</a></p>
<div class="cta"><p><strong>See what your own photo is hiding.</strong> Untrace lists every metadata block, then removes it, all inside your browser.</p><a class="btn btn-primary" href="/#tool">Scan a photo</a></div>
<h2>Common questions</h2>
<h3>Is C2PA the same as EXIF?</h3><p>No. EXIF records camera and location details. C2PA records a signed history of creation and edits. Untrace reads and removes both.</p><h3>Can C2PA be forged?</h3><p>The signature protects the manifest from tampering, but anyone can create a manifest with their own certificate, so trust depends on who signed it.</p>
<nav class="related" aria-label="Related guides"><h2>Keep reading</h2><ul><li><a href="/guides/remove-gps-from-photo/">How to remove GPS location from a photo</a></li><li><a href="/guides/remove-exif-data-iphone/">How to remove EXIF data from photos on iPhone</a></li><li><a href="/guides/remove-exif-data-android/">How to remove EXIF and location data from photos on Android</a></li><li><a href="/guides/remove-exif-data-windows-mac/">How to remove EXIF data from photos on Windows and Mac</a></li><li><a href="/guides/how-to-view-exif-data/">How to view the EXIF data of a photo</a></li><li><a href="/guides/do-social-media-sites-remove-exif-data/">Do social media sites remove EXIF data from photos?</a></li><li><a href="/guides/photo-metadata-privacy-checklist/">Photo metadata privacy checklist</a></li><li><a href="/guides/what-is-exif-data/">What is EXIF data?</a></li></ul></nav>
</article>
</div>
</main>
<script type="module" src="/src/guide.js"></script>
</body>
</html>
+119
View File
@@ -0,0 +1,119 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>What is EXIF data? What your photos reveal and how to remove it | Untrace</title>
<meta name="description" content="EXIF data is hidden information stored inside every photo: location, camera, time and software. See what it contains, who can read it and how to remove it." />
<link rel="canonical" href="https://untrace.realbrain.cc/guides/what-is-exif-data/" />
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1" />
<meta name="color-scheme" content="dark light" />
<meta name="theme-color" content="#080808" media="(prefers-color-scheme: dark)" />
<meta name="theme-color" content="#F7F7F9" media="(prefers-color-scheme: light)" />
<script>(function(){try{var s=localStorage.getItem("untrace-theme");var t=s==="light"||s==="dark"?s:window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";if(t==="light")document.documentElement.setAttribute("data-theme","light")}catch(e){}})();</script>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="manifest" href="/manifest.json" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&amp;family=IBM+Plex+Sans:wght@400;500;600&amp;display=swap" />
<meta property="og:type" content="article" />
<meta property="og:site_name" content="Untrace" />
<meta property="og:url" content="https://untrace.realbrain.cc/guides/what-is-exif-data/" />
<meta property="og:title" content="What is EXIF data?" />
<meta property="og:description" content="EXIF data is hidden information stored inside every photo: location, camera, time and software. See what it contains, who can read it and how to remove it." />
<meta property="og:image" content="https://untrace.realbrain.cc/thumb.jpg" />
<meta name="twitter:card" content="summary_large_image" />
<script type="application/ld+json">{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Article",
"headline": "What is EXIF data?",
"description": "EXIF data is hidden information stored inside every photo: location, camera, time and software. See what it contains, who can read it and how to remove it.",
"datePublished": "2026-10-20",
"dateModified": "2026-10-20",
"inLanguage": "en",
"mainEntityOfPage": "https://untrace.realbrain.cc/guides/what-is-exif-data/",
"image": "https://untrace.realbrain.cc/thumb.jpg",
"author": {
"@type": "Organization",
"name": "Untrace",
"url": "https://untrace.realbrain.cc/"
},
"publisher": {
"@type": "Organization",
"name": "Untrace",
"logo": {
"@type": "ImageObject",
"url": "https://untrace.realbrain.cc/logo-512.png"
}
}
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Untrace",
"item": "https://untrace.realbrain.cc/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Guides",
"item": "https://untrace.realbrain.cc/guides/"
},
{
"@type": "ListItem",
"position": 3,
"name": "What is EXIF data?",
"item": "https://untrace.realbrain.cc/guides/what-is-exif-data/"
}
]
}
]
}</script>
</head>
<body>
<header class="topbar">
<div class="wrap inner">
<a class="wordmark" href="/" aria-label="Untrace home"><span class="r-mark" aria-hidden="true"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path d="M15 4.5H8A3.5 3.5 0 0 0 4.5 8v8A3.5 3.5 0 0 0 8 19.5h7"/><path d="M18.5 4.5v.01M18.5 9v.01M18.5 14v.01M18.5 19v.01" stroke-width="2.4" opacity="0.55"/><path d="M21 4.5v.01M21 9v.01" stroke-width="2" opacity="0.28"/><path d="M8 15.5 11 12l2 2.2 1.5-1.7"/></svg></span><span>Untrace</span></a>
<nav class="actions" aria-label="Site"><a class="btn btn-ghost" href="/guides/">Guides</a></nav>
</div>
</header>
<main class="guide">
<div class="wrap">
<ol class="crumbs"><li><a href="/">Untrace</a></li><li><a href="/guides/">Guides</a></li><li aria-current="page">What is EXIF data?</li></ol>
<article>
<h1>What is EXIF data?</h1>
<p class="lead">EXIF (Exchangeable Image File Format) is a block of hidden information that cameras and phones write into a photo file. It travels with the picture unless something removes it.</p>
<p class="meta">Updated 2026-10-20 · Written by the Untrace team</p>
<h2>What does EXIF data contain?</h2>
<ul>
<li><strong>Location:</strong> GPS latitude, longitude, altitude and direction.</li>
<li><strong>Device:</strong> camera or phone make and model, lens, and sometimes a serial number.</li>
<li><strong>Time:</strong> when the photo was taken and when it was edited.</li>
<li><strong>Settings:</strong> exposure, aperture, ISO, focal length and flash.</li>
<li><strong>Software:</strong> the app or editor that last saved the file.</li>
<li><strong>A thumbnail:</strong> a small embedded preview, which can differ from the visible image if the photo was cropped.</li>
</ul>
<p>Related blocks sit alongside EXIF: XMP and IPTC hold captions, creator names and copyright, and C2PA content credentials can hold a signed edit history (see <a href="/guides/what-is-c2pa/">What is C2PA?</a>).</p>
<h2>Why does it matter for privacy?</h2>
<p>A photo of your front door shared with its GPS data tells the recipient where you live. A date and device model can link photos to one person. Journalists, sellers on marketplaces and anyone posting from home have good reason to check before sharing.</p>
<h2>How can you view EXIF data?</h2>
<p>On most computers, right-click the file and open its properties or info panel. The quickest complete view is to add the file to <a href="/#tool">Untrace</a>, which lists every metadata block, including ones the operating system does not show.</p>
<h2>How do you remove it?</h2>
<p>Editing tags one at a time risks missing a block. Untrace instead decodes the image to pixels and writes a fresh file, which leaves every metadata container behind, then re-reads the output to confirm nothing survived. For the location case specifically, see <a href="/guides/remove-gps-from-photo/">how to remove GPS from a photo</a>.</p>
<div class="cta"><p><strong>See what your own photo is hiding.</strong> Untrace lists every metadata block, then removes it, all inside your browser.</p><a class="btn btn-primary" href="/#tool">Scan a photo</a></div>
<h2>Common questions</h2>
<h3>Is EXIF data bad?</h3><p>No. It is useful for organising your own photos. It becomes a privacy problem only when you share the file with people who do not need it.</p><h3>Do screenshots have EXIF data?</h3><p>They usually carry far less, often no location, but they can still include device and time information.</p>
<nav class="related" aria-label="Related guides"><h2>Keep reading</h2><ul><li><a href="/guides/remove-gps-from-photo/">How to remove GPS location from a photo</a></li><li><a href="/guides/remove-exif-data-iphone/">How to remove EXIF data from photos on iPhone</a></li><li><a href="/guides/remove-exif-data-android/">How to remove EXIF and location data from photos on Android</a></li><li><a href="/guides/remove-exif-data-windows-mac/">How to remove EXIF data from photos on Windows and Mac</a></li><li><a href="/guides/how-to-view-exif-data/">How to view the EXIF data of a photo</a></li><li><a href="/guides/do-social-media-sites-remove-exif-data/">Do social media sites remove EXIF data from photos?</a></li><li><a href="/guides/photo-metadata-privacy-checklist/">Photo metadata privacy checklist</a></li><li><a href="/guides/what-is-c2pa/">What is C2PA and how do Content Credentials work?</a></li></ul></nav>
</article>
</div>
</main>
<script type="module" src="/src/guide.js"></script>
</body>
</html>
+21 -128
View File
@@ -4,10 +4,10 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Remove content credentials from an image – free online remover | Untrace</title>
<title>Remove EXIF, GPS &amp; C2PA metadata from photos – free, private | Untrace</title>
<meta
name="description"
content="Free tool to remove C2PA content credentials, AI generation tags and EXIF metadata from an image. Runs in your browser, so the photo is never uploaded. Works with JPEG, PNG, TIFF, HEIC and AVIF."
content="See and remove hidden metadata from a photo: GPS location, camera details, EXIF and C2PA content credentials. Runs in your browser, so the image is never uploaded. JPEG, PNG, TIFF, HEIC and AVIF."
/>
<link rel="canonical" href="https://untrace.realbrain.cc/" />
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1" />
@@ -36,7 +36,7 @@
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="icon" type="image/svg+xml" sizes="16x16" href="/favicon-16x16.svg" />
<link rel="icon" type="image/svg+xml" sizes="32x32" href="/favicon-32x32.svg" />
<link rel="apple-touch-icon" href="/favicon.svg" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="manifest" href="/manifest.json" />
<!-- The design system pulls IBM Plex from Google Fonts; starting the
@@ -51,10 +51,10 @@
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Untrace" />
<meta property="og:url" content="https://untrace.realbrain.cc/" />
<meta property="og:title" content="Remove content credentials from an image" />
<meta property="og:title" content="Remove EXIF, GPS and C2PA metadata from photos" />
<meta
property="og:description"
content="Free browser tool that strips C2PA content credentials, AI generation tags and EXIF metadata. Nothing is uploaded."
content="Free, private browser tool that shows and removes hidden photo metadata. Nothing is uploaded."
/>
<meta property="og:image" content="https://untrace.realbrain.cc/thumb.jpg" />
<meta property="og:image:width" content="1200" />
@@ -62,10 +62,10 @@
<meta property="og:locale" content="en_US" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Remove content credentials from an image" />
<meta name="twitter:title" content="Remove EXIF, GPS and C2PA metadata from photos" />
<meta
name="twitter:description"
content="Free browser tool that strips C2PA content credentials, AI generation tags and EXIF metadata. Nothing is uploaded."
content="Free, private browser tool that shows and removes hidden photo metadata. Nothing is uploaded."
/>
<meta name="twitter:image" content="https://untrace.realbrain.cc/thumb.jpg" />
@@ -86,7 +86,7 @@
"Untrace AI",
"Untrace content credentials remover"
],
"description": "Remove C2PA content credentials, AI generation tags and EXIF metadata from images in the browser.",
"description": "See and remove EXIF, GPS and C2PA metadata from photos in the browser.",
"inLanguage": "en",
"publisher": {
"@id": "https://untrace.realbrain.cc/#org"
@@ -97,7 +97,12 @@
"@id": "https://untrace.realbrain.cc/#org",
"name": "Untrace",
"url": "https://untrace.realbrain.cc/",
"logo": "https://untrace.realbrain.cc/favicon.svg",
"logo": {
"@type": "ImageObject",
"url": "https://untrace.realbrain.cc/logo-512.png",
"width": 512,
"height": 512
},
"sameAs": [
"https://github.com/developersharif/untrace",
"https://realbrain.cc/"
@@ -121,10 +126,12 @@
"publisher": {
"@id": "https://untrace.realbrain.cc/#org"
},
"description": "Free browser tool that removes C2PA content credentials, AI generation tags, GPS coordinates and EXIF metadata from images without uploading them.",
"description": "Free browser tool that shows and removes GPS coordinates, EXIF metadata and C2PA content credentials from photos without uploading them.",
"image": "https://untrace.realbrain.cc/thumb.jpg",
"license": "https://opensource.org/licenses/MIT",
"featureList": [
"Remove C2PA content credentials",
"Remove AI generation tags from ChatGPT, DALL-E, Midjourney, Stable Diffusion, Adobe Firefly and Google Imagen",
"Scan a photo and list every hidden metadata block before changing it",
"Remove JUMBF provenance containers",
"Remove GPS location data",
"Remove camera make, model and settings",
@@ -134,120 +141,6 @@
"Client-side processing with no upload",
"Supports JPEG, PNG, TIFF, HEIC and AVIF"
]
},
{
"@type": "HowTo",
"@id": "https://untrace.realbrain.cc/#howto",
"name": "How to remove content credentials from an image",
"description": "Strip C2PA content credentials and AI generation tags from a photo in three steps, without uploading the file.",
"totalTime": "PT1M",
"tool": [
{
"@type": "HowToTool",
"name": "Untrace"
}
],
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Add the image",
"text": "Drop a JPEG, PNG, TIFF, HEIC or AVIF file onto Untrace, choose one from your device, or paste it from the clipboard.",
"url": "https://untrace.realbrain.cc/#tool"
},
{
"@type": "HowToStep",
"position": 2,
"name": "Review what is hidden",
"text": "Untrace lists every metadata block it finds, including C2PA content credentials, AI generation tags, GPS coordinates, camera details and timestamps.",
"url": "https://untrace.realbrain.cc/#tool"
},
{
"@type": "HowToStep",
"position": 3,
"name": "Clean and download",
"text": "Choose Clean image. The photo is decoded to pixels and written back out, leaving every metadata container behind, then download the clean copy.",
"url": "https://untrace.realbrain.cc/#tool"
}
]
},
{
"@type": "FAQPage",
"@id": "https://untrace.realbrain.cc/#faq",
"mainEntity": [
{
"@type": "Question",
"name": "What are content credentials on an image?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Content credentials are a signed record of how an image was made and edited, written into the file by the C2PA standard. They can name the tool that generated the image, list every edit, and identify the account that created it. Platforms read that record to show an “AI info” or “Content credentials” label next to the picture."
}
},
{
"@type": "Question",
"name": "How do I remove content credentials from an image?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Add the image to Untrace, review what it found, then choose Clean image and download the result. Untrace decodes the picture to raw pixels and writes a new file, so the C2PA manifest, the JUMBF container holding it, and every other metadata block are simply not carried over."
}
},
{
"@type": "Question",
"name": "Does this remove the AI label on LinkedIn?",
"acceptedAnswer": {
"@type": "Answer",
"text": "LinkedIn shows its AI label when it reads C2PA content credentials in the file you upload. Cleaning the image before you upload removes the data the label is generated from. It does not change a label on a post that is already published — delete that post and upload the clean copy instead."
}
},
{
"@type": "Question",
"name": "Does it remove the AI tag on Instagram or Facebook?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Meta reads the same C2PA signals plus its own classifiers. Removing the credentials removes the metadata signal, so the automatic “AI info” tag is far less likely to appear. Visual detection is separate and no metadata tool can affect it."
}
},
{
"@type": "Question",
"name": "What is C2PA and JUMBF?",
"acceptedAnswer": {
"@type": "Answer",
"text": "C2PA is the Coalition for Content Provenance and Authenticity specification that defines the provenance record. JUMBF is the JPEG box format that record is stored in, usually inside an APP11 segment. Untrace scans for both and reports them before cleaning."
}
},
{
"@type": "Question",
"name": "Is my image uploaded anywhere?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. Reading the metadata and writing the clean file both happen in your browser using the File and Canvas APIs. Nothing is sent over the network, there is no account, and Untrace has no server to store an image on."
}
},
{
"@type": "Question",
"name": "Does cleaning reduce image quality?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Small PNGs are rewritten as PNG with no quality loss. Everything else is re-encoded as JPEG at quality 0.92, which is visually indistinguishable at normal viewing sizes. The tool shows the size change so you can see exactly what happened."
}
},
{
"@type": "Question",
"name": "Which formats are supported?",
"acceptedAnswer": {
"@type": "Answer",
"text": "JPEG, PNG, TIFF, HEIC and AVIF. The cleaned file is returned as JPEG, or as PNG when the original was a small PNG."
}
},
{
"@type": "Question",
"name": "Does it also remove EXIF and GPS data?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. EXIF, GPS, XMP, IPTC, Photoshop blocks, maker notes and embedded thumbnails all go at the same time as the content credentials, because the whole metadata section is dropped rather than edited."
}
}
]
}
]
}
@@ -257,9 +150,9 @@
<div id="app"></div>
<noscript>
<p style="padding: 24px; font-family: system-ui, sans-serif">
Untrace removes C2PA content credentials, AI generation tags and EXIF
metadata from images. It reads and rewrites the file inside your
browser, so JavaScript has to be enabled for it to work.
Untrace removes EXIF, GPS and C2PA content credentials from photos. It
reads and rewrites the file inside your browser, so JavaScript has to
be enabled for it to work.
</p>
</noscript>
<script type="module" src="/src/main.js"></script>
+1
View File
@@ -0,0 +1 @@
untrace.realbrain.cc
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

+2 -3
View File
@@ -1,5 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" role="img" aria-label="Untrace">
<rect width="48" height="48" rx="10" fill="#3450C8"/>
<text x="24" y="24" fill="#FFFFFF" font-family="'IBM Plex Mono', ui-monospace, monospace"
font-size="28" font-weight="600" text-anchor="middle" dominant-baseline="central">U</text>
<rect width="48" height="48" rx="8" fill="#3450C8"/>
<g transform="translate(4.799999999999997 4.799999999999997) scale(1.6000000000000003)" fill="none" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 4.5H8A3.5 3.5 0 0 0 4.5 8v8A3.5 3.5 0 0 0 8 19.5h7"/><path d="M18.5 4.5v.01M18.5 9v.01M18.5 14v.01M18.5 19v.01" stroke-width="2.4" opacity=".55"/><path d="M21 4.5v.01M21 9v.01" stroke-width="2" opacity=".28"/><path d="M8 15.5 11 12l2 2.2 1.5-1.7"/></g>
</svg>

Before

Width:  |  Height:  |  Size: 347 B

After

Width:  |  Height:  |  Size: 604 B

+1 -2
View File
@@ -1,5 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" role="img" aria-label="Untrace">
<rect width="48" height="48" rx="10" fill="#3450C8"/>
<text x="24" y="24" fill="#FFFFFF" font-family="'IBM Plex Mono', ui-monospace, monospace"
font-size="28" font-weight="600" text-anchor="middle" dominant-baseline="central">U</text>
<g transform="translate(7.200000000000003 7.200000000000003) scale(1.3999999999999997)" fill="none" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 4.5H8A3.5 3.5 0 0 0 4.5 8v8A3.5 3.5 0 0 0 8 19.5h7"/><path d="M18.5 4.5v.01M18.5 9v.01M18.5 14v.01M18.5 19v.01" stroke-width="2.4" opacity=".55"/><path d="M21 4.5v.01M21 9v.01" stroke-width="2" opacity=".28"/><path d="M8 15.5 11 12l2 2.2 1.5-1.7"/></g>
</svg>

Before

Width:  |  Height:  |  Size: 347 B

After

Width:  |  Height:  |  Size: 605 B

+2 -3
View File
@@ -1,5 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" role="img" aria-label="Untrace">
<rect width="48" height="48" fill="#3450C8"/>
<text x="24" y="24" fill="#FFFFFF" font-family="'IBM Plex Mono', ui-monospace, monospace"
font-size="22" font-weight="600" text-anchor="middle" dominant-baseline="central">U</text>
<rect width="48" height="48" rx="0" fill="#3450C8"/>
<g transform="translate(12.0 12.0) scale(1.0)" fill="none" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 4.5H8A3.5 3.5 0 0 0 4.5 8v8A3.5 3.5 0 0 0 8 19.5h7"/><path d="M18.5 4.5v.01M18.5 9v.01M18.5 14v.01M18.5 19v.01" stroke-width="2.4" opacity=".55"/><path d="M21 4.5v.01M21 9v.01" stroke-width="2" opacity=".28"/><path d="M8 15.5 11 12l2 2.2 1.5-1.7"/></g>
</svg>

Before

Width:  |  Height:  |  Size: 339 B

After

Width:  |  Height:  |  Size: 563 B

+1 -2
View File
@@ -1,5 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" role="img" aria-label="Untrace">
<rect width="48" height="48" rx="10" fill="#3450C8"/>
<text x="24" y="24" fill="#FFFFFF" font-family="'IBM Plex Mono', ui-monospace, monospace"
font-size="28" font-weight="600" text-anchor="middle" dominant-baseline="central">U</text>
<g transform="translate(9.120000000000001 9.120000000000001) scale(1.24)" fill="none" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 4.5H8A3.5 3.5 0 0 0 4.5 8v8A3.5 3.5 0 0 0 8 19.5h7"/><path d="M18.5 4.5v.01M18.5 9v.01M18.5 14v.01M18.5 19v.01" stroke-width="2.4" opacity=".55"/><path d="M21 4.5v.01M21 9v.01" stroke-width="2" opacity=".28"/><path d="M8 15.5 11 12l2 2.2 1.5-1.7"/></g>
</svg>

Before

Width:  |  Height:  |  Size: 347 B

After

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

+20 -4
View File
@@ -1,8 +1,8 @@
{
"id": "/",
"name": "Untrace — content credentials and metadata remover",
"name": "Untrace — photo metadata and content credentials remover",
"short_name": "Untrace",
"description": "Remove C2PA content credentials, AI generation tags and EXIF metadata from images, entirely in your browser.",
"description": "See and remove EXIF, GPS and C2PA metadata from photos, entirely in your browser.",
"start_url": "/",
"scope": "/",
"display": "standalone",
@@ -20,10 +20,26 @@
"sizes": "any",
"type": "image/svg+xml",
"purpose": "maskable"
},
{
"src": "/icon-192.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "any"
},
{
"src": "/logo-512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
}
],
"categories": ["productivity", "utilities", "photo"],
"categories": [
"productivity",
"utilities",
"photo"
],
"lang": "en",
"dir": "ltr",
"orientation": "any"
}
}
+51 -2
View File
@@ -2,8 +2,57 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://untrace.realbrain.cc/</loc>
<lastmod>2026-09-05</lastmod>
<changefreq>weekly</changefreq>
<lastmod>2026-10-20</lastmod>
<priority>1.0</priority>
</url>
<url>
<loc>https://untrace.realbrain.cc/guides/</loc>
<lastmod>2026-10-20</lastmod>
<priority>0.8</priority>
</url>
<url>
<loc>https://untrace.realbrain.cc/guides/remove-gps-from-photo/</loc>
<lastmod>2026-10-20</lastmod>
<priority>0.7</priority>
</url>
<url>
<loc>https://untrace.realbrain.cc/guides/remove-exif-data-iphone/</loc>
<lastmod>2026-10-20</lastmod>
<priority>0.7</priority>
</url>
<url>
<loc>https://untrace.realbrain.cc/guides/remove-exif-data-android/</loc>
<lastmod>2026-10-20</lastmod>
<priority>0.7</priority>
</url>
<url>
<loc>https://untrace.realbrain.cc/guides/remove-exif-data-windows-mac/</loc>
<lastmod>2026-10-20</lastmod>
<priority>0.7</priority>
</url>
<url>
<loc>https://untrace.realbrain.cc/guides/how-to-view-exif-data/</loc>
<lastmod>2026-10-20</lastmod>
<priority>0.7</priority>
</url>
<url>
<loc>https://untrace.realbrain.cc/guides/do-social-media-sites-remove-exif-data/</loc>
<lastmod>2026-10-20</lastmod>
<priority>0.7</priority>
</url>
<url>
<loc>https://untrace.realbrain.cc/guides/photo-metadata-privacy-checklist/</loc>
<lastmod>2026-10-20</lastmod>
<priority>0.7</priority>
</url>
<url>
<loc>https://untrace.realbrain.cc/guides/what-is-exif-data/</loc>
<lastmod>2026-10-20</lastmod>
<priority>0.7</priority>
</url>
<url>
<loc>https://untrace.realbrain.cc/guides/what-is-c2pa/</loc>
<lastmod>2026-10-20</lastmod>
<priority>0.7</priority>
</url>
</urlset>
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 60 KiB

+35 -14
View File
@@ -8,6 +8,8 @@
import Faq from "./lib/Faq.svelte";
import Footer from "./lib/Footer.svelte";
import Toast from "./lib/Toast.svelte";
import HeroDemo from "./lib/HeroDemo.svelte";
import Trust from "./lib/Trust.svelte";
let toasts = [];
let nextId = 0;
@@ -44,20 +46,25 @@
<main>
<div class="wrap">
<section class="lede">
<p class="eyebrow">C2PA · AI credentials · EXIF</p>
<h1>Remove content credentials from an image</h1>
<p>
Untrace strips C2PA content credentials, AI generation tags, GPS
coordinates and EXIF metadata from a photo — free, and without the file
ever leaving your device.
</p>
<div class="chip-row">
<span class="chip">Free</span>
<span class="chip">No sign-in</span>
<span class="chip">Open source</span>
</div>
</section>
<div class="intro">
<section class="lede">
<p class="eyebrow">EXIF · GPS · C2PA</p>
<h1>Remove hidden metadata and content credentials from a photo</h1>
<p>
Every photo can carry your location, your device and a signed record
of how it was made. Untrace shows you what is hidden and removes it —
free, and without the file ever leaving your device.
</p>
<div class="chip-row">
<span class="chip">Free</span>
<span class="chip">No upload</span>
<span class="chip">No sign-in</span>
<span class="chip">Open source</span>
</div>
<a class="btn btn-secondary" href="#tool">Clean a photo</a>
</section>
<HeroDemo />
</div>
<Tool on:notify={notify} />
@@ -73,6 +80,7 @@
<div class="stack sections">
<Removals />
<HowItWorks />
<Trust />
<Faq />
</div>
</div>
@@ -87,6 +95,19 @@
padding-bottom: var(--space-8);
}
.intro {
display: grid;
gap: var(--space-4);
align-items: center;
}
@media (min-width: 900px) {
.intro {
grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr);
gap: var(--space-7);
}
}
.assurances {
display: grid;
gap: var(--space-3);
+123
View File
@@ -0,0 +1,123 @@
/* Guide pages: long-form reading layout on top of the design system. */
.guide {
padding-block: var(--space-7) var(--space-9);
}
.guide .crumbs {
display: flex;
flex-wrap: wrap;
gap: var(--space-2);
margin-bottom: var(--space-4);
padding-left: 0;
color: var(--text-3);
font-size: var(--fs-2);
line-height: var(--lh-2);
list-style: none;
}
.guide .crumbs li + li::before {
content: "/";
margin-right: var(--space-2);
}
.guide article {
display: grid;
gap: var(--space-4);
max-width: calc(var(--space-9) * 6);
}
.guide h1 {
font-size: var(--fs-7);
line-height: var(--lh-7);
font-weight: 600;
letter-spacing: -0.02em;
}
.guide h2 {
margin-top: var(--space-5);
font-size: var(--fs-5);
line-height: var(--lh-5);
font-weight: 600;
}
.guide .lead {
color: var(--text-2);
font-size: var(--fs-4);
line-height: var(--lh-4);
}
.guide p,
.guide li {
font-size: var(--fs-3);
line-height: var(--lh-3);
color: var(--text-2);
}
.guide ul,
.guide ol {
display: grid;
gap: var(--space-2);
padding-left: var(--space-5);
}
.guide strong {
color: var(--text-1);
font-weight: 600;
}
.guide .callout {
padding: var(--space-4);
border: var(--border-w) solid var(--border);
border-left: var(--space-1) solid var(--accent);
border-radius: var(--radius-md);
background: var(--surface);
}
.guide .cta {
display: flex;
flex-wrap: wrap;
gap: var(--space-3);
align-items: center;
padding: var(--space-5);
border: var(--border-w) solid var(--border);
border-radius: var(--radius-lg);
background: var(--surface);
}
.guide .cta p {
flex: 1 1 calc(var(--space-9) * 3);
color: var(--text-1);
}
.guide .meta {
color: var(--text-3);
font-size: var(--fs-2);
line-height: var(--lh-2);
}
.guide .related ul {
list-style: none;
padding-left: 0;
}
.guide .index-list {
display: grid;
gap: var(--space-3);
margin-top: var(--space-5);
}
.guide .index-list a.card {
display: grid;
gap: var(--space-1);
padding: var(--space-4);
color: var(--text-1);
}
.guide .index-list a.card:hover {
text-decoration: none;
border-color: var(--accent);
}
.guide .index-list span {
color: var(--text-2);
}
+2
View File
@@ -0,0 +1,2 @@
import './app.css'
import './guide.css'
+281
View File
@@ -0,0 +1,281 @@
<script>
import { createEventDispatcher, onDestroy } from "svelte";
import { extractMetadata, findings, isClean } from "./metadata.js";
import { cleanImage, formatBytes } from "./clean.js";
import { createZip } from "./zip.js";
import Icon from "./Icon.svelte";
export let files;
const dispatch = createEventDispatcher();
/** @type {'scanning'|'review'|'cleaning'|'done'} */
let stage = "scanning";
let items = files.map((file, id) => ({
id,
file,
state: "pending", // pending | scanned | cleaning | done | failed
labels: [],
clean: false,
result: null,
}));
let zipping = false;
let cancelled = false;
$: scanned = items.filter((item) => item.state !== "pending").length;
$: done = items.filter((item) => item.state === "done" || item.state === "failed").length;
$: succeeded = items.filter((item) => item.state === "done");
$: dirty = items.filter((item) => !item.clean).length;
function patch(id, values) {
items = items.map((item) => (item.id === id ? { ...item, ...values } : item));
}
async function scanAll() {
for (const item of items) {
if (cancelled) return;
try {
const metadata = await extractMetadata(item.file);
patch(item.id, {
state: "scanned",
clean: isClean(metadata),
labels: findings(metadata).filter((f) => f.severity !== "info"),
});
} catch {
patch(item.id, { state: "scanned", clean: false, labels: [] });
}
}
stage = "review";
}
async function cleanAll() {
stage = "cleaning";
for (const item of items) {
if (cancelled) return;
patch(item.id, { state: "cleaning" });
const result = await cleanImage(item.file);
patch(item.id, { state: result.fallback ? "failed" : "done", result });
}
stage = "done";
dispatch("notify", {
tone: items.some((i) => i.state === "failed") ? "err" : "ok",
message: items.some((i) => i.state === "failed")
? "Some images could not be re-encoded and were skipped."
: `Metadata removed from ${items.length} images.`,
});
}
async function downloadZip() {
zipping = true;
try {
const used = new Set();
const entries = [];
for (const item of succeeded) {
let name = item.result.filename;
for (let n = 2; used.has(name); n++) {
name = item.result.filename.replace(/(\.[^.]+)$/, `-${n}$1`);
}
used.add(name);
const data = new Uint8Array(await (await fetch(item.result.url)).arrayBuffer());
entries.push({ name, data });
}
const url = URL.createObjectURL(createZip(entries));
const link = document.createElement("a");
link.href = url;
link.download = "untrace-cleaned.zip";
link.click();
setTimeout(() => URL.revokeObjectURL(url), 10000);
} catch (error) {
console.error("ZIP failed:", error);
dispatch("notify", { tone: "err", message: "Could not build the ZIP. Download the images one by one instead." });
} finally {
zipping = false;
}
}
function reset() {
cancelled = true;
dispatch("reset");
}
scanAll();
onDestroy(() => {
cancelled = true;
for (const item of items) if (item.result?.url) URL.revokeObjectURL(item.result.url);
});
</script>
<div class="batch" aria-live="polite">
<div class="head">
<h3>
{#if stage === "scanning"}
Scanning {scanned} of {items.length}…
{:else if stage === "review"}
{items.length} images ready, {dirty} with hidden data
{:else if stage === "cleaning"}
Cleaning {done} of {items.length}…
{:else}
{succeeded.length} of {items.length} cleaned
{/if}
</h3>
<progress
max={items.length}
value={stage === "scanning" ? scanned : stage === "review" ? items.length : done}
aria-label="Progress"
></progress>
</div>
<ul class="list">
{#each items as item (item.id)}
<li class="item">
<div class="name">
<span class="file" title={item.file.name}>{item.file.name}</span>
<span class="size">{formatBytes(item.file.size)}</span>
</div>
<div class="state">
{#if item.state === "pending"}
<span class="status info">Waiting</span>
{:else if item.state === "cleaning"}
<span class="status info">Cleaning</span>
{:else if item.state === "done"}
<span class="status ok">Clean</span>
<a class="btn btn-ghost dl" href={item.result.url} download={item.result.filename}>
<Icon name="download" size="sm" /> Download
</a>
{:else if item.state === "failed"}
<span class="status err">Could not re-encode</span>
{:else if item.clean}
<span class="status ok">Already clean</span>
{:else}
{#each item.labels.slice(0, 3) as label}
<span class="status {label.severity}">{label.label}</span>
{/each}
{#if item.labels.length > 3}
<span class="more">+{item.labels.length - 3} more</span>
{/if}
{/if}
</div>
</li>
{/each}
</ul>
<div class="action-bar">
{#if stage === "done"}
<button
type="button"
class="btn btn-primary btn-block"
aria-disabled={zipping || succeeded.length === 0}
on:click={() => !zipping && succeeded.length > 0 && downloadZip()}
>
<Icon name="download" size="sm" />
{zipping ? "Building ZIP…" : `Download ${succeeded.length} as ZIP`}
</button>
<button type="button" class="btn btn-secondary btn-block" on:click={reset}>
<Icon name="refresh" size="sm" />
Clean more images
</button>
{:else}
<button
type="button"
class="btn btn-primary btn-block"
aria-disabled={stage !== "review"}
on:click={() => stage === "review" && cleanAll()}
>
{#if stage === "cleaning"}
<span class="spinner" aria-hidden="true"></span>
Cleaning…
{:else}
<Icon name="shield" size="sm" />
Clean {items.length} images
{/if}
</button>
<button type="button" class="btn btn-ghost btn-block" disabled={stage === "cleaning"} on:click={reset}>
Choose different images
</button>
{/if}
</div>
</div>
<style>
.batch {
display: grid;
gap: var(--space-4);
}
.head {
display: grid;
gap: var(--space-2);
}
.head h3 {
font-size: var(--fs-4);
line-height: var(--lh-4);
font-weight: 600;
}
progress {
width: 100%;
height: var(--space-2);
accent-color: var(--accent);
}
.list {
display: grid;
gap: var(--space-2);
list-style: none;
max-height: calc(var(--space-9) * 5);
overflow-y: auto;
}
.item {
display: grid;
gap: var(--space-2);
padding: var(--space-3);
border: var(--border-w) solid var(--border);
border-radius: var(--radius-md);
background: var(--surface);
}
@media (min-width: 768px) {
.item {
grid-template-columns: minmax(0, 1fr) auto;
align-items: center;
}
}
.name {
display: flex;
align-items: baseline;
gap: var(--space-3);
min-width: 0;
}
.file {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-weight: 500;
}
.size,
.more {
color: var(--text-3);
font-size: var(--fs-1);
line-height: var(--lh-1);
white-space: nowrap;
}
.state {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: var(--space-3);
}
.dl {
height: var(--space-7);
padding-inline: var(--space-2);
}
</style>
+29 -10
View File
@@ -11,15 +11,33 @@
let fileInput;
let depth = 0;
function offer(file) {
if (!file) return;
if (!isAccepted(file)) {
const MAX_FILES = 50;
function offer(list) {
const incoming = [...(list || [])].filter(Boolean);
if (incoming.length === 0) return;
const accepted = incoming.filter(isAccepted);
if (accepted.length === 0) {
const type = incoming[0].type;
dispatch("reject", {
message: `Untrace cannot read ${file.type || "that file type"}. Choose a JPEG, PNG, TIFF, HEIC or AVIF image.`,
message: `Untrace cannot read ${type || "that file type"}. Choose JPEG, PNG, TIFF, HEIC or AVIF images.`,
});
return;
}
dispatch("select", { file });
const skipped = incoming.length - accepted.length;
const capped = accepted.slice(0, MAX_FILES);
const over = accepted.length - capped.length;
if (skipped > 0 || over > 0) {
dispatch("reject", {
message:
over > 0
? `Only the first ${MAX_FILES} images were added.`
: `Skipped ${skipped} file${skipped === 1 ? "" : "s"} Untrace cannot read.`,
});
}
dispatch("select", { files: capped });
}
function onDrop(event) {
@@ -27,7 +45,7 @@
depth = 0;
dragging = false;
if (busy) return;
offer(event.dataTransfer?.files?.[0]);
offer(event.dataTransfer?.files);
}
function onDragEnter(event) {
@@ -44,7 +62,7 @@
}
function onChange(event) {
offer(event.target.files?.[0]);
offer(event.target.files);
// Reset so choosing the same file twice still fires a change event.
event.target.value = "";
}
@@ -54,7 +72,7 @@
const item = [...(event.clipboardData?.items || [])].find((entry) =>
entry.type.startsWith("image/")
);
if (item) offer(item.getAsFile());
if (item) offer([item.getAsFile()]);
}
</script>
@@ -77,10 +95,10 @@
>
<span class="glyph"><Icon name="upload" size="lg" /></span>
<span class="title">
{dragging ? "Drop to scan it" : "Drop an image, or choose a file"}
{dragging ? "Drop to scan" : "Drop images, or choose files"}
</span>
<span class="hint">
Nothing is uploaded. The image is read and rewritten inside this tab.
Nothing is uploaded. Add one image or up to 50 at once.
</span>
<span class="chip-row formats">
<span class="chip">JPEG</span>
@@ -98,6 +116,7 @@
<input
class="visually-hidden"
type="file"
multiple
accept={ACCEPTED_EXTENSIONS}
bind:this={fileInput}
on:change={onChange}
+19 -2
View File
@@ -1,5 +1,6 @@
<script>
import Icon from "./Icon.svelte";
import Logo from "./Logo.svelte";
const year = new Date().getFullYear();
</script>
@@ -9,7 +10,7 @@
<div class="cols">
<div>
<p class="wordmark">
<span class="r-mark" aria-hidden="true">U</span>
<Logo />
<span>Untrace</span>
</p>
<p class="blurb">
@@ -24,10 +25,26 @@
<li><a href="#tool">Clean an image</a></li>
<li><a href="#what-is-removed">What is removed</a></li>
<li><a href="#how-it-works">How it works</a></li>
<li><a href="#trust">Verify it yourself</a></li>
<li><a href="#faq">Questions</a></li>
</ul>
</nav>
<nav aria-label="Guides">
<h2>Guides</h2>
<ul>
<li><a href="/guides/remove-gps-from-photo/">Remove GPS from a photo</a></li>
<li><a href="/guides/remove-exif-data-iphone/">Remove EXIF on iPhone</a></li>
<li><a href="/guides/remove-exif-data-android/">Remove EXIF on Android</a></li>
<li><a href="/guides/do-social-media-sites-remove-exif-data/">Do social sites strip EXIF?</a></li>
<li><a href="/guides/remove-exif-data-windows-mac/">Remove EXIF on Windows and Mac</a></li>
<li><a href="/guides/how-to-view-exif-data/">View a photo's EXIF data</a></li>
<li><a href="/guides/photo-metadata-privacy-checklist/">Privacy checklist</a></li>
<li><a href="/guides/what-is-exif-data/">What is EXIF data?</a></li>
<li><a href="/guides/what-is-c2pa/">What is C2PA?</a></li>
</ul>
</nav>
<nav aria-label="Project">
<h2>Project</h2>
<ul>
@@ -99,7 +116,7 @@
@media (min-width: 900px) {
.cols {
grid-template-columns: 2fr 1fr 1fr 1fr;
grid-template-columns: 2fr 1fr 1fr 1fr 1fr;
gap: var(--space-6);
}
}
+257
View File
@@ -0,0 +1,257 @@
<script>
import Icon from "./Icon.svelte";
let paused = false;
const tags = [
{ label: "GPS 40.7128 N", icon: "pin", cls: "t1", dx: -1, dy: -1 },
{ label: "iPhone 15 Pro", icon: "camera", cls: "t2", dx: 1, dy: -1 },
{ label: "C2PA credentials", icon: "shield", cls: "t3", dx: 1, dy: 0.5 },
{ label: "Taken 14:32", icon: "clock", cls: "t4", dx: -1, dy: 1 },
{ label: "AI tool tag", icon: "sparkle", cls: "t5", dx: 1, dy: 1 },
];
</script>
<figure class="demo" class:paused>
<div
class="stage"
role="img"
aria-label="Animation: a photo with hidden tags for location, camera, time and content credentials is scanned, the tags lift away, and the photo ends up clean."
>
<div class="photo" aria-hidden="true">
<svg viewBox="0 0 320 200" preserveAspectRatio="xMidYMid slice">
<rect class="sky" width="320" height="200" />
<circle class="sun" cx="236" cy="62" r="26" />
<path class="hill far" d="M0 150 90 96l70 54 60-38 100 70v18H0Z" />
<path class="hill near" d="M0 176 110 128l90 48 120-34v58H0Z" />
</svg>
<span class="scan"></span>
<span class="clean-badge"><Icon name="check" size="sm" /> Clean</span>
</div>
{#each tags as tag}
<span class="tag {tag.cls}" style="--dx:{tag.dx}; --dy:{tag.dy}" aria-hidden="true">
<Icon name={tag.icon} size="sm" />
{tag.label}
</span>
{/each}
</div>
<figcaption>
<ol class="beats" aria-hidden="true">
<li class="b1"><span>1</span> Scan the file</li>
<li class="b2"><span>2</span> Tags lift off</li>
<li class="b3"><span>3</span> Clean copy</li>
</ol>
<button
type="button"
class="btn btn-ghost pause"
aria-pressed={paused}
on:click={() => (paused = !paused)}
>
<Icon name={paused ? "play" : "pause"} size="sm" />
{paused ? "Play animation" : "Pause animation"}
</button>
</figcaption>
</figure>
<style>
.demo {
display: grid;
gap: var(--space-3);
width: 100%;
max-width: calc(var(--space-9) * 6);
}
.stage {
position: relative;
padding: var(--space-6) var(--space-4);
overflow: hidden;
border: var(--border-w) solid var(--border);
border-radius: var(--radius-lg);
background: var(--surface);
}
.photo {
position: relative;
overflow: hidden;
aspect-ratio: 8 / 5;
border: var(--border-w) solid var(--border-strong);
border-radius: var(--radius-md);
background: var(--elevated);
}
.photo svg {
display: block;
width: 100%;
height: 100%;
}
.sky { fill: var(--elevated); }
.sun { fill: var(--accent); }
.hill.far { fill: var(--border-strong); }
.hill.near { fill: var(--border); }
/* ---- Scan line ---- */
.scan {
position: absolute;
inset-inline: 0;
top: 0;
height: var(--space-1);
background: var(--accent);
opacity: 0;
animation: scan 8s var(--ease) infinite;
}
/* ---- Clean badge ---- */
.clean-badge {
position: absolute;
right: var(--space-3);
bottom: var(--space-3);
display: inline-flex;
align-items: center;
gap: var(--space-1);
padding: var(--space-1) var(--space-3);
border-radius: var(--radius-full);
background: var(--success);
color: var(--bg);
font-size: var(--fs-1);
line-height: var(--lh-1);
font-weight: 600;
opacity: 0;
animation: badge 8s var(--ease) infinite;
}
/* ---- Metadata tags ---- */
.tag {
position: absolute;
display: inline-flex;
align-items: center;
gap: var(--space-1);
padding: var(--space-1) var(--space-2);
border: var(--border-w) solid var(--border-strong);
border-radius: var(--radius-full);
background: var(--bg);
color: var(--text-1);
font-family: var(--font-mono);
font-size: var(--fs-1);
line-height: var(--lh-1);
white-space: nowrap;
animation: lift 8s var(--ease) infinite;
}
.t1 { top: var(--space-3); left: var(--space-2); }
.t2 { top: var(--space-3); right: var(--space-2); }
.t3 { top: 46%; right: var(--space-2); }
.t4 { bottom: var(--space-3); left: var(--space-2); }
.t5 { bottom: var(--space-3); right: var(--space-2); }
@keyframes lift {
0%, 20% { opacity: 1; transform: none; border-color: var(--border-strong); }
28%, 36% { opacity: 1; transform: none; border-color: var(--accent); }
56% {
opacity: 0;
transform: translate(calc(var(--dx) * var(--space-8)), calc(var(--dy) * var(--space-7)));
border-color: var(--accent);
}
92% { opacity: 0; transform: translate(calc(var(--dx) * var(--space-8)), calc(var(--dy) * var(--space-7))); }
100% { opacity: 1; transform: none; border-color: var(--border-strong); }
}
@keyframes scan {
0%, 18% { top: 0; opacity: 0; }
22% { top: 0; opacity: 1; }
38% { top: calc(100% - var(--space-1)); opacity: 1; }
42%, 100% { top: calc(100% - var(--space-1)); opacity: 0; }
}
@keyframes badge {
0%, 54% { opacity: 0; transform: translateY(var(--space-2)); }
62%, 90% { opacity: 1; transform: none; }
97%, 100% { opacity: 0; transform: none; }
}
/* ---- Captions ---- */
figcaption {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: var(--space-2);
}
.beats {
display: flex;
flex-wrap: wrap;
gap: var(--space-4);
list-style: none;
font-size: var(--fs-2);
line-height: var(--lh-2);
color: var(--text-3);
}
.beats li {
display: inline-flex;
align-items: center;
gap: var(--space-2);
animation: beat 8s var(--ease) infinite;
}
.beats span {
display: inline-grid;
place-items: center;
width: var(--space-5);
height: var(--space-5);
border: var(--border-w) solid currentColor;
border-radius: var(--radius-full);
font-family: var(--font-mono);
font-size: var(--fs-1);
}
.b2 { animation-name: beat-2; }
.b3 { animation-name: beat-3; }
@keyframes beat {
0%, 36% { color: var(--text-1); }
40%, 100% { color: var(--text-3); }
}
@keyframes beat-2 {
0%, 36% { color: var(--text-3); }
40%, 56% { color: var(--text-1); }
60%, 100% { color: var(--text-3); }
}
@keyframes beat-3 {
0%, 56% { color: var(--text-3); }
60%, 92% { color: var(--text-1); }
96%, 100% { color: var(--text-3); }
}
.pause {
height: var(--space-7);
padding-inline: var(--space-3);
}
/* ---- Pause ---- */
.paused .tag,
.paused .scan,
.paused .clean-badge,
.paused .beats li {
animation-play-state: paused;
}
/* ---- Reduced motion: show the finished state, still ---- */
@media (prefers-reduced-motion: reduce) {
.tag,
.scan,
.clean-badge,
.beats li {
animation: none;
}
.tag { opacity: 0.45; text-decoration: line-through; }
.scan { display: none; }
.clean-badge { opacity: 1; }
.beats li { color: var(--text-2); }
.pause { display: none; }
}
</style>
+5
View File
@@ -30,6 +30,11 @@
lock: "M7 11V8a5 5 0 0 1 10 0v3m-11 0h12v9H6v-9Z",
image:
"M4 5h16v14H4V5Zm0 10 4.5-4.5 4 4L15 12l5 5",
pause: "M9 5v14m6-14v14",
play: "M8 5l11 7-11 7V5Z",
book: "M4 5a2 2 0 0 1 2-2h13v16H6a2 2 0 0 0-2 2V5Zm4 0h7",
eye: "M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7S2 12 2 12Zm10 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z",
code: "m8 8-4 4 4 4m8-8 4 4-4 4m-2.5-10-3 12",
};
const boxes = { sm: "16", md: "20", lg: "24" };
+17
View File
@@ -0,0 +1,17 @@
<script>
/**
* The Untrace mark: a photo frame that is open on one side, with the edge
* dissolving into dashes — the image stays, the trace leaves. Colours come
* from the `.r-mark` tile it sits in, so it follows the theme.
*/
export let label = false;
</script>
<span class="r-mark" role={label ? "img" : undefined} aria-label={label ? "Untrace" : undefined} aria-hidden={label ? undefined : "true"}>
<svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false">
<path d="M15 4.5H8A3.5 3.5 0 0 0 4.5 8v8A3.5 3.5 0 0 0 8 19.5h7" />
<path d="M18.5 4.5v.01M18.5 9v.01M18.5 14v.01M18.5 19v.01" stroke-width="2.4" opacity="0.55" />
<path d="M21 4.5v.01M21 9v.01" stroke-width="2" opacity="0.28" />
<path d="M8 15.5 11 12l2 2.2 1.5-1.7" />
</svg>
</span>
+17 -1
View File
@@ -8,6 +8,7 @@
import ReviewPanel from "./ReviewPanel.svelte";
import ResultPanel from "./ResultPanel.svelte";
import Icon from "./Icon.svelte";
import Batch from "./Batch.svelte";
const dispatch = createEventDispatcher();
@@ -19,6 +20,8 @@
let metadata = null;
let previewUrl = null;
let result = null;
/** Set when more than one image is added; Batch owns that flow. */
let batchFiles = null;
$: current = stage === "idle" || stage === "scanning" ? 0 : stage === "done" ? 2 : 1;
$: busy = stage === "scanning" || stage === "cleaning";
@@ -38,7 +41,11 @@
async function onSelect(event) {
release();
file = event.detail.file;
if (event.detail.files.length > 1) {
batchFiles = event.detail.files;
return;
}
file = event.detail.files[0];
previewUrl = URL.createObjectURL(file);
metadata = null;
stage = "scanning";
@@ -75,6 +82,7 @@
function reset() {
release();
batchFiles = null;
file = null;
metadata = null;
stage = "idle";
@@ -86,6 +94,13 @@
<section class="card tool" id="tool" aria-labelledby="tool-heading">
<h2 class="visually-hidden" id="tool-heading">Clean an image</h2>
{#if batchFiles}
<Batch
files={batchFiles}
on:notify={(e) => dispatch("notify", e.detail)}
on:reset={reset}
/>
{:else}
<ol class="stepper">
{#each steps as label, index}
<li class="step" data-state={stepState(index, current)}>
@@ -179,6 +194,7 @@
{/if}
</div>
{/if}
{/if}
</section>
<style>
+12 -1
View File
@@ -1,16 +1,18 @@
<script>
import ThemeToggle from "./ThemeToggle.svelte";
import Icon from "./Icon.svelte";
import Logo from "./Logo.svelte";
</script>
<header class="topbar">
<div class="wrap inner">
<a class="wordmark" href="/" aria-label="Untrace home">
<span class="r-mark" aria-hidden="true">U</span>
<Logo />
<span>Untrace</span>
</a>
<nav class="actions" aria-label="Site">
<a class="btn btn-ghost guides" href="/guides/">Guides</a>
<a
class="btn btn-ghost repo"
href="https://github.com/developersharif/untrace"
@@ -41,6 +43,15 @@
text-decoration: none;
}
.guides {
height: var(--space-8);
padding-inline: var(--space-3);
}
.guides:hover {
text-decoration: none;
}
.repo span {
display: none;
}
+93
View File
@@ -0,0 +1,93 @@
<script>
import Icon from "./Icon.svelte";
const checks = [
{
icon: "eye",
title: "Watch the network tab",
detail:
"Open your browser's developer tools, choose Network, then clean an image. No request carries your file anywhere, because there is no server to send it to.",
},
{
icon: "code",
title: "Read the source",
detail:
"Untrace is MIT licensed. The whole cleaner is one short file you can read in a few minutes.",
},
{
icon: "scan",
title: "Scan the result again",
detail:
"Drop the cleaned copy back in. It reports nothing found, and the tool re-reads every output before it offers the download.",
},
];
const limits = [
"Pixels are not changed, so visual AI detectors and invisible watermarks such as SynthID can still recognise an image.",
"Platforms that already stored a copy of your credentials keep it. Clean the file before you upload.",
"Non-JPEG images are re-encoded to JPEG, so the file size and format can change.",
"Use it to protect your privacy. Do not use it to pass AI-generated work off as a photograph where disclosure is expected or required.",
];
</script>
<section class="section" id="trust" aria-labelledby="trust-heading">
<div class="section-head">
<p class="eyebrow">Trust</p>
<h2 id="trust-heading">Verify it yourself, and know the limits</h2>
<p>
A privacy tool should not ask for faith. Here is how to check each claim,
and what Untrace cannot do.
</p>
</div>
<div class="tiles">
{#each checks as item}
<article class="tile">
<span class="ico"><Icon name={item.icon} /></span>
<h3>{item.title}</h3>
<p>{item.detail}</p>
</article>
{/each}
</div>
<div class="card limits">
<h3>What Untrace does not do</h3>
<ul>
{#each limits as line}
<li>{line}</li>
{/each}
</ul>
</div>
</section>
<style>
.section {
scroll-margin-top: calc(var(--topbar-h) + var(--space-4));
}
.ico {
display: inline-flex;
color: var(--accent);
margin-bottom: var(--space-2);
}
.limits {
margin-top: var(--space-4);
padding: var(--space-5);
display: grid;
gap: var(--space-3);
}
.limits h3 {
font-size: var(--fs-4);
line-height: var(--lh-4);
font-weight: 600;
}
.limits ul {
display: grid;
gap: var(--space-2);
padding-left: var(--space-4);
color: var(--text-2);
}
</style>
+19 -6
View File
@@ -1,6 +1,7 @@
/**
* FAQ content. Kept in one place because the same questions and answers are
* mirrored as FAQPage structured data in index.html — edit both together.
* FAQ content, rendered on the page. Google no longer shows FAQ rich results
* for sites like this one, so there is no FAQPage structured data to keep in
* sync — the visible text is the single source.
*/
export const faqs = [
{
@@ -12,17 +13,25 @@ export const faqs = [
a: "Add the image to Untrace, review what it found, then choose Clean image and download the result. Untrace decodes the picture to raw pixels and writes a new file, so the C2PA manifest, the JUMBF container holding it, and every other metadata block are simply not carried over.",
},
{
q: "Does this remove the AI label on LinkedIn?",
a: "LinkedIn shows its AI label when it reads C2PA content credentials in the file you upload. Cleaning the image before you upload removes the data the label is generated from. It does not change a label on a post that is already published — delete that post and upload the clean copy instead.",
q: "Why would I remove content credentials?",
a: "For privacy. Credentials can name the software you use, your account and the steps of your edit, and that record travels with the file to everyone who receives it. Removing it is the same kind of choice as removing GPS coordinates before you share a photo.",
},
{
q: "Does it remove the AI tag on Instagram or Facebook?",
a: "Meta reads the same C2PA signals plus its own classifiers. Removing the credentials removes the metadata signal, so the automatic “AI info” tag is far less likely to appear. Visual detection is separate and no metadata tool can affect it.",
q: "Is it okay to remove them from AI-generated images?",
a: "Removing metadata is legal and common, but do not use it to pass AI-generated work off as a real photograph where disclosure is expected or required. Many platforms, publishers, contests and some laws ask you to disclose AI use, and that duty does not depend on whether a file carries a tag.",
},
{
q: "Will platforms still detect AI images after cleaning?",
a: "Possibly. Untrace removes metadata only. Platforms also run visual classifiers, and some generators embed invisible watermarks in the pixels themselves. None of that is touched, and Untrace does not claim otherwise.",
},
{
q: "What is C2PA and JUMBF?",
a: "C2PA is the Coalition for Content Provenance and Authenticity specification that defines the provenance record. JUMBF is the JPEG box format that record is stored in, usually inside an APP11 segment. Untrace scans for both and reports them before cleaning.",
},
{
q: "How do I know my image is not uploaded?",
a: "Open your browser's developer tools, choose the Network tab and clean an image. No request carries the file. The code is open source under the MIT licence, so you can also read exactly what it does.",
},
{
q: "Is my image uploaded anywhere?",
a: "No. Reading the metadata and writing the clean file both happen in your browser using the File and Canvas APIs. Nothing is sent over the network, there is no account, and Untrace has no server to store an image on.",
@@ -31,6 +40,10 @@ export const faqs = [
q: "Does cleaning reduce image quality?",
a: "Small PNGs are rewritten as PNG with no quality loss. Everything else is re-encoded as JPEG at quality 0.92, which is visually indistinguishable at normal viewing sizes. The tool shows the size change so you can see exactly what happened.",
},
{
q: "Can I clean several images at once?",
a: "Yes. Choose or drop up to 50 images together. Untrace scans them all, shows what each one hides, cleans them one after another in your browser, and lets you download them individually or as one ZIP.",
},
{
q: "Which formats are supported?",
a: "JPEG, PNG, TIFF, HEIC and AVIF. The cleaned file is returned as JPEG, or as PNG when the original was a small PNG.",
+90
View File
@@ -0,0 +1,90 @@
/**
* Minimal ZIP writer (stored, no compression). Images are already compressed,
* so deflating them gains nothing, and this avoids a dependency.
*/
const CRC_TABLE = (() => {
const table = new Uint32Array(256);
for (let n = 0; n < 256; n++) {
let c = n;
for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
table[n] = c >>> 0;
}
return table;
})();
function crc32(bytes) {
let crc = 0xffffffff;
for (let i = 0; i < bytes.length; i++) {
crc = CRC_TABLE[(crc ^ bytes[i]) & 0xff] ^ (crc >>> 8);
}
return (crc ^ 0xffffffff) >>> 0;
}
function header(size, write) {
const view = new DataView(new ArrayBuffer(size));
write(view);
return new Uint8Array(view.buffer);
}
/** @param {{name: string, data: Uint8Array}[]} files @returns {Blob} */
export function createZip(files) {
const encoder = new TextEncoder();
const now = new Date();
const time = (now.getHours() << 11) | (now.getMinutes() << 5) | (now.getSeconds() >> 1);
const date = ((now.getFullYear() - 1980) << 9) | ((now.getMonth() + 1) << 5) | now.getDate();
const parts = [];
const central = [];
let offset = 0;
for (const { name, data } of files) {
const nameBytes = encoder.encode(name);
const crc = crc32(data);
const local = header(30, (v) => {
v.setUint32(0, 0x04034b50, true);
v.setUint16(4, 20, true);
v.setUint16(6, 0x0800, true); // UTF-8 names
v.setUint16(8, 0, true); // stored
v.setUint16(10, time, true);
v.setUint16(12, date, true);
v.setUint32(14, crc, true);
v.setUint32(18, data.length, true);
v.setUint32(22, data.length, true);
v.setUint16(26, nameBytes.length, true);
});
parts.push(local, nameBytes, data);
central.push(
header(46, (v) => {
v.setUint32(0, 0x02014b50, true);
v.setUint16(4, 20, true);
v.setUint16(6, 20, true);
v.setUint16(8, 0x0800, true);
v.setUint16(10, 0, true);
v.setUint16(12, time, true);
v.setUint16(14, date, true);
v.setUint32(16, crc, true);
v.setUint32(20, data.length, true);
v.setUint32(24, data.length, true);
v.setUint16(28, nameBytes.length, true);
v.setUint32(42, offset, true);
}),
nameBytes
);
offset += local.length + nameBytes.length + data.length;
}
const centralSize = central.reduce((sum, part) => sum + part.length, 0);
const end = header(22, (v) => {
v.setUint32(0, 0x06054b50, true);
v.setUint16(8, files.length, true);
v.setUint16(10, files.length, true);
v.setUint32(12, centralSize, true);
v.setUint32(16, offset, true);
});
return new Blob([...parts, ...central, end], { type: "application/zip" });
}
+14
View File
@@ -1,5 +1,8 @@
import { defineConfig } from 'vite'
import { svelte } from '@sveltejs/vite-plugin-svelte'
import { resolve } from 'node:path'
const guides = ['', 'remove-gps-from-photo', 'remove-exif-data-iphone', 'remove-exif-data-android', 'remove-exif-data-windows-mac', 'how-to-view-exif-data', 'do-social-media-sites-remove-exif-data', 'photo-metadata-privacy-checklist', 'what-is-exif-data', 'what-is-c2pa']
// https://vitejs.dev/config/
export default defineConfig({
@@ -9,5 +12,16 @@ export default defineConfig({
outDir: 'dist',
assetsDir: 'assets',
cssMinify: 'lightningcss',
rollupOptions: {
input: {
main: resolve(__dirname, 'index.html'),
...Object.fromEntries(
guides.map((slug) => [
`guides-${slug || 'index'}`,
resolve(__dirname, 'guides', slug, 'index.html'),
])
),
},
},
},
})