A Python-based system for generating professional, ATS-friendly CV documents from structured YAML data.
- ATS-Optimized: Generates CVs compatible with Applicant Tracking Systems
- YAML-Based: Store all your professional information in a structured YAML file
- Professional Formatting: Clean, readable layout with optimal spacing and standard fonts
- Comprehensive Sections: Support for experience, education, skills, certifications, projects, and more
- Customizable: Easy to modify templates and section ordering
- Logging: Detailed logging for debugging and monitoring
- Contact Layout: Each contact detail on separate lines for better ATS parsing
JobSearchAutomation/
├── data/
│ └── example_cv.yaml # Example template (included in git)
├── output/ # Generated CVs (gitignored)
├── templates/ # Optional template files
├── venv/ # Virtual environment (gitignored)
├── generate_cv.py # Main CV generation script
├── requirements.txt # Python dependencies
├── .gitignore # Git ignore rules
└── README.md # This file
# Clone the repository
git clone <repository-url>
cd JobSearchAutomation
# Create virtual environment
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# Run automated setup
python setup.py# Create virtual environment
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# Copy the example template
cp data/example_cv.yaml data/master_cv.yaml
# Edit with your information
nano data/master_cv.yaml # or use your preferred editor# Generate CV from your data
python generate_cv.py
# Or specify a different YAML file
python generate_cv.py --yaml-file data/my_cv.yaml# Test the system with example data
python test_cv.pyThe generated CV will be saved in the output/ directory with a timestamp.
The YAML file should contain the following sections:
Personal information is now loaded from environment variables for better security and flexibility.
Setup:
- Copy
personal_info.env.exampletopersonal_info.env - Update the values in
personal_info.envwith your actual information
Required Environment Variables:
CV_NAME: Your full nameCV_EMAIL: Your email address
Optional Environment Variables:
CV_PHONE: Your phone numberCV_LOCATION: Your location (city, state/country)CV_LINKEDIN: Your LinkedIn profile URLCV_WEBSITE: Your personal websiteCV_GITHUB: Your GitHub profile URLCV_FILENAME_PREFIX: Custom filename prefix for generated CVs
Example personal_info.env:
CV_NAME="John Doe"
CV_EMAIL="john.doe@email.com"
CV_PHONE="+1 (555) 123-4567"
CV_LOCATION="San Francisco, CA"
CV_LINKEDIN="linkedin.com/in/johndoe"
CV_WEBSITE="johndoe.dev"
CV_GITHUB="github.com/johndoe"
CV_FILENAME_PREFIX="John_Doe_CV"summary: |
Your professional summary here. This should be a brief paragraph
highlighting your key qualifications and career focus.experience:
- company: "Company Name"
role: "Job Title"
location: "City, State"
start_date: "2022-01"
end_date: "Present"
description: |
Brief description of your role and responsibilities.
achievements:
- "Achievement 1"
- "Achievement 2"
technologies: ["Python", "JavaScript", "React"]education:
- degree: "Bachelor of Science in Computer Science"
institution: "University Name"
location: "City, State"
graduation_date: "2020-05"
gpa: "3.7" # Optional
relevant_coursework: ["Data Structures", "Algorithms"]skills:
programming_languages:
- "Python"
- "JavaScript"
- "Java"
frameworks_libraries:
- "Django"
- "React"
- "Node.js"certifications:
- name: "AWS Certified Solutions Architect"
issuer: "Amazon Web Services"
date: "2023-03"
credential_id: "AWS-SAA-123456" # Optionalprojects:
- name: "Project Name"
description: "Brief project description"
technologies: ["Python", "Django", "PostgreSQL"]
url: "github.com/username/project" # Optional
date: "2023"cv_config:
font_family: "Arial" # ATS-friendly fonts: Arial, Calibri, Georgia
font_size: 11
section_order:
- "summary"
- "experience"
- "education"
- "skills"
- "certifications"
include_timestamp: truepython generate_cv.py [options]
Options:
--yaml-file PATH Path to YAML file (default: data/master_cv.yaml)
--output-dir PATH Output directory (default: output)
-h, --help Show help message- Standard Fonts: Uses Arial, Calibri, or Georgia fonts
- Simple Formatting: No tables, text boxes, or complex layouts
- Clear Headers: Standard section headers with proper spacing
- Bullet Points: Simple bullet points without custom symbols
- Proper Margins: 1-inch margins on all sides
- No Graphics: No embedded images or complex formatting
- Contact Parsing: Each contact detail on separate lines for ATS compatibility
Modify the section_order in your YAML file to change the order of sections:
cv_config:
section_order:
- "summary"
- "experience"
- "skills" # Move skills before education
- "education"
- "certifications"Hidden Sections
Hide sections you don't want to include:
cv_config:
hidden_sections:
- "projects"
- "languages"cv_config:
font_family: "Calibri" # or "Georgia"
font_size: 12The script generates detailed logs in cv_generation.log and console output:
- INFO: General progress information
- DEBUG: Detailed processing steps
- WARNING: Non-critical issues
- ERROR: Critical errors that prevent generation
-
YAML file not found
Error: YAML file not found: data/master_cv.yamlSolution: Copy
data/example_cv.yamltodata/master_cv.yamland update with your information. -
Invalid YAML syntax
Error parsing YAML file: while parsing...Solution: Check your YAML syntax. Use a YAML validator online.
-
Missing personal information
Missing required personal information from environment: name, emailSolution:
- Copy
personal_info.env.exampletopersonal_info.env - Update
CV_NAMEandCV_EMAILinpersonal_info.env - Or set environment variables manually:
export CV_NAME="Your Name"andexport CV_EMAIL="your@email.com"
- Copy
Enable debug logging by modifying the script:
logging.basicConfig(level=logging.DEBUG, ...)To add a new section to the CV:
- Add the section to your YAML file
- Create a method in the
CVGeneratorclass:def add_new_section(self): """Add your new section.""" if 'new_section' not in self.data: return # Implementation here
- Add the section to the
section_methodsdictionary - Update the default
section_orderin the config
# Test with example data
python generate_cv.py --yaml-file data/example_cv.yaml
# Run automated tests to verify CV structure
python test_cv.py
# Check the generated CV in output/ directory- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly
- Submit a pull request
This project is open source. See the LICENSE file for details.
This is Phase 1 of a larger automation system:
- Phase 2: Job-specific CV generation with n8n automation
- Phase 3: Automated job search and application
See REQUIREMENTS.md for the complete project roadmap.
For issues and questions:
- Check the troubleshooting section above
- Review the logs in
cv_generation.log - Open an issue on GitHub with your YAML file (remove personal information)
- Include the error message and log output