Skip to content

krushit1307/CampusConnect

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

421 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

CampusConnect: Every club. Every event. One brutally simple OS.

πŸ—£οΈ Join our Discord Server for all contributors: https://discord.gg/BEMjApACe

License Open Issues PRs Welcome Stars ECSoC 2026

CampusConnect solves the chaos of college clubs juggling WhatsApp groups, spreadsheets, and paper certificates. It provides a single, unified platform for students and organizers to manage events, track memberships, and engage with their campus community seamlessly.

✨ Features

  • Event Management: Create, manage, and promote campus events.
  • RSVP + QR Check-in: Seamless registration and fast, verifiable QR code check-ins.
  • Club Directory: Discover and join various campus clubs in one centralized place.
  • Discussion Feed: Engage with the community through club-specific discussion boards.
  • Certificate Generation: Automatically generate and distribute event certificates.
  • Realtime Updates: Instant notifications and live updates powered by Supabase Realtime.

πŸ› οΈ Tech Stack

Category Technology
Frontend Vite, React, TypeScript, Tailwind CSS
Backend Supabase (Postgres, Auth, Storage, Realtime)
Package Manager npm

πŸ—„οΈ Architecture / Database

CampusConnect stores its data in Supabase (Postgres) and uses Supabase Auth plus Row Level Security to protect access. The schema is defined in supabase/schema.sql and centers on clubs, the members and events they run, and the posts their members write.

Entity-relationship diagram

