Web UI now accepts both images and PDFs. Images go through /strip
as before; PDFs go through new /convert/pdf endpoint which renders
all pages via pdftoppm and returns base64 JPEGs. Also updates
page title and layout.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Lead with GPS location (reverse geocoded), date, camera/device.
Combine aperture/exposure/ISO/focal length into one "Settings" line
with rounded values. Technical details (dimensions, ICC, EXIF/XMP
data sizes) at the bottom.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Reverse geocodes GPS coords via Nominatim to show the real location
that was embedded in the photo, making it clear what was stripped.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fly.io proxy was stripping the custom X-Removed-Metadata header.
Now the web UI requests Accept: application/json and the /strip
endpoint returns {image, metadata} as JSON. Raw JPEG clients
still get the old behavior.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Extracts EXIF, ICC, IPTC, XMP metadata before stripping and displays
it in a card below the drop zone — camera make/model, GPS, date taken,
lens, exposure settings, etc. GPS location gets a warning highlight.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace browser prompt() with full-screen auth overlay that blocks
access to the upload UI until a valid token is entered.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- POST /strip: accepts any image, strips all metadata (EXIF, GPS, IPTC, XMP),
returns clean anonymous JPEG at original dimensions (quality 92)
- GET / now serves a minimal web UI with drag-and-drop upload
- Token prompt on first use, saved to localStorage
- Add CLAUDE.md with project context
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>