ResumeTailor
A toolkit for automatically tailoring your resume to specific job applications using LibreOffice. The system allows you to maintain a single resume template and quickly generate customized versions for different job applications.
Features
- Update specific sections of your resume (skills, projects, work experience) for targeted job applications
- Maintain a master template with all your achievements and experiences
- Create new tailored resume files without modifying your original template
- Use with Claude AI to automatically generate tailored content based on job descriptions
- Command-line tools for direct customization
- Containerized deployment for consistent execution across macOS and Linux
Prerequisites
- LibreOffice installed (tested with LibreOffice Writer)
- Python 3.10+ with venv support
libreoffice-script-provider-pythonsystem package installed- A properly formatted
.odtresume with bookmarks - For containerized deployment: Docker and Docker Compose
Setup
Clone the repository
git clone https://github.com/yourusername/ResumeTailor.git cd ResumeTailorCreate and activate a virtual environment
python -m venv .venv source .venv/bin/activate # Linux/MacInstall dependencies
pip install -r requirements.txtSet up the UNO environment
- Create symbolic links to the system's UNO modules:
ln -s /usr/lib/python3/dist-packages/uno.py .venv/lib/python3.*/site-packages/uno.py ln -s /usr/lib/python3/dist-packages/unohelper.py .venv/lib/python3.*/site-packages/unohelper.py- Replace
python3.*with your actual Python version (e.g.,python3.12)
Prepare your resume template
- Open your resume in LibreOffice Writer
- Follow the instructions in
setup_resume_bookmarks.mdto add bookmarks
Usage
Method 1: Direct Python Script Usage
Start LibreOffice in headless mode
soffice --accept="socket,host=localhost,port=2002;urp;" --headless --norestore --nologo --nodefault &Run one of the test scripts
# Update just the skills section ./test_skill_update.py # Update a project description ./test_canova_update.py ./test_project_update.py # Update multiple sections for a specific job ./tailor_for_job.pyCheck the output
- The scripts create new
.odtfiles with names likeAdityak_For_TechCompany_DataScientist_20250401.odt - Open these files in LibreOffice Writer to see the changes
- The scripts create new
Method 2: Using with Claude AI (MCP)
Start the resume editor service
./start_resume_editor_service.shThis script starts LibreOffice in headless mode and runs the MCP server.
Configure Claude Desktop
- Make sure you have Claude Desktop installed
- Create or edit
claude_desktop_config.jsonin your home directory:
{ "mcpServers": { "libreOfficeResumeEditor": { "command": "/home/adi235/ResumeTailor/.venv/bin/python", "args": [ "resume_editor_server.py" ], "cwd": "/home/adi235/ResumeTailor" } } }- Adjust paths as needed for your setup
Restart Claude Desktop
- Close and reopen Claude Desktop to load the new configuration
Ask Claude to update your resume
- Example prompts:
- "What sections of my resume can you update?"
- "Update my Skills section to focus on machine learning and Python for this data science role."
- "Tailor my Project1 (Cannabis app) description to highlight the technical aspects for a Senior Developer position."
- Example prompts:
See CLAUDE_MCP_USAGE.md for more detailed instructions on using with Claude.
Method 3: Containerized Deployment (Cross-Platform)
The containerized deployment provides consistent execution across macOS and Linux systems without the need to install LibreOffice or UNO libraries on the host system. The container includes both the Resume Editor service and the JD Keyword Extractor service.
Ensure Docker and Docker Compose are installed
- Install Docker
- Docker Compose typically comes with Docker Desktop (macOS/Windows) or can be installed separately on Linux
Run the containerized application
./run_container.shThis script will:
- Build the Docker image if it doesn't exist
- Start the container in the background
- Start both the Resume Editor (port 5001) and JD Keyword Extractor (port 5002) services
- Map the ports to the host system
- Create an
Outputdirectory on your host that maps to the container's output directory
Accessing the services
- Resume Editor service:
http://localhost:5001 - JD Keyword Extractor service:
http://localhost:5002 - Generated resume files will appear in the
./Outputdirectory
- Resume Editor service:
Managing the container
# View container logs docker logs resume-tailor # Stop the container docker-compose down # Restart the container docker-compose restart resume-tailorConfigure Claude Desktop for containerized use
- Use the provided
claude_desktop_config_docker.jsonfile:
# For macOS (adjust path as needed) cp claude_desktop_config_docker.json ~/claude_desktop_config.json # For Linux (adjust path as needed) cp claude_desktop_config_docker.json ~/.claude_desktop_config.json- This configuration points Claude Desktop to both services running in the container:
{ "mcpServers": { "LibreOfficeResumeEditor": { "url": "http://localhost:5001" }, "JDKeywordExtractor": { "url": "http://localhost:5002" } } }- Restart Claude Desktop to apply the changes
- Use the provided
How the services work together
- The JD Keyword Extractor service analyzes job descriptions to extract key requirements and skills
- The Resume Editor service then uses this information to tailor your resume specifically for the job
- Claude can leverage both services to automate your job application process
Available Resume Sections
When asking Claude to update your resume, use these section names:
- Skills: Technical skills section
- Summary: Professional summary
- Project1: Cannabis Tracking app (Canova)
- Project2: RAG-Based-Brainstorming-Archive
- Project3: Ethereum AI Agent
- WorkExp1: IMPROSYS work experience
Troubleshooting
LibreOffice Connection Issues
- Make sure LibreOffice is running in headless mode:
nc -z localhost 2002 || soffice --accept="socket,host=localhost,port=2002;urp;" --headless --norestore --nologo --nodefault &
UNO Module Errors
- If you get
ModuleNotFoundError: No module named 'uno', check your symlinks:ls -la .venv/lib/python3.*/site-packages/uno.py - If they're missing or incorrect, recreate them using the setup steps above
MCP Server Not Showing in Claude
- Check if your
claude_desktop_config.jsonis correctly formatted - Verify the paths in the config file are correct
- Make sure both LibreOffice and the MCP server are running
- Restart Claude Desktop completely
Bookmark Not Found Errors
- Open your resume in LibreOffice Writer
- Press F5 to open the Navigator
- Verify that all required bookmarks exist
- Check
setup_resume_bookmarks.mdfor the correct naming convention
Container Issues
Container fails to start:
- Check Docker logs:
docker logs resume-tailor - Ensure port 5001 isn't already in use:
netstat -tuln | grep 5001 - Verify Docker is running:
docker info
- Check Docker logs:
Cannot access the service:
- Verify the container is running:
docker ps | grep resume-tailor - Check if the service is listening:
curl -v http://localhost:5001 - Restart the container:
docker-compose restart resume-tailor
- Verify the container is running:
Output files not appearing:
- Check permissions on the
./Outputdirectory - Verify the volume mapping:
docker inspect resume-tailor | grep -A 10 Mounts
- Check permissions on the
Project Structure
edit_resume_uno.py- Core LibreOffice UNO API interactionresume_editor_server.py- MCP server for Claude integrationstart_resume_editor_service.sh- Script to start LibreOffice and the MCP servertest_*.py- Test scripts for different resume sectionssetup_resume_bookmarks.md- Guide for adding bookmarks to your resumeCLAUDE_MCP_USAGE.md- Detailed instructions for using with Claude
License
MIT # ResumeTailor




