A feature-rich, interactive web platform built with Angular 21 and Node.js/Express that allows travelers to log, visualize, and share their journey memories. The application features a dynamic map interface, detailed travel statistics, social feed community, AI-powered nostalgic story generation, and automatic EXIF metadata extraction from photo uploads.
- Dynamic Markers: Custom category markers styled with unique emojis and color schemes (e.g., ποΈ Beach, π Temple, β°οΈ Mountain, π° Fort, π Road Trip).
- Heat Map Mode: Switch to a density heat map view to visualize travel concentration areas.
- Smart Filtering: Live filters to search locations by keywords, favorites, specific categories, or the year visited.
- Geocoding & Search: Auto-complete location queries using the OpenStreetMap Nominatim API.
- Nostalgic Storyteller: Integrates the Google Gemini 2.5 Flash API to generate warm, first-person travel memories (under 240 characters) based on your notes, category, and weather conditions.
- Multi-Language Support: Automatically translate or generate stories in English, Hindi, Spanish, French, Japanese, German, Portuguese, or Arabic.
- Real-time Weather lookup: Queries the OpenWeatherMap API to fetch and store local temperature, humidity, wind speed, and weather conditions for visits.
- EXIF Geotagging: Automatically extracts embedded GPS coordinates and camera/lens profiles (make, model, settings) from uploaded images using
exifr.
- Travel Feed: View public travel logs and journals from other travelers in a global feed.
- Social Mechanics: Follow/unfollow other users, react (like) to visits, and comment on travel posts.
- Shareable Profiles: Set user profiles to public or private and share custom profile URLs (
/user/:username) complete with user stats and interactive map journals.
- Travel Stats: Dashboard indicating total places, trips, media counts, total kilometers traveled, and geographical statistics (countries and states visited).
- Gear Analysis: Breakdown of camera equipment used based on photo EXIF data.
- Timeline View: A chronological timeline history (journal) of all visits, queryable by year.
- Media Gallery: Integrated photo gallery with image/video views and an interactive lightbox.
- Wishlist (Bucket List): Log planned future destinations with estimated target years.
- User Management: View users, promote users to admin status, and terminate accounts.
- System Stats: Overview of global platform usage, database records, and media volumes.
- Framework: Angular 21 (Signals-based state management, standalone components, lazy loading)
- Styling: Tailwind CSS v4, PostCSS, Custom responsive layouts
- Mapping: Leaflet map library & Leaflet Heatmap
- Testing: Vitest, jsdom
- Formatting: Prettier
- Runtime: Node.js & TypeScript v6 (ts-node-dev)
- Framework: Express v5
- Database: MongoDB & Mongoose ORM
- Media Hosting: Multer & Cloudinary API
- APIs & Services: Google Gemini API, OpenWeatherMap API, OSM Nominatim
- Validation: Zod (strict schemas)
- Security: JWT authentication, bcrypt, Helmet (security headers), CORS
Create a .env file in the /backend folder:
PORT=5000
MONGODB_URI=your-mongodb-connection-string
JWT_SECRET=your-jwt-signing-secret
# Cloudinary (Media Hosting)
CLOUDINARY_CLOUD_NAME=your-cloud-name
CLOUDINARY_API_KEY=your-api-key
CLOUDINARY_API_SECRET=your-api-secret
# Smart API Integrations
GEMINI_API_KEY=your-google-gemini-api-key
OPENWEATHER_API_KEY=your-openweathermap-api-keyConfigure endpoints in src/environments/environment.ts:
export const environment = {
apiUrl: 'http://localhost:5000/api/v1', // Local API url
// apiUrl: 'https://travel-memory-map-api.vercel.app/api/v1' // Production URL
};travel-memory-map/
βββ backend/ # Node.js + Express + TypeScript API server
β βββ src/
β β βββ config/ # DB and Environment config
β β βββ middleware/ # JWT auth, validation, error handler
β β βββ modules/ # Module controllers, models, and routes
β β β βββ auth/ # Authentication & Registration
β β β βββ places/ # Geocoded locations
β β β βββ visits/ # Individual logs/visits of places
β β β βββ trips/ # Route sequences linking visits
β β β βββ media/ # Image uploads & EXIF parsing
β β β βββ features/ # Stats, Timeline, Weather, Bucket List, Gemini AI
β β β βββ users/ # Profile management & Social flows
β β β βββ admin/ # Site admin controls
β β βββ services/ # External API handlers (Gemini API)
β β βββ server.ts # Server listener entry
β βββ tsconfig.json
β
βββ src/ # Angular Frontend Application
β βββ app/
β β βββ components/ # Frontend standalone components
β β β βββ landing/ # Landing page (responsive hero & dark mode)
β β β βββ auth/ # Login & Signup flows
β β β βββ dashboard/ # Interactive map, filters, timeline, settings
β β β βββ profile-view/ # Public portfolio view & social actions
β β β βββ admin/ # Administrative console
β β βββ services/ # ApiService (backend client) & ThemeService
β β βββ app.routes.ts # Lazy loaded routing
β β βββ main.ts # App bootstrapping
β βββ environments/ # Dev and production configs
βββ package.json # Frontend dependencies & CLI scripts
βββ tsconfig.json
- Node.js (v18 or higher recommended)
- MongoDB database instance (Local or Atlas)
- Cloudinary, Gemini, and OpenWeatherMap credentials
Navigate to the backend folder, install dependencies, and start the development server:
cd backend
npm install
npm run devThe server will run on http://localhost:5000.
From the root directory, install dependencies and start the Angular development server:
npm install
npm startOpen your browser and navigate to http://localhost:4200/.
To compile the Angular production bundle:
npm run buildTo compile the TypeScript backend source to Javascript:
cd backend
npm run buildTo execute unit tests on the frontend using Vitest:
npm testAll backend endpoints are prefixed with /api/v1.
POST /auth/register- Create a new user account.POST /auth/login- Authenticate a user and return a JWT token.POST /auth/forgot-password- Request a password reset email.POST /auth/reset-password- Reset password using a secure token.
POST /places- Add a new geographical location coordinate. (Auth required)GET /places- List all recorded places. (Auth required)GET /places/:slug- View a specific place by its URL slug. (Auth required)
GET /visits- List all user visits. (Auth required)GET /visits/place/:placeId- Retrieve visits for a specific location. (Auth required)
POST /trips/generate- Automatically generate trip details connecting visits. (Auth required)GET /trips- List all trips. (Auth required)GET /trips/:id- View detailed route metadata of a trip. (Auth required)
POST /media/upload- Upload media (image/video) and run auto-EXIF parser. (Auth required)GET /media- Retrieve user's media library. (Auth required)GET /media/:id- View details for a single media asset. (Auth required)DELETE /media/:id- Delete media from database and Cloudinary storage. (Auth required)
GET /features/stats- Fetch overall travel analytics. (Auth required)GET /features/timeline- Retrieve chronological log history. (Auth required)PATCH /features/places/:id- Update place parameters. (Auth required)PATCH /features/visits/:id- Update a visit record (notes, rating). (Auth required)POST /features/visits/:id/regenerate-story- Request Gemini AI to recreate memory description. (Auth required)GET /features/visits/:id/weather- Fetch weather info from OpenWeatherMap API. (Auth required)GET /features/bucket- Fetch wishlist items. (Auth required)POST /features/bucket- Add wishlist target. (Auth required)PATCH /features/bucket/:id- Edit wishlist details. (Auth required)DELETE /features/bucket/:id- Remove wishlist target. (Auth required)
GET /users/profile- Fetch current user's profile detail. (Auth required)PATCH /users/profile- Update bio, name, or visibility settings. (Auth required)POST /users/change-password- Update account password. (Auth required)DELETE /users/profile- Permanently terminate user account. (Auth required)GET /users/public/:username- Fetch public user profile and stats dashboard.POST /users/:username/follow- Follow/unfollow target user. (Auth required)GET /feed- Retrieve global activities feed.POST /feed- Share a visit log to the global feed. (Auth required)POST /feed/:id/like- React to a shared feed post. (Auth required)POST /feed/:id/comments- Append a comment to a post. (Auth required)
GET /admin/stats- Platform global usage analytics.GET /admin/users- Fetch user directory.PATCH /admin/users/:id/role- Toggle user administrative role.DELETE /admin/users/:id- Terminate a user account.
Contributions to Travel Memory Map are welcome! To contribute:
- Fork the repository.
- Create a feature branch:
git checkout -b feature/amazing-feature. - Commit your changes:
git commit -m 'feat: add amazing feature'. - Push to the branch:
git push origin feature/amazing-feature. - Open a Pull Request.
Distributed under the ISC License. See the backend package.json for details.