Product Requirement Document

Campus Clubs

One place for SRM clubs to find members, run events, take attendance, share results and give certificates and badges.

JointhenRegisterthenCheck inthenResultthenCertificatethenBadge
Version1.0
Date3 October 2026
Built byOne student developer (frontend, backend and deploy)
ForAll SRM campuses · @srmist.edu.in
StatusPhase 0 live. Phase 1 backend done (33 tests pass). Frontend next.

What is inside

  1. The problem
  2. Why I am solving it
  3. Who will use it
  4. What it must do
  5. How I will build it (my approach)
  6. The tech stack
  7. How the parts fit together
  8. Keeping it safe
  9. Handling many people at once
  10. My three jobs: frontend, backend, deploy
  11. The phases and where each one goes live
  12. How every release ships
  13. Risks and plans
  14. Where I learn from
  15. Word list

1. The problem

SRM has many clubs, and most of them sit under the engineering departments. Every club runs on the same tools: Google Forms and WhatsApp groups. These tools do not talk to each other, so a lot gets lost.

A story from today

Riya is in second year. She wants to join the Robotics Club.

  1. She sees a Google Form link in a WhatsApp group. She fills it in. She never hears back.
  2. A month later, a friend tells her about a robotics contest. She was not in the right WhatsApp group, so she almost missed it.
  3. On the day, the room changes. The message gets lost in 200 other messages. She goes to the wrong room.
  4. She takes part and her team comes second. The result is never posted anywhere.
  5. Later, a company asks for proof. She has nothing to show.

What goes wrong, step by step

StepTool used todayWhat goes wrong
Finding new membersGoogle FormEvery club makes its own form with its own rules. Only the leader sees the answers. People who apply never hear back.
Telling people about an eventWhatsApp groupMessages get buried. People outside the group never know. Room or time changes get missed.
Signing up for an eventAnother Google FormNo seat limit. Same person signs up twice. No way to check students from other colleges.
AttendancePaper or a sheetSlow and easy to fake. Often never saved.
ResultsNowhereWinners are said out loud on stage and then forgotten.
Proof you took partHand-made certificate, if anyEasy to fake. Nobody can check if it is real.
The root problem: each step lives in a different tool, so nothing flows from one step to the next. The data breaks between join, sign up, attend, result and proof.

2. Why I am solving it

What I learned from CampusConnect

Keep (it worked well)Fix (weak spots I found in their code)
  • Clean layers: routes, then logic, then database
  • Club leader is a membership, not a login type
  • Certificates with a QR code that links to a public check page
  • The AI only phrases answers. Code picks the clubs, so the AI cannot make them up.
  • Anyone could sign up as an admin. Here, only I can make an owner, from the command line.
  • Anyone could type a fake college email. Here, everyone must type a code sent to that inbox, so only the real owner of an @srmist.edu.in email gets in as an SRM student.
  • Login tokens lasted 28 days in browser storage. Here, sessions sit in a safe cookie that page code can't read.
  • Certificate numbers could be guessed. Here, they are long random codes.
  • Attendance was ticked by hand. Here, it is a QR scan.

3. Who will use it

There is no "campus admin". Each club runs itself. I (the developer) only decide which clubs get in.

RoleWhoWhat they can do
Platform OwnerMe, the developerSay yes or no to new clubs. Pause a club. Give a club to a new leader. Set a few rules for everyone, like the most clubs one student can join. Cannot see inside clubs.
Club AdminClub president or headRuns everything for their own club: hiring rules, the hiring queue, events, approving outside guests, results, certificates and posts. Can make other members Core or Admin.
Core MemberClub core teamMakes events, scans people in at the door, posts event updates. Cannot change club rules or roles.
MemberAnyone picked by the clubSees member-only events and posts.
SRM StudentAnyone with @srmist.edu.inSigns in with a code sent to their SRM email. Applies to clubs. Signs up for events and is confirmed right away. Earns certificates and badges.
Outside GuestStudent from another collegeSigns in with a personal email and a 6-digit code. Can sign up for open events, but must wait for the event team to say yes. Cannot join clubs.

4. What it must do

A. Hiring club members (replaces Google Forms)

B. Events (replaces WhatsApp)

C. One flow: sign up, check in, result, certificate, badge

D. One club list, one profile, real proof

E. Badges, like GitHub

Not in version 1: paid events, chat between students, a phone app from the app store (the website works well on phones) and AI features. The AI club finder comes after the main flow works.

How we know it works

GoalTarget
Clubs hire without Google Forms3 pilot clubs run a full hiring drive in the app
Leaders save timeFrom "event ended" to "certificates sent" in under 10 minutes
Results are never lostEvery event in the app has public results
Students use their proofStudents share their profile link or badge card
It stays up during a rush3,000 sign-ups in 60 seconds with no errors and no overbooking

5. How I will build it (my approach)

  1. Start from the problem, not the code. Every feature must fix a step in the "what goes wrong" table.
  2. Build thin slices. Each phase works from start to end: backend, frontend, tests and a live link. No half-built parts sitting around.
  3. Ship every phase. Every phase ends with something live that people can click.
  4. Safe by default. The database itself blocks bad data, like a winner who never checked in. Every permission goes through one check function.
  5. Test the rules. Each important rule gets a test. Tests run by themselves on every change.
  6. Real users early. Start with 3 clubs at one campus (KTR), learn, then open to all.
  7. Write it down. The docs, the database file and this PRD live in the GitHub repo and are updated with each phase.

6. The tech stack

I chose these tools for three reasons: they are used by real companies (good to learn), they are safe by default, and they can grow without a rewrite.

PartToolWhy, in simple words
Website (frontend)Next.js (React + TypeScript)The most used way to build React sites. Pages like the club list load fast and show up on Google.
Look and feelTailwind CSS + shadcn/uiReady-made, clean parts (buttons, forms, tables) that work for everyone, including screen readers.
Forms and dataReact Hook Form, Zod, TanStack QueryChecks forms before sending. Keeps data fresh and retries when the network is slow.
QR scannerBrowser cameraCore members scan in their phone browser. Nothing to install.
Server (backend)FastAPI (Python)Fast. Checks every input. Makes API docs by itself. Python has the best tools for PDFs, QR codes and AI.
DatabasePostgreSQLStrong rules, so bad data can't get in. Handles many people at once.
Database codeSQLAlchemy 2 + AlembicTalks to the database from Python. Alembic keeps track of database changes.
Fast memoryRedisHolds logins, counts tries (to stop spam) and holds the job line.
Background jobsarq (on Redis)Slow work like 500 certificates or emails happens in the back, so pages stay fast.
FilesCloudflare R2Stores certificates and pictures. No fee each time someone downloads.
EmailResend or Amazon SESSends sign-in codes and updates. Cheap and reliable.
Testspytest, Vitest, PlaywrightCheck the server, the website parts, and full clicks in a real browser.
Auto checksGitHub ActionsRuns all tests on every push.
Watching for errorsSentryTells me when something breaks for a user, and where.

Where each part lives

PartHomeWhy
Project page and docsGitHub PagesFree. Good for a simple page that never changes by itself. It can't run a server, so it holds only the project page, this PRD and the API docs.
The web appVercelMade for Next.js. Every pull request gets its own preview link.
The API and job workerRender (or Railway)Runs a Python server all the time. Vercel is not made for always-on workers.
DatabaseNeon (PostgreSQL)Free to start, with backups.
RedisUpstashFree to start, pay only for use.

7. How the parts fit together

PeopleStudents, club teams, outside guests and me, on a laptop or phone browser
Web app on Vercel (Next.js)Pages, forms, QR scanner. Talks to the API with a safe login cookie.
API on Render (FastAPI)Checks who you are. Checks what you are allowed to do. Follows the rules. Writes the audit log.
PostgreSQL (Neon)Users, clubs, hiring, events, results, certificates, badges
Redis (Upstash)Logins, spam limits, the job line
Job workerMakes certificates, sends emails and notifications, gives badges
R2 storageCertificate PDFs, logos, pictures
Email codesA code sent to an @srmist.edu.in inbox proves the person is at SRM
Email serviceSign-in codes, updates

The code inside the API

FolderWhat it holds
app/routers/The web addresses (endpoints). Short. They call the checks and the rules.
app/permissions.pyOne can(user, action, club) check used by every endpoint.
app/security/Sessions, email codes, spam limits (and Google sign-in, switched off for now).
app/models.pyThe database tables as Python classes.
db/schema.sqlThe full database. The single source of truth.
tests/One test for each important rule.

8. Keeping it safe

