Transform your job application game. Forever.
An AI-powered tool that doesn't just optimize your resume—it weaponizes it against Applicant Tracking Systems (ATS) to ensure you get past the digital gatekeepers and into human hands.
"The difference between a good resume and a great one isn't just content—it's strategic alignment with what machines and humans are looking for."
- Job Posting Analysis: Extracts the critical signals from job descriptions that most candidates miss
- Resume Optimization: Restructures your experience to mirror exactly what employers want to see
- ATS-Friendly Formatting: Implements the hidden formatting rules that make your resume machine-readable
- Personalized Recommendations: Provides tactical suggestions that close the gap between you and the ideal candidate
- Interview Question Generator: Creates custom questions that let you control the conversation during interviews
- Python 3.8 or higher
- OpenAI API key (for the AI-powered features)
- Chrome/Chromium (for capturing job posting screenshots)
To use the AI-powered features of this tool, you need an OpenAI API key. Follow these steps to generate your API key:
- Visit the OpenAI Quickstart Guide.
- Sign in or create an OpenAI account.
- Navigate to the API section in your account dashboard.
- Generate a new API key and keep it secure.
Once you have your API key, you can set it as an environment variable or enter it directly in the application interface.
The fastest path from zero to running:
-
Clone this repository:
git clone https://github.com/yourusername/ats-proof-resume.git cd ats-proof-resume -
Run the setup script:
chmod +x run.sh ./run.shThis will:
- Create a virtual environment
- Install all dependencies
- Start the application
-
Open your browser and navigate to:
http://localhost:8000
If you prefer control over each step:
-
Create a virtual environment:
python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate -
Install dependencies:
pip install -r requirements.txt -
Run the application:
uvicorn app.main:app --reload
For a completely isolated, reproducible environment:
- Make sure Docker and Docker Compose are installed
- Build and run with Docker Compose:
docker-compose up --build
This setup includes:
- A Selenium container for handling web scraping
- The main application container
- Proper networking between containers
- Volume mounting for the output directory
If you're running on an ARM-based machine like an M1/M2 Mac:
- The Docker setup is configured to handle ARM64 architecture automatically
- The application uses a remote Selenium WebDriver to avoid compatibility issues
- No additional configuration is needed - just run:
docker-compose up --build
- Enter your OpenAI API key (if not set as an environment variable)
- Paste the URL of the job posting you're targeting
- Upload your current resume (DOCX format only)
- Select the AI model and parameters (see model recommendations below)
- Click "Generate ATS-Proof Resume"
- Download your weaponized resume package
The choice of LLM model significantly impacts your results. After extensive testing:
- o1-mini-2024-09-12: Offers the best balance of performance and cost. Handles complex resume restructuring with excellent accuracy while being more cost-effective than GPT-4o.
- gpt-4o: Provides more creative rewrites with excellent comprehension of complex career histories, but at a higher cost (approximately 5-10x more expensive than o1-mini).
- gpt-3.5-turbo: Most economical option, acceptable for basic resumes but may struggle with complex career histories or nuanced job requirements.
For most users, o1-mini is the recommended choice as it delivers high-quality results at a reasonable cost.
Temperature Setting: The application allows you to adjust the AI's creativity level:
- Lower values (0.1-0.3): More conservative, consistent outputs
- Medium values (0.4-0.6): Balanced approach with moderate creativity
- Higher values (0.7+): More creative variations but potentially less consistent
Important: The application processes your entire resume in a single LLM call. This approach works well with modern models but may hit token limits with extremely lengthy resumes (10+ pages).
The landing page features a clean, intuitive interface with the following components:
- AI Model Selection: A dropdown menu allowing you to choose from various OpenAI models, with recommendations highlighted.
- Creativity Level Slider: Adjust the temperature parameter to control how creative or conservative the AI's output will be.
- API Key Field: Enter your OpenAI API key (a default key is provided for convenience).
- Resume Upload: A drag-and-drop area to upload your DOCX resume file.
- Job Posting URL: Enter the URL of the job posting you're targeting.
The interface is designed to be straightforward while giving you control over the key parameters that affect your resume optimization. The page also includes helpful tooltips and descriptions to guide your choices.
After processing your resume, you'll be presented with a results page that includes:
-
Success Confirmation: A visual indicator that your resume has been successfully processed.
-
Feature Cards: Three cards highlighting the key optimizations made to your resume:
- ATS Optimization: Formatting changes to make your resume readable by applicant tracking systems
- Job Targeting: Tailoring to match the specific job requirements
- Interview Preparation: Materials to help you prepare for interviews
-
Download Button: A prominent button to download your complete resume package.
-
Start Over Option: A button to return to the landing page and process another resume.
-
Download Instructions: Helpful tips about handling any browser security warnings when downloading the ZIP file.
The results page is designed to clearly communicate the value of the optimizations made to your resume while making it easy to access your new resume package.
The system uses a specific tag-based format for processing resumes. The AI model is instructed to output in this format to ensure proper parsing and document generation.
<NAME>
John Smith
<CONTACT>
john.smith@example.com | linkedin.com/in/johnsmith | (555) 123-4567 | San Francisco, CA
<SUMMARY>
Experienced software engineer with 5+ years specializing in cloud infrastructure and distributed systems...
<SKILLS>
Cloud Architecture | CI/CD Pipelines | Kubernetes | Docker | Python | JavaScript
<EXPERIENCE>
<COMPANY>
Tech Innovations Inc. | San Francisco, CA
<POSITION_DATE>
Senior Software Engineer | 01/2020 – Present
<BULLET>
Infrastructure: Redesigned microservice architecture reducing latency by 40%
<BULLET>
Leadership: Led team of 5 engineers in developing new payment processing system
<COMPANY>
Previous Company | Location
<POSITION_DATE>
Software Developer | 03/2017 – 12/2019
<BULLET>
Development: Created responsive web application increasing user engagement by 25%
<EDUCATION>
University of Technology | San Francisco, CA
Bachelor of Science in Computer Science – Cum Laude
GPA 3.8/4.0 | 08/2013 – 05/2017
<VOLUNTEERISM>
Code for Good | 06/2018 – Present
Volunteer developer for nonprofit organizations
<OTHER RELEVANT INFORMATION>
Languages: English (Native), Spanish (Conversational)The system transforms the tagged format into a professionally formatted DOCX file with:
- Clean, ATS-Friendly Layout: Optimized for both human readers and applicant tracking systems
- Consistent Typography: Professional font choices with proper hierarchy
- Strategic Whitespace: Balanced spacing for improved readability
- Bullet Point Optimization: Achievement-focused bullet points with action verbs
- Keyword Integration: Strategic placement of job-relevant keywords
- Section Organization: Logical flow of information prioritizing relevant experience
The final document follows best practices for modern resume design while maintaining compatibility with ATS systems that many employers use to screen candidates.
For a real-world example of how the system transforms resumes, see this sample SysAdmin/Cloud resume from Reddit. The system would analyze this resume, identify improvement opportunities, and restructure it to highlight relevant skills and achievements for the target position.
If you encounter format problems:
- Try a different model: The
o1-minimodel tends to follow formatting instructions most consistently - Lower the temperature: Reduce the temperature setting to 0.1-0.3 for more deterministic outputs
- Check your original resume: Ensure your original resume is properly formatted in the DOCX file
- Review application logs: Check the logs for specific error messages about format validation
- Simplify complex resumes: Very complex resume structures might need simplification
The system includes built-in retry logic - if processing fails after multiple attempts, you'll receive an error notification and can try again with different settings.
This tool was inspired by the Modern Job Application Mastery course, which teaches a powerful methodology for resume optimization:
- Extract Key Skills: Analyze job descriptions to identify 6-8 critical skills or competencies that employers are seeking
- Map Skills to Experience: Systematically rewrite each work experience bullet point to demonstrate these specific skills
- Use Employer Language: Mirror the exact terminology and phrasing from the job description
- Quantify Achievements: Add metrics and specific results to validate your proficiency in each skill area
- Prioritize Relevance: Reorganize content to highlight the most relevant skills for the specific position
This methodology is the foundation of our AI-powered resume optimization. The system automatically extracts the key skills from job descriptions and restructures your resume to demonstrate these skills through your past experiences, creating a targeted document that speaks directly to what employers are looking for.
For example, if a job description emphasizes "cloud infrastructure management," "team leadership," and "cost optimization," the system will identify these skills and rewrite your experience bullets to highlight specific instances where you've demonstrated these competencies, using language that resonates with ATS systems and hiring managers alike.
For maximum results, use this tool alongside the course materials to develop a comprehensive job application strategy that goes beyond just resume optimization.
OPENAI_API_KEY: Your OpenAI API key (optional, can be provided in the UI)SELENIUM_REMOTE_URL: URL for remote Selenium WebDriver (used in Docker setup)SE_DISABLE_MANAGER: Disables Selenium Manager to use system-installed ChromeDriver
The run.sh script provides several execution modes:
./run.sh
Creates a Python virtual environment, installs dependencies, and runs the application locally.
./run.sh --test
Verifies all dependencies are correctly installed without starting the application.
./run.sh --docker
Builds and runs the application in a Docker container, providing complete isolation from your system.
./run.sh --help
Displays available options and usage information.
The application is configured to work on ARM64 architecture using:
- A Selenium container specifically designed for ARM64
- Remote WebDriver configuration to avoid compatibility issues
- Platform-specific settings in docker-compose.yml
If you encounter Chrome or Selenium-related errors:
- Make sure both containers are running:
docker-compose ps - Check the Selenium container logs:
docker-compose logs selenium - Verify the SELENIUM_REMOTE_URL environment variable is set correctly
- Try rebuilding both containers:
docker-compose down && docker-compose up --build
If you see "Resume rewriting failed" errors:
- Check that your OpenAI API key is valid and has sufficient credits
- Verify your resume is in a valid DOCX format
- Try a different model or reduce the temperature setting
- Check the application logs for detailed error messages
If you see an error like this in your logs:
Failed to capture screenshot: Message: unknown error: Chrome failed to start: exited abnormally.
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location /usr/bin/chromium is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
This is a common issue when running Chrome in Docker containers. Here's how to fix it:
Modify the job_scraper.py file to add these additional Chrome options:
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--disable-extensions")
chrome_options.add_argument("--disable-dev-tools")
chrome_options.add_argument("--remote-debugging-port=9222")The application is configured to use a separate Selenium container when running with Docker Compose. Make sure:
-
Both containers are running:
docker-compose ps
-
The environment variable is set correctly in docker-compose.yml:
environment: - SELENIUM_REMOTE_URL=http://selenium:4444/wd/hub
-
The Selenium container has enough shared memory:
shm_size: 2g
If you've made changes to fix the issue:
docker-compose down
docker-compose up --buildIf you're running on an ARM-based system (like M1/M2 Mac):
-
Make sure you're using the ARM-compatible Selenium image:
selenium: image: seleniarm/standalone-chromium:latest
-
Set the platform for your app container:
app: platform: linux/amd64
The application is designed to fall back to creating a placeholder image when screenshot capture fails, so your resume processing should still work even if screenshots cannot be captured.
Most resume tools focus on cosmetic improvements. This one doesn't.
This tool operates on the principle that modern job applications are a two-audience game: you need to satisfy both the algorithm and the human. By analyzing the specific language patterns in job descriptions and restructuring your experience to match, you're not just "keyword stuffing"—you're translating your value into the exact dialect the employer speaks.
The difference is subtle but critical.
Your resume isn't just a document—it's the most important piece of marketing you'll ever create for yourself.
Use this tool not as a magic bullet, but as a strategic advantage in a game where most people don't even know the rules. The difference between getting filtered out and getting called back often comes down to how well you speak the language of both the machines and the humans who make hiring decisions.
ats-proof-resume/
├── app/ # Main application code
│ ├── __init__.py
│ ├── main.py # FastAPI application entry point
│ ├── routes.py # API endpoints
│ ├── state.py # Application state management
│ ├── tasks.py # Background processing tasks
│ ├── services.py # Service functions for model management
│ ├── caching.py # Cashing Custom Decorators
│ └── utils.py # Utility functions
├── resume/ # Resume processing logic
│ ├── __init__.py
│ ├── formatter.py
│ ├── parser.py
│ ├── writer.py
│ └── processor.py # AI-powered resume optimization
├── templates/ # HTML templates for the web interface
│ ├── result.html
│ └── index.html # Landing page template
├── docs/ # Documentation assets
│ └── images/ # Screenshots and diagrams
├── tests/ # Test suite
│ ├── init.py
│ ├── mocks.py # Mock objects for testing
│ ├── test_app_main.py # Tests for main application
│ ├── test_app_routes.py # Tests for app routes
│ └── test_app_tasks.py # Tests for app tasks
├── docker_files/ # Docker-specific utilities
│ ├── docker_pillow_fix.py # Fix for Pillow in Docker
│ ├── docker_fix.py # Fix to work in Docker on ARM64 architecture.
│ ├── docker_selenium_fix.py # Fix for Selenium in Docker
│ └── job_scraper_docker.py # Docker-compatible version of the job_scraper.py
├── job_scraper.py # Job posting scraping functionality
├── interview_questions.py # Interview question generation
├── recommendations.py # Personalized recommendation generation
├── Dockerfile # Main Docker configuration
├── Dockerfile.selenium # Selenium-specific Docker configuration
├── docker-compose.yml # Multi-container Docker setup
├── setup.py # Package installation configuration
├── requirements.txt # Python dependencies
├── run.sh # Main execution script
├── test_deps.py # Dependency testing script
└── test_imports.py # Import verification script
Contributions that push the boundaries of what's possible in modern job applications are welcome. Before submitting a PR:
- Ensure your code follows the project's style guidelines
- Add tests for new functionality
- Update documentation to reflect your changes
This project is licensed under the MIT License - see the LICENSE file for details.

