Research mesh for Exea Labs: project encyclopedia, forum threads, mentor directory, and direct messages.
- Next.js App Router, React 19, TypeScript
- Meridian design system (see
DESIGN.md) - Firebase Auth, Firestore, Storage
- Deployed on Vercel
cp .env.example .env.local
# Fill in Firebase keys from your Firebase console
npm install
npm run devnpm run emulatorsSet NEXT_PUBLIC_USE_FIREBASE_EMULATOR=true in .env.local.
| Command | Purpose |
|---|---|
npm run dev |
Development server |
npm run build |
Production build |
npm run lint |
ESLint |
npm run typecheck |
TypeScript check |
npm run emulators |
Firebase Auth + Firestore + Storage emulators |
All domain config goes through NEXT_PUBLIC_APP_URL — nothing is hardcoded. Change the subdomain anytime by updating that env var in Vercel and adding the new host to Firebase Auth authorized domains.
| Environment | NEXT_PUBLIC_APP_URL |
|---|---|
| Local | http://localhost:3000 |
| Production | https://<your-subdomain> (e.g. connect.exealabs.org) |
| Preview (optional) | Preview URL or same as production |
Use one Firebase project for local, preview, and production so admins and mentor roles stay shared. Copy the same NEXT_PUBLIC_FIREBASE_* keys into every Vercel environment.
- Create a Firebase project in the console.
- Enable Authentication (Google + Email/Password).
- Create a Firestore database.
- Copy web app config into
.env.localand Vercel env vars. - Deploy rules:
firebase deploy --only firestore - Under Authentication → Settings → Authorized domains, add:
localhost- Your Vercel deployment domain (
*.vercel.app) - Your custom subdomain when it goes live
Set role on users/{uid} in Firestore:
| Value | Access |
|---|---|
student |
Default on sign-up |
mentor |
Shows on /mentors |
admin |
Can feature projects on detail pages |
No admin UI yet — flip roles in the Firebase console until we add one.