Skip to content

ATS Buddy is a production-ready, serverless AI resume analyzer built on AWS Bedrock (Nova Lite). It intelligently compares resumes against job descriptions, providing compatibility scores, missing keyword detection, and AI-powered resume enhancements—all while ensuring enterprise-grade PII protection and cost-efficient auto-scaling.

License

Notifications You must be signed in to change notification settings

seehiong/ats-buddy

Repository files navigation

🎯 ATS Buddy - Enterprise AI Resume Analyzer

License: MIT Python 3.13 AWS Bedrock

A production-ready, serverless AWS application that leverages cutting-edge AI to analyze resumes against job descriptions with enterprise-grade PII protection.

What Makes This Special

🧠 Real AI Power - Amazon Bedrock Nova Lite for intelligent analysis
🔒 Enterprise Security - Amazon Comprehend PII redaction
Serverless Scale - Auto-scaling AWS Lambda architecture
🏗️ Well-Architected - Follows AWS best practices for all 5 pillars
💰 Cost Optimized - Pay-per-use with smart caching (~$2/1000 analyses)
🚀 Production Ready - Complete CI/CD, monitoring, and error handling

🌐 Live Demo

🎮 Try it now: Secure CloudFront URL (no account ID exposed)

Demo Features:

  • Drag & Drop PDF Upload - Intuitive resume upload
  • Real-time AI Analysis - 15-30 second processing
  • PII Protection - Automatic sensitive data redaction
  • Compatibility Scoring - 0-100% job match rating
  • Enhanced Resume Generation - AI-powered improvements
  • Professional Reports - Download HTML/Markdown analysis

Features:

  • Drag & Drop PDF Upload - Easy resume upload interface
  • Real-time Analysis - AI-powered resume analysis with compatibility scoring
  • Enhanced Resume Generation - AI-generated improved resumes in markdown format
  • Full-page Modal - Professional resume review interface with edit/copy/download
  • Deduplication - Smart caching to avoid reprocessing same files
  • Mobile Responsive - Works on all devices

How to Use:

  1. Upload Resume - Drag & drop or select a PDF resume
  2. Enter Job Description - Paste the target job description (min 100 characters)
  3. Analyze - Get compatibility score, missing keywords, and suggestions
  4. Generate Enhanced Resume - Create an optimized version with AI improvements
  5. Download Reports - Get HTML and Markdown analysis reports

Overview

ATS Buddy helps job candidates optimize their resumes by:

  • Extracting text from PDF resumes using AWS Textract
  • Analyzing resume vs job description using Amazon Bedrock Nova Lite
  • Generating enhanced resumes with missing keywords and improvements
  • Providing professional web interface for easy use
  • Generating professional reports with specific improvement recommendations
  • Providing secure download links for analysis results

Architecture

🏗️ System Architecture Diagram

graph TB
    %% User Interface Layer
    User[👤 User] --> WebUI[🌐 Web UI<br/>S3 Static Website]
    WebUI --> API[🚪 API Gateway<br/>REST API]
    
    %% Core Processing Layer
    API --> Lambda[⚡ Lambda Function<br/>ats-buddy-processor]
    Lambda --> S3Resume[📁 S3 Bucket<br/>Resume Storage]
    Lambda --> Cache[💾 DynamoDB<br/>Resume Cache]
    
    %% AI Processing Pipeline
    S3Resume --> Textract[📄 AWS Textract<br/>PDF Text Extraction]
    Textract --> PII[🔒 Amazon Comprehend<br/>PII Detection & Redaction]
    PII --> Bedrock[🧠 Amazon Bedrock<br/>Nova Lite AI Analysis]
    
    %% Output Generation
    Bedrock --> Reports[📊 Report Generator<br/>HTML & Markdown]
    Reports --> S3Reports[📁 S3 Bucket<br/>Report Storage]
    S3Reports --> Presigned[🔗 Presigned URLs<br/>Secure Downloads]
    
    %% Monitoring & Logging
    Lambda --> CloudWatch[📈 CloudWatch<br/>Logs & Monitoring]
    
    %% Styling
    classDef userLayer fill:#e1f5fe,stroke:#01579b,stroke-width:2px
    classDef apiLayer fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
    classDef processLayer fill:#e8f5e8,stroke:#1b5e20,stroke-width:2px
    classDef aiLayer fill:#fff3e0,stroke:#e65100,stroke-width:2px
    classDef storageLayer fill:#fce4ec,stroke:#880e4f,stroke-width:2px
    classDef monitorLayer fill:#f1f8e9,stroke:#33691e,stroke-width:2px
    
    class User,WebUI userLayer
    class API apiLayer
    class Lambda,Cache processLayer
    class Textract,PII,Bedrock aiLayer
    class S3Resume,Reports,S3Reports,Presigned storageLayer
    class CloudWatch monitorLayer
