An intelligent recruitment platform that automates candidate screening, interview scheduling, and evaluation using AI.
- Resume Parsing - Upload resumes and automatically extract candidate information
- AI-Powered Interviews - Conduct video interviews with real-time transcription
- Smart Evaluation - Get AI-generated interview reports with scores and recommendations
- Email Automation - Send personalized acceptance/rejection emails via Brevo
- Candidate Management - Track candidates through the hiring pipeline
- Frontend: Next.js 16, React, TypeScript
- Backend: Next.js API Routes
- Database: Firebase Firestore
- Authentication: Firebase Auth
- AI: Google Gemini
- Video: Cloudinary, AssemblyAI
- Email: Brevo (Sendinblue)
- Node.js 18+
- npm or yarn
- Firebase account
- Google Gemini API key
- Brevo API key
- AssemblyAI API key
- Cloudinary account
git clone https://github.com/GitNimay/ai-recruiter.git
cd ai-recruiternpm installCreate a .env.local file in the root directory:
# Firebase Configuration
NEXT_PUBLIC_FIREBASE_API_KEY=your_firebase_api_key
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=your_project.firebaseapp.com
NEXT_PUBLIC_FIREBASE_PROJECT_ID=your_project_id
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=your_project.appspot.com
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=your_sender_id
NEXT_PUBLIC_FIREBASE_APP_ID=your_app_id
# Brevo (Sendinblue) API Key
BREVO_API_KEY=your_brevo_api_key
# Google Gemini API Key
GEMINI_API_KEY=your_gemini_api_key
# App URL
NEXT_PUBLIC_APP_URL=http://localhost:3000
# Cloudinary Configuration
NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=your_cloud_name
NEXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET=your_upload_preset
# AssemblyAI API Key
ASSEMBLYAI_API_KEY=your_assemblyai_api_key- Go to Firebase Console
- Create a new project
- Enable Authentication (Email/Password provider)
- Enable Firestore Database
- Create a web app and copy the config values to
.env.local
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
match /workspaces/{workspaceId} {
allow read, write: if request.auth != null;
match /candidates/{candidateId} {
allow read, write: if request.auth != null;
}
}
}
}- Go to Google AI Studio
- Create an API key
- Copy to
GEMINI_API_KEYin.env.local
- Sign up at Brevo
- Go to Settings > SMTP & API
- Copy your API key to
BREVO_API_KEYin.env.local - Verify your sender email
- Sign up at AssemblyAI
- Copy your API key to
ASSEMBLYAI_API_KEYin.env.local
- Sign up at Cloudinary
- Go to Settings > Upload
- Create an unsigned upload preset
- Copy cloud name and preset to
.env.local
npm run devOpen http://localhost:3000 in your browser.
npm run build
npm startai-recruiter/
├── src/
│ ├── app/
│ │ ├── api/ # API Routes
│ │ │ ├── analyze-resume/ # Resume analysis
│ │ │ ├── evaluate-interview/ # Interview evaluation
│ │ │ ├── generate-questions/ # AI question generation
│ │ │ ├── parse-resumes/ # Resume parsing
│ │ │ ├── send-decision/ # Accept/reject emails
│ │ │ ├── send-emails/ # Bulk email sending
│ │ │ └── transcribe/ # Audio transcription
│ │ ├── interview/ # Candidate interview portal
│ │ ├── workspaces/ # Recruiter dashboard
│ │ ├── login/ # Login page
│ │ └── signup/ # Signup page
│ ├── components/
│ │ ├── interview/ # Interview components
│ │ ├── DashboardHeader.tsx
│ │ ├── ProtectedRoute.tsx
│ │ └── ResumeUpload.tsx
│ ├── contexts/
│ │ └── AuthContext.tsx # Authentication context
│ ├── lib/
│ │ └── firebase.ts # Firebase configuration
│ ├── app/
│ │ ├── globals.css # Global styles
│ │ └── layout.tsx # Root layout
│ └── page.tsx # Landing page
├── .env.local # Environment variables (create this)
├── .gitignore
├── next.config.ts
├── package.json
└── tsconfig.json
- Sign Up / Login - Create an account or log in
- Create Workspace - Add a job position with requirements
- Upload Resumes - Upload candidate resumes in bulk
- Send Interview Links - Generate unique interview links for candidates
- Review Results - View interview reports in the Results tab
- Make Decisions - Accept or reject candidates with automated emails
- Access Interview - Click the link from the invitation email
- Enter Password - Use the password provided by the recruiter
- Upload Resume - Submit your resume (if not already provided)
- Complete Setup - Configure camera and microphone
- Start Interview - Answer AI-generated questions
- View Results - Wait for recruiter feedback
| Endpoint | Method | Description |
|---|---|---|
/api/parse-resumes |
POST | Parse resume content |
/api/generate-questions |
POST | Generate interview questions |
/api/send-emails |
POST | Send bulk invitation emails |
/api/transcribe |
POST | Transcribe audio to text |
/api/evaluate-interview |
POST | Evaluate interview responses |
/api/send-decision |
POST | Send accept/reject emails |
- Auth Step - Candidate enters interview password
- Resume Step - Candidate uploads/verifies resume
- Setup Step - Configure camera/mic, select language
- Interview Step - Answer 5 AI-generated questions (video recorded)
- Processing Step - AI transcribes and evaluates responses
- Report Step - View AI-generated evaluation report
| Variable | Description | Required |
|---|---|---|
NEXT_PUBLIC_FIREBASE_API_KEY |
Firebase API key | Yes |
NEXT_PUBLIC_FIREBASE_PROJECT_ID |
Firebase project ID | Yes |
BREVO_API_KEY |
Brevo SMTP API key | Yes |
GEMINI_API_KEY |
Google Gemini API key | Yes |
ASSEMBLYAI_API_KEY |
AssemblyAI transcription key | Yes |
NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME |
Cloudinary cloud name | Yes |
NEXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET |
Cloudinary upload preset | Yes |
- Ensure your Firebase config is correct in
.env.local - Check that Firestore rules allow your operations
- Verify authentication is enabled
- Verify Brevo API key is valid
- Check sender email is verified in Brevo
- Ensure recipient email is valid
- Check browser permissions for camera/microphone
- Ensure HTTPS is enabled (required for media devices)
- Verify Cloudinary configuration
- Gemini API may have rate limits
- Check your API key has sufficient quota
MIT License - feel free to use this project for your own purposes.
- Fork the repository
- Create a feature branch
- Commit your changes
- Push to the branch
- Open a Pull Request
For issues or questions, please open an issue on GitHub.