The RCC Engagement Analytics Dashboard is a full-stack analytics platform designed to help the Responsible Computing Club (RCC) understand community growth, engagement, diversity, and retention over time. The system ingests member registration data and event attendance data, normalizes and reconciles them across multiple sources, and exposes chart-ready analytics APIs used by a dashboard interface. The goal is to provide clear, decision-ready insights for RCC leadership without manual spreadsheet analysis.
- How many members does RCC have? How many members are active?
- Who makes up the RCC community (academics, year levels)?
- Are events attracting a diverse audience?
- How well does RCC retain attendees across multiple events?
- KPI cards (total members, active %, growth rate)
- Line charts (cumulative membership growth over time)
- Pie charts (major category distribution, class year distribution)
- Event-level stacked charts (attendance diversity by major category)
- Bar charts ( explaining how many people attended 0, 1, 2, 3, or 4+ events)
- Grouped / stacked views by major category
- Members register through a standardized form β stored in members
- Admin uploads event attendance CSVs β parsed and normalized
- Attendance is linked to members when possible
- Active membership is recalculated automatically
- Dashboard fetches analytics via read-only endpoints
- Charts render using pre-aggregated backend data
- Next.js 16 (App Router) and React 19
- Tailwind CSS v4, shadcn/ui, Base UI
- next-themes, sonner, motion
- FastAPI + Uvicorn backend (Python 3.10+)
- TypeScript and Zod-based env validation
- Bun and Turborepo
- Supabase auth & Supabase (PostgreSQL)
RCC Dashboard and Engagement Tool is a Turborepo monorepo for a dashboard web app and shared packages.
Turborepo/
βββ apps/
β βββ web/ # Next.js web app
β βββ server/ # FastAPI backend
βββ packages/
βββ config/ # Shared TS config
βββ env/ # Shared env schemas (server/web/native)
- Frontend fetches analytics via GET endpoints
- Admin actions (event imports) use POST multipart/form-data
- Backend returns fully computed JSON
Google Form Submission
β
Google Apps Script (onFormSubmit / onEdit)
β
Supabase (members table)
CSV & Event Form Upload
β
FastAPI Import Layer
β
Supabase (PostgreSQL)
β
Analytics SQL / RPC Functions
β
REST Analytics Endpoints
β
Next.js Dashboard UI
GET /analytics/overview
Returns:
- Total members
- Active members + percentage
- 30-day growth rate
- Monthly cumulative growth time series
GET /analytics/mission
Returns:
- Member distribution by major category
- Member distribution by class year
- Top events with attendance diversity breakdown
GET /analytics/retention
Returns:
- Attendance frequency buckets (0, 1, 2, 3, 4+)
- Overall distribution
- Distribution by major category
POST /api/import/event-attendance
- Content-Type: multipart/form-data
- Required fields:
- import_type = "event_attendance"
- title
- starts_at
- event_kind
- file (CSV)
- Optional:
- event_type
- location
- committee
Returns:
- Event ID
- Validation summary
- Success summary
- Skipped rows with reasons
- Warnings
- Members are identified by email match with members.email
- Non-members are still included in:
- Event diversity analytics
- Retention analytics
- Only members can become active
- A member becomes active if they attend qualifying events
- is_active_member and active_member_start_date are updated automatically
| Field | Behavior |
|---|---|
| Major | Falls back to member record or Other/Unknown |
| Program | Inferred from class year, major tokens, or member record |
| Class Year | Normalized or set to Unknown |
| Check-in time | Stored as NULL if malformed |
| Duplicate emails | Skipped during import |
Lowercased, whitespace removed, used as global unique identifier
Free-text majors are normalized into major_normalized & major_category (Technical, Business, Humanities & Arts, Health Sciences, Other/Unknown)
Derived using:
- Explicit class year (Freshman β Undergraduate)
- Major tokens (e.g., βM.S.β β Graduate)
- Member record fallback
- members: Stores registered RCC members and normalized demographic data.
- events: Stores event metadata (no attendance).
- event_attendance: Stores attendee engagement, supports members + non-members.
- profiles: Controls platform access (admin vs member).
Prerequisites: Bun 1.2+, Python 3.10+, Node.js (for Turbo)
Install dependencies:
bun install
bun run server:install # creates .venv in apps/server (no pip yet)
cd apps/server
source .venv/bin/activate # Windows: .venv\Scripts\Activate
pip install -r requirements.txtRun all apps (web + server):
bun run devRun only one app:
bun run dev:web
bun run dev:serverOpen:
- Web: http://localhost:3000
- Server: http://localhost:8000 (docs at /docs)
- Python 3.10+
- bun (or npm/pnpm) for repo scripts
- Node.js (for Turbo)
From repo root:
bun install # JS deps
bun run server:install # makes .venv in apps/serverInstall Python deps (once the venv exists):
cd apps/server
source .venv/bin/activate # Windows: .venv\Scripts\Activate
pip install -r requirements.txt# via Turbo (recommended, repo root)
bun run dev
# or directly (backend only)
cd apps/server
source .venv/bin/activate
python -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000- API base: http://localhost:8000
- Swagger: http://localhost:8000/docs
- OpenAPI JSON: http://localhost:8000/openapi.json
server:installonly creates the venv; it does notpip install.- Turbo assumes
pythonresolves inside the venv; activate it beforebun run dev. - For fresh shells, re-run the venv activation step.
python: command not found: usepython3 -m venv .venvthen activate.No module named uvicorn:pip install -r requirements.txtinside the venv.- Turbo exits 127: ensure the venv is active so
pythonis on PATH.
| OS | Command |
|---|---|
| macOS / Linux | source .venv/bin/activate |
| Windows | .venv\\Scripts\\activate |
Edit apps/web/.env as needed:
SERVER_URL=http://localhost:8000Shared env schemas live in packages/env/src/*.ts.
bun run dev: Start all apps in dev modebun run dev:web: Start the web app onlybun run build: Build all appsbun run check-types: Typecheck across the repobun run server:install: Create the server venv inapps/server(no pip)
- Improved major data collection and analytics
- Event cohort analysis (first-time vs. returning)
- Attendance trend forecasting
| Name | Role / Title | Key Contributions |
|---|---|---|
| Julia Husainzada | ||
| Asmita Dulla | ||
| Izabella | Backend / Data Developer | Did a little bit of everything related to analytics and data |
| Samriddhi Matharu | ||
| Emily Thach | Frontend developer | Dashboard design & ui/ux, data schema, customized ui charts/components |
| Pouya Anvari | Full-Stack developer | Figma design, UI wiring, API & Endpoint Aggregation |
| Om Shah | Builder. | Can write Code and owns a computer |