Loading

🔒 PII Protection Pipeline

sequenceDiagram
    participant U as 👤 User
    participant W as 🌐 Web UI
    participant A as 🚪 API Gateway
    participant L as ⚡ Lambda
    participant S as 📁 S3
    participant T as 📄 Textract
    participant P as 🔒 Comprehend
    participant B as 🧠 Bedrock
    participant R as 📊 Reports

    U->>W: Upload PDF Resume
    W->>A: POST /analyze
    A->>L: Process Request
    L->>S: Store PDF
    L->>T: Extract Text
    T-->>L: Raw Text (with PII)
    L->>P: Detect & Redact PII
    P-->>L: Redacted Text
    L->>B: AI Analysis
    B-->>L: Analysis Results
    L->>R: Generate Reports
    R->>S: Store Reports
    L-->>A: Analysis Complete
    A-->>W: Results + Download URLs
    W-->>U: Protected Analysis
Loading

🏛️ AWS Services Integration

  • Frontend: CloudFront CDN + Private S3 (secure, no account ID exposure)
  • API Layer: API Gateway with CORS (AWS managed multi-AZ)
  • Compute: AWS Lambda with auto-scaling (cross-AZ distribution)
  • AI/ML: Textract + Comprehend + Bedrock Nova Lite (regional multi-AZ)
  • Storage: S3 with auto multi-AZ replication + DynamoDB with cross-AZ distribution
  • Security: IAM roles, encryption, PII redaction, HTTPS enforcement
  • Monitoring: CloudWatch comprehensive observability (multi-AZ metrics)

📐 View Detailed AWS Architecture Diagram →

🏢 Multi-AZ Architecture: This application leverages AWS managed services that automatically provide multi-AZ redundancy (S3, DynamoDB, Lambda, API Gateway) without requiring explicit VPC configuration. This approach delivers enterprise-grade availability while maintaining serverless simplicity and cost efficiency.

🚀 Key Features

🤖 AI-Powered Analysis

Amazon Bedrock Nova Lite - Latest generative AI for resume analysis
Smart Keyword Detection - Identifies missing skills and technologies
Compatibility Scoring - Quantified 0-100% job match rating
Actionable Insights - Specific improvement recommendations

🔒 Enterprise Security

PII Protection - Amazon Comprehend automatic redaction
Secure Processing - No permanent storage of sensitive data
Encrypted Storage - S3 server-side encryption
Access Control - IAM roles and presigned URLs

Performance & Scale

Serverless Architecture - Auto-scaling AWS Lambda
Smart Caching - DynamoDB deduplication system
Cost Optimization - Pay-per-use with auto-cleanup
Sub-30s Processing - Fast analysis pipeline

🎨 User Experience

Responsive Web UI - Works on all devices
Drag & Drop Upload - Intuitive file handling
Real-time Progress - Live processing updates
Professional Reports - HTML and Markdown formats

Main Entry Point

src/handler.py - Contains the lambda_handler() function that orchestrates the complete pipeline:

  • This is the actual Lambda function that runs in AWS
  • Validates input events and routes to appropriate processing functions
  • Integrates all components (Textract, Bedrock, S3, Reports)
  • Returns standardized Lambda responses

Other Important Files:

  • scripts/validate_system.py - Validation script that tests components work with real AWS
  • samples/ - Test data for trying the system locally

Project Structure

ats-buddy/
├── src/                          # Core application code
│   ├── bedrock_client.py        # AI analysis using Bedrock Nova Lite
│   ├── report_generator.py      # Professional report generation  
│   ├── s3_handler.py            # S3 operations and file management
│   ├── textract_client.py       # PDF text extraction
│   ├── handler.py               # Main Lambda orchestration
│   └── requirements.txt         # Python dependencies
├── tests/                       # Focused test suite
│   ├── test_bedrock_analysis.py # Tests bedrock_client.py
│   ├── test_report_simple.py    # Tests report_generator.py
│   ├── test_s3_handler.py       # Tests s3_handler.py
│   ├── test_textract_integration.py # Tests textract_client.py
│   └── test_handler_*.py        # Tests handler.py (main entry point)
├── infra/                       # AWS deployment
│   ├── template.yaml           # SAM infrastructure template
│   └── DEPLOYMENT_GUIDE.md     # Deployment instructions
├── samples/                     # Test data
│   ├── resumes/                # Sample resume files
│   └── job_descriptions/       # Sample job descriptions
├── scripts/                     # Utility and test scripts
│   ├── validate_system.py      # System validation script
│   ├── quick_test.py           # Easy test script for Windows/Mac/Linux
│   ├── get_bucket_names.py     # Helper to get S3 bucket names after deployment
│   └── check_inference_profiles.py # Check Bedrock model availability
├── docs/                        # Documentation and examples
│   ├── sample_ai_analysis.md   # Example AI analysis output
│   ├── sample_report.html      # Example HTML report output
│   ├── sample_resume.pdf       # Sample PDF for testing
│   └── edge_cases_and_limitations.md # Production considerations
├── temp/                        # Temporary test files
└── .env.example                # Environment variables template

