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-python
system package installed- A properly formatted
.odt
resume with bookmarks - For containerized deployment: Docker and Docker Compose
Setup
Clone the repository
git clone https://github.com/yourusername/ResumeTailor.git cd ResumeTailor
Create and activate a virtual environment
python -m venv .venv source .venv/bin/activate # Linux/Mac
Install dependencies
pip install -r requirements.txt
Set 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.md
to 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.py
Check the output
- The scripts create new
.odt
files 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.sh
This 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.json
in 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.sh
This 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
Output
directory 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
./Output
directory
- 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-tailor
Configure Claude Desktop for containerized use
- Use the provided
claude_desktop_config_docker.json
file:
# 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.json
is 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.md
for 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
./Output
directory - 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