DEV Community

Cover image for I Built a Tool to Geotag 500 Photos in 60 Seconds (Open Core)
Ai01-8389
Ai01-8389

Posted on

I Built a Tool to Geotag 500 Photos in 60 Seconds (Open Core)

The Problem That Cost Me Hours
Last summer, I returned from a trip with hundreds of photos. Great memories, messy metadata:

No GPS coordinates β€” My camera doesn’t have GPS
Wrong timestamps β€” Forgot to sync timezone after the flight
Chaotic filenames β€” DSC_0001.jpg through DSC_0389.jpg
I tried Lightroom. It took hours to manually geotag photos before I gave up.

There had to be a better way.

The Solution: GeoStamp
GeoStamp (geostamp.top) is a browser-based tool that batch-processes photo metadata:

πŸ“ Auto-geotagging β€” Match photos to GPS logs (GPX/KML)
⏰ Timestamp sync β€” Fix timezone offsets in bulk
🏷️ Smart renaming β€” Pattern-based batch rename ({location}{date}{###})
πŸ”’ Privacy-first β€” Everything happens in your browser
The kicker? 500 photos processed in under 60 seconds.

Technical Architecture
Why Browser-Based?
Most photo tools upload to servers. I didn’t want that β€” privacy matters, especially for client work.

Solution: Pure client-side processing using:

javascript

// Web Workers for non-blocking batch processing
const worker = new Worker('exif-worker.js');
worker.postMessage({ photos, gpsLog });

// EXIF parsing with exif-js + custom GPS parsers
const exifData = await exif.read(photoBuffer);
const gpsCoords = parseGPS(exifData.GPSLatitude);
Stack Overview
Layer Tech Why
Frontend Vanilla JS + Vite Zero bloat, fast load
EXIF Engine exif-js + custom parsers Full metadata control
Maps Leaflet + OpenStreetMap Free, no API keys
Processing Web Workers Parallel batch jobs
Export JSZip + FileSaver Client-side ZIP generation
The Tricky Part: GPS Log Matching
Matching thousands of photos to a GPX track isn’t trivial. The algorithm:

javascript

function matchPhotoToGPS(photoTimestamp, gpsTrack) {
// Find closest GPS point by timestamp
const closest = gpsTrack.reduce((best, point) => {
const diff = Math.abs(point.time - photoTimestamp);
return diff < best.diff ? { point, diff } : best;
}, { diff: Infinity });

return closest.point;
}
Edge cases handled:

Photos taken when GPS had no signal β†’ interpolate
Timezone mismatches β†’ auto-detect & adjust
Duplicate timestamps β†’ sub-second precision matching
Open Core Model
I believe in open source for trust, SaaS for convenience.

What’s Open Source
The core geotagging engine is on GitHub:

πŸ‘‰ https://github.com/Ai01-8389/geostamp

bash

git clone https://github.com/Ai01-8389/geostamp.git
cd geostamp
npm install
npm run dev
Features in the open core:

Single photo geotagging
EXIF reading/writing
GPS log parsing (GPX/KML)
Basic timestamp adjustment
What’s in the SaaS (Pro)
The hosted version adds convenience layers:

Batch processing (500+ photos)
Drag-and-drop UI
Cloud storage (optional, encrypted)
Advanced patterns (custom naming templates)
Priority support
Pricing: $7.99/month β€” cheaper than one hour of manual work.

Who’s It For?
Potential use cases I’m targeting:

πŸ“· Real estate photographers β€” MLS compliance requires geotags
✈️ Travel bloggers β€” Auto-generate location names from GPS
πŸ“° Journalists β€” Verify photo locations for editorial standards
🏠 Insurance adjusters β€” Document damage with timestamps
πŸ•΅οΈ OSINT researchers β€” Bulk metadata analysis
Are you in one of these fields? I’d love to hear your feedback.

Try It (Free Forever)
Single photos are free, unlimited.

Go to geostamp.top
Drop a photo
Add GPS coordinates or sync with a GPX file
Download β€” metadata embedded, no watermarks
No signup, no credit card, no server upload.

Current Status
This is my first indie project. Currently in beta, looking for early users and feedback.

If you try it, let me know:

What worked?
What was confusing?
What feature would make you pay $7.99/month?
Star the repo ⭐ if you want updates: https://github.com/Ai01-8389/geostamp

Questions?
Drop a comment below β€” I read every single one.

Indie hackers: What’s your take on the open core model? Too generous, or good for trust-building?

Built with ❀️ by a first-time indie developer. Thanks for reading.

Top comments (0)