A full-stack hackathon management platform for organizers, judges, and participants. Built with React and Node.js, HackZen handles hackathon creation, team formation, submissions, judging, scoring, real-time chat, and certificates.
- Features
- Tech Stack
- Project Structure
- Getting Started
- Environment Variables
- Scripts
- Screenshots
- API Overview
- Contributing
- License
- Contact
- Auth: Email/password, GitHub OAuth, Google OAuth, 2FA (TOTP)
- Explore hackathons with filters and detail pages
- Register for hackathons and join or create teams
- Submit projects with rich text and file uploads (Cloudinary)
- Dashboard: My hackathons, submissions, project archive, profile
- Blogs & articles, newsletter subscription
- Badges & achievements, certificate generation
- Create & manage hackathons (phases, criteria, deadlines)
- Organizer dashboard: announcements, submissions, teams, tools
- Judge assignment and scoring workflow
- Sponsor proposals with real-time chat (Socket.IO)
- Certificate page builder and export
- Judge panel with assigned projects and scoring
- Score submissions with criteria and comments
- Project gallery and submission details
- Admin dashboard: hackathons, submissions, users, content
- Blog management, badge management, system overview
- Real-time chat (Socket.IO), notifications
- Email (SendGrid/Resend): password reset, invites, shortlist/winner templates
- File uploads via Cloudinary
- Session store in MongoDB; JWT for API auth
| Layer | Technologies |
|---|---|
| Frontend | React 18, Vite 6, React Router 7, Tailwind CSS, Radix UI, Framer Motion, Socket.IO Client, Axios |
| Backend | Node.js, Express 5, MongoDB (Mongoose), Passport (Local, GitHub, Google), Socket.IO, JWT, Speakeasy (2FA) |
| Storage | MongoDB (MongoDB Atlas), Cloudinary (images/files) |
| SendGrid / Resend | |
| Deploy | Vercel (frontend), Render/Node (backend) |
STPI-Project/
├── Frontend/ # React + Vite app
│ ├── public/
│ ├── src/
│ │ ├── components/
│ │ ├── context/ # AuthContext
│ │ ├── hooks/
│ │ ├── lib/ # api, utils
│ │ ├── pages/ # Admin, Auth, Home, Dashboards, etc.
│ │ └── utils/
│ ├── index.html
│ ├── vite.config.js
│ └── package.json
├── backend/ # Express API
│ ├── config/ # passport, cloudinary, socket, mailer
│ ├── controllers/
│ ├── middleware/
│ ├── model/
│ ├── routes/
│ ├── schema/
│ ├── services/ # emailService
│ ├── templates/ # email templates
│ ├── index.js
│ └── package.json
├── docs/
│ └── screenshots/ # Screenshot images for README
└── README.md
- Node.js 18+ and npm
- MongoDB (local or MongoDB Atlas)
- Cloudinary account (for uploads)
- SendGrid or Resend (for emails)
- GitHub and Google OAuth apps (optional, for social login)
git clone <repository-url>
cd HackZen-mainBackend:
cd backend
npm installFrontend:
cd ../Frontend
npm installCreate a .env file in backend/ (see Environment Variables).
If the frontend calls the API by URL, set VITE_API_URL or equivalent in the frontend (e.g. in .env).
Terminal 1 – Backend
cd backend
npm run devAPI runs at http://localhost:3000 (or the port in .env).
Terminal 2 – Frontend
cd Frontend
npm run devApp runs at http://localhost:5173 (or the port Vite shows).
Frontend
cd Frontend
npm run build
npm run preview # optional: preview production buildBackend
cd backend
npm startCreate backend/.env with (replace placeholders; do not commit secrets):
| Variable | Description |
|---|---|
MONGO_URL |
MongoDB connection string (Atlas or local) |
PORT |
Server port (default 3000) |
JWT_SECRET |
Secret for JWT signing |
SESSION_SECRET |
Secret for session encryption |
GITHUB_CLIENT_ID |
GitHub OAuth app client ID |
GITHUB_CLIENT_SECRET |
GitHub OAuth app client secret |
GITHUB_CALLBACK_URL |
GitHub OAuth callback URL |
GOOGLE_CLIENT_ID |
Google OAuth client ID |
GOOGLE_CLIENT_SECRET |
Google OAuth client secret |
GOOGLE_CALLBACK_URL |
Google OAuth callback URL |
CLOUDINARY_CLOUD_NAME |
Cloudinary cloud name |
CLOUDINARY_API_KEY |
Cloudinary API key |
CLOUDINARY_API_SECRET |
Cloudinary API secret |
SENDGRID_API_KEY |
SendGrid API key (or use Resend) |
SENDGRID_FROM_EMAIL |
From email for transactional emails |
SENDGRID_FROM_NAME |
From name (e.g. HackZen) |
FRONTEND_URL |
Frontend URL in production (e.g. https://hackzen.vercel.app) |
NODE_ENV |
development or production |
Backend (backend/package.json)
npm start— run server (node index.js)npm run dev— run with nodemon
Frontend (Frontend/package.json)
npm run dev— Vite dev servernpm run build— production buildnpm run preview— preview production buildnpm run lint— run ESLint
| Login (Email + GitHub / Google) | User Dashboard |
|---|---|
![]() |
![]() |
| Explore Hackathons | Hackathon Detail |
|---|---|
![]() |
![]() |
| Organizer Dashboard | Judge Panel |
|---|---|
![]() |
![]() |
Base URL (local): http://localhost:3000
| Area | Prefix | Description |
|---|---|---|
| Health | GET /, GET /api/health |
Server and API health |
| Auth | /api/users |
Register, login, profile; OAuth callbacks |
| 2FA | /api/users/2fa |
TOTP setup and verify |
| Hackathons | /api/hackathons |
CRUD, list, filters |
| Registration | /api/registration |
Hackathon registration |
| Teams | /api/teams, /api/team-invites |
Teams and invites |
| Submissions | /api/submissions, /api/submission-form |
Submission history and form |
| Projects | /api/projects |
Project CRUD |
| Scores | /api/scores |
Judge scoring |
| Judge | /api/judge-management |
Judge assignment and management |
| Notifications | /api/notifications |
User notifications |
| Chat | /api/chatrooms, /api/messages |
Chat rooms and messages |
| Announcements | /api/announcements |
Hackathon announcements |
| Organizations | /api/organizations |
Organizer organizations |
| Articles | /api/articles |
Blog/articles |
| Newsletter | /api/newsletter |
Newsletter subscription |
| Badges | /api/badges |
Badges and achievements |
| Uploads | /api/uploads |
Cloudinary uploads |
| Certificates | /api/certificate-pages |
Certificate page config |
| Sponsors | /api/sponsor-proposals |
Sponsor proposals |
Real-time features (chat, notifications) use Socket.IO on the same server.
We welcome contributions from individuals and groups/teams.
- Fork the repository to your own GitHub account.
- Create a feature branch from
main(for example:feature/improve-judging-flow). - Set up the project locally (see Getting Started) and ensure both frontend and backend run without errors.
- Make your changes with clear, self-documented code and meaningful commit messages.
- Run checks (lint/build) to ensure nothing is broken:
cd backend && npm run dev(smoke test)cd Frontend && npm run lint && npm run build
- Push your branch and open a Pull Request with:
- A clear summary of the change
- Screenshots or GIFs (if UI-related)
- Any migration/ENV changes noted
- If you are contributing as a group, mention your team members in the PR description.
It is maintained by the HackZen team, and both individuals and groups are encouraged to contribute to this project.
- Name: HackZen Support
- Primary Email:
[email protected] - Other Email:
[email protected] - X (Twitter):
https://x.com/devora_official
HackZen — Hackathon management, from idea to certificate.







