This document defines the complete participant-side platform for CommDesk, built as a React web application.
It is not the organizer desktop workflow.
Primary objective:
- help participants discover events
- form teams
- build and submit projects
- get judged transparently
- earn reputation and opportunities
Core vision:
Discover -> Apply -> Join Team -> Build -> Submit -> Get Judged -> Earn Reputation -> Get Hired
CommDesk target position:
Devfolio + GitHub Portfolio + LinkedIn for Hackathons
Participants should feel they are building a long-term developer identity, not filling one-time forms.
The platform must optimize for:
- trust (transparent process)
- fairness (clear rules and anti-manipulation)
- growth (portfolio, skills, reputation)
- opportunities (sponsor tracks and hiring)
The participant platform includes these modules:
- Developer Identity
- Hackathon Discovery
- Event Participation and RSVP
- Team Discovery and Team Formation
- Project Submission
- Transparent Judging View
- Public Project Showcase
- Leaderboards
- Reputation and Achievements
- Sponsor Ecosystem
- Hiring and Talent Discovery
- Community Interaction
- Learning and Resources
- Notifications
- Certificates
- Security and Anti-Cheating
- Participant Analytics
This website should be implemented as a React app (TypeScript recommended).
React
React Router
TypeScript
TanStack Query
Zod
Tailwind CSS
React Hook Form
Optional:
Zustand (UI/session state)
Sentry (error monitoring)
PostHog (product analytics)
src/
app/
router/
providers/
modules/
builders/
hackathons/
rsvp/
teams/
submissions/
judging/
leaderboard/
reputation/
sponsors/
talent/
community/
learning/
notifications/
certificates/
shared/
api/
ui/
hooks/
utils/
types/
- all server data through TanStack Query
- strict DTO validation with Zod at API boundary
- optimistic updates only for safe actions (upvote, join request status changes)
- retry and error policy standardized across modules
/ -> Home
/hackathons -> Discovery listing
/hackathons/:slug -> Event detail
/hackathons/:eventId/rsvp -> RSVP / application
/hackathons/:eventId/teams -> Team discovery
/hackathons/:eventId/find-teammates -> Teammate finder
/hackathons/:eventId/submission -> Submission workspace
/hackathons/:eventId/projects -> Public project gallery
/hackathons/:eventId/judging -> Public judging view
/hackathons/:eventId/leaderboard -> Leaderboard
/builders/:username -> Public builder profile
/talent -> Talent discovery (recruiter-facing, access controlled)
/notifications -> Notification center
/certificates -> Certificates vault
/settings/profile -> Account and profile settings
Route:
/builders/:username
BuilderProfile;
{
_id: ObjectId;
userId: ObjectId;
communityId: ObjectId; // null = global profile
username: String; // unique, URL-safe slug
fullName: String;
avatarUrl: String;
bio: String;
location: String;
university: String;
degree: String;
graduationYear: Number;
experienceLevel: "Student" | "Junior" | "Mid" | "Senior";
githubUrl: String;
linkedinUrl: String;
portfolioUrl: String;
xTwitterUrl: String;
resumeUrl: String;
skills: [String];
preferredTracks: [String];
openToTeamInvite: Boolean;
openToHiring: Boolean;
visibility: "Public" | "MembersOnly" | "Private";
createdAt: Date;
updatedAt: Date;
}Required indexes:
- unique:
username - index:
(openToHiring, skills)
BuilderStats;
{
_id: ObjectId;
userId: ObjectId;
hackathonsJoined: Number;
projectsSubmitted: Number;
wins: Number;
finalistCount: Number;
averageScore: Number;
reputationPoints: Number;
followers: Number;
following: Number;
updatedAt: Date;
}Stats are computed asynchronously — never written on the hot path.
reputationPoints =
(hackathonsJoined * 10)
+ (projectsSubmitted * 20)
+ (finalistCount * 50)
+ (wins * 100)
+ (communityContributions * 5)
Recalculated on each scoring event trigger.
| Visibility | Public | Members Only | Private |
|---|---|---|---|
| Profile page visible | Yes | Logged-in members only | No |
| Talent search visible | Yes (if openToHiring) | No | No |
| Teammate finder visible | Yes | Logged-in only | No |
- project cards (from
EventSubmission) - participation history (from
EventRegistration) - achievements and certificates (from
BuilderAchievement,BuilderCertificate) - skill endorsements (optional, from peers)
- follow/unfollow builders
- followers and following counts on
BuilderStats - activity feed (event joins, wins, new projects)
Route:
/hackathons
- online/offline/hybrid
- beginner friendly
- domain tags (AI, Web3, FinTech, Climate, Health)
- student only / university only
- registration open only
- trending
- most participants
- highest prize pool
- ending soon
- newest
Each card should include:
- coverImageUrl
- title
- hostCommunityName
- prizePool
- participantCount
- registrationDeadline
- tags[]
- status
- applyButtonState
Route:
/hackathons/:slug
Sections:
- overview
- problem statements and tracks
- timeline
- prizes and sponsor challenges
- judges and mentors
- participants count
- project gallery preview
Important timeline fields:
- registrationOpenAt
- teamFormationDeadline
- submissionDeadline
- judgingStartAt
- judgingEndAt
- winnersAnnouncedAt
Route:
/hackathons/:eventId/rsvp
This module must reuse the RSVP contracts already defined in:
Key statuses:
Pending
Approved
Rejected
Waitlisted
Cancelled
Important fields:
- registrationType (Solo/Team)
- leader identity and contact
- team details (if team)
- consent flags with policy versions
- custom question responses
Anti-spam recommendations:
- profile completeness score
- CAPTCHA + rate limits
- duplicate email/mobile checks
When event capacity is full:
Participant registers
-> Capacity full
-> Status set to Waitlisted
-> WaitlistEntry created with position number
-> Waitlist confirmation email sent
Capacity opens (cancellation or organizer increase)
-> First WaitlistEntry auto-promoted to Approved
-> Promotion email sent
-> Waitlist positions recalculated
Waitlist schema:
WaitlistEntry;
{
_id: ObjectId;
eventId: ObjectId;
registrationId: ObjectId;
userId: ObjectId;
position: Number;
status: "Waiting" | "Promoted" | "Expired" | "Cancelled";
promotedAt: Date;
expiryAt: Date; // window to accept promotion before next in queue
createdAt: Date;
}Required indexes:
- index:
(eventId, status, position) - unique:
(eventId, userId)
Participant-visible: current waitlist position and estimated chance of admission.
Route:
/hackathons/:eventId/teams
Team card fields:
- teamName
- memberCount and maxTeamSize
- leader
- techStack
- projectIdea
- openRoles
- requestToJoin CTA
| Role | Permissions |
|---|---|
Leader |
invite, accept/reject requests, transfer leadership, delete team, finalize submission |
CoLeader |
invite, accept/reject requests, edit team profile |
Member |
view team, leave team |
Only one Leader at a time. Leader transfer requires explicit confirmation from the recipient.
Participants can:
- create team (creator becomes
Leader) - send join request
- accept/reject incoming request (
LeaderorCoLeader) - invite members directly
- promote member to
CoLeader(Leaderonly) - transfer leadership to another member
- leave team (blocked within 24h of submission deadline unless team has a replacement leader)
- delete team (only if no submission exists)
- team is soft-locked at
teamFormationDeadline: no new join requests accepted - team is hard-locked at
submissionDeadline: no member changes at all - submission captures an immutable roster snapshot at finalize time
- organizer can override lock for exceptional cases; override logged in audit trail
{
"eventId": "evt_123",
"teamId": "team_456",
"message": "I can help with backend and deployment.",
"skills": ["Node.js", "MongoDB", "DevOps"],
"githubUrl": "https://github.com/user",
"portfolioUrl": "https://user.dev"
}Route:
/hackathons/:eventId/find-teammates
Listing fields:
- builder profile summary
- skills
- experience level
- preferred role
- availability
- timezone
- lookingForTeam flag
Teams can send invites directly from this page.
Route:
/hackathons/:eventId/submission
- projectName
- shortDescription
- problemStatement
- solution
- techStack[]
- repositoryUrl
- demoUrl
- videoUrl
- presentationUrl
- screenshots[]
- architectureDiagramUrl
- installationSteps
- sponsorTrackSelections[]
Draft -> Submitted -> UnderReview -> Finalist -> Winner
-> Disqualified (anti-cheat or rule violation)
Rules:
Draft: editable anytime beforesubmissionDeadlineSubmitted: locked after deadline;submittedAtis immutableUnderReview: assigned to judges, scoring in progressFinalist/Winner: set by organizer or LeadJudge after scoring roundDisqualified: requires audit reason; participant notified
Edit window policy:
- minor edits (description, links) allowed up to
submissionDeadline repositoryUrland core identity fields immutable afterSubmitted- all field changes tracked in
SubmissionEditLog(field, oldValue, newValue, actorId, timestamp)
- import README from GitHub
- auto-detect tech stack from repo
- draft auto-save every 30 seconds
- pre-submit validation checklist (all required fields, repo public check)
submittedAttimestamp displayed and locked visually after submission
Route:
/hackathons/:eventId/projects
Project card fields:
- projectName
- teamName
- track
- techStack
- github
- demo
- upvotes
- awardsBadges
Important product rule:
- projects remain publicly visible after event completion (unless policy violation)
Route:
/hackathons/:eventId/judging
This module must consume judging visibility policies from:
Public content (when enabled):
- judges
- criteria and weights
- per-judge score breakdown
- public feedback
- final averages
Respect event judging settings:
- mode: private/transparent
- showJudgeNames
- showFeedback
- publishTiming
Route:
/hackathons/:eventId/leaderboard
Columns:
- rank
- team
- project
- weightedAverageScore
- judgeCount
Ranking and tie-break logic must match Judging System rules.
Optional behavior:
- real-time updates during active judging rounds
Participants gain points for verified actions.
- event joined
- project submitted
- project finalized
- judged score above threshold
- finalist and winner placements
- community contribution actions
Beginner
Builder
Advanced Builder
Elite Hacker
Legend
- first_hackathon
- first_submission
- top_10_finish
- best_ai_project
- community_helper
This participant-facing module should be powered by:
Features:
- sponsor challenges and track prizes
- sponsor resource hub (APIs, SDKs, docs)
- sponsor office hours/mentorship slots
- sponsor hiring intent flags
Participant-visible fields:
- challenge title
- eligibility
- submission tags required
- judging criteria for sponsor track
- prize details
Route:
/talent
Access control:
- recruiter/employer roles only
- participant opt-in required
Talent search filters:
- skills
- projects and tech stack
- hackathon results
- reputation level
- location and availability
Builder profile should function as a technical resume.
Features:
- event discussion threads
- team chat
- mentor Q&A
- announcements feed
Moderation essentials:
- report abuse
- anti-spam filters
- role-based moderation actions
Provide learning content tied to active events:
- preparation guides
- project idea banks
- workshop sessions
- starter kits and templates
Resource taxonomy:
- beginner
- intermediate
- advanced
- track-specific
Route:
/notifications
- RSVP submitted / status changed
- team invite received / request accepted
- submission deadline reminders
- judging result published
- winner announcement
- in-app
- push (optional)
- per-user preferences
- digest modes
- quiet hours
Route:
/certificates
Certificate types:
- participation
- finalist
- winner
- mentor/judge contribution (if participant profile also has those roles)
Certificate metadata:
- certificateId
- eventId
- issueDate
- verificationUrl
- hash/signature
Mandatory controls:
- GitHub commit verification window checks
- duplicate project detection
- plagiarism detection for descriptions/repos
- immutable submission timestamps after deadline
- full audit logs for critical actions
Recommended controls:
- suspicious activity scoring
- multi-account abuse detection
- IP velocity checks
- hidden plagiarism review queue
Track platform health and participant outcomes:
- registration funnel
- team formation success rate
- submission completion rate
- judging publish latency
- retention across events
- skill trend heatmaps
Important analytics dimensions:
- event
- track
- community
- participant cohort
This website should reuse existing APIs and add participant APIs where needed.
Event APIs:
GET /api/v1/events
GET /api/v1/events/:eventId
RSVP APIs:
POST /api/v1/events/:eventId/rsvp
GET /api/v1/events/:eventId/rsvp/:registrationId
PATCH /api/v1/events/:eventId/rsvp/:registrationId
Judging Public APIs:
GET /api/v1/events/:eventId/judging
GET /api/v1/events/:eventId/leaderboard
GET /api/v1/events/:eventId/projects
GET /api/v1/events/:eventId/projects/:slug
Builder Profile
GET /api/v1/builders/:username
PATCH /api/v1/builders/me
Teams
POST /api/v1/events/:eventId/teams
GET /api/v1/events/:eventId/teams
POST /api/v1/events/:eventId/teams/:teamId/join-requests
PATCH /api/v1/events/:eventId/teams/:teamId/join-requests/:requestId/accept
PATCH /api/v1/events/:eventId/teams/:teamId/join-requests/:requestId/reject
Submissions
POST /api/v1/events/:eventId/submissions
PATCH /api/v1/events/:eventId/submissions/:submissionId
POST /api/v1/events/:eventId/submissions/:submissionId/finalize
Reputation
GET /api/v1/builders/:username/reputation
GET /api/v1/events/:eventId/achievements
Notifications
GET /api/v1/notifications
PATCH /api/v1/notifications/:id/read
Certificates
GET /api/v1/certificates/me
GET /api/v1/certificates/:certificateId/verify
Recommended core collections:
- BuilderProfile
- BuilderStats
- BuilderAchievement
- BuilderFollow
- EventTeam
- TeamMember (role: Leader | CoLeader | Member)
- TeamJoinRequest
- WaitlistEntry
- EventSubmission
- SubmissionEditLog
- SubmissionAsset
- SubmissionScore (from Judging system)
- EventLeaderboardCache
- EventRSVPConfig (from RSVP)
- EventRegistration (from RSVP)
- ParticipantNotification
- NotificationPreference
- BuilderCertificate
- SponsorChallenge
- PlagiarismReport
- ParticipationAudit
This participant website must stay aligned with:
- CommDesk Event System
- CommDesk Sponsor & Partner Management System
- CommDesk RSVP System
- CommDesk Judging System
- CommDesk Member Creation & Onboarding System
- Community Signup System
Planned docs this system depends on (not yet written):
CommDesk-Team-System.md— full team lifecycle, roles, lock policy, and API contractCommDesk-Submission-System.md— submission workflow, deadline enforcement, edit log, and file storageCommDesk-Auth-System.md— JWT lifecycle, refresh token rotation, password reset, MFA, and OAuthCommDesk-Notification-System.md— unified notification channels, templates, delivery guarantees, and preferences
Integration rules:
- event status, schedule, and visibility come from Event System
- sponsor marketplace, sponsor challenges, workshops, resources, and hiring access come from Sponsor and Partner System
- registration, consent model, and waitlist management come from RSVP System
- judging and leaderboard visibility come from Judging System
- identity onboarding and role governance come from Member System
- community-level access and ownership originate from Signup System
- team lifecycle (roles, locks, transfers) will be governed by the forthcoming Team System
- submission file storage, status lifecycle, and deadline enforcement will be governed by the forthcoming Submission System
Do not ship participant platform without these critical fields.
- Identity:
userIdusernamefullNameemailskills[]
- Participation:
eventIdregistrationTypersvpStatusteamId
- Submission:
submissionIdprojectNamerepositoryUrldemoUrlstatus(Draft → Submitted → UnderReview → Finalist → Winner)submittedAt(immutable after submission)
- Team:
teamIdteamRole(Leader / CoLeader / Member)teamLockedAtrosterSnapshot(captured at submission finalize)
- Waitlist:
waitlistPositionwaitlistStatuspromotionExpiryAt
- Judging transparency:
criteriaNamescorejudgeVisibilityRulespublishTiming
- Trust and compliance:
- consent flags and policy versions
- audit metadata (actor, timestamp, IP)
- anti-plagiarism and anti-duplicate signals
- No unified builder profile:
- participants lose long-term portfolio value.
- No team workflow:
- serious hackathon participation becomes impossible.
- No transparent judging controls:
- trust and fairness concerns increase.
- No anti-cheating checks:
- duplicate and plagiarized projects can win.
- No notification reliability:
- participants miss critical deadlines.
- No certificate verification:
- credentials become easy to fake.
- No hiring opt-in/privacy controls:
- user trust and legal risk increase.
- No API/contract alignment with existing docs:
- frontend and backend drift quickly.
- No observability:
- production incident triage becomes slow.
- No phased rollout:
- platform complexity can delay launch unnecessarily.
- No waitlist management:
- capacity-full events silently reject participants with no promotion path.
- No team role enforcement:
- any member can perform leader-only actions, breaking team governance.
- No team lock policy:
- team roster can change after submission, corrupting project attribution.
- No submission edit log:
- post-deadline description edits cannot be detected or audited.
- No builder profile visibility controls:
- private profiles are exposed in talent search and teammate finder.
- No documented reputation formula:
- reputation points are assigned inconsistently across events and actions.
- discovery
- event detail
- RSVP
- team formation basics
- submission
- basic leaderboard
- transparent judging view
- anti-cheating checks
- notifications hardening
- certificates
- reputation and achievements
- sponsor challenges
- talent discovery
- learning and community features
React Website (Participants)
-> Discovery
-> RSVP + Waitlist
-> Teams (roles, lock, transfer)
-> Submission (lifecycle, edit log)
-> Judging View
-> Leaderboard
-> Builder Profile (visibility, stats, portfolio)
-> Reputation + Achievements
-> Certificates
-> Notifications
|
v
CommDesk API Layer
-> Event System
-> RSVP System (+ WaitlistEntry)
-> Team System (planned)
-> Submission System (planned)
-> Judging System
-> Notification System (planned)
-> Auth System (planned)
-> Member System
-> Community System
|
v
Organizer Desktop App (existing)
This document defines a complete React participant platform blueprint aligned with all existing CommDesk system docs.
Delivered outcome:
- end-to-end participant lifecycle
- production-ready module breakdown
- route and API contracts
- Developer Identity schema with visibility controls and reputation formula
- waitlist management with auto-promotion flow
- team roles, lock policy, and leadership transfer
- submission status lifecycle with edit log and deadline enforcement
- integration with event, RSVP, judging, member, and community systems
- references to planned Team, Submission, Auth, and Notification system docs
- fairness, trust, and anti-cheating architecture
- growth path from MVP to full ecosystem