PlacedAI is a comprehensive SaaS platform designed to help Indian students crack campus placements through AI-powered mock interviews, ATS resume scoring, personalized job recommendations, and real-time feedback.
PlacedAI democratizes access to quality placement preparation by providing students from any college (IIT, NIT, or Tier-3) with the same high-quality AI-powered tools. Our platform includes:
- AI-Powered Mock Interviews: Practice with AI that simulates real interview scenarios with video/audio recording
- ATS Resume Scoring: Optimize your resume for Applicant Tracking Systems with detailed feedback
- Resume Builder: Create professional resumes with AI-powered suggestions and templates
- Resume Lab: Upload and analyze existing resumes for improvements
- Personalized Job Recommendations: Get matched with roles that fit your profile and skills
- Real-time AI Feedback: Receive instant feedback on interview performance with detailed analytics
- Admin Management System: Comprehensive admin dashboard for platform management
- Recruiter CRM: Browse candidates, send opt-in requests, and manage job postings
- Runtime: Node.js (v18+)
- Framework: Express.js
- Database: MongoDB with Mongoose ODM
- Authentication: JWT (JSON Web Tokens), Google OAuth2
- File Uploads: Multer
- Password Hashing: Bcrypt.js
- Email: Nodemailer (SMTP)
- WhatsApp: Twilio
- Payments: Stripe
- AI Integration: OpenAI-compatible API
- WebSockets: Socket.IO (for real-time features)
- PDF Processing: pdf-parse, puppeteer
- Resume Parsing: Custom parsers for PDF, DOC, DOCX
- Framework: React 18 with Vite
- Routing: React Router v6
- State Management: Zustand
- Styling: TailwindCSS with custom theme
- UI Components: Custom component library (inspired by shadcn/ui patterns)
- Animations: Framer Motion
- HTTP Client: Axios
- Icons: Lucide React
- Phone Input: react-phone-number-input
- Build Tool: Vite 5
- Email OTP Authentication: Secure login with one-time password sent via email
- Google Sign-In: OAuth2 authentication with Google
- Profile Completion System: Guided onboarding with resume upload and skill selection
- Phone Verification: International phone number support with validation
- Role Selection: Choose target job roles and required skills
- Plan Management: Free, Premium, and Enterprise tiers with usage limits
- Resume Upload: Support for PDF, DOC, DOCX formats
- Automatic Parsing: Extract skills, experience, education automatically
- Resume Builder: Create resumes with multiple templates
- ATS Scoring: Get detailed ATS compatibility scores with improvement suggestions
- Resume Templates: Professional templates for different industries
- Resume Export: Generate PDF versions of resumes
- Mock Interviews: Practice interviews for specific job roles
- Video/Audio Recording: Record responses during interviews
- Real-time Transcription: Live transcript streaming during interviews
- AI Scoring: Get scored on communication, confidence, technical knowledge, and more
- Detailed Feedback: Receive strengths, improvements, and detailed analytics
- Interview History: Track all past interviews and performance trends
- Shareable Results: Share interview feedback with mentors and peers
- Personalized Matching: AI-powered job recommendations based on profile
- Job Applications: Apply to jobs directly through the platform
- Application Tracking: Track all job applications in one place
- Role-Based Matching: Match based on selected role and skills
- User Management: View, block, and manage all users
- Recruiter Management: Approve/deny recruiter requests
- Interview Analytics: View all interviews and AI scores
- Payment Tracking: Monitor Stripe payments and subscriptions
- Support Tickets: Manage customer support tickets
- Usage Statistics: Track platform usage and metrics
- Admin Creation: Create new admin accounts with role-based access
- Password Management: Admins can reset their own passwords
- Candidate Browsing: Browse candidate profiles and interview results
- Opt-In Requests: Send connection requests to candidates
- Job Posting: Create and manage job listings
- Payment Plans: Subscribe to Basic, Premium, or Enterprise plans
- Credit System: Track opt-in requests and credits usage
PlacedAI/
├── README.md # This file
├── package.json # Root package with unified scripts
├── .gitignore # Git ignore rules
│
├── backend/ # Backend API server
│ ├── .env.example # Backend environment variables template
│ ├── package.json
│ ├── server.js # Express server entry point
│ │
│ ├── models/ # Mongoose models
│ │ ├── User.js
│ │ ├── Job.js
│ │ ├── Interview.js
│ │ ├── Recruiter.js
│ │ ├── Payment.js
│ │ └── ...
│ │
│ ├── routes/ # Express routes (all under /api prefix)
│ │ ├── authRoutes.js
│ │ ├── userRoutes.js
│ │ ├── jobRoutes.js
│ │ ├── interviewRoutes.js
│ │ ├── adminRoutes.js
│ │ └── ...
│ │
│ ├── middleware/ # Express middleware
│ │ ├── auth.js # JWT authentication
│ │ ├── idempotency.js # Request idempotency
│ │ ├── usageCheck.js # Usage limit checks
│ │ └── validateProfile.js # Profile validation
│ │
│ ├── services/ # Business logic services
│ │ ├── emailService.js # Email sending (Nodemailer)
│ │ ├── whatsappService.js # WhatsApp (Twilio)
│ │ ├── paymentService.js # Payments (Stripe)
│ │ └── aiScoringService.js # AI scoring
│ │
│ ├── src/ # Additional source files
│ │ ├── ai/ # AI integration modules
│ │ │ ├── aiBrain.js
│ │ │ ├── interviewAI.js
│ │ │ ├── resumeAI.js
│ │ │ └── ...
│ │ └── config/ # Configuration files
│ │ └── plans.js # Subscription plan definitions
│ │
│ ├── utils/ # Utility functions
│ │ ├── resumeParser.js # Resume parsing logic
│ │ ├── linkedInParser.js # LinkedIn import
│ │ └── templateParser.js # Template parsing
│ │
│ ├── scripts/ # Utility scripts
│ │ └── seed.js # Database seeding
│ │
│ └── uploads/ # File uploads directory
│ ├── resumes/ # User resumes
│ └── templates/ # Resume templates
│
└── frontend/ # React frontend application
├── .env.example # Frontend environment variables template
├── package.json
├── vite.config.js # Vite configuration with proxy
├── tailwind.config.js # TailwindCSS configuration
├── index.html # HTML entry point
│
├── public/ # Static assets
│ └── videos/ # Video assets
│
└── src/ # React source code
├── main.jsx # React entry point
├── App.jsx # Root component
├── index.css # Global styles
│
├── components/ # Reusable components
│ ├── auth/ # Authentication components
│ ├── layout/ # Layout components (Navbar, Sidebar, etc.)
│ ├── ui/ # UI components (Button, Input, Card, etc.)
│ ├── interview/ # Interview-related components
│ └── resume/ # Resume-related components
│
├── pages/ # Page components
│ ├── Landing.jsx
│ ├── candidate/ # Candidate pages
│ ├── admin/ # Admin pages
│ ├── recruiter/ # Recruiter pages
│ └── auth/ # Auth pages
│
├── routes/ # Route definitions
│ ├── CandidateRoutes.jsx
│ ├── AdminRoutes.jsx
│ └── RecruiterRoutes.jsx
│
├── services/ # API service layer
│ ├── api.js # Axios instance and interceptors
│ ├── candidateApi.js
│ ├── adminApi.js
│ └── recruiterApi.js
│
├── store/ # Zustand state stores
│ ├── authStore.js
│ ├── themeStore.js
│ └── toastStore.js
│
└── utils/ # Utility functions
├── cn.js # Class name utility
├── currencyFormatter.js
├── networkSimulator.js
└── speechUtils.js
- Node.js: v18 or higher
- MongoDB: Local installation or MongoDB Atlas account
- npm or yarn: Package manager
- Git: Version control
- SMTP Email Service: Gmail, SendGrid, or any SMTP provider (for OTP emails)
- Twilio Account: For WhatsApp notifications
- OpenAI API Key: For AI-powered features
- Stripe Account: For payment processing
- Google OAuth: For Google Sign-In
-
Copy the environment template:
cd backend cp .env.example .env -
Edit
backend/.envand configure the following:# Server PORT=5000 NODE_ENV=development # Database (Required) MONGO_URI=mongodb://localhost:27017/placedai # Or MongoDB Atlas: # MONGO_URI=mongodb+srv://username:password@cluster.mongodb.net/placedai # Authentication (Required) JWT_SECRET=your-super-secret-jwt-key-change-in-production GOOGLE_CLIENT_ID=your-google-client-id.apps.googleusercontent.com # Frontend URL (Required) FRONTEND_URL=http://localhost:5173 # Email Service (Optional - works in mock mode) EMAIL_FROM=noreply@placedai.com SMTP_HOST=smtp.gmail.com SMTP_PORT=587 SMTP_USER=your-email@gmail.com SMTP_PASS=your-app-password # WhatsApp Service (Optional - works in mock mode) TWILIO_ACCOUNT_SID=your-twilio-account-sid TWILIO_AUTH_TOKEN=your-twilio-auth-token TWILIO_WHATSAPP_FROM=whatsapp:+14155238886 # AI Service (Optional - works in mock mode) AI_API_BASE_URL=https://api.openai.com/v1 AI_API_KEY=your-openai-api-key # Stripe Payments (Optional - works in mock mode) STRIPE_SECRET_KEY=sk_test_your-stripe-secret-key STRIPE_WEBHOOK_SECRET=whsec_your-webhook-secret
Important Notes:
- All services work in mock mode if credentials are not provided (perfect for development)
- In mock mode, OTPs are logged to console instead of being emailed
- Generate a strong JWT_SECRET:
node -e "console.log(require('crypto').randomBytes(64).toString('hex'))" - Never commit
.envfiles to version control
-
Copy the environment template:
cd frontend cp .env.example .env.local -
Edit
frontend/.env.local:Development:
VITE_API_BASE_URL=/api VITE_GOOGLE_CLIENT_ID=your-google-client-id.apps.googleusercontent.com
Production:
VITE_API_BASE_URL=https://api.your-domain.com/api VITE_GOOGLE_CLIENT_ID=your-google-client-id.apps.googleusercontent.com
Important Notes:
- In development, use
/api(relative path) - Vite proxy will forward to backend - In production, set full backend URL
- All Vite env variables must be prefixed with
VITE_
Install all dependencies and run both servers with one command:
# Install all dependencies (root, backend, frontend)
npm run install:all
# Run both backend and frontend together
npm run devThis starts:
- Backend on
http://localhost:5000 - Frontend on
http://localhost:5173
Backend:
cd backend
npm install
npm run dev # Development with nodemon
# OR
npm start # ProductionFrontend:
cd frontend
npm install
npm run dev # Development server
# OR
npm run build # Production build
npm run preview # Preview production buildTo seed the database with sample data:
npm run seedOr manually:
cd backend
npm run seedThis creates sample jobs and other test data.
- Frontend uses relative paths (
/api/*) which are proxied by Vite - Vite proxy configuration in
frontend/vite.config.js:server: { proxy: { '/api': 'http://localhost:5000' } }
- No CORS issues since requests go through same origin
- Set
VITE_API_BASE_URLto your production API URL - Configure CORS on backend to allow your frontend domain
- Example:
VITE_API_BASE_URL=https://api.yourapp.com/api
All backend routes are prefixed with /api:
POST /api/auth/send-otp- Send OTP to emailPOST /api/auth/verify-otp- Verify OTP and get JWTPOST /api/auth/register- Register new userPOST /api/auth/login- Login with email/passwordPOST /api/auth/google- Google OAuth authenticationPOST /api/auth/admin/login- Admin loginPOST /api/auth/recruiter/register- Register recruiterPOST /api/auth/recruiter/login- Login recruiter
GET /api/user/me- Get current user profileGET /api/user/profile- Get detailed profilePATCH /api/user/profile- Update profilePUT /api/user/basic- Update basic info (phone, resume, etc.)PUT /api/user/role-skills- Update selected role and skillsPOST /api/user/resume- Upload resume
GET /api/jobs/recommend- Get personalized job recommendationsGET /api/jobs/:id- Get job detailsPOST /api/jobs- Create job (recruiter/admin)POST /api/jobs/apply- Apply to jobGET /api/jobs/applications- Get user's applications
POST /api/interview/start- Start new interviewPOST /api/interview/begin- Begin interview sessionPOST /api/interview/save-answer- Save answer to questionPOST /api/interview/next-question- Get next questionPOST /api/interview/finish- Finish interview and get AI scoresPOST /api/interview/evaluate- Evaluate completed interviewPOST /api/interview/upload-recording- Upload interview recordingGET /api/interview/my- Get user's interviewsGET /api/interview/:id- Get interview details
POST /api/resume/analyze- Analyze resume and extract dataPOST /api/resume/ats-score- Get ATS compatibility score
POST /api/admin/create- Create new admin (admin only)POST /api/admin/reset-password- Reset admin passwordGET /api/admin/users- Get all usersGET /api/admin/recruiters- Get all recruitersGET /api/admin/interviews- Get all interviewsGET /api/admin/payments- Get all paymentsGET /api/admin/stats- Get dashboard statisticsPATCH /api/admin/users/:id/block- Block/unblock userPATCH /api/admin/users/:id/premium- Update premium statusPATCH /api/admin/users/:id/plan- Update user plan
GET /api/recruiter/profile- Get recruiter profileGET /api/recruiter/jobs- Get recruiter's jobsPOST /api/recruiter/jobs- Create jobGET /api/recruiter/candidates- Browse candidatesPOST /api/recruiter/optins/request- Send opt-in requestGET /api/recruiter/optins- Get opt-in activity
GET /api/billing/plans- Get available plansPOST /api/billing/create-checkout-session- Create Stripe checkoutPOST /api/billing/webhook- Stripe webhook handlerGET /api/billing/history- Get billing history
GET /api/health- Health check endpoint
-
Set Environment Variables:
- Set all required environment variables in your hosting platform
- Use production values for
MONGO_URI,JWT_SECRET, etc. - Configure
FRONTEND_URLto your production frontend URL
-
Build & Start:
cd backend npm install --production npm start -
Recommended Hosting:
- Railway: Easy deployment with automatic environment variables
- Render: Free tier available, automatic deploys from Git
- Heroku: Traditional PaaS (paid plans available)
- DigitalOcean App Platform: Simple deployments
- AWS Elastic Beanstalk: Enterprise-grade hosting
-
Process Manager (Optional):
# Install PM2 npm install -g pm2 # Start with PM2 pm2 start server.js --name placedai-backend # Auto-restart on server reboot pm2 startup pm2 save
-
Build Production Bundle:
cd frontend npm install npm run build -
Set Environment Variables:
- Set
VITE_API_BASE_URLto your production backend URL - Build must happen with correct env variables
- Set
-
Deploy
dist/folder:- Vercel: Connect GitHub repo, auto-deploys on push
- Netlify: Drag & drop
dist/folder or connect repo - Cloudflare Pages: Fast CDN, free tier
- AWS S3 + CloudFront: Static hosting with CDN
- GitHub Pages: Free hosting for static sites
-
Configure Routing:
- For SPAs, configure redirect rules:
- Vercel: Create
vercel.jsonwith rewrites - Netlify: Create
netlify.tomlwith redirects - Nginx: Configure try_files directive
- Vercel: Create
- For SPAs, configure redirect rules:
- Create account at MongoDB Atlas
- Create a new cluster (free tier available)
- Create database user
- Whitelist your IP address (or use
0.0.0.0/0for all IPs) - Get connection string:
mongodb+srv://username:password@cluster.mongodb.net/placedai - Set
MONGO_URIin backend environment variables
Backend CORS is configured in backend/server.js:
app.use(cors({
origin: process.env.FRONTEND_URL || 'http://localhost:5173',
credentials: true
}));Ensure FRONTEND_URL matches your production frontend domain.
-
Create Webhook Endpoint in Stripe Dashboard:
- URL:
https://your-backend.com/api/billing/webhook - Events:
checkout.session.completed
- URL:
-
Get Webhook Secret:
- Copy signing secret from Stripe Dashboard
- Set as
STRIPE_WEBHOOK_SECRETin backend env
-
Local Testing (Optional):
# Install Stripe CLI stripe listen --forward-to localhost:5000/api/billing/webhook
# From root directory
npm run devThis runs:
- Backend with nodemon (auto-restart on file changes)
- Frontend with Vite (hot module replacement)
Root:
npm run dev- Run both backend and frontendnpm run install:all- Install dependencies for all packagesnpm run build- Build frontend for productionnpm run seed- Seed database with sample data
Backend:
npm run dev- Development with nodemonnpm start- Production modenpm run seed- Seed database
Frontend:
npm run dev- Development servernpm run build- Production buildnpm run preview- Preview production build
- JWT Tokens: 7-day expiration, stored in localStorage
- Password Hashing: Bcrypt with salt rounds
- API Validation: Express-validator for all inputs
- CORS: Configured for specific origins
- Environment Variables: Never committed to Git
- File Uploads: Validated file types and sizes
- Rate Limiting: Idempotency keys for duplicate request prevention
- Role-Based Access: Admin routes protected with middleware
- Mock Mode: All services (email, WhatsApp, AI, payments) work without credentials in development
- Health Check: Frontend checks
/api/healthon auth screen mount - Relative Paths: Frontend uses
/api/*which works in both dev and production - File Storage: Uploads stored locally (can be moved to S3/cloud storage)
- AI Provider: OpenAI-compatible API (can swap for other providers)
- Database: MongoDB with Mongoose ODM
- Check MongoDB connection: Ensure MongoDB is running or
MONGO_URIis correct - Verify
JWT_SECRETis set - Check port 5000 is available
- Ensure backend is running on port 5000
- Check
VITE_API_BASE_URLis set to/apiin development - Verify Vite proxy is configured in
vite.config.js - Check browser console for CORS errors
- Check email service configuration (or check console for mock OTP)
- Verify SMTP credentials are correct
- Check spam folder
- Clear
node_modulesand reinstall:rm -rf node_modules && npm install - Clear Vite cache:
rm -rf frontend/node_modules/.vite - Check Node.js version (requires v18+)
MIT
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
For issues and questions, please open an issue on GitHub.
Built with ❤️ for Indian students preparing for placements