📍 Travel Dashboard & Hotel Ranking

A Next.js web application for comparing hotels, planning travel stops, tracking historical Booking.com prices (including Genius discounts), and rating accommodations with friends using German school grades (1–6).


🌟 Key Features

  • Trip Management & Hotel Assignment: Organize hotels across multiple trips or unassigned stops. When adding a hotel, you can directly choose which trip to assign it to.
  • Automated Metadata & Price Scraping: Adding a Booking.com URL automatically triggers a background BullMQ job that fetches the hotel name, star rating, address, hero image, room size, and prices.
  • On-Demand Stammdaten Refresh: Each hotel card features a "🔄 Stammdaten" button to perform a fast re-scan of metadata and prices on demand.
  • AI Review Summaries: Integrates with local LLMs (via Ollama/n8n) to summarize up to 80+ guest reviews into categorized highlights (Positive, Neutral, Negative, Bathroom inspection).
  • Bathroom Photos & Google Maps Inspection: Upload manual bathroom photos or inspect Google Maps imagery to assess room cleanliness.
  • Price History & Genius Tracking: Records price changes over time with automatic detection of Genius discount badges (-10%).
  • Sights & Attractions: Manage points of interest and calculate distances/durations from each hotel.

🏗️ Architecture & Stack

  • Frontend & API: Next.js (App Router, TypeScript, React)
  • Database: PostgreSQL
  • Task Queue: BullMQ / Redis (shared with scraper-service)
  • Containerization: Docker & Docker Compose

🚀 Getting Started

Prerequisites

  • Docker & Docker Compose
  • Running PostgreSQL & Redis instances

Environment Variables (.env)

DATABASE_URL=postgresql://user:password@host:5432/travel_db
REDIS_HOST=172.17.0.1
REDIS_PORT=6379
APP_WEBHOOK_URL=https://n8n.your-domain.de/webhook/scrape-reviews

Running with Docker Compose

docker compose up -d --build

The app will be accessible at http://localhost:3002.


📡 API Endpoints

  • GET /api/hotels — List all hotels, current prices, and ratings.
  • POST /api/hotels — Create a new hotel and enqueue background metadata scraping.
  • PATCH /api/hotels/[id] — Update hotel properties (e.g. active/parked status).
  • POST /api/hotels/[id]/scan — Trigger on-demand scraping:
    • ?mode=stammdaten (or mode=quick): Fast scan for name, address, rating, price, and images.
    • Default: Full review scan with n8n/LLM review summary.
    • ?debug=true: Generates raw HTML and screenshot dumps in scraper-service.
  • POST /api/jobs/trigger-daily-check — Enqueue batch price updates for all active hotels.
  • POST /api/webhooks/scraper — Webhook receiver for scraped metadata from scraper-service.
  • GET /api/trips / POST /api/trips — Manage trip entities.
  • GET /api/attractions / POST /api/attractions — Manage central sights and hotel assignments.
Description
No description provided
Readme 112 MiB
Languages
TypeScript 98.5%
Shell 1.3%