A hyperlocal, map-based photo sharing app designed for college campuses.
SNAP-MAP allows students to instantly capture photos and share them on a live campus map. All photos are geo-tagged, stored securely, and shown as clusters/bubbles on a dynamic map. Students can explore events happening around them, view photos contributed by others, and participate in the campus community in real time.
- Capture photos directly using the in-app camera
- Auto-attaches GPS coordinates
- Uploads securely to Azure Blob Storage
- Preview + retake option
- Interactive map with user location
- Bubbles indicate photos uploaded around campus
- Clustered markers for multiple events or heavy hotspots
- Tap a bubble β see All Photos or Event-wise Photos
- System auto-detects events based on photo density + proximity
- Groups photos under event IDs
- Shows βhotspotβ visuals on the map
- College email login (domain restricted)
- Secure sessions
- View your uploaded photos
- Manage profile + logout
- All uploads in a grid
- Delete option
- Event galleries with horizontal swipe viewer
- React Native (Expo)
- Expo Camera + Expo Location
- Mapbox or react-native-maps
- Axios for API calls
- Clerk for authentication
- Node.js + Express
- Clerk server-side JWT verification
- Mongoose + MongoDB Atlas
- Azure Blob Storage (file storage only)
- MongoDB Atlas
- Users
- Photos
- Events
- Geospatial queries enabled
- Azure Blob Storage
- All images compressed + uploaded here
- URLs stored in MongoDB
All endpoints are prefixed with /api/v1
- Description: Server health check
- Auth Required: No
- Response:
{ "status": "ok" }
- Description: User login endpoint (placeholder)
- Auth Required: No
- Response:
"Login call"
- Description: Register a new user with Clerk authentication
- Auth Required: Yes (Clerk JWT)
- Request Body:
{ "clerkId": "string", "email": "string", "rollNumber": "string" }
- Description: Update user profile information
- Auth Required: Yes (Clerk JWT)
- Content-Type:
multipart/form-data - Form Data:
profileImg(file): Profile image (max 10MB)- Other user fields
- Description: Photo service health check
- Auth Required: No
- Response:
{ "pong": true }
- Description: Upload a single photo with GPS coordinates
- Auth Required: Yes (Clerk JWT)
- Content-Type:
multipart/form-data - Form Data:
photo(file): Image file (max 10MB)latitude(number): GPS latitudelongitude(number): GPS longitude
- Response: Photo object with Azure Blob URL
- Description: Upload multiple photos (max 10) at once
- Auth Required: Yes (Clerk JWT)
- Content-Type:
multipart/form-data - Form Data:
photos[](files): Up to 10 image files- GPS coordinates for each photo
- Response: Array of photo objects
- Description: Test photo upload endpoint (for debugging)
- Auth Required: No
- Content-Type:
multipart/form-data - Form Data:
photo(file): Test image file
- Description: Retrieve all uploaded photos
- Auth Required: No
- Response: Array of all photo objects with URLs and metadata
SnapMap/ β Project root
β
β CONTRIBUTING.md β Contribution guidelines
β README.md β Project overview
β
βββ backend/ β Backend API
β β package-lock.json
β β package.json
β β server.js β Server entry point
β β v1.js β /api/v1 all routes are here
β β
β βββ config/
β βββ controllers/ β Request handlers
β βββ db/ β Database setup
β βββ middleware/ β Request middleware
β βββ models/ β Database models
β βββ routes/ β API routes
β βββ utils/ β Helper utilities
β
βββ contributors/ β Contributor records
β βββ <your_roll_no>.txt
β
βββ frontend/ β Mobile frontend
β β .gitignore
β β app.config.ts β Expo app config
β β babel.config.js
β β index.js β App entry point
β β package-lock.json
β β package.json
β β
β βββ .expo/
β β β devices.json
β β β README.md
β β β settings.json
β β
β βββ src/
β β App.js β Root component
β β
β βββ assets/ β Images & fonts
β βββ components/ β Reusable UI
β βββ context/
β βββ navigation/ β App navigation
β βββ screens/ β App screens
β βββ services/ β API services
β
βββ UI-UX/ β Design resources
βββ contributors/ β UI/UX credits
- Submit PRs after reading CONTRIBUTING.md
Reach out to me on Discord, ID: terrormanzero aka terror_quota
Our Server: https://bit.ly/OpencodeDiscord