This resume generation system creates professional resumes in multiple formats (Markdown, LaTeX, PDF) from structured JSON data files.
- Edit resume data in structured JSON format (easy to write, easy to parse)
- Generate professional resumes in multiple formats (Markdown, LaTeX, PDF)
- Job-specific resume variants from modular data
- External LaTeX templates for consistent professional styling
- Terminal-style webapp for real-time editing and preview
project/
βββ sections/ # Modular JSON data files
β βββ personal.json # Contact information
β βββ summary.json # Professional summary
β βββ skills.json # Technical skills
β βββ experience.json # Work experience
β βββ projects.json # Key projects
β βββ education.json # Education & certifications
β βββ achievements.json # Notable achievements
β βββ learning.json # Learning goals
β βββ languages.json # Language proficiencies
β βββ metadata.json # File metadata
β βββ README.md # Section documentation
βββ jobs/ # Job-specific resume variants
β βββ job-name/ # Tailored for specific job
β β βββ *.json # Modified JSON files
β βββ README.md # Jobs documentation
βββ scripts/ # Generation scripts
β βββ resume_generator.py # Main generator script
β βββ README.md # Scripts documentation
βββ templates/ # LaTeX templates
β βββ modern_template.tex # Professional LaTeX template
βββ webapp/ # Terminal-style web interface
β βββ app.py # FastAPI application
β βββ templates/ # HTML templates
β βββ static/ # CSS, JS assets
β βββ README.md # Webapp documentation
βββ output/ # Generated files (PDF, LaTeX, MD)
βββ README.md # This file
-
Clone & setup:
git clone <repo-url> cd resume pip install -r requirements.txt
-
Edit your data: Modify the JSON files in
sections/
-
Generate resume:
python3 scripts/resume_generator.py
-
View results: Check
output/
for generated files -
Web interface (optional):
cd webapp && uvicorn app:app --reload
The sections/
directory contains modular JSON files for each resume section:
// sections/personal.json
{
"personal": {
"name": "Your Name",
"title": "Your Title",
"email": "you@example.com",
"phone": "+1234567890",
"location": "City, Country"
}
}
// sections/summary.json
{
"summary": "Your professional summary here..."
}
// sections/skills.json
{
"skills": {
"languages": ["Python", "JavaScript"],
"frameworks": ["FastAPI", "React"],
"tools": ["Git", "Docker"]
}
}
// sections/experience.json
{
"experience": [
{
"title": "Software Engineer",
"company": "Company Name",
"dates": "2023 - Present",
"location": "City, Country",
"highlights": [
"Achievement 1",
"Achievement 2"
]
}
]
}
// sections/projects.json
{
"projects": [
{
"name": "Project Name",
"tech": "Technologies used",
"highlights": ["Feature 1", "Feature 2"]
}
]
}
// sections/education.json
{
"education": [
{
"degree": "Degree Name",
"institution": "University",
"year": "2023"
}
]
}
- Easy to Write: Human-readable syntax, similar to INI files
- Easy to Parse: Structured data that computers can easily process
- Type Safety: Native support for strings, arrays, tables
- Comments: Add comments to document your data
- Validation: Syntax errors are caught early
- Extensible: Easy to add new fields without breaking existing code
Templates are stored in templates/
and use placeholder syntax:
\documentclass[10pt, letterpaper]{article}
% ... preamble ...
\begin{document}
\begin{header}
\fontsize{25 pt}{25 pt}\selectfont {{{NAME}}}
\normalsize
\mbox{ {{{LOCATION}}} }%
\AND%
\mbox{\hrefWithoutArrow{mailto:{{{EMAIL}}} }{ {{{EMAIL}}} }}%
% ... more contact info ...
\end{header}
\section{Professional Summary}
\begin{onecolentry}
{{{SUMMARY}}}
\end{onecolentry}
{{{SKILLS_SECTION}}}
{{{EXPERIENCE_SECTION}}}
% ... more sections ...
\end{document}
{{{NAME}}}
- Full name{{{LOCATION}}}
- Location{{{EMAIL}}}
- Email address{{{PHONE}}}
- Phone number{{{PHONE_CLEAN}}}
- Phone number (digits only for tel: links){{{WEBSITE}}}
- Website URL{{{LINKEDIN}}}
- LinkedIn profile{{{GITHUB}}}
- GitHub profile{{{SUMMARY}}}
- Professional summary{{{LAST_UPDATED}}}
- Last updated date{{{SKILLS_SECTION}}}
- Generated skills section{{{EXPERIENCE_SECTION}}}
- Generated experience section{{{PROJECTS_SECTION}}}
- Generated projects section{{{EDUCATION_SECTION}}}
- Generated education section{{{ACHIEVEMENTS_SECTION}}}
- Generated achievements section{{{LEARNING_SECTION}}}
- Generated learning section{{{LANGUAGES_SECTION}}}
- Generated languages section
- Create a new
.tex
file intemplates/
- Use the placeholder syntax
{{{PLACEHOLDER_NAME}}}
- Include necessary LaTeX packages and environments
- Test with:
python3 scripts/resume_generator.py --template your_template.tex
- Python 3.x
- python3-tomli (
sudo apt install python3-tomli
)
- LaTeX distribution:
# Ubuntu/Debian sudo apt install texlive-latex-base texlive-latex-recommended texlive-latex-extra texlive-fonts-recommended # macOS brew install mactex # Windows # Install MiKTeX from https://miktex.org/
- Structured Data: Well-defined schema for resume content
- Type Safety: Proper data types (strings, arrays, tables)
- Easy Editing: Human-readable format with syntax highlighting
- Validation: Automatic syntax checking and error reporting
- Extensible: Easy to add new fields or sections
- External Templates: LaTeX templates stored separately from code
- Placeholder System: Simple
{{{PLACEHOLDER}}}
syntax - Multiple Templates: Support for different resume styles
- Custom Templates: Easy to create new layouts
- Professional Output: High-quality PDF generation
- LaTeX Escaping: Automatic escaping of special characters
- Markdown Support: Bold text conversion (
**text**
β\textbf{text}
) - URL Handling: Automatic link generation for contact info
- Section Generation: Dynamic section creation from data
- Error Handling: Graceful handling of missing data or compilation errors
Create job-specific versions by:
- Copy JSON files:
cp -r sections/ jobs/job-name/
- Modify content: Edit the copied files for specific requirements
- Generate:
python3 scripts/resume_generator.py --json-dir jobs/job-name/
- Track versions: Use git to manage different resume variants
See jobs/README.md
for detailed guidance on creating tailored resumes.
- Getting Started - Quick start guide for new users
- Contributing - Guidelines for contributors
- Job Tailoring - Creating job-specific resume variants
# Generate all formats
python3 scripts/resume_generator.py --format all
# Generate only specific format
python3 scripts/resume_generator.py --format pdf
# Use different JSON files
python3 scripts/resume_generator.py --json-file path/to/resume.json
# Use different template directory
python3 scripts/resume_generator.py --template-dir my_templates/
# Use specific template
python3 scripts/resume_generator.py --template academic_template.tex
# Generate resumes for multiple job applications
for job in marketing tech finance; do
python3 scripts/resume_generator.py \
--json-file "ideal-cvs/$job/" \
--format pdf
done
-
JSON Syntax Errors
- Validate JSON syntax using online tools
- Check string quoting (use
"""
for multi-line strings) - Ensure proper array formatting
-
LaTeX Compilation Fails
- Install complete LaTeX distribution
- Check for special characters in text
- Verify template placeholder syntax
-
Missing Content
- Ensure all required JSON sections exist
- Check for empty arrays or missing fields
- Verify file paths and permissions
Add debug prints to the generator script or check the .log
file in the output directory for detailed LaTeX compilation information.
- Flexibility: Easy to switch between different resume styles
- Maintenance: Template updates don't require code changes
- Customization: Create templates for different industries/roles
- Collaboration: Designers can create templates without coding
- Structure: Enforced data schema prevents inconsistencies
- Validation: Syntax errors caught early
- Processing: Easier to parse and manipulate programmatically
- Extensibility: Simple to add new fields or sections
- Automation: No manual template editing required
- Consistency: Uniform formatting across all sections
- Efficiency: Generate multiple formats from single source
- Version Control: Track content changes independently of formatting
The legacy markdown-based system has been removed. To migrate:
- Data: JSON files in
sections/
are the single source of truth - Scripts: Use
resume_generator.py
instead of old scripts - Templates: LaTeX templates in
templates/
directory - Output: Generated files in
output/
directory
- Extract sections from
archive/resume_legacy.md
- Convert to JSON format following the schema
- Create or customize a LaTeX template
- Generate with new system
{
"experience": [
{
"title": "Senior Software Engineer",
"company": "New Company",
"dates": "June 2025 - Present",
"location": "Remote",
"highlights": [
"Architected microservices handling 1M+ daily transactions",
"Reduced API response time by 40% through optimization",
"Mentored team of 5 junior developers"
]
}
]
}
{
"skills": {
"languages": ["Python", "JavaScript"],
"frameworks": ["FastAPI", "React"],
"tools": ["Git", "Docker"]
}
}
Create templates/academic_template.tex
with different sections like Publications, Research, Teaching Experience, etc.
- v3.0: Unified JSON-based system with external templates
- v2.0: Modular section-based architecture (deprecated)
- v1.0: Single-file markdown with parsing-based generation (archived)
For questions or contributions, see the project repository or contact information in the resume.