A production-ready Resume ATS Score Generator that provides deterministic, explainable scoring with AI-powered suggestions. Built with clear separation between rule-based scoring logic and AI-generated explanations.
- Deterministic ATS Scoring: Transparent, reproducible scoring using classical NLP (TF-IDF, cosine similarity)
- Role-Aware Evaluation: Soft weighting system for core, transferable, and peripheral skills
- Three Evaluation Modes:
- Job Description / Job Link
- Target Role (Software Engineer, Data Scientist, Product Manager, etc.)
- General ATS Score
- AI-Powered Suggestions: GenAI strictly limited to explaining scores and suggesting improvements
- Modern React UI: Clean, responsive interface with smooth animations
- Stateless & Private: No authentication, no storage - instant analysis
Resumelens/
βββ backend/
β βββ server.js # Express API server
β βββ parsers/
β β βββ resumeParser.js # PDF/DOCX text extraction
β βββ scoring/
β β βββ sectionDetector.js # Resume section identification
β β βββ formattingChecker.js # ATS format validation
β β βββ keywordExtractor.js # TF-IDF & cosine similarity
β β βββ roleWeights.js # Role-aware weighting system
β β βββ scoreCalculator.js # Main deterministic scorer
β βββ ai/
β βββ explanationGenerator.js # GenAI explanations only
βββ frontend/
βββ src/
β βββ components/
β β βββ LandingPage.jsx # Upload & mode selection
β β βββ ScoreResults.jsx # Score visualization
β β βββ ScoreCard.jsx # Category breakdown
β β βββ FileUpload.jsx # Drag & drop upload
β βββ App.jsx
β βββ index.css # Design system
βββ package.json
- Node.js 18+
- npm or yarn
cd backend
# Install dependencies
npm install
# Configure environment
cp .env.example .env
# Edit .env and add your OpenAI API key (optional - has fallback)
# OPENAI_API_KEY=your_api_key_here
# Start the server
npm start
# or for development with auto-reload:
npm run devThe backend will run on http://localhost:5000
cd frontend
# Install dependencies
npm install
# Start development server
npm run devThe frontend will run on http://localhost:3000
Create a .env file in the backend directory:
PORT=5000
OPENAI_API_KEY=your_openai_api_key_here
ALLOWED_ORIGINS=http://localhost:3000
MAX_FILE_SIZE=10485760Note: OpenAI API key is optional. The system has a fallback explanation generator if the API is unavailable.
The ATS score is calculated using a transparent, reproducible formula:
Final Score =
Keyword Relevance (35%) +
Role Alignment (30%) +
Resume Structure (20%) +
ATS Formatting (15%)
- Uses TF-IDF to extract important keywords
- Calculates cosine similarity between resume and job description
- Combines keyword overlap (60%) and similarity (40%)
- Soft weighting based on target role:
- Core skills: 0.6-0.8 weight
- Transferable skills: 0.3-0.5 weight
- Peripheral skills: 0.1-0.2 weight
- Transferable skills add value but never outweigh missing core skills
- Detects sections using regex patterns
- Required sections: Education, Experience, Skills (20 points each)
- Optional sections: Summary, Projects, Achievements, Certifications (10 points each)
- Checks for parsing issues:
- Tables (-15 points)
- Multi-column layouts (-15 points)
- Excessive special characters (-10 points)
- Non-standard bullets (-5 points)
- All-caps overuse (-5 points)
GenAI is ONLY used for:
- Explaining the deterministic score in natural language
- Suggesting specific improvements
- Encouraging users without discouraging
GenAI NEVER:
- Generates scores
- Adjusts weights
- Overrides deterministic results
Health check endpoint
Get available target roles
Upload and parse resume (PDF/DOCX)
Calculate ATS score with breakdown
Generate AI explanation for score
Combined endpoint: upload + score + explain
- Node.js with Express
- pdf-parse - PDF text extraction
- mammoth - DOCX parsing
- natural - NLP library (TF-IDF, tokenization)
- OpenAI SDK - AI explanations (optional)
- React 18 with hooks
- Vite - Fast development
- React Router - Client-side routing
- Axios - HTTP client
- Modern CSS - Glassmorphism, gradients, animations
- No Authentication: Stateless design, no user accounts
- No Storage: Resumes are processed in-memory and deleted immediately
- No Tracking: No analytics, no cookies
- CORS Enabled: Configurable allowed origins
MIT
Contributions welcome! Please read the contributing guidelines first.
For issues or questions, please open a GitHub issue.
Built with β€οΈ using deterministic scoring and responsible AI