The Problem
Travel planners need a self-hostable alternative to cloud-based POI mappers and itinerary tools, avoiding subscription costs and data silos while retaining control over maps and collaboration.
What This Does
This repository provides a minimalist map tracker and trip planner. Core capabilities include marking points of interest on interactive maps, organizing multi-day itineraries, and sharing trips with companions. The backend lives in backend/trip/ (Python, FastAPI/Starlette), with API routes split across routers/auth.py, routers/trips.py, routers/places.py, and routers/settings.py. Data is persisted via SQLAlchemy ORM, with Alembic migrations in backend/trip/alembic/versions/. The user-facing UI is under docs/src/pages/index.tsx (React) and docs/src/components/HomepageFeatures/index.tsx, which consumes the API. A separate mcp-server/server.py provides model-context-Protocol integration. Geocoding providers (Google, OSM, Photon) are wired in backend/trip/utils/providers/.
How It Is Wired
Execution starts at backend/trip/main.py, which instantiates the FastAPI app and includes routers. A request flows: HTTP entry → main.py router dispatch (e.g., routers/places.py) → CRUD operations through backend/trip/db/core.py or utility functions like utils/providers/google.py for API calls → SQLAlchemy session → Alembic-managed schema. The widest blast radius is the router layer; adding a new feature typically requires a new router file or extending an existing one, touching models, a new migration, and the frontend component. The MCP server (mcp-server/server.py) hooks into the same data model but operates as a separate service. The React frontend (docs/src/pages/index.tsx) mounts at the root and renders map components, place lists, and trip-planning forms, communicating via REST endpoints under /api/.
How To Use It
Setup: Deploy with Docker Compose: docker-compose up -d (root docker-compose.yml). No code changes are required for a basic run.
Configuration: Set environment variables for OIDC authentication and provider API keys. The configuration docs reference config.py or .env for these values; the README notes “Refer to the configuration documentation… to set up OIDC authentication and other keys.”
Running it: After containers start, the app is available at http://localhost:8080 (port mapping in docker-compose.yml). The first run may require creating an admin user via the OIDC flow or direct DB setup as per docs.
Real-World Use
A small travel agency self-hosts the app to let coordinators map POIs and build day-by-day itineraries. Staff add locations via the UI (leveraging OSM/Photon providers), attach notes or images, and generate shareable trip links for clients. The OIDC config restricts access to agency accounts only. When a trip is finalized, the export feature (docs/docs/trips-planner/trip-export.md) generates a static itinerary PDF or JSON for distribution.
Code Health & Issues
Static analysis found: 364 files total; Python 85 files, TypeScript 68 files; 1 test file (location not specified in the summary); 100 documentation files. CI/CD pipelines exist in .github/workflows/ (Docker publish and GitHub Pages deploy). License file license.txt is present. Lockfiles (package-lock.json, requirements.txt) are present. No structural red flags were detected.
Observed gaps: Only one test file is present, suggesting limited test coverage. The repository is a fork of itskovacs/trip with 0 stars, which may indicate low community activity or a fresh fork.
The Bottom Line
The repo delivers a functional, self-hosted trip-planning stack with a clean Python backend and React UI, packaged for one-command Docker deployment. It’s well-suited for individuals or teams prioritizing data privacy and offline control. The main trade-off is limited testing and a small contributor base; anyone relying on it for critical planning should assess the migration path from the upstream itskovacs/trip project and verify long-term maintenance comfort.