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
It was all Worth It : Love U