Modernized port of umd-pixel-old to a Firebase-based stack with a refreshed UI.
- Next.js (App Router), TypeScript
- Firebase Auth (Slack custom tokens), Firestore, Cloud Functions, Hosting
- Tailwind CSS + shadcn/ui (neutral theme)
- React Query for data, React Hook Form + Zod for admin forms
- Install:
npm install - Run dev:
npm run dev(http://localhost:3000) - Lint:
npm run lint - Functions:
npm install --prefix functionsthennpm run build --prefix functions
- Shadcn UI: responsive navbar, cards, tables, dialogs
- Admin dashboards:
- Events: search/sort, bulk pixel set/delete, attendee add via ID/email/paste, excused approvals
- Members: search/sort, bulk select/add/delete, add to event, attendance toggles, pixel history chart, rank, per-semester pixel adjustment
- Activities: coffee chats/bonding/other with multipliers per member
- Settings: semester/leaderboard, grant admin; archive/reset guidance
- Member dashboard: pixels + delta, rank, pixel log, activities table, leaderboard toggle
- Functions: includes activities in pixel recalculation; Slack auth callable; triggers for events/excused/activities
- Set
currentSemesterIdin Admin Settings; pixels, events, activities, and adjustments scope to that semester. - Recalculate all scores after changing semesters to reset totals.
- Add members via Slack picker (no manual add).
- Pixel adjustments are per-semester; saving triggers a single-user recalc.
- Events start with no attendees; add via Members page or Manage attendees on events.
- Excused requests are semester-scoped; approve/reject in Admin Dashboard.
- Add event detail modal with per-attendee status controls.
- Optional: show names/emails in all multiplier/attendee listings via cached lookups.
- Add
semesterIdtoexcused_absencesdocs and query withwhere("semesterId", "==", currentSemesterId)to avoid cross-semester scans.