Skip to content

RuchitAgrawal/AI-Resume-Analyzer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

1 Commit
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation


🎯 AI Resume Analyzer

Complete ATS-Powered Resume Analysis System


React TypeScript Tailwind CSS React Router

Parse resumes β€’ Extract skills β€’ Match keywords β€’ Calculate ATS scores β€’ Generate AI feedback


πŸ“‹ Table of Contents

  1. ✨ Introduction
  2. βš™οΈ Tech Stack
  3. πŸ”‹ Features
  4. πŸ—οΈ System Architecture
  5. 🀸 Quick Start
  6. πŸ“‘ API Documentation
  7. πŸ’» Usage Examples
  8. 🎨 UI Components
  9. πŸ”§ Configuration
  10. πŸ“Š Performance
  11. πŸš€ Deployment
  12. 🀝 Contributing

AI Resume Analyzer is a comprehensive, production-ready system that analyzes resumes against job descriptions using advanced ATS (Applicant Tracking System) algorithms and optional LLM integration. Built with modern web technologies, it provides instant, actionable feedback to help job seekers optimize their resumes.

What Makes This Special?

  • πŸš€ Complete Pipeline: Upload β†’ Parse β†’ Match β†’ Score β†’ Feedback (all in one call)
  • πŸ€– LLM Integration: OpenAI GPT-4, Google Gemini, or Anthropic Claude for semantic analysis
  • ⚑ Lightning Fast: <250ms processing without LLM, ~2-5s with LLM
  • 🎯 Smart Matching: 150+ predefined skills with intelligent keyword matching
  • πŸ“Š Detailed Scoring: ATS score (0-100) with comprehensive breakdown
  • πŸ’‘ Actionable Feedback: Categorized suggestions (Critical/Important/Suggestion)
  • 🎨 Beautiful UI: Modern, responsive design with dark mode support
  • πŸ”’ Privacy-First: Memory-only processing, no data persistence
  • React is a popular open‑source JavaScript library for building user interfaces using reusable components and a virtual DOM, enabling efficient, dynamic single-page and native apps.

  • React Router v7 is the go‑to routing library for React apps, offering nested routes, data loaders/actions, error boundaries, code splitting, and SSR supportβ€”all with a smooth upgrade path from v6.

  • Puter.com is an advanced, open-source internet operating system designed to be feature-rich, exceptionally fast, and highly extensible. Puter can be used as: A privacy-first personal cloud to keep all your files, apps, and games in one secure place, accessible from anywhere at any time.

  • Puter.js is a tiny client‑side SDK that adds serverless auth, storage, database, and AI (GPT, Claude, DALLΒ·E, OCR…) straight into your browser appβ€”no backend needed and costs borne by users.

  • Tailwind CSS is a utility-first CSS framework that allows developers to design custom user interfaces by applying low-level utility classes directly in HTML, streamlining the design process.

  • TypeScript is a superset of JavaScript that adds static typing, providing better tooling, code quality, and error detection for developers, making it ideal for building large-scale applications.

  • Vite is a fast build tool and dev server using native ES modules for instant startup, hot‑module replacement, and Rollup‑powered production buildsβ€”perfect for modern web development.

  • Zustand is a minimal, hook-based state management library for React. It lets you manage global state with zero boilerplate, no context providers, and excellent performance through selective state subscriptions.

πŸ“„ Resume Parsing

  • βœ… PDF & DOCX Support - Parse both PDF and DOCX resume files
  • βœ… Text Extraction - Extract full plain text from documents
  • βœ… Field Detection - Automatically detect name, email, phone, skills, education, work experience
  • βœ… Metadata Analysis - Calculate word count, text statistics

🎯 Skill Extraction & Matching

  • βœ… 150+ Predefined Skills - Technical (programming, frameworks, databases, cloud) and soft skills
  • βœ… Smart Matching - Exact and partial keyword matching with word boundary detection
  • βœ… N-gram Extraction - Capture multi-word skills (e.g., "Machine Learning", "React Native")
  • βœ… Text Preprocessing - Lowercase, tokenization, stopword removal
  • βœ… Match Analysis - Identify matched vs missing keywords with percentage calculation

