A personal map-based travel planning application where you can save places you love, places you want to visit, and get AI-powered travel recommendations.
- Interactive Maps - Visualize your travel plans with Leaflet + OpenStreetMap integration
- Trip Organization - Create and manage multiple trips with custom themes and date ranges
- Smart Tagging - Organize places with flexible custom tags (Favorites, Want to Go, or custom categories)
- AI Travel Assistant - Get personalized recommendations based on your saved places using OpenAI GPT-4o
- Place Management - Add places by searching or clicking on the map with reverse geocoding
- Trip Sharing - Generate public share links for your trips with customizable tag filtering
- Dark Mode - Beautiful light and dark themes
- Responsive Design - Works great on desktop and mobile
- React 18 with TypeScript
- Vite for fast development and building
- TailwindCSS for styling
- shadcn/ui for beautiful, accessible components
- Leaflet + OpenStreetMap for maps (free alternative to Google Maps)
- TanStack Query for server state management
- Wouter for lightweight routing
- Express.js with TypeScript
- SQLite database with Drizzle ORM
- Session-based authentication (mock auth for development)
- OpenAI API for AI travel recommendations
- Nominatim API for place search and geocoding
- Node.js 18+
- npm or yarn
-
Navigate to the project directory
cd TravelPinBoard -
Install dependencies
npm install
-
Set up environment variables (optional) Create a
.envfile in the root directory:# Optional - for AI chat features OPENAI_API_KEY=your_openai_api_key_here # Optional - session secret (defaults to dev secret) SESSION_SECRET=your_session_secret_here
-
Initialize the database
npm run db:push
-
Start the development server
npm run dev
-
Open your browser Visit
http://localhost:3000and start planning your travels!
- Visit
http://localhost:3000 - Click "Start Your Journey" to automatically log in (development mode)
- Create your first trip by clicking "Create Trip"
- Create Trip: Set a name, description, date range, and color theme
- Edit Trip: Update trip details anytime
- Delete Trip: Remove trips you no longer need
- Search: Use the search bar to find places by name
- Map Click: Click anywhere on the map to add a place at that location
- Tagging: Assign places to tags like "Favorites", "Want to Go", or create custom tags
- Open the chat panel on the right
- Ask questions about your travel plans
- Get personalized recommendations based on your saved places
- The AI considers your preferences and trip context
- Click the share button on any trip
- Choose which tags to include in the share
- Generate a public link that others can view (no login required)
# Development
npm run dev # Start development server
# Database
npm run db:push # Push schema changes to database
# Building
npm run build # Build for production
npm run start # Start production server
# Type Checking
npm run check # Run TypeScript type checkingTravelPinBoard/
├── client/ # Frontend React application
│ ├── src/
│ │ ├── components/ # Reusable UI components
│ │ ├── hooks/ # Custom React hooks
│ │ ├── pages/ # Page components
│ │ └── lib/ # Utilities and configurations
├── server/ # Backend Express application
│ ├── services/ # External service integrations
│ ├── db.ts # Database connection
│ ├── routes.ts # API routes
│ ├── storage.ts # Data access layer
│ └── mockAuth.ts # Authentication system
├── shared/ # Shared types and schemas
└── dev.db # SQLite database file
GET /api/login- Login (auto-login in development)GET /api/logout- LogoutGET /api/auth/user- Get current user
GET /api/trips- Get user's tripsPOST /api/trips- Create new tripGET /api/trips/:id- Get trip with placesPATCH /api/trips/:id- Update tripDELETE /api/trips/:id- Delete trip
GET /api/places- Get places (with optional tripId filter)POST /api/places- Create new placePATCH /api/places/:id- Update placeDELETE /api/places/:id- Delete placeGET /api/places/search- Search places via Nominatim
GET /api/tags- Get tags for a tripPOST /api/tags- Create new tagPATCH /api/tags/:id- Update tagDELETE /api/tags/:id- Delete tag
GET /api/chat/messages- Get chat historyPOST /api/chat/message- Send message to AIDELETE /api/chat/messages- Clear chat history
POST /api/trips/:tripId/shares- Create share linkGET /api/trips/:tripId/shares- Get share links for tripGET /api/public/share/:token- View shared trip (public)
- Uses SQLite for local development (file:
dev.db) - Database schema is managed with Drizzle ORM
- Run
npm run db:pushafter schema changes
- Currently uses a mock authentication system for development
- Automatically creates a demo user when you visit
/api/login - Sessions are stored in memory (will reset on server restart)
- Uses Leaflet with OpenStreetMap tiles (free alternative to Google Maps)
- Place search powered by Nominatim API (respects rate limits)
- Supports both place search and reverse geocoding
- Requires OpenAI API key for chat functionality
- Falls back gracefully if API key is not provided
- Chat history is stored per user in the database
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
If you have any questions or run into issues, please open an issue on GitHub.
Happy travels! 🧳