Skip to content

About

🌐 Official website for codeXperts, a student coding club at Seneca Polytechnic. React/Next.js on Vercel, FastAPI on Heroku, Supabase for database and auth, Cloudinary for images. Problem publishing, solution submissions, member management, events, and announcements.

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Repository files navigation

 β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•—  β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—
β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β•β•β•β•šβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β•šβ•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•”β•β•β•β•β•
β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—   β•šβ–ˆβ–ˆβ–ˆβ•”β• β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•   β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—
β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•   β–ˆβ–ˆβ•”β–ˆβ–ˆβ•— β–ˆβ–ˆβ•”β•β•β•β• β–ˆβ–ˆβ•”β•β•β•  β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—   β–ˆβ–ˆβ•‘   β•šβ•β•β•β•β–ˆβ–ˆβ•‘
β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β• β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘
 β•šβ•β•β•β•β•β• β•šβ•β•β•β•β•β• β•šβ•β•β•β•β•β• β•šβ•β•β•β•β•β•β•β•šβ•β•  β•šβ•β•β•šβ•β•     β•šβ•β•β•β•β•β•β•β•šβ•β•  β•šβ•β•   β•šβ•β•   β•šβ•β•β•β•β•β•β•

A real-world Agile team project β€” 6 members, 6-week sprint cycle, full-stack web app.

Next.js React Supabase FastAPI Tailwind CSS


Demo


What We Built

The codeXperts Club official website β€” a members-only platform for a coding club at Seneca Polytechnic. Built end-to-end by a 6-person team following Agile practices over a 6-week sprint.

Feature Description
Google OAuth + RBAC 4-tier role system (Public β†’ Member β†’ Executive β†’ Admin) with Supabase RLS enforcement
Coding Problems Weekly problems on /problems (markdown editor or Word/PDF document mode); exec/admin CRUD; members read-only
Solutions Workspace /solutions list + /solutions/:id Monaco editor; Run via Judge0 across six languages (Python, Java, C, C++, JavaScript, TypeScript), Submit upsert, Community accordion viewer
AI Code Review Gemini Flash-Lite reviews a submission for Big O complexity and duplicated logic, plus static hints for forbidden constructs; gated behind passing the sample tests and a per-member daily limit
QR Attendance Admin generates a session token β†’ members scan to check in β†’ auto-expires
Schedule Page Google Calendar API integration β€” synced events with subscribe/download for members
Member Directory Filterable profile cards with cohort, school, role badges, and per-field visibility controls
Activity Heatmap GitHub-style contribution graph per member, combining submissions and attendance
Events Page Past and upcoming events from Supabase; exec/admin inline CRUD with Cloudinary cover/gallery; detail pages with markdown body, lightbox gallery, and prev/next nav
Our Mentor Public welcome letter from the founder; portrait stored on Cloudinary and editable by executive/admin
Member Profiles Per-member profile page with bio, social links, and self-edit mode
Announcements Public board with Post View (markdown, prev/next nav) and List View (table, pagination); admin/exec create and delete

Stack & Key Decisions

Layer Choice Why
Frontend Next.js 16 (App Router) SSR for schedule/calendar pages; app router for per-route auth guards
Styling Tailwind CSS Rapid iteration across 6 contributors without CSS conflicts
Auth + DB Supabase Google OAuth out of the box; RLS policies enforce RBAC at the DB level β€” no leaking data through API mistakes
Backend FastAPI (Heroku) Lightweight proxy for Judge0 code execution and QR token validation; decoupled from Vercel edge
AI Review Gemini Flash-Lite Cheap enough to run per submission; the system prompt is scoped to complexity and duplication only, so it coaches without handing over the answer
Deployment Vercel + Heroku Zero-config preview deploys per PR on Vercel; Heroku for persistent Python backend

Team

Name Role
Paul PM / Full-Stack (Monaco Editor, Judge0 integration) / UI/UX
Kai Frontend
Dave Backend (FastAPI / Heroku / Deployment) / Frontend
Gary Backend (Supabase / DB & Auth)
Judy Frontend
Andra Frontend / Backend

System Architecture

