An intelligent recruitment platform that automates candidate evaluation through resume parsing, live AI interviews, and intelligent scoring algorithms.
- Overview
- Features
- Technology Stack
- Prerequisites
- Installation
- Configuration
- Usage
- API Documentation
- Deployment
- Testing
- Project Structure
- Contributing
- License
- Support
Metis revolutionizes the recruitment process by automating candidate evaluation through a two-round assessment system:
- Round 1 (30%): Resume parsing and evaluation using AI
- Round 2 (70%): Live AI-powered interview with contextual questions
- Final Scoring: Weighted algorithm combining both rounds with detailed feedback
The platform supports both candidates and HR recruiters, providing a seamless experience from application to final candidate selection.
- Resume upload with automatic parsing and form auto-fill
- Live AI interview with voice and text input support
- Real-time feedback and scoring
- Application status tracking
- Profile management with skills and experience tracking
- Job posting creation and management
- Automated candidate evaluation pipeline
- Intelligent leaderboard with ranked candidates
- Interview transcript review
- Comprehensive candidate analytics
- Bulk candidate management
- Resume Parser: Extracts skills, experience, education from PDF/DOC/DOCX files
- AI Interviewer: Context-aware questioning based on candidate's resume
- Scoring Engine: Weighted algorithm combining resume analysis and interview performance
- Real-time Communication: WebSocket-based live interviews
- Responsive Design: Mobile-friendly interface built with modern web technologies
- Framework: Next.js 16 with App Router
- Language: TypeScript
- Styling: Tailwind CSS with shadcn/ui components
- State Management: React Context API
- Authentication: NextAuth.js with OAuth support
- Real-time: Socket.io client for live interviews
- Framework: Flask with Flask-SocketIO
- Language: Python 3.11+
- Database: MongoDB with MongoEngine ODM
- Authentication: JWT tokens with role-based access
- Real-time: SocketIO for WebSocket communication
- AI Integration: Groq API for LLM services
- Resume Parser: Custom METIS model for document analysis
- Interview Engine: LangGraph for conversational AI
- Scoring Algorithm: Custom weighted scoring system
- Voice Processing: Speech-to-text integration
- Deployment: Docker containerization
- Hosting: Vercel (frontend), Railway/Render (backend)
- Database: MongoDB Atlas or self-hosted MongoDB
- Caching: Redis for session management
- Monitoring: Built-in logging and error tracking
Before installing Metis, ensure you have the following:
- Python: Version 3.11 or higher
- Node.js: Version 20+ (or Bun runtime)
- MongoDB: Local installation or MongoDB Atlas account
- Git: For version control
- Docker: Optional, for containerized deployment
- Groq API Key: For AI language model services
- MongoDB Connection String: Database access
- OAuth Credentials: Google/GitHub/LinkedIn (optional)
-
Clone the Repository
git clone https://github.com/yourusername/metis.git cd metis -
Backend Setup
cd backend # Create virtual environment python -m venv venv # Activate virtual environment # Windows: venv\Scripts\activate # macOS/Linux: source venv/bin/activate # Install dependencies pip install -r requirements.txt # Copy environment template cp .env.example .env # Edit .env with your configuration (see Configuration section)
-
Frontend Setup
cd ../frontend # Install dependencies bun install # or: npm install # Copy environment template cp .env.example .env.local # Edit .env.local if needed
-
Database Setup
# Ensure MongoDB is running locally or configure Atlas connection # Update MONGO_URI in backend/.env
-
Start Development Servers
# Terminal 1: Backend cd backend python app.py # Terminal 2: Frontend cd frontend bun run dev # or: npm run dev
-
Access the Application
- Frontend: http://localhost:3000
- Backend API: http://localhost:5000
Create a .env file in the backend/ directory with the following variables. You can copy from backend/.env.example:
# Database Configuration
MONGO_URI=mongodb://localhost:27017/metis
# For MongoDB Atlas, use:
# MONGO_URI=mongodb+srv://username:password@cluster.mongodb.net/metis
# AI Services
GROQ_API_KEY=your_groq_api_key_here
# Security Keys
SECRET_KEY=your_random_secret_key_here
JWT_SECRET_KEY=your_jwt_secret_key_here
# Environment Settings
FLASK_ENV=development
DEBUG=True
# CORS Configuration
FRONTEND_URL=http://localhost:3000
# WebSocket Configuration (for production)
# WS_URL=wss://your-backend-domain.com
# Optional: Redis Configuration (for production caching)
# REDIS_URL=redis://localhost:6379
# Optional: Email Configuration
# SMTP_SERVER=smtp.gmail.com
# SMTP_PORT=587
# SMTP_USERNAME=your-email@gmail.com
# SMTP_PASSWORD=your-app-password
# Optional: File Upload Settings
# MAX_FILE_SIZE=5242880 # 5MB in bytes
# UPLOAD_FOLDER=uploads/
# Optional: Logging Configuration
# LOG_LEVEL=INFO
# LOG_FILE=logs/app.logCreate a .env.local file in the frontend/ directory with the following variables. You can copy from frontend/.env.example:
# API Configuration
NEXT_PUBLIC_API_URL=http://localhost:5000
NEXT_PUBLIC_WS_URL=http://localhost:5000
# Authentication Configuration
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=your_nextauth_secret_here
# OAuth Providers (Optional)
# Google OAuth
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
# GitHub OAuth
GITHUB_CLIENT_ID=your_github_client_id
GITHUB_CLIENT_SECRET=your_github_client_secret
# LinkedIn OAuth
LINKEDIN_CLIENT_ID=your_linkedin_client_id
LINKEDIN_CLIENT_SECRET=your_linkedin_client_secret
# Production Configuration (when deploying)
# NEXT_PUBLIC_API_URL=https://your-backend-api.com
# NEXT_PUBLIC_WS_URL=wss://your-backend-api.com
# NEXTAUTH_URL=https://your-frontend-domain.com
# Optional: Analytics
# NEXT_PUBLIC_GA_ID=your_google_analytics_id
# NEXT_PUBLIC_MIXPANEL_TOKEN=your_mixpanel_token
# Optional: Error Tracking
# NEXT_PUBLIC_SENTRY_DSN=your_sentry_dsn
# Optional: CDN Configuration
# NEXT_PUBLIC_CDN_URL=https://your-cdn-domain.com
# Development Configuration
# NODE_ENV=development- Registration: Create an account with email/password or OAuth
- Profile Setup: Complete your profile with personal information
- Resume Upload: Upload your resume for automatic parsing
- Job Search: Browse available job postings
- Application: Apply to jobs with auto-filled information
- AI Interview: Complete the live AI interview when scheduled
- Results: View your scores and feedback
- Registration: Create an HR account
- Job Creation: Post new job openings with requirements
- Candidate Review: Monitor applications and automated evaluations
- Interview Oversight: Review AI interview transcripts
- Decision Making: Use the leaderboard to select top candidates
- Analytics: Access detailed recruitment analytics
- User management and role assignment
- System configuration and settings
- Analytics dashboard
- Bulk operations and data export
User login with email and password.
Request Body:
{
"email": "user@example.com",
"password": "password123"
}Response:
{
"token": "jwt_token_here",
"user": {
"userId": "user_id",
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe",
"role": "candidate"
}
}User registration.
Request Body:
{
"email": "user@example.com",
"password": "password123",
"firstName": "John",
"lastName": "Doe",
"role": "candidate"
}Retrieve paginated list of jobs.
Query Parameters:
page: Page number (default: 1)limit: Items per page (default: 10)search: Search querylocation: Filter by locationtype: Filter by job type
Create a new job posting (HR only).
Request Body:
{
"title": "Software Engineer",
"description": "Job description here",
"requirements": ["Python", "React", "MongoDB"],
"location": "Remote",
"type": "full-time",
"salary": {
"min": 50000,
"max": 80000,
"currency": "USD"
}
}Retrieve detailed job information.
Submit a job application.
Request Body:
{
"jobId": "job_id_here",
"resume": "uploaded_file",
"coverLetter": "Optional cover letter",
"answers": {
"experience": "5 years",
"availability": "immediate"
}
}Get applications for a candidate.
Get applications for a job (HR only).
Start an AI interview session.
Request Body:
{
"applicationId": "application_id",
"jobId": "job_id"
}Real-time interview communication.
Message Format:
{
"type": "answer",
"content": "User's answer here",
"questionId": "current_question_id"
}Get current user profile.
Update user profile.
Request Body:
{
"firstName": "John",
"lastName": "Doe",
"phone": "+1234567890",
"skills": ["Python", "JavaScript"],
"experience": "5 years",
"education": [
{
"institution": "University Name",
"degree": "Bachelor's",
"field": "Computer Science",
"year": 2020
}
]
}Upload and parse resume.
Request Body: FormData with file
Get evaluation results for an application.
Get candidate rankings for a job (HR only).
-
Prepare Environment
cp .env.example .env # Edit .env with production values -
Build and Deploy
docker-compose up -d
-
Access Application
- Frontend: https://your-domain.com
- Backend: https://your-backend-domain.com
# Using Railway
railway login
railway link
railway up
# Using Render
# Connect GitHub repository and deploy# Using Vercel
vercel --prod
# Configure environment variables in Vercel dashboard- Environment variables configured
- Database connection established
- SSL certificates configured
- Domain DNS configured
- WebSocket support verified (Railway/Render)
- File upload limits configured
- Rate limiting implemented
- Monitoring and logging set up
- Backup strategy implemented
cd backend
pytestcd frontend
bun test
# or: npm testcd frontend
bun run test:e2e
# or: npm run test:e2e- User registration and login
- Profile completion
- Resume upload and parsing
- Job search and filtering
- Application submission
- AI interview completion
- Results viewing
- HR registration and login
- Job posting creation
- Candidate application review
- Interview transcript access
- Leaderboard functionality
- Analytics dashboard
metis/
├── backend/
│ ├── api/ # API route handlers
│ ├── models/ # Database models and AI models
│ ├── routes/ # Flask route definitions
│ ├── services/ # Business logic services
│ ├── utils/ # Utility functions
│ ├── config/ # Configuration files
│ ├── app.py # Main Flask application
│ ├── wsgi.py # WSGI entry point
│ └── requirements.txt # Python dependencies
├── frontend/
│ ├── app/ # Next.js app router pages
│ │ ├── dashboard/ # Protected dashboard pages
│ │ ├── auth/ # Authentication pages
│ │ └── api/ # Next.js API routes
│ ├── components/ # Reusable React components
│ ├── contexts/ # React context providers
│ ├── hooks/ # Custom React hooks
│ ├── lib/ # Utility libraries and API clients
│ ├── types/ # TypeScript type definitions
│ └── package.json # Node.js dependencies
├── docs/ # Documentation files
├── docker-compose.yml # Docker orchestration
├── Dockerfile # Container configuration
├── LICENSE # License file
└── README.md # This file
We welcome contributions to Metis! Please follow these guidelines:
-
Fork the Repository
git clone https://github.com/yourusername/metis.git cd metis git checkout -b feature/your-feature-name -
Set Up Development Environment
# Follow installation instructions above -
Make Changes
- Write clear, concise commit messages
- Add tests for new features
- Update documentation as needed
- Ensure code follows existing style guidelines
-
Testing
# Run all tests cd backend && pytest cd ../frontend && bun test
-
Submit Pull Request
- Provide detailed description of changes
- Reference any related issues
- Ensure CI checks pass
- Python: Follow PEP 8 with Black formatter
- TypeScript: Use ESLint and Prettier
- Commits: Use conventional commit format
- Documentation: Update README and docs for API changes
- Use GitHub Issues for bug reports and feature requests
- Provide detailed steps to reproduce bugs
- Include relevant error messages and logs
- Specify your environment (OS, browser, versions)
This project is licensed under the MIT License - see the LICENSE file for details.
- Documentation: Check the docs/ directory
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Email: Contact the maintainers
WebSocket Connection Failed
- Ensure backend is deployed to WebSocket-compatible platform (Railway/Render)
- Check firewall settings and CORS configuration
- Verify WebSocket URLs in environment variables
Resume Parsing Failed
- Check file format (PDF/DOC/DOCX supported)
- Verify file size limits
- Ensure METIS model is properly configured
AI Interview Not Starting
- Confirm Groq API key is valid
- Check WebSocket connection
- Review server logs for errors
Database Connection Issues
- Verify MongoDB connection string
- Check network connectivity
- Ensure database user has proper permissions
- Use Redis for session caching in production
- Implement rate limiting for API endpoints
- Configure proper database indexing
- Use CDN for static assets
- Monitor memory usage in AI processing
We would like to thank the following contributors for their valuable contributions to Metis:
- Ansh - Project Lead & Full-Stack Developer
- Frontend Architecture (Next.js, TypeScript, Tailwind CSS)
- Backend Development (Flask, Python, MongoDB)
- AI Integration (Groq API, LangGraph, Resume Parsing)
- System Design & Deployment
We welcome contributions from the community! See our Contributing Guidelines to get started.
Metis - Transforming recruitment through intelligent automation.