# 🏄 Cabo Bachelor Party Voting App Real-time group voting for the bachelor party — hotels, golf, nightlife, excursions, and full itineraries. ## Quick Start ```bash cd cabo-voting-app npm install node server.js # → http://localhost:3001 ``` ## Features - **Real-time WebSocket voting** — all clients update instantly - **6 planning categories** — Hotels, Flights, Golf, Nightlife, Excursions, and Full Itineraries - **Budget planner tab** — compares 8, 10, and 12 guys across Budget, Balanced, and Splurge tracks - **Price trend graphs** — each option shows a live line graph from price-watch automation runs - **Source-selectable price tracking** — switch each option between Apple, Costco, KAYAK, and other tracked sources - **Package vs standalone labels** — bundled flight+hotel quotes stay distinct from room-only, flight-only, tee-time, table, charter, and excursion prices - **Decision detail cards** — automation-enriched pricing, features, amenities, and tradeoffs appear on each option - **Add suggestions** — anyone can propose new venues - **Admin approval** — pending options require approval before going live - **Responsive** — works on desktop and mobile ## Data Votes are stored in `data/votes.json` (created on first run). Edit directly or use the admin panel. System seed data auto-refreshes researched options while preserving existing votes and user-added options. Price-watch automation runs append time-series snapshots in `price-watch/history.jsonl`, which the app turns into per-option trend lines and decision detail cards. Automation output should cover hotels, flights, golf, nightlife, and excursions, with `bookingType` and `priceBasis` separating package quotes from standalone booking prices. When a run includes calculated `budgetScenarios` or `derivedItineraries`, the app uses those fresh automation calculations instead of the static seed budget scenarios. For hosted deployments, set `DATA_DIR` or `DATA_FILE` so mutable vote data lives outside the Git checkout. When price-watch automation updates tracked data files in the repository, commit/push those changes and refresh the Ubuntu deployment so the hosted app picks up the latest option details, price history, itinerary calculations, and budget scenarios. ## Deployment The app can run directly under `systemd` with: ```bash PORT=3021 DATA_DIR=/srv/state/cabo-voting node server.js ``` Traefik can then reverse proxy to the chosen host port. See [Gitea Issues](https://gitea.tophermayor.com/TopherMayor/cabo-voting-app/issues) for the UI/UX roadmap. ## Tech Stack - Node.js + Express - WebSocket (ws) - Vanilla JS frontend (no framework) - No database — JSON file persistence