Travel Companion allows you to manage every aspect of your travel, from transportation and lodging to daily activities and checklists. It features real-time collaboration, budget tracking, and offline support, making it the perfect tool for solo travelers and groups alike.
- Trip Management: Create detailed itineraries with drag-and-drop organization using the timeline view.
- Collaborative Planning: Share trips with friends and family with granular permission controls (View/Edit).
- Budget & Expenses: Track spending in real-time with multi-currency support and categorical breakdowns.
- Documents: Store and link PDF tickets, reservations, and files directly to trip items.
- Offline Mode: Access your full itinerary and saved documents without an internet connection.
- Brainstorming: A collaborative canvas for ideas, notes, and locations before the plan is finalized.
- Calendar: Visual overview of all your upcoming trips.
- Mobile Friendly: Fully responsive design with a dedicated mobile experience, including map integration.
- Frontend: React, Tailwind CSS, Zustand
- Backend: Node.js, Express
- Database: SQLite
- Infrastructure: Docker
- Clone the repository.
- Configure your environment variables in
docker-compose.ymlor create an.envfile. - Run the start script:
The application will be accessible at
./start.sh
http://localhost:5000.
- Install dependencies:
npm run install-all
- Create a
.envfile in the server directory (or root, depending on setup) with the required variables. - Start the development server:
npm run dev
- Frontend:
http://localhost:3000 - Backend:
http://localhost:5000
- Frontend:
To run the application, you must configure the following environment variables.
| Variable | Description | Default | Required |
|---|---|---|---|
NODE_ENV |
Environment mode (production or development) |
development |
No |
PORT |
Port for the backend server | 5000 |
No |
JWT_SECRET |
Secret key for session signing | - | Yes |
FRONTEND_URL |
Public URL of the app (used in emails) | - | Yes |
Required for sending invitations and trip updates.
| Variable | Description | Example |
|---|---|---|
EMAIL_HOST |
SMTP server hostname | smtp.gmail.com |
EMAIL_PORT |
SMTP port | 587 or 465 |
EMAIL_USER |
SMTP username | user@gmail.com |
EMAIL_PASS |
SMTP password or App Password | secret |
EMAIL_FROM |
Sender address | Traveler <noreply@app.com> |
EMAIL_QUEUE_DURATION_MS |
Batch email notification delay (ms) | 3600000 (1hr) |
EMAIL_PROCESS_INTERVAL_MS |
Notification processing interval (ms) | 300000 (5min) |
These variables must be available at build time (or runtime for Docker).
| Variable | Description | Required |
|---|---|---|
VITE_MAPBOX_TOKEN |
Mapbox public token for map views | Yes (if using maps) |
VITE_API_URL |
Backend API URL (for local dev) | No (defaults to /api) |
You can generate read-only API keys from the Profile page to query your own data from external tools (dashboards, widgets, scripts) without exposing your session token.
- Keys are prefixed with
trv_and shown only once at creation — store them somewhere safe. - Send the key in the
Authorizationheader:Authorization: Bearer trv_<your-key> - Keys are limited to
GET/HEADrequests. Any write (POST/PUT/PATCH/DELETE) is rejected. - Keys cannot manage account settings, change passwords, or create/revoke other API keys.
- You can set an optional expiry, and revoke a key at any time from the Profile page.
Common read endpoints useful for widgets:
| Endpoint | Description |
|---|---|
GET /api/auth/me |
Current user |
GET /api/trips |
All trips you can see |
GET /api/trips/:id |
A trip with members, transport, lodging, activities |
GET /api/budgets/trip/:id |
Trip budget + expenses |
GET /api/personal-budgets/trip/:id |
Your personal budget for a trip |
GET /api/checklists/trip/:id |
Trip checklists |
GET /api/brainstorm/trip/:id |
Brainstorm items |
Example:
curl -H "Authorization: Bearer trv_…" https://your-host/api/tripsMIT License.