πŸ“Š ATS Scoring Algorithm

  • βœ… 0-100 Score - Formula-based scoring: (Matched/Total) Γ— 100
  • βœ… Format Penalty - Deduct points for poor formatting (0-20 points)
  • βœ… Section Completeness - Bonus points for standard sections (0-10 points)
  • βœ… Detailed Breakdown - Matched keywords, missing keywords, total keywords
  • βœ… Pass/Fail Determination - Configurable threshold (default: 70%)

πŸ€– LLM Integration

  • βœ… Multi-Provider Support - OpenAI GPT-4, Google Gemini, Anthropic Claude
  • βœ… Context-Rich Prompts - Send resume, JD, keywords, ATS score for analysis
  • βœ… Structured Feedback - Summary, suggestions, keyword improvements, formatting tips
  • βœ… Smart Fallback - Works perfectly without LLM using static feedback
  • βœ… Error Handling - Graceful degradation on API failures or timeouts

πŸ“‘ API Endpoints

  • βœ… /api/parse-resume - Parse PDF/DOCX files
  • βœ… /api/ats-score - Calculate ATS score and feedback
  • βœ… /api/generate-feedback - Generate LLM-powered feedback
  • βœ… /api/full-analysis - Complete end-to-end pipeline in one call

🎨 UI/UX

  • βœ… Modern Design - Clean, responsive interface built with Tailwind CSS
  • βœ… Dark Mode - Full theme support
  • βœ… Interactive Elements - Color-coded feedback, keyword badges, expandable sections
  • βœ… Real-time Results - Instant feedback display
  • βœ… Loading States - Smooth transitions and loading indicators
  • βœ… Error Handling - User-friendly error messages

πŸ”§ Developer Experience

  • βœ… TypeScript - Full type safety across the entire codebase
  • βœ… Modular Architecture - Clean separation of concerns
  • βœ… React Hooks - Easy-to-use hooks for API consumption
  • βœ… Comprehensive Documentation - Detailed guides and examples
  • βœ… Test Pages - Built-in demo pages for testing (/test-parser, /test-ats)

Follow these steps to set up the project locally on your machine.

Prerequisites

Make sure you have the following installed on your machine:

Cloning the Repository

git clone https://github.com/your-username/ai-resume-analyzer.git
cd ai-resume-analyzer

Installation

Install the project dependencies:

npm install

Install additional dependencies for resume parsing:

npm install pdf-parse mammoth @types/pdf-parse

Environment Variables (Optional - for LLM Integration)

Create a .env file in the root directory:

# LLM Configuration (optional - system works without it)
LLM_PROVIDER=openai          # Options: openai, gemini, anthropic
LLM_API_KEY=your_api_key_here
LLM_MODEL=gpt-4-turbo-preview
LLM_MAX_TOKENS=1500
LLM_TEMPERATURE=0.7

Running the Project

npm run dev

Open http://localhost:5173 in your browser to view the project.

Test Pages


β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Frontend (React)                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚
β”‚  β”‚ Upload Page  β”‚  β”‚ Test Parser  β”‚  β”‚  Test ATS    β”‚      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
                            β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    API Layer (React Router)                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                β”‚
β”‚  β”‚ /api/parse-resumeβ”‚  β”‚ /api/ats-score   β”‚                β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                β”‚
β”‚  β”‚ /api/generate-   β”‚  β”‚ /api/full-       β”‚                β”‚
β”‚  β”‚     feedback     β”‚  β”‚    analysis      β”‚                β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
                            β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   Core Libraries (app/lib)                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚
β”‚  β”‚file-parsers  β”‚  β”‚skill-extractorβ”‚  β”‚skill-matcher β”‚      β”‚
β”‚  β”‚(PDF/DOCX)    β”‚  β”‚(150+ skills)  β”‚  β”‚(matching)    β”‚      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚
β”‚  β”‚ats-scorer    β”‚  β”‚llm-service   β”‚  β”‚resume-parser β”‚      β”‚
β”‚  β”‚(algorithm)   β”‚  β”‚(OpenAI/etc)  β”‚  β”‚(fields)      β”‚      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
                            β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              External Services (Optional)                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚
β”‚  β”‚  OpenAI GPT  β”‚  β”‚Google Gemini β”‚  β”‚Anthropic     β”‚      β”‚
β”‚  β”‚     API      β”‚  β”‚     API      β”‚  β”‚Claude API    β”‚      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Processing Pipeline

1. Upload Resume (PDF/DOCX)
   ↓
