Enterprise-grade Placement Management & Student Readiness Platform for Engineering Colleges
A full-stack placement management platform enabling students to track applications, analyze resumes with AI, practice aptitude tests, and prepare for interviews — while coordinators and admins manage drives, pipelines, and reports from a unified dashboard.
| Dashboard | Applications |
|---|---|
![]() |
![]() |
| Opportunities | Resume AI |
|---|---|
![]() |
![]() |
| Aptitude Test | Profile |
|---|---|
![]() |
![]() |
| Interview Coach | AI Feedback |
|---|---|
![]() |
![]() |
Student Portal
- Readiness score ring computed from CGPA, aptitude, coding, communication, projects, internships, and mock counts
- Job board with real-time eligibility check and suitability score per drive
- AI-powered resume analysis via Google Gemini with heuristic fallback
- Timed aptitude mock tests with server-side grading and section-wise feedback
- AI interview coach generating role-specific questions with answer evaluation
- In-app notifications for application status changes and interview schedules
- 90 skills across 4 categories (Technical Core, Tools & Platforms, Core Engineering, Soft Skills) covering all 10 branches — CS, IT, AI/DS, Electronics, Electrical, Mechanical, Civil, Chemical, and more
Coordinator & Admin Portal
- Create and manage placement drives with branch filters, CGPA caps, backlog limits, and deadlines
- Progress student applications through a strict pipeline:
APPLIED → SHORTLISTED → APTITUDE_CLEARED → TECHNICAL_ROUND → HR_ROUND → SELECTED / REJECTED - Schedule interviews and push notifications to candidates
- Export full student registry and application data as CSV reports
- Admin user management with audit trail logging
graph TD
Client[Next.js Frontend] <-->|JSON + JWT Auth| Express[Express.js Server]
Express <-->|Prisma Client| DB[(PostgreSQL on Neon)]
Express <-->|REST API| Gemini[Google Gemini AI]
Express -->|Fallback| Heuristics[Regex Heuristic Parser]
Monorepo Structure
├── backend/
│ ├── prisma/
│ │ ├── schema.prisma # Database schema
│ │ └── seed.ts # 150-student seed script
│ ├── src/
│ │ ├── lib/ # Prisma client & audit logger
│ │ ├── middleware/ # JWT auth & RBAC guards
│ │ ├── routes/ # REST endpoints by resource
│ │ ├── services/ # Eligibility, readiness & AI integrations
│ │ ├── types/ # TypeScript annotations
│ │ └── server.ts # Server entrypoint with auto-seed
│ └── tests/ # Vitest unit test suite
│
├── frontend/
│ └── src/
│ ├── app/ # Next.js App Router
│ ├── components/ # Dashboard, Resume AI, UI components
│ └── lib/ # API wrappers, types, credentials
│
├── docker-compose.yml # PostgreSQL container (local dev)
├── package.json # Monorepo workspaces config
└── .env.example # Environment variable template
A backend scoring engine that maps academic and assessment metrics to a placement probability score:
Readiness Score = clamp(
(CGPA / 10 × 22) +
(Aptitude × 0.18) +
(Coding × 0.22) +
(Communication × 0.15) +
(Projects × 4) +
(Internships × 5) +
(Mock Tests × 1.2) -
(Active Backlogs × 7)
)
| Range | Status |
|---|---|
| >= 80 | Placement Ready |
| 65 – 79 | Nearly Ready |
| < 65 | Needs Focused Preparation |
Hard constraints validated before a student can apply to any drive:
- CGPA >= drive minimum
- Active backlogs <= drive maximum
- Branch within allowed departments
- Graduation year matches drive cohort
Eligible applications receive a suitability score (50–100) based on academic margin (+15), skill keyword overlap (+30), and branch specificity (+15).
Resume PDFs are parsed via pdf-parse into raw text, then sent to Google Gemini (gemini-2.5-flash) with a structured JSON prompt. Response fields: score, skills, sectionHits, suggestions, contactComplete. A regex heuristic fallback activates automatically if the API key is absent or rate-limited — the platform remains fully functional offline.
- Backend Base URL:
http://localhost:4000(Local) /https://your-backend-url(Production) - Health Check:
GET /health→ returns{ "status": "ok", "database": "connected" } - Authentication: All protected endpoints require
Authorization: Bearer <jwt_token>header.
| Method | Endpoint | Auth | Description |
|---|---|---|---|
| GET | /health |
Public | Database connectivity health check |
| POST | /api/auth/login |
Public | Login and receive signed JWT |
| POST | /api/auth/signup |
Public | Register student or coordinator |
| GET | /api/auth/me |
User | Fetch profile and unread notifications |
| PATCH | /api/auth/me/student |
Student | Update profile and recalculate readiness |
| GET | /api/auth/users |
Admin | List all registered accounts |
| DELETE | /api/auth/users/:id |
Admin | Delete account and dependencies |
| GET | /api/dashboard |
User | Role-specific aggregated dashboard data |
| GET | /api/drives |
User | List drives with eligibility state per student |
| POST | /api/drives |
Coordinator, Admin | Create a placement drive |
| GET | /api/applications |
User | Query applications (owner-scoped for students) |
| POST | /api/applications |
Student | Submit eligibility-filtered application |
| PATCH | /api/applications/:id/status |
Coordinator, Admin | Advance application pipeline stage |
| POST | /api/applications/:id/interview |
Coordinator, Admin | Schedule interview and notify student |
| GET | /api/tests |
User | List all aptitude tests |
| GET | /api/tests/:id |
User | Fetch test details and questions |
| POST | /api/tests/:id/submit |
Student | Submit answers and record scored result |
| POST | /api/ai/resume/text |
Student | Analyze raw text resume |
| POST | /api/ai/resume/upload |
Student | Extract and analyze PDF resume |
| POST | /api/ai/interview |
User | Generate role-specific interview questions |
| POST | /api/ai/interview/feedback |
User | Evaluate answer with score and model response |
| GET | /api/reports/applications.csv |
Coordinator, Admin | Export application data as CSV |
| GET | /api/reports/students.csv |
Coordinator, Admin | Export student performance registry as CSV |
- Node.js v20+
- Docker Desktop (for local PostgreSQL)
Copy .env.example templates in both backend/ and frontend/ directories:
# Copy backend environment configuration template
cp backend/.env.example backend/.env
# Copy frontend environment configuration template
cp frontend/.env.example frontend/.env.local| Variable | Description |
|---|---|
PORT |
Express REST API server port (default: 4000) |
DATABASE_URL |
PostgreSQL pooled connection string for Prisma Client |
DIRECT_URL |
Direct PostgreSQL connection string for Prisma migrations |
JWT_SECRET |
Secret string for signing and verifying JWT tokens |
GEMINI_API_KEY |
Google Gemini API key for AI resume parsing & interview feedback |
FRONTEND_URL |
Allowed CORS origin & email link base URL (default: http://localhost:3000) |
| Variable | Description |
|---|---|
NEXT_PUBLIC_API_URL |
Backend REST API base URL (default: http://localhost:4000) |
docker compose up -d# Install all workspace dependencies
npm install
# Push Prisma schema to database
npm run prisma:push -w backend
# Seed with 150 student profiles, companies, drives, and tests
npm run prisma:seed -w backendnpm run dev| Service | URL |
|---|---|
| Frontend | http://localhost:3000 |
| Backend API | http://localhost:4000 |
| Health Check | http://localhost:4000/health |
Demo accounts are pre-seeded. Refer to backend/prisma/seed.ts for login credentials.
# Run backend unit tests
npm test
# TypeScript type check across all packages
npm run typecheck- JWT authentication with
HS256, 12-hour expiry - Role-based access control (
STUDENT,COORDINATOR,ADMIN) enforced via middleware - Helmet for secure HTTP headers
- Rate limiting: 300 requests / 60 seconds per IP on all
/api/*routes - Zod schema validation on all request bodies before database calls
- In-memory PDF processing via
multer.memoryStorage()— no resume files written to disk Cache-Control: no-storeon all API responses
| Model | Purpose | Key Indexes |
|---|---|---|
User |
Auth entity with role | Unique email |
Student |
Academic profile | [branch, graduationYear], [readinessScore] |
Coordinator |
Staff department info | Unique userId |
Company |
Recruiter registry | Unique name |
PlacementDrive |
Job opening with constraints | [status, deadline], [graduationYear] |
Application |
Student-Drive relationship | Unique [studentId, driveId], [status] |
Interview |
Scheduled interview per application | Unique applicationId |
AptitudeTest |
Test blueprint | — |
Question |
MCQ per test | — |
TestResult |
Submission scores and metrics | Unique [studentId, testId] |
Notification |
In-app user alerts | — |
ActivityLog |
Admin audit trail | [timestamp], [resource] |
ResumeAnalysis |
Persisted AI scan results | [userId, createdAt] |
MIT © Sanket Chaudhari