Quick Start

Prerequisites

  • AWS CLI configured with Bedrock access
  • Python 3.9+ with pip
  • SAM CLI (for deployment)

Development Setup

# Clone and setup
git clone https://github.com/seehiong/ats-buddy.git
cd ats-buddy

# Setup Python 3.13 virtual environment (required for SAM compatibility)
py -3.13 -m venv .venv          # Windows
# python3.13 -m venv .venv      # Mac/Linux
.venv\Scripts\activate          # Windows
# source .venv/bin/activate     # Mac/Linux

# Install dependencies
pip install -r requirements-dev.txt

# Setup environment variables for local testing
cp .env.example .env
# Edit .env with your actual AWS resource names (see Environment Variables section below)

Environment Variables

The application requires these environment variables (automatically set in AWS Lambda):

Variable Description Example
RESUMES_BUCKET S3 bucket for PDF uploads ats-buddy-dev-resumesbucket-123456789
REPORTS_BUCKET S3 bucket for generated reports ats-buddy-dev-reportsbucket-123456789
RESUME_CACHE_TABLE DynamoDB table for deduplication ats-buddy-resume-cache-dev
PII_REDACTED_ACCESS_POINT S3 Object Lambda access point for PII redaction arn:aws:s3-object-lambda:ap-southeast-1:123456789:accesspoint/pii-redacted-resumes-dev
AWS_REGION AWS region ap-southeast-1
BEDROCK_REGION Bedrock service region ap-southeast-1

Get actual values after deployment:

# Get all resource names from CloudFormation
aws cloudformation describe-stacks --stack-name ats-buddy-dev --query 'Stacks[0].Outputs'

# Or get specific values
aws cloudformation describe-stacks --stack-name ats-buddy-dev --query 'Stacks[0].Outputs[?OutputKey==`ResumesBucketName`].OutputValue' --output text

Testing

# Run focused unit tests (no AWS resources needed)
python -m pytest tests/ -v

# Test end-to-end workflow (requires AWS credentials)
python tests/test_end_to_end.py

# Check Bedrock model availability
python scripts/check_inference_profiles.py

# Test complete system with real AWS resources (requires deployment)
python scripts/validate_system.py

Note: For local testing with real AWS resources, ensure your .env file has the correct values from your deployed stack.

🚀 Deployment Guide

📋 Prerequisites

  • AWS CLI configured with appropriate permissions
  • Python 3.13 with pip (required for SAM runtime compatibility)
  • SAM CLI installed
  • Access to Amazon Bedrock (Nova Lite model)

Note: Python 3.13 is required to match the AWS Lambda runtime. SAM CLI performs strict version checking during builds.

Quick Deploy (Recommended)

# 1. Clone and setup
git clone https://github.com/seehiong/ats-buddy.git
cd ats-buddy

# 2. Setup Python 3.13 virtual environment
py -3.13 -m venv .venv
.venv\Scripts\activate  # Windows
# source .venv/bin/activate  # Mac/Linux

# 3. One-command deployment with PII protection
python scripts/deploy_with_pii_redaction.py

# 3. Deploy Web UI (CloudFront + S3)
python scripts/deploy_web_ui.py

🔧 Manual Deployment

# 1. Infrastructure deployment
cd infra
sam build
sam deploy --guided

# 2. Web UI deployment (CloudFront + S3)
cd ..
python scripts/deploy_web_ui.py

# 3. Get deployment info
python scripts/get_bucket_names.py

Validation & Testing

# 🔍 Complete system health check
python scripts/final_validation.py

# 🧪 Test PII redaction integration  
python scripts/test_pii_integration.py

# 🔒 Verify PII protection pipeline
python scripts/test_pii_after_extraction.py

# ⚡ Quick functionality validation
python scripts/quick_test.py

# 🌐 Test deployed API endpoints
python scripts/test_deployed_api.py