Frontend (Next.js β€” Vercel)
β”‚
β”œβ”€β”€ Supabase
β”‚   β”œβ”€β”€ Auth (Google OAuth only)
β”‚   └── PostgreSQL
β”‚       β”œβ”€β”€ profiles       β†’ id, name, email, role, school, cohort, status, bio,
β”‚       β”‚                     linkedin, github, avatar_url, profile_visibility (JSONB)
β”‚       β”œβ”€β”€ problems       β†’ id, title, description, file_url, created_at
β”‚       β”œβ”€β”€ submissions    β†’ profile_id, problem_id, code, language, ai_feedback
β”‚       β”œβ”€β”€ sessions       β†’ token, expires_time, is_active
β”‚       β”œβ”€β”€ attendances    β†’ profile_id, session_id, checked_at
β”‚       β”œβ”€β”€ announcements  β†’ author_id, title, content, created_at
β”‚       └── events         β†’ title, description, body, event_date, location, campus,
β”‚                             cover_image_url, gallery_urls, author_id
β”‚
└── FastAPI (Heroku)
    β”œβ”€β”€ /health            β†’ service health check
    β”œβ”€β”€ /execute           β†’ proxy to Judge0 CE (RapidAPI) for code execution
    β”œβ”€β”€ /execute/samples   β†’ run member code against the problem's sample tests
    β”œβ”€β”€ /evaluate          β†’ forbidden-construct hints + Gemini Big O / duplication review
    β”œβ”€β”€ /submissions       β†’ upsert member solutions to Supabase
    └── /attendance/verify β†’ QR token validation

Role-Based Access Control:

Public (Unauthenticated)
  └── Member (Approved)
        └── Executive
              └── Admin
Role Access
Public Landing, public announcements, events
Member Dashboard, member directory, problem submissions
Executive Post problems, manage sessions, events CRUD
Admin User approval, role management, executive position assignment for Our Team, member CSV export for Excel, full access

Onboarding flow: Google Sign-In β†’ draft β†’ Submit application β†’ pending β†’ Admin approval β†’ member

Apply supabase/migrations/20261008120000_application_submission.sql before deploying this application version. It adds major and self-reported Discord participation, returns incomplete pending profiles to draft, and preserves approved members. Complete legacy pending applications remain pending; an administrator or the applicant must fill in their major before approval. Never infer submission from a Google email or a first name alone.

Signup writes go through the authenticated submit_application database function. It derives the user ID from the session, validates required fields, and saves the profile and pending status in one transaction. Cancel does not submit or delete the Google account. A failed request retains form inputs, and a timed-out submission is checked against the stored fields before showing success.

Run npm test for isolated PostgreSQL migration/RPC tests and signup/auth UI tests. No production credentials or production data are used by these tests.

Apply supabase/migrations/20261008150000_optional_phone_and_rejections.sql after the initial onboarding migration for optional phone numbers and rejection history. Phone is validated only when supplied. New rejections require a reason (up to 1,000 characters); the server saves the reason, reviewer, timestamp and rejected status atomically. Admin's Rejected applications list includes earlier rejected accounts, but their missing historical dates/reasons are shown as not recorded. Applicants can read their own rejection details; other members cannot. The York Discord invite is maintained in src/config/socialLinks.js.


Agile Process

6-person team, weekly sprints, Saturday standups at 7:30 PM via Google Meet. Each PR is reviewed before merging to develop; develop merges to main at sprint close.

Planning β†’ Design β†’ Development β†’ Testing β†’ Review & Release
   ↑                                               β”‚
   └───────────────── next sprint β—€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
Sprint Contribution Report β€” Total
───────────────────────────────────
Name    Issues Contribution
───────────────────────────────────
Paul    30     β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ

Dave    8      β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ

Kai     7      β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ

Gary    7      β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ

Andra   4      β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ

Sid     3      β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ

Judy    2      β–ˆβ–ˆβ–ˆβ–ˆ

───────────────────────────────────
Week 1 β€” Foundation & Setup

Planning

  • Defined 6-week roadmap and MVP scope Β· Created GitHub Issues Β· Assigned tasks across FE/BE Β· Set up GitHub Projects Kanban board

Design

  • Finalized sitemap and page visibility rules Β· Produced Figma wireframes for all 8 pages Β· Finalized DB schema (profiles, problems, submissions, sessions, attendances, announcements) Β· Defined navbar structure and social link config

