A fast, reliable REST API for generating professional resumes from JSON data. Built on the popular Jake's Resume LaTeX template, ResumeTex eliminates the complexity of LaTeX while maintaining the professional quality output.
- Multiple Output Formats: Generate PDF, LaTeX (.tex), or plain text
- RESTful API: Simple HTTP endpoints for easy integration
- Customizable Fonts: Support for multiple LaTeX font families
- Flexible Schema: Comprehensive JSON structure supporting education, experience, projects, skills, and more
- Docker Ready: Containerized deployment with all LaTeX dependencies
- Web Interface: Interactive HTML frontend for quick testing
- Production Ready: Built with FastAPI for high performance
- FastAPI Server (
server.py): Handles HTTP requests and routing - Resume Maker (
resume/resume_maker.py): Orchestrates resume generation - Resume Class (
resume/resume.py): Core LaTeX template and formatting logic - Web Interface (
public/): HTML frontend with interactive tools
- Client sends JSON resume data via POST request
- FastAPI validates and routes the request
- ResumeMaker processes the data and generates LaTeX
- For PDFs: LaTeX is compiled using pdflatex in a temporary directory
- Response is returned in the requested format (PDF download, TEX file, or text)
- Temporary files are cleaned up automatically
| Endpoint | Method | Description | Response Type |
|---|---|---|---|
/api/v1/pdf |
POST | Generate PDF resume | Binary PDF file |
/api/v1/tex |
POST | Generate LaTeX file | LaTeX file download |
/api/v1/text |
POST | Get LaTeX as text | Plain text response |
/ |
GET | Web interface | HTML page |
/documentation |
GET | API documentation | HTML page |
- Python 3.13+
- pdflatex (for PDF generation)
- Docker (optional, for containerized deployment)
-
Clone the repository
git clone https://github.com/anish-sahoo/ResumeTex.git cd ResumeTex -
Install dependencies
pip install -r requirements.txt
-
Install LaTeX (Ubuntu/Debian)
sudo apt-get update && sudo apt-get install -y \ texlive-latex-base \ texlive-fonts-recommended \ texlive-fonts-extra \ texlive-latex-extra -
Run the server
uvicorn server:app --reload --host 0.0.0.0 --port 8000
-
Access the application
- Web Interface:
http://localhost:8000 - API Documentation:
http://localhost:8000/documentation
- Web Interface:
-
Build the image
docker build -t resumetex . -
Run the container
docker run -p 8000:8000 resumetex
The application will be available at http://localhost:8000.
For production deployments with automatic updates, you can use the included deployment script:
Usage:
- Make the script executable:
chmod +x update.sh - Run the script:
./update.sh
This script will automatically:
- Stop and remove any existing container
- Pull the latest code from Git
- Rebuild the Docker image
- Start a new container with the updated code
Visit the homepage and use the interactive form to generate resumes instantly.
Generate PDF:
curl -X POST -H "Content-Type: application/json" \
-d @resume.json \
https://resumetex.asahoo.dev/api/v1/pdf \
--output resume.pdfGenerate LaTeX file:
curl -X POST -H "Content-Type: application/json" \
-d @resume.json \
https://resumetex.asahoo.dev/api/v1/tex \
--output resume.texGet LaTeX as text:
curl -X POST -H "Content-Type: application/json" \
-d @resume.json \
https://resumetex.asahoo.dev/api/v1/textimport requests
import json
# Your resume data
resume_data = {
"name": "Your Name",
"email": "your.email@example.com",
"phone": "123-456-7890",
# ... rest of your resume data
}
# Generate PDF
response = requests.post(
'https://resumetex.asahoo.dev/api/v1/pdf',
json=resume_data
)
if response.status_code == 200:
with open('resume.pdf', 'wb') as f:
f.write(response.content)
print("Resume generated successfully!")
else:
print(f"Error: {response.status_code}")The API accepts a flexible JSON structure. All fields except name are optional.
{
"name": "Your Name",
"phone": "123-456-7890",
"email": "your.email@example.com",
"font": "fira",
"font_size": 12,
"links": [...],
"education": [...],
"experience": [...],
"projects": [...],
"skills": [...],
"interests": [...],
"page_break": true
}fira- Fira Sans (default)roboto- Robotonoto-sans- Noto Sanssourcesanspro- Source Sans Procormorantgaramond- Cormorant Garamondcharter- Charter
{
"name": "Anish Sahoo",
"phone": "123-456-7890",
"email": "anish@email.email",
"font": "fira",
"font_size": 12,
"links": [
{
"url": "https://www.linkedin.com/in/anish-sahoo",
"text": "linkedin.com/in/anish-sahoo"
},
{
"url": "https://asahoo.dev",
"text": "asahoo.dev"
}
],
"education": [
{
"school": "Northeastern University",
"time": "Expected Graduation: December 2026",
"degree": "Bachelor of Science in Computer Science",
"location": "Boston, MA",
"details": [
"Major GPA: 3.95",
"Coursework: Machine Learning, Artificial Intelligence"
]
}
],
"experience": [
{
"company": "Tech Solutions Inc.",
"jobs": [
{
"time": "June 2021 - August 2021",
"title": "Software Engineer Intern",
"location": "Boston, MA",
"details": [
"Developed a web application to manage data",
"Implemented a feature to allow users to upload files"
]
}
]
}
],
"projects": [
{
"title": "Personal Portfolio",
"subtitle": "A personal website to showcase my projects and skills",
"time": "January 2021 - Present",
"details": [
"Built using HTML, CSS, and JavaScript",
"Includes a blog section where I write about my learning experiences"
]
}
],
"interests": [
"Reading",
"Traveling",
"Photography",
"Coding"
],
"skills": [
{
"title": "Programming Languages",
"items": [
"Python",
"Java",
"C++"
]
},
{
"title": "Web Development",
"items": [
"HTML",
"CSS",
"JavaScript"
]
}
]
}- FastAPI: Modern, fast web framework for building APIs
- Uvicorn: ASGI server for FastAPI
- Pydantic: Data validation using Python type hints
- LaTeX: Document preparation system for high-quality typesetting
ResumeTex/
├── server.py # FastAPI application and routes
├── requirements.txt # Python dependencies
├── Dockerfile # Container configuration
├── sample_input.json # Example resume data
├── public/ # Web interface assets
│ ├── index.html # Main web interface
│ └── documentation.html # API documentation
├── resume/ # Core resume generation logic
│ ├── __init__.py
│ ├── resume_maker.py # Main resume orchestrator
│ └── resume.py # LaTeX template and formatting
└── tests/ # Test files and examples
├── sample_input_bad_col.json
└── sample_input_pagebreak.json- Temporary File Management: PDF generation creates temporary directories that are automatically cleaned up
- Background Tasks: Cleanup operations run asynchronously to avoid blocking responses
- Memory Efficiency: LaTeX compilation is isolated to prevent memory leaks
- Error Handling: Comprehensive error handling for LaTeX compilation failures
-
LaTeX Compilation Errors
- Ensure all required LaTeX packages are installed
- Check for special characters that need escaping
- Verify JSON structure matches the expected schema
-
Font Issues
- Verify the font name is supported (see Supported Fonts section)
- Font packages must be available in your LaTeX installation
-
Permission Errors
- Ensure the application has write permissions for temporary directories
- Check that pdflatex is in the system PATH
Enable debug logging by setting environment variables:
export PYTHONPATH=/path/to/ResumeTex
export DEBUG=1
uvicorn server:app --reload --log-level debug- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
# Install development dependencies
pip install -r requirements.txt
# Run tests
python -m pytest tests/
# Run server
fastapi run server.pyThis project is licensed under the MIT License - see the LICENSE file for details.
- Production: resumetex.asahoo.dev
- Documentation: resumetex.asahoo.dev/documentation
- Issues: GitHub Issues
- Author: Anish Sahoo
Made with love by Anish Sahoo