Self-hosted travel check-in tracker with triple redundancy. Beautiful, privacy-first, works on any device. No backend needed.
When Foursquare shut down their Swarm API, millions of check-ins became trapped in a closed ecosystem. DroPin is the open-source alternative: a beautifully designed, privacy-focused check-in tracker you own and control.
Deploy in 5 minutes to Netlify (free), choose between simple CSV mode or bulletproof PWA mode with Google Drive backup. No backend, no database, no tracking—just your travel memories, beautifully visualized and safely stored.
- 🗺️ Interactive Global Map - Visualize all check-ins with clustering and smooth animations
- ⚡ Quick Check-in - Location-based check-in finds nearby venues instantly
- 📍 Manual Entry - Drag-to-position pin placement with auto-geocoding
- 🔍 Smart Search & Filters - Find venues by name, filter by country/type/year
- 🎨 Minimalist Design - Clean, Apple-inspired interface
- 📱 Mobile-First - Perfect experience on iOS and Android
- 📁 CSV Mode - Simple, static files (great for getting started)
- 🛡️ PWA Mode - Triple redundancy: IndexedDB + localStorage + Google Drive
- ☁️ Auto-Backup - Google Drive uploads every 5 check-ins
- 💾 Offline-First - Works without internet (PWA mode)
- 🔄 Auto-Recovery - Restores data if browser cache cleared
- 🔒 Privacy-Focused - Your data stays yours
- 🚀 Zero Backend - Just HTML/CSS/JS—deploy anywhere
- 💰 Free Hosting - Works on Netlify free tier
- 🔐 No Tracking - Zero analytics, no cookies
Visualize your travels with color-coded clustering and smooth zoom
Filter by country, venue type, or year to explore your history
Tap any pin to see details—share via iOS native sheet or copy
Instant check-in: finds nearby venues sorted by distance
Drag the map to position pin—auto-geocodes address
Perfect for getting started quickly:
# Clone and configure
git clone https://github.com/pingou100/DroPin.git
cd DroPin
cp src/config.example.js src/config.js
# Edit config.js with your API keys
# Deploy to Netlify
# Drag src/ folder to https://app.netlify.com/dropFor bulletproof data safety with Google Drive backup:
- Follow CSV setup above, then:
- Create Google OAuth Client at Google Cloud Console
- Type: Web application
- Authorized JavaScript origins:
https://your-domain.com - Authorized redirect URIs:
https://your-domain.com/oauth2callback
- Enable PWA mode in config.js:
window.CONFIG = { STORAGE_MODE: 'pwa', // Enable triple redundancy GOOGLE_DRIVE_CLIENT_ID: 'your_client_id.apps.googleusercontent.com', AUTO_BACKUP_INTERVAL: 5, // Backup every 5 check-ins // ... other config };
- Deploy and connect Google Drive when prompted on first check-in
NEW! PWA mode protects your data with three independent backup layers:
Every check-in is saved to:
┌─────────────────────────────────────┐
│ Layer 1: IndexedDB │ ← Primary (50MB+, offline)
│ ✓ Fast, instant access │
│ ⚠️ Risk: Cleared with browser data │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ Layer 2: localStorage │ ← Backup (last 200 check-ins)
│ ✓ Survives most cache clears │
│ ⚠️ Risk: Cleared with browser data │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ Layer 3: Google Drive │ ← Permanent (unlimited)
│ ✓ Auto-upload every 5 check-ins │
│ ✓ Survives device loss │
│ ✓ YOU control your data │
└─────────────────────────────────────┘
User adds check-in
↓
✅ Saved to IndexedDB (Layer 1)
↓
✅ Backed up to localStorage (Layer 2)
↓
Counter increments (1, 2, 3, 4, 5...)
↓
Every 5th check-in:
✅ Generate CSV from all check-ins
✅ Upload to Google Drive (Layer 3)
✅ Toast: "☁️ Backed up to Google Drive"
| Scenario | CSV Mode | PWA Mode |
|---|---|---|
| Clear browser cache | ❌ Data lost | ✅ Auto-restored from localStorage |
| Clear all site data | ❌ Everything gone | ✅ Download CSV from Google Drive |
| Switch devices | ✅ Sync via Google Drive | |
| Device lost/stolen | ❌ Data gone forever | ✅ Safe in Google Drive |
| Accidental deletion | ❌ No recovery | ✅ Multiple backups available |
- Enable Google Drive API in Google Cloud Console
- Create OAuth 2.0 Client ID:
- Application type: Web application
- Authorized JavaScript origins: Your domain
- Authorized redirect URIs:
https://yourdomain.com/oauth2callback
- Add test users (if app in testing mode): Your Google account email
- Copy Client ID to
config.js
On first check-in, you'll see a prompt to connect Google Drive. After connecting, backups happen automatically every 5 check-ins!
Check your backups: Google Drive → DroPin Backups
Best for: Simple deployments, getting started
✅ Pure static files - CSV is your database
✅ Zero dependencies
✅ Perfect for Netlify drag-and-drop
✅ Instant map updates
Use CSV mode if: You want the simplest setup and don't mind manually exporting check-ins.
Best for: Power users, mobile-first, data safety
✅ Triple redundancy (3 backup layers!)
✅ Offline-first with IndexedDB
✅ Auto-backup to Google Drive
✅ Auto-recovery if cache cleared
✅ Works without internet
Use PWA mode if: You want bulletproof data safety and don't want to worry about losing check-ins.
| Feature | CSV Mode | PWA Mode |
|---|---|---|
| Setup time | 5 min | 10 min |
| Data safety | ✅ Triple redundancy | |
| Offline mode | ❌ | ✅ |
| Auto-backup | ❌ | ✅ Google Drive |
| Cache clear survival | ❌ | ✅ Auto-recovery |
| Multi-device | ||
| Best for | Simple setups | Data safety |
- Frontend: Vanilla JavaScript (ES6 modules)
- Maps: Leaflet.js with clustering
- Storage: CSV files OR IndexedDB + Google Drive (PWA mode)
- OAuth: Google Identity Services (modern OAuth2)
- Geocoding: Geoapify (3,000 free/day)
- Places: Google Places API
- Hosting: Netlify, Vercel, GitHub Pages, any static host
- Foursquare/Swarm shut down their API - millions of check-ins trapped
- Google owns your location data - no export, no control
- Existing solutions are complex - databases, servers, technical setup
- Data loss anxiety - one cache clear and everything's gone
✅ Simplest possible architecture - HTML + CSV OR bulletproof PWA
✅ No backend required - deploys anywhere
✅ Your data, your control - CSV files OR your Google Drive
✅ Beautiful design - Apple-inspired UI
✅ Data safety options - Choose your comfort level
✅ Free to host - Netlify/Vercel free tiers
- Former Swarm users - Export Foursquare data and self-host
- Privacy-conscious travelers - Keep location data under your control
- Digital nomads - Track your journey across countries
- Travel bloggers - Visualize adventures on your own domain
- Mobile-first users - PWA mode works offline on phones
- Data hoarders - Triple backup means never losing a check-in
- CSV mode: Files on your static host (Netlify/Vercel)
- PWA mode: Your browser + your Google Drive
- No third-party servers: Zero external tracking or analytics
- No cookies: Not even for analytics
- Your API keys: Stay in your config.js (never committed)
- Minimal scope: Only
drive.file(files created by this app) - Cannot access: Your other Google Drive files
- You control: Delete backups anytime from your Drive
- Modern OAuth: Google Identity Services (not deprecated gapi)
config.js with real keys to public repos
✅ Use domain restrictions for API keys in Google Cloud Console
✅ Keep private instances in private GitHub repos
✅ Review Google Cloud OAuth consent screen settings
Completed ✅
- CSV-based storage with instant updates
- Export All / Export New functionality
- Event-driven architecture
- Mobile map auto-refresh
- PWA Triple Redundancy System
- Google Drive auto-backup
- Auto-recovery from localStorage
Coming Soon 🚀
- Settings panel (view backup status, manual backup)
- Import old CSV into PWA storage
- Dark mode toggle
- Service Worker for full PWA installability
- Travel statistics dashboard
- Import from Foursquare/Swarm exports
- Photo attachments
- Real-time multi-device sync (Firebase/Supabase)
✅ iOS Safari 14+
✅ Chrome 90+
✅ Firefox 88+
✅ Edge 90+
✅ Mobile browsers
✅ IndexedDB support (all modern browsers)
✅ HTTPS required for Google OAuth
✅ Third-party cookies enabled for Google sign-in
Contributions are welcome! Whether you:
- 🐛 Found a bug
- 💡 Have a feature idea
- 📖 Want to improve documentation
- 🎨 Can enhance the design
Please:
- Fork the repository
- Create feature branch (
git checkout -b feature/Amazing) - Commit changes (
git commit -m 'Add Amazing') - Push to branch (
git push origin feature/Amazing) - Open a Pull Request
- Inspired by Foursquare/Swarm's check-in experience
- Built with Leaflet and Leaflet.markercluster
- Map tiles by CARTO and OpenStreetMap
- Geocoding by Geoapify
- Places data from Google Places API
- OAuth via Google Identity Services
MIT License - see LICENSE file for details.
- 🐛 Bug reports: GitHub Issues
- 💬 Discussions: GitHub Discussions
- ⭐ Star the repo if you find it useful!
DroPin was created because travel memories should belong to you, not be locked in a corporate database. Whether you've checked in to 10 places or 10,000, your data deserves a beautiful home that you control.
Choose CSV mode for simplicity. Choose PWA mode for peace of mind. Either way, your memories are yours forever.
Start tracking your travels today. Deploy in 5-10 minutes, own your data forever.
Get Started • PWA Setup • Report Bug
Made with ❤️ for travelers and explorers worldwide