2. Parse File β†’ Extract Text
   ↓
3. Extract Skills & Keywords
   ↓
4. Match with Job Description
   ↓
5. Calculate ATS Score
   ↓
6. Generate Feedback (LLM or Static)
   ↓
7. Display Results

1. Parse Resume

Endpoint: POST /api/parse-resume

Content-Type: multipart/form-data

Request:

const formData = new FormData();
formData.append('resume', file); // PDF or DOCX file

Response:

{
  "status": "success",
  "text": "Full resume text...",
  "fields": {
    "name": "John Doe",
    "email": "john@example.com",
    "phone": "+1234567890",
    "skills": ["Python", "React", "AWS"],
    "education": [...],
    "workExperience": [...]
  },
  "fileType": "pdf",
  "stats": {
    "textLength": 2500,
    "wordCount": 450
  }
}

2. Calculate ATS Score

Endpoint: POST /api/ats-score

Content-Type: application/json

Request:

{
  "resumeText": "Full resume text...",
  "jobDescription": "Job description text...",
  "resumeSkills": ["Python", "React"],
  "passThreshold": 70
}

Response:

{
  "atsScore": 75,
  "atsPass": true,
  "passThreshold": 70,
  "scoreBreakdown": {
    "matchedKeywords": 8,
    "missingKeywords": 3,
    "totalKeywords": 11,
    "formatPenalty": 5,
    "sectionCompleteness": 8
  },
  "feedback": [
    {
      "category": "important",
      "message": "Missing 3 important keywords.",
      "action": "Consider adding: AWS, Docker, Kubernetes."
    }
  ],
  "skillMatch": {
    "matchedKeywords": ["Python", "React", "Node.js"],
    "missingKeywords": ["AWS", "Docker", "Kubernetes"],
    "matchPercentage": 73
  },
  "recommendations": [...]
}

3. Generate LLM Feedback

Endpoint: POST /api/generate-feedback

Content-Type: application/json

Request:

{
  "resumeText": "...",
  "jobDescription": "...",
  "matchedKeywords": ["Python", "React"],
  "missingKeywords": ["AWS", "Docker"],
  "atsScore": 75
}

Response:

{
  "feedback": {
    "summary": "Your resume demonstrates strong technical skills...",
    "suggestions": ["Add AWS certification...", "..."],
    "keywordImprovements": ["Include Docker in DevOps section..."],
    "formattingTips": ["Use consistent bullet points..."],
    "sectionEnhancements": ["Expand Skills section..."],
    "overallRecommendation": "With these improvements...",
    "estimatedImpact": "medium"
  },
  "provider": "openai",
  "model": "gpt-4-turbo-preview",
  "status": "success"
}

4. Full Analysis Pipeline ⭐

Endpoint: POST /api/full-analysis

Content-Type: multipart/form-data

Request:

const formData = new FormData();
formData.append('resume', file);
formData.append('jobDescription', 'Job description text...');
formData.append('jobTitle', 'Software Engineer');
formData.append('useLLM', 'true'); // optional

Response: Combined results from all steps above


Using React Hooks

import { useResumeParser } from '~/lib/use-resume-parser';
import { useATSScorer } from '~/lib/use-ats-scorer';

function MyComponent() {
  const parser = useResumeParser();
  const scorer = useATSScorer();

  const handleAnalyze = async (file: File, jobDesc: string) => {
    // Step 1: Parse resume
    const parsed = await parser.parseResume(file);
    
    if (parsed) {
      // Step 2: Calculate ATS score
      const score = await scorer.calculateScore({
        resumeText: parsed.text,
        resumeSkills: parsed.fields.skills,
        jobDescription: jobDesc,
      });
      
      console.log('ATS Score:', score?.atsScore);
      console.log('Matched:', score?.skillMatch.matchedKeywords);
      console.log('Missing:', score?.skillMatch.missingKeywords);
    }
  };

  return (
    <div>
      {/* Your UI */}
    </div>
  );
}

Using Full Analysis API

async function analyzeResume(file: File, jobDescription: string) {
  const formData = new FormData();
  formData.append('resume', file);
  formData.append('jobDescription', jobDescription);
  formData.append('useLLM', 'true');

  const response = await fetch('/api/full-analysis', {
    method: 'POST',
    body: formData,
  });

  const result = await response.json();
  
  console.log('ATS Score:', result.atsScoring.atsScore);
  console.log('Matched Keywords:', result.skillMatching.matchedKeywords);
  console.log('LLM Feedback:', result.llmFeedback?.feedback);
  
  return result;
}

