One place for SRM clubs to find members, run events, take attendance, share results and give certificates and badges.
| Version | 1.0 |
| Date | 3 October 2026 |
| Built by | One student developer (frontend, backend and deploy) |
| For | All SRM campuses · @srmist.edu.in |
| Status | Phase 0 live. Phase 1 backend done (33 tests pass). Frontend next. |
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.
Riya is in second year. She wants to join the Robotics Club.
| Step | Tool used today | What goes wrong |
|---|---|---|
| Finding new members | Google Form | Every 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 event | WhatsApp group | Messages get buried. People outside the group never know. Room or time changes get missed. |
| Signing up for an event | Another Google Form | No seat limit. Same person signs up twice. No way to check students from other colleges. |
| Attendance | Paper or a sheet | Slow and easy to fake. Often never saved. |
| Results | Nowhere | Winners are said out loud on stage and then forgotten. |
| Proof you took part | Hand-made certificate, if any | Easy to fake. Nobody can check if it is real. |
| Keep (it worked well) | Fix (weak spots I found in their code) |
|---|---|
|
|
There is no "campus admin". Each club runs itself. I (the developer) only decide which clubs get in.
| Role | Who | What they can do |
|---|---|---|
| Platform Owner | Me, the developer | Say 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 Admin | Club president or head | Runs 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 Member | Club core team | Makes events, scans people in at the door, posts event updates. Cannot change club rules or roles. |
| Member | Anyone picked by the club | Sees member-only events and posts. |
| SRM Student | Anyone with @srmist.edu.in | Signs 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 Guest | Student from another college | Signs 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. |
/u/their-name with clubs, events, results, certificates and badges.| Goal | Target |
|---|---|
| Clubs hire without Google Forms | 3 pilot clubs run a full hiring drive in the app |
| Leaders save time | From "event ended" to "certificates sent" in under 10 minutes |
| Results are never lost | Every event in the app has public results |
| Students use their proof | Students share their profile link or badge card |
| It stays up during a rush | 3,000 sign-ups in 60 seconds with no errors and no overbooking |
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.
| Part | Tool | Why, 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 feel | Tailwind CSS + shadcn/ui | Ready-made, clean parts (buttons, forms, tables) that work for everyone, including screen readers. |
| Forms and data | React Hook Form, Zod, TanStack Query | Checks forms before sending. Keeps data fresh and retries when the network is slow. |
| QR scanner | Browser camera | Core 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. |
| Database | PostgreSQL | Strong rules, so bad data can't get in. Handles many people at once. |
| Database code | SQLAlchemy 2 + Alembic | Talks to the database from Python. Alembic keeps track of database changes. |
| Fast memory | Redis | Holds logins, counts tries (to stop spam) and holds the job line. |
| Background jobs | arq (on Redis) | Slow work like 500 certificates or emails happens in the back, so pages stay fast. |
| Files | Cloudflare R2 | Stores certificates and pictures. No fee each time someone downloads. |
| Resend or Amazon SES | Sends sign-in codes and updates. Cheap and reliable. | |
| Tests | pytest, Vitest, Playwright | Check the server, the website parts, and full clicks in a real browser. |
| Auto checks | GitHub Actions | Runs all tests on every push. |
| Watching for errors | Sentry | Tells me when something breaks for a user, and where. |
| Part | Home | Why |
|---|---|---|
| Project page and docs | GitHub Pages | Free. 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 app | Vercel | Made for Next.js. Every pull request gets its own preview link. |
| The API and job worker | Render (or Railway) | Runs a Python server all the time. Vercel is not made for always-on workers. |
| Database | Neon (PostgreSQL) | Free to start, with backups. |
| Redis | Upstash | Free to start, pay only for use. |
@srmist.edu.in inbox proves the person is at SRM| Folder | What it holds |
|---|---|
app/routers/ | The web addresses (endpoints). Short. They call the checks and the rules. |
app/permissions.py | One 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.py | The database tables as Python classes. |
db/schema.sql | The full database. The single source of truth. |
tests/ | One test for each important rule. |
| Danger | What we do |
|---|---|
| Someone pretends to be an SRM student | Everyone 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 admin | No sign-up form can make an owner. Only I can, from the command line. Club Admins come only from approved clubs. |
| Someone steals a login | The 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 click | Every change needs a secret token that only our own website knows (CSRF protection). |
| Someone guesses email codes | Codes expire in 10 minutes, die after 5 wrong tries, and requests are limited. |
| A friend shares a check-in QR on WhatsApp | The QR code changes every 30 seconds and works only once. |
| Someone fakes a certificate | Every certificate has a long random code and a public check page. |
| A leader does something wrong | Every admin, core and owner action is written to an audit log: who, what, before, after and when. |
| Bad data gets in | Every input is checked. The database also blocks bad data on its own, like signing up twice or a winner who never came. |
| Private data leaks | Collect only what we need. Students can delete their account. This follows India's DPDP Act 2023. |
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.
I do all three jobs myself. Writing them down keeps each job clear, and shows what to hand over if more people join later.
db/schema.sql up to date.can() permission check.| Phase | Frontend | Backend | Developer / DevOps |
|---|---|---|---|
| 0 | Pick colors and fonts; simple landing page | Done: schema and plan | Repo, CI, GitHub Pages, Vercel and Render accounts |
| 1 | Sign in, setup, club list, club request, hiring form and queue | Done: sign-in, clubs, roles, hiring (33 tests) | First Vercel and Render deploy, Neon, Upstash, email service with a real sender domain |
| 2 | Event pages, sign-up, guest approval queue, live updates | Events, seats, guest approval, updates, notifications | Email service, push keys |
| 3 | QR scanner, results page, certificate check page | Check-in codes, results, certificate PDF jobs | R2 storage, job worker, rush test |
| 4 | Profiles, badge wall, badge card | Badge rules engine, profile API | CDN cache for public pages |
| 5 | Fixes from pilot feedback | Fixes from pilot feedback | Monitoring, backups, launch checklist |
| 6 | AI club finder chat | Grounded AI (Claude API) | Cost limits on AI |
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.
| We build | GitHub repo, folders, auto tests, project landing page, this PRD. |
| Goes live on | GitHub Pages: project page, PRD and docs. |
| Done when | The landing page is live, and tests run on every push. |
| We build | Email-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 on | Vercel: first version of the web app. Render: the API. |
| Done when | A 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. |
| We build | Make and publish events, sign up with seat limits, guest approval queue, live updates ("room moved"), email and phone notifications. |
| Goes live on | Vercel update. |
| Done when | A club runs a real event sign-up with no Google Form and no WhatsApp message needed. |
| We build | QR check-in with changing codes, results page, certificate PDFs made in the background, a public certificate check page. |
| Goes live on | Vercel update. The rush test (3,000 sign-ups in 60 seconds) is run. |
| Done when | A leader goes from "event ended" to "certificates sent" in under 10 minutes. |
| We build | Public profile pages, badge rules, badge levels (x2, x3, x4), badge check links, the badge card for GitHub and LinkedIn. |
| Goes live on | Vercel update. Public pages are cached on the CDN. |
| Done when | A student adds their badge card to their GitHub README. |
| We build | Fixes from real use. Help pages. Error alerts, backups and uptime checks. |
| Goes live on | Vercel on the real web address. Pilot with 3 clubs at KTR, then open to all SRM campuses. |
| Done when | The 3 pilot clubs say they no longer need Google Forms. |
| 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 on | Vercel update. |
| Done when | Students find a club through the chat, and costs stay inside a set limit. |
feat/event-signup.main deploys the web app (Vercel) and the API (Render) by itself.| 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. |
| Risk | Plan |
|---|---|
| Clubs keep using WhatsApp out of habit | Start with 3 friendly clubs. Make the app faster than a form. Let leaders share event links into WhatsApp. |
| One person (me) holds the owner role | More owners can be added from the command line, so the app can be handed over after I graduate. |
| Free hosting limits | Watch usage. Move to paid plans only when real use needs it. |
| Sign-in codes land in SRM spam | Send 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-in | Already 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 list | Check the list with the college before the pilot. It is easy to change. |
| Big rush breaks sign-up | Rush test before every big event. Seat logic is checked by the database itself. |
| Too much work for one person | Thin phases. Each phase is useful alone. The AI is last and can wait. |
| Topic | Resource |
|---|---|
| Project I studied | CampusConnect: github.com/Srivastava-Shrestha/CampusConnect |
| FastAPI basics | fastapi.tiangolo.com (Tutorial and Advanced User Guide) |
| Full app example | github.com/fastapi/full-stack-fastapi-template |
| Next.js | nextjs.org/learn (free course) |
| UI parts | ui.shadcn.com and tailwindcss.com/docs |
| Database | postgresql.org/docs and docs.sqlalchemy.org (2.0 tutorial) |
| Google sign-in | developers.google.com/identity/gsi/web ("Verify the Google ID token") |
| Security | OWASP Cheat Sheet Series (cheatsheetseries.owasp.org) and OWASP ASVS |
| Badges standard | Open Badges 3.0 by 1EdTech (imsglobal.org/spec/ob/v3p0) |
| Deploying | vercel.com/docs, render.com/docs, neon.tech/docs, upstash.com/docs |
| Rush testing | grafana.com/docs/k6 |
| Learning paths | roadmap.sh (frontend, backend, DevOps) |
| AI (Phase 6) | docs.anthropic.com (Claude API, tool use) |
| Word | Simple meaning |
|---|---|
| Frontend | The part you see and click in the browser. |
| Backend | The part on the server that follows the rules and keeps the data. |
| API | The list of doors the website uses to ask the server for things. |
| Database | Where all the data is kept, in tables. |
| Deploy | Putting a new version online for people to use. |
| Session / cookie | A small note in your browser that says "this person is signed in". |
| CSRF token | A secret word our site adds to each change, so other sites can't fake clicks. |
| Audit log | A diary of who changed what, and when. |
| CDN | Copies of pages saved close to users, so they load fast. |
| Pull request | A 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 link | A private test copy of the site for one change. |