Culture Concierge — AI-powered cultural discovery platform for African cities (Lagos, Abuja, Nairobi, Kigali). Automated venue/event scraping, travel advisories, and admin CMS.
# Culture Concierge
AI-powered cultural discovery platform for African cities — Lagos, Abuja, Nairobi, and Kigali. Discovers venues, events, and travel advisories via automated scrapers and Gemini, presented in a mobile-first web app with a full admin CMS.
## Architecture
```
├── Backend/ Express + Mongoose API (port 5000)
│ ├── src/app.js Express app: security, CORS, rate limits, route mounting
│ ├── src/server.js Entry point (dotenv, DB connect, listen)
│ ├── src/config/ db, clerk, cloudinary config
│ ├── src/controllers/ Route handlers (events, venues, admin, ai, system, ...)
│ ├── src/middleware/ Clerk JWT auth, admin guard, rate limiter, error handling
│ ├── src/models/ Mongoose schemas (Event, Venue, CityAdvisory, Email)
│ ├── src/routes/ Express route modules (mounted in app.js)
│ ├── src/scrapers/ Event + venue + advisory importers
│ ├── src/services/ clerk, scraper, email, ai services
│ ├── src/utils/ Sanitizers, image processor, travel brief updater
│ └── render.yaml Render deploy config (builds frontend + installs Chrome)
│
└── Frontend/ React + Vite SPA (port 5173)
└── src/
├── admin/ CMS dashboard (events, venues, scrapers, settings, ...)
├── lib/ API base URL + Clerk token helper
└── *.jsx Public pages (Cities, Venues, Happenings, Travel Brief)
```
The backend also serves the built frontend (`Frontend/dist`) in production, so a single Render service can host both.
## Setup
### 1. Clone & install
```bash
cd Backend
npm install
cd ../Frontend
npm install
```
### 2. Environment
Copy `.env.example` to `.env` in both `Backend/` and `Frontend/`.
**Backend `.env`** requires:
| Var | Source |
|---|---|
| `MONGO_URI` | MongoDB Atlas connection string |
| `GEMINI_API_KEY` | Google AI Studio |
| `CLERK_SECRET_KEY` | Clerk dashboard |
| `ADMIN_EMAILS` | Comma-separated admin email list (authorizes CMS access) |
| `CLOUDINARY_*` | Cloudinary (image uploads) — optional |
| ` …