Development

  • Next.js + Tailwind project setup Β· Supabase project created + Google OAuth configured Β· RLS policies drafted Β· Vercel + Heroku pipelines connected Β· Placeholder pages scaffolded for all routes

Testing

  • Google login β†’ pending user flow tested end-to-end Β· Vercel preview deploy verified Β· Environment variable setup confirmed across team

Review & Release

  • Sprint retrospective completed Β· Foundation merged to develop Β· Preview URL shared with team

Week 1 Demo

Sprint Contribution Report β€” Week 1
──────────────────────────────────────
Name    Done/All  Contribution
──────────────────────────────────────
Paul    6/6       β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ

Gary    3/3       β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ

Dave    3/3       β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ

Sid     1/1       β–ˆβ–ˆ

Kai     1/1       β–ˆβ–ˆ

Andra   1/1       β–ˆβ–ˆ

Judy    0         

──────────────────────────────────────
Week 2 β€” Auth Flow & Public Pages

Planning

  • Sprint goal defined: complete auth flow and build all public-facing pages Β· Issues #14 (role-based navbar), #15 (Google OAuth login), #20 (Join Us modal) scoped and assigned Β· Design system tokens scoped as prerequisite for all UI work

Design

  • Members page structure defined Β· Individual profile page spec (/members/:id) Β· Self-edit mode with per-field visibility controls Β· Student/Graduate status toggle Β· Stitch wireframes finalized for all member-facing views

