Personal website and travel management platform.
- Frontend: React 18 + TypeScript + Vite
- Backend: FastAPI + SQLAlchemy + Alembic
- Database: MySQL 8
- Auth: Google OAuth (role-based: admin, viewer)
- AI: Claude Haiku for document extraction (flights, car rentals, bookings)
- Storage: Google Cloud Storage (photos, vault files)
- Deploy: Google Cloud Run
- Home — Landing page with rotating intro
- CV — Curriculum vitae with PDF export
- Contact — Contact form (Cloudflare Turnstile anti-spam, Telegram notifications)
- Projects — GitHub repositories
- Travels — Interactive world map with UN/TCC/NomadMania statistics, city markers, flight routes, driving/drone overlays
- Photos — Instagram photo gallery with albums by year, world map with country photo fills
- Trip management — Calendar view, trip CRUD, date picker, destination/city search, participant tracking, vacation balance
- Trip info — Per-country reference cards: power sockets, currency rates, weather, holidays, health requirements, driving side, visa status, emergency numbers
- Transport — Flights (AeroDataBox lookup, ticket PDF extraction), car rentals, train/bus/ferry bookings — all with AI-powered document extraction
- Stays — Accommodation bookings with AI extraction from confirmation PDFs
- Vault — AES-256-GCM encrypted storage: passports, IDs, loyalty programs, vaccinations, travel documents with private file storage
- Fixers — Travel contacts with country assignment and trip integration
- People — Close ones management, postcard addresses with Nominatim autocomplete
- Instagram labeler — Keyboard-driven tool to categorize posts with travel metadata
- ICS calendar feed — Shareable feed for Google Calendar / Apple Calendar
- Viewer role — Read-only trip sharing for family members
Prerequisites: Docker and Docker Compose.
# Start dev environment
docker compose -f docker-compose.dev.yaml up --build
# Frontend: http://localhost:5173
# Backend API: http://localhost:8000cp app/backend/.env.example app/backend/.env.devRequired for full functionality:
GOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRET— OAuth loginTELEGRAM_TOKEN/TELEGRAM_CHAT_ID— Contact form notificationsANTHROPIC_API_KEY— AI document extractionVAULT_ENCRYPTION_KEY— Vault encryption (AES-256-GCM)
make check # runs all checks below
make lint # ruff check + ruff format + eslint + prettier
make typecheck # mypy + tsc --noEmitcd app/backend && pytest tests/ -vapp/
├── frontend/
│ ├── src/
│ │ ├── pages/ # Route-level components
│ │ ├── components/
│ │ │ ├── admin/ # Admin panel tabs and forms
│ │ │ └── trip/ # Trip page tabs and modals
│ │ ├── hooks/
│ │ └── lib/ # Shared utilities (API helper, auth context)
│ └── public/
└── backend/
├── src/
│ ├── auth/ # Google OAuth, sessions
│ ├── admin/ # Vault, instagram, users, fixers
│ ├── travels/ # Trips, flights, stays, transport, stats, photos
│ ├── models/ # SQLAlchemy models
│ └── data/ # Static reference data (health requirements)
├── alembic/ # 57 database migrations
└── tests/ # 30 test modules