Soham Mundhe 25966209 | Nguyen Quang Tu 26139333 | Mrinal Parashar 26048254
BeachPlease is a canvas-first Sydney beach recommendation app. It helps users choose and plan a Sydney beach day through a visual beach canvas, live conditions, an interactive coastal map, Gemini-generated plans, saved plan management, and an admin dashboard for managing the underlying data.
- User lands on the cloud opening screen.
- User clicks
ENTER EXPERIENCE. - The app opens into the canvas-first explore experience.
- Users browse circular/scattered beach image tiles.
- Hovering a tile reveals name and basic context.
- Clicking a tile opens the
BeachInfoTile. - Users can enter a mood and generate a beach plan.
- The backend ranks beaches using stored beach data, live Open-Meteo conditions, and Gemini.
- Authenticated users can save, replay, annotate, and delete plans.
- Map mode shows an interactive coastal view with search, filters, and live beach conditions.
- Cluster mode shows curated beach stacks.
- Admin users can access
/adminto manage users, plans, beaches, and activity data.
- React + Vite
- React Router
- Axios
- Tailwind CSS
- shadcn/ui-style local components
- Framer Motion
- Instrument Sans
- Leaflet
- Sonner toasts
- FastAPI
- Motor
- MongoDB Atlas
- JWT with
python-jose passlibbcrypthttpx- Open-Meteo
- Gemini
- APScheduler condition refresh
- Cloud opening experience
- Circular beach image canvas
- Hover/click beach tiles
- Right-side beach info tile
- Mood input and Create Plan flow
- Interactive coastal map with search and filters
- Live weather and marine conditions
- Gemini beach plan generation
- Auth and Google OAuth
- Saved plans, notes, replay, and delete
- Profile settings
- Mood clusters / cluster stack browsing
- Admin dashboard
- Admin beach CRUD
- Admin user role management
- Admin plan deletion
- User activity tracking
- NSW suburb search
- Sanitized MongoDB JSON exports under
database/
| Requirement | How BeachPlease satisfies it |
|---|---|
| Modern frontend library | React 19, Vite, React Router, Tailwind CSS, shadcn-style local UI components, Framer Motion |
| Backend with database | FastAPI backend with Motor and MongoDB Atlas |
| SPA behaviour | frontend/index.html is the single HTML entry point; React Router swaps views without full page reloads |
| Authentication | Email/password registration and login use bcrypt password hashing and JWT access tokens; Google OAuth is also supported |
| At least three CRUD entities | Users, beach plans, mood clusters, and beaches all support database-backed CRUD operations |
| Live search / dynamic filtering | Beach explore/map surfaces filter and inspect beach data dynamically; suburb selection uses the backend suburb search proxy |
| Admin/user profile | Admin dashboard manages users, plans, beaches, roles, and activity history; profile page lets users update/delete their own account |
| Error handling | Frontend forms use Zod + React Hook Form and toast/error states; backend returns structured FastAPI errors |
| Database export | database/ contains sanitized MongoDB JSON exports for users, beaches, plans, clusters, and user activities |
- Python 3.11 or newer
- Node.js 20 or newer
- MongoDB Atlas connection string, or another reachable MongoDB instance
- Gemini API key for generated beach plans
- Google OAuth client ID only if testing Google sign-in
git clone https://github.com/sohamdesigns98-prog/BeachPlease.git
cd BeachPleasecd backend
cp .env.example .envOn Windows PowerShell, use this instead of cp if needed:
Copy-Item .env.example .envFill backend/.env:
MONGODB_URI=your_mongodb_connection_string
DATABASE_NAME=beachplease
JWT_SECRET=use_a_long_random_secret
GEMINI_API_KEY=your_gemini_api_key
CLIENT_URL=http://localhost:5173
GOOGLE_CLIENT_ID=your_google_oauth_client_id_optional
ADMIN_EMAILS=admin@example.comADMIN_EMAILS is comma-separated. To test the admin dashboard, register or log in with one of these emails, then open /admin.
macOS/Linux:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn main:app --host 127.0.0.1 --port 8000Windows PowerShell:
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
uvicorn main:app --host 127.0.0.1 --port 8000Backend health check:
http://127.0.0.1:8000/healthRun this once after MongoDB is configured:
python -m app.seed.seed_beachesOptional image metadata refresh:
python -m app.seed.seed_beach_imagesOpen a second terminal:
cd frontend
cp .env.example .envWindows PowerShell:
Copy-Item .env.example .envFill frontend/.env:
VITE_API_BASE_URL=http://localhost:8000
VITE_USE_MOCKS=false
VITE_GOOGLE_CLIENT_ID=your_google_oauth_client_id_optionalFor Google OAuth, VITE_GOOGLE_CLIENT_ID must match GOOGLE_CLIENT_ID in backend/.env.
npm install
npm run devFrontend URL:
http://127.0.0.1:5173/- If login/register fails, check
JWT_SECRETandMONGODB_URI. - If generated plans fail, check
GEMINI_API_KEY. - If admin is blocked, check that the logged-in email is listed in
ADMIN_EMAILS. - If CORS fails, check
CLIENT_URL=http://localhost:5173and use the frontend URL above. - If the database starts empty, run
python -m app.seed.seed_beaches.
| Area | Create | Read | Update | Delete |
|---|---|---|---|---|
| Users | POST /auth/register, POST /auth/google |
GET /users/me, GET /admin/users |
PATCH /users/me, PATCH /admin/users/{user_id} |
DELETE /users/me, DELETE /admin/users/{user_id} |
| Beach plans | POST /plans, POST /plans/save-snapshot |
GET /plans, GET /plans/{plan_id}, GET /admin/plans |
PATCH /plans/{plan_id}, PATCH /plans/{plan_id}/replay |
DELETE /plans/{plan_id}, DELETE /admin/plans/{plan_id} |
| Mood clusters | POST /clusters |
GET /clusters, GET /clusters/{cluster_id} |
PATCH /clusters/{cluster_id} |
DELETE /clusters/{cluster_id} |
| Beaches | Seed scripts / POST /admin/beaches |
GET /beaches, GET /beaches/{id}, GET /beaches/slug/{slug} |
PATCH /admin/beaches/{beach_id} |
DELETE /admin/beaches/{beach_id} |
| Conditions | n/a | GET /conditions, GET /conditions/{slug}, GET /conditions/map |
refresh/cache update internally | n/a |
| Activity log | backend service writes | GET /admin/activities |
n/a | n/a |
BeachPlease/
backend/
main.py FastAPI app entrypoint and router registration
requirements.txt Python dependencies
.env.example Backend environment variable template
app/
auth.py JWT, password hashing, current-user/admin dependencies
config.py Environment configuration
database.py MongoDB connection helpers
models/ Pydantic request/response models
routes/ Auth, users, beaches, conditions, plans, clusters, admin APIs
services/ Gemini, ranking, weather, activity log, suburb validation
seed/ Beach seed data and image metadata scripts
frontend/
index.html Single HTML entrypoint for the SPA
package.json React/Vite dependencies and scripts
.env.example Frontend environment variable template
src/
App.jsx React Router route tree
api/ Axios API wrappers
components/ Reusable UI, explore, map, plan, cluster, auth components
components/map/ Leaflet map implementation and map helpers
context/ Auth context and token/profile state
pages/ Login, register, explore, saved plans, profile, admin
styles/ Feature-level CSS files imported by `index.css`
utils/ Display, payload, adapter, and error helpers
database/ Sanitized MongoDB JSON export files for submission
README.md Setup, feature, CRUD, and workload documentation
PRD.md Product requirements and design rationaleHealth:
GET /healthGET /db-check
Auth:
POST /auth/registerPOST /auth/loginPOST /auth/logoutPOST /auth/google
Users:
GET /users/mePATCH /users/meDELETE /users/me
Beaches:
GET /beachesGET /beaches/{beach_id}GET /beaches/slug/{slug}
Conditions:
GET /conditionsGET /conditions/GET /conditions/{slug}GET /conditions/mapGET /conditions/test
Plans:
POST /plansPOST /plans/previewPOST /plans/save-snapshotGET /plansGET /plans/{plan_id}PATCH /plans/{plan_id}PATCH /plans/{plan_id}/replayDELETE /plans/{plan_id}
Clusters:
POST /clustersGET /clustersGET /clusters/{cluster_id}PATCH /clusters/{cluster_id}DELETE /clusters/{cluster_id}
Admin:
GET /admin/dashboardGET /admin/activitiesGET /admin/usersPATCH /admin/users/{user_id}DELETE /admin/users/{user_id}GET /admin/plansDELETE /admin/plans/{plan_id}POST /admin/beachesPATCH /admin/beaches/{beach_id}DELETE /admin/beaches/{beach_id}
Suburbs:
GET /suburbs/search?q={query}&state=NSW
Ranking / AI support:
POST /rank/testPOST /ai/test-plan
MONGODB_URIDATABASE_NAMEJWT_SECRETGEMINI_API_KEYCLIENT_URLGOOGLE_CLIENT_IDADMIN_EMAILS
VITE_API_BASE_URLVITE_USE_MOCKSVITE_GOOGLE_CLIENT_ID
Never commit real .env files.
cd backend
source venv/bin/activate
python -m app.seed.seed_beachesThe database/ folder contains sanitized MongoDB JSON exports for beaches, users, plans, clusters, and user activities. User emails, password hashes, OAuth subjects, and token-like fields are redacted or anonymized before export.
To regenerate the export after configuring backend/.env:
cd backend
python -m app.seed.export_databaseThis allocation is based on the repository history and current file ownership.
| Member | Main responsibilities | Representative files |
|---|---|---|
Nguyen Quang Tu (125725836+tuwang2301@users.noreply.github.com) |
Authentication, JWT/profile flow, admin authorization, admin dashboard, activity logging, saved plans, clusters, data exports, validation/error handling | backend/app/auth.py, backend/app/routes/auth_routes.py, backend/app/routes/user_routes.py, backend/app/routes/admin_routes.py, backend/app/routes/plan_routes.py, backend/app/routes/cluster_routes.py, backend/app/services/activity_log.py, frontend/src/pages/Admin.jsx, frontend/src/pages/Login.jsx, frontend/src/pages/Register.jsx, frontend/src/pages/Profile.jsx, frontend/src/components/SavedModeShell.jsx, database/*.json |
Soham (soham.mundhe@student.uts.edu.au) Main Webapp Architecture |
Visual product direction, landing/canvas experience, cluster and generated-plan UI, saved-plan UI, walkthrough/help, audio, map integration polish, documentation updates | frontend/src/components/LandingIntro.jsx, frontend/src/components/CircularBeachCanvas.jsx, frontend/src/components/CircularBeachTile.jsx, frontend/src/components/ClusterStackGallery.jsx, frontend/src/components/GeneratedPlanJournal.jsx, frontend/src/components/help/HowToUseOverlay.jsx, frontend/src/pages/MainExperience.jsx, frontend/src/pages/ResultExperience.jsx, frontend/src/styles/*.css, README.md, PRD.md |
Mrinaluts (Mrinal.Parashar@student.uts.edu.au) |
Map exploration contribution and geospatial interaction support | frontend/src/components/map/leaflet/LeafletBeachMap.jsx, frontend/src/components/map/leaflet/LeafletMapMode.jsx, frontend/src/components/map/leaflet/LeafletMapSidebar.jsx, frontend/src/components/map/leaflet/leafletMapUtils.js, map-related commits |
The workload is intentionally split across backend/security, frontend/product experience, and mapping/interaction areas so the assignment does not rely on a single member.
For the required video, keep it under 3 minutes and show the browser UI:
- Register or log in, then show the profile/account state.
- Explore beaches on canvas/map and use live/dynamic beach details.
- Generate a beach plan, then save it.
- Open saved plans, edit notes/replay/delete a plan.
- Create/update a cluster and add/remove a beach.
- Log in as an admin and briefly show dashboard, users, beaches, plans, and activities.
cd frontend
npm run buildcd backend
source venv/bin/activate
python -m compileall .- No real crowd API; crowd is estimated.
- Gemini and Open-Meteo require API/network availability.
- Admin routes require authenticated admin role/email configuration.
- Some images may use fallback assets.