DangerWhat we do
Someone pretends to be an SRM studentEveryone signs in with a 6-digit code sent to their email. Only a person who can open an @srmist.edu.in inbox becomes an SRM student. Look-alike addresses become outside guests.
Someone makes themselves an adminNo sign-up form can make an owner. Only I can, from the command line. Club Admins come only from approved clubs.
Someone steals a loginThe login is a random code in a locked cookie that page code can't read. You can log out of all devices.
A bad site tricks your browser into a clickEvery change needs a secret token that only our own website knows (CSRF protection).
Someone guesses email codesCodes expire in 10 minutes, die after 5 wrong tries, and requests are limited.
A friend shares a check-in QR on WhatsAppThe QR code changes every 30 seconds and works only once.
Someone fakes a certificateEvery certificate has a long random code and a public check page.
A leader does something wrongEvery admin, core and owner action is written to an audit log: who, what, before, after and when.
Bad data gets inEvery input is checked. The database also blocks bad data on its own, like signing up twice or a winner who never came.
Private data leaksCollect only what we need. Students can delete their account. This follows India's DPDP Act 2023.

9. Handling many people at once

The hard moment is not "many users in total". It is a rush: a hackathon opens 300 seats, and 3,000 people click in the same minute.

  1. No overbooking. A seat is taken in one database step that only works if a seat is left. People can't sign up twice.
  2. Many copies of the server. The server keeps nothing in its own memory. Logins sit in Redis, so 1 copy or 20 copies all work the same.
  3. Slow work goes to the job line. The leader clicks "Publish results" and gets an answer at once. Certificates and emails come a minute later.
  4. Public pages are saved near users (CDN). The club list, results and profiles load fast and barely touch the server.
  5. Database care. Indexes for common searches, page-by-page lists, and a pool of open connections.
  6. Practice the rush. Before the first big event, a test tool (k6) fakes 3,000 sign-ups in 60 seconds.

10. My three jobs: frontend, backend, deploy

I do all three jobs myself. Writing them down keeps each job clear, and shows what to hand over if more people join later.

Frontend Engineer: "what people see and click"

Backend Engineer: "the rules and the data"

Developer / DevOps Engineer: "getting it live and keeping it up"

Who does what in each phase

PhaseFrontendBackendDeveloper / DevOps
0Pick colors and fonts; simple landing pageDone: schema and planRepo, CI, GitHub Pages, Vercel and Render accounts
1Sign in, setup, club list, club request, hiring form and queueDone: sign-in, clubs, roles, hiring (33 tests)First Vercel and Render deploy, Neon, Upstash, email service with a real sender domain
2Event pages, sign-up, guest approval queue, live updatesEvents, seats, guest approval, updates, notificationsEmail service, push keys
3QR scanner, results page, certificate check pageCheck-in codes, results, certificate PDF jobsR2 storage, job worker, rush test
4Profiles, badge wall, badge cardBadge rules engine, profile APICDN cache for public pages
5Fixes from pilot feedbackFixes from pilot feedbackMonitoring, backups, launch checklist
6AI club finder chatGrounded AI (Claude API)Cost limits on AI

11. The phases and where each one goes live

Each phase ends with a live link. GitHub Pages holds the project page and docs. Vercel holds the real web app. Every pull request also gets its own Vercel preview link to test before merging. Times are for one student working part-time.

Phase 0: Set up about 1 week

We buildGitHub repo, folders, auto tests, project landing page, this PRD.
Goes live onGitHub Pages: project page, PRD and docs.
Done whenThe landing page is live, and tests run on every push.

Phase 1: Accounts, clubs and hiring backend done

We buildEmail-code sign-in for everyone, first-time setup (campus, department, year), club requests, my review queue, club roles, hiring drives with forms, the application queue and its steps.
Goes live onVercel: first version of the web app. Render: the API.
Done whenA real student signs in with a code sent to their SRM email, requests a club, I approve it, and the club hires one member in the app.

Phase 2: Events about 2–3 weeks

We buildMake and publish events, sign up with seat limits, guest approval queue, live updates ("room moved"), email and phone notifications.
Goes live onVercel update.
Done whenA club runs a real event sign-up with no Google Form and no WhatsApp message needed.

Phase 3: Check-in, results and certificates about 2–3 weeks

We buildQR check-in with changing codes, results page, certificate PDFs made in the background, a public certificate check page.
Goes live onVercel update. The rush test (3,000 sign-ups in 60 seconds) is run.
Done whenA leader goes from "event ended" to "certificates sent" in under 10 minutes.

Phase 4: Badges and profiles about 2 weeks