cURL Examples

Parse Resume:

curl -X POST http://localhost:5173/api/parse-resume \
  -F "resume=@resume.pdf"

Calculate ATS Score:

curl -X POST http://localhost:5173/api/ats-score \
  -H "Content-Type: application/json" \
  -d '{
    "resumeText": "Software Engineer with Python, React...",
    "jobDescription": "Looking for Python, React, AWS..."
  }'

Full Analysis:

curl -X POST http://localhost:5173/api/full-analysis \
  -F "resume=@resume.pdf" \
  -F "jobDescription=Looking for Python, React, AWS..." \
  -F "useLLM=true"

ResumeParserDemo

Located at /test-parser, this component demonstrates resume parsing:

  • File upload interface
  • Parsing progress indicator
  • Extracted fields display
  • Skills as badges
  • Full text viewer
  • Error handling

ATSScorerDemo

Located at /test-ats, this component demonstrates ATS scoring:

  • Side-by-side text input (resume + job description)
  • Real-time scoring
  • Color-coded results (green/yellow/red based on score)
  • Keyword badges (matched in green, missing in red)
  • Expandable feedback sections
  • Recommendations list
  • Score breakdown visualization

LLM Providers

OpenAI:

LLM_PROVIDER=openai
LLM_API_KEY=sk-...
LLM_MODEL=gpt-4-turbo-preview

Google Gemini:

LLM_PROVIDER=gemini
LLM_API_KEY=...
LLM_MODEL=gemini-pro

Anthropic Claude:

LLM_PROVIDER=anthropic
LLM_API_KEY=...
LLM_MODEL=claude-3-sonnet-20240229

Custom Skills

Add industry-specific skills:

import { SkillExtractor } from '~/lib/skill-extractor';

const customSkills = ['Rust', 'Elixir', 'Blockchain', 'Web3'];
const extractor = new SkillExtractor(customSkills);

ATS Threshold

Adjust the pass/fail threshold:

import { ATSScorer } from '~/lib/ats-scorer';

const scorer = new ATSScorer(80); // 80% threshold instead of default 70%

Operation Time Notes
PDF Parsing ~100ms Typical 2-page resume
DOCX Parsing ~50ms Faster than PDF
Skill Extraction ~50ms 150+ skills checked
Keyword Matching ~20ms Smart comparison
ATS Scoring ~10ms Formula-based
Total (without LLM) ~230ms Very fast
LLM Feedback 2-5s Depends on provider
Total (with LLM) ~2.5-5.5s Still acceptable

Optimization Tips

  • Cache parsed resumes to avoid re-parsing
  • Batch process multiple resumes
  • Use LLM only when needed (fallback is fast)
  • Monitor API usage for LLM costs

Deployment Checklist

  • Install dependencies: npm install pdf-parse mammoth
  • Configure environment variables (if using LLM)
  • Test all endpoints locally
  • Set up CORS if needed
  • Configure rate limiting
  • Set up monitoring/logging
  • Test with real resumes
  • Verify dark mode works
  • Test mobile responsiveness
  • Set up error tracking (Sentry, etc.)

Environment Variables for Production

NODE_ENV=production
LLM_PROVIDER=openai
LLM_API_KEY=your_production_key
LLM_MODEL=gpt-4-turbo-preview
LLM_MAX_TOKENS=1500
LLM_TEMPERATURE=0.7

Contributions are welcome! Please follow these steps:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

Development Guidelines

  • Follow TypeScript best practices
  • Add tests for new features
  • Update documentation
  • Ensure all tests pass
  • Follow existing code style

πŸ“„ License

This project is licensed under the MIT License.


πŸ™ Acknowledgments

  • pdf-parse - PDF parsing library
  • mammoth - DOCX parsing library
  • OpenAI, Google, Anthropic - LLM providers
  • React Router - Routing framework
  • Tailwind CSS - Styling framework

πŸ“ž Support

For questions or issues:

  • Open an issue on GitHub
  • Check the test pages: /test-parser, /test-ats
  • Review API documentation: GET any endpoint for docs

Built with ❀️ for job seekers everywhere

⭐ Star this repo if you find it helpful!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors