# Liberia Talent Quest
Liberia's premier talent competition platform. Full-stack Node.js + PostgreSQL system managing
public registration (solo and group entries), audition review, live rounds, real-time voting,
leaderboard, media gallery, and season finale placements — with a 9-role staff RBAC system
and real-time SSE push.
---
## Tech Stack
| Layer | Technology |
|---|---|
| Backend | Node.js 18+ / Express |
| Database | PostgreSQL 14+ |
| Auth | JWT (HttpOnly cookie `ltq_session`, 7-day TTL) |
| Frontend | Plain HTML / CSS / JavaScript (no build step) |
| Real-time | Server-Sent Events (SSE) — leaderboard live updates |
| File uploads | Multer (in-memory) → Cloudinary if configured, else local disk outside the web root in `~/ltq-uploads/` |
| Email | Nodemailer (SMTP, configurable via Superuser dashboard or `.env`) |
| WhatsApp | Meta Cloud API (optional, configurable via Superuser dashboard or `.env`) |
| Media storage | Cloudinary (optional, configurable via Superuser dashboard or `.env`) — falls back to local disk automatically when unset |
---
## Quick Start (local development)
```bash
# 1. Install dependencies
npm install
# 2. Create your .env file
cp .env.example .env
# Edit .env — set DATABASE_URL, JWT_SECRET, and SUPERUSER_* at minimum
# 3. Create the PostgreSQL database and user
createdb ltq
# or: psql -c "CREATE DATABASE ltq;"
# 4. Apply the schema (single source of truth — all tables, columns,
# constraints, and indexes) + seed default categories/criteria + superuser
npm run db:init
# 5. Run one-time data migrations (legacy category remap + contestant numbering backfill)
npm run db:migrate
# 6. Start the server
npm start
# Server runs on
localhost
```
Log in at `
localhost` with the `SUPERUSER_EMAIL` / `SUPERUSER_PASSWORD`
you set in `.env`. **Change the password immediately on first login.**
### (Optional) Load test data / default public content
```bash
npm run db:public # About-page team pro …