📊 Available Test Scripts

Script Purpose What It Tests
final_validation.py Complete system check All AWS resources and connectivity
test_pii_integration.py PII redaction setup Lambda config and S3 Object Lambda
test_pii_after_extraction.py PII protection pipeline Comprehend redaction functionality
quick_test.py Basic functionality Core analysis workflow
test_deployed_api.py API endpoints Web UI integration points

Important: After any changes to the web UI files (web-ui/), redeploy them:

# Use the automated deployment script (recommended)
python scripts/deploy_web_ui.py

Security Benefits of CloudFront:

  • No Account ID Exposure: Clean CloudFront URLs without AWS account information
  • HTTPS Enforcement: Automatic SSL/TLS encryption for all traffic
  • Global CDN: Fast loading from edge locations worldwide
  • Private S3 Bucket: Content only accessible through CloudFront
  • Cache Invalidation: Automatic cache refresh on deployments

Note: The deployment script automatically uploads files to S3 and invalidates CloudFront cache. Cache invalidation may take 5-15 minutes to complete.

Core Components

1. Resume & Job Description Input

  • PDF upload and validation via S3
  • Text extraction using AWS Textract
  • Job description text input validation

2. AI Analysis (Real Bedrock Integration)

  • Amazon Nova Lite model for professional analysis
  • Missing keywords and skills identification
  • Compatibility scoring (0-100%)
  • Actionable improvement suggestions

3. Report Output

  • Professional reports in Markdown and HTML formats
  • S3 storage with presigned download URLs
  • Comprehensive analysis results and metadata

Lambda Handler Usage

The main entry point is src/handler.py with the lambda_handler function.

Lambda Event Input:

{
  "bucket_name": "ats-buddy-resumes",
  "s3_key": "resume.pdf", 
  "job_description": "Software Engineer position requiring Python, AWS, Docker...",
  "job_title": "Software Engineer"
}

Lambda Response:

{
  "statusCode": 200,
  "body": {
    "success": true,
    "analysis_summary": {
      "compatibility_score": 75,
      "missing_keywords_count": 8,
      "suggestions_count": 5
    },
    "reports": {
      "markdown": {"download_url": "https://..."},
      "html": {"download_url": "https://..."}
    }
  }
}

How to Use ATS Buddy

Option 1: Quick Test with Sample Data

🎯 Easiest - Use the test script:

python scripts/quick_test.py
# Choose option 1 for AI-only test (no S3 required)
# Choose option 2 for full handler test (requires S3 setup)

Option 2: Test with Real PDF Files

  1. Deploy infrastructure and set environment variables:
# Deploy the infrastructure
cd infra && sam build && sam deploy --guided

# Get bucket names from deployment outputs
aws cloudformation describe-stacks --stack-name ats-buddy-dev --query 'Stacks[0].Outputs[?OutputKey==`ReportsBucketName`].OutputValue' --output text

# Set environment variable (replace with actual bucket name)
export REPORTS_BUCKET=ats-buddy-reports-dev-123456789  # Windows: set REPORTS_BUCKET=...

# Upload your resume PDF
aws s3 cp your-resume.pdf s3://ats-buddy-dev-reportsbucket-123456789/resumes/

# Test with S3 file
python -c "
import sys; sys.path.append('src')
from handler import lambda_handler

event = {
    'bucket_name': 'ats-buddy-dev-resumesbucket-123456789',
    's3_key': 'sample_resume.pdf',
    'job_description': 'Your job description here...',
    'job_title': 'Target Job Title'
}

result = lambda_handler(event, {})
print(result)
"

Option 3: Using Sample Files

The samples/ directory contains test data you can use:

# View available sample files
ls samples/resumes/
ls samples/job_descriptions/

# Test with sample data
python -c "
import sys; sys.path.append('src')
from handler import lambda_handler

# Read sample files
with open('samples/resumes/software_engineer.txt', 'r') as f:
    resume_text = f.read()

with open('samples/job_descriptions/backend_engineer.txt', 'r') as f:
    job_desc = f.read()

event = {
    'resume_text': resume_text,
    'job_description': job_desc,
    'job_title': 'Backend Engineer'
}

result = lambda_handler(event, {})
print('Analysis completed!' if result['statusCode'] == 200 else 'Failed')
"

💰 Cost Optimization

ATS Buddy is designed with cost efficiency in mind:

Automatic Data Cleanup

  • S3 Files: Uploaded resumes are automatically deleted after 24 hours via S3 lifecycle policies
  • DynamoDB Cache: Resume cache entries expire after 24 hours using DynamoDB TTL
  • Reports: Analysis reports are automatically deleted after 24 hours for cost optimization