Development

  • Design system initialized: color tokens, Inter/Montserrat fonts, base UI components (#64, #66, #67) Β· Role-based navbar with social hover dropdowns (#14) Β· Google OAuth login + pending screen (#15) Β· Homepage built: hero section, Elfsight Instagram embed, About section Β· feature/auth-role-guard: ProtectedRoute middleware, PENDING/EXECUTIVE roles, RoleGuard refactored (#65) Β· RLS policies finalized for all Supabase tables (#70) Β· feature/join-modal-issue-20: Google OAuth signup modal with campus/cohort/phone fields and profile completion (#72)

Testing

  • Google OAuth β†’ pending screen β†’ admin approval β†’ member role flow tested end-to-end Β· Protected Route enforcement validated Β· RLS policy enforcement verified on Supabase Β· All public pages reviewed on Vercel preview

Review & Release

  • 7 PRs reviewed and merged to develop (#64, #65, #66, #67, #70, #71, #72) Β· Sprint 2 retrospective completed Β· Auth flow and all public pages live on Vercel preview

Week 2 Demo

Sprint Contribution Report β€” Week 2
──────────────────────────────────────
Name    Done/All  Contribution
──────────────────────────────────────
Paul    4/4       β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ

Kai     4/4       β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ

Dave    3/3       β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ

Andra   2/2       β–ˆβ–ˆβ–ˆβ–ˆ

Sid     1/1       β–ˆβ–ˆ

Gary    1/1       β–ˆβ–ˆ

Judy    0         

──────────────────────────────────────
Week 3 β€” Schedule Page & Timezone Bugs

Planning

  • Issue #18 (Schedule page) scoped and carried forward Β· Judy onboarded as Frontend

Design

  • 3-Layer Depth System designed (L0 #F9F9F9 β†’ L1 #EAEAEA β†’ L2 #DBDBDB) and documented in design-system.md Β· Schedule page spec fully rewritten to match implementation Β· Tailwind custom depth tokens defined (bg-bg-layer1/2/2Hover)

Development

  • feature/schedule-page-issue-18: server-side iCal parser (/api/calendar) with RRULE expansion and EXDATE support Β· Schedule page rebuilt with Google Calendar embed, custom month nav, event list with start/end time, and event detail modal (Google Maps link) Β· UTCβ†’Toronto timezone conversion Β· Join flow converted from dedicated route to Navbar modal (/join β†’ redirect)

Testing

  • EXDATE VALUE=DATE timezone day-shift bug found and fixed Β· UTC time offset bug (01:30 UTC displaying as 1:30 AM instead of 9:30 PM EDT) caught and fixed Β· Copilot AI review: 5 issues addressed (race condition, RRULE UNTIL boundary, dead code, React key, modal scroll lock) Β· Vercel preview QA passed

Review & Release

  • PR #78 opened with Copilot automated review Β· All review comments triaged and addressed Β· Issue #18 implementation summary posted Β· develop merge pending final approval

Week 3 Demo

Sprint Contribution Report β€” Week 3
──────────────────────────────────────
Name    Done/All  Contribution
──────────────────────────────────────
Paul    2/2       β–ˆβ–ˆβ–ˆβ–ˆ

Dave    2/2       β–ˆβ–ˆβ–ˆβ–ˆ

Judy    2/2       β–ˆβ–ˆβ–ˆβ–ˆ

Sid     1/1       β–ˆβ–ˆ

Kai     1/1       β–ˆβ–ˆ

Gary    1/1       β–ˆβ–ˆ

Andra   0         

──────────────────────────────────────
Week 4 β€” Auth Hardening, JoinModal Overhaul & DB Schema

Planning

  • Sprint 4 scope locked: complete JoinModal signup flow, fix auth/navbar regressions, extend DB schema for members and problems Β· UserChip (avatar + role badge in navbar) scoped as auth UX milestone Β· Executive role admin access gap flagged

Design

  • Signup flow redesigned: scrollable modal with fixed header, prefix-input pattern for GitHub/LinkedIn, cohort stored as ordinal Β· Navbar UserChip layout finalized: [Avatar] [Role badge] [Log out] for desktop; avatar + hamburger on mobile top bar

Development

  • JoinModal overhaul (#88): added first_name, last_name, nickname, school, cohort, phone, status, company, occupation, linkedin, github fields; GitHub/LinkedIn as prefix + username; auto-fills from Google OAuth metadata; cohort stored as ordinal
  • DB schema (#87): added cohort, phone, status, occupation to profiles; difficulty, category, created_by to problems; updated_at to submissions β€” migrations run in Supabase
  • UserChip (#95): UserChip component added to navbar β€” Google profile photo with initials fallback, role badge (P/M/E/A), applied to desktop and mobile top bar
  • Navbar bug fixes (#97, #98): navbar buttons no longer disappear on interaction; user role now displays correctly after login; bfcache PKCE fix (back button after OAuth no longer breaks login state); duplicate click guard on Login button
  • signOut reliability (#96): replaced router.push('/') with window.location.href for full page reload β€” prevents Supabase token refresh timer surviving sign-out

Testing

  • Google OAuth β†’ pending β†’ approval β†’ member role flow re-validated after JoinModal changes Β· UserChip rendering tested across desktop and mobile breakpoints Β· DB migration applied and column presence verified in Supabase

Review & Release

  • 5 issues closed (Paul: 4, Gary: 1) Β· Sprint 4 feature branch growing toward main merge Β· DB migrations committed to supabase/migrations/
Sprint Contribution Report β€” Week 4
──────────────────────────────────────
Name    Done/All  Contribution
──────────────────────────────────────
Paul    5/5       β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ

Gary    1/1       β–ˆβ–ˆ

Sid     0         

Kai     0         

Andra   0         

Dave    0         

Judy    0         

──────────────────────────────────────
Week 5 β€” Sprint 4 Merge, Events, Profile Page & Design Overhaul

Planning

  • Sprint 4 merged to main (PR #122) β€” 5 feature areas, 4 DB migrations, 0 build errors Β· Post-merge: Copilot security review triaged; 3 issues addressed in follow-up PRs Β· Events full implementation and Profile page scoped as W5 deliverables Β· Design token audit kicked off to unify all pages before launch Β· Custom domain codexperts.ca purchased via Cloudflare (#130) and configured on Vercel (apex + www)

Design

  • Design system token cleanup: all hardcoded hex and default Tailwind colors replaced with semantic tokens across 22 files Β· Responsive container pattern (max-w-6xl mx-auto px-4 sm:px-6) standardized across every page Β· Navbar flattened to direct links; social icons always visible on mobile Β· Badge system finalized: Graduate β†’ bg-link-bg text-gold, Executive β†’ bg-success-bg text-success; unified across Navbar, UserAvatar, MemberCard

Development

  • Sprint 4 release (PR #122): Members Page (live Supabase data, combinable filters), Problems Page (Post + List view, Markdown, exec delete/download), Footer + Contact Form (Gmail SMTP via nodemailer), About Us page, Announcements layout
  • Events Section: main events page redesigned (upcoming + past split); individual event detail page at /events/[id] with description, date, location, tracks, gallery, prev/next nav; PastEventsCards component
  • Profile Page (/members/[id]): live Supabase fetch via fetchMemberById(); avatar with initials fallback, name, nickname, status badge, conditional LinkedIn/GitHub icons; bio section; edit button visible only to profile owner
  • Pending page: school-specific club signup prompt β€” Seneca live link, York Coming Soon; managed via socialLinks.js config (#133)
  • Executive role fix (#77): canAccessAdminRoutes updated to include Executive β€” admin routes no longer 403 for execs
  • Problems table columns (#107): week, due_date, school columns added to problems table via migration
  • Security hardening: contact form HTML + SMTP header injection sanitized (escapeHtml, sanitizeHeader); adminApproval moved to server-side /api/admin/approve using service role key β€” client can no longer trigger RLS-bypassed updates directly

Testing

  • Copilot review on PR #122: 3 security issues triaged β†’ resolved in #123 (contact form injection), #124 (admin approval RLS), #125 (replyTo header sanitization) Β· Graduate badge dark-bg regression caught and fixed Β· JoinModal double-submit race condition guarded Β· Members cohort filter value mismatch ("Fall 2024" vs DB "1") fixed Β· Status filter 'graduate' β†’ 'graduated' DB value corrected

Review & Release

  • Sprint 4 merged to main Β· 17 follow-up PRs merged (security patches, Events, Profile, design overhaul, domain) Β· codexperts.ca and www.codexperts.ca live

Week 5 Demo

Sprint Contribution Report β€” Week 5
──────────────────────────────────────
Name    Done/All  Contribution
──────────────────────────────────────
Paul    3/3       β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ

Kai     1/1       β–ˆβ–ˆ

Andra   1/1       β–ˆβ–ˆ

Sid     0         

Gary    0         

Dave    0         

Judy    0         

──────────────────────────────────────

GitHub Projects β€” Kanban Board

Column Description
Backlog Unscheduled items
Ready Committed for current sprint
In Progress Actively being developed
In Review PR open, awaiting review
Done Merged and deployed

Issue & PR Convention

  • Issue title format: [Type] Short description β€” types: feat, fix, docs, refactor, chore
  • All PRs require at least 1 reviewer approval before merge
  • PRs are linked to their corresponding issue

Branch Strategy

Branch Purpose
main Production-ready code only
develop Integration branch β€” all features merge here first
feature/* Individual feature or fix branches

Never commit directly to main. All changes go through develop via reviewed PRs.


Deployment

Layer Platform Domain
Frontend Vercel codexperts.ca Β· www.codexperts.ca
Backend Heroku auto-assigned Heroku URL
Database & Auth Supabase managed

Custom domain codexperts.ca is live. Both apex (codexperts.ca) and www.codexperts.ca resolve correctly.


Folder Structure

codexperts-web/
β”œβ”€β”€ public/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ app/                 # Next.js App Router
β”‚   β”‚   β”œβ”€β”€ layout.js        # Root layout (Navbar included)
β”‚   β”‚   β”œβ”€β”€ page.js          # / Home
β”‚   β”‚   β”œβ”€β”€ about/           # /about
β”‚   β”‚   β”œβ”€β”€ mentor/          # /mentor β€” founder welcome letter
β”‚   β”‚   β”œβ”€β”€ schedule/        # /schedule
β”‚   β”‚   β”œβ”€β”€ api/             # Next.js API routes
β”‚   β”‚   β”‚   β”œβ”€β”€ calendar/    # GET /api/calendar β€” iCal fetch + parse (no API key)
β”‚   β”‚   β”‚   └── problems/    # Document upload, DOCXβ†’PDF preview/convert
β”‚   β”‚   β”œβ”€β”€ announcements/   # /announcements
β”‚   β”‚   β”œβ”€β”€ events/          # /events
β”‚   β”‚   β”œβ”€β”€ join/            # /join β€” redirects to / (join flow is Navbar modal)
β”‚   β”‚   β”œβ”€β”€ problems/        # /problems (member only)
β”‚   β”‚   β”œβ”€β”€ solutions/       # /solutions (member only)
β”‚   β”‚   β”œβ”€β”€ members/         # /members (member only)
β”‚   β”‚   └── admin/           # /admin (admin only)
β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”œβ”€β”€ common/          # Navbar, Footer
β”‚   β”‚   β”œβ”€β”€ mentor/          # Mentor photo editor
β”‚   β”‚   β”œβ”€β”€ layout/          # PageContainer (About-style max width)
β”‚   β”‚   β”œβ”€β”€ auth/            # ProtectedRoute, RoleGuard
β”‚   β”‚   └── ui/              # Button, Card, Modal
β”‚   β”œβ”€β”€ config/
β”‚   β”‚   └── socialLinks.js   # Campus social media links config
β”‚   β”œβ”€β”€ lib/
β”‚   β”‚   └── supabase.js      # Supabase client singleton
β”‚   β”œβ”€β”€ hooks/               # useAuth, useRole
β”‚   β”œβ”€β”€ contexts/            # AuthContext
β”‚   β”œβ”€β”€ services/            # Supabase service modules
β”‚   └── utils/               # Helper functions, constants
β”œβ”€β”€ docs/
β”‚   β”œβ”€β”€ design/              # Design system, sitemap, page-level specs
β”‚   β”œβ”€β”€ guidelines/          # code-conventions, git-workflow, data-loading, judge0-rapidapi-setup
β”‚   β”œβ”€β”€ meeting-notes/       # Sprint meeting records
β”‚   β”œβ”€β”€ sprints/             # Sprint plan + weekly specs
β”‚   └── schema/              # Database schema definitions
β”œβ”€β”€ backend/
β”‚   β”œβ”€β”€ main.py              # FastAPI entry point
β”‚   β”œβ”€β”€ auth.py              # Supabase JWT + member+ role gate
β”‚   β”œβ”€β”€ services/            # Judge0 client, Gemini review, rate limiting, Supabase REST
β”‚   β”œβ”€β”€ Procfile             # Heroku web process
β”‚   β”œβ”€β”€ .profile.d/          # Optional dyno env (LibreOffice via Heroku buildpack)
β”‚   β”œβ”€β”€ requirements.txt
β”‚   β”œβ”€β”€ .env.example
β”‚   └── routers/             # documents (DOCXβ†’PDF), execute, execute/samples, evaluate, submissions
β”œβ”€β”€ scripts/
β”‚   └── sprint-report.js     # CLI tool β€” GitHub Issue contribution report per member
β”œβ”€β”€ package.json
└── README.md

Getting Started

Prerequisites: Node.js v18+, a Supabase project with Google OAuth and PostgreSQL enabled.

git clone https://github.com/codexperts2024/codexperts-web.git
cd codexperts-web
npm install
cp .env.example .env.local
# Fill in your Supabase config values
npm run dev

App runs at http://localhost:3000.

Environment variables:

Variable Required Description
NEXT_PUBLIC_SUPABASE_URL Yes Supabase project URL
NEXT_PUBLIC_SUPABASE_ANON_KEY Yes Supabase anon key
SUPABASE_SERVICE_ROLE_KEY Backend only Never expose to client
NEXT_PUBLIC_API_URL Yes Heroku FastAPI URL
CONTACT_EMAIL_USER Yes Gmail address for contact form SMTP
CONTACT_EMAIL_PASS Yes Gmail App Password (not your account password) β€” generate at myaccount.google.com/apppasswords

To add York University's club signup link: open src/config/socialLinks.js and set the url field in the clubSignup array for York University.

Sprint contribution report:

npm run report          # all-time closed issues per member
npm run report -- 4     # Week 4 breakdown (closed vs. open)

Built with intention. Deployed with confidence.

Reapplication rollout

Apply supabase/migrations/20261008180000_allow_reapplication.sql after the optional-phone/rejection migration before deploying reapplication UI. Rejected applicants may edit and submit again; only a valid submission returns them to pending, and previous rejection records remain intact. Google sign-in requests account selection; Switch Google account signs out this local session before starting OAuth.

About

🌐 Official website for codeXperts, a student coding club at Seneca Polytechnic. React/Next.js on Vercel, FastAPI on Heroku, Supabase for database and auth, Cloudinary for images. Problem publishing, solution submissions, member management, events, and announcements.

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Contributors

Languages