# 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
1. **Clone the repository**
```bash
git clone https://github.com/yourusername/ResumeTailor.git
cd ResumeTailor
```
2. **Create and activate a virtual environment**
```bash
python -m venv .venv
source .venv/bin/activate # Linux/Mac
```
3. **Install dependencies**
```bash
pip install -r requirements.txt
```
4. **Set up the UNO environment**
- Create symbolic links to the system's UNO modules:
```bash
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`)
5. **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
1. **Start LibreOffice in headless mode**
```bash
soffice --accept="socket,host=localhost,port=2002;urp;" --headless --norestore --nologo --nodefault &
```
2. **Run one of the test scripts**
```bash
# 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
```
3. **Check the output**
- The scripts create new `.odt` files with names like `Adityak_For_TechCompany_DataScientist_20250401.odt`
- Open these files in LibreOffice Writer to see the changes
### Method 2: Using with Claude AI (MCP)
1. **Start the resume editor service**
```bash
./start_resume_editor_service.sh
```
This script starts LibreOffice in headless mode and runs the MCP server.
2. **Configure Claude Desktop**
- Make sure you have Claude Desktop installed
- Create or edit `claude_desktop_config.json` in your home directory:
```json
{
"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
3. **Restart Claude Desktop**
- Close and reopen Claude Desktop to load the new configuration
4. **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."
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.
1. **Ensure Docker and Docker Compose are installed**
- [Install Docker](https://docs.docker.com/get-docker/)
- Docker Compose typically comes with Docker Desktop (macOS/Windows) or can be installed separately on Linux
2. **Run the containerized application**
```bash
./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
3. **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
4. **Managing the container**
```bash
# View container logs
docker logs resume-tailor
# Stop the container
docker-compose down
# Restart the container
docker-compose restart resume-tailor
```
5. **Configure Claude Desktop for containerized use**
- Use the provided `claude_desktop_config_docker.json` file:
```bash
# 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:
```json
{
"mcpServers": {
"LibreOfficeResumeEditor": {
"url": "http://localhost:5001"
},
"JDKeywordExtractor": {
"url": "http://localhost:5002"
}
}
}
```
- Restart Claude Desktop to apply the changes
6. **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:
```bash
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:
```bash
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`
- **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`
- **Output files not appearing**:
- Check permissions on the `./Output` directory
- Verify the volume mapping: `docker inspect resume-tailor | grep -A 10 Mounts`
## Project Structure
- `edit_resume_uno.py` - Core LibreOffice UNO API interaction
- `resume_editor_server.py` - MCP server for Claude integration
- `start_resume_editor_service.sh` - Script to start LibreOffice and the MCP server
- `test_*.py` - Test scripts for different resume sections
- `setup_resume_bookmarks.md` - Guide for adding bookmarks to your resume
- `CLAUDE_MCP_USAGE.md` - Detailed instructions for using with Claude
## License
MIT # ResumeTailor