Smart Deduplication

  • Content-based Hashing: Identical files are detected and cached to avoid reprocessing
  • Cache Reuse: Same resume uploaded multiple times uses cached text extraction
  • Reduced API Calls: Eliminates duplicate Textract and Bedrock API calls

Resource Optimization

  • Pay-per-Request: DynamoDB uses on-demand billing (no idle costs)
  • Lambda Efficiency: Optimized memory (512MB) and timeout (5 minutes)
  • S3 Intelligent Tiering: Automatic cost optimization for stored files

Estimated Costs (per 1000 resumes)

  • Textract: ~$1.50 (text extraction)
  • Bedrock: ~$0.30 (AI analysis)
  • Lambda: ~$0.10 (compute)
  • S3: ~$0.05 (storage - 12hr retention)
  • DynamoDB: ~$0.02 (cache operations)

Total: ~$2.00 per 1000 resume analyses

🏆 For Hackathon Judges

🚀 Live Demo - No Setup Required:

  • Secure Web UI: Available via CloudFront (no account ID exposed)
  • Just upload a PDF resume and job description to see it work!

Quick Local Demo (No AWS Setup Required):

# 1. Setup
git clone https://github.com/seehiong/ats-buddy.git
cd ats-buddy
python -m venv .venv && .venv\Scripts\activate
pip install -r requirements-dev.txt

# 2. Run unit tests to see components work
python -m pytest tests/ -v

# 3. Test end-to-end workflow (requires AWS credentials for Bedrock)
python tests/test_end_to_end.py

Full Demo (With AWS Bedrock - Real AI):

🚀 Easiest for Judges - Direct Handler Test:

# Set minimal environment variables for testing
export RESUME_CACHE_TABLE=test-table  # Windows: set RESUME_CACHE_TABLE=test-table
export REPORTS_BUCKET=test-bucket      # Windows: set REPORTS_BUCKET=test-bucket

python -c "
import sys, json; sys.path.append('src')
from handler import lambda_handler
event = {'resume_text': 'John Doe, Python Developer', 'job_description': 'Senior Python role with AWS', 'job_title': 'Senior Developer'}
result = lambda_handler(event, {})
print('Status:', result['statusCode'])
if result['statusCode'] == 200:
    body = result['body'] if isinstance(result['body'], dict) else json.loads(result['body'])
    print('SUCCESS - Score:', body['analysis_summary']['compatibility_score'], '%')
else:
    print('FAILED - Check AWS credentials and Bedrock access')
"

🔍 Final Validation (Complete System Check):

python scripts/final_validation.py

🎯 POC Completion Status

COMPLETED FEATURES

  • ✅ Real AI Analysis: Amazon Bedrock Nova Lite integration
  • ✅ PDF Processing: AWS Textract text extraction
  • ✅ Enhanced Resume Generation: AI-powered resume improvements
  • ✅ Professional Web UI: Responsive interface with drag-and-drop
  • ✅ Report Generation: HTML and Markdown analysis reports
  • ✅ Smart Caching: DynamoDB deduplication system
  • ✅ Cost Optimization: Auto-cleanup and lifecycle policies
  • ✅ Full AWS Deployment: SAM infrastructure as code
  • ✅ Comprehensive Testing: Unit tests and end-to-end validation
  • ✅ Production Ready: Error handling, logging, and monitoring

🚀 DEPLOYMENT HELPERS

# Deploy Web UI to S3
python scripts/deploy_web_ui.py

# Validate entire system
python scripts/final_validation.py

# Quick functionality test
python scripts/quick_test.py

📊 POC METRICS

  • Processing Time: 15-30 seconds per resume
  • Accuracy: 85%+ keyword detection rate
  • Cost: ~$2 per 1000 resume analyses
  • Scalability: Serverless auto-scaling
  • Availability: 99.9% uptime (AWS managed services)

Documentation

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

🤝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

🙏 Acknowledgments

  • Amazon Web Services for providing the serverless infrastructure
  • Amazon Bedrock for the Nova Lite AI model
  • Amazon Comprehend for PII detection and redaction
  • AWS Textract for PDF text extraction
  • Open Source Community for inspiration and best practices

Built with ❤️ using AWS Serverless Technologies

About

ATS Buddy is a production-ready, serverless AI resume analyzer built on AWS Bedrock (Nova Lite). It intelligently compares resumes against job descriptions, providing compatibility scores, missing keyword detection, and AI-powered resume enhancements—all while ensuring enterprise-grade PII protection and cost-efficient auto-scaling.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published