We buildPublic profile pages, badge rules, badge levels (x2, x3, x4), badge check links, the badge card for GitHub and LinkedIn.
Goes live onVercel update. Public pages are cached on the CDN.
Done whenA student adds their badge card to their GitHub README.

Phase 5: Pilot and launch about 3–4 weeks

We buildFixes from real use. Help pages. Error alerts, backups and uptime checks.
Goes live onVercel on the real web address. Pilot with 3 clubs at KTR, then open to all SRM campuses.
Done whenThe 3 pilot clubs say they no longer need Google Forms.

Phase 6: AI club finder (later) about 2 weeks

We build"Tell me what you like" chat that suggests clubs and events. The code picks the clubs, and the AI only writes the reply, so it can't make clubs up.
Goes live onVercel update.
Done whenStudents find a club through the chat, and costs stay inside a set limit.

12. How every release ships

  1. Small branch. One feature per branch, for example feat/event-signup.
  2. Pull request. Explain what changed and why, in plain words.
  3. Auto tests. GitHub Actions runs every backend and frontend test. Red means stop.
  4. Preview link. Vercel makes a preview link. I click through the change on a phone and a laptop.
  5. Merge. Merging to main deploys the web app (Vercel) and the API (Render) by itself.
  6. Database changes. Alembic runs the change before the new API starts. Take a backup first.
  7. Check. Look at Sentry and the health check for 15 minutes after each release.
  8. Update the docs. Update the README status table and this PRD on GitHub Pages.

Before each phase goes live

Check
All tests pass.
No secrets in the code.
New endpoints use the can() check and write to the audit log.
Pages work on a small phone screen.
A database backup was taken today.
Rollback plan: redeploy the last good version from Vercel and Render with one click.

13. Risks and plans

RiskPlan
Clubs keep using WhatsApp out of habitStart with 3 friendly clubs. Make the app faster than a form. Let leaders share event links into WhatsApp.
One person (me) holds the owner roleMore owners can be added from the command line, so the app can be handed over after I graduate.
Free hosting limitsWatch usage. Move to paid plans only when real use needs it.
Sign-in codes land in SRM spamSend from a real domain with SPF, DKIM and DMARC set up. Test with real SRM inboxes before the pilot. Show "check your spam folder" on the code screen.
SRM blocks Google sign-inAlready happened. Everyone uses email codes. Google sign-in is built but switched off, and can come back if SRM IT allows it.
Wrong campus or department listCheck the list with the college before the pilot. It is easy to change.
Big rush breaks sign-upRush test before every big event. Seat logic is checked by the database itself.
Too much work for one personThin phases. Each phase is useful alone. The AI is last and can wait.

14. Where I learn from

TopicResource
Project I studiedCampusConnect: github.com/Srivastava-Shrestha/CampusConnect
FastAPI basicsfastapi.tiangolo.com (Tutorial and Advanced User Guide)
Full app examplegithub.com/fastapi/full-stack-fastapi-template
Next.jsnextjs.org/learn (free course)
UI partsui.shadcn.com and tailwindcss.com/docs
Databasepostgresql.org/docs and docs.sqlalchemy.org (2.0 tutorial)
Google sign-indevelopers.google.com/identity/gsi/web ("Verify the Google ID token")
SecurityOWASP Cheat Sheet Series (cheatsheetseries.owasp.org) and OWASP ASVS
Badges standardOpen Badges 3.0 by 1EdTech (imsglobal.org/spec/ob/v3p0)
Deployingvercel.com/docs, render.com/docs, neon.tech/docs, upstash.com/docs
Rush testinggrafana.com/docs/k6
Learning pathsroadmap.sh (frontend, backend, DevOps)
AI (Phase 6)docs.anthropic.com (Claude API, tool use)

15. Word list

WordSimple meaning
FrontendThe part you see and click in the browser.
BackendThe part on the server that follows the rules and keeps the data.
APIThe list of doors the website uses to ask the server for things.
DatabaseWhere all the data is kept, in tables.
DeployPutting a new version online for people to use.
Session / cookieA small note in your browser that says "this person is signed in".
CSRF tokenA secret word our site adds to each change, so other sites can't fake clicks.
Audit logA diary of who changed what, and when.
CDNCopies of pages saved close to users, so they load fast.
Pull requestA request to add a change to the main code, after checks.
CI (GitHub Actions)A robot that runs all the tests on every change.
Preview linkA private test copy of the site for one change.