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>
This commit is contained in:
SharifandClaude Sonnet 5.5 committed 2026-10-20 07:23:55 +06:00
1 parent 99b4b22352
commit 28a8151cc0
25 files changed
+1054 -166

No files matched your search

+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/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>
+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/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/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/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 charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" /> <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 <meta
name="description" 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/" /> <link rel="canonical" href="https://untrace.realbrain.cc/" />
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1" /> <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" href="/favicon.svg" />
<link rel="icon" type="image/svg+xml" sizes="16x16" href="/favicon-16x16.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="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" /> <link rel="manifest" href="/manifest.json" />
<!-- The design system pulls IBM Plex from Google Fonts; starting the <!-- The design system pulls IBM Plex from Google Fonts; starting the
@@ -51,10 +51,10 @@
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:site_name" content="Untrace" /> <meta property="og:site_name" content="Untrace" />
<meta property="og:url" content="https://untrace.realbrain.cc/" /> <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 <meta
property="og:description" 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" content="https://untrace.realbrain.cc/thumb.jpg" />
<meta property="og:image:width" content="1200" /> <meta property="og:image:width" content="1200" />
@@ -62,10 +62,10 @@
<meta property="og:locale" content="en_US" /> <meta property="og:locale" content="en_US" />
<meta name="twitter:card" content="summary_large_image" /> <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 <meta
name="twitter:description" 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" /> <meta name="twitter:image" content="https://untrace.realbrain.cc/thumb.jpg" />
@@ -86,7 +86,7 @@
"Untrace AI", "Untrace AI",
"Untrace content credentials remover" "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", "inLanguage": "en",
"publisher": { "publisher": {
"@id": "https://untrace.realbrain.cc/#org" "@id": "https://untrace.realbrain.cc/#org"
@@ -97,7 +97,12 @@
"@id": "https://untrace.realbrain.cc/#org", "@id": "https://untrace.realbrain.cc/#org",
"name": "Untrace", "name": "Untrace",
"url": "https://untrace.realbrain.cc/", "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": [ "sameAs": [
"https://github.com/developersharif/untrace", "https://github.com/developersharif/untrace",
"https://realbrain.cc/" "https://realbrain.cc/"
@@ -121,10 +126,12 @@
"publisher": { "publisher": {
"@id": "https://untrace.realbrain.cc/#org" "@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": [ "featureList": [
"Remove C2PA content credentials", "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 JUMBF provenance containers",
"Remove GPS location data", "Remove GPS location data",
"Remove camera make, model and settings", "Remove camera make, model and settings",
@@ -134,120 +141,6 @@
"Client-side processing with no upload", "Client-side processing with no upload",
"Supports JPEG, PNG, TIFF, HEIC and AVIF" "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> <div id="app"></div>
<noscript> <noscript>
<p style="padding: 24px; font-family: system-ui, sans-serif"> <p style="padding: 24px; font-family: system-ui, sans-serif">
Untrace removes C2PA content credentials, AI generation tags and EXIF Untrace removes EXIF, GPS and C2PA content credentials from photos. It
metadata from images. It reads and rewrites the file inside your reads and rewrites the file inside your browser, so JavaScript has to
browser, so JavaScript has to be enabled for it to work. be enabled for it to work.
</p> </p>
</noscript> </noscript>
<script type="module" src="/src/main.js"></script> <script type="module" src="/src/main.js"></script>
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"> <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"/> <rect width="48" height="48" rx="8" fill="#3450C8"/>
<text x="24" y="24" fill="#FFFFFF" font-family="'IBM Plex Mono', ui-monospace, monospace" <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>
font-size="28" font-weight="600" text-anchor="middle" dominant-baseline="central">U</text>
</svg> </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"> <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"/> <rect width="48" height="48" rx="10" fill="#3450C8"/>
<text x="24" y="24" fill="#FFFFFF" font-family="'IBM Plex Mono', ui-monospace, monospace" <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>
font-size="28" font-weight="600" text-anchor="middle" dominant-baseline="central">U</text>
</svg> </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"> <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"/> <rect width="48" height="48" rx="0" fill="#3450C8"/>
<text x="24" y="24" fill="#FFFFFF" font-family="'IBM Plex Mono', ui-monospace, monospace" <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>
font-size="22" font-weight="600" text-anchor="middle" dominant-baseline="central">U</text>
</svg> </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"> <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"/> <rect width="48" height="48" rx="10" fill="#3450C8"/>
<text x="24" y="24" fill="#FFFFFF" font-family="'IBM Plex Mono', ui-monospace, monospace" <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>
font-size="28" font-weight="600" text-anchor="middle" dominant-baseline="central">U</text>
</svg> </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

+19 -3
View File
@@ -1,8 +1,8 @@
{ {
"id": "/", "id": "/",
"name": "Untrace — content credentials and metadata remover", "name": "Untrace — photo metadata and content credentials remover",
"short_name": "Untrace", "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": "/", "start_url": "/",
"scope": "/", "scope": "/",
"display": "standalone", "display": "standalone",
@@ -20,9 +20,25 @@
"sizes": "any", "sizes": "any",
"type": "image/svg+xml", "type": "image/svg+xml",
"purpose": "maskable" "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", "lang": "en",
"dir": "ltr", "dir": "ltr",
"orientation": "any" "orientation": "any"
+21 -2
View File
@@ -2,8 +2,27 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url> <url>
<loc>https://untrace.realbrain.cc/</loc> <loc>https://untrace.realbrain.cc/</loc>
<lastmod>2026-09-05</lastmod> <lastmod>2026-10-20</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority> <priority>1.0</priority>
</url> </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/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> </urlset>
+35 -14
View File
@@ -8,6 +8,8 @@
import Faq from "./lib/Faq.svelte"; import Faq from "./lib/Faq.svelte";
import Footer from "./lib/Footer.svelte"; import Footer from "./lib/Footer.svelte";
import Toast from "./lib/Toast.svelte"; import Toast from "./lib/Toast.svelte";
import HeroDemo from "./lib/HeroDemo.svelte";
import Trust from "./lib/Trust.svelte";
let toasts = []; let toasts = [];
let nextId = 0; let nextId = 0;
@@ -44,20 +46,25 @@
<main> <main>
<div class="wrap"> <div class="wrap">
<section class="lede"> <div class="intro">
<p class="eyebrow">C2PA · AI credentials · EXIF</p> <section class="lede">
<h1>Remove content credentials from an image</h1> <p class="eyebrow">EXIF · GPS · C2PA</p>
<p> <h1>Remove hidden metadata and content credentials from a photo</h1>
Untrace strips C2PA content credentials, AI generation tags, GPS <p>
coordinates and EXIF metadata from a photo — free, and without the file Every photo can carry your location, your device and a signed record
ever leaving your device. of how it was made. Untrace shows you what is hidden and removes it —
</p> free, and without the file ever leaving your device.
<div class="chip-row"> </p>
<span class="chip">Free</span> <div class="chip-row">
<span class="chip">No sign-in</span> <span class="chip">Free</span>
<span class="chip">Open source</span> <span class="chip">No upload</span>
</div> <span class="chip">No sign-in</span>
</section> <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} /> <Tool on:notify={notify} />
@@ -73,6 +80,7 @@
<div class="stack sections"> <div class="stack sections">
<Removals /> <Removals />
<HowItWorks /> <HowItWorks />
<Trust />
<Faq /> <Faq />
</div> </div>
</div> </div>
@@ -87,6 +95,19 @@
padding-bottom: var(--space-8); 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 { .assurances {
display: grid; display: grid;
gap: var(--space-3); 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'
+13 -2
View File
@@ -1,5 +1,6 @@
<script> <script>
import Icon from "./Icon.svelte"; import Icon from "./Icon.svelte";
import Logo from "./Logo.svelte";
const year = new Date().getFullYear(); const year = new Date().getFullYear();
</script> </script>
@@ -9,7 +10,7 @@
<div class="cols"> <div class="cols">
<div> <div>
<p class="wordmark"> <p class="wordmark">
<span class="r-mark" aria-hidden="true">U</span> <Logo />
<span>Untrace</span> <span>Untrace</span>
</p> </p>
<p class="blurb"> <p class="blurb">
@@ -24,10 +25,20 @@
<li><a href="#tool">Clean an image</a></li> <li><a href="#tool">Clean an image</a></li>
<li><a href="#what-is-removed">What is removed</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="#how-it-works">How it works</a></li>
<li><a href="#trust">Verify it yourself</a></li>
<li><a href="#faq">Questions</a></li> <li><a href="#faq">Questions</a></li>
</ul> </ul>
</nav> </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/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"> <nav aria-label="Project">
<h2>Project</h2> <h2>Project</h2>
<ul> <ul>
@@ -99,7 +110,7 @@
@media (min-width: 900px) { @media (min-width: 900px) {
.cols { .cols {
grid-template-columns: 2fr 1fr 1fr 1fr; grid-template-columns: 2fr 1fr 1fr 1fr 1fr;
gap: var(--space-6); 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", lock: "M7 11V8a5 5 0 0 1 10 0v3m-11 0h12v9H6v-9Z",
image: image:
"M4 5h16v14H4V5Zm0 10 4.5-4.5 4 4L15 12l5 5", "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" }; 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>
+12 -1
View File
@@ -1,16 +1,18 @@
<script> <script>
import ThemeToggle from "./ThemeToggle.svelte"; import ThemeToggle from "./ThemeToggle.svelte";
import Icon from "./Icon.svelte"; import Icon from "./Icon.svelte";
import Logo from "./Logo.svelte";
</script> </script>
<header class="topbar"> <header class="topbar">
<div class="wrap inner"> <div class="wrap inner">
<a class="wordmark" href="/" aria-label="Untrace home"> <a class="wordmark" href="/" aria-label="Untrace home">
<span class="r-mark" aria-hidden="true">U</span> <Logo />
<span>Untrace</span> <span>Untrace</span>
</a> </a>
<nav class="actions" aria-label="Site"> <nav class="actions" aria-label="Site">
<a class="btn btn-ghost guides" href="/guides/">Guides</a>
<a <a
class="btn btn-ghost repo" class="btn btn-ghost repo"
href="https://github.com/developersharif/untrace" href="https://github.com/developersharif/untrace"
@@ -41,6 +43,15 @@
text-decoration: none; text-decoration: none;
} }
.guides {
height: var(--space-8);
padding-inline: var(--space-3);
}
.guides:hover {
text-decoration: none;
}
.repo span { .repo span {
display: none; 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>
+15 -6
View File
@@ -1,6 +1,7 @@
/** /**
* FAQ content. Kept in one place because the same questions and answers are * FAQ content, rendered on the page. Google no longer shows FAQ rich results
* mirrored as FAQPage structured data in index.html — edit both together. * 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 = [ 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.", 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?", q: "Why would I remove content credentials?",
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.", 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?", q: "Is it okay to remove them from AI-generated images?",
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.", 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?", 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.", 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?", 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.", 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.",
+14
View File
@@ -1,5 +1,8 @@
import { defineConfig } from 'vite' import { defineConfig } from 'vite'
import { svelte } from '@sveltejs/vite-plugin-svelte' import { svelte } from '@sveltejs/vite-plugin-svelte'
import { resolve } from 'node:path'
const guides = ['', 'remove-gps-from-photo', 'what-is-exif-data', 'what-is-c2pa']
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig({ export default defineConfig({
@@ -9,5 +12,16 @@ export default defineConfig({
outDir: 'dist', outDir: 'dist',
assetsDir: 'assets', assetsDir: 'assets',
cssMinify: 'lightningcss', cssMinify: 'lightningcss',
rollupOptions: {
input: {
main: resolve(__dirname, 'index.html'),
...Object.fromEntries(
guides.map((slug) => [
`guides-${slug || 'index'}`,
resolve(__dirname, 'guides', slug, 'index.html'),
])
),
},
},
}, },
}) })