erDiagram
  PROFILES ||--o{ CLUBS : "creates"
  PROFILES ||--o{ CLUB_MEMBERS : "joins as"
  CLUBS ||--o{ CLUB_MEMBERS : "has"
  CLUBS ||--o{ EVENTS : "hosts"
  CLUBS ||--o{ POSTS : "has"
  PROFILES ||--o{ EVENTS : "creates"
  EVENTS ||--o{ EVENT_RSVPS : "receives"
  PROFILES ||--o{ EVENT_RSVPS : "makes"
  PROFILES ||--o{ POSTS : "authors"
  POSTS ||--o{ COMMENTS : "has"
  PROFILES ||--o{ COMMENTS : "authors"
  EVENTS ||--o{ CERTIFICATES : "issues"
  PROFILES ||--o{ CERTIFICATES : "receives"

  PROFILES {
    uuid id PK
    text full_name
    text avatar_url
    text college
    text bio
    enum role "student | club_admin"
  }
  CLUBS {
    uuid id PK
    text name
    text slug UK
    text description
    uuid created_by FK
  }
  CLUB_MEMBERS {
    uuid id PK
    uuid club_id FK
    uuid user_id FK
    enum role "member | admin"
    enum status "pending | approved"
  }
  EVENTS {
    uuid id PK
    uuid club_id FK
    text title
    text description
    timestamptz event_date
    uuid created_by FK
  }
  EVENT_RSVPS {
    uuid id PK
    uuid event_id FK
    uuid user_id FK
    bool checked_in
  }
  POSTS {
    uuid id PK
    uuid club_id FK
    uuid author_id FK
    text content
  }
  COMMENTS {
    uuid id PK
    uuid post_id FK
    uuid author_id FK
    text content
  }
  CERTIFICATES {
    uuid id PK
    uuid event_id FK
    uuid user_id FK
    text certificate_url
  }
Loading

Core tables

Table Key columns Purpose
profiles id (PK, = auth.users.id), full_name, avatar_url, college, bio, role One row per authenticated user; auto-created by the on_auth_user_created trigger on signup.
clubs id (PK), name, slug (unique), description, banner_url, logo_url, created_by β†’ profiles.id A campus club/society. slug is used for the public /clubs/:slug route.
club_members id (PK), club_id β†’ clubs.id, user_id β†’ profiles.id, role, status Join table linking users to clubs, with a member/admin role and a pending/approved status. Unique per (club_id, user_id).
events id (PK), club_id β†’ clubs.id, title, description, event_date, location, created_by β†’ profiles.id An event hosted by a club.
event_rsvps id (PK), event_id β†’ events.id, user_id β†’ profiles.id, checked_in A user's RSVP to an event, plus a checked_in flag set on QR check-in. Unique per (event_id, user_id).
posts id (PK), club_id β†’ clubs.id, author_id β†’ profiles.id, content A discussion post on a club's feed.
comments id (PK), post_id β†’ posts.id, author_id β†’ profiles.id, content A reply to a post.
certificates id (PK), event_id β†’ events.id, user_id β†’ profiles.id, certificate_url A generated certificate issued to a user for attending an event.

Notes

  • All tables have Row Level Security enabled; the policies in supabase/schema.sql define exactly who can read and write data.
  • posts, comments, and event_rsvps are included in the supabase_realtime publication to power live-updating feed and RSVP behavior.
  • Storage buckets such as avatars, club-banners, event-banners, and certificates are public-read, with writes restricted to the authenticated user's own folder.

πŸš€ Getting Started

  1. Clone the repository:

    git clone https://github.com/krushit1307/CampusConnect.git
    cd CampusConnect
  2. Install dependencies:

    npm install
  3. Set up database & environment variables: Choose one of the following two options to run your database:

    • Option A: Remote Supabase (Default)

      1. Copy .env.example to .env.local:
        cp .env.example .env.local
      2. Fill in your remote hosted Supabase URL and Anon Key.
      3. Apply database migrations to your remote project:
        supabase db push
    • Option B: Local Supabase Container (Recommended for offline development) Follow the Supabase Local Development & Seeding guide below to spin up a local container stack pre-populated with test records.

  4. Start the development server:

    npm run dev

🐳 Running with Docker

Alternatively, you can run the project containerized using Docker. This allows you to build and run the application without needing Node/npm installed locally on your host machine.

Local Development (with Hot-Reloading / HMR)

  1. Set up environment variables:

    cp .env.example .env.local

    Fill in your Supabase URL and Anon Key in .env.local.

  2. Start the development container:

    docker compose up --build

    This will build the dev image and launch the Vite dev server inside the container. The application will be accessible at http://localhost:8080 with volume-mounted hot-reloading (HMR) fully functional.

Production Build & Run

  1. Build the production Docker image:

    docker build --target runner -t campusconnect:latest .
  2. Run the production container:

    docker run -d -p 3000:3000 --env-file .env.local --name campusconnect campusconnect:latest

    The production-built SPA will be served via the static file server (serve -s dist -l 3000) on http://localhost:3000.

πŸ—„οΈ Supabase Local Development & Seeding

Instead of connecting to a remote Supabase instance, you can spin up the full Supabase database stack locally using Docker. This avoids API rate limits and populates your workspace with pre-seeded test data (users, events, clubs, posts, comments).

  1. Start the local Supabase container stack:

    supabase start

    Note: This command requires Docker to be running on your system.

  2. Copy the credentials to .env.local: After the database starts successfully, the CLI will output your local API credentials. Copy these keys and update your .env.local file:

    • VITE_SUPABASE_URL: Set to http://127.0.0.1:54321
    • VITE_SUPABASE_ANON_KEY: Paste the anon key printed by the CLI
    • SUPABASE_SERVICE_ROLE_KEY: Paste the service_role key printed by the CLI
  3. Reset and seed the database: To apply the initial schema and automatically seed the database with test data:

    supabase db reset

    This will completely provision your local database. You can log in using:

    • Admin Account: admin@campusconnect.com / password123
    • Student Account: student@campusconnect.com / password123
  4. Access Supabase Studio: You can view and manage your local database tables by opening the local Supabase Studio dashboard in your browser at http://127.0.0.1:54323/.

πŸ“ Project Structure

  • src/ β€” Contains all frontend React components, pages, hooks, and utilities.
  • supabase/ β€” Database migrations, seed data, and Edge Functions.
  • public/ β€” Static assets like images and fonts.

🀝 Contributing

We welcome contributions! Please see our CONTRIBUTING.md for details on how to get started. This is an ECSoC 2026 project, so we are actively looking for contributors. Check out issues labeled good first issue to begin!

Note

Automated Assignments: We use a bot to manage issue assignments. Simply comment /claim on an issue to assign it to yourself. You have a 30-hour window to submit a Pull Request before the issue is automatically unassigned.

Important

Code Formatting: Before committing and pushing your code, you MUST run npm run lint locally. This will automatically format your files and prevent our CI (GitHub Actions) from failing due to Prettier or ESLint errors. Pull Requests with failing CI checks will not be merged.

πŸ—ΊοΈ Roadmap

  • Phase 1: Core web platform βœ…
  • Phase 2: Contributor feature build (In Progress)
  • Phase 3: AI layer (Q4 2026) β€” AI event recommender, AI post summarizer, RAG chatbot via pgvector

πŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

πŸ‘€ Maintainer

Krushit Prajapati - GitHub Profile

πŸ‘₯ Contributors

πŸ† Hall of Fame (Top 5)

Rank Contributor Contributions
πŸ₯‡
krushit1307
120
πŸ₯ˆ
Aryanbuha890
24
πŸ₯‰
Jivan-Patel
22
4️⃣
Ayush-0918
18
5️⃣
nayanraj864-cmyk
15

πŸ‘₯ All Contributors

About

Resources

Code of conduct

Contributing

Security policy

Stars

15 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors