<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ai01-8389</title>
    <description>The latest articles on DEV Community by Ai01-8389 (@focusclaw).</description>
    <link>https://dev.to/focusclaw</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3956697%2F10864cac-798d-4791-ac75-a5a6b026506c.jpg</url>
      <title>DEV Community: Ai01-8389</title>
      <link>https://dev.to/focusclaw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/focusclaw"/>
    <language>en</language>
    <item>
      <title>I Built a Tool to Geotag 500 Photos in 60 Seconds (Open Core)</title>
      <dc:creator>Ai01-8389</dc:creator>
      <pubDate>Thu, 28 May 2026 13:43:58 +0000</pubDate>
      <link>https://dev.to/focusclaw/i-built-a-tool-to-geotag-500-photos-in-60-seconds-open-core-3o4g</link>
      <guid>https://dev.to/focusclaw/i-built-a-tool-to-geotag-500-photos-in-60-seconds-open-core-3o4g</guid>
      <description>&lt;p&gt;The Problem That Cost Me Hours&lt;br&gt;
Last summer, I returned from a trip with hundreds of photos. Great memories, messy metadata:&lt;/p&gt;

&lt;p&gt;No GPS coordinates — My camera doesn’t have GPS&lt;br&gt;
Wrong timestamps — Forgot to sync timezone after the flight&lt;br&gt;
Chaotic filenames — DSC_0001.jpg through DSC_0389.jpg&lt;br&gt;
I tried Lightroom. It took hours to manually geotag photos before I gave up.&lt;/p&gt;

&lt;p&gt;There had to be a better way.&lt;/p&gt;

&lt;p&gt;The Solution: GeoStamp&lt;br&gt;
GeoStamp (geostamp.top) is a browser-based tool that batch-processes photo metadata:&lt;/p&gt;

&lt;p&gt;📍 Auto-geotagging — Match photos to GPS logs (GPX/KML)&lt;br&gt;
⏰ Timestamp sync — Fix timezone offsets in bulk&lt;br&gt;
🏷️ Smart renaming — Pattern-based batch rename ({location}&lt;em&gt;{date}&lt;/em&gt;{###})&lt;br&gt;
🔒 Privacy-first — Everything happens in your browser&lt;br&gt;
The kicker? 500 photos processed in under 60 seconds.&lt;/p&gt;

&lt;p&gt;Technical Architecture&lt;br&gt;
Why Browser-Based?&lt;br&gt;
Most photo tools upload to servers. I didn’t want that — privacy matters, especially for client work.&lt;/p&gt;

&lt;p&gt;Solution: Pure client-side processing using:&lt;/p&gt;

&lt;p&gt;javascript&lt;/p&gt;

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

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

&lt;p&gt;javascript&lt;/p&gt;

&lt;p&gt;function matchPhotoToGPS(photoTimestamp, gpsTrack) {&lt;br&gt;
  // Find closest GPS point by timestamp&lt;br&gt;
  const closest = gpsTrack.reduce((best, point) =&amp;gt; {&lt;br&gt;
    const diff = Math.abs(point.time - photoTimestamp);&lt;br&gt;
    return diff &amp;lt; best.diff ? { point, diff } : best;&lt;br&gt;
  }, { diff: Infinity });&lt;/p&gt;

&lt;p&gt;return closest.point;&lt;br&gt;
}&lt;br&gt;
Edge cases handled:&lt;/p&gt;

&lt;p&gt;Photos taken when GPS had no signal → interpolate&lt;br&gt;
Timezone mismatches → auto-detect &amp;amp; adjust&lt;br&gt;
Duplicate timestamps → sub-second precision matching&lt;br&gt;
Open Core Model&lt;br&gt;
I believe in open source for trust, SaaS for convenience.&lt;/p&gt;

&lt;p&gt;What’s Open Source&lt;br&gt;
The core geotagging engine is on GitHub:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/Ai01-8389/geostamp" rel="noopener noreferrer"&gt;https://github.com/Ai01-8389/geostamp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;bash&lt;/p&gt;

&lt;p&gt;git clone &lt;a href="https://github.com/Ai01-8389/geostamp.git" rel="noopener noreferrer"&gt;https://github.com/Ai01-8389/geostamp.git&lt;/a&gt;&lt;br&gt;
cd geostamp&lt;br&gt;
npm install&lt;br&gt;
npm run dev&lt;br&gt;
Features in the open core:&lt;/p&gt;

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

&lt;p&gt;Batch processing (500+ photos)&lt;br&gt;
Drag-and-drop UI&lt;br&gt;
Cloud storage (optional, encrypted)&lt;br&gt;
Advanced patterns (custom naming templates)&lt;br&gt;
Priority support&lt;br&gt;
Pricing: $7.99/month — cheaper than one hour of manual work.&lt;/p&gt;

&lt;p&gt;Who’s It For?&lt;br&gt;
Potential use cases I’m targeting:&lt;/p&gt;

&lt;p&gt;📷 Real estate photographers — MLS compliance requires geotags&lt;br&gt;
✈️ Travel bloggers — Auto-generate location names from GPS&lt;br&gt;
📰 Journalists — Verify photo locations for editorial standards&lt;br&gt;
🏠 Insurance adjusters — Document damage with timestamps&lt;br&gt;
🕵️ OSINT researchers — Bulk metadata analysis&lt;br&gt;
Are you in one of these fields? I’d love to hear your feedback.&lt;/p&gt;

&lt;p&gt;Try It (Free Forever)&lt;br&gt;
Single photos are free, unlimited.&lt;/p&gt;

&lt;p&gt;Go to geostamp.top&lt;br&gt;
Drop a photo&lt;br&gt;
Add GPS coordinates or sync with a GPX file&lt;br&gt;
Download — metadata embedded, no watermarks&lt;br&gt;
No signup, no credit card, no server upload.&lt;/p&gt;

&lt;p&gt;Current Status&lt;br&gt;
This is my first indie project. Currently in beta, looking for early users and feedback.&lt;/p&gt;

&lt;p&gt;If you try it, let me know:&lt;/p&gt;

&lt;p&gt;What worked?&lt;br&gt;
What was confusing?&lt;br&gt;
What feature would make you pay $7.99/month?&lt;br&gt;
Star the repo ⭐ if you want updates: &lt;a href="https://github.com/Ai01-8389/geostamp" rel="noopener noreferrer"&gt;https://github.com/Ai01-8389/geostamp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions?&lt;br&gt;
Drop a comment below — I read every single one.&lt;/p&gt;

&lt;p&gt;Indie hackers: What’s your take on the open core model? Too generous, or good for trust-building?&lt;/p&gt;

&lt;p&gt;Built with ❤️ by a first-time indie developer. Thanks for reading.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
