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>
Search Console (Jun 4 – Sep 3) shows the page ranking on the first results
page for "content credentials" queries while converting badly: "ai
credentials remover" at 113 impressions and 0.88% CTR from position 6.7,
"remove content credentials from image online" at 2.15% from position 5.0,
"remove ai content credentials from image" at 0% from position 7.8. The
title led with "EXIF metadata", a phrase that appears in none of the top
queries, so the snippet never matched the intent behind the impressions.
SEO
- Title, description and H1 rebuilt around "remove content credentials from
an image"; EXIF kept as a secondary term.
- Added a how-to section and a nine-question FAQ answering the question
queries that had no content behind them, including the LinkedIn AI label
and the Instagram AI tag.
- Structured data as an @graph: WebSite (alternateName "Untrace AI" for the
unserved brand query), Organization, WebApplication, HowTo, FAQPage.
- Fixed sitemap.xml, which pointed at /untrace/ — a URL that does not exist.
- Regenerated the Open Graph image to match the new design.
Design
- Vendored the design system at src/tokens.css and composed the app from it.
The old styling broke most of its rules: gradients, font weights 800 and
900, raw #2563eb, Inter, and emoji as the only status signal.
- Reworked the tool into a Scan / Review / Download flow that lists what it
found before changing anything, with the primary action pinned within
thumb reach on small screens.
- Dark by default with a light theme, applied before first paint so the page
never flashes the wrong surface.
- Replaced the floating donation widget, which painted an off-token circle
over the page and covered the mobile action bar, with a footer link.
Structure
- Moved detection into src/lib/metadata.js and removal into src/lib/clean.js;
the canvas callbacks are now a promise chain.
- Dropped Tailwind and PostCSS. Both were configured twice, and no Tailwind
utility was used. Stylesheet is 6.2 kB gzipped with the whole system in it.
Fixes
- The stepper never advanced: stepState(index) read `current` from the
closure, which Svelte 4 cannot track as a template dependency.
- The cleaner's fallback returned the original, uncleaned file while the UI
reported "All EXIF metadata removed". It now reports the failure instead.
Verified against a JPEG carrying EXIF, GPS, XMP and an APP11 JUMBF C2PA
manifest: the output retains only APP0 and the sRGB ICC profile, with every
provenance marker gone.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018pRSdR57Ze9M2